A tool (and pre-commit hook) to automatically upgrade syntax for newer versions of the language.

Overview

Build Status Azure DevOps coverage pre-commit.ci status

pyupgrade

A tool (and pre-commit hook) to automatically upgrade syntax for newer versions of the language.

Installation

pip install pyupgrade

As a pre-commit hook

See pre-commit for instructions

Sample .pre-commit-config.yaml:

-   repo: https://github.com/asottile/pyupgrade
    rev: v2.10.0
    hooks:
    -   id: pyupgrade

Implemented features

Set literals

set(())              # set()
set([])              # set()
set((1,))            # {1}
set((1, 2))          # {1, 2}
set([1, 2])          # {1, 2}
set(x for x in y)    # {x for x in y}
set([x for x in y])  # {x for x in y}

Dictionary comprehensions

dict((a, b) for a, b in y)    # {a: b for a, b in y}
dict([(a, b) for a, b in y])  # {a: b for a, b in y}

Python2.7+ Format Specifiers

'{0} {1}'.format(1, 2)    # '{} {}'.format(1, 2)
'{0}' '{1}'.format(1, 2)  # '{}' '{}'.format(1, 2)

printf-style string formatting

Availability:

  • Unless --keep-percent-format is passed.
'%s %s' % (a, b)                  # '{} {}'.format(a, b)
'%r %2f' % (a, b)                 # '{!r} {:2f}'.format(a, b)
'%(a)s %(b)s' % {'a': 1, 'b': 2}  # '{a} {b}'.format(a=1, b=2)

Unicode literals

Availability:

  • File imports from __future__ import unicode_literals
  • --py3-plus is passed on the commandline.
u'foo'      # 'foo'
u"foo"      # 'foo'
u'''foo'''  # '''foo'''

Invalid escape sequences

# strings with only invalid sequences become raw strings
'\d'    # r'\d'
# strings with mixed valid / invalid sequences get escaped
'\n\d'  # '\n\\d'
# `ur` is not a valid string prefix in python3
u'\d'   # u'\\d'

# this fixes a syntax error in python3.3+
'\N'    # r'\N'

# note: pyupgrade is timid in one case (that's usually a mistake)
# in python2.x `'\u2603'` is the same as `'\\u2603'` without `unicode_literals`
# but in python3.x, that's our friend ☃

is / is not comparison to constant literals

In python3.8+, comparison to literals becomes a SyntaxWarning as the success of those comparisons is implementation specific (due to common object caching).

x is 5      # x == 5
x is not 5  # x != 5
x is 'foo'  # x == foo

ur string literals

ur'...' literals are not valid in python 3.x

ur'foo'         # u'foo'
ur'\s'          # u'\\s'
# unicode escapes are left alone
ur'\u2603'      # u'\u2603'
ur'\U0001f643'  # u'\U0001f643'

.encode() to bytes literals

'foo'.encode()           # b'foo'
'foo'.encode('ascii')    # b'foo'
'foo'.encode('utf-8')    # b'foo'
u'foo'.encode()          # b'foo'
'\xa0'.encode('latin1')  # b'\xa0'

Long literals

5L                            # 5
5l                            # 5
123456789123456789123456789L  # 123456789123456789123456789

Octal literals

0755  # 0o755
05    # 5

extraneous parens in print(...)

A fix for python-modernize/python-modernize#178

print(())                       # ok: printing an empty tuple
print((1,))                     # ok: printing a tuple
sum((i for i in range(3)), [])  # ok: parenthesized generator argument
print(("foo"))                  # print("foo")

super() calls

Availability:

  • --py3-plus is passed on the commandline.
class C(Base):
    def f(self):
        super(C, self).f()   # super().f()

"new style" classes

Availability:

  • --py3-plus is passed on the commandline.

rewrites class declaration

class C(object): pass     # class C: pass
class C(B, object): pass  # class C(B): pass

removes __metaclass__ = type declaration

-__metaclass__ = type

forced str("native") literals

Availability:

  • --py3-plus is passed on the commandline.
str()       # "''"
str("foo")  # "foo"

