nab 0.0.1a0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- nab-0.0.1a0/LICENSE +21 -0
- nab-0.0.1a0/PKG-INFO +82 -0
- nab-0.0.1a0/README.md +52 -0
- nab-0.0.1a0/pyproject.toml +221 -0
- nab-0.0.1a0/src/nab/__init__.py +3 -0
- nab-0.0.1a0/src/nab/__main__.py +6 -0
- nab-0.0.1a0/src/nab/cli.py +10 -0
- nab-0.0.1a0/src/nab/py.typed +0 -0
nab-0.0.1a0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Damian Shaw
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
nab-0.0.1a0/PKG-INFO
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: nab
|
|
3
|
+
Version: 0.0.1a0
|
|
4
|
+
Summary: PubGrub-based dependency resolver for Python packages
|
|
5
|
+
Project-URL: Homepage, https://github.com/notatallshaw/nab
|
|
6
|
+
Project-URL: Documentation, https://nab.readthedocs.io/
|
|
7
|
+
Project-URL: Issues, https://github.com/notatallshaw/nab/issues
|
|
8
|
+
Project-URL: Source, https://github.com/notatallshaw/nab
|
|
9
|
+
Project-URL: Changelog, https://github.com/notatallshaw/nab/blob/main/CHANGELOG.md
|
|
10
|
+
Author-email: Damian Shaw <damian.peter.shaw@gmail.com>
|
|
11
|
+
License-Expression: MIT
|
|
12
|
+
License-File: LICENSE
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Typing :: Typed
|
|
20
|
+
Requires-Python: >=3.10
|
|
21
|
+
Requires-Dist: nab-index==0.0.1a0
|
|
22
|
+
Requires-Dist: nab-python==0.0.1a0
|
|
23
|
+
Requires-Dist: nab-resolver==0.0.1a0
|
|
24
|
+
Requires-Dist: tyro>=1.0
|
|
25
|
+
Provides-Extra: httpx
|
|
26
|
+
Requires-Dist: nab-index[httpx]==0.0.1a0; extra == 'httpx'
|
|
27
|
+
Provides-Extra: niquests
|
|
28
|
+
Requires-Dist: nab-index[niquests]==0.0.1a0; extra == 'niquests'
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
|
|
31
|
+
# nab
|
|
32
|
+
|
|
33
|
+
Experimental PubGrub-based dependency resolver for Python packages.
|
|
34
|
+
|
|
35
|
+
`nab` reads a `pyproject.toml`, resolves the dependency tree, and
|
|
36
|
+
writes a pinned set of versions or a PEP 751 lockfile. It does not
|
|
37
|
+
install. Hand the lockfile to whatever installer you trust.
|
|
38
|
+
|
|
39
|
+
## Install
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
uv tool install nab
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`pipx install nab` is equivalent. See
|
|
46
|
+
[installation](docs/guides/installation.md) for HTTP backend choices,
|
|
47
|
+
throw-away invocations (`uvx nab`, `pipx run nab`), and a development
|
|
48
|
+
checkout.
|
|
49
|
+
|
|
50
|
+
## Quick start
|
|
51
|
+
|
|
52
|
+
```toml
|
|
53
|
+
# pyproject.toml
|
|
54
|
+
[project]
|
|
55
|
+
name = "example"
|
|
56
|
+
version = "0.1.0"
|
|
57
|
+
dependencies = [
|
|
58
|
+
"starlette<=0.36.0",
|
|
59
|
+
"fastapi<=0.115.2",
|
|
60
|
+
]
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
nab lock pyproject.toml
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Writes `pylock.toml` next to the project. For a sorted
|
|
68
|
+
`name==version` list instead, use
|
|
69
|
+
`nab lock --format requirements-without-hashes --output -`.
|
|
70
|
+
|
|
71
|
+
## Documentation
|
|
72
|
+
|
|
73
|
+
* [Getting started](docs/guides/getting-started.md)
|
|
74
|
+
* [Configuration](docs/guides/configuration.md)
|
|
75
|
+
* [CLI](docs/guides/cli.md)
|
|
76
|
+
* [Lockfile](docs/guides/lockfile.md)
|
|
77
|
+
* [Build policy](docs/guides/build-policy.md)
|
|
78
|
+
* [Local sources](docs/guides/local-sources.md)
|
|
79
|
+
* [VCS dependencies](docs/guides/vcs.md)
|
|
80
|
+
* [Multi-index routing](docs/guides/multi-index.md) (experimental)
|
|
81
|
+
* [Workspaces](docs/guides/workspaces.md) (experimental)
|
|
82
|
+
* [Universal resolution](docs/guides/universal.md) (experimental)
|
nab-0.0.1a0/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# nab
|
|
2
|
+
|
|
3
|
+
Experimental PubGrub-based dependency resolver for Python packages.
|
|
4
|
+
|
|
5
|
+
`nab` reads a `pyproject.toml`, resolves the dependency tree, and
|
|
6
|
+
writes a pinned set of versions or a PEP 751 lockfile. It does not
|
|
7
|
+
install. Hand the lockfile to whatever installer you trust.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uv tool install nab
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
`pipx install nab` is equivalent. See
|
|
16
|
+
[installation](docs/guides/installation.md) for HTTP backend choices,
|
|
17
|
+
throw-away invocations (`uvx nab`, `pipx run nab`), and a development
|
|
18
|
+
checkout.
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
```toml
|
|
23
|
+
# pyproject.toml
|
|
24
|
+
[project]
|
|
25
|
+
name = "example"
|
|
26
|
+
version = "0.1.0"
|
|
27
|
+
dependencies = [
|
|
28
|
+
"starlette<=0.36.0",
|
|
29
|
+
"fastapi<=0.115.2",
|
|
30
|
+
]
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
nab lock pyproject.toml
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Writes `pylock.toml` next to the project. For a sorted
|
|
38
|
+
`name==version` list instead, use
|
|
39
|
+
`nab lock --format requirements-without-hashes --output -`.
|
|
40
|
+
|
|
41
|
+
## Documentation
|
|
42
|
+
|
|
43
|
+
* [Getting started](docs/guides/getting-started.md)
|
|
44
|
+
* [Configuration](docs/guides/configuration.md)
|
|
45
|
+
* [CLI](docs/guides/cli.md)
|
|
46
|
+
* [Lockfile](docs/guides/lockfile.md)
|
|
47
|
+
* [Build policy](docs/guides/build-policy.md)
|
|
48
|
+
* [Local sources](docs/guides/local-sources.md)
|
|
49
|
+
* [VCS dependencies](docs/guides/vcs.md)
|
|
50
|
+
* [Multi-index routing](docs/guides/multi-index.md) (experimental)
|
|
51
|
+
* [Workspaces](docs/guides/workspaces.md) (experimental)
|
|
52
|
+
* [Universal resolution](docs/guides/universal.md) (experimental)
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "nab"
|
|
3
|
+
version = "0.0.1a0"
|
|
4
|
+
description = "PubGrub-based dependency resolver for Python packages"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
license-files = ["LICENSE"]
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "Damian Shaw", email = "damian.peter.shaw@gmail.com" },
|
|
10
|
+
]
|
|
11
|
+
requires-python = ">=3.10"
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 4 - Beta",
|
|
14
|
+
"Programming Language :: Python :: 3",
|
|
15
|
+
"Programming Language :: Python :: 3.10",
|
|
16
|
+
"Programming Language :: Python :: 3.11",
|
|
17
|
+
"Programming Language :: Python :: 3.12",
|
|
18
|
+
"Programming Language :: Python :: 3.13",
|
|
19
|
+
"Typing :: Typed",
|
|
20
|
+
]
|
|
21
|
+
dependencies = [
|
|
22
|
+
"nab-resolver==0.0.1a0",
|
|
23
|
+
"nab-python==0.0.1a0",
|
|
24
|
+
"nab-index==0.0.1a0",
|
|
25
|
+
"tyro>=1.0",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.optional-dependencies]
|
|
29
|
+
httpx = ["nab-index[httpx]==0.0.1a0"]
|
|
30
|
+
niquests = ["nab-index[niquests]==0.0.1a0"]
|
|
31
|
+
|
|
32
|
+
[project.urls]
|
|
33
|
+
Homepage = "https://github.com/notatallshaw/nab"
|
|
34
|
+
Documentation = "https://nab.readthedocs.io/"
|
|
35
|
+
Issues = "https://github.com/notatallshaw/nab/issues"
|
|
36
|
+
Source = "https://github.com/notatallshaw/nab"
|
|
37
|
+
Changelog = "https://github.com/notatallshaw/nab/blob/main/CHANGELOG.md"
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
nab = "nab.cli:main"
|
|
41
|
+
|
|
42
|
+
[build-system]
|
|
43
|
+
requires = ["hatchling"]
|
|
44
|
+
build-backend = "hatchling.build"
|
|
45
|
+
|
|
46
|
+
# https://docs.pytest.org/en/stable/reference/reference.html#confval-addopts
|
|
47
|
+
[tool.pytest.ini_options]
|
|
48
|
+
minversion = "9.0"
|
|
49
|
+
addopts = [
|
|
50
|
+
"-ra",
|
|
51
|
+
"--strict-markers",
|
|
52
|
+
"--strict-config",
|
|
53
|
+
"--import-mode=importlib",
|
|
54
|
+
"--showlocals",
|
|
55
|
+
"-m",
|
|
56
|
+
"not property and not crosshair and not network",
|
|
57
|
+
]
|
|
58
|
+
testpaths = [
|
|
59
|
+
"nab-resolver/tests",
|
|
60
|
+
"nab-python/tests",
|
|
61
|
+
"tests",
|
|
62
|
+
]
|
|
63
|
+
xfail_strict = true
|
|
64
|
+
filterwarnings = ["error"]
|
|
65
|
+
markers = [
|
|
66
|
+
"slow: scenarios that take more than a second",
|
|
67
|
+
"network: hits a real network endpoint (skipped by default in CI)",
|
|
68
|
+
"property: Hypothesis property tests (opt-in; run with -m property)",
|
|
69
|
+
"crosshair: CrossHair-backed property tests (opt-in; very slow; -m crosshair)",
|
|
70
|
+
]
|
|
71
|
+
|
|
72
|
+
# https://coverage.readthedocs.io/en/latest/config.html#run
|
|
73
|
+
[tool.coverage.run]
|
|
74
|
+
branch = true
|
|
75
|
+
relative_files = true
|
|
76
|
+
parallel = true
|
|
77
|
+
concurrency = ["thread", "multiprocessing"]
|
|
78
|
+
sigterm = true
|
|
79
|
+
source_pkgs = [
|
|
80
|
+
"nab_resolver",
|
|
81
|
+
"nab_python",
|
|
82
|
+
"nab",
|
|
83
|
+
]
|
|
84
|
+
source = []
|
|
85
|
+
omit = [
|
|
86
|
+
"*/tests/property/*",
|
|
87
|
+
"*/tests/property_python/*",
|
|
88
|
+
"*/tests/universal/property_universal/*",
|
|
89
|
+
"*/test_crosshair_*.py",
|
|
90
|
+
"*/_vendor/*",
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
# https://coverage.readthedocs.io/en/latest/config.html#report
|
|
94
|
+
[tool.coverage.report]
|
|
95
|
+
fail_under = 100
|
|
96
|
+
show_missing = true
|
|
97
|
+
skip_covered = true
|
|
98
|
+
skip_empty = true
|
|
99
|
+
exclude_also = [
|
|
100
|
+
"def __repr__",
|
|
101
|
+
"raise NotImplementedError",
|
|
102
|
+
"raise RuntimeError.*unreachable",
|
|
103
|
+
"if __name__ == .__main__.:",
|
|
104
|
+
"class .*\\bProtocol\\):",
|
|
105
|
+
"@(abc\\.)?abstractmethod",
|
|
106
|
+
"^\\s+pass$",
|
|
107
|
+
"if TYPE_CHECKING:",
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
# https://coverage.readthedocs.io/en/latest/config.html#paths
|
|
111
|
+
[tool.coverage.paths]
|
|
112
|
+
nab_resolver = [
|
|
113
|
+
"nab-resolver/src/nab_resolver",
|
|
114
|
+
"*/nab_resolver",
|
|
115
|
+
]
|
|
116
|
+
nab_python = [
|
|
117
|
+
"nab-python/src/nab_python",
|
|
118
|
+
"*/nab_python",
|
|
119
|
+
]
|
|
120
|
+
nab = [
|
|
121
|
+
"src/nab",
|
|
122
|
+
"*/nab",
|
|
123
|
+
]
|
|
124
|
+
|
|
125
|
+
# https://docs.astral.sh/ruff/settings/
|
|
126
|
+
[tool.ruff]
|
|
127
|
+
target-version = "py310"
|
|
128
|
+
extend-exclude = ["**/_vendor/**"]
|
|
129
|
+
|
|
130
|
+
# https://docs.astral.sh/ruff/settings/#lint_per-file-ignores
|
|
131
|
+
[tool.ruff.lint.per-file-ignores]
|
|
132
|
+
|
|
133
|
+
# Benchmarks intentionally print, lack docstrings, run subprocesses, and
|
|
134
|
+
# carry many scenario knobs.
|
|
135
|
+
"**/benchmarks/**" = [
|
|
136
|
+
"T201", # Print statements (benchmark output)
|
|
137
|
+
"D103", # Missing docstring in public function
|
|
138
|
+
"INP001", # Implicit namespace package (scripts live outside packages)
|
|
139
|
+
"S607", # subprocess with partial executable path
|
|
140
|
+
"BLE001", # Blind exception catch (surface every failure mode)
|
|
141
|
+
"C901", # mccabe complexity (scenario knobs add branches)
|
|
142
|
+
"PLR0912", # Too many branches (same reason as C901)
|
|
143
|
+
"PLR0915", # Too many statements (long main()s)
|
|
144
|
+
"PLR2004", # Magic value in comparison (benchmark thresholds)
|
|
145
|
+
"SLF001", # Private member access (sibling scripts share helpers)
|
|
146
|
+
"N818", # Exception name not Error-suffixed (private signal types)
|
|
147
|
+
]
|
|
148
|
+
|
|
149
|
+
# Tests use their own per-directory ruff.toml that extends this config.
|
|
150
|
+
# See tests/ruff.toml and the per-package tests/ruff.toml files.
|
|
151
|
+
|
|
152
|
+
# docs/conf.py sits outside any Python package by Sphinx convention.
|
|
153
|
+
"docs/conf.py" = ["INP001"]
|
|
154
|
+
|
|
155
|
+
# Subpackages defer imports to break cycles with their parent modules.
|
|
156
|
+
"nab-python/src/nab_python/_pypi/*.py" = ["PLC0415"]
|
|
157
|
+
"nab-python/src/nab_python/_build/*.py" = ["PLC0415"]
|
|
158
|
+
"nab-python/src/nab_python/_lockfile/*.py" = ["PLC0415"]
|
|
159
|
+
|
|
160
|
+
# https://docs.astral.sh/ruff/settings/#lint
|
|
161
|
+
[tool.ruff.lint]
|
|
162
|
+
select = ["ALL"]
|
|
163
|
+
ignore = [
|
|
164
|
+
# Frameworks we don't use.
|
|
165
|
+
"AIR", # Airflow
|
|
166
|
+
"DJ", # Django
|
|
167
|
+
"FAST", # FastAPI
|
|
168
|
+
"NPY", # NumPy
|
|
169
|
+
"PD", # Pandas
|
|
170
|
+
|
|
171
|
+
# Conflicts with the formatter.
|
|
172
|
+
"COM812", # Trailing comma
|
|
173
|
+
"COM819", # Prohibited trailing comma
|
|
174
|
+
"ISC001", # Implicit string concatenation (single line)
|
|
175
|
+
"ISC002", # Implicit string concatenation (multi-line)
|
|
176
|
+
|
|
177
|
+
# Mutually-exclusive pairs; pick one of each.
|
|
178
|
+
"D203", # one-blank-line-before-class (we use D211)
|
|
179
|
+
"D212", # multi-line-summary-first-line (we use D213)
|
|
180
|
+
|
|
181
|
+
# Individual rules.
|
|
182
|
+
"ANN401", # Disallows Any (needed for generic library)
|
|
183
|
+
"S101", # Assert usage (needed for type narrowing and tests)
|
|
184
|
+
"TID252", # Bans relative imports; the project prefers them.
|
|
185
|
+
]
|
|
186
|
+
|
|
187
|
+
# https://docs.astral.sh/ruff/settings/#lintpylint
|
|
188
|
+
[tool.ruff.lint.pylint]
|
|
189
|
+
max-args = 8
|
|
190
|
+
|
|
191
|
+
# https://docs.astral.sh/ruff/settings/#lintpydocstyle
|
|
192
|
+
[tool.ruff.lint.pydocstyle]
|
|
193
|
+
convention = "pep257"
|
|
194
|
+
|
|
195
|
+
# https://docs.astral.sh/ruff/settings/#lintisort
|
|
196
|
+
[tool.ruff.lint.isort]
|
|
197
|
+
known-first-party = ["nab", "nab_index", "nab_python", "nab_resolver"]
|
|
198
|
+
|
|
199
|
+
# https://microsoft.github.io/pyright/#/configuration?id=main-pyright-settings
|
|
200
|
+
[tool.pyright]
|
|
201
|
+
pythonVersion = "3.10"
|
|
202
|
+
typeCheckingMode = "standard"
|
|
203
|
+
include = [
|
|
204
|
+
"nab-resolver/src",
|
|
205
|
+
"nab-resolver/tests",
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
# https://mypy.readthedocs.io/en/stable/config_file.html#using-a-pyproject-toml-file
|
|
209
|
+
[tool.mypy]
|
|
210
|
+
python_version = "3.10"
|
|
211
|
+
strict = true
|
|
212
|
+
namespace_packages = true
|
|
213
|
+
explicit_package_bases = true
|
|
214
|
+
mypy_path = ["nab-resolver/src"]
|
|
215
|
+
enable_error_code = [
|
|
216
|
+
"redundant-expr",
|
|
217
|
+
"truthy-bool",
|
|
218
|
+
"possibly-undefined",
|
|
219
|
+
"explicit-override",
|
|
220
|
+
"mutable-override",
|
|
221
|
+
]
|
|
File without changes
|