nmk-python 1.7.0__py3-none-any.whl → 1.8.1__py3-none-any.whl

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.
@@ -4,7 +4,9 @@ Python build backend definition module
4
4
 
5
5
  from abc import ABC, abstractmethod
6
6
  from pathlib import Path
7
+ from typing import cast
7
8
 
9
+ from nmk._internal.envbackend_legacy import EnvBackend # For type hinting
8
10
  from nmk.model.model import NmkModel
9
11
 
10
12
 
@@ -17,7 +19,7 @@ class PythonBuildBackend(ABC):
17
19
 
18
20
  def __init__(self, model: NmkModel):
19
21
  self._model = model
20
- self._env_backend = model.env_backend
22
+ self._env_backend = cast(EnvBackend, model.env_backend) # type: ignore
21
23
 
22
24
  @abstractmethod
23
25
  def install_editable(self): # pragma: no cover
@@ -45,10 +47,10 @@ class PythonBuildBackend(ABC):
45
47
  pass
46
48
 
47
49
  @abstractmethod
48
- def uninstall_wheel(self, wheel_name: str): # pragma: no cover
50
+ def uninstall_wheels(self, wheel_names: list[str]): # pragma: no cover
49
51
  """
50
- Uninstall specified wheel
52
+ Uninstall specified wheels
51
53
 
52
- :param wheel_name: name of the wheel to uninstall
54
+ :param wheel_names: names of the wheels to uninstall
53
55
  """
54
56
  pass
@@ -45,9 +45,9 @@ class PipBuildBackend(PythonBuildBackend):
45
45
  # Return built wheel path
46
46
  return build_dir / "dist" / built_wheel_name
47
47
 
48
- def uninstall_wheel(self, wheel_name: str):
48
+ def uninstall_wheels(self, wheel_names: list[str]):
49
49
  # Prepare uninstall args
50
- uninstall_args = ["uninstall", "--yes", wheel_name]
50
+ uninstall_args = ["uninstall", "--yes"] + wheel_names
51
51
 
52
52
  # Delegate to subprocess
53
53
  self._env_backend.subprocess(uninstall_args, cwd=self._env_backend.project_path)
@@ -51,6 +51,6 @@ class UvBuildBackend(PythonBuildBackend):
51
51
  # Return built wheel path
52
52
  return build_dir / wheel_sub_dir / built_wheel_name
53
53
 
54
- def uninstall_wheel(self, wheel_name: str):
54
+ def uninstall_wheels(self, wheel_names: list[str]):
55
55
  # Same as setup
56
56
  self._env_backend.upgrade(full=False, only_deps=True)
nmk_python/build.py CHANGED
@@ -2,14 +2,21 @@
2
2
  Python package build module
3
3
  """
4
4
 
5
+ import importlib.metadata
6
+ import json
5
7
  import shutil
8
+ from fnmatch import fnmatch
9
+ from itertools import product
6
10
  from pathlib import Path
11
+ from typing import cast
7
12
 
13
+ from nmk._internal.envbackend_legacy import EnvBackend # For type hinting
8
14
  from nmk.logs import NmkLogWrapper
9
15
  from nmk.model.builder import NmkTaskBuilder
10
16
  from nmk.model.model import NmkModel
11
17
  from nmk.model.resolver import NmkDictConfigResolver, NmkListConfigResolver, NmkStrConfigResolver
12
18
  from nmk.utils import is_windows
19
+ from packaging.requirements import Requirement
13
20
 
14
21
  from nmk_python.backends.factory import BuildBackendFactory
15
22
 
@@ -131,9 +138,10 @@ class Installer(NmkTaskBuilder):
131
138
  # Check if wheel can be installed
132
139
  if _can_install(name, self.logger):
133
140
  # Delegate to build backend
134
- old_packages = self.model.env_backend.installed_packages
141
+ eb = cast(EnvBackend, self.model.env_backend) # type: ignore
142
+ old_packages = eb.installed_packages
135
143
  BuildBackendFactory.create(self.model).install_wheel(wheel_path=Path(wheel))
136
- self.model.env_backend.print_updates(old_packages)
144
+ eb.print_updates(old_packages)
137
145
 
138
146
  # Remove stamp file
139
147
  Path(to_remove).unlink(missing_ok=True)
@@ -144,19 +152,28 @@ class Uninstaller(NmkTaskBuilder):
144
152
  Uninstall current project wheel from venv
145
153
  """
