Skip to content

Commit 0032f78

Browse files
authored
refactor: Refactored setup and tool config into setup.cfg (#57)
* refactor: Moved all config to setup.cfg * chore: Updated gitignore * style: Removed unused import * refactor: Updated requirement validation script * ci: Fixed CI test extra installation
1 parent b1ba598 commit 0032f78

14 files changed

+167
-234
lines changed

.coveragerc

-2
This file was deleted.

.flake8

-5
This file was deleted.

.github/validate_deps.py

+66-38
Original file line numberDiff line numberDiff line change
@@ -3,60 +3,88 @@
33
import requirements
44
from requirements.requirement import Requirement
55

6-
# Deps that won't have a specific requirements.txt
7-
IGNORE = ["flake8", "isort", "mypy", "pydocstyle"]
86
# All req files to check
9-
REQ_FILES = ["requirements.txt", "tests/requirements.txt", "docs/requirements.txt"]
7+
EXTRA_MAP = {
8+
"test": "tests/requirements.txt",
9+
"docs": "docs/requirements.txt",
10+
}
11+
EXTRA_IGNORE = ["dev"]
1012

1113

12-
def main():
14+
def parse_deps(deps):
15+
reqs = {}
16+
for _dep in deps:
17+
lib, specs = _dep
18+
assert reqs.get(lib) is None, f"conflicting deps for {lib}"
19+
reqs[lib] = specs
1320

14-
# Collect the deps from all requirements.txt
15-
folder = Path(__file__).parent.parent.absolute()
16-
req_deps = {}
17-
for file in REQ_FILES:
18-
with open(folder.joinpath(file), 'r') as f:
19-
_deps = [(req.name, req.specs) for req in requirements.parse(f)]
21+
return reqs
2022

21-
for _dep in _deps:
22-
lib, specs = _dep
23-
assert req_deps.get(lib, specs) == specs, f"conflicting deps for {lib}"
24-
req_deps[lib] = specs
2523

26-
# Collect the one from setup.py
27-
setup_deps = {}
28-
with open(folder.joinpath("setup.py"), 'r') as f:
29-
setup = f.readlines()
30-
lines = setup[setup.index("_deps = [\n") + 1:]
31-
lines = [_dep.strip() for _dep in lines[:lines.index("]\n")]]
32-
lines = [_dep.split('"')[1] for _dep in lines if _dep.startswith('"')]
33-
_reqs = [Requirement.parse(_line) for _line in lines]
34-
_deps = [(req.name, req.specs) for req in _reqs]
35-
for _dep in _deps:
36-
lib, specs = _dep
37-
assert setup_deps.get(lib) is None, f"conflicting deps for {lib}"
38-
setup_deps[lib] = specs
24+
def get_conficts(setup_reqs, requirement_file):
25+
26+
# Parse the deps from the requirements.txt
27+
folder = Path(__file__).parent.parent.absolute()
28+
req_deps = {}
29+
with open(folder.joinpath(requirement_file), 'r') as f:
30+
_deps = [(req.name, req.specs) for req in requirements.parse(f)]
3931

40-
# Remove ignores
41-
for k in IGNORE:
42-
if isinstance(req_deps.get(k), list):
43-
del req_deps[k]
44-
if isinstance(setup_deps.get(k), list):
45-
del setup_deps[k]
32+
req_deps = parse_deps(_deps)
4633

4734
# Compare them
48-
assert len(req_deps) == len(setup_deps)
35+
assert len(req_deps) == len(setup_reqs)
4936
mismatches = []
50-
for k, v in setup_deps.items():
37+
for k, v in setup_reqs.items():
5138
assert isinstance(req_deps.get(k), list)
5239
if req_deps[k] != v:
5340
mismatches.append((k, v, req_deps[k]))
5441

55-
if len(mismatches) > 0:
42+
return mismatches
43+
44+
45+
def main():
46+
47+
# Collect the one from setup.py
48+
folder = Path(__file__).parent.parent.absolute()
49+
with open(folder.joinpath("setup.cfg"), 'r') as f:
50+
setup = f.readlines()
51+
52+
# install_requires
53+
lines = setup[setup.index("install_requires =\n") + 1:]
54+
lines = [_dep.strip() for _dep in lines[:lines.index("\n")]]
55+
_reqs = [Requirement.parse(_line) for _line in lines]
56+
install_requires = parse_deps([(req.name, req.specs) for req in _reqs])
57+
58+
# extras
59+
extras_require = {}
60+
lines = setup[setup.index("[options.extras_require]\n") + 1:]
61+
lines = lines[:lines.index("\n")]
62+
# Split each extra
63+
extra_lines = [_line for _line in lines if str.isalpha(_line[0])]
64+
extra_names = [_line.strip().replace("=", "").strip() for _line in extra_lines]
65+
for current_extra, start_line, end_line in zip(extra_names, extra_lines, extra_lines[1:] + [None]):
66+
if current_extra in EXTRA_IGNORE:
67+
continue
68+
_lines = [_dep for _dep in lines[lines.index(start_line) + 1:]]
69+
if isinstance(end_line, str):
70+
_lines = _lines[:_lines.index(end_line)]
71+
# Remove comments
72+
_lines = [_line.strip() for _line in _lines]
73+
_reqs = [Requirement.parse(_line.strip()) for _line in _lines if not _line.strip().startswith("#")]
74+
extras_require[current_extra] = parse_deps([(req.name, req.specs) for req in _reqs])
75+
76+
# Resolve conflicts
77+
mismatches = {}
78+
mismatches["requirements.txt"] = get_conficts(install_requires, "requirements.txt")
79+
for extra_k, req_file in EXTRA_MAP.items():
80+
mismatches[req_file] = get_conficts(extras_require[extra_k], req_file)
81+
82+
# Display the results
83+
if any(len(mismatch) > 0 for mismatch in mismatches.values()):
5684
mismatch_str = "version specifiers mismatches:\n"
5785
mismatch_str += '\n'.join(
58-
f"- {lib}: {setup} (from setup.py) | {reqs} (from requirements)"
59-
for lib, setup, reqs in mismatches
86+
f"- {lib}: {setup} (from setup.cfg) | {reqs} (from {req_file})"
87+
for req_file, issues in mismatches.items() for lib, setup, reqs in issues
6088
)
6189
raise AssertionError(mismatch_str)
6290

.github/workflows/builds.yml

-3
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,6 @@ jobs:
2828
key: ${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('**/*.py') }}
2929
restore-keys: |
3030
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-
31-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-
32-
${{ runner.os }}-pkg-deps-
33-
${{ runner.os }}-
3431
- name: Install package
3532
run: |
3633
python -m pip install --upgrade pip