.encode("utf-8")

Availability:

  • --py3-plus is passed on the commandline.
"foo".encode("utf-8")  # "foo".encode()

# coding: ... comment

Availability:

  • --py3-plus is passed on the commandline.

as of PEP 3120, the default encoding for python source is UTF-8

-# coding: utf-8
 x = 1

__future__ import removal

Availability:

  • by default removes nested_scopes, generators, with_statement
  • --py3-plus will also remove absolute_import / division / print_function / unicode_literals
  • --py37-plus will also remove generator_stop
-from __future__ import with_statement

Remove unnecessary py3-compat imports

Availability:

  • --py3-plus is passed on the commandline.
-from io import open
-from six.moves import map
-from builtins import object  # python-future

rewrite mock imports

Availability:

-from mock import patch
+from unittest.mock import patch

yield => yield from

Availability:

  • --py3-plus is passed on the commandline.
def f():
    for x in y:       # yield from y
        yield x

    for a, b in c:    # yield from c
        yield (a, b)

if PY2 blocks

Availability:

  • --py3-plus is passed on the commandline.
# input
if six.PY2:      # also understands `six.PY3` and `not` and `sys.version_info`
    print('py2')
else:
    print('py3')
# output
print('py3')

remove six compatibility code

Availability:

  • --py3-plus is passed on the commandline.
six.text_type             # str
six.binary_type           # bytes
six.class_types           # (type,)
six.string_types          # (str,)
six.integer_types         # (int,)
six.unichr                # chr
six.iterbytes             # iter
six.print_(...)           # print(...)
six.exec_(c, g, l)        # exec(c, g, l)
six.advance_iterator(it)  # next(it)
six.next(it)              # next(it)
six.callable(x)           # callable(x)

from six import text_type
text_type                 # str

@six.python_2_unicode_compatible  # decorator is removed
class C:
    def __str__(self):
        return u'C()'

class C(six.Iterator): pass              # class C: pass

class C(six.with_metaclass(M, B)): pass  # class C(B, metaclass=M): pass

@six.add_metaclass(M)   # class C(B, metaclass=M): pass
class C(B): pass

isinstance(..., six.class_types)    # isinstance(..., type)
issubclass(..., six.integer_types)  # issubclass(..., int)
isinstance(..., six.string_types)   # isinstance(..., str)

six.b('...')                            # b'...'
six.u('...')                            # '...'
six.byte2int(bs)                        # bs[0]
six.indexbytes(bs, i)                   # bs[i]
six.int2byte(i)                         # bytes((i,))
six.iteritems(dct)                      # dct.items()
six.iterkeys(dct)                       # dct.keys()
six.itervalues(dct)                     # dct.values()
next(six.iteritems(dct))                # next(iter(dct.items()))
next(six.iterkeys(dct))                 # next(iter(dct.keys()))
next(six.itervalues(dct))               # next(iter(dct.values()))
six.viewitems(dct)                      # dct.items()
six.viewkeys(dct)                       # dct.keys()
six.viewvalues(dct)                     # dct.values()
six.create_unbound_method(fn, cls)      # fn
six.get_unbound_function(meth)          # meth
six.get_method_function(meth)           # meth.__func__
six.get_method_self(meth)               # meth.__self__
six.get_function_closure(fn)            # fn.__closure__
six.get_function_code(fn)               # fn.__code__
six.get_function_defaults(fn)           # fn.__defaults__
six.get_function_globals(fn)            # fn.__globals__
six.raise_from(exc, exc_from)           # raise exc from exc_from
six.reraise(tp, exc, tb)                # raise exc.with_traceback(tb)
six.reraise(*sys.exc_info())            # raise
six.assertCountEqual(self, a1, a2)      # self.assertCountEqual(a1, a2)
six.assertRaisesRegex(self, e, r, fn)   # self.assertRaisesRegex(e, r, fn)
six.assertRegex(self, s, r)             # self.assertRegex(s, r)

# note: only for *literals*
six.ensure_binary('...')                # b'...'
six.ensure_str('...')                   # '...'
six.ensure_text('...')                  # '...'

