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
Built with Python programming language and QT library and Guess the number in three easy, medium and hard rolls

password-generator Built with Python programming language and QT library and Guess the number in three easy, medium and hard rolls Password generator

Amir Hussein Sharifnezhad 3 Oct 09, 2021
a wordle-solver written in python

Wordle Solver Overview This is yet another wordle solver. It is built with the word list of the official wordle website, but it should also work with

Shoubhit Dash 10 Sep 24, 2022
A modern python module including many useful features that make discord bot programming extremely easy.

discord-super-utils Documentation Secondary Documentation A modern python module including many useful features that make discord bot programming extr

106 Dec 19, 2022
Different steganography methods with examples and my own small image database

literally-the-most-useless-project [Different steganography methods with examples and my own small image database] This project currently contains thr

Kamyishka 1 Dec 09, 2022
Rename and categorize your DMOJ solutions

DMOJ Downloader What is this for? DMOJ lets you download the code for all your solutions, however the files are just named as numbers

Evan Wild 1 Dec 04, 2022
DNA Storage Simulator that analyzes and simulates DNA storage

DNA Storage Simulator This monorepository contains code for a research project by Mayank Keoliya and supervised by Djordje Jevdjic, that analyzes and

Mayank Keoliya 3 Sep 25, 2022
FBChecker Account using python , package requests and web old facebook

fbcek FBChecker Account using python , package requests and web old facebook using python 3.x apt upgrade -y apt update -y pkg install bash -y pkg ins

XnuxersXploitXen 5 Dec 24, 2022
This is a small compiler to demonstrate how compilers work.

This is a small compiler to demonstrate how compilers work. It compiles our own dialect to C, while being written in Python.

Md. Tonoy Akando 2 Jul 19, 2022
Our Ping Pong Project of numerical analysis, 2nd year IC B2 INSA Toulouse

Ping Pong Project The objective of this project was to determine the moment of impact of the ball with the ground. To do this, we used different model

0 Jan 02, 2022
System Information Utility With Python

System-Information-Utility This is a simple utility, for the terminal, which allows you to find out information about your PC. It's very easy to run t

2 Apr 15, 2022
A lightweight and unlocked launcher for Lunar Client made in Python.

LCLPy LCL's Python Port of Lunar Client Lite. Releases: https://github.com/Aetopia/LCLPy/releases Build Install PyInstaller. pip install PyInstaller

21 Aug 03, 2022
An Advanced Wordlist Library Written In Python For Acm114

RBAPG -RBAPG is the abbreviation of "Rule Based Attack Password Generator". -This module is a wordlist generator module. -You can generate randomly

Aziz Kaplan 11 Aug 28, 2022
A GUI love Calculator which saves all the User Data in text file(sql based script will be uploaded soon). Interative GUI. Even For Admin Panel

Love-Calculator A GUI love Calculator which saves all the User Data in text file(sql based script will be uploaded soon). Interative GUI, even For Adm

Adithya Krishnan 1 Mar 22, 2022
A toy repo illustrating a minimal installable Python package

MyToy: a minimal Python package This repository contains a minimal, toy Python package with a few files as illustration for students of how to lay out

Fernando Perez 19 Apr 24, 2022
Minecraft Multi-Server Pinger Discord Embed

Minecraft Network Pinger Minecraft Multi-Server Pinger Discord Embed What does this bot do? It sends an embed and uses mcsrvstat API and checks if the

YungHub 2 Jan 05, 2022
My solutions to Advent of Code 2021 (written in Python)

Advent of Code 2021 This repository contains my solutions for the 2021 edition of Advent of Code. Please do not expect perfectly polished solutions, m

Nils 2 May 29, 2022
MobaXterm-GenKey

MobaXterm-GenKey 你懂的!! 本地启动 需要安装Python3!!!

malaohu 328 Dec 29, 2022
An electron application to check battery of bluetooth devices connected to linux devices.

bluetooth-battery-electron An electron application to check battery of bluetooth devices connected to linux devices. This project provides an electron

Vasu Sharma 15 Dec 03, 2022
Hacktoberfest 2021 contribution repository✨

🎃 HacktoberFest-2021 🎃 Repository for Hacktoberfest Note: Although, We are actively focusing on Machine Learning, Data Science and Tricky Python pro

Manjunatha Sai Uppu 42 Dec 11, 2022
Control your gtps with gtps-tools!

Note Please give credit to me! Do not try to sell this app, because this app is 100% open source! Do not try to reupload and rename the creator app! S

Jesen N 6 Feb 16, 2022