Skip to main content

The clinterfacer framework

Pipeline Status PyPI Version

This framework aims to simplify the creation of Command-Line Interfaces (CLIs) using python.

Installation

To install the clinterfacer framework using pip only, enter the following command:

pip install clinterfacer==1.3.0

However, if you are using pipenv, enter the following command in the root of your project.

pipenv install clinterfacer==1.3.0

Usage

After installation, it must be exist the follow files and folders in your project:

clinterfaced
├── clinterfaced*
│   ├── commands*
│   │   ├── build.py
│   │   ├── config.py
│   │   ├── deploy.py
│   │   ├── doc.py
│   │   ├── get_param.py
│   │   ├── __init__.py*
│   │   └── train.py
│   ├── __init__.py*
│   ├── __main__.py*
│   ├── resources**
│   │   ├── __init__.py**
│   │   └── logging.ini**
│   ├── subparsers*
│   │   ├── build.py
│   │   ├── config.py
│   │   ├── deploy.py
│   │   ├── doc.py
│   │   ├── get_param.py
│   │   ├── __init__.py*
│   │   └── train.py
│   └── utils.py
├── Makefile
├── Pipfile
├── README.md*
└── setup.py*

All the above files and folders ending with * are expected by the clinterfacer framework. However, all the above files and folders ending with ** are opitional and are used by the clinterfacer framework to load the desired logging configuration. The remaining files and folders were merely used for exemplifying.

The setup.py file

There is a template for the setup.py file bellow.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""This file is used to install the clinterfaced package."""

# standard library(ies)
import pathlib as pl
import typing

# 3rd party package(s)
import setuptools

# local source(s)
import clinterfaced as package


def read(path: typing.Union[str, pl.Path], encoding: str = 'utf-8') -> str:
    if isinstance(path, str):
        path = pl.Path(path)
    return path.read_text(encoding) if path.exists() else ''

readme = pathlib.Path('./README.md')
metadata = {
    'name': package.__name__,
    'version': package.__version__,
    'author': package.__author__,
    'author_email': package.__email__,
    'maintainer': package.__maintainer__,
    'maintainer_email': package.__email__,
    'description': package.__description__,
    'long_description': read(readme),
    'long_description_content_type': 'text/markdown',
    'url': package.__url__,
    'packages': setuptools.find_packages(),
    'include_package_data': True,
    'install_requires': [
        'clinterfacer==1.3.0',
    ],
    'entry_points': {
        'console_scripts': [
            f'{package.__name__} = {package.__name__}.__main__:main',
        ],
    },
    'classifiers': [
        'Programming Language :: Python :: 3',
        'Operating System :: OS Independent',
    ],
}
if __name __ == '__main__':
    setuptools.setup(**metadata)

The __init__.py file

#!/usr/bin/env python

"""__init__.py: This script includes all the project's metadata."""

__authors__ = (
    'Adriano Henrique Rossette Leite',
)
__email__ = (
    'adrianohrl@gmail.com',
)
__maintainer__ = (
    'Adriano Henrique Rossette Leite',
)
__copyright__ = ''
__credits__ = []
__license__ = ''
__version__ = '0.0.0' # this information should be altered only by the bumpversion tool
__status__ = 'Development' # should typically be one of 'Prototype', 'Development', 
__description__ = 'This package uses the clinterfacer framework.'
__url__ = 'https://gitlab.com/adrianohrl/clinterfaced'
__author__ = ', '.join(__author__)
__email__ = ', '.join(__email__)
__maintainer__ = ', '.join(__maintainer__)
options = [
    'Development',
    'Prototype',
    'Production',
]
if __status__ is not in options:
    raise Exception(f'Invalid __status__: {__status__}. It should typically be one of the following: {options}')

The __main__.py file

#!/usr/bin/env python


"""This is the main script of the clinterfaced package."""


# standard library(ies)
import sys