open alias

Availability:

  • --py3-plus is passed on the commandline.
-with io.open('f.txt') as f:
+with open('f.txt') as f:
     ...

redundant open modes

Availability:

  • --py3-plus is passed on the commandline.
open("foo", "U")                      # open("foo")
open("foo", "Ur")                     # open("foo")
open("foo", "Ub")                     # open("foo", "rb")
open("foo", "rUb")                    # open("foo", "rb")
open("foo", "r")                      # open("foo")
open("foo", "rt")                     # open("foo")
open("f", "r", encoding="UTF-8")      # open("f", encoding="UTF-8")

OSError aliases

Availability:

  • --py3-plus is passed on the commandline.
# input

# also understands:
# - IOError
# - WindowsError
# - mmap.error and uses of `from mmap import error`
# - select.error and uses of `from select import error`
# - socket.error and uses of `from socket import error`

try:
    raise EnvironmentError('boom')
except EnvironmentError:
    raise
# output
try:
    raise OSError('boom')
except OSError:
    raise

typing.Text str alias

Availability:

  • --py3-plus is passed on the commandline.
-def f(x: Text) -> None:
+def f(x: str) -> None:
     ...

typing.NamedTuple / typing.TypedDict py36+ syntax

Availability:

  • --py36-plus is passed on the commandline.
# input
NT = typing.NamedTuple('NT', [('a', int), ('b', Tuple[str, ...])])

D1 = typing.TypedDict('D1', a=int, b=str)

D2 = typing.TypedDict('D2', {'a': int, 'b': str})

# output

class NT(typing.NamedTuple):
    a: int
    b: Tuple[str, ...]

class D1(typing.TypedDict):
    a: int
    b: str

class D2(typing.TypedDict):
    a: int
    b: str

f-strings

Availability:

  • --py36-plus is passed on the commandline.
'{foo} {bar}'.format(foo=foo, bar=bar)  # f'{foo} {bar}'
'{} {}'.format(foo, bar)                # f'{foo} {bar}'
'{} {}'.format(foo.bar, baz.womp)       # f'{foo.bar} {baz.womp}'
'{} {}'.format(f(), g())                # f'{f()} {g()}'

note: pyupgrade is intentionally timid and will not create an f-string if it would make the expression longer or if the substitution parameters are anything but simple names or dotted names (as this can decrease readability).

remove parentheses from @functools.lru_cache()

Availability:

  • --py38-plus is passed on the commandline.
 import functools

-@functools.lru_cache()
+@functools.lru_cache
 def expensive():
     ...

replace @functools.lru_cache(maxsize=None) with shorthand

Availability:

  • --py39-plus is passed on the commandline.
 import functools

-@functools.lru_cache(maxsize=None)
+@functools.cache
 def expensive():
     ...

pep 585 typing rewrites

Availability:

  • File imports from __future__ import annotations
    • Unless --keep-runtime-typing is passed on the commandline.
  • --py39-plus is passed on the commandline.
-def f(x: List[str]) -> None:
+def f(x: list[str]) -> None:
     ...

pep 604 typing rewrites

Availability:

  • File imports from __future__ import annotations
    • Unless --keep-runtime-typing is passed on the commandline.
  • --py310-plus is passed on the commandline.
-def f() -> Optional[str]:
+def f() -> str | None:
     ...
-def f() -> Union[int, str]:
+def f() -> int | str:
     ...