146
154
 
147
- def build(self, name: str): # pyright: ignore[reportIncompatibleMethodOverride]
155
+ def build(self, name: str, local_deps: list[str] | None = None): # pyright: ignore[reportIncompatibleMethodOverride]
148
156
  """
149
157
  Uninstall wheel from venv
150
158
 
151
159
  Note that task won't fail if the wheel is not installed
152
160
 
153
161
  :param name: wheel name to be uninstalled
162
+ :param local_deps: list of workspace local dependencies patterns, used to find additional wheels to uninstall
154
163
  """
155
164
 
165
+ # Find local deps to uninstall, from provided packages
166
+ wheel_names = set([name])
167
+ eb = cast(EnvBackend, self.model.env_backend) # type: ignore
168
+ old_packages = eb.installed_packages
169
+ for pattern, dep_name in product(local_deps if local_deps else [], old_packages.keys()):
170
+ if fnmatch(dep_name, pattern):
171
+ self.logger.debug(f"wheel name '{dep_name}' matches local dependency pattern '{pattern}', will be uninstalled")
172
+ wheel_names.add(dep_name)
173
+
156
174
  # Delegate to build backend
157
- old_packages = self.model.env_backend.installed_packages
158
- BuildBackendFactory.create(self.model).uninstall_wheel(wheel_name=name)
159
- self.model.env_backend.print_updates(old_packages)
175
+ BuildBackendFactory.create(self.model).uninstall_wheels(wheel_names=sorted(list(wheel_names)))
176
+ eb.print_updates(old_packages)
160
177
 
161
178
 
162
179
  class EditableBuilder(NmkTaskBuilder):
@@ -174,9 +191,10 @@ class EditableBuilder(NmkTaskBuilder):
174
191
  # Check if project can be installed in editable mode
175
192
  if _can_install(_python_package(self.model), self.logger):
176
193
  # Delegate to build backend
177
- old_packages = self.model.env_backend.installed_packages
194
+ eb = cast(EnvBackend, self.model.env_backend) # type: ignore
195
+ old_packages = eb.installed_packages
178
196
  BuildBackendFactory.create(self.model).install_editable()
179
- self.model.env_backend.print_updates(old_packages)
197
+ eb.print_updates(old_packages)
180
198
 
181
199
  # Touch stamp file
182
200
  self.main_output.touch()
@@ -223,3 +241,72 @@ class PythonArchiveDepsResolver(NmkDictConfigResolver):
223
241
  dep_name = dep.name.split("-")[0].replace("_", "-")
224
242
  out[dep_name] = str(dep.resolve()).replace("\\", "\\\\") # Escape backslashes for Windows paths
225
243
  return out
