Skip to main content

qaviton_package_manager


Tired of redundant packaging systems for your software?
qaviton is here to help!
we can package everything into simple

git branches:

  |
 dev
  |
tests
  |  
release/2019.9.1.21.12.2.127916      
  |
release/2019.9.2.0.39.13.173494     
  |
release/latest

you can now install this package:
pip install git+https://github.com/owner/package.git@release/latest

Installation

pip install --upgrade qaviton_package_manager

Requirements

  • git 2.16+
  • Python 3.6+

Features

  • CI CD workflow ✓
  • managing private+public packages ✓
  • managing nested private packages ✓
  • cli + scripting ✓
  • pip capabilities ✓
  • git capabilities ✓
  • pypi capabilities ✓
  • automatic builds ✓
  • secure credentials ✓
  • crossplatform ✓

Usage

creating a manager:

(venv) windows> python -m qaviton_package_manager ^
--create ^
--url "https://github.com/owner/project.git" ^
--username "user1" ^
--password "pass@#$" ^
--email "awsome@qaviton.com" ^
--pypi_user "supasayajin" ^
--pypi_pass "final space" 
(venv) bash$ python -m qaviton_package_manager  \
--create  \
--url "https://github.com/owner/project.git"  \
--username "user1"  \
--password "pass@#$"  \
--email "awsome@qaviton.com"  \
--pypi_user "supasayajin"  \
--pypi_pass "final space"  \
/

this should leave you with the following project structure:

project/
  ├ package/
  │   └ __init__.py  # with __author__, __version__, __author_email__, __description__, __url__, __license__
  ├ tests/
  │   └ __init__.py
  ├ .gitignore
  ├ LICENSE 
  ├ README.md
  ├ requirements.txt
  ├ requirements-test.txt
  ├ setup.py
  └ package.py  # ignored by .gitignore

now let's build a package:

# package.py
from qaviton_package_manager import Manager
from qaviton_package_manager import decypt

# if this is not secure enough, you can add cache_timeout=3600 
# and store credentials in memory
# manager = Manager(cache_timeout=3600)  
# and we need to insert the credentials in run time: > python package.py --username "x"  --password "z"
manager = Manager(**decypt(
    key=b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',
    token=b'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx==',
))


if __name__ == "__main__":
    # running with lambdas will protect you from processes getting stuck
    manager.run(
        lambda: manager.update(), # pip install -r requirements.txt --upgrade
        lambda: manager.update_test(), # pip install -r requirements-test.txt --upgrade
        lambda: manager.test(), # python -m pytest --junitxml=test_report.xml tests
        lambda: manager.build(), # git commit, tag & push (internal logic is more complicated)
        lambda: manager.upload(), # upload to pypi
    )

make sure you have at list 1 passing test for your package

# tests/my_package_test.py
def test_with_100p_coverage():
    print("testing my package!\nPASS")
# we can now create a package
python package.py

CLI:

we can call any method and send any parameter to the manager through cli:

# release a version if all tests pass
python package.py --username "" --password "" --update --update_test --test --build --upload

# build a stable version if all tests pass
python package.py --username "" --password "" --update --update_test --test --build "stable/latest"

# install cachetools using pip and save the requirement in requirements.txt
python package.py --install cachetools

# cache credentials in memory
python package.py --username "" --password "" --cache_timeout "-1"

# using the system & python to execute tests
python package.py --test "system" "echo success" --test "python" "-c" "print(\"py success\");"

Script:

# ci_cd.py
from qaviton_package_manager import run, escape, python
from package import manager
from datetime import datetime


d = datetime.utcnow()
docker_url = manager.vars['docker_url']
docker_user = manager.vars['docker_user']
docker_pass = manager.vars['docker_pass']
docker_email = manager.vars['docker_email']
SSH_PRIVATE_KEY = manager.kwargs['SSH_PRIVATE_KEY']
docker_tag = manager.kwargs['docker_tag']
branch_build = "ci_cd/latest"
dev_branch = "dev"