Comments
  • Use original source when building f-strings

    Use original source when building f-strings

    Working at the AST level meant we only handled a small subset of Python when generating f-strings. By extracting the original code as a string we can handle many more cases.

    ~~A disadvantage of this approach is that it requires Python ≥ 3.8 for ast.expr.end_lineno, ast.expr.end_col_offset.~~ This now uses the token stream like everything else, avoiding that requirement.

    opened by andersk 14
  • 'yield from' rewrite unsafe when looping variable is referenced later

    'yield from' rewrite unsafe when looping variable is referenced later

    Consider the example code:

    def foo(it):
        item = None
        for item in it:
            yield item
        print("Last item", item)
    

    With --py3-plus, this is transformed to:

    def foo(it):
        item = None
        yield from it
        print("Last item", item)
    

    But these are not equivalent. The line print("Last item", item) now always prints None rather than the last item of the passed iterable.

    This was discovered in more-itertools:

    https://github.com/erikrose/more-itertools/blob/8d860c355a1dd900e3a9c5fe1303ddf5a778452f/more_itertools/more.py#L1206-L1223

    bug help wanted 
    opened by jdufresne 13
  • py3-plus: .encode('utf-8') → .encode() & .decode('utf-8') → .decode()

    py3-plus: .encode('utf-8') → .encode() & .decode('utf-8') → .decode()

    In Python 3, the first positional argument to .encode() and .decode() defaults to 'utf-8'. This was not the case with Python 2:

    https://docs.python.org/3/library/stdtypes.html#str.encode https://docs.python.org/3/library/stdtypes.html#bytes.decode

    As this is the most common value passed, there could be a transform to simplify the calls to just .encode() or .decode() (without the first positional argument). This could help clean up and simplify modern Python code by removing noise.

    enhancement help wanted 
    opened by jdufresne 12
  • Presence of future annotation import causes improper application of PEP 604 for Python 3.7

    Presence of future annotation import causes improper application of PEP 604 for Python 3.7

    Given these file contents:

    # foo.py
    
    from __future__ import annotations
    
    from typing import Optional
    
    
    def some_function(some_arg: Optional[str] = None):
        ...
    

    Running the following command:

    $ pyupgrade --py37-plus
    

    Rewrites the file contents to:

    # foo.py
    
    from __future__ import annotations
    
    from typing import Optional
    
    
    def some_function(some_arg: str | None = None):
        ...
    

    Which to my understanding is not valid before Python 3.10. Note that if the from __future__ import annotations line is not present initially, the file remains unchanged.

    This is the case on at least versions 2.29.1 and 2.31.0.

    question 
    opened by daneah 11
  • TokenError

    TokenError

    Thank you very much for writing this tool!!

    I want to run pyupgrade over a project that probably still contains code that raises a syntax error when imported in a python3 interpreter.

    pyupgrade --py36-plus outputs is the following in a python3.7 conda env:

    filename1.py
    filename2.py
    Traceback (most recent call last):
      File "/home/thomas/miniconda/envs/py37/bin/pyupgrade", line 10, in <module>
        sys.exit(main())
      File "/home/thomas/miniconda/envs/py37/lib/python3.7/site-packages/pyupgrade.py", line 1428, in main
        ret |= fix_file(filename, args)
      File "/home/thomas/miniconda/envs/py37/lib/python3.7/site-packages/pyupgrade.py", line 1397, in fix_file
        contents_text = _fix_format_literals(contents_text)
      File "/home/thomas/miniconda/envs/py37/lib/python3.7/site-packages/pyupgrade.py", line 107, in _fix_format_literals
        tokens = src_to_tokens(contents_text)
      File "/home/thomas/miniconda/envs/py37/lib/python3.7/site-packages/tokenize_rt.py", line 44, in src_to_tokens
        ) in tokenize.generate_tokens(tokenize_target.readline):
      File "/home/thomas/miniconda/envs/py37/lib/python3.7/tokenize.py", line 579, in _tokenize
        raise TokenError("EOF in multi-line statement", (lnum, 0))
    tokenize.TokenError: ('EOF in multi-line statement', (350, 0))
    

    Unfortunately this exception is not very helpful, since it doesn't really tell me which file lead to this exception. Note that filename2.py is not the culprit, because it doesn't have a line with number 350.

    IMO pyupgrade should avoid showning tracebacks by defaults, but instead output filename+linum of the faulty files.

    Tested it with

    (py37) > $ conda list pyupgrade                                                                                 [±master ●●]
    # packages in environment at /home/thomas/miniconda/envs/py37:
    #
    # Name                    Version                   Build  Channel
    pyupgrade                 1.17.0                     py_0    conda-forge
    

    BTW pyupgrade doesn't have a --version cli flag.

    bug 
    opened by thisch 11
  • add inline ignore comment

    add inline ignore comment

    I have a py3.10 code base and run pyupgrade via pre-commit.

    In this code base I use pydantic models which use

    standard library typing types as defined in PEP 484 to define complex objects.

    link to docs

    So I have to define a model like this (example from docs):

    from typing import List
    
    from pydantic import BaseModel
    
    
    class Model(BaseModel):
        simple_list: list = None
        list_of_ints: List[int] = None
    

    Which in turn gets modified by pyupgrade:

    class Model(BaseModel):
        simple_list: list = None
    -    list_of_ints: List[int] = None
    +    list_of_ints: list[int] = None
    

    And this results in a RuntimeError from pydantic.

    To prevent this I currently use the workaround of skiping the model files whole which I luckily have in their own subpackage by ignoring them via the pre-commit config. But skiping them whole is a strong solution and I would rather skip single lines with something like a # noqa comment of some sort.

    opened by Cielquan 10
  • Replace typing.List with list and others

    Replace typing.List with list and others

    https://docs.python.org/3.9/whatsnew/3.9.html#pep-585-builtin-generic-types

    Python 3.9 (and Python 3.7 if you do from __future__ import annotations) will let you write

    from typing import List
    
    def a(my_arg: List) -> List:
        return []
    

    as

    def a(my_arg: list) -> list:
        return []
    

    Same goes for typing.Dict and a bunch of others, see https://www.python.org/dev/peps/pep-0585/

    enhancement help wanted 
    opened by verhovsky 10
  • some way to skip replacing mock with unittest.mock

    some way to skip replacing mock with unittest.mock

    when you're using python 3.6 or 3.7 unittest.mock.AsyncMock is unavailable, but mock.AsyncMock is available if you're using the latest backport

    there should be some way to skip replacing mock with unittest.mock, or the fixer should be moved to --py38-plus and then to a later --py...-plus as and when unittest.mock gains features

    opened by graingert 10
  • Fix unsafe yield from rewrite

    Fix unsafe yield from rewrite

    Fixes #216.

    Prevents rewrite for-loop yield if a loop variable referenced after the loop.

    Also, it fixes along the way the case with yield outside the function. Now pyupgrade doesn't rewrite it:

    # before
    $ echo "for x in y: yield x" | pyupgrade - --py3-plus
    yield from y
    
    # after
    $ echo "for x in y: yield x" | pyupgrade - --py3-plus
    for x in y: yield x
    

    I don't know is it intentional behavior or not. Please, inform if it is.

    Additionally, I've added a test for lambda yield (weird but syntactically possible), since there is Union[ast.FunctionDef, ast.Lambda].

    opened by atugushev 9
  • Auto-detect minimal Python version

    Auto-detect minimal Python version

    opened by kdeldycke 8
  • TypeError: unsupported operand type(s)

    TypeError: unsupported operand type(s)

    Hi there. I have an edge-case where pyupgrade suggested breaking changes to my code, which I think is because it assumes that any usage of ** implies that it's a dictionary and can be |'d with other dictionaries. I'm running pyupgrade with --py39-plus.

    from collections.abc import Mapping
    
    
    class A(Mapping):
        proxy = {"foo": 1}
    
        def __getitem__(self, k):
            return self.proxy.__getitem__(k)
    
        def __len__(self):
            return self.proxy.__len__()
    
        def __iter__(self):
            return self.proxy.__iter__()
    
    a = A()
    b = {"bar": 2}
    
    # Basic assumption holds.
    assert {**a} == {"foo": 1}
    
    # Original code works.
    assert {**a, **b} == {"foo": 1, "bar": 2}
    
    # Pyupgrade suggestion
    assert a | b == {"foo": 1, "bar": 2}
    # TypeError: unsupported operand type(s) for |: 'A' and 'dict'
    

    Is this an edge-case that Pyupgrade should handle, or is it safe to assume that any class that uses ** needs to implement compatibility with a dictionary union?

    bug 
    opened by christianbundy 8
  • RFE: configparser deprecations/removals

    RFE: configparser deprecations/removals

    configparser contains some deprecated items, some of which will start causing failures as of 3.12. I suppose pyupgrade could fix these up:

    • ParsingError.filename -> ParsingError.source
    • RawConfigParser.readfp -> RawConfigParser.read_file
    • SafeConfigParser -> ConfigParser

    All these replacements are available as of 3.2, so I suppose py36plus would be the target.

    opened by scop 1
  • an option to use the currently executing python version to determine what the rewrite target is

    an option to use the currently executing python version to determine what the rewrite target is

    discussed a bit with @hynek on twitter -- mostly need to bikeshed a name

    basically an alternative to the --py36-plus options but instead uses the currently running python

    enhancement help wanted 
    opened by asottile 1
  • Prefer property decorator to explicit call

    Prefer property decorator to explicit call

    This is a feature request for pyupgrade.

    Prior to Python 2.4, it wasn't possible to use decorators, so properties were had to be implemented in a two-step process. I recently stumbled onto such code and had hopes pyupgrade would automatically fix that usage, but alas, it did not. It would be nice if pyupgrade could support upgrading that syntax.

    Even better would be if it could also upgrade the setter syntax and maybe others (I don't think I've ever used a deleter).

    Given the age of Python 2.3 compatible code, it may not be worthwhile implementing this upgrade, but I thought I'd register the concern.

    opened by jaraco 0
  • unittest.makeSuite() with prefix incorrectly rewritten

    unittest.makeSuite() with prefix incorrectly rewritten

    return unittest.makeSuite(Test, 'test')
    

    is rewritten to:

    return unittest.defaultTestLoader.loadTestsFromTestCase(Test, 'test')
    

    which is invalid:

        return unittest.defaultTestLoader.loadTestsFromTestCase(Test, 'test')
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: TestLoader.loadTestsFromTestCase() takes 2 positional arguments but 3 were given
    

    This works:

    return unittest.defaultTestLoader.loadTestsFromTestCase(Test)
    
    bug help wanted 
    opened by cjmayo 2
  • added isinstance and issubclass (tuple to type union) support

    added isinstance and issubclass (tuple to type union) support

    Small plugin for changing

    isinstance(value, (type1, type2, type3, ...))
    issubclass(value, (type1, type2, type3, ...))
    

    to

    isinstance(value, type1 | type2 | type3 | ...)
    issubclass(value, type1 | type2 | type3 | ...)
    

    as was enabled in pep-0604

    Additionally added:

    • some stuff in .gitignore
    • tokenize-rt library to requirements-dev.txt (for some reason it was not present there. Maybe we should pin version?)

    P.S: isinstance and issubclass have a weird signature:

    __obj: object, __class_or_tuple: type | types.UnionType | tuple[type | types.UnionType | tuple[Any, ...], ...]
    

    which means it is possible to pass a tuple of types inside tuple of types and it will work. I have never seen anyone using this, so I leave it as it is.

    opened by leshark 2