244
+
245
+
246
+ # Internal/external dependencies keys
247
+ _INTERNAL_DEPS_KEY = "internal"
248
+ _EXTERNAL_DEPS_KEY = "external"
249
+
250
+
251
+ class DepsMetadataBuilder(NmkTaskBuilder):
252
+ """
253
+ Generate python dependencies metadata file
254
+ """
255
+
256
+ def build(self, root_name: str, local_deps: list[str]): # pyright: ignore[reportIncompatibleMethodOverride]
257
+ """
258
+ Generate python dependencies metadata file
259
+
260
+ :param root_name: name of the root package
261
+ :param local_deps: list of workspace local dependencies patterns
262
+ """
263
+
264
+ # Normalization implementation
265
+ def normalize(name: str) -> str:
266
+ return name.lower().replace("_", "-")
267
+
268
+ # Prepare distributions map
269
+ distributions = {normalize(d.name): d for d in importlib.metadata.distributions()}
270
+ assert root_name in distributions, f"Root package '{root_name}' not found in installed distributions"
271
+ output_data: dict[str, dict[str, str]] = {_INTERNAL_DEPS_KEY: {}, _EXTERNAL_DEPS_KEY: {}}
272
+
273
+ # Visitor implementation
274
+ def visit(name: str):
275
+ # Already visited or unknown?
276
+ if (name in output_data[_INTERNAL_DEPS_KEY]) or (name in output_data[_EXTERNAL_DEPS_KEY]) or (name not in distributions):
277
+ return
278
+
279
+ # Check for internal/external dependency
280
+ if name != root_name:
281
+ if any(fnmatch(name, pattern) for pattern in local_deps):
282
+ # Internal dependency
283
+ output_data[_INTERNAL_DEPS_KEY][name] = distributions[name].version
284
+ else:
285
+ # External dependency
286
+ output_data[_EXTERNAL_DEPS_KEY][name] = distributions[name].version
287
+
288
+ # Visit dependencies
289
+ for dep in distributions[name].requires or []:
290
+ # Get requirement
291
+ req = Requirement(dep)
292
+
293
+ # Check marker, if any
294
+ if req.marker is not None and not req.marker.evaluate():
295
+ continue
296
+
297
+ # Visit dependency if installed
298
+ visit(normalize(req.name))
299
+
300
+ # Visit from root
301
+ visit(root_name)
302
+
303
+ # Write output metadata file
304
+ self.main_output.write_text(
305
+ json.dumps(
306
+ {
307
+ _EXTERNAL_DEPS_KEY: {k: output_data[_EXTERNAL_DEPS_KEY][k] for k in sorted(output_data[_EXTERNAL_DEPS_KEY])},
308
+ _INTERNAL_DEPS_KEY: {k: output_data[_INTERNAL_DEPS_KEY][k] for k in sorted(output_data[_INTERNAL_DEPS_KEY])},
309
+ },
310
+ indent=4,
311
+ )
312
+ )
nmk_python/build.yml CHANGED
@@ -1,171 +1,192 @@
1
1
  config:
2
-
3
- # Python package name (to be configured at project level)
4
- pythonPackage: ${projectName}
5
- pythonModule:
6
- __resolver__: nmk_python.build.PythonModuleResolver
7
-
8
- # Python artifacts directory
9
- pythonArtifacts: ${outputDir}/artifacts
10
-
11
- # Python build directory
12
- pythonBuildDir: ${outputDir}/python
13
-
14
- # Target platform for python project
15
- pythonPackagePlatform: any
16
-
17
- # Python source distribution + wheel artifacts
18
- pythonWheel: ${pythonArtifacts}/${pythonModule}-${pythonVersion}-py3-none-${pythonPackagePlatform}.whl
19
-
20
- # Add project file fragment for build config
21
- pythonProjectFileFragments:
22
- - ${BASEDIR}/templates/build.toml.jinja
23
-
24
- # Python optional deps (named groups of python package optional dependencies)
25
- pythonPackageOptionalRequirements: {}
26
-
27
- # Derived list of python dependencies from the dependency groups
28
- pythonPackageOptionalRequirementsList:
29
- __resolver__: nmk_python.build.PythonOptionalDepsResolver
30
- params:
31
- groups: ${pythonPackageOptionalRequirements}
32
- pythonProjectFileItems:
33
- project:
34
- optional-dependencies: ${pythonPackageOptionalRequirements}
35
-
36
- # Python package dependencies
37
- pythonPackageRequirements: []
38
-
39
- # Python development dependencies
40
- pythonDevRequirements:
41
- __resolver__: nmk_python.build.PythonDevDepsResolver
42
- params:
43
- package_deps: ${pythonPackageRequirements}
44
- all_deps: ${venvPkgDeps}
45
-
46
- # Archive related requirements
47
- pythonArchiveRequirements:
48
- __resolver__: nmk_python.build.PythonArchiveDepsResolver
49
- params:
50
- archives: ${venvArchiveDeps}
51
-
52
- # Also install in venv all dependencies
53
- venvPkgDeps:
54
- - ${pythonPackageRequirements}
55
- - ${pythonPackageOptionalRequirementsList}
56
-
57
- # Extra (external) resources to be bundled in built python wheel
58
- pythonExtraResources: {}
59
-
60
- # Python editable install stamp
61
- pythonEditableStamp: ${outputDir}/.pyeditable
62
-
63
- # Python files to be ignored
64
- gitIgnoredFiles:
65
- - .eggs/
66
- - "*.egg-info/"
67
- - "*.pyc"
68
- - __pycache__
69
-
70
- # Additional github publish step: publish on pypi.org
71
- githubPublishSteps:
72
- - name: Publish package on pypi.org
73
- uses: pypa/gh-action-pypi-publish@v1.13.0
74
- with:
75
- user: __token__
76
- password: ${{ secrets.pypi_password }}
77
- packages_dir: ${r!pythonArtifacts}
78
-
79
- # Wheel install arguments (for pip backend)
80
- pythonWheelPipInstallArgs:
81
- - --force-reinstall # force reinstall because otherwise install will be skipped if version didn't changed
82
- - --no-deps # but skip dependencies to avoid reinstalling everything (deps are already installed by py.venv task)
83
-
84
- # Editable install arguments (for pip backend)
85
- pythonEditablePipInstallArgs:
86
- - --no-deps # skip dependencies to avoid reinstalling everything
87
- - --no-build-isolation # disable dependencies install when building for "editable" mode
88
-
89
- # Wheel install arguments (for uv backend)
90
- pythonWheelUvInstallArgs: []
91
-
92
- # Editable install arguments (for uv backend)
93
- pythonEditableUvInstallArgs: []
94
-
95
- # Type checking mode for Pyright; may be off, basic, standard, strict
96
- pythonTypeCheckingMode: strict
97
-
98
- # Excluded modules for wheel build
99
- pythonBuildExcludedModules: []
2
+ # Python package name (to be configured at project level)
3
+ pythonPackage: ${projectName}
4
+ pythonModule:
5
+ __resolver__: nmk_python.build.PythonModuleResolver
6
+
7
+ # Python artifacts directory
8
+ pythonArtifacts: ${outputDir}/artifacts
9
+
10
+ # Python build directory
11
+ pythonBuildDir: ${outputDir}/python
12
+
13
+ # Target platform for python project
14
+ pythonPackagePlatform: any
15
+
16
+ # Python source distribution + wheel artifacts
17
+ pythonWheel: ${pythonArtifacts}/${pythonModule}-${pythonVersion}-py3-none-${pythonPackagePlatform}.whl
18
+
19
+ # Add project file fragment for build config
20
+ pythonProjectFileFragments:
21
+ - ${BASEDIR}/templates/build.toml.jinja
22
+
23
+ # Python optional deps (named groups of python package optional dependencies)
24
+ pythonPackageOptionalRequirements: {}
25
+
26
+ # Derived list of python dependencies from the dependency groups
27
+ pythonPackageOptionalRequirementsList:
28
+ __resolver__: nmk_python.build.PythonOptionalDepsResolver
29
+ params:
30
+ groups: ${pythonPackageOptionalRequirements}
31
+ pythonProjectFileItems:
32
+ project:
33
+ optional-dependencies: ${pythonPackageOptionalRequirements}
34
+
35
+ # Python package dependencies
36
+ pythonPackageRequirements: []
37
+
38
+ # Python development dependencies
39
+ pythonDevRequirements:
40
+ __resolver__: nmk_python.build.PythonDevDepsResolver
41
+ params:
42
+ package_deps: ${pythonPackageRequirements}
43
+ all_deps: ${venvPkgDeps}
44
+
45
+ # Archive related requirements
46
+ pythonArchiveRequirements:
47
+ __resolver__: nmk_python.build.PythonArchiveDepsResolver
48
+ params:
49
+ archives: ${venvArchiveDeps}
50
+
51
+ # Also install in venv all dependencies
52
+ venvPkgDeps:
53
+ - ${pythonPackageRequirements}
54
+ - ${pythonPackageOptionalRequirementsList}
55
+
56
+ # Extra (external) resources to be bundled in built python wheel
57
+ pythonExtraResources: {}
58
+
59
+ # Python editable install stamp
60
+ pythonEditableStamp: ${outputDir}/.pyeditable
61
+
62
+ # Python files to be ignored
63
+ gitIgnoredFiles:
64
+ - .eggs/
65
+ - "*.egg-info/"
66
+ - "*.pyc"
67
+ - __pycache__
68
+
69
+ # Additional github publish step: publish on pypi.org
70
+ githubPublishSteps:
71
+ - name: Publish package on pypi.org
72
+ uses: pypa/gh-action-pypi-publish@v1.13.0
73
+ with:
74
+ user: __token__
75
+ password: ${{ secrets.pypi_password }}
76
+ packages_dir: ${r!pythonArtifacts}
77
+
78
+ # Wheel install arguments (for pip backend)
79
+ pythonWheelPipInstallArgs:
80
+ - --force-reinstall # force reinstall because otherwise install will be skipped if version didn't changed
81
+ - --no-deps # but skip dependencies to avoid reinstalling everything (deps are already installed by py.venv task)
82
+
83
+ # Editable install arguments (for pip backend)
84
+ pythonEditablePipInstallArgs:
85
+ - --no-deps # skip dependencies to avoid reinstalling everything
86
+ - --no-build-isolation # disable dependencies install when building for "editable" mode
87
+
88
+ # Wheel install arguments (for uv backend)
89
+ pythonWheelUvInstallArgs: []
90
+
91
+ # Editable install arguments (for uv backend)
92
+ pythonEditableUvInstallArgs: []
93
+
94
+ # Type checking mode for Pyright; may be off, basic, standard, strict
95
+ pythonTypeCheckingMode: strict
96
+
97
+ # Excluded modules for wheel build
98
+ pythonBuildExcludedModules: []
99
+
100
+ # Workspace local dependencies patterns
101
+ pythonLocalDepsPatterns: []
102
+
103
+ # Generated python dependencies metadata file
104
+ pythonDepsMetadata: ${outputDir}/python_deps.json
100
105
 
