From 5a75e535033b70459392dac5589c3afce0f7e105 Mon Sep 17 00:00:00 2001 From: jsanchezl12 Date: Sat, 12 Mar 2022 12:53:27 -0500 Subject: [PATCH 1/8] coverage process --- .github/workflows/test.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bf66c587..6d87bc77 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,3 +26,8 @@ jobs: - name: Correr pruebas id: correr-pruebas run: python -m unittest discover -s tests + - name: Cálculo de cubrimiento + id: cubrimiento + run: | + coverage run -m unittest tests/test_persona.py + coverage report -m From 0ac97c94c5ee64db4854daaa64aa89060008a6fc Mon Sep 17 00:00:00 2001 From: jsanchezl12 Date: Sat, 12 Mar 2022 12:58:04 -0500 Subject: [PATCH 2/8] Test commit --- src/__main__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__main__.py b/src/__main__.py index f3d45f42..1e4976e1 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -9,6 +9,6 @@ session.close() coleccion = Coleccion() - + print("Test Change") app = ic.App(sys.argv, coleccion) sys.exit(app.exec_()) \ No newline at end of file From cdb4745d64ebae3e847ee0bf9a9d52696f28c7a4 Mon Sep 17 00:00:00 2001 From: jsanchezl12 Date: Sat, 12 Mar 2022 13:01:34 -0500 Subject: [PATCH 3/8] gitignore enviroment --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 38d9605f..22964a45 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ src/modelo/__pycache__/* src/logica/__pycache__/* src/vista/__pycache__/* venv/* +*/EntornoVirtual/* +EntornoVirtual/* From b9aa0560ebf4bbe64b4afb71538ee86182ab3e49 Mon Sep 17 00:00:00 2001 From: jsanchezl12 Date: Sat, 12 Mar 2022 13:10:09 -0500 Subject: [PATCH 4/8] test proyecto funcional --- .../EGG-INFO/AUTHORS.rst | 23 + .../EGG-INFO/LICENSE.txt | 21 + .../EGG-INFO/PKG-INFO | 277 +++++ .../EGG-INFO/RECORD | 91 ++ .../PyScaffold-3.2.3-py3.9.egg/EGG-INFO/WHEEL | 5 + .../EGG-INFO/entry_points.txt | 42 + .../EGG-INFO/requires.txt | 25 + .../EGG-INFO/top_level.txt | 1 + .../pyscaffold/__init__.py | 7 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 415 bytes .../__pycache__/exceptions.cpython-39.pyc | Bin 0 -> 4676 bytes .../__pycache__/integration.cpython-39.pyc | Bin 0 -> 3632 bytes .../pyscaffold/__pycache__/log.cpython-39.pyc | Bin 0 -> 10847 bytes .../__pycache__/repo.cpython-39.pyc | Bin 0 -> 3266 bytes .../__pycache__/shell.cpython-39.pyc | Bin 0 -> 3641 bytes .../__pycache__/termui.cpython-39.pyc | Bin 0 -> 2698 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 11481 bytes .../pyscaffold/api/__init__.py | 349 ++++++ .../pyscaffold/api/helpers.py | 373 ++++++ .../pyscaffold/cli.py | 236 ++++ .../pyscaffold/contrib/__init__.py | 68 ++ .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 2287 bytes .../contrib/__pycache__/ptr.cpython-39.pyc | Bin 0 -> 6750 bytes .../pyscaffold/contrib/configupdater.py | 1074 +++++++++++++++++ .../pyscaffold/contrib/ptr.py | 222 ++++ .../contrib/setuptools_scm/__init__.py | 163 +++ .../contrib/setuptools_scm/__main__.py | 17 + .../__pycache__/__init__.cpython-39.pyc | Bin 0 -> 4141 bytes .../__pycache__/config.cpython-39.pyc | Bin 0 -> 3374 bytes .../__pycache__/discover.cpython-39.pyc | Bin 0 -> 703 bytes .../__pycache__/git.cpython-39.pyc | Bin 0 -> 4379 bytes .../__pycache__/integration.cpython-39.pyc | Bin 0 -> 1009 bytes .../__pycache__/utils.cpython-39.pyc | Bin 0 -> 3402 bytes .../__pycache__/version.cpython-39.pyc | Bin 0 -> 8465 bytes .../contrib/setuptools_scm/config.py | 107 ++ .../contrib/setuptools_scm/discover.py | 13 + .../contrib/setuptools_scm/file_finder.py | 56 + .../contrib/setuptools_scm/file_finder_git.py | 61 + .../contrib/setuptools_scm/file_finder_hg.py | 47 + .../pyscaffold/contrib/setuptools_scm/git.py | 153 +++ .../contrib/setuptools_scm/hacks.py | 29 + .../pyscaffold/contrib/setuptools_scm/hg.py | 110 ++ .../contrib/setuptools_scm/integration.py | 30 + .../contrib/setuptools_scm/utils.py | 120 ++ .../contrib/setuptools_scm/version.py | 308 +++++ .../contrib/setuptools_scm/win_py31_compat.py | 214 ++++ .../pyscaffold/exceptions.py | 104 ++ .../pyscaffold/extensions/__init__.py | 4 + .../pyscaffold/extensions/cookiecutter.py | 168 +++ .../pyscaffold/extensions/django.py | 109 ++ .../pyscaffold/extensions/gitlab_ci.py | 42 + .../pyscaffold/extensions/namespace.py | 154 +++ .../pyscaffold/extensions/no_skeleton.py | 44 + .../pyscaffold/extensions/pre_commit.py | 72 ++ .../pyscaffold/extensions/tox.py | 42 + .../pyscaffold/extensions/travis.py | 46 + .../pyscaffold/info.py | 201 +++ .../pyscaffold/integration.py | 110 ++ .../pyscaffold/log.py | 311 +++++ .../pyscaffold/repo.py | 101 ++ .../pyscaffold/shell.py | 121 ++ .../pyscaffold/structure.py | 107 ++ .../pyscaffold/templates/__init__.py | 439 +++++++ .../pyscaffold/templates/__init__.template | 11 + .../pyscaffold/templates/authors.template | 5 + .../pyscaffold/templates/changelog.template | 10 + .../pyscaffold/templates/conftest_py.template | 10 + .../pyscaffold/templates/coveragerc.template | 28 + .../pyscaffold/templates/gitignore.template | 50 + .../templates/gitignore_empty.template | 1 + .../pyscaffold/templates/gitlab_ci.template | 72 ++ .../pyscaffold/templates/isort_cfg.template | 10 + .../templates/license_affero_3.0.template | 619 ++++++++++ .../templates/license_apache.template | 201 +++ .../templates/license_artistic_2.0.template | 201 +++ .../templates/license_cc0_1.0.template | 116 ++ .../templates/license_eclipse_1.0.template | 203 ++++ .../templates/license_gpl_2.0.template | 280 +++++ .../templates/license_gpl_3.0.template | 621 ++++++++++ .../pyscaffold/templates/license_isc.template | 13 + .../templates/license_lgpl_2.1.template | 458 +++++++ .../templates/license_lgpl_3.0.template | 165 +++ .../pyscaffold/templates/license_mit.template | 21 + .../templates/license_mozilla.template | 362 ++++++ .../templates/license_new_bsd.template | 27 + .../templates/license_none.template | 1 + .../templates/license_public_domain.template | 24 + .../templates/license_simplified_bsd.template | 23 + .../pyscaffold/templates/namespace.template | 2 + .../templates/pre-commit-config.template | 25 + .../pyscaffold/templates/readme.template | 17 + .../templates/requirements.template | 17 + .../pyscaffold/templates/setup_cfg.template | 104 ++ .../pyscaffold/templates/setup_py.template | 23 + .../pyscaffold/templates/skeleton.template | 115 ++ .../templates/sphinx_authors.template | 2 + .../templates/sphinx_changelog.template | 2 + .../pyscaffold/templates/sphinx_conf.template | 272 +++++ .../templates/sphinx_index.template | 57 + .../templates/sphinx_license.template | 7 + .../templates/sphinx_makefile.template | 193 +++ .../templates/test_skeleton.template | 16 + .../pyscaffold/templates/tox_ini.template | 17 + .../pyscaffold/templates/travis.template | 39 + .../templates/travis_install.template | 61 + .../pyscaffold/termui.py | 107 ++ .../pyscaffold/update.py | 255 ++++ .../pyscaffold/utils.py | 443 +++++++ .../pyscaffold/warnings.py | 20 + .eggs/README.txt | 6 + aplicacion.sqlite | Bin 0 -> 24576 bytes src/__main__.py | 6 +- src/logica/coleccion.py | 8 +- src/vista/interfaz_coleccion.py | 10 +- tests/__pycache__/test_album.cpython-39.pyc | Bin 0 -> 3227 bytes tests/__pycache__/test_cancion.cpython-39.pyc | Bin 0 -> 5353 bytes .../test_interprete.cpython-39.pyc | Bin 0 -> 3243 bytes 117 files changed, 11761 insertions(+), 12 deletions(-) create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/AUTHORS.rst create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/LICENSE.txt create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/PKG-INFO create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/RECORD create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/WHEEL create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/entry_points.txt create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/requires.txt create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/top_level.txt create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__init__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/__init__.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/exceptions.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/integration.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/log.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/repo.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/shell.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/termui.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/utils.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/api/__init__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/api/helpers.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/cli.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__init__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__pycache__/__init__.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__pycache__/ptr.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/configupdater.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/ptr.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__init__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__main__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/__init__.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/config.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/discover.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/git.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/integration.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/utils.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/__pycache__/version.cpython-39.pyc create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/config.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/discover.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/file_finder.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/file_finder_git.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/file_finder_hg.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/git.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/hacks.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/hg.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/integration.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/utils.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/version.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/setuptools_scm/win_py31_compat.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/exceptions.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/__init__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/cookiecutter.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/django.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/gitlab_ci.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/namespace.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/no_skeleton.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/pre_commit.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/tox.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/extensions/travis.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/info.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/integration.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/log.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/repo.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/shell.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/structure.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/__init__.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/__init__.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/authors.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/changelog.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/conftest_py.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/coveragerc.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/gitignore.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/gitignore_empty.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/gitlab_ci.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/isort_cfg.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_affero_3.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_apache.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_artistic_2.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_cc0_1.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_eclipse_1.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_gpl_2.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_gpl_3.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_isc.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_lgpl_2.1.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_lgpl_3.0.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_mit.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_mozilla.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_new_bsd.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_none.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_public_domain.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/license_simplified_bsd.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/namespace.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/pre-commit-config.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/readme.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/requirements.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/setup_cfg.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/setup_py.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/skeleton.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/sphinx_authors.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/sphinx_changelog.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/sphinx_conf.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/sphinx_index.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/sphinx_license.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/sphinx_makefile.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/test_skeleton.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/tox_ini.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/travis.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/templates/travis_install.template create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/termui.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/update.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/utils.py create mode 100644 .eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/warnings.py create mode 100644 .eggs/README.txt create mode 100644 aplicacion.sqlite create mode 100644 tests/__pycache__/test_album.cpython-39.pyc create mode 100644 tests/__pycache__/test_cancion.cpython-39.pyc create mode 100644 tests/__pycache__/test_interprete.cpython-39.pyc diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/AUTHORS.rst b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/AUTHORS.rst new file mode 100644 index 00000000..784772f8 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/AUTHORS.rst @@ -0,0 +1,23 @@ +============ +Contributors +============ + +* Florian Wilhelm +* Felix Wick +* Holger Peters +* Uwe Korn +* Patrick Mühlbauer +* Florian Rathgeber +* Eva Schmücker +* Tim Werner +* Julian Gethmann +* Will Usher +* Anderson Bravalheri +* David Hilton +* Pablo Aguiar +* Vicky C Lau +* Reuven Podmazo +* Juan Leni +* Anthony Sottile +* Henning Häcker +* Noah Pendleton diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/LICENSE.txt b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/LICENSE.txt new file mode 100644 index 00000000..dd9fa415 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Blue Yonder GmbH + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/PKG-INFO b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/PKG-INFO new file mode 100644 index 00000000..92bd62a1 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/PKG-INFO @@ -0,0 +1,277 @@ +Metadata-Version: 2.1 +Name: PyScaffold +Version: 3.2.3 +Summary: Template tool for putting up the scaffold of a Python project +Home-page: https://github.com/pyscaffold/pyscaffold/ +Author: Florian Wilhelm +Author-email: Florian.Wilhelm@gmail.com +License: MIT +Project-URL: Documentation, https://pyscaffold.org/ +Project-URL: Twitter, https://twitter.com/PyScaffold +Project-URL: Conda-Forge, https://anaconda.org/conda-forge/pyscaffold +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Topic :: Utilities +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.4 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Environment :: Console +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: POSIX :: Linux +Classifier: Operating System :: Unix +Classifier: Operating System :: MacOS +Classifier: Operating System :: Microsoft :: Windows +Requires-Python: >=3.4 +Description-Content-Type: text/x-rst; charset=UTF-8 +Requires-Dist: setuptools (>=38.3) +Provides-Extra: all +Requires-Dist: django ; extra == 'all' +Requires-Dist: cookiecutter ; extra == 'all' +Requires-Dist: pyscaffoldext-markdown ; extra == 'all' +Requires-Dist: pyscaffoldext-pyproject ; extra == 'all' +Requires-Dist: pyscaffoldext-custom-extension ; extra == 'all' +Requires-Dist: pyscaffoldext-dsproject ; extra == 'all' +Provides-Extra: ds +Requires-Dist: pyscaffoldext-dsproject ; extra == 'ds' +Provides-Extra: md +Requires-Dist: pyscaffoldext-markdown ; extra == 'md' +Provides-Extra: testing +Requires-Dist: sphinx ; extra == 'testing' +Requires-Dist: flake8 ; extra == 'testing' +Requires-Dist: pytest ; extra == 'testing' +Requires-Dist: pytest-cov ; extra == 'testing' +Requires-Dist: pytest-shutil ; extra == 'testing' +Requires-Dist: pytest-virtualenv ; extra == 'testing' +Requires-Dist: pytest-fixture-config ; extra == 'testing' +Requires-Dist: pytest-xdist ; extra == 'testing' + +.. image:: https://api.cirrus-ci.com/github/pyscaffold/pyscaffold.svg?branch=master + :alt: Built Status + :target: https://cirrus-ci.com/github/pyscaffold/pyscaffold +.. image:: https://readthedocs.org/projects/pyscaffold/badge/?version=latest + :alt: ReadTheDocs + :target: https://pyscaffold.org/ +.. image:: https://img.shields.io/coveralls/github/pyscaffold/pyscaffold/master.svg + :alt: Coveralls + :target: https://coveralls.io/r/pyscaffold/pyscaffold +.. image:: https://img.shields.io/pypi/v/pyscaffold.svg + :alt: PyPI-Server + :target: https://pypi.org/project/pyscaffold/ +.. image:: https://img.shields.io/conda/vn/conda-forge/pyscaffold.svg + :alt: Conda-Forge + :target: https://anaconda.org/conda-forge/pyscaffold +.. image:: https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Follow + :alt: Twitter + :target: https://twitter.com/pyscaffold + + +| + +.. image:: https://pyscaffold.org/en/latest/_images/logo.png + :height: 512px + :width: 512px + :scale: 60 % + :alt: PyScaffold logo + :align: center + +| + +PyScaffold helps you setup a new Python project. Just install it with:: + + pip install pyscaffold + +or if you want to also install all *extensions* with:: + + pip install pyscaffold[all] + +If you prefer *conda* over *pip*, just install PyScaffold with:: + + conda install -c conda-forge pyscaffold + +This will give you a new ``putup`` command and you can just type:: + + putup my_project + +This will create a new folder called ``my_project`` containing a perfect *project +template* with everything you need for some serious coding. After the usual:: + + python setup.py develop + +you are all set and ready to go. + +Type ``putup -h`` to learn about more configuration options. PyScaffold assumes +that you have Git_ installed and set up on your PC, +meaning at least your name and email are configured. +The project template in ``my_project`` provides you with following features: + + +Configuration & Packaging +========================= + +All configuration can be done in ``setup.cfg`` like changing the description, +url, classifiers, installation requirements and so on as defined by setuptools_. +That means in most cases it is not necessary to tamper with ``setup.py``. + +In order to build a source, binary or wheel distribution, just run +``python setup.py sdist``, ``python setup.py bdist`` or +``python setup.py bdist_wheel`` (recommended). + +.. rubric:: Package and Files Data + +Additional data, e.g. images and text files, that reside within your package and +are tracked by Git will automatically be included +(``include_package_data = True`` in ``setup.cfg``). +It is not necessary to have a ``MANIFEST.in`` file for this to work. + +Versioning and Git Integration +============================== + +Your project is an already initialised Git repository and ``setup.py`` uses +the information of tags to infer the version of your project with the help of +setuptools_scm_. +To use this feature, you need to tag with the format ``MAJOR.MINOR[.PATCH]`` +, e.g. ``0.0.1`` or ``0.1``. +Run ``python setup.py --version`` to retrieve the current PEP440_-compliant +version. This version +will be used when building a package and is also accessible through +``my_project.__version__``. + +Unleash the power of Git by using its `pre-commit hooks`_. This feature is +available through the ``--pre-commit`` flag. After your project's scaffold +was generated, make sure pre-commit is installed, e.g. ``pip install pre-commit``, +then just run ``pre-commit install``. + +A default ``.gitignore`` file is also provided; it is +well adjusted for Python projects and the most common tools. + + +Sphinx Documentation +==================== + +Build the documentation with ``python setup.py docs`` and run doctests with +``python setup.py doctest`` after you have `Sphinx`_ installed. +Start editing the file ``docs/index.rst`` to extend the documentation. +The documentation also works with `Read the Docs`_. + +The `Numpy and Google style docstrings`_ are activated by default. +Just make sure Sphinx 1.3 or above is installed. + + +Unittest & Coverage +=================== + +Run ``python setup.py test`` to run all unittests defined in the subfolder +``tests`` with the help of `py.test`_ and pytest-runner_. Some sane +default flags for py.test are already defined in the ``[tool:pytest]`` section of +``setup.cfg``. The py.test plugin `pytest-cov`_ is used to automatically +generate a coverage report. It is also possible to provide additional +parameters and flags on the commandline, e.g., type:: + + python setup.py test --addopts -h + +to show the help of py.test. + +.. rubric:: JUnit and Coverage HTML/XML + +For usage with a continuous integration software JUnit and Coverage XML output +can be activated in ``setup.cfg``. Use the flag ``--travis`` to generate +templates of the `Travis`_ configuration files +``.travis.yml`` and ``tests/travis_install.sh`` which even features the +coverage and stats system `Coveralls`_. +In order to use the virtualenv management and test tool `Tox`_ the flag +``--tox`` can be specified. + + +Management of Requirements & Licenses +===================================== + +Installation requirements of your project can be defined inside ``setup.cfg``, +e.g. ``install_requires = numpy; scipy``. To avoid package dependency problems, +it is common to not pin installation requirements to any specific version, +although minimum versions, e.g. ``sphinx>=1.3``, or maximum versions, e.g. +``pandas<0.12``, are used sometimes. + +More specific installation requirements should go into ``requirements.txt``. +This file can also be managed with the help of ``pip compile`` from `pip-tools`_ +that basically pins packages to the current version, e.g. ``numpy==1.13.1``. +The packages defined in ``requirements.txt`` can be easily installed with:: + + pip install -r requirements.txt + +All licenses from `choosealicense.com`_ can be easily selected with the help +of the ``--license`` flag. + + +Extensions +========== + +PyScaffold comes with several extensions: + +* If you want a project setup for a *Data Science* task, just use ``--dsproject`` + after having installed `pyscaffoldext-dsproject`_. + +* Create a `Django project`_ with the flag ``--django`` which is equivalent to + ``django-admin.py startproject my_project`` enhanced by PyScaffold's features. + +* Create a template for your own PyScaffold extension with ``--custom-extension`` + after having installed `pyscaffoldext-custom-extension`_ with ``pip``. + +* Have a ``README.md`` based on MarkDown instead of ``README.rst`` by using + ``--markdown`` after having installed `pyscaffoldext-markdown`_ with ``pip``. + +* Add a ``pyproject.toml`` file according to `PEP 518`_ to your template by using + ``--pyproject`` after having installed `pyscaffoldext-pyproject`_ with ``pip``. + +* With the help of `Cookiecutter`_ it is possible to further customize your project + setup with a template tailored for PyScaffold. Just use the flag ``--cookiecutter TEMPLATE`` + to use a cookiecutter template which will be refined by PyScaffold afterwards. + +* ... and many more like ``--gitlab`` to create the necessary files for GitLab_. + +Find more extensions within the `PyScaffold organisation`_ and consider contributing your own. +All extensions can easily be installed with ``pip pyscaffoldext-NAME``. + +Easy Updating +============= + +Keep your project's scaffold up-to-date by applying +``putup --update my_project`` when a new version of PyScaffold was released. +An update will only overwrite files that are not often altered by users like +``setup.py``. To update all files use ``--update --force``. +An existing project that was not setup with PyScaffold can be converted with +``putup --force existing_project``. The force option is completely safe to use +since the git repository of the existing project is not touched! + + +.. _setuptools: http://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files +.. _setuptools_scm: https://pypi.python.org/pypi/setuptools_scm/ +.. _Git: http://git-scm.com/ +.. _PEP440: http://www.python.org/dev/peps/pep-0440/ +.. _pre-commit hooks: http://pre-commit.com/ +.. _py.test: http://pytest.org/ +.. _Sphinx: http://www.sphinx-doc.org/ +.. _Read the Docs: https://readthedocs.org/ +.. _Numpy and Google style docstrings: http://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html +.. _pytest-runner: https://pypi.python.org/pypi/pytest-runner +.. _pytest-cov: https://github.com/schlamar/pytest-cov +.. _Travis: https://travis-ci.org +.. _Coveralls: https://coveralls.io/ +.. _Tox: https://tox.readthedocs.org/ +.. _choosealicense.com: http://choosealicense.com/ +.. _Django project: https://www.djangoproject.com/ +.. _Cookiecutter: https://cookiecutter.readthedocs.org/ +.. _GitLab: https://about.gitlab.com/ +.. _pip-tools: https://github.com/jazzband/pip-tools/ +.. _pyscaffoldext-dsproject: https://github.com/pyscaffold/pyscaffoldext-dsproject +.. _pyscaffoldext-custom-extension: https://github.com/pyscaffold/pyscaffoldext-custom-extension +.. _pyscaffoldext-markdown: https://github.com/pyscaffold/pyscaffoldext-markdown +.. _pyscaffoldext-pyproject: https://github.com/pyscaffold/pyscaffoldext-pyproject +.. _PEP 518: https://www.python.org/dev/peps/pep-0518/ +.. _PyScaffold organisation: https://github.com/pyscaffold/ + + diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/RECORD b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/RECORD new file mode 100644 index 00000000..b6a56c48 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/RECORD @@ -0,0 +1,91 @@ +pyscaffold/__init__.py,sha256=1K2gdVGkEKzBMB4wgm8_XDp0TQfRTQqRwsDAE3BD5C0,205 +pyscaffold/cli.py,sha256=6Eoy4bn6vTlKJlHnZguydyBew9mpT5rbANRvEUJ9D_k,6867 +pyscaffold/exceptions.py,sha256=FRH1y0dotSVFQ-03Kr6J6Px_VUJMtklYj-Q4xEJEqJU,3212 +pyscaffold/info.py,sha256=Hbs19bM9nnq3GgfMcMyL9i3H0SZjkeJjjn30iHJwzk0,5886 +pyscaffold/integration.py,sha256=RyK1ULdNIdqLczsu4r1VToZm2pj74bYlxbPeUCKPNOo,3295 +pyscaffold/log.py,sha256=AUhFPND6CQB_EVQnr9fzY6fB-LVsSfcETNobZuCI6tM,10690 +pyscaffold/repo.py,sha256=GalmynRntxoh987twIwBECxqa9OqS_rifYXYKty506Q,3003 +pyscaffold/shell.py,sha256=U4pDyckFQFsEnGr3vSe2pgNy1RTMxbE2GdO654548XE,3554 +pyscaffold/structure.py,sha256=l4LYHb65AA8pXbpr-_GuSc_5AuU4l5JeKw82QbJLnW8,3936 +pyscaffold/termui.py,sha256=LvpNeU20c2lJ5FhjynRTg2zh9GLE9J-Jf2euzd-7Pz4,2262 +pyscaffold/update.py,sha256=LlWxdHmfqDvCbl5DQGgVKQvuGMiwj7ZIB90Y2IRwiNM,7567 +pyscaffold/utils.py,sha256=EASRtB6jPo1vWF80xgDz1qTKHQU86-uuNacB1yGWme0,14167 +pyscaffold/warnings.py,sha256=m3RkML631kQmFTx75LitwXwS_NJkrxU8VsjpfQ3R79c,739 +pyscaffold/api/__init__.py,sha256=shhdFTFcScVY0lUpvjQ8eEHQHOEWXCga-osiFjPfBi4,11516 +pyscaffold/api/helpers.py,sha256=aVww2ckouKZ-HORmGdFrO1yEIZjjz5ZmtU7h6lxJ1AQ,12874 +pyscaffold/contrib/__init__.py,sha256=mUWwzNdmGgB3cySAKxXd0dqtRp0t9sbQVLT3EpsX37M,1735 +pyscaffold/contrib/configupdater.py,sha256=zgCzxqdDIGWQY4gMzFyUMbzdAuI6GBD5KYeDa02kwr8,37133 +pyscaffold/contrib/ptr.py,sha256=6BlnIXLmJ7aVbpXERfPcRO3N3Mn7mXP1jtbeC5GvK8E,6867 +pyscaffold/contrib/setuptools_scm/__init__.py,sha256=9WuARIaYh9jvNy6SyHoHbF6bbdpODVF5y3xQO28y6cU,5023 +pyscaffold/contrib/setuptools_scm/__main__.py,sha256=r2weno4bqNJ3pFJCrArU2ryJOKNWZ_pg1Fz6wiEe6t0,423 +pyscaffold/contrib/setuptools_scm/config.py,sha256=T1FE7At-qVydGmbTYfjFyxGrowv_apvEeVAB-IuLsqQ,2890 +pyscaffold/contrib/setuptools_scm/discover.py,sha256=LqX0raq94k3llpxXmjNnDbkqECIGqEm1UcU3g2Rn2NI,416 +pyscaffold/contrib/setuptools_scm/file_finder.py,sha256=bH3QaU4NdinhjFP_pWl2DIdjAEUsjgZ46A_dpjAS5pc,2234 +pyscaffold/contrib/setuptools_scm/file_finder_git.py,sha256=FafbO3HqVDPBvJNvRqRvluiyQMiej4MAkSWe1EHB-i8,1879 +pyscaffold/contrib/setuptools_scm/file_finder_hg.py,sha256=FOX60VjepspOV4eL234lRUADsC7L2BRvniYl4_rR4Ng,1415 +pyscaffold/contrib/setuptools_scm/git.py,sha256=YaAZIL45ItXO4Gp7sj7MsxNGCeBnrQD3wVcQAjjH9lY,4064 +pyscaffold/contrib/setuptools_scm/hacks.py,sha256=uTMI3IxvOen631QOZmVQonGqDjstBpx5aYpR6Z2KeHA,839 +pyscaffold/contrib/setuptools_scm/hg.py,sha256=vYsqCe5jb-Ry-ldypn2gBjFrKTFTEQjAkpz6uFEzdDc,3371 +pyscaffold/contrib/setuptools_scm/integration.py,sha256=wcKh3Sb7_wobpCuCzgt-WXAkCKMBi9Xtopg3ggnOstU,769 +pyscaffold/contrib/setuptools_scm/utils.py,sha256=Wc0xlgqgYQDj3-oQSmpPvihqeyFcgWUYSOK8eUdwdqU,2707 +pyscaffold/contrib/setuptools_scm/version.py,sha256=-vSwpaelXN-Za_00wIycwy-irf42VtcQFPrMnPeSAk8,8400 +pyscaffold/contrib/setuptools_scm/win_py31_compat.py,sha256=w-TAp2Z21O_shi3gPvlcbxz1JZ8cGOLFd9HguCTYB6E,5098 +pyscaffold/extensions/__init__.py,sha256=Hl7FGT5dc6skMFuqPtDhQ8DGJXgqjLa-Hd0FbF-XE0M,68 +pyscaffold/extensions/cookiecutter.py,sha256=4bU3wfv7yGedH2QSdWBuM7FSH9JcyV7qfZfCrJd0lcM,5549 +pyscaffold/extensions/django.py,sha256=3GkgusNs4zux8FgZsnIZn9FXkxjxc8k27ZqW2mVHUi4,3478 +pyscaffold/extensions/gitlab_ci.py,sha256=GQMSohlSt5LeU-ANqebaaWX6VD_CN6wC_SeUIw5fDCw,1152 +pyscaffold/extensions/namespace.py,sha256=JR6P18UgWesgTi37wDYvxiPzcC_1egAiX8FW8gkTOIY,5101 +pyscaffold/extensions/no_skeleton.py,sha256=HYCnFNVQNGnLNtqiuyGRKlOmj8V_rOpVR1kffr8C1xM,1330 +pyscaffold/extensions/pre_commit.py,sha256=RotOdnfbD50n4ky7_x0Il7RfDzuGVpG3ApgvaD1b_TU,2428 +pyscaffold/extensions/tox.py,sha256=fgS7HfdhI40w4kgLCrqtDuWgrz7sUxajW7rXIVHCl3Y,1136 +pyscaffold/extensions/travis.py,sha256=37R6Vrv9-ERETzAZRQIkQrYD8suFqItLHfGmoOuTX3I,1311 +pyscaffold/templates/__init__.py,sha256=OnUeWFkpvQEQXQBg4kTE5BI4y58VjfkmI9Fr5ZFYOgc,10030 +pyscaffold/templates/__init__.template,sha256=iNd_73ecYzkk6BtkeGVU51L-n0CcK2iZYnRhFtpy3MU,370 +pyscaffold/templates/authors.template,sha256=kZhIVRI8z1iqP4fmWGTRPgdR1N3juaPav3zl0WVBsrc,63 +pyscaffold/templates/changelog.template,sha256=L345FrkHS-vk5Wz9QRhn1ozRwg82M3k8JtH5khqn7Zc,128 +pyscaffold/templates/conftest_py.template,sha256=DBPUkRyukwad5JyUdKuwBGT_0dWT1e0BICsjIfEOjxk,231 +pyscaffold/templates/coveragerc.template,sha256=FRWbDOC39biCsdqybJzUc0M8_k_Yp7KnXBAPDdA6QGU,593 +pyscaffold/templates/gitignore.template,sha256=x1_efLYSuWt_kBeuDTrJtN6MJNOsYQ8K8UK1jeSQVqw,520 +pyscaffold/templates/gitignore_empty.template,sha256=W8R-6gcyzaCaj6XGYoyQPYDErVDyYsYY3cB2K_gngcE,18 +pyscaffold/templates/gitlab_ci.template,sha256=awGv6bBPBj7I-X_ixtNc75i5vdPCp-2nq_H7_B1SKgU,1819 +pyscaffold/templates/isort_cfg.template,sha256=Je7a0tdEEsVT_VJJyK8rVRjRN6a5HoMMlGi06YK8kE0,279 +pyscaffold/templates/license_affero_3.0.template,sha256=-5zott_E9lzLVytUzEt7C8LMEYn2L9E1fuOwRLLHf9g,32386 +pyscaffold/templates/license_apache.template,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357 +pyscaffold/templates/license_artistic_2.0.template,sha256=vbuMkuP1JQoc2uwVeOvwzrP0Dn5mp667l0jxkXidYnE,8917 +pyscaffold/templates/license_cc0_1.0.template,sha256=Nv_Z3AhdUpp-YOEnbXOuWgMLAgMT5sVAhZOmrirzlnM,6555 +pyscaffold/templates/license_eclipse_1.0.template,sha256=IuD_PpRjd6Zc7eQjALiUqyKEiBlLFHRBK7MFpoMntPA,11514 +pyscaffold/templates/license_gpl_2.0.template,sha256=ep2MnyVJhVVmwNOTHFjPcmMmKt073qeUI-5aQJr2iR4,15238 +pyscaffold/templates/license_gpl_3.0.template,sha256=xh8S2nza1Sa9y-1HpMCmA-YNu_2vi2aTPNCI6RMsMD8,32472 +pyscaffold/templates/license_isc.template,sha256=smGfo69BolAspbc26dJJI3lDM25zEiZbULOZMBNoOlQ,743 +pyscaffold/templates/license_lgpl_2.1.template,sha256=Izf7sczKycbMcwNEJ2DYO7s65dROESN82pX4PxrXAM4,24478 +pyscaffold/templates/license_lgpl_3.0.template,sha256=2n6rt7r999OuXp8iOqW9we7ORaxWncIbOwN1ILRGR2g,7651 +pyscaffold/templates/license_mit.template,sha256=oGVn-cTPf40_sPzor2eAHMaaIy2BdRQF-he319JJ84s,1079 +pyscaffold/templates/license_mozilla.template,sha256=rxdbnZbuk8IaA2FS4bkFsLlTBNSujCySHHYJEAuo334,15921 +pyscaffold/templates/license_new_bsd.template,sha256=wVmvXwNyrxtjBhh3DHYOPx0wUuustKwrrwlR0gp5a4I,1480 +pyscaffold/templates/license_none.template,sha256=mgaX6c85gu-V-bt0nfhmLH-OhwQcAMnRYIGRRuUCFOE,28 +pyscaffold/templates/license_public_domain.template,sha256=iNm062BXnBkew5HKBMFhMFctfu3EqG2qWL8oxuFMm80,1210 +pyscaffold/templates/license_simplified_bsd.template,sha256=_Aqllv965q30M3DMSC41_uF0NImmeIa64P1NULpHTAs,1295 +pyscaffold/templates/namespace.template,sha256=vXgXMgYCDkxR9ifnsCGWSHLloiNxhHjy0mpN2L-EspA,80 +pyscaffold/templates/pre-commit-config.template,sha256=jtLGrClWyMpNiM4KLDv7KZCWuQ515cBOYVzI52Gx2m0,563 +pyscaffold/templates/readme.template,sha256=4dkvbiPrbgZY_hVJNTZ9PY8AoT2uRAJMiorH2IBz-7Y,251 +pyscaffold/templates/requirements.template,sha256=CoRaPsO1_HgRnKK5n_DQfnMC4jRX-VaCo-VRPmFktcs,660 +pyscaffold/templates/setup_cfg.template,sha256=YFEpAARQtBd-BD9BFDycxJV9Og7ji_6eXu3iEFdDOFw,2726 +pyscaffold/templates/setup_py.template,sha256=0DAdn8pPoOC-vChymBA2LW4Qkm1BMCkzeglzhW0o2sk,579 +pyscaffold/templates/skeleton.template,sha256=UYr_nl595FZkYTV_f4Lf9k5tJxc9HpYi67EFktGCkUM,2803 +pyscaffold/templates/sphinx_authors.template,sha256=souXZONouU5QfKsH3_QZZH9jmZtKp6Qsjx1XV2DQcTY,41 +pyscaffold/templates/sphinx_changelog.template,sha256=75VknA-hfA5D5s-6qNok9jhKBvdhs84_akjtdqR3-7Q,43 +pyscaffold/templates/sphinx_conf.template,sha256=UqVpYr9ofJvGFNTkvwXmvFnvx2pYAzin3vu25vNO7WM,9179 +pyscaffold/templates/sphinx_index.template,sha256=takzscme4NFRYa2L10GeLGZxkZlHIeSHp0rZKJOg4CQ,2209 +pyscaffold/templates/sphinx_license.template,sha256=2gAe5dsf5f8Ru32MGYsPnAEoKFu03IXgyV7Ojj8y9m0,67 +pyscaffold/templates/sphinx_makefile.template,sha256=jZ_YMXxzszNicHdu-vlrHtkeD1OOQ0fGs7mn-X7N2Vw,7618 +pyscaffold/templates/test_skeleton.template,sha256=8e6kzKL_srJPAo7obSSu8Wxe8wZn789YA2OCPW7swio,302 +pyscaffold/templates/tox_ini.template,sha256=w0AqeopdYLmJrI5YgzpDkR8R9zDkWEQaG2X5d0-2RWc,318 +pyscaffold/templates/travis.template,sha256=BC925g7dqztW0QZLedlL3WIKZCtkPpUwMKS02BrRaWc,1160 +pyscaffold/templates/travis_install.template,sha256=h833Dh082QCQdx2SA2haR7l5xbz-oDys36KTnUOXNno,2115 +PyScaffold-3.2.3.dist-info/AUTHORS.rst,sha256=sAMnD7f2_84F6TTSqUhX5dqYaAbZpbjXJYzMYhXh8Dw,348 +PyScaffold-3.2.3.dist-info/LICENSE.txt,sha256=xKMzeaNltWYizeeiJyyTUYWGWC7ZYve3q3HGRBLACSg,1083 +PyScaffold-3.2.3.dist-info/METADATA,sha256=XztMtlnJfk1l2TgJ3xM4uWXqXWlfX5FLUgxzjY4QZ6I,11438 +PyScaffold-3.2.3.dist-info/WHEEL,sha256=S8S5VL-stOTSZDYxHyf0KP7eds0J72qrK0Evu3TfyAY,92 +PyScaffold-3.2.3.dist-info/entry_points.txt,sha256=w_3zDGcul01fy4-McBA3WciUgz_EdmmjYx2HR1BBQhg,1753 +PyScaffold-3.2.3.dist-info/top_level.txt,sha256=Japu2f8SrMt7bpkTRiszWK5AhbDeFiNnbB--oEYOU6k,11 +PyScaffold-3.2.3.dist-info/RECORD,, diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/WHEEL b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/WHEEL new file mode 100644 index 00000000..c57a5970 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.33.4) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/entry_points.txt b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/entry_points.txt new file mode 100644 index 00000000..255987a1 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/entry_points.txt @@ -0,0 +1,42 @@ +[console_scripts] +putup = pyscaffold.cli:run + +[distutils.setup_keywords] +use_pyscaffold = pyscaffold.integration:pyscaffold_keyword + +[pyscaffold.cli] +cookiecutter = pyscaffold.extensions.cookiecutter:Cookiecutter +django = pyscaffold.extensions.django:Django +gitlab = pyscaffold.extensions.gitlab_ci:GitLab +namespace = pyscaffold.extensions.namespace:Namespace +no_skeleton = pyscaffold.extensions.no_skeleton:NoSkeleton +pre_commit = pyscaffold.extensions.pre_commit:PreCommit +tox = pyscaffold.extensions.tox:Tox +travis = pyscaffold.extensions.travis:Travis + +[setuptools.file_finders] +setuptools_scm = pyscaffold.contrib.setuptools_scm.integration:find_files + +[setuptools_scm.files_command] +.git = pyscaffold.contrib.setuptools_scm.file_finder_git:git_find_files +.hg = pyscaffold.contrib.setuptools_scm.file_finder_hg:hg_find_files + +[setuptools_scm.local_scheme] +dirty-tag = pyscaffold.contrib.setuptools_scm.version:get_local_dirty_tag +node-and-date = pyscaffold.contrib.setuptools_scm.version:get_local_node_and_date +node-and-timestamp = pyscaffold.contrib.setuptools_scm.version:get_local_node_and_timestamp + +[setuptools_scm.parse_scm] +.git = pyscaffold.contrib.setuptools_scm.git:parse +.hg = pyscaffold.contrib.setuptools_scm.hg:parse + +[setuptools_scm.parse_scm_fallback] +.hg_archival.txt = pyscaffold.contrib.setuptools_scm.hg:parse_archival +PKG-INFO = pyscaffold.contrib.setuptools_scm.hacks:parse_pkginfo +pip-egg-info = pyscaffold.contrib.setuptools_scm.hacks:parse_pip_egg_info + +[setuptools_scm.version_scheme] +guess-next-dev = pyscaffold.contrib.setuptools_scm.version:guess_next_dev_version +post-release = pyscaffold.contrib.setuptools_scm.version:postrelease_version +python-simplified-semver = setuptools_scm.version:simplified_semver_version + diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/requires.txt b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/requires.txt new file mode 100644 index 00000000..d0889d0b --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/requires.txt @@ -0,0 +1,25 @@ +setuptools>=38.3 + +[all] +cookiecutter +django +pyscaffoldext-custom-extension +pyscaffoldext-dsproject +pyscaffoldext-markdown +pyscaffoldext-pyproject + +[ds] +pyscaffoldext-dsproject + +[md] +pyscaffoldext-markdown + +[testing] +flake8 +pytest +pytest-cov +pytest-fixture-config +pytest-shutil +pytest-virtualenv +pytest-xdist +sphinx diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/top_level.txt b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/top_level.txt new file mode 100644 index 00000000..559345ff --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/EGG-INFO/top_level.txt @@ -0,0 +1 @@ +pyscaffold diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__init__.py b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__init__.py new file mode 100644 index 00000000..eb39031b --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +from pkg_resources import get_distribution, DistributionNotFound + +try: + __version__ = get_distribution(__name__).version +except DistributionNotFound: + __version__ = 'unknown' diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/__init__.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3244047ff65fb40b843b757e71bdeeb857eccb9 GIT binary patch literal 415 zcmYjNJx{|h5Vf6_mXB5)5OdZ_G(s&46+#S%u?qttvShijYuq|^WIILa%Aepb@MHJ` znUI(mS(&gUhTiF({q)Z7^ zL!P|CbtmsW0)5s295t5^#AGP%J^_s`081Xgxbq#}gE4AHf_uWG^HwfvFO6(dI=j#s}@7+6ZE~Gqo+avnV*(BtY9IMAMQJ()PC8y6ARH$p4j)cVG`= zZ-n2sVvcJUy71ajT|Dz07RCt0Q)cCs<0?o-Q-w?E44!6bWohAML0!tYN~w@ay3$}F zJ@&OXR#H_2qcD^^Pldx77Xhor6?C;SicMzOG@DJTW|mz=ZBN34NG&}fS=F@t>(a1V R@tgQD7dJja2oB*1`~#Ned_MpH literal 0 HcmV?d00001 diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/exceptions.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/exceptions.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed12d1243b16421dcfd60fa654c01d4ba037b520 GIT binary patch literal 4676 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 literal 0 HcmV?d00001 diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/log.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/log.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3706924ddfa50fb519ced2066d739bd8ec0321ef GIT binary patch literal 10847 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 z�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 O_@mll?K`zO-~Astv%Wq6 literal 0 HcmV?d00001 diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/termui.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/termui.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c7755a6eadeea483d0d883510c6fcee57791d62 GIT binary patch literal 2698 zcmbtW&2JM&6rWkIKVp)UZwjF>&@W8EAW$V5MNw%8RU{fvoV3Nba>hFoXT$D}J2NKO zbxz^hYtPA%TmPCK_SC8;E|sd@dg^<#b_gj*MO|lJc4pqZH}C!4$MT7ZGJ)sMU$3-& zDG~BJPWC^?Ve&Z)^Aw06bt0(nB3h>+SNCKNX1>Uaf+&iT7!zf2NQ{dKF)7{=hs6#fcw})_uXmNpb2Kt>?wN;`B38FNiZ@3jP;mahr5jWnr7tOX7k!E8YXHF>y|u zhuyO9YNT?pUnzgVO&BoK?R1p3Y)xr)d$G2_0wpBQVs34iw5#P8a8a_@FHSxBVOng( zFDOi3oI`RR2}5!L$wegZBl!Tyhe$3VsUW$G=Z4$|NoHWE81QV2HXhEylbp6U*y<(BnxxzquY-Sud%i=}y)Q@CJw7 ziaTE)gOyA~z3AAwvR;Olksw@jvQUT<7oer12j6or=3p2GWI#G4OE%~hvEBes-1hX@ z0olpzk{WS7&h>x3BdrW93)h%km#iH=kqI+aOCDb{R;Vs)8P?(8eznGU!otK#%>xUJ z4Bp}};Ze0*X7JqBZ8PoOaFz*~W~yUD1x!)TX~>qDRV-MS!Q<@YlC)i&>^t02Dw<|m znr`G2XS^sjErbSO@7=BVY0mUaTF9=M7S}m$Xnh7Oe@<~7t$0o}y5jGjg6T%rNNpM$ zh9@Ae-)Jku-iqW9&9}fr#4Z8PIQNWr5e_!a0l)tIPn_6KHge{$rHJwMRi#n<}bw>gZw zQOE~fZ6t*R9jR%V^A`vhPk+@A&*;1(9v@c%q@-XeeR9DT7 z6j%b*c_P4ShrKK0&M|Khd6g_x(i63ZwdMJ*nzfY&5AH85*P3(p@7-V0*a8k(J2`A8 zCJVVGU@>S1DQIj0uh@v|c^F^9FgJhT3f3woO8$<289_! zKvSD>3$v@MZ;E-iGCBeb6;AQ+D*$FgCpyLH>tQqqBPPOte0LTBv*ZcUo`Vd4M998| zviZFy5IDLB^{h}^et2)bmKNq~bGIMNr-e*m#Y?^F^^}@}(KR*$JzqZU=-Ca>^A`-# zpAs^FVryk}CQ<=-XSTY>rH=szv@(A~g^9+`4vn838oxq7Ne3@~SbzHI`DB2TsO5l?*pr ny)MnfN^~PRi`ijr0rCBk=Tq;${QfAMEFURNmJW~m<*|PNMdrL5 literal 0 HcmV?d00001 diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/utils.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/__pycache__/utils.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a46594a5a28931192afdb3fe0bf2e961627f1a2f GIT binary patch literal 11481 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. Note that some PyScaffold features, such + as travis, tox and pre-commit support, are implemented as built-in + extensions. In order to use these features it is necessary to include the + respective functions in the extension list. All built-in extensions are + accessible via :mod:`pyscaffold.extensions` submodule. + + Note that extensions may define extra options. For example, built-in + cookiecutter extension define a ``cookiecutter`` option that + should be the address to the git repository used as template. + """ + opts = opts if opts else {} + opts.update(kwargs) + + actions = discover_actions(opts.get('extensions', [])) + + # call the actions to generate final struct and opts + struct = {} + struct, opts = reduce(lambda acc, f: invoke_action(f, *acc), + actions, (struct, opts)) + return struct, opts + + +# -------- Auxiliary functions -------- + +def _activate(extension, actions): + """Activate extension with proper logging.""" + logger.report('activate', extension.__module__) + with logger.indent(): + actions = extension(actions) + + return actions diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/api/helpers.py b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/api/helpers.py new file mode 100644 index 00000000..175a5f95 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/api/helpers.py @@ -0,0 +1,373 @@ +# -*- coding: utf-8 -*- +""" +Useful functions for manipulating the action list and project structure. +""" + +from copy import deepcopy +from pathlib import PurePath + +from ..exceptions import ActionNotFound +from ..log import logger +from ..structure import FileOp, define_structure +from ..utils import get_id + +logger = logger # Sphinx workaround to force documenting imported members +"""Logger wrapper, that provides methods like :obj:`~.ReportLogger.report`. +See :class:`~.ReportLogger`. +""" + +NO_OVERWRITE = FileOp.NO_OVERWRITE +"""Do not overwrite an existing file during update +(still created if not exists) +""" + +NO_CREATE = FileOp.NO_CREATE +"""Do not create the file during an update""" + + +# -------- Project Structure -------- + +def _id_func(x): + """Identity function""" + return x + + +def modify(struct, path, modifier=_id_func, update_rule=None): + """Modify the contents of a file in the representation of the project tree. + + If the given path, does not exist the parent directories are automatically + created. + + Args: + struct (dict): project representation as (possibly) nested + :obj:`dict`. See :obj:`~.merge`. + + path (os.PathLike): path-like string or object relative to the + structure root. The following examples are equivalent:: + + from pathlib import PurePath + + 'docs/api/index.html' + PurePath('docs', 'api', 'index.html') + + *Deprecated* - Alternatively, a list with the parts of the path can + be provided, ordered from the structure root to the file itself. + + modifier (callable): function (or callable object) that receives the + old content as argument and returns the new content. + If no modifier is passed, the identity function will be used. + Note that, if the file does not exist in ``struct``, ``None`` will + be passed as argument. Example:: + + modifier = lambda old: (old or '') + 'APPENDED CONTENT'! + modifier = lambda old: 'PREPENDED CONTENT!' + (old or '') + + update_rule: see :class:`~.FileOp`, ``None`` by default. + Note that, if no ``update_rule`` is passed, the previous one is + kept. + + Returns: + dict: updated project tree representation + + Note: + Use an empty string as content to ensure a file is created empty + (``None`` contents will not be created). + + Warning: + *Deprecation Notice* - In the next major release, the usage of lists + for the ``path`` argument will result in an error. Please use + :obj:`pathlib.PurePath` instead. + """ + # Retrieve a list of parts from a path-like object + if isinstance(path, (list, tuple)): + path_parts = path + else: + # TODO: Remove conditional for v4 (always do the following) + path_parts = PurePath(path).parts + + # Walk the entire path, creating parents if necessary. + root = deepcopy(struct) + last_parent = root + name = path_parts[-1] + for parent in path_parts[:-1]: + last_parent = last_parent.setdefault(parent, {}) + + # Get the old value if existent. + old_value = last_parent.get(name, (None, None)) + if not isinstance(old_value, (list, tuple)): + old_value = (old_value, None) + + # Update the value. + new_value = (modifier(old_value[0]), update_rule) + last_parent[name] = _merge_file_leaf(old_value, new_value) + + return root + + +def ensure(struct, path, content=None, update_rule=None): + """Ensure a file exists in the representation of the project tree + with the provided content. + All the parent directories are automatically created. + + Args: + struct (dict): project representation as (possibly) nested + :obj:`dict`. See :obj:`~.merge`. + + path (os.PathLike): path-like string or object relative to the + structure root. The following examples are equivalent:: + + from pathlib import PurePath + + 'docs/api/index.html' + PurePath('docs', 'api', 'index.html') + + *Deprecated* - Alternatively, a list with the parts of the path can + be provided, ordered from the structure root to the file itself. + + content (str): file text contents, ``None`` by default. + The old content is preserved if ``None``. + + update_rule: see :class:`~.FileOp`, ``None`` by default + + Returns: + dict: updated project tree representation + + Note: + Use an empty string as content to ensure a file is created empty. + + Warning: + *Deprecation Notice* - In the next major release, the usage of lists + for the ``path`` argument will result in an error. Please use + :obj:`pathlib.PurePath` instead. + """ + modifier = _id_func if content is None else (lambda _: content) + return modify(struct, path, modifier, update_rule) + + +def reject(struct, path): + """Remove a file from the project tree representation if existent. + + Args: + struct (dict): project representation as (possibly) nested + :obj:`dict`. See :obj:`~.merge`. + + path (os.PathLike): path-like string or object relative to the + structure root. The following examples are equivalent:: + + from pathlib import PurePath + + 'docs/api/index.html' + PurePath('docs', 'api', 'index.html') + + *Deprecated* - Alternatively, a list with the parts of the path can + be provided, ordered from the structure root to the file itself. + + Returns: + dict: modified project tree representation + + Warning: + *Deprecation Notice* - In the next major release, the usage of lists + for the ``path`` argument will result in an error. Please use + :obj:`pathlib.PurePath` instead. + """ + # Retrieve a list of parts from a path-like object + if isinstance(path, (list, tuple)): + path_parts = path + else: + # TODO: Remove conditional for v4 (always do the following) + path_parts = PurePath(path).parts + + # Walk the entire path, creating parents if necessary. + root = deepcopy(struct) + last_parent = root + name = path_parts[-1] + for parent in path_parts[:-1]: + if parent not in last_parent: + return root # one ancestor already does not exist, do nothing + last_parent = last_parent[parent] + + if name in last_parent: + del last_parent[name] + + return root + + +def merge(old, new): + """Merge two dict representations for the directory structure. + + Basically a deep dictionary merge, except from the leaf update method. + + Args: + old (dict): directory descriptor that takes low precedence + during the merge + new (dict): directory descriptor that takes high precedence + during the merge + + The directory tree is represented as a (possibly nested) dictionary. + The keys indicate the path where a file will be generated, while the + value indicates the content. Additionally, tuple values are allowed in + order to specify the rule that will be followed during an ``update`` + operation (see :class:`~.FileOp`). In this case, the first element is + the file content and the second element is the update rule. For + example, the dictionary:: + + {'project': { + 'namespace': { + 'module.py': ('print("Hello World!")', + helpers.NO_OVERWRITE)}} + + represents a ``project/namespace/module.py`` file with content + ``print("Hello World!")``, that will be created only if not + present. + + Returns: + dict: resulting merged directory representation + + Note: + Use an empty string as content to ensure a file is created empty. + (``None`` contents will not be created). + """ + return _inplace_merge(deepcopy(old), new) + + +def _inplace_merge(old, new): + """Similar to :obj:`~.merge` but modifies the first dict.""" + + for key, value in new.items(): + old_value = old.get(key, None) + new_is_dict = isinstance(value, dict) + old_is_dict = isinstance(old_value, dict) + if new_is_dict and old_is_dict: + old[key] = _inplace_merge(old_value, value) + elif old_value is not None and not new_is_dict and not old_is_dict: + # both are defined and final leaves + old[key] = _merge_file_leaf(old_value, value) + else: + old[key] = deepcopy(value) + + return old + + +def _merge_file_leaf(old_value, new_value): + """Merge leaf values for the directory tree representation. + + The leaf value is expected to be a tuple ``(content, update_rule)``. + When a string is passed, it is assumed to be the content and + ``None`` is used for the update rule. + + Args: + old_value (tuple or str): descriptor for the file that takes low + precedence during the merge + new_value (tuple or str): descriptor for the file that takes high + precedence during the merge + + Note: + ``None`` contents are ignored, use and empty string to force empty + contents. + + Returns: + tuple or str: resulting value for the merged leaf + """ + if not isinstance(old_value, (list, tuple)): + old_value = (old_value, None) + if not isinstance(new_value, (list, tuple)): + new_value = (new_value, None) + + content = new_value[0] if new_value[0] is not None else old_value[0] + rule = new_value[1] if new_value[1] is not None else old_value[1] + + if rule is None: + return content + + return (content, rule) + + +# -------- Action List -------- + +def register(actions, action, before=None, after=None): + """Register a new action to be performed during scaffold. + + Args: + actions (list): previous action list. + action (callable): function with two arguments: the first one is a + (nested) dict representing the file structure of the project + and the second is a dict with scaffold options. + This function **MUST** return a tuple with two elements similar + to its arguments. Example:: + + def do_nothing(struct, opts): + return (struct, opts) + + **kwargs (dict): keyword arguments make it possible to choose a + specific order when executing actions: when ``before`` or + ``after`` keywords are provided, the argument value is used as + a reference position for the new action. Example:: + + helpers.register(actions, do_nothing, + after='create_structure') + # Look for the first action with a name + # `create_structure` and inserts `do_nothing` after it. + # If more than one registered action is named + # `create_structure`, the first one is selected. + + helpers.register( + actions, do_nothing, + before='pyscaffold.structure:create_structure') + # Similar to the previous example, but the probability + # of name conflict is decreased by including the module + # name. + + When no keyword argument is provided, the default execution + order specifies that the action will be performed after the + project structure is defined, but before it is written to the + disk. Example:: + + + helpers.register(actions, do_nothing) + # The action will take place after + # `pyscaffold.structure:define_structure` + + Returns: + list: modified action list. + """ + reference = before or after or get_id(define_structure) + position = _find(actions, reference) + if not before: + position += 1 + + clone = actions[:] + clone.insert(position, action) + + return clone + + +def unregister(actions, reference): + """Prevent a specific action to be executed during scaffold. + + Args: + actions (list): previous action list. + reference (str): action identifier. Similarly to the keyword + arguments of :obj:`~.register` it can assume two formats: + + - the name of the function alone, + - the name of the module followed by ``:`` and the name + of the function + + Returns: + list: modified action list. + """ + position = _find(actions, reference) + return actions[:position] + actions[position+1:] + + +def _find(actions, name): + """Find index of name in actions""" + if ':' in name: + names = [get_id(action) for action in actions] + else: + names = [action.__name__ for action in actions] + + try: + return names.index(name) + except ValueError: + raise ActionNotFound(name) diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/cli.py b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/cli.py new file mode 100644 index 00000000..5623c506 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/cli.py @@ -0,0 +1,236 @@ +# -*- coding: utf-8 -*- +""" +Command-Line-Interface of PyScaffold +""" + +import argparse +import logging +import os.path +import sys + +from pkg_resources import parse_version + +from . import __version__ as pyscaffold_version +from . import api, info, shell, templates, utils +from .exceptions import NoPyScaffoldProject +from .log import ReportFormatter, configure_logger +from .utils import get_id + + +def add_default_args(parser): + """Add the default options and arguments to the CLI parser. + + Args: + parser (argparse.ArgumentParser): CLI parser object + """ + + parser.add_argument( + dest="project", + help="project name", + metavar="PROJECT") + parser.add_argument( + "-p", + "--package", + dest="package", + required=False, + help="package name (default: project name)", + metavar="NAME") + parser.add_argument( + "-d", + "--description", + dest="description", + required=False, + help="package description", + metavar="TEXT") + license_choices = templates.licenses.keys() + parser.add_argument( + "-l", + "--license", + dest="license", + choices=license_choices, + required=False, + default="mit", + help="package license like {choices} (default: {default})".format( + choices=', '.join(license_choices), default="mit"), + metavar="LICENSE") + parser.add_argument( + "-u", + "--url", + dest="url", + required=False, + help="package url", + metavar="URL") + parser.add_argument( + "-f", + "--force", + dest="force", + action="store_true", + default=False, + help="force overwriting an existing directory") + parser.add_argument( + "-U", + "--update", + dest="update", + action="store_true", + default=False, + help="update an existing project by replacing the most important files" + " like setup.py etc. Use additionally --force to " + "replace all scaffold files.") + parser.add_argument( + '-V', + '--version', + action='version', + version='PyScaffold {ver}'.format(ver=pyscaffold_version)) + parser.add_argument( + "-v", + "--verbose", + action="store_const", + const=logging.INFO, + dest="log_level", + help="show additional information about current actions") + parser.add_argument( + "-vv", + "--very-verbose", + action="store_const", + const=logging.DEBUG, + dest="log_level", + help="show all available information about current actions") + + group = parser.add_mutually_exclusive_group() + group.add_argument( + "-P", + "--pretend", + dest="pretend", + action="store_true", + default=False, + help="do not create project, but displays the log of all operations" + " as if it had been created.") + group.add_argument( + "--list-actions", + dest="command", + action="store_const", + const=list_actions, + help="do not create project, but show a list of planned actions") + + +def parse_args(args): + """Parse command line parameters respecting extensions + + Args: + args ([str]): command line parameters as list of strings + + Returns: + dict: command line parameters + """ + from pkg_resources import iter_entry_points + + # create the argument parser + parser = argparse.ArgumentParser( + description="PyScaffold is a tool for easily putting up the scaffold " + "of a Python project.") + parser.set_defaults(log_level=logging.WARNING, + extensions=[], + command=run_scaffold) + add_default_args(parser) + # load and instantiate extensions + cli_extensions = [extension.load()(extension.name) for extension + in iter_entry_points('pyscaffold.cli')] + # add a group for mutually exclusive external generators + mutex_group = parser.add_mutually_exclusive_group() + for extension in cli_extensions: + if extension.mutually_exclusive: + extension.augment_cli(mutex_group) + else: + extension.augment_cli(parser) + + # Parse options and transform argparse Namespace object into common dict + opts = vars(parser.parse_args(args)) + return opts + + +def process_opts(opts): + """Process and enrich command line arguments + + Args: + opts (dict): dictionary of parameters + + Returns: + dict: dictionary of parameters from command line arguments + """ + # When pretending the user surely wants to see the output + if opts['pretend']: + opts['log_level'] = logging.INFO + + configure_logger(opts) + + # In case of an update read and parse setup.cfg + if opts['update']: + try: + opts = info.project(opts) + except Exception as e: + raise NoPyScaffoldProject from e + + # Save cli params for later updating + opts['cli_params'] = {'extensions': list(), 'args': dict()} + for extension in opts['extensions']: + opts['cli_params']['extensions'].append(extension.name) + if extension.args is not None: + opts['cli_params']['args'][extension.name] = extension.args + + # Strip (back)slash when added accidentally during update + opts['project'] = opts['project'].rstrip(os.sep) + + # Remove options with None values + opts = {k: v for k, v in opts.items() if v is not None} + return opts + + +def run_scaffold(opts): + """Actually scaffold the project, calling the python API + + Args: + opts (dict): command line options as dictionary + """ + api.create_project(opts) + if opts['update'] and not opts['force']: + note = "Update accomplished!\n" \ + "Please check if your setup.cfg still complies with:\n" \ + "https://pyscaffold.org/en/v{}/configuration.html" + base_version = parse_version(pyscaffold_version).base_version + print(note.format(base_version)) + + +def list_actions(opts): + """Do not create a project, just list actions considering extensions + + Args: + opts (dict): command line options as dictionary + """ + actions = api.discover_actions(opts.get('extensions', [])) + + print('Planned Actions:') + for action in actions: + print(ReportFormatter.SPACING + get_id(action)) + + +def main(args): + """Main entry point for external applications + + Args: + args ([str]): command line arguments + """ + utils.check_setuptools_version() + opts = parse_args(args) + opts = process_opts(opts) + opts['command'](opts) + + +@shell.shell_command_error2exit_decorator +@utils.exceptions2exit([RuntimeError]) +def run(): + """Entry point for console script""" + main(sys.argv[1:]) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__init__.py b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__init__.py new file mode 100644 index 00000000..2bc75f03 --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__init__.py @@ -0,0 +1,68 @@ +# -*- coding: utf-8 -*- +""" +Contribution packages used by PyScaffold + +All packages inside ``contrib`` are external packages that come with their +own licences and are not part of the PyScaffold source code itself. +The reason for shipping these dependencies directly is to avoid problems in +the resolution of ``setup_requires`` dependencies that occurred more often +than not, see issues #71 and #72. + +Currently the contrib packages are: + +1) setuptools_scm v3.3.3 +2) pytest-runner 5.1 +3) configupdater 1.0 + +The packages/modules were just copied over. +""" + +# Following dummy definitions are here in case PyScaffold version < 3 +# is still installed and setuptools checks the registered entry_points. +SCM_HG_FILES_COMMAND = '' +SCM_GIT_FILES_COMMAND = '' + + +def warn_about_deprecated_pyscaffold(): + raise RuntimeError("A PyScaffold version less than 3.0 was detected, " + "please upgrade!") + + +def scm_find_files(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_parse_hg(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_parse_git(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_parse_archival(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_parse_pkginfo(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_guess_next_dev_version(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_postrelease_version(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_get_local_node_and_date(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def scm_get_local_dirty_tag(*args, **kwargs): + warn_about_deprecated_pyscaffold() + + +def write_pbr_json(*args, **kwargs): + warn_about_deprecated_pyscaffold() diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__pycache__/__init__.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b295f8061f7e487a3f964ca39c10b95acaa2a6cf GIT binary patch literal 2287 zcmb`I&u`l{6vySnNn9mPn>1aw?l2BH48{_*i7^E0hOL3ubp@8RSb7Qs(6mU)Ok`3c zDSPg5-5;`R{*wI>;17B1b_KI z)oTfVo?+MlCLWvzymns0SmH~3`M2PFnb-LWWSy__HOLj-;CCQbdC1ox*Z2l+LN@p& zzYBSX-{V`5A>ZcrA=mj1e*n3`Kj04`oBYGGp!E?80S-G_IU{?8lUk9SC6_D}mK0WS z(wmUile2{N`#R%cc${VP1yWhb1?hH^+5T>qFe8Zg#R;QWWuY4|M-n|0WGvl)xPg!+ z)MG_5nFy7D#S}01D(#@(IHLQ0S%pokE=(ez21x0w$of(E21|@!7H0RgA$B11T&mP> zwSsVw3&jDDAaH3!;<5>mmN-q=NJ~y~qkEYcS|U~GaYk63&B6c!x?L+=ky9gnF0k9e zzgsFxw{(&e#voEd4c~R&2}PibDFR>ih!wEb+5#5r9vzf^?j9XRVc7AzlsCwOuOm2* zEdu#83=djR027?nnWZ)vl2JRt9UitwK5@djeN!kU4EZ8D2-_{Mr!UhY=L|U@2ho$T zjL}U_9}hJzGT1T}F!rLbJ}tR~^?D>s6i$N#<#+4yh1tQd8<-r*@?GuM8V^uBOQ&z2 z9al3171mb}0En>#}t2W*EsZdT1#dBk{xeClO zIOX)u@5$2`MQCh%VVOz>;%%I2oo2|aks}f3c%@Nj@laYFA4W(gOPowfU`ALfGiir9 zPNj=o;k1z~OP~lgB62LXaU@dA`NUoq_Vw&tY#GL@>YA6Gzk7YBOe zK`Ak@$GH2}R5Jwt~CAINavgNGE9CGxP#2ty7`w;P+{3bGk+;*9oQP zJ7=8}`ojzQ{mUPppV7{%lau4q@6I3ir!QWb3fEW2I65@BJ_J3J4+q literal 0 HcmV?d00001 diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__pycache__/ptr.cpython-39.pyc b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/__pycache__/ptr.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d0cce122606253f26d9e9f91a63db44a6644651 GIT binary patch literal 6750 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 a+oqyj^)pSAth8=AY>Txmo3&e=xBefR3Ju8s literal 0 HcmV?d00001 diff --git a/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/configupdater.py b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/configupdater.py new file mode 100644 index 00000000..f49db46f --- /dev/null +++ b/.eggs/PyScaffold-3.2.3-py3.9.egg/pyscaffold/contrib/configupdater.py @@ -0,0 +1,1074 @@ +"""Configuration file updater. + +A configuration file consists of sections, lead by a "[section]" header, +and followed by "name: value" entries, with continuations and such in +the style of RFC 822. + +The basic idea of ConfigUpdater is that a configuration file consists of +three kinds of building blocks: sections, comments and spaces for separation. +A section itself consists of three kinds of blocks: options, comments and +spaces. This gives us the corresponding data structures to describe a +configuration file. + +A general block object contains the lines which were parsed and make up +the block. If a block object was not changed then during writing the same +lines that were parsed will be used to express the block. In case a block, +e.g. an option, was changed, it is marked as `updated` and its values will +be transformed into a corresponding string during an update of a +configuration file. + + +.. note:: + + ConfigUpdater was created by starting from Python's ConfigParser source + code and changing it according to my needs. Thus this source code + is subject to the PSF License in a way but I am not a lawyer. +""" + +import io +import os +import re +import sys +from abc import ABC +from collections import OrderedDict as _default_dict +from collections.abc import MutableMapping +from configparser import (ConfigParser, DuplicateOptionError, + DuplicateSectionError, Error, + MissingSectionHeaderError, NoOptionError, + NoSectionError, ParsingError) + +__all__ = ["NoSectionError", "DuplicateOptionError", "DuplicateSectionError", + "NoOptionError", "NoConfigFileReadError", "ParsingError", + "MissingSectionHeaderError", "ConfigUpdater"] + + +class NoConfigFileReadError(Error): + """Raised when no configuration file was read but update requested.""" + def __init__(self): + super().__init__( + "No configuration file was yet read! Use .read(...) first.") + + +# Used in parser getters to indicate the default behaviour when a specific +# option is not found it to raise an exception. Created to enable 'None' as +# a valid fallback value. +_UNSET = object() + + +class Container(ABC): + """Abstract Mixin Class + """ + def __init__(self, **kwargs): + self._structure = list() + super().__init__(**kwargs) + + @property + def structure(self): + return self._structure + + @property + def last_item(self): + if self._structure: + return self._structure[-1] + else: + return None + + +class Block(ABC): + """Abstract Block type holding lines + + Block objects hold original lines from the configuration file and hold + a reference to a container wherein the object resides. + """ + def __init__(self, container=None, **kwargs): + self._container = container + self.lines = [] + self._updated = False + super().__init__(**kwargs) + + def __str__(self): + return ''.join(self.lines) + + def __len__(self): + return len(self.lines) + + def __eq__(self, other): + if isinstance(other, self.__class__): + return self.lines == other.lines + else: + return False + + def add_line(self, line): + """Add a line to the current block + + Args: + line (str): one line to add + """ + self.lines.append(line) + return self + + @property + def container(self): + return self._container + + @property + def add_before(self): + """Returns a builder inserting a new block before the current block""" + idx = self._container.structure.index(self) + return BlockBuilder(self._container, idx) + + @property + def add_after(self): + """Returns a builder inserting a new block after the current block""" + idx = self._container.structure.index(self) + return BlockBuilder(self._container, idx+1) + + +class BlockBuilder(object): + """Builder that injects blocks at a given index position.""" + def __init__(self, container, idx): + self._container = container + self._idx = idx + + def comment(self, text, comment_prefix='#'): + """Creates a comment block + + Args: + text (str): content of comment without # + comment_prefix (str): character indicating start of comment + + Returns: + self for chaining + """ + comment = Comment(self._container) + if not text.startswith(comment_prefix): + text = "{} {}".format(comment_prefix, text) + if not text.endswith('\n'): + text = "{}{}".format(text, '\n') + comment.add_line(text) + self._container.structure.insert(self._idx, comment) + self._idx += 1 + return self + + def section(self, section): + """Creates a section block + + Args: + section (str or :class:`Section`): name of section or object + + Returns: + self for chaining + """ + if not isinstance(self._container, ConfigUpdater): + raise ValueError("Sections can only be added at section level!") + if isinstance(section, str): + # create a new section + section = Section(section, container=self._container) + elif not isinstance(section, Section): + raise ValueError("Parameter must be a string or Section type!") + if section.name in [block.name for block in self._container + if isinstance(block, Section)]: + raise DuplicateSectionError(section.name) + self._container.structure.insert(self._idx, section) + self._idx += 1 + return self + + def space(self, newlines=1): + """Creates a vertical space of newlines + + Args: + newlines (int): number of empty lines + + Returns: + self for chaining + """ + space = Space() + for line in range(newlines): + space.add_line('\n') + self._container.structure.insert(self._idx, space) + self._idx += 1 + return self + + def option(self, key, value=None, **kwargs): + """Creates a new option inside a section + + Args: + key (str): key of the option + value (str or None): value of the option + **kwargs: are passed to the constructor of :class:`Option` + + Returns: + self for chaining + """ + if not isinstance(self._container, Section): + raise ValueError("Options can only be added inside a section!") + option = Option(key, value, container=self._container, **kwargs) + option.value = value + self._container.structure.insert(self._idx, option) + self._idx += 1 + return self + + +class Comment(Block): + """Comment block""" + def __init__(self, container=None): + super().__init__(container=container) + + def __repr__(self): + return '' + + +class Space(Block): + """Vertical space block of new lines""" + def __init__(self, container=None): + super().__init__(container=container) + + def __repr__(self): + return '' + + +class Section(Block, Container, MutableMapping): + """Section block holding options + + Attributes: + name (str): name of the section + updated (bool): indicates name change or a new section + """ + def __init__(self, name, container, **kwargs): + self._name = name + self._structure = list() + self._updated = False + super().__init__(container=container, **kwargs) + + def add_option(self, entry): + """Add an Option object to the section + + Used during initial parsing mainly + + Args: + entry (Option): key value pair as Option object + """ + self._structure.append(entry) + return self + + def add_comment(self, line): + """Add a Comment object to the section + + Used during initial parsing mainly + + Args: + line (str): one line in the comment + """ + if not isinstance(self.last_item, Comment): + comment = Comment(self._structure) + self._structure.append(comment) + self.last_item.add_line(line) + return self + + def add_space(self, line): + """Add a Space object to the section + + Used during initial parsing mainly + + Args: + line (str): one line that defines the space, maybe whitespaces + """ + if not isinstance(self.last_item, Space): + space = Space(self._structure) + self._structure.append(space) + self.last_item.add_line(line) + return self + + def _get_option_idx(self, key): + idx = [i for i, entry in enumerate(self._structure) + if isinstance(entry, Option) and entry.key == key] + if idx: + return idx[0] + else: + raise ValueError + + def __str__(self): + if not self.updated: + s = super().__str__() + else: + s = "[{}]\n".format(self._name) + for entry in self._structure: + s += str(entry) + return s + + def __repr__(self): + return ''.format(self.name) + + def __getitem__(self, key): + if key not in self.options(): + raise KeyError(key) + return self._structure[self._get_option_idx(key=key)] + + def __setitem__(self, key, value): + if key in self: + option = self.__getitem__(key) + option.value = value + else: + option = Option(key, value, container=self) + option.value = value + self._structure.append(option) + + def __delitem__(self, key): + if key not in self.options(): + raise KeyError(key) + idx = self._get_option_idx(key=key) + del self._structure[idx] + + def __contains__(self, key): + return key in self.options() + + def __len__(self): + return len(self._structure) + + def __iter__(self): + """Return all entries, not just options""" + return self._structure.__iter__() + + def __eq__(self, other): + if isinstance(other, self.__class__): + return (self.name == other.name and + self._structure == other._structure) + else: + return False + + def option_blocks(self): + """Returns option blocks + + Returns: + list: list of :class:`Option` blocks + """ + return [entry for entry in self._structure + if isinstance(entry, Option)] + + def options(self): + """Returns option names + + Returns: + list: list of option names as strings + """ + return [option.key for option in self.option_blocks()] + + def to_dict(self): + """Transform to dictionary + + Returns: + dict: dictionary with same content + """ + return {key: self.__getitem__(key).value for key in self.options()} + + @property + def updated(self): + """Returns if the option was changed/updated""" + # if no lines were added, treat it as updated since we added it + return self._updated or not self.lines + + @property + def name(self): + return self._name + + @name.setter + def name(self, value): + self._name = str(value) + self._updated = True + + def set(self, option, value=None): + """Set an option for chaining. + + Args: + option (str): option name + value (str): value, default None + """ + option = self._container.optionxform(option) + if option in self.options(): + self.__getitem__(option).value = value + else: + self.__setitem__(option, value) + return self + + def insert_at(self, idx): + """Returns a builder inserting a new block at the given index + + Args: + idx (int): index where to insert + """ + return BlockBuilder(self, idx) + + +class Option(Block): + """Option block holding a key/value pair. + + Attributes: + key (str): name of the key + value (str): stored value + updated (bool): indicates name change or a new section + """ + def __init__(self, key, value, container, delimiter='=', + space_around_delimiters=True, line=None): + super().__init__(container=container) + self._key = key + self._values = [value] + self._value_is_none = value is None + self._delimiter = delimiter + self._value = None # will be filled after join_multiline_value + self._updated = False + self._multiline_value_joined = False + self._space_around_delimiters = space_around_delimiters + if line: + self.lines.append(line) + + def add_line(self, line): + super().add_line(line) + self._values.append(line.strip()) + + def _join_multiline_value(self): + if not self._multiline_value_joined and not self._value_is_none: + # do what `_join_multiline_value` in ConfigParser would do + self._value = '\n'.join(self._values).rstrip() + self._multiline_value_joined = True + + def __str__(self): + if not self.updated: + return super().__str__() + if self._value is None: + return "{}{}".format(self._key, '\n') + if self._space_around_delimiters: + # no space is needed if we use multi-line arguments + suffix = '' if str(self._value).startswith('\n') else ' ' + delim = " {}{}".format(self._delimiter, suffix) + else: + delim = self._delimiter + return "{}{}{}{}".format(self._key, delim, self._value, '\n') + + def __repr__(self): + return ''.format(self.key, self.value) + + @property + def updated(self): + """Returns if the option was changed/updated""" + # if no lines were added, treat it as updated since we added it + return self._updated or not self.lines + + @property + def key(self): + return self._key + + @key.setter + def key(self, value): + self._join_multiline_value() + self._key = value + self._updated = True + + @property + def value(self): + self._join_multiline_value() + return self._value + + @value.setter + def value(self, value): + self._updated = True + self._multiline_value_joined = True + self._value = value + self._values = [value] + + def set_values(self, values, separator='\n', indent=4*' '): + """Sets the value to a given list of options, e.g. multi-line values + + Args: + values (list): list of values + separator (str): separator for values, default: line separator + indent (str): indentation depth in case of line separator + """ + self._updated = True + self._multiline_value_joined = True + self._values = values + if separator == '\n': + values.insert(0, '') + separator = separator + indent + self._value = separator.join(values) + + +class ConfigUpdater(Container, MutableMapping): + """Parser for updating configuration files. + + ConfigUpdater follows the API of ConfigParser with some differences: + * inline comments are treated as part of a key's value, + * only a single config file can be updated at a time, + * empty lines in values are not valid, + * the original case of sections and keys are kept, + * control over the position of a new section/key. + + Following features are **deliberately not** implemented: + + * interpolation of values, + * propagation of parameters from the default section, + * conversions of values, + * passing key/value-pairs with ``default`` argument, + * non-strict mode allowing duplicate sections and keys. + """ + # Regular expressions for parsing section headers and options + _SECT_TMPL = r""" + \[ # [ + (?P
[^]]+) # very permissive! + \] # ] + """ + _OPT_TMPL = r""" + (?P