.github/workflows/docs.yml

-3
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ jobs:
2727
restore-keys: |
2828
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('docs/requirements.txt') }}-
2929
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-
30-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-
31-
${{ runner.os }}-pkg-deps-
32-
${{ runner.os }}-
3330
- name: Install dependencies
3431
run: |
3532
python -m pip install --upgrade pip

.github/workflows/main.yml

+1-39
Original file line numberDiff line numberDiff line change
@@ -7,38 +7,7 @@ on:
77
branches: master
88

99
jobs:
10-
install:
11-
runs-on: ${{ matrix.os }}
12-
strategy:
13-
matrix:
14-
os: [ubuntu-latest]
15-
python: [3.7]
16-
steps:
17-
- uses: actions/checkout@v2
18-
with:
19-
persist-credentials: false
20-
- name: Set up Python
21-
uses: actions/setup-python@v1
22-
with:
23-
python-version: ${{ matrix.python }}
24-
architecture: x64
25-
- name: Cache python modules
26-
uses: actions/cache@v2
27-
with:
28-
path: ~/.cache/pip
29-
key: ${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('**/*.py') }}
30-
restore-keys: |
31-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-
32-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-
33-
${{ runner.os }}-pkg-deps-
34-
${{ runner.os }}-
35-
- name: Install package
36-
run: |
37-
python -m pip install --upgrade pip
38-
pip install -e . --upgrade
39-
4010
pytest:
41-
needs: install
4211
runs-on: ${{ matrix.os }}
4312
strategy:
4413
matrix:
@@ -61,13 +30,10 @@ jobs:
6130
restore-keys: |
6231
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('tests/requirements.txt') }}-
6332
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-
64-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-
65-
${{ runner.os }}-pkg-deps-
66-
${{ runner.os }}-
6733
- name: Install dependencies
6834
run: |
6935
python -m pip install --upgrade pip
70-
pip install -e ".[testing]" --upgrade
36+
pip install -e ".[test]" --upgrade
7137
- name: Run unittests
7238
run: |
7339
coverage run -m pytest tests/
@@ -91,7 +57,6 @@ jobs:
9157

9258
docs-build:
9359
runs-on: ${{ matrix.os }}
94-
needs: install
9560
strategy:
9661
matrix:
9762
os: [ubuntu-latest]
@@ -113,9 +78,6 @@ jobs:
11378
restore-keys: |
11479
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('docs/requirements.txt') }}-
11580
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-
116-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-
117-
${{ runner.os }}-pkg-deps-
118-
${{ runner.os }}-
11981
- name: Install dependencies
12082
run: |
12183
python -m pip install --upgrade pip

