diff --git a/.github/workflows/python-coverage.yaml b/.github/workflows/python-coverage.yaml index b50d8ee8..d7345020 100644 --- a/.github/workflows/python-coverage.yaml +++ b/.github/workflows/python-coverage.yaml @@ -11,7 +11,7 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 @@ -19,7 +19,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.10' - uses: actions/cache@v2 with: @@ -38,11 +38,11 @@ jobs: - name: Test with pytest run: | coverage run -m pytest --cov-config=.coveragerc - - - name: Debug coverage - run: coverage report -m + + - name: Convert to LCO + run: coverage lcov --rcfile=.coveragerc - name: Upload coverage data to coveralls.io - run: coveralls --service=github --rcfile=.coveragerc - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + uses: coverallsapp/github-action@v2 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/python-docs.yaml b/.github/workflows/python-docs.yaml index 5fcd99ad..e628b26f 100644 --- a/.github/workflows/python-docs.yaml +++ b/.github/workflows/python-docs.yaml @@ -10,14 +10,14 @@ on: jobs: deploy: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.10' - uses: actions/cache@v2 with: @@ -28,7 +28,7 @@ jobs: run: | python -m pip install --upgrade pip pip install -e .[s3,tune] - pip install -r ./requirements/DEV_REQUIREMENTS.txt + pip install -r ./requirements/S3_REQUIREMENTS.txt pip install -r ./requirements/TUNE_REQUIREMENTS.txt pip install -r ./requirements/TEST_EXTRAS_REQUIREMENTS.txt diff --git a/.github/workflows/python-lint.yaml b/.github/workflows/python-lint.yaml index 94325eb3..8cf9f5c2 100644 --- a/.github/workflows/python-lint.yaml +++ b/.github/workflows/python-lint.yaml @@ -12,14 +12,14 @@ on: jobs: run_lint: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.10' - uses: actions/cache@v2 with: @@ -37,8 +37,8 @@ jobs: - name: Run isort linter run: | - isort --check . --skip="debug" --skip="versioneer.py" --skip="tests" --skip="_version.py" + isort --check . - name: Run black linter run: | - black --check . --exclude="versioneer.py|_version.py|debug|tests" + black --check . diff --git a/.github/workflows/python-manual-docs.yaml b/.github/workflows/python-manual-docs.yaml index 83f090fb..40d55f04 100644 --- a/.github/workflows/python-manual-docs.yaml +++ b/.github/workflows/python-manual-docs.yaml @@ -7,14 +7,14 @@ on: workflow_dispatch jobs: deploy: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.10' - uses: actions/cache@v2 with: diff --git a/.github/workflows/python-publish.yaml b/.github/workflows/python-publish.yaml index c9776df1..f5ad99ec 100644 --- a/.github/workflows/python-publish.yaml +++ b/.github/workflows/python-publish.yaml @@ -11,7 +11,7 @@ on: jobs: deploy: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 @@ -20,7 +20,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.10' - name: Install dependencies run: | python -m pip install --upgrade pip diff --git a/.github/workflows/python-pytest-s3.yaml b/.github/workflows/python-pytest-s3.yaml index 27961247..545118a9 100644 --- a/.github/workflows/python-pytest-s3.yaml +++ b/.github/workflows/python-pytest-s3.yaml @@ -11,10 +11,10 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] + python-version: ["3.7", "3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/python-pytest-tune.yaml b/.github/workflows/python-pytest-tune.yaml index 2f053ce6..4e1aded3 100644 --- a/.github/workflows/python-pytest-tune.yaml +++ b/.github/workflows/python-pytest-tune.yaml @@ -11,10 +11,10 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/python-pytest.yml b/.github/workflows/python-pytest.yml index b4a9976e..d550a708 100644 --- a/.github/workflows/python-pytest.yml +++ b/.github/workflows/python-pytest.yml @@ -11,10 +11,10 @@ on: jobs: build: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 strategy: matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] + python-version: ["3.7", "3.8", "3.9", "3.10"] steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/python-test-docs.yaml b/.github/workflows/python-test-docs.yaml index 381736c7..141de20b 100644 --- a/.github/workflows/python-test-docs.yaml +++ b/.github/workflows/python-test-docs.yaml @@ -15,13 +15,13 @@ on: jobs: deploy: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 with: - python-version: '3.8' + python-version: '3.10' - uses: actions/cache@v2 with: diff --git a/README.md b/README.md index 1d0a03ad..df832f9e 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@

