/paradigm

Python objects metadata parser (functions/classes/methods signatures)

Primary LanguagePythonMIT LicenseMIT

paradigm

In what follows

  • python is an alias for python3.5 or any later version (python3.6 and so on),
  • pypy is an alias for pypy3.5 or any later version (pypy3.6 and so on).

Installation

Install the latest pip & setuptools packages versions:

  • with CPython
    python -m pip install --upgrade pip setuptools
  • with PyPy
    pypy -m pip install --upgrade pip setuptools

User

Download and install the latest stable version from PyPI repository:

  • with CPython
    python -m pip install --upgrade paradigm
  • with PyPy
    pypy -m pip install --upgrade paradigm

Developer

Download the latest version from GitHub repository

git clone https://github.com/lycantropos/paradigm.git
cd paradigm

Install dependencies:

  • with CPython
    python -m pip install -r requirements.txt
  • with PyPy
    pypy -m pip install -r requirements.txt

Install:

  • with CPython
    python setup.py install
  • with PyPy
    pypy setup.py install

Usage

paradigm can be used to obtain signature

>>> from paradigm import signatures

for user-defined functions

>>> def func(foo, bar=None, **kwargs):
...     pass
>>> signatures.factory(func)
Plain(Parameter(name='foo', kind=Parameter.Kind.POSITIONAL_OR_KEYWORD, has_default=False), Parameter(name='bar', kind=Parameter.Kind.POSITIONAL_OR_KEYWORD, has_default=True), Parameter(name='kwargs', kind=Parameter.Kind.VARIADIC_KEYWORD, has_default=False))

for user-defined classes

>>> class UpperOut:
...     def __init__(self, outfile):
...         self._outfile = outfile
... 
...     def write(self, s):
...         self._outfile.write(s.upper())
... 
...     def __getattr__(self, name):
...         return getattr(self._outfile, name)
>>> signatures.factory(UpperOut)
Plain(Parameter(name='outfile', kind=Parameter.Kind.POSITIONAL_OR_KEYWORD, has_default=False))

for user-defined classes methods

>>> signatures.factory(UpperOut.write)
Plain(Parameter(name='self', kind=Parameter.Kind.POSITIONAL_OR_KEYWORD, has_default=False), Parameter(name='s', kind=Parameter.Kind.POSITIONAL_OR_KEYWORD, has_default=False))

for built-in functions

>>> import platform
>>> from paradigm.models import Parameter, Plain
>>> signatures.factory(any) == (
...     Plain(Parameter(name='seq',
...                     kind=Parameter.Kind.POSITIONAL_OR_KEYWORD,
...                     has_default=False))
...     if platform.python_implementation() == 'PyPy'
...     else Plain(Parameter(name='iterable',
...                          kind=Parameter.Kind.POSITIONAL_ONLY,
...                          has_default=False)))
True

for built-in classes

>>> import platform
>>> from paradigm.models import Parameter, Plain
>>> signatures.factory(float) == (
...     Plain(Parameter(name='x', 
...                     kind=Parameter.Kind.POSITIONAL_OR_KEYWORD,
...                     has_default=True))
...     if platform.python_implementation() == 'PyPy'
...     else Plain(Parameter(name='x', 
...                          kind=Parameter.Kind.POSITIONAL_ONLY,
...                          has_default=True)))
True

for built-in classes methods

>>> import platform
>>> from paradigm.models import Parameter, Plain
>>> signatures.factory(float.as_integer_ratio) == (
...     Plain(Parameter(name='self',
...                     kind=Parameter.Kind.POSITIONAL_OR_KEYWORD,
...                     has_default=False))
...     if platform.python_implementation() == 'PyPy'
...     else Plain(Parameter(name='self',
...                          kind=Parameter.Kind.POSITIONAL_ONLY,
...                          has_default=False)))
True

Checking if object is supported by paradigm can be done with

>>> from paradigm import definitions
>>> definitions.is_supported(int.bit_length)
True

Development

Bumping version

Preparation

Install bump2version.

Pre-release

Choose which version number category to bump following semver specification.

Test bumping version

bump2version --dry-run --verbose $CATEGORY

where $CATEGORY is the target version number category name, possible values are patch/minor/major.

Bump version

bump2version --verbose $CATEGORY

This will set version to major.minor.patch-alpha.

Release

Test bumping version

bump2version --dry-run --verbose release

Bump version

bump2version --verbose release

This will set version to major.minor.patch.

Running tests

Install dependencies:

  • with CPython
    python -m pip install -r requirements-tests.txt
  • with PyPy
    pypy -m pip install -r requirements-tests.txt

Plain

pytest

Inside Docker container:

  • with CPython
    docker-compose --file docker-compose.cpython.yml up
  • with PyPy
    docker-compose --file docker-compose.pypy.yml up

Bash script (e.g. can be used in Git hooks):

  • with CPython

    ./run-tests.sh

    or

    ./run-tests.sh cpython
  • with PyPy

    ./run-tests.sh pypy

PowerShell script (e.g. can be used in Git hooks):

  • with CPython
    .\run-tests.ps1
    or
    .\run-tests.ps1 cpython
  • with PyPy
    .\run-tests.ps1 pypy