Owner
Anthony Sottile
@pre-commit @pytest-dev @tox-dev
Anthony Sottile
Tool for translation type comments to type annotations in Python

com2ann Tool for translation of type comments to type annotations in Python. The tool requires Python 3.8 to run. But the supported target code versio

Ivan Levkivskyi 123 Nov 12, 2022
AST based refactoring tool for Python.

breakfast AST based refactoring tool. (Very early days, not usable yet.) Why 'breakfast'? I don't know about the most important, but it's a good meal.

eric casteleijn 0 Feb 22, 2022
Code generation and code search for Python and Javascript.

Codeon Code generation and code search for Python and Javascript. Similar to GitHub Copilot with one major difference: Code search is leveraged to mak

null 51 Dec 8, 2022
Awesome autocompletion, static analysis and refactoring library for python

Jedi - an awesome autocompletion, static analysis and refactoring library for Python Jedi is a static analysis tool for Python that is typically used

Dave Halter 5.3k Dec 29, 2022
Removes unused imports and unused variables as reported by pyflakes

autoflake Introduction autoflake removes unused imports and unused variables from Python code. It makes use of pyflakes to do this. By default, autofl

Steven Myint 678 Jan 4, 2023
Turn your C++/Java code into a Python-like format for extra style points and to make everyone hates you