- + @@ -84,7 +84,7 @@ generating CLI arguments, and hierarchical configuration by composition. ## Quick Install -The basic install and `[s3]` extension require Python 3.6+ while the `[tune]` extension requires Python 3.7+ +The basic install and `[s3]` extension require Python 3.7+ while the `[tune]` extension requires Python 3.8+ | Base | w/ S3 Extension | w/ Hyper-Parameter Tuner | |------|-----------------|--------------------------| @@ -102,7 +102,11 @@ See [Releases](https://github.com/fidelity/spock/releases) for more information.

-### Jan 12th, 2023 +#### August 30th, 2023 +* Removed Python 3.6 support as it was causing dependency hell +* Collection of bugfixes + +#### Jan 12th, 2023 * Added support for resolving value definitions from references to other defined variables with the following syntax,`${spock.var:SpockClass.defined_variable}` * Added support for new fundamental types: (1) file: this is an overload of a str that verifies file existence and (r/w) access (2) directory: this is an overload of a str that verifies directory existence, creation if not existing, and (r/w) access * Deprecated support for `List` of repeated `@spock` decorated classes. diff --git a/REQUIREMENTS.txt b/REQUIREMENTS.txt index 9b67642a..1cc4e214 100644 --- a/REQUIREMENTS.txt +++ b/REQUIREMENTS.txt @@ -1,6 +1,8 @@ -attrs~=21.4 +attrs~=23.1 cryptography~=37.0 GitPython~=3.1 pytomlpp~=1.0 -pyYAML~=5.4 -setuptools~=59.6 +# pyYAML~=5.4 +pyYAML~=6.0 +setuptools~=68.1 ; python_version >= '3.8' +setuptools~=68.0 ; python_version == '3.7' \ No newline at end of file diff --git a/requirements/DEV_REQUIREMENTS.txt b/requirements/DEV_REQUIREMENTS.txt index ff176e24..e586773b 100644 --- a/requirements/DEV_REQUIREMENTS.txt +++ b/requirements/DEV_REQUIREMENTS.txt @@ -1,13 +1,14 @@ -black~=22.1 ; python_version >= '3.7' -black~=21.4b0 ; python_version == '3.6' -coveralls~=3.3 -coverage[toml]~=6.1 -isort~=5.10 +black~=23.7 ; python_version >= '3.8' +black~=23.3 ; python_version == '3.7' +# coveralls~=3.3 +coverage[toml]~=7.3 ; python_version >= '3.8' +coverage[toml]~=7.2 ; python_version == '3.7' +isort~=5.12 ; python_version >= '3.8' +isort~=5.11 ; python_version == '3.7' moto~=3.1 -pre-commit~=2.20 ; python_version >= '3.7' -pre-commit~=2.17 ; python_version == '3.6' -pydoc-markdown~=4.3, < 4.6.* ; python_version >= '3.7' -pydoc-markdown~=3.13 ; python_version == '3.6' -pytest~=7.0 -pytest-cov~=3.0 -pylint~=2.11 +pre-commit~=3.3 ; python_version >= '3.8' +pre-commit~=2.21 ; python_version == '3.7' +pydoc-markdown~=4.8 ; python_version >= '3.7' +pytest~=7.4 ; python_version >= '3.7' +pytest-cov~=4.1 ; python_version >= '3.7' +pylint~=2.17 ; python_version >= '3.7' diff --git a/requirements/S3_REQUIREMENTS.txt b/requirements/S3_REQUIREMENTS.txt index 92aac2cd..f91b9032 100644 --- a/requirements/S3_REQUIREMENTS.txt +++ b/requirements/S3_REQUIREMENTS.txt @@ -1,4 +1,4 @@ -boto3~=1.20 -botocore~=1.26 +boto3~=1.28 ; python_version >= '3.7' +botocore~=1.31 ; python_version >= '3.7' hurry.filesize~=0.9 -s3transfer~=0.5 +s3transfer~=0.6 ; python_version >= '3.7' diff --git a/requirements/TUNE_REQUIREMENTS.txt b/requirements/TUNE_REQUIREMENTS.txt index 954ef1ce..162264dd 100644 --- a/requirements/TUNE_REQUIREMENTS.txt +++ b/requirements/TUNE_REQUIREMENTS.txt @@ -1,4 +1,7 @@ mypy_extensions~=0.4; python_version < '3.8' -optuna~=2.10 -torch>=1.8.1 -ax-platform~=0.2.4; python_version >= '3.7' +optuna~=3.3 +torch~=2.0 ; python_version >= '3.8' +torch~=1.13 ; python_version <= '3.7' +ax-platform~=0.3.4; python_version >= '3.9' +ax-platform~=0.3.3; python_version == '3.8' + diff --git a/setup.py b/setup.py index 110657cd..338b8df9 100644 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ "": ["py.typed", "*.pyi"], }, include_package_data=True, - python_requires=">=3.6", + python_requires=">=3.7", install_requires=install_reqs, extras_require={"s3": s3_reqs, "tune": tune_reqs}, ) diff --git a/spock/backend/help.py b/spock/backend/help.py index eff779e8..d7b94510 100644 --- a/spock/backend/help.py +++ b/spock/backend/help.py @@ -110,20 +110,22 @@ def handle_attributes_print(info_dict, max_indent: int): max_indent: max indent for pretty print of help """ - # Figure out indents - max_param_length = max([len(k) for k in info_dict.keys()]) - max_type_length = max([v["len"]["type"] for v in info_dict.values()]) - # Print akin to the argparser - for k, v in info_dict.items(): - print( - f" {k}" - + (" " * (max_param_length - v["len"]["name"] + max_indent)) - + f'{v["type"]}' - + (" " * (max_type_length - v["len"]["type"] + max_indent)) - + f'{v["desc"]} {v["default"]}' - ) - # Blank for spacing :-/ - print("") + # Add check for an empty dict (corresponds to any empty spock class) + if len(info_dict) > 0: + # Figure out indents + max_param_length = max([len(k) for k in info_dict.keys()]) + max_type_length = max([v["len"]["type"] for v in info_dict.values()]) + # Print akin to the argparser + for k, v in info_dict.items(): + print( + f" {k}" + + (" " * (max_param_length - v["len"]["name"] + max_indent)) + + f'{v["type"]}' + + (" " * (max_type_length - v["len"]["type"] + max_indent)) + + f'{v["desc"]} {v["default"]}' + ) + # Blank for spacing :-/ + print("") def get_type_string(val, nested_others): diff --git a/spock/backend/typed.py b/spock/backend/typed.py index db9d4d82..3cbbaeb2 100644 --- a/spock/backend/typed.py +++ b/spock/backend/typed.py @@ -73,7 +73,6 @@ def _recursive_generic_validator(typed): # Iterate through since there might be multiple types? # Handle Tuple type if _get_name_py_version(typed) == "Tuple": - # Tuples by def have len more than 1. We throw an exception if not since # a tuple is not necessary in that case. Tuples can also have mixed types, # thus we need to handle this oddity here -- we do this by passing each diff --git a/spock/backend/validators.py b/spock/backend/validators.py index b0428c7c..4f86c3c2 100644 --- a/spock/backend/validators.py +++ b/spock/backend/validators.py @@ -390,7 +390,6 @@ def __call__( validator(inst, attr, member) def __repr__(self): - return ( f"" diff --git a/spock/graph.py b/spock/graph.py index 8fd93d0c..e1703b64 100644 --- a/spock/graph.py +++ b/spock/graph.py @@ -230,7 +230,6 @@ def _build(self) -> Dict: class SelfGraph(BaseGraph): - var_resolver = VarResolver() def __init__(self, cls: _C, fields: Dict): diff --git a/spock/utils.py b/spock/utils.py index 7c0bb86a..60811422 100644 --- a/spock/utils.py +++ b/spock/utils.py @@ -602,6 +602,7 @@ def add_repo_info(out_dict: Dict) -> Dict: head_result = subprocess.run( "git rev-parse --abbrev-ref --symbolic-full-name HEAD", stdout=subprocess.PIPE, + stdin=subprocess.DEVNULL if sys.platform == "win32" else None, shell=True, check=False, ) @@ -609,6 +610,7 @@ def add_repo_info(out_dict: Dict) -> Dict: head_result = subprocess.run( "git rev-parse --abbrev-ref --symbolic-full-name HEAD", capture_output=True, + stdin=subprocess.DEVNULL if sys.platform == "win32" else None, shell=True, check=False, ) @@ -631,6 +633,9 @@ def add_repo_info(out_dict: Dict) -> Dict: out_dict.update( {"# Git Origin": repo.active_branch.commit.repo.remotes.origin.url} ) + # Attempt to close to not leak resources + # https://github.com/gitpython-developers/GitPython#leakage-of-system-resources + repo.close() except git.InvalidGitRepositoryError: # pragma: no cover # But it's okay if we are not out_dict = make_blank_git(out_dict)