A collection of Python library code for building Python applications.

Overview

Abseil Python Common Libraries

This repository is a collection of Python library code for building Python applications. The code is collected from Google's own Python code base, and has been extensively tested and used in production.

Features

  • Simple application startup
  • Distributed commandline flags system
  • Custom logging module with additional features
  • Testing utilities

Getting Started

Installation

To install the package, simply run:

pip install absl-py

Or install from source:

python setup.py install

Running Tests

To run Abseil tests, you can clone the git repo and run bazel:

git clone https://github.com/abseil/abseil-py.git
cd abseil-py
bazel test absl/...

Example Code

Please refer to smoke_tests/sample_app.py as an example to get started.

Documentation

See the Abseil Python Developer Guide.

Future Releases

The current repository includes an initial set of libraries for early adoption. More components and interoperability with Abseil C++ Common Libraries will come in future releases.

License

The Abseil Python library is licensed under the terms of the Apache license. See LICENSE for more information.

Comments
  • abseil interferes with python logging

    abseil interferes with python logging

    I have a script where I'm importing a module that internally uses abseil logging. The rest of our code base is using standard python logging. This is leading to a situation where importing that module is interfering with the rest of the code base using standard logging and causing lost log messages.

    See here for a description of the issue: https://github.com/tensorflow/hub/issues/263

    Have others run into this issue before?

    opened by matteby 19
  • Issues pickling/unpickling Flags with dill

    Issues pickling/unpickling Flags with dill

    I came across this issue when using the save_main_session in Apache Beam 2.4.0 with absl.flags (absl-py version 0.2.1). save_main_session pickles then unpickles the variables in the main session, flags.FLAGS included.

    The following error is raised:

    Traceback (most recent call last):
      File "test.py", line 46, in <module>
        app.run(main)
      File "venv/local/lib/python2.7/site-packages/absl/app.py", line 274, in run
        _run_main(main, args)
      File "venv/local/lib/python2.7/site-packages/absl/app.py", line 238, in _run_main
        sys.exit(main(argv))
      File "test.py", line 43, in main
        _ = output | beam.io.WriteToText(FLAGS.output_file)
      File "venv/local/lib/python2.7/site-packages/apache_beam/pipeline.py", line 389, in __exit__
        self.run().wait_until_finish()
      File "venv/local/lib/python2.7/site-packages/apache_beam/pipeline.py", line 369, in run
        self.to_runner_api(), self.runner, self._options).run(False)
      File "venv/local/lib/python2.7/site-packages/apache_beam/pipeline.py", line 379, in run
        pickler.dump_session(os.path.join(tmpdir, 'main_session.pickle'))
      File "venv/local/lib/python2.7/site-packages/apache_beam/internal/pickler.py", line 242, in dump_session
        dill.load_session(file_path)
      File "venv/local/lib/python2.7/site-packages/dill/dill.py", line 363, in load_session
        module = unpickler.load()
      File "/usr/lib/python2.7/pickle.py", line 864, in load
        dispatch[key](self)
      File "/usr/lib/python2.7/pickle.py", line 1221, in load_build
        setstate = getattr(inst, "__setstate__", None)
      File "venv/local/lib/python2.7/site-packages/absl/flags/_flagvalues.py", line 468, in __getattr__
        fl = self._flags()
      File "venv/local/lib/python2.7/site-packages/absl/flags/_flagvalues.py", line 141, in _flags
        return self.__dict__['__flags']
    KeyError: '__flags'
    

    Example code:

    """
    Demonstrating incompatibility between absl.flags and
    save_main_session in Apache Beam's Python SDK.
    """
    import re
    import six
    import apache_beam as beam
    
    from absl import app
    from absl import flags
    
    
    FLAGS = flags.FLAGS
    
    flags.DEFINE_string(
        'output_file',
        'output.txt',
        help='Output filename.')
    
    def main(argv):
      del argv # Unused.
    
      pipeline_options = beam.pipeline.PipelineOptions()
      # Uncomment the next line to break things.
      #pipeline_options.view_as(beam.pipeline.SetupOptions).save_main_session = True
    
      with beam.Pipeline(options=pipeline_options) as p:
        lines = p | beam.Create(
          ['This is a test of compatibility issues between absl and beam.',
           'Since absl.flags cannot be pickled correctly, it cannot be used',
           'with the save_main_session pipeline option.'])
    
        counts = (
            lines
            | 'Split' >> (beam.FlatMap(lambda x: re.findall(r'[A-Za-z\']+', x))
                          .with_output_types(six.text_type))
            | 'PairWithOne' >> beam.Map(lambda x: (x, 1))
            | 'GroupAndSum' >> beam.CombinePerKey(sum))
    
        output = counts | 'Format' >> beam.Map(
          lambda (word, count): '%s: %s' % (word, count))
    
        _ = output | beam.io.WriteToText(FLAGS.output_file)
    
    if __name__ == '__main__':
      app.run(main)
    
    opened by rasmi 17
  • pip install error when old setuptools versions used

    pip install error when old setuptools versions used

    python 3.6.7, install tensorflow, here is log:

    Collecting absl-py>=0.1.6 (from tensorflow->-r pip_requirenents.txt (line 21)) Using cached https://files.pythonhosted.org/packages/fa/ef/1fa0376563b1e0495301ada8e881d88b7ebfda433f6b31f44447fe6ef795/absl-py-0.6.0.tar.gz Complete output from command python setup.py egg_info: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/distutils/dist.py:261: UserWarning: Unknown distribution option: 'long_description_content_type' warnings.warn(msg) error in absl-py setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Expected version spec in enum34; python_version<='3.4' at ; python_version<='3.4'

    opened by o0starshine0o 14
  • how to write log into file

    how to write log into file

    Hi, I am trying to write log into file directly instead of showing in command window. I have seen following issues about it https://github.com/abseil/abseil-py/issues/83 https://github.com/abseil/abseil-py/issues/111

    I tried them but I cant see anything in the file.

    My code is

    import os
    from absl import logging
    if not os.path.exists('/opt/log/'):
         os.makedirs('/opt/log/')
    logging.get_absl_handler().use_absl_log_file('absl_logging', '/opt/log/')
    
    logging.info('test')
    logging.debug('test debug')
    

    I cant see anything in that file though file was created

    opened by akter-sust 12
  • How should I run bazel tests ?

    How should I run bazel tests ?

    Hi there,

    I added the WORKSPACE file from GitHub into the package published on pypi, but when I run

    bazel test absl
    

    It says:

    ERROR: no targets found beneath 'absl'.
    INFO: Elapsed time: 0.105s
    ERROR: Couldn't start the build. Unable to run tests.
    

    Thanks

    opened by eLvErDe 10
  • assertSameStructure with dict vs defaultdict

    assertSameStructure with dict vs defaultdict

    When trying to use assertSameStructure to compar a dict to a defaultdict, it throws an error. This is due to the direct type comparison here https://github.com/abseil/abseil-py/blob/master/absl/testing/absltest.py#L1219

    Not sure if it's worth adding another exception similar to int vs long. Feel free to close if this is WAI

    opened by EhsanKia 8
  • How to clean flags ?

    How to clean flags ?

    Hello dear friends,

    A few weeks ago, Tensorflow have moved to this library to manage flags using tf.app.flags. Link to file: https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/python/platform/flags.py

    I can't manage to find any way to "reset" the flags state with this library. Is there any way to do this ?

    I would like to remove every flags created and return to a blank state as if it was just created.

    Thanks a lot.

    opened by DEKHTIARJonathan 8
  • AttributeError: module 'absl' has no attribute 'flags'

    AttributeError: module 'absl' has no attribute 'flags'

    Traceback (most recent call last): File "DeepSpeech.py", line 11, in import absl.app File "/home/sehar/venv/lib/python3.6/site-packages/absl/app.py", line 40, in from absl import flags File "/home/sehar/venv/lib/python3.6/site-packages/absl/flags/init.py", line 41, in from absl.flags import _defines File "/home/sehar/venv/lib/python3.6/site-packages/absl/flags/_defines.py", line 31, in from absl.flags import _flagvalues File "/home/sehar/venv/lib/python3.6/site-packages/absl/flags/_flagvalues.py", line 27, in import logging File "/home/sehar/DeepSpeech/logging.py", line 6, in from util.flags import FLAGS File "/home/sehar/DeepSpeech/util/flags.py", line 6, in FLAGS = absl.flags.FLAGS AttributeError: module 'absl' has no attribute 'flags' please help me resolve this issue I am using tensorflow 1.14 gpu based

    opened by sehargul-123 6
  • Fixing enum34 requirement for python versions <= 3.4 in setup.py

    Fixing enum34 requirement for python versions <= 3.4 in setup.py

    Was running into error on Python3.6 and pip 18.1

    error in absl-py setup command: 'install_requires' must be a string or list of strings containing valid project/version requirement specifiers; Expected version spec in enum34;python_version<='3.4' at ;python_version<='3.4'
    

    Using the install_requires and extra_requires fixed my problems, and is ostensibly a better way to do this see reference here.

    cla: yes 
    opened by alexhagen 6
  • Logging disappeared after switching from app.run(main) to main()

    Logging disappeared after switching from app.run(main) to main()

    There are two logging methods in our code:

    import logging
    logging.info('my logging msg')
    

    or

    import logging
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    logger.info('my logger msg')
    

    When we first used app.run(main), everything is fine. All the log lines are output in absl.logging format.

    Then we needed to combine absl.flags with argparse, and used your solution in #27 (Let one parser parse "known flags", and the other parse the rest. Example 2) It works great except that we need to run main() instead of app.run(main) And all the logging were gone. So we tried to add absl.logging.use_absl_handler() in __init__.py following #148 Now we are able to see content from logger.xxx in absl.logging format, but not those from logging.xxx no matter it is from python logging or absl logging.

    Did I miss anything from app.run() or not using logging correctly?

    opened by unacao 5
  • Unexpected behavior when using absl-py with python's native logging library

    Unexpected behavior when using absl-py with python's native logging library

    I am seeing unexpected behaviors when using absl-py with a python library that uses python's native logging library.

    Here is a minimal reproduce script:

    from absl import app
    import logging
    
    
    def main(argv):
      logger = logging.getLogger('test_logger')
      logger.setLevel(logging.DEBUG)
      ch = logging.StreamHandler()
      ch.setLevel(logging.DEBUG)
      logger.addHandler(ch)
    
      logger.info('My test message.')
    
    
    if __name__ == '__main__':
      app.run(main)
    

    Here is the output from the above script:

    My test message.
    I0806 13:54:58.868444 140734895885760 python_test.py:11] My test message.
    

    The message is somehow duplicated, one with timestamp, and one without timestamp.

    I don't have control on the third_party python library (that uses python's native logging library), so I cannot switch that library to use absl-py logging.

    Is there anyway to fix or workaround the problem without updating the logging library in the third party python library?

    opened by kqyang 5
  • Accessing C++ flags from Python

    Accessing C++ flags from Python

    opened by jiawen 1
  • argparse_flags.ArgumentParser does not accept --flagfile if there are no flags

    argparse_flags.ArgumentParser does not accept --flagfile if there are no flags

    Minimum repro:

    # foo.py
    import absl.flags.argparse_flags
    import argparse
    # absl.flags.DEFINE_string("do_not_use_flagfile_hack", "", "") # A
    parser = absl.flags.argparse_flags.ArgumentParser()
    parser.add_argument("--foo")
    parser.parse_args()
    
    echo "--foo" > flags.txt
    foo.py --flagfile=flags.txt
    

    The error is:

    foo.py: error: unrecognized arguments: --flagfile=flags.txt
    

    The command would work if I uncomment line A.

    It appears that ArgumentParser only accepts --flagfile if there are some DEFINE_'d strings. This is because of this line:

    https://github.com/abseil/abseil-py/blob/main/absl/flags/argparse_flags.py#L156

        if self._inherited_absl_flags: # <---
          # Handle --flagfile.
          # Explicitly specify force_gnu=True, since argparse behaves like
          # gnu_getopt: flags can be specified after positional arguments.
          args = self._inherited_absl_flags.read_flags_from_files(
              args, force_gnu=True)
    

    --flagfile is only accepted if bool(self._inherited_absl_flags), which is False if there are no DEFINE_d strings.

    opened by jacky8hyf 1
  • absl.flags fails with multiprocessing when using

    absl.flags fails with multiprocessing when using "spawn"

    There's something odd going on with absl.flags and interacting very badly with multiprocessing when using 'spawn' as a start method. This is on MacOS 11.4, using homebrew's version of Python 3.9.6, although it also fails on the system python 3, 3.8.2.

    Given the following code (I'll also atttach it), multifail.py.txt

    """ import absl.flags import absl.app import multiprocessing import time

    absl.flags.DEFINE_integer("delay", 2, "sleep delay") FLAGS = absl.flags.FLAGS

    def worker(n): time.sleep(FLAGS.delay) print(n)

    def main(argv): # "fork" works fine. multiprocessing.set_start_method("spawn") with multiprocessing.Pool(20) as pool: pool.map(worker, range(1000))

    if name == "main": absl.app.run(main) """

    it will fail (inconsistently) with

    multiprocessing.pool.RemoteTraceback: """ Traceback (most recent call last): File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 125, in worker result = (True, func(*args, **kwds)) File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 48, in mapstar return list(map(*args)) File "/Users/anthonybaxter/multifail.py", line 10, in worker time.sleep(FLAGS.delay) File "/opt/homebrew/lib/python3.9/site-packages/absl/flags/_flagvalues.py", line 499, in getattr raise _exceptions.UnparsedFlagAccessError(error_message) absl.flags._exceptions.UnparsedFlagAccessError: Trying to access flag --delay before flags were parsed.

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last): File "/Users/anthonybaxter/multifail.py", line 22, in absl.app.run(main) File "/opt/homebrew/lib/python3.9/site-packages/absl/app.py", line 312, in run _run_main(main, args) File "/opt/homebrew/lib/python3.9/site-packages/absl/app.py", line 258, in _run_main sys.exit(main(argv)) File "/Users/anthonybaxter/multifail.py", line 18, in main pool.map(worker, range(1000)) File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 364, in map return self._map_async(func, iterable, mapstar, chunksize).get() File "/opt/homebrew/Cellar/[email protected]/3.9.6/Frameworks/Python.framework/Versions/3.9/lib/python3.9/multiprocessing/pool.py", line 771, in get raise self._value absl.flags._exceptions.UnparsedFlagAccessError: Trying to access flag --delay before flags were parsed. """

    opened by anthonybaxter 3
  • Abstract test case

    Abstract test case

    Sometimes we have some interface and we would like to write a generic test suite for it, so that concrete implementations just reuse it.

    The problem with Python's unittest (and transitively absltest) is that the TestCase class serves as a "marker" telling the test executor that it should be executed. This is unfortunate, because abstract test suites should not run. Consider this example:

    class FooTest(absltest.TestCase):
    
        @abstractmethod
        def new_foo(self) -> Foo:
            pass
    
        def test_bar(self) -> None:
            foo = self.new_foo()
            self.assertEqual(foo.bar(), "bar")
    
    
    class QuuxTest(FooTest):
    
        def new_foo(self) -> Foo:
            return Quux()
    
    
    class NorfTest(FooTest):
    
        def new_foo(self) -> Foo:
            return Norf()
    

    Here, the test executor will instantiate FooTest, QuuxTest and NorfTest. However, FooTest is abstract and it is not possible to create an instance of it. There are three workarounds for this that I am aware of.

    The first one is to configure the test executor to ignore specific test classes or prefixes (possible in pytest). However, this is awkward and requires modifying external configuration files.

    The second one is described here. Basically, we del the base class once child classes are defined. This feels very wrong and works only if all the concrete test cases are defined in the same module.

    The last one is to use a mixin approach. Instead of making FooTest derive from absltest.TestCase, we "mark" only concrete classes with it:

    class FooTest:
    
        @abstractmethod
        def new_foo(self) -> Foo:
            pass
    
        def test_bar(self) -> None:
            foo = self.new_foo()
            self.assertEqual(foo.bar(), "bar")
    
    
    class QuuxTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Quux()
    
    
    class NorfTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Norf()
    

    The problem here is that it doesn't work with static type checkers: FooTest now doesn't inherit from TestCase but uses methods like self.assertEqual.

    This last solution seems like the only "correct" one except for the mentioned issue. Instead, Abseil could define an abstract test class and make the normal test case class implement it:

    class AbstractTestCase(ABC):
    
        @abstractmethod
        def assertEqual(self, this, that):
          ...
    
        ...
    
    class TestCase(AbstractTestCase):
        ...
    

    Then, it would be possible to inherit from absltest.AbstractTestCase in the abstract test case, making the type checker happy:

    class FooTest(absltest.AbstractTestCase):
    
        @abstractmethod
        def new_foo(self) -> Foo:
            pass
    
        def test_bar(self) -> None:
            foo = self.new_foo()
            self.assertEqual(foo.bar(), "bar")
    
    
    class QuuxTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Quux()
    
    
    class NorfTest(FooTest, absltest.TestCase):
    
        def new_foo(self) -> Foo:
            return Norf()
    
    opened by panhania 6
  • Absl flags pathlib support

    Absl flags pathlib support

    Are there any plans to support a flags.DEFINE_path or something similar that utilizes python's pathlib module to support declaring os.PathLike operations for the default option?

    For context, I often find myself doing the following:

    from absl import app, flags
    from pathlib import Path
    
    FLAGS = flags.FLAGS
    flags.DEFINE_string("filepath", "path/to/some.txt", "Input filepath for program")
    
    def main(argv_):
        # Override FLAGS.filepath with a pathlib.Path version
        FLAGS.filepath = Path(FLAGS.filepath)
        
        # Rest of program uses pathlib for path operations
    
    if __name__ == "__main__":
        app.run(main)
    

    It would be awesome if there was an easy way to define a Path object from the DEFINE_ definition in the first place. If adding such a feature is not feasible, I'm curious how other people are using pathlib with absl.flags as well.

    Thanks!

    opened by bsarden 3
Releases(v1.3.0)
  • v1.3.0(Oct 13, 2022)

    Added

    • (flags) Added a new absl.flags.set_default function that updates the flag default for a provided FlagHolder. This parallels the absl.flags.FlagValues.set_default interface which takes a flag name.
    • (flags) The following functions now also accept FlagHolder instance(s) in addition to flag name(s) as their first positional argument:
      • flags.register_validator
      • flags.validator
      • flags.register_multi_flags_validator
      • flags.multi_flags_validator
      • flags.mark_flag_as_required
      • flags.mark_flags_as_required
      • flags.mark_flags_as_mutual_exclusive
      • flags.mark_bool_flags_as_mutual_exclusive
      • flags.declare_key_flag

    Changed

    • (testing) Assertions assertRaisesWithPredicateMatch and assertRaisesWithLiteralMatch now capture the raised Exception for further analysis when used as a context manager.
    • (testing) TextAndXMLTestRunner now produces time duration values with millisecond precision in XML test result output.
    • (flags) Keyword access to flag_name arguments in the following functions is deprecated. This parameter will be renamed in a future 2.0.0 release.
      • flags.register_validator
      • flags.validator
      • flags.register_multi_flags_validator
      • flags.multi_flags_validator
      • flags.mark_flag_as_required
      • flags.mark_flags_as_required
      • flags.mark_flags_as_mutual_exclusive
      • flags.mark_bool_flags_as_mutual_exclusive
      • flags.declare_key_flag
    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Jul 18, 2022)

  • v1.1.0(Jun 1, 2022)

    Changed

    • Flag instances now raise an error if used in a bool context. This prevents the occasional mistake of testing an instance for truthiness rather than testing flag.value.
    • absl-py no longer depends on six.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.0(Nov 10, 2021)

    Changed

    • absl-py no longer supports Python 2.7, 3.4, 3.5. All versions have reached end-of-life for more than a year now.
    • New releases will be tagged as vX.Y.Z instead of pypi-vX.Y.Z in the git repo going forward.
    Source code(tar.gz)
    Source code(zip)