101
106
  tasks:
102
-
103
- # Python editable install
104
- py.editable:
105
- description: Install python editable package
106
- emoji: ":snake:.:house:"
107
- deps:
108
- - py.project
109
- - py.format
110
- - py.analyze
111
- appendToDeps: build
112
- if: ${pythonSrcFiles} # Only if python source files are found
113
- output:
114
- - ${pythonEditableStamp}
115
- input:
116
- - ${pythonProjectFile}
117
- builder: nmk_python.build.EditableBuilder
118
-
119
-
120
- # Python wheel build
121
- py.build:
122
- description: Build python wheel
123
- emoji: ":snake:.:hammer:"
124
- deps:
125
- - py.project
126
- - py.format
127
- - py.analyze
128
- appendToDeps: package
129
- if: ${pythonSrcFiles} # Only if python source files are found
130
- output:
131
- - ${pythonWheel}
132
- input:
133
- - ${pythonSrcFiles}
134
- - ${pythonProjectFile}
135
- builder: nmk_python.build.PackageBuilder
136
- params:
137
- project_file: ${pythonProjectFile}
138
- version_file: ${pythonVersionStamp}
139
- source_dirs: ${pythonSrcFolders}
140
- artifacts_dir: ${pythonArtifacts}
141
- build_dir: ${pythonBuildDir}
142
- extra_resources: ${pythonExtraResources}
143
-
144
- # Python wheel install
145
- py.install:
146
- description: Install python wheel
147
- emoji: ":snake:.:inbox_tray:"
148
- deps:
149
- - py.build
150
- appendToDeps: install
151
- if: ${pythonSrcFiles} # Only if python source files are found
152
- input: ${pythonWheel}
153
- output:
154
- - ${ROOTDIR}/${venvName}
155
- - ${venvState}
156
- builder: nmk_python.build.Installer
157
- params:
158
- name: ${pythonPackage}
159
- wheel: ${pythonWheel}
160
- to_remove: ${pythonEditableStamp}
161
-
162
- # Python module clean
163
- py.uninstall:
164
- description: Uninstall python package
165
- emoji: ":broom:.:snake:"
166
- appendToDeps:
167
- - clean
168
- builder: nmk_python.build.Uninstaller
169
- params:
170
- name: ${pythonPackage}
171
- if: ${pythonSrcFiles} # Only if python source files are found
107
+ # Python editable install
108
+ py.editable:
109
+ description: Install python editable package
110
+ emoji: ":snake:.:house:"
111
+ deps:
112
+ - py.project
113
+ - py.format
114
+ - py.analyze
115
+ appendToDeps: build
116
+ if: ${pythonSrcFiles} # Only if python source files are found
117
+ output:
118
+ - ${pythonEditableStamp}
119
+ input:
120
+ - ${pythonProjectFile}
121
+ builder: nmk_python.build.EditableBuilder
122
+
123
+ # Python dependencies metadata
124
+ py.deps:
125
+ description: Gather python dependencies metadata
126
+ emoji: ":snake:.:link:"
127
+ deps:
128
+ - py.editable
129
+ appendToDeps: build
130
+ if: ${pythonSrcFiles} # Only if python source files are found
131
+ output:
132
+ - ${pythonDepsMetadata}
133
+ input:
134
+ - ${pythonProjectFile}
135
+ builder: nmk_python.build.DepsMetadataBuilder
136
+ params:
137
+ root_name: ${pythonPackage}
138
+ local_deps: ${pythonLocalDepsPatterns}
139
+
140
+ # Python wheel build
141
+ py.build:
142
+ description: Build python wheel
143
+ emoji: ":snake:.:hammer:"
144
+ deps:
145
+ - py.project
146
+ - py.format
147
+ - py.analyze
148
+ appendToDeps: package
149
+ if: ${pythonSrcFiles} # Only if python source files are found
150
+ output:
151
+ - ${pythonWheel}
152
+ input:
153
+ - ${pythonSrcFiles}
154
+ - ${pythonProjectFile}
155
+ builder: nmk_python.build.PackageBuilder
156
+ params:
157
+ project_file: ${pythonProjectFile}
158
+ version_file: ${pythonVersionStamp}
159
+ source_dirs: ${pythonSrcFolders}
160
+ artifacts_dir: ${pythonArtifacts}
161
+ build_dir: ${pythonBuildDir}
162
+ extra_resources: ${pythonExtraResources}
163
+
164
+ # Python wheel install
165
+ py.install:
166
+ description: Install python wheel
167
+ emoji: ":snake:.:inbox_tray:"
168
+ deps:
169
+ - py.build
170
+ appendToDeps: install
171
+ if: ${pythonSrcFiles} # Only if python source files are found
172
+ input: ${pythonWheel}
173
+ output:
174
+ - ${ROOTDIR}/${venvName}
175
+ - ${venvState}
176
+ builder: nmk_python.build.Installer
177
+ params:
178
+ name: ${pythonPackage}
179
+ wheel: ${pythonWheel}
180
+ to_remove: ${pythonEditableStamp}
181
+
182
+ # Python module clean
183
+ py.uninstall:
184
+ description: Uninstall python package and local dependencies
185
+ emoji: ":broom:.:snake:"
186
+ appendToDeps:
187
+ - clean
188
+ builder: nmk_python.build.Uninstaller
189
+ params:
190
+ name: ${pythonPackage}
191
+ local_deps: ${pythonLocalDepsPatterns}
192
+ if: ${pythonSrcFiles} # Only if python source files are found
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nmk-python
3
- Version: 1.7.0
3
+ Version: 1.8.1
4
4
  Summary: Python plugin for nmk build system
