Package: qaviton-package-manager
Qaviton Package ManagerQaviton Package Manager (qpm)is a package management tool integrated with git.to enable management of packages both public & private,from git repositories, in addition to the standard package manager.Replace redundant packaging systems using qpm:Package everything using git tags:>qpm --build
         |
branch: dev
         |
branch: tests
         |  
[tag 2019.9.1] 
         |
[tag 2019.9.2]
         |
branch: release/latest


>qpm --install "git+https://url/owner/project.git@release/latest#egg=package:>=2019.9.2"
  |       |      |   |           |                     |             |              |
qaviton install vcs+protocol://project_url          @branch   #egg=package      (optional) 
package method  type                                              directory   pep-440 pep-508
manager                                                             path     :version_specifierInstallationpipinstall--upgradeqaviton_package_managerRequirementsgit 2.16+Python 3.6+FeaturesCI CD workflow ✓managing private+public packages ✓managing nested private packages ✓cli + scripting ✓pip capabilities ✓git capabilities ✓pypi capabilities ✓automatic builds ✓secure credentials ✓cross-platform ✓nested/multiple packages ✗pip -e installs ✗ (coming soon)docker build ✗ (but can be used with the run function)docker push ✗ (but can be used with the run function)Usagecreating a manager:(venv) windows> qpm ^
--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$qpm\--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 .gitignorenow let's build a package:# package.pyfromqaviton_package_managerimportManagerfromqaviton_package_managerimportdecypt# 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 stuckmanager.run(lambda:manager.update(),# pip install -r requirements.txt --upgradelambda:manager.update_test(),# pip install -r requirements-test.txt --upgradelambda:manager.test(),# python -m pytest --junitxml=test_report.xml testslambda: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.pydeftest_with_100p_coverage():print("testing my package!\nPASS")# we can now create a packagepythonpackage.pyCLI:we can call any method and send any parameter to the manager through cli:# release a version if all tests passqpm--username""--password""--update--update_test--test--build--upload# build a stable version if all tests passqpm--username""--password""--update--update_test--test--build"stable/latest"# install cachetools using pip and save the requirement in requirements.txtqpm--installcachetools# cache credentials in memoryqpm--username""--password""--cache_timeout"-1"# using the system & python to execute testsqpm--test"system""echo success"--test"python""-c""print(\"py success\");"CLI shortcuts:we can call any method and send any parameter to the manager through cli:# install cachetools using pip and save the requirement in requirements.txtqpmicachetools# uninstall cachetools using pip and remove the requirement in requirements.txtqpmuncachetools# build a stable versionqpmb"stable/latest"# run testsqpmt# upload to pypiqpmup# install cachetools using pip and save the requirement in requirements.txtqpminstallcachetools# build packageqpmbuild"stable/latest"# upload to pypiqpmuploadScript:# ci_cd.pyfromqaviton_processesimportrun,escape,pythonfrompackageimportmanagerfromdatetimeimportdatetimed=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 distributelambda: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 scriptlambda:python("deploy.py"))# schedualer.pyfromtimeimporttime,sleepfromdatetimeimportdatetime,timedeltafromqaviton_processesimportpython_code_asyncd=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 22pmwhileTrue:python_code_async('import ci_cd')date+=deltasleep(date.timestamp()-time())warningsthis manager is meant for automated ci cd purposesand should not be used instead of regular git commit/push/merge.make sure to avoid using it on unstable branchesto 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