manager.run(
    lambda: manager.should_build(from_branch=dev_branch, to_branch=branch_build),
    lambda: manager.install(),
    lambda: manager.install_test(),
    lambda: manager.test.pytest("tests/ci_cd"),
    lambda: manager.build(to_branch=branch_build, version=f'{d.year}.{d.month}.{d.day}'),
    # docker distribute
    lambda: run(f"docker login --username=\"{escape(docker_user)}\" --password=\"{escape(docker_pass)}\" --email=\"{escape(docker_email)}\" \"{escape(docker_url)}\""),
    lambda: run(f"docker build --force-rm -t test-multi-stage-builds --build-arg SSH_PRIVATE_KEY=\"{escape(SSH_PRIVATE_KEY)}\" ."),
    lambda: run(f"docker tag {docker_tag} yourhubusername/verse_gapminder:firsttry"),
    lambda: run("docker push yourhubusername/verse_gapminder"),
    # deploy script
    lambda: python("deploy.py")    
)
# schedualer.py
from time import time, sleep
from datetime import datetime, timedelta
from qaviton_package_manager import pythonCIO

d = datetime.utcnow()
date = datetime(year=d.year, month=d.month, day=d.day, hour=22)
delta = timedelta(days=1)

# build a package once a day at 22pm
while True:
    pythonCIO('import ci_cd')
    date += delta
    sleep(date.timestamp()-time())

not yet supported

  • pip -e installs
  • nested packages (might not get supported)
  • docker build (but can be used with the run function)
  • docker push (but can be used with the run function)

warnings

  • this manager is meant for automated ci cd purposes
    and should not be used instead of regular git commit/push/merge.
    make sure to avoid using it on unstable branches
    to avoid failed packaging requests or potential data loss.
    we recommend using it from a CI CD dedicated branch.

  • the manager defaults to encrypted credentials,
    if encrypted credentials on the disk are not secure enough,
    please make sure to enable caching, to store credentials in memory

Metadata

Release files for qaviton-package-manager 2019.9.4.23.2.40.777620

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

Source distribution (sdist)

Source distribution for qaviton-package-manager 2019.9.4.23.2.40.777620
File Size Uploaded Provenance Actions
qaviton_package_manager-2019.9.4.23.2.40.777620.tar.gz 17.4 kB Without provenance Details for qaviton_package_manager-2019.9.4.23.2.40.777620.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for qaviton-package-manager 2019.9.4.23.2.40.777620
File Interpreter ABI Platform Actions
qaviton_package_manager-2019.9.4.23.2.40.777620-py2.py3-none-any.whl Python 2, Python 3 none any Details for qaviton_package_manager-2019.9.4.23.2.40.777620-py2.py3-none-any.whl

Total release size: 45.9 kB

Release files / qaviton_package_manager-2019.9.4.23.2.40.777620.tar.gz

Download URL qaviton_package_manager-2019.9.4.23.2.40.777620.tar.gz
Size 17.4 kB
Tags Source
SHA-256 checksum
How to use checksums
9936a7088d71a0ad2f0a4a6fda0e9ca611c143e97478339cc2fcc0937420911a
BLAKE2b-256 checksum
How to use checksums
bc0c1b3fa7af705c025e6f0954a69bb456fca8485f9746ef60b67c4ea4a2545c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.6.7

Release files / qaviton_package_manager-2019.9.4.23.2.40.777620-py2.py3-none-any.whl

Download URL qaviton_package_manager-2019.9.4.23.2.40.777620-py2.py3-none-any.whl
Size 28.5 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
1a1ac6f05ab5da93018be40a137cac9a627756c67246e76d7b75b2fb89fd34fe
BLAKE2b-256 checksum
How to use checksums
084151d5f0770dfe921070625b846c2c4209d31c250187aa10f68ae3811ce33d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.35.0 CPython/3.6.7

Security for qaviton-package-manager 2019.9.4.23.2.40.777620

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release
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