5
5
  Author: The dynod project
6
6
  Maintainer: The dynod project
@@ -1,7 +1,7 @@
1
1
  nmk_python/__init__.py,sha256=EouCWXbAeObby1vOCx0Vx_WaGC2fEEFDMCen3JZt4TU,446
2
2
  nmk_python/badges.yml,sha256=LzElZecCXKxdF-oPkvIwfnbQlOcAM_zUj6MelClmAug,749
3
- nmk_python/build.py,sha256=gxyDjQdbwcxSk2INF7gnMqWRaa9G8gtrSsqWbgM-Uqg,8558
4
- nmk_python/build.yml,sha256=CDGwrg2KKgdP1uDozQZIVaolxyEWKkb2ETbz0kBRkIQ,5544
3
+ nmk_python/build.py,sha256=KlAeOvwcmbF-PEC-baWQQXa2Vp2-PK_pNTazWNeTs9A,12082
4
+ nmk_python/build.yml,sha256=8CWVacVv3r3pbvuRkaLQbH1aTO-oK4U0hAO9SgDTfFA,5726
5
5
  nmk_python/doc.yml,sha256=12amAlYylH7JAHaqBIOoEZ_LrXY_bPNKuHrrwUkIj8w,932
6
6
  nmk_python/files.py,sha256=K6Y-XKXuf8jh4x333Qgj6G1MyB-BgZ5Kd2-XCZhsfR4,2000