.github/workflows/release.yml

-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ jobs:
2121
key: ${{ runner.os }}-pkg-deps-${{ hashFiles('requirements.txt') }}-${{ hashFiles('**/*.py') }}
2222
restore-keys: |
2323
${{ runner.os }}-pkg-deps-${{ hashFiles('requirements.txt') }}-
24-
${{ runner.os }}-pkg-deps-
25-
${{ runner.os }}-
2624
- name: Install dependencies
2725
run: |
2826
python -m pip install --upgrade pip

.github/workflows/style.yml

-3
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,6 @@ jobs:
6666
key: ${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-${{ hashFiles('**/*.py') }}
6767
restore-keys: |
6868
${{ runner.os }}-pkg-deps-${{ matrix.python }}-${{ hashFiles('requirements.txt') }}-
69-
${{ runner.os }}-pkg-deps-${{ matrix.python }}-
70-
${{ runner.os }}-pkg-deps-
71-
${{ runner.os }}-
7269
- name: Install dependencies
7370
run: |
7471
python -m pip install --upgrade pip

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,6 @@ dmypy.json
130130
.pyre/
131131

132132
# Package version
133-
/torchscan/version.py
133+
torchscan/version.py
134134
# Conda distribution
135135
conda-dist/

.isort.cfg

-5
This file was deleted.

.pydocstyle

-3
This file was deleted.

mypy.ini

-5
This file was deleted.

setup.cfg

+89-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,90 @@
11
[metadata]
2-
description-file = README.md
3-
license_file = LICENSE
2+
author = François-Guillaume Fernandez
3+
author_email = [email protected]
4+
description = Useful information about your Pytorch module
5+
long_description = file: README.md
6+
long_description_content_type = text/markdown; charset=UTF-8
7+
url = https://github.com/frgfm/torch-scan
8+
download_url = https://github.com/frgfm/torch-scan/tags
9+
project_urls =
10+
Documentation = https://frgfm.github.io/torch-scan
11+
Source = https://github.com/frgfm/torch-scan
12+
Tracker = https://github.com/frgfm/torch-scan/issues
13+
license = Apache
14+
license_file = LICENSE
15+
keywords = pytorch, deep learning, summary, memory, ram
16+
classifiers =
17+
Development Status :: 4 - Beta
18+
Intended Audience :: Developers
19+
Intended Audience :: Science/Research
20+
License :: OSI Approved :: Apache Software License
21+
Natural Language :: English
22+
Operating System :: OS Independent
23+
Programming Language :: Python :: 3
24+
Programming Language :: Python :: 3.6
25+
Programming Language :: Python :: 3.7
26+
Programming Language :: Python :: 3.8
27+
Topic :: Scientific/Engineering
28+
Topic :: Scientific/Engineering :: Mathematics
29+
Topic :: Scientific/Engineering :: Artificial Intelligence
30+
31+
[options]
32+
zip_safe = True
33+
packages = find:
34+
include_package_data = True
35+
python_requires = >=3.6.0,<4
36+
install_requires =
37+
torch>=1.5.0
38+
39+
[options.package_data]
40+
* = LICENSE
41+
42+
[options.packages.find]
43+
exclude =
44+
tests*
45+
46+
[options.extras_require]
47+
test =
48+
pytest>=5.3.2
49+
coverage>=4.5.4
50+
quality =
51+
flake8>=3.9.0
52+
isort>=5.7.0
53+
mypy>=0.812
54+
pydocstyle>=6.0.0
55+
docs =
56+
sphinx<=3.4.3
57+
sphinx-rtd-theme==0.4.3
58+
sphinxemoji>=0.1.8
59+
sphinx-copybutton>=0.3.1
60+
docutils<0.18
61+
# cf. https://github.com/readthedocs/readthedocs.org/issues/9038
62+
Jinja2<3.1
63+
dev =
64+
%(test)s
65+
%(quality)s
66+
%(docs)s
67+
68+
[flake8]
69+
max-line-length = 120
70+
ignore = E402, E265, F403, W503, W504, E731
71+
exclude = .github, .git, venv*, docs, build
72+
per-file-ignores = **/__init__.py:F401
73+
74+
[mypy]
75+
files = torchscan/*.py
76+
show_error_codes = True
77+
pretty = True
78+
79+
[isort]
80+
line_length = 120
81+
src_paths = torchscan, tests
82+
skip_glob = **/__init__.py
83+
known_third_party = torch, torchvision
84+
85+
[pydocstyle]
86+
select = D300,D301,D417
87+
match = .*\.py
88+
89+
[coverage:run]
90+
source = torchscan

0 commit comments

Comments
 (0)