Owner
Abseil
Abseil
This repo holds custom callback plugin, so your Ansible could write everything in the PostgreSQL database.

English What is it? This is callback plugin that dumps most of the Ansible internal state to the external PostgreSQL database. What is this for? If yo

Sergey Pechenko 19 Oct 21, 2022
My solutions for Advent of Code 2021 πŸŒŸπŸŽ„

🌟 Advent of Code 2021 πŸŽ„ My solutions for Advent of Code 2021. About Β· What is Advent of Code? Β· Contents Β· Usage Β· Table of puzzles (TODO: add final

Amanda P. Pinha 2 Dec 05, 2022
Hello, Welcome to this repo. don't forget to read guidelines in readme.md

Hacktoberfest_2021 If you looking for your first contribution, we are here to help. Just create a simple program using any language you like in our fo

Wafa Rifqi Anafin 117 Dec 14, 2022
Python - Aprendendo Python na ByLearn

PYTHON Identação Escopo Pai Escopo filho Escopo neto Variaveis

Italo Rafael 3 May 31, 2022
decorator

Decorators for Humans The goal of the decorator module is to make it easy to define signature-preserving function decorators and decorator factories.

Michele Simionato 734 Dec 30, 2022
Superset custom path for python

It is a common requirement to have superset running under a base url, (https://mydomain.at/analytics/ instead of https://mydomain.at/). I created the

9 Dec 14, 2022
flake8 plugin which checks that there is no use of sleep in the code.

flake8-sleep flake8 plugin which checks for use of sleep function. installation Using Pypi: pip install flake8-sleep flake8 codes Code Description SLP

1 Nov 26, 2021
A conda-smithy repository for boost-histogram.

The official Boost.Histogram Python bindings. Provides fast, efficient histogramming with a variety of different storages combined with dozens of composable axes. Part of the Scikit-HEP family.

conda-forge 0 Dec 17, 2021
Submission to the HEAR2021 Challenge

Submission to the HEAR 2021 Challenge For model evaluation, python=3.8 and cuda10.2 with cudnn7.6.5 have been tested. The work uses a mixed supervised

Heinrich Dinkel 10 Dec 08, 2022
Blender 3.0 Python - Open temporary areas in the Text Editor

PopDrawers When editing text in Blender, it can be handy to have areas like Info, Console, Outliner, etc visible on screen to help with scripting. How

SpectralVectors 7 Nov 16, 2022
Python samples for Google Cloud Platform products.

Google Cloud Platform Python Samples Python samples for Google Cloud Platform products. Setup Install pip and virtualenv if you do not already have th

Google Cloud Platform 6k Jan 03, 2023
A place where one-off ideas/partial projects can live comfortably

A place to post ideas, partial projects, or anything else that doesn't necessarily warrant its own repo, from my mind to the web.

Carson Scott 2 Feb 25, 2022
A Blender addon for VSE that auto-adjusts video strip's length, if speed effect is applied.

Blender VSE Speed Adjust Addon When using Video Sequence Editor in Blender, the speed effect strip doesn't auto-adjusts clip length when changing its

Arpit Srivastava 2 Jan 18, 2022
An easy FASTA object handler, reader, writer and translator for small to medium size projects without dependencies.

miniFASTA An easy FASTA object handler, reader, writer and translator for small to medium size projects without dependencies. Installation Using pip /

Jules Kreuer 3 Jun 30, 2022
MuMMI Core is the underlying infrastructure and generalizable component of the MuMMI framework

MuMMI Core is the underlying infrastructure and generalizable component of the MuMMI framework, which facilitates the coordination of massively parallel multiscale simulations.

4 Aug 17, 2022
It is a personal assistant chatbot, capable to perform many tasks same as Google Assistant plus more extra features...

PersonalAssistant It is an Personal Assistant, capable to perform many tasks with some unique features, that you haven'e seen yet.... Features / Tasks

Roshan Kumar 95 Dec 21, 2022
An app to automatically take attendance by scanning students' bar coded ID card as they enter the classroom.

Auto Classroom Attendance This application may be run on a PC to automatically scan students' ID card using a generic bar code scanner and output the

1 Nov 10, 2021
Irrigation Component V4 providing support for a custom card

Irrigation Component V4 This release sees the delivery of a custom card https://github.com/petergridge/irrigation_card to render the program options s

12 Oct 28, 2022
πŸ€–πŸ€– Jarvis is an virtual assistant which can some tasks easy for you like surfing on web opening an app and much more... πŸ€–πŸ€–

Jarvis πŸ€– πŸ€– Jarvis is an virtual assistant which can some tasks easy for you like surfing on web opening an app and much more... πŸ€– πŸ€– Developer : su

1 Nov 08, 2021
VirtualBox Power Driver for MAAS (Metal as a Service)

vboxpower VirtualBox Power Driver for MAAS (Metal as a Service) A way to manage the power of VirtualBox virtual machines via the MAAS webhook driver.

Saeid Bostandoust 131 Dec 17, 2022