7
7
  nmk_python/files.yml,sha256=jlp87gW9rTASUnsy7id7VWanaMUMN_py82bMa2adniM,813
@@ -14,18 +14,18 @@ nmk_python/tests.yml,sha256=Sg6ZezkBVuvOzh-4QbJmZQymCOzXfenc0EpMdMZsEBc,1687
14
14
  nmk_python/version.py,sha256=fLpOWdujYwlJB7XhWaOGCTeg3gQaClk2YHoRkkW64dE,3109
15
15
  nmk_python/version.yml,sha256=WpZyQ2mChmvA_6eVb_Yp6ZaFIkX6oINxWBhKgb8h4GE,833
16
16
  nmk_python/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- nmk_python/backends/build_backend.py,sha256=yW5__VMb_dlHvQQ8svdrDSLHxWbGWHSxpbl_pJu9F8M,1292
17
+ nmk_python/backends/build_backend.py,sha256=NOAXMa6jmAIfUvA690ht-x_DwsGtvBvttPZLfFcX_b0,1437
18
18
  nmk_python/backends/factory.py,sha256=NMYByORffwSSIjeNMLkOnwh6x1xhJQVhoV-0rSooq6Q,953
19
- nmk_python/backends/pip_build_backend.py,sha256=amI0pf5pqQBDnCXhOc2ca_tiDm6v7XLLtW-Jhqd0w4U,1688
20
- nmk_python/backends/uv_build_backend.py,sha256=3BTqirTrbAeFdxkSAp3ot2zcJIfApaX1GaMpd46yM1U,1872
19
+ nmk_python/backends/pip_build_backend.py,sha256=4MGYghBeMjZhUlKTwE0svSHArYwOAaK1I6_gmeNnwaI,1698
20
+ nmk_python/backends/uv_build_backend.py,sha256=QpN5nMm_QhnKzoHQcX4769OOQG6NqOD2ctYXyH2MI7A,1880
21
21
  nmk_python/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  nmk_python/templates/build.toml.jinja,sha256=6F1Kdb32JVBWEitxLC7AsUdhx2VTyQEyWhhSb7n3oBs,1770
23
23
  nmk_python/templates/pytest.toml.jinja,sha256=zQ3SRWnF23Omxm7zInE54j0l3OyjXSOn5pQ5Pak8Boo,641
24
24
  nmk_python/templates/python-settings.json.jinja,sha256=jYXSy96cX9X9GIHoF7XiZDzd4P2GOlMisAVWW626WF4,749
25
25
  nmk_python/templates/python-test-debug-launch.json.jinja,sha256=J_xju2EpHNXvgvqBxlf99p7g-ZMh3xE-_2r7o_57gpU,364
26
26
  nmk_python/templates/ruff.toml.jinja,sha256=DTHe1ixK1SBY8d2xBCfkGz89HzjAoMO7Ogs12AY1i4Y,346
27
- nmk_python-1.7.0.dist-info/licenses/LICENSE,sha256=PROo9EW7wP6jmSr_90OluItAsIB411b_CAqEBioMKpI,1074
28
- nmk_python-1.7.0.dist-info/METADATA,sha256=HSUvh9OSZ-iTijy1avmwcxLXMGevgRkMdtGNl0qEiLk,3148
29
- nmk_python-1.7.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
30
- nmk_python-1.7.0.dist-info/top_level.txt,sha256=MCb5w_hoOZ0kk3Dajxrd9Pz6lZ3pyuS6TQCRA3vddTo,11
31
- nmk_python-1.7.0.dist-info/RECORD,,
27
+ nmk_python-1.8.1.dist-info/licenses/LICENSE,sha256=PROo9EW7wP6jmSr_90OluItAsIB411b_CAqEBioMKpI,1074
28
+ nmk_python-1.8.1.dist-info/METADATA,sha256=6xJNrj-T99MzcQFkpf_iR8rwsQL1c5-j7gDmwKb4-GE,3148
29
+ nmk_python-1.8.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
30
+ nmk_python-1.8.1.dist-info/top_level.txt,sha256=MCb5w_hoOZ0kk3Dajxrd9Pz6lZ3pyuS6TQCRA3vddTo,11
31
+ nmk_python-1.8.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5