# 3rd party package(s)
import clinterfacer


def main() -> int:
    cli = clinterfacer.CLI()
    return cli.main()

if __name__ == '__main__':
    return sys.exit(main())

The commands folder

The script below is an example of the implementation of a command named as get-param.

#!/usr/bin/env python
# -*- coding: utf-8 -*-


"""This is the main script of the clinterfaced's get-param command."""


# standard library(ies)
import argparse
import logging
import sys

# local source(s)
from clinterfaced.subparsers.get_param import parse_args


logger = logging.getLogger(__name__)
parameters = {
    'framework': 'CLInterfacer',
}


def main(args: argparse.Namespace) -> None:
    logger.info(f'Getting parameter the clinterfaced\'s {args.parameter} paramenter ...')
    logger.info(f'Value for the {args.parameter} parameter: \'{parameters[args.parameter]}\'')


if __name__ == '__main__':
    args = parse_args()
    sys.exit(main(args))

The subparsers folder

The script below is an example of the definition of the arguments of a command named as get-param.

#!/usr/bin/env python
# -*- coding: utf-8 -*-


"""This script defines the clinterfaced's get-param subparser."""


# standard library(ies)
import argparse

# 3rd party package(s)
from clinterfacer import cli


def add_parser(subparsers: argparse._SubParsersAction) -> None:
    parser = subparsers.add_parser(
        'get-param',
        help='This is the get-param command of the clinterfaced package',
        prog='clinterfaced get-param',
        description='This command is the get-param one.',
    )
    add_arguments(parser)


def add_arguments(parser: argparse.ArgumentParser) -> None:
    parser.add_argument(
        'parameter',
        help='Specifies the name of the desired paramenter.',
        metavar='PARAMETER',
    )


def parse_args() -> argparse.Namespace: 
    parser = argparse.ArgumentParser()
    add_arguments(parser)
    args = parser.parse_args()
    cli.setup()
    return args

Installing the package

pipenv install clinterfacer 

Entering the commands in terminal

pipenv shell
clinterfaced build
clinterfaced config -f ./build.txt
clinterfaced train -t 0.6
clinterfaced deploy
clinterfaced doc -b html
exit # or Ctrl+D

Releasing

git checkout master
git pull
git merge --no-ff new-feature
bumpversion [major|minor|patch]
git push origin master --tags
python setup.py sdist bdist_wheel
tar tzf dist/clinterfacer-1.3.0.tar.gz 
twine check dist/*
twine upload  --verbose --repository-url https://test.pypi.org/legacy/ dist/*
twine upload  --verbose dist/*

Metadata

Release files for clinterfacer 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for clinterfacer 1.3.0
File Size Uploaded
clinterfacer-1.3.0.tar.gz 12.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for clinterfacer 1.3.0
File Interpreter ABI Platform
clinterfacer-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 29.2 kB

Release files / clinterfacer-1.3.0.tar.gz

Download URL clinterfacer-1.3.0.tar.gz
Size 12.7 kB
Tags Source
SHA-256 checksum
How to use checksums
07b2a32b650380bf525a07429fa302b990e656e03def917507be962750c3a3ea
BLAKE2b-256 checksum
How to use checksums
af0065d13bfa46734e1acacfa5d242ad10d5eaab487582b91cd102d3ea68b70f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.6

Release files / clinterfacer-1.3.0-py3-none-any.whl

Download URL clinterfacer-1.3.0-py3-none-any.whl
Size 16.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
812a2a454de54aef07e18b6e2bf6f58d2811206f3ff57fda22d8a13691e44810
BLAKE2b-256 checksum
How to use checksums
859237df9fedadc0b8301732c6aeff4c51ee0dc8e0471836395b207a1ae2cc34
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.43.0 CPython/3.7.6

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 release files

1.2.9

2 release files

1.2.8

2 release files

1.2.5

2 release files

1.2.1

2 release files

1.1.7

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page