diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3d7af59c..7f6955d8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,6 +5,8 @@ include: file: - templates/artifacts/python-library.yaml +variables: + LANGUAGE_VERSION: python3.8 tox: parallel: diff --git a/bin/package b/bin/package index 9c76ec76..079b7fa1 100755 --- a/bin/package +++ b/bin/package @@ -73,7 +73,6 @@ cd .. python -m pip install --upgrade pip python -m pip install --no-deps -r requirements.txt python -m pip install --no-deps . -python setup.py install # go back go the ./gdc_client/bin dir cd bin @@ -100,7 +99,8 @@ pyinstaller \ --noconfirm \ --onefile \ --copy-metadata gdc-client \ - -c gdc-client + --name gdc-client \ + -c ../src/gdc_client/cli.py echo "Testing produced binary..." ./dist/$BINARY_NAME --help diff --git a/dev-requirements.in b/dev-requirements.in deleted file mode 100644 index f263ded9..00000000 --- a/dev-requirements.in +++ /dev/null @@ -1,14 +0,0 @@ --c requirements.txt - -click>= 8 -flask~=1.0.2 -pytest~=4.6.2 -pytest-cov~=2.7.1 -requests-mock~=1.5.2 -moto~=1.3.14 -python-jose<3.3.0 # lower the requirements for cryptography, so python3.5 could work -httmock~=1.3.0 - - # required by moto, limit version for jsonschema -cfn-lint<0.22.0 -aws-sam-translator<1.12.0 diff --git a/dev-requirements.txt b/dev-requirements.txt index 78facf93..1dd76aac 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -2,7 +2,7 @@ # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # -# pip-compile dev-requirements.in +# pip-compile --extra=dev --output-file=dev-requirements.txt # atomicwrites==1.4.1 # via pytest @@ -10,8 +10,8 @@ attrs==22.1.0 # via pytest aws-sam-translator==1.11.0 # via - # -r dev-requirements.in # cfn-lint + # gdc-client (pyproject.toml) aws-xray-sdk==2.11.0 # via moto boto==2.49.0 @@ -27,31 +27,26 @@ botocore==1.19.63 # moto # s3transfer certifi==2024.7.4 - # via - # -c requirements.txt - # requests + # via requests cffi==1.15.1 - # via - # -c requirements.txt - # cryptography + # via cryptography cfn-lint==0.21.6 # via - # -r dev-requirements.in + # gdc-client (pyproject.toml) # moto chardet==3.0.4 - # via - # -c requirements.txt - # requests + # via requests click==8.1.7 # via - # -r dev-requirements.in # flask -coverage==5.5 + # gdc-client (pyproject.toml) +coverage[toml]==7.6.0 # via pytest-cov cryptography==43.0.0 # via - # -c requirements.txt + # gdc-client (pyproject.toml) # moto + # pyopenssl # python-jose # sshpubkeys docker==4.4.4 @@ -62,18 +57,19 @@ ecdsa==0.14.1 # python-jose # sshpubkeys flask==1.0.4 - # via -r dev-requirements.in + # via gdc-client (pyproject.toml) httmock==1.3.0 - # via -r dev-requirements.in + # via gdc-client (pyproject.toml) idna==2.8 # via - # -c requirements.txt # moto # requests importlib-metadata==7.0.1 # via - # -c requirements.txt + # gdc-client (pyproject.toml) # pytest +intervaltree==3.0.2 + # via gdc-client (pyproject.toml) itsdangerous==1.1.0 # via flask jinja2==2.11.3 @@ -92,9 +88,11 @@ jsonpointer==2.3 # via jsonpatch jsonschema==2.6.0 # via - # -c requirements.txt # aws-sam-translator # cfn-lint + # gdc-client (pyproject.toml) +lxml==4.4.3 + # via gdc-client (pyproject.toml) markupsafe==1.1.1 # via # jinja2 @@ -106,56 +104,65 @@ more-itertools==8.14.0 # moto # pytest moto==1.3.16 - # via -r dev-requirements.in + # via gdc-client (pyproject.toml) +ndg-httpsclient==0.5.1 + # via gdc-client (pyproject.toml) packaging==20.9 # via pytest pluggy==0.13.1 # via pytest +progressbar2==4.4.2 + # via gdc-client (pyproject.toml) py==1.11.0 # via pytest pyasn1==0.4.8 # via - # -c requirements.txt + # gdc-client (pyproject.toml) + # ndg-httpsclient # python-jose # rsa pycparser==2.21 + # via cffi +pyopenssl==24.2.1 # via - # -c requirements.txt - # cffi + # gdc-client (pyproject.toml) + # ndg-httpsclient pyparsing==2.4.7 # via packaging pytest==4.6.2 # via - # -r dev-requirements.in + # gdc-client (pyproject.toml) # pytest-cov -pytest-cov==2.7.1 - # via -r dev-requirements.in +pytest-cov==5.0.0 + # via gdc-client (pyproject.toml) python-dateutil==2.8.2 # via # botocore # moto python-jose[cryptography]==3.2.0 # via - # -r dev-requirements.in + # gdc-client (pyproject.toml) # moto +python-utils==3.8.2 + # via progressbar2 pytz==2022.7.1 # via moto pyyaml==5.3.1 # via - # -c requirements.txt # cfn-lint + # gdc-client (pyproject.toml) # moto requests==2.22.0 # via - # -c requirements.txt # cfn-lint # docker + # gdc-client (pyproject.toml) # httmock # moto # requests-mock # responses requests-mock==1.5.2 - # via -r dev-requirements.in + # via gdc-client (pyproject.toml) responses==0.17.0 # via moto rsa==4.7.2 @@ -164,7 +171,6 @@ s3transfer==0.3.7 # via boto3 six==1.16.0 # via - # -c requirements.txt # aws-sam-translator # cfn-lint # docker @@ -177,11 +183,18 @@ six==1.16.0 # requests-mock # responses # websocket-client +sortedcontainers==2.4.0 + # via intervaltree sshpubkeys==3.3.1 # via moto +termcolor==1.1.0 + # via gdc-client (pyproject.toml) +tomli==2.0.1 + # via coverage +typing-extensions==4.12.2 + # via python-utils urllib3==1.25.11 # via - # -c requirements.txt # botocore # requests # responses @@ -199,7 +212,6 @@ xmltodict==0.13.0 # via moto zipp==3.17.0 # via - # -c requirements.txt # importlib-metadata # moto diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..107ba5f5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,42 @@ +[build-system] +requires = ["setuptools>=64", "setuptools_scm>=8"] +build-backend = "setuptools.build_meta" + +[project] +name = "gdc-client" +dynamic = [ + "version", + "description", + "readme", + "requires-python", + "license", + "authors", + "maintainers", + "keywords", + "classifiers", + "urls", + "scripts", + "gui-scripts", + "entry-points", + "dependencies", + "optional-dependencies" +] + +[tool.coverage.html] +title = "gdc-client coverage report" +directory = "docs/htmlcov" +show_contexts = true + +[tool.coverage.run] +branch = true +context = "unit tests" +source = ["gdc_client"] + +[tool.isort] +extend_skip = [".md", ".json"] +known_first_party = ["gdc_client"] +py_version = 38 +skip = [".gitignore", ".dockerignore"] + +[tool.setuptools_scm] +local_scheme = "dirty-tag" diff --git a/requirements.txt b/requirements.txt index 6abfdc51..cd0220d2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,38 +12,38 @@ chardet==3.0.4 # via requests cryptography==43.0.0 # via - # gdc_client (setup.py) + # gdc-client (pyproject.toml) # pyopenssl idna==2.8 # via requests importlib-metadata==7.0.1 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) intervaltree==3.0.2 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) jsonschema==2.6.0 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) lxml==4.4.2 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) ndg-httpsclient==0.5.0 - # via gdc_client (setup.py) -progressbar2==3.43.1 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) +progressbar2==3.55.0 + # via gdc-client (pyproject.toml) pyasn1==0.4.8 # via - # gdc_client (setup.py) + # gdc-client (pyproject.toml) # ndg-httpsclient pycparser==2.21 # via cffi pyopenssl==24.2.1 # via - # gdc_client (setup.py) + # gdc-client (pyproject.toml) # ndg-httpsclient python-utils==2.7.1 # via progressbar2 pyyaml==5.3.1 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) requests==2.22.0 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) six==1.16.0 # via # progressbar2 @@ -51,7 +51,7 @@ six==1.16.0 sortedcontainers==2.4.0 # via intervaltree termcolor==1.1.0 - # via gdc_client (setup.py) + # via gdc-client (pyproject.toml) urllib3==1.25.11 # via requests zipp==3.17.0 diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 00000000..92bbd495 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,61 @@ +[metadata] +name = gdc-client +description = The gdc-client provides several convenience functions over the GDC API which provides general download/upload via HTTPS. +long_description = file: README.md +long_description_content_type = text/markdown +author = GDC Feature Team +author_email = gdc_dev_questions-aaaaae2lhsbell56tlvh3upgoq@cdis.slack.com +maintainer = GDC Feature Team +maintainer_email = gdc_dev_questions-aaaaae2lhsbell56tlvh3upgoq@cdis.slack.com +license = Apache Software License 2.0 +license_files = LICENSE +url = https://github.com/NCI-GDC/gdc-client +keywords = gdc, client, download, upload +classifiers = + Programming Language :: Python + Programming Language :: Python :: 3 + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + License :: OSI Approved :: Apache Software License + Topic :: Internet :: WWW/HTTP + +[options] +packages = find: +package_dir = + =src +python_requires = >=3.8 +install_requires = + cryptography + jsonschema~=2.6.0 + lxml~=4.4.2 + ndg-httpsclient~=0.5.0 + pyasn1 + pyOpenSSL + PyYAML>=5.1 + intervaltree~=3.0.2 + importlib_metadata + termcolor~=1.1.0 + requests~=2.22.0 + progressbar2 + +[options.packages.find] +where = src + +[options.package_data] + +[options.extras_require] +dev = + click>= 8 + flask~=1.0.2 + pytest~=4.6.2 + pytest-cov + requests-mock~=1.5.2 + moto~=1.3.14 + python-jose<3.3.0 # lower the requirements for cryptography, so python3.5 could work + httmock~=1.3.0 + cfn-lint<0.22.0 # required by moto, limit version for jsonschema + aws-sam-translator<1.12.0a + +[options.entry_points] +console_scripts = + gdc-client = gdc_client.cli:main diff --git a/setup.py b/setup.py deleted file mode 100644 index b2dbee5d..00000000 --- a/setup.py +++ /dev/null @@ -1,34 +0,0 @@ -from setuptools import setup, find_packages - -# read the contents of your README file -from pathlib import Path - -this_directory = Path(__file__).parent -long_description = (this_directory / "README.md").read_text() - -setup( - name="gdc_client", - long_description=long_description, - long_description_content_type="text/markdown", - use_scm_version={ - "local_scheme": "dirty-tag", - }, - setup_requires=["setuptools_scm<8"], - packages=find_packages(), - package_data={}, - scripts=["bin/gdc-client"], - install_requires=[ - "cryptography", - "jsonschema~=2.6.0", - "lxml~=4.4.2", - "ndg-httpsclient~=0.5.0", - "pyasn1", - "pyOpenSSL", - "PyYAML>=5.1", - "intervaltree~=3.0.2", - "importlib_metadata", - "termcolor~=1.1.0", - "requests~=2.22.0", - "progressbar2~=3.43.1", - ], -) diff --git a/gdc_client/__init__.py b/src/gdc_client/__init__.py similarity index 100% rename from gdc_client/__init__.py rename to src/gdc_client/__init__.py diff --git a/gdc_client/auth/__init__.py b/src/gdc_client/auth/__init__.py similarity index 100% rename from gdc_client/auth/__init__.py rename to src/gdc_client/auth/__init__.py diff --git a/gdc_client/auth/auth.py b/src/gdc_client/auth/auth.py similarity index 100% rename from gdc_client/auth/auth.py rename to src/gdc_client/auth/auth.py diff --git a/gdc_client/auth/parser.py b/src/gdc_client/auth/parser.py similarity index 100% rename from gdc_client/auth/parser.py rename to src/gdc_client/auth/parser.py diff --git a/bin/gdc-client b/src/gdc_client/cli.py similarity index 99% rename from bin/gdc-client rename to src/gdc_client/cli.py index df83b31a..c907c643 100755 --- a/bin/gdc-client +++ b/src/gdc_client/cli.py @@ -44,7 +44,7 @@ def log_version_header(log): log.debug("gdc-client - {version}".format(version=version.__version__)) -if __name__ == "__main__": +def main() -> None: parser = GDCClientArgumentParser( description=DESCRIPTION, @@ -128,3 +128,7 @@ def log_version_header(log): # will hit this branch even if downloads fail # and debug is turned off log.debug("gdc-client exited normally") + + +if __name__ == "__main__": + main() diff --git a/gdc_client/client/__init__.py b/src/gdc_client/client/__init__.py similarity index 100% rename from gdc_client/client/__init__.py rename to src/gdc_client/client/__init__.py diff --git a/gdc_client/client/client.py b/src/gdc_client/client/client.py similarity index 100% rename from gdc_client/client/client.py rename to src/gdc_client/client/client.py diff --git a/gdc_client/client/parser.py b/src/gdc_client/client/parser.py similarity index 100% rename from gdc_client/client/parser.py rename to src/gdc_client/client/parser.py diff --git a/gdc_client/common/__init__.py b/src/gdc_client/common/__init__.py similarity index 100% rename from gdc_client/common/__init__.py rename to src/gdc_client/common/__init__.py diff --git a/gdc_client/common/config.py b/src/gdc_client/common/config.py similarity index 100% rename from gdc_client/common/config.py rename to src/gdc_client/common/config.py diff --git a/gdc_client/defaults.py b/src/gdc_client/defaults.py similarity index 100% rename from gdc_client/defaults.py rename to src/gdc_client/defaults.py diff --git a/gdc_client/download/__init__.py b/src/gdc_client/download/__init__.py similarity index 100% rename from gdc_client/download/__init__.py rename to src/gdc_client/download/__init__.py diff --git a/gdc_client/download/client.py b/src/gdc_client/download/client.py similarity index 100% rename from gdc_client/download/client.py rename to src/gdc_client/download/client.py diff --git a/gdc_client/download/parser.py b/src/gdc_client/download/parser.py similarity index 100% rename from gdc_client/download/parser.py rename to src/gdc_client/download/parser.py diff --git a/gdc_client/exceptions.py b/src/gdc_client/exceptions.py similarity index 100% rename from gdc_client/exceptions.py rename to src/gdc_client/exceptions.py diff --git a/gdc_client/log/__init__.py b/src/gdc_client/log/__init__.py similarity index 100% rename from gdc_client/log/__init__.py rename to src/gdc_client/log/__init__.py diff --git a/gdc_client/log/log.py b/src/gdc_client/log/log.py similarity index 100% rename from gdc_client/log/log.py rename to src/gdc_client/log/log.py diff --git a/gdc_client/log/parser.py b/src/gdc_client/log/parser.py similarity index 100% rename from gdc_client/log/parser.py rename to src/gdc_client/log/parser.py diff --git a/gdc_client/parcel/__init__.py b/src/gdc_client/parcel/__init__.py similarity index 100% rename from gdc_client/parcel/__init__.py rename to src/gdc_client/parcel/__init__.py diff --git a/gdc_client/parcel/client.py b/src/gdc_client/parcel/client.py similarity index 100% rename from gdc_client/parcel/client.py rename to src/gdc_client/parcel/client.py diff --git a/gdc_client/parcel/const.py b/src/gdc_client/parcel/const.py similarity index 100% rename from gdc_client/parcel/const.py rename to src/gdc_client/parcel/const.py diff --git a/gdc_client/parcel/defaults.py b/src/gdc_client/parcel/defaults.py similarity index 100% rename from gdc_client/parcel/defaults.py rename to src/gdc_client/parcel/defaults.py diff --git a/gdc_client/parcel/download_stream.py b/src/gdc_client/parcel/download_stream.py similarity index 100% rename from gdc_client/parcel/download_stream.py rename to src/gdc_client/parcel/download_stream.py diff --git a/gdc_client/parcel/http_client.py b/src/gdc_client/parcel/http_client.py similarity index 100% rename from gdc_client/parcel/http_client.py rename to src/gdc_client/parcel/http_client.py diff --git a/gdc_client/parcel/log.py b/src/gdc_client/parcel/log.py similarity index 100% rename from gdc_client/parcel/log.py rename to src/gdc_client/parcel/log.py diff --git a/gdc_client/parcel/manifest.py b/src/gdc_client/parcel/manifest.py similarity index 100% rename from gdc_client/parcel/manifest.py rename to src/gdc_client/parcel/manifest.py diff --git a/gdc_client/parcel/portability.py b/src/gdc_client/parcel/portability.py similarity index 100% rename from gdc_client/parcel/portability.py rename to src/gdc_client/parcel/portability.py diff --git a/gdc_client/parcel/segment.py b/src/gdc_client/parcel/segment.py similarity index 100% rename from gdc_client/parcel/segment.py rename to src/gdc_client/parcel/segment.py diff --git a/gdc_client/parcel/utils.py b/src/gdc_client/parcel/utils.py similarity index 100% rename from gdc_client/parcel/utils.py rename to src/gdc_client/parcel/utils.py diff --git a/gdc_client/query/__init__.py b/src/gdc_client/query/__init__.py similarity index 100% rename from gdc_client/query/__init__.py rename to src/gdc_client/query/__init__.py diff --git a/gdc_client/query/index.py b/src/gdc_client/query/index.py similarity index 100% rename from gdc_client/query/index.py rename to src/gdc_client/query/index.py diff --git a/gdc_client/query/versions.py b/src/gdc_client/query/versions.py similarity index 100% rename from gdc_client/query/versions.py rename to src/gdc_client/query/versions.py diff --git a/gdc_client/settings/__init__.py b/src/gdc_client/settings/__init__.py similarity index 100% rename from gdc_client/settings/__init__.py rename to src/gdc_client/settings/__init__.py diff --git a/gdc_client/settings/parser.py b/src/gdc_client/settings/parser.py similarity index 100% rename from gdc_client/settings/parser.py rename to src/gdc_client/settings/parser.py diff --git a/gdc_client/upload/__init__.py b/src/gdc_client/upload/__init__.py similarity index 100% rename from gdc_client/upload/__init__.py rename to src/gdc_client/upload/__init__.py diff --git a/gdc_client/upload/client.py b/src/gdc_client/upload/client.py similarity index 100% rename from gdc_client/upload/client.py rename to src/gdc_client/upload/client.py diff --git a/gdc_client/upload/exceptions.py b/src/gdc_client/upload/exceptions.py similarity index 100% rename from gdc_client/upload/exceptions.py rename to src/gdc_client/upload/exceptions.py diff --git a/gdc_client/upload/manifest.py b/src/gdc_client/upload/manifest.py similarity index 100% rename from gdc_client/upload/manifest.py rename to src/gdc_client/upload/manifest.py diff --git a/gdc_client/upload/parser.py b/src/gdc_client/upload/parser.py similarity index 100% rename from gdc_client/upload/parser.py rename to src/gdc_client/upload/parser.py diff --git a/gdc_client/upload/schema.py b/src/gdc_client/upload/schema.py similarity index 100% rename from gdc_client/upload/schema.py rename to src/gdc_client/upload/schema.py diff --git a/gdc_client/utils.py b/src/gdc_client/utils.py similarity index 100% rename from gdc_client/utils.py rename to src/gdc_client/utils.py diff --git a/gdc_client/version.py b/src/gdc_client/version.py similarity index 100% rename from gdc_client/version.py rename to src/gdc_client/version.py diff --git a/tox.ini b/tox.ini index e75d9485..d161a801 100644 --- a/tox.ini +++ b/tox.ini @@ -6,7 +6,6 @@ allowlist_externals = pytest setenv= PYTHONHASHSEED=0 deps= - -rrequirements.txt -rdev-requirements.txt . commands=