Turn your C++/Java code into a Python-like format for extra style points and to make everyone hates you

Tô Đức (Watson) 4 Feb 7, 2022
Codes of CVPR2022 paper: Fixing Malfunctional Objects With Learned Physical Simulation and Functional Prediction

Fixing Malfunctional Objects With Learned Physical Simulation and Functional Prediction Figure 1. Teaser. Introduction This paper studies the problem

Yining Hong 32 Dec 29, 2022
A tool (and pre-commit hook) to automatically add trailing commas to calls and literals.

add-trailing-comma A tool (and pre-commit hook) to automatically add trailing commas to calls and literals. Installation pip install add-trailing-comm

Anthony Sottile 264 Dec 20, 2022
Pre-commit hook for upgrading type hints

This is a pre-commit hook configured to automatically upgrade your type hints to the new native types implemented in PEP 585.

snok 54 Nov 14, 2022
🗽 Like yarn outdated/upgrade, but for pip. Upgrade all your pip packages and automate your Python Dependency Management.

pipupgrade The missing command for pip Table of Contents Features Quick Start Usage Basic Usage Docker Environment Variables FAQ License Features Upda

Achilles Rasquinha 529 Dec 31, 2022
Purge all transformation orientations addon for Blender 2.8 and newer versions

CTO Purge This add-on adds a new button to Blender's Transformation Orientation panel which empowers the user to purge all of his/her custom transform

MMMrqs 10 Dec 29, 2022
Among Us Editor written in Python, for newer versions of the game

Among Us Editor Remake Among Us Editor written in Python, for newer versions of the game. Credits GUI Code by Vresod Data dumping and some GUI code by

Vresod 7 Nov 18, 2022
A tool to upgrade dependencies to the latest versions

pip-check-updates A tool to upgrade dependencies to the latest versions, inspired by npm-check-updates Install From PyPi pip install pip-check-updates

Zeheng Li 12 Jan 6, 2023
Python script to commit to your github for a perfect commit streak. This is purely for education purposes, please don't use this script to do bad stuff.

Daily-Git-Commit Commit to repo every day for the perfect commit streak Requirments pip install -r requirements.txt Setup Download this repository. Cr

JareBear 34 Dec 14, 2022
Spam the buzzer and upgrade automatically - Selenium

CookieClicker Usage: Let's check your chrome navigator version : Consequently, you have to : download the right chromedriver in the follow link : http

Iliam Amara 1 Nov 22, 2021
Ansible Automation Example: JSNAPY PRE/POST Upgrade Validation

Ansible Automation Example: JSNAPY PRE/POST Upgrade Validation Overview This example will show how to validate the status of our firewall before and a

Calvin Remsburg 1 Jan 7, 2022
A Python r2pipe script to automatically create a Frida hook to intercept TLS traffic for Flutter based apps

boring-flutter A Python r2pipe script to automatically create a Frida hook to intercept TLS traffic for Flutter based apps. Currently only supporting

Hamza 64 Oct 18, 2022
python3.5+ hubspot client based on hapipy, but modified to use the newer endpoints and non-legacy python

A python wrapper around HubSpot's APIs, for python 3.5+. Built initially around hapipy, but heavily modified. Check out the documentation here! (thank

Jacobi Petrucciani 140 Dec 21, 2022
Stand-alone parser for User Access Logging from Server 2012 and newer systems

KStrike Stand-alone parser for User Access Logging from Server 2012 and newer systems BriMor Labs KStrike This script will parse data from the User Ac

BriMor Labs 69 Nov 1, 2022
Find version automatically based on git tags and commit messages.

GIT-CONVENTIONAL-VERSION Find version automatically based on git tags and commit messages. The tool is very specific in its function, so it is very fl

null 0 Nov 7, 2021