nmk-python 1.10.3__py3-none-any.whl → 1.12.0__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.
@@ -67,35 +67,23 @@ class NmkPythonProjectTemplate(NmkBaseProjectTemplate):
67
67
 
68
68
  def handle_dependencies(self, packages: list[str]) -> dict[str, NmkConfigType]:
69
69
  # Iterate on packages
70
- config_items: dict[str, NmkConfigType] = {}
71
- simple_refs: list[str] = []
72
- file_refs: list[str] = []
70
+ other_refs: list[str] = []
73
71
  dep_refs: list[str] = []
72
+
73
+ # Pre-filter non-dev dependencies
74
74
  for package in packages:
75
75
  # Check for dependency groups (no group means it's a regular dependency, otherwise it's a dev dependency)
76
76
  if ":" not in package:
77
77
  dep_refs.append(package)
78
- # Dev dependencies
79
78
  else:
80
- package = package.split(":")[-1] # Ignore dependency groups, if any (e.g. `dev:package` -> `package`)
81
- if "." in package:
82
- package_path = Path(package)
83
- if package_path.is_absolute() and package_path.is_file():
84
- file_refs.append(package)
85
- elif (Path.cwd() / package).is_file():
86
- file_refs.append(f"${{PROJECTDIR}}/{package}")
87
- else:
88
- simple_refs.append(package)
89
- else:
90
- simple_refs.append(package)
79
+ other_refs.append(package)
80
+
81
+ # Delegate to normal processing
82
+ config_items: dict[str, NmkConfigType] = super().handle_dependencies(other_refs)
91
83
 
92
84
  # Build settings
93
- if dep_refs:
85
+ if dep_refs: # pragma: no branch
94
86
  config_items["pythonPackageRequirements"] = dep_refs
95
- if simple_refs:
96
- config_items["venvPkgDeps"] = simple_refs
97
- if file_refs:
98
- config_items["venvArchiveDeps"] = file_refs
99
87
 
100
88
  return config_items
101
89
 
@@ -39,11 +39,6 @@ class UvBuildBackend(PythonBuildBackend):
39
39
  # Name for wheel sub-directory
40
40
  wheel_sub_dir = "wheel_dist"
41
41
 
42
- # Check for (experimental) uv-build backend
43
- if self._model.config["pythonUseUvBuildBackend"].value:
44
- # Prepare project version (without updating the venv)
45
- self._env_backend.subprocess(["version", "--active", "--no-sync", wheel_version], cwd=build_dir)
46
-
47
42
  # Delegate to uv
48
43
  build_args = ["build", "--wheel", "--out-dir", wheel_sub_dir]
49
44
  self._env_backend.subprocess(build_args, cwd=build_dir)
nmk_python/build.py CHANGED
@@ -4,6 +4,7 @@ Python package build module
4
4
 
5
5
  import importlib.metadata
6
6
  import json
7
+ import os
7
8
  import shutil
8
9
  from fnmatch import fnmatch
9
10
  from itertools import product
@@ -11,12 +12,15 @@ from pathlib import Path
11
12
  from typing import cast
12
13
 
13
14
  from nmk.envbackend import EnvBackend
14
- from nmk.logs import NmkLogWrapper
15
+ from nmk.logs import NmkLogger, NmkLogWrapper
15
16
  from nmk.model.builder import NmkTaskBuilder
16
17
  from nmk.model.model import NmkModel
17
18
  from nmk.model.resolver import NmkDictConfigResolver, NmkListConfigResolver, NmkStrConfigResolver
18
19
  from nmk.utils import is_windows
19
20
  from packaging.requirements import Requirement
21
+ from packaging.version import Version
22
+ from tomlkit import loads
23
+ from tomlkit.toml_file import TOMLFile
20
24
 
21
25
  from nmk_python.backends.factory import BuildBackendFactory
22
26
 
@@ -65,11 +69,21 @@ class PackageBuilder(NmkTaskBuilder):
65
69
  project_root = project_path.parent
66
70
  for source_dir in map(Path, source_dirs):
67
71
  shutil.copytree(source_dir, build_path / source_dir.relative_to(project_root))
68
- for candidate in filter(lambda p: p.is_file(), map(Path, [project_path, version_file, project_root / "README.md", project_root / "LICENSE"])):
72
+ for candidate in filter(lambda p: p.is_file(), map(Path, [project_path, project_root / "README.md", project_root / "LICENSE"])):
69
73
  dest = build_path / candidate.relative_to(project_root)
70
74
  dest.parent.mkdir(parents=True, exist_ok=True)
71
75
  shutil.copyfile(candidate, dest)
72
76
 
77
+ # Update project file scm root
78
+ build_project = build_path / project_path.name
79
+ with build_project.open() as f:
80
+ project_doc = loads(f.read())
81
+ scm_config = cast(dict[str, dict[str, str]], project_doc.get("tool")).get("setuptools_scm") # type: ignore
82
+ assert scm_config is not None, "Can't find setuptools_scm config in project file"
83
+ scm_config["root"] = "/".join([".."] * len(build_path.relative_to(project_root).parts))
84
+ project_output = TOMLFile(build_project)
85
+ project_output.write(project_doc)
86
+
73
87
  # Handle extra resources
74
88
  for src, dst in extra_resources.items():
75
89
  src_path, dst_path = Path(src), Path(dst)
@@ -254,12 +268,14 @@ class DepsMetadataBuilder(NmkTaskBuilder):
254
268
  Generate python dependencies metadata file
255
269
  """
256
270
 
257
- def build(self, root_name: str, local_deps: list[str]): # pyright: ignore[reportIncompatibleMethodOverride]
271
+ def build(self, root_name: str, local_deps: list[str], constraints: list[str], fail_on_error: bool): # pyright: ignore[reportIncompatibleMethodOverride]
258
272
  """
259
273
  Generate python dependencies metadata file
260
274
 
261
275
  :param root_name: name of the root package
262
276
  :param local_deps: list of workspace local dependencies patterns
277
+ :param constraints: list of package constraints (may contain comments) to be checked against found dependencies
278
+ :param fail_on_error: if there are mismatches between actual dependencies and constraints, and if true, and the build in error
263
279
  """
264
280
 
265
281
  # Normalization implementation
@@ -313,6 +329,40 @@ class DepsMetadataBuilder(NmkTaskBuilder):
313
329
  )
314
330
  )
315
331
 
332
+ # Check constraints vs external deps if any
333
+ filtered_constraints = [line for line in constraints if not line.startswith("# ")]
334
+ if filtered_constraints and output_data[_EXTERNAL_DEPS_KEY]: # pragma: no branch
335
+ try:
336
+ self._check_constraints(filtered_constraints, output_data[_EXTERNAL_DEPS_KEY], fail_on_error)
337
+ except Exception as e:
338
+ # Touch output file to force task to be retriggered on next build
339
+ input_state = self.main_input.stat()
340
+ os.utime(self.main_output, (input_state.st_atime, input_state.st_mtime))
341
+ raise e
342
+
343
+ def _check_constraints(self, constraints: list[str], deps: dict[str, str], fail_on_error: bool):
344
+ # Build all requirements
345
+ all_reqs = {r[0].name: r for r in [(Requirement(line), line) for line in constraints]}
346
+
347
+ # Count errors
348
+ errors = 0
349
+
350
+ # Browse dependencies
351
+ for name, version in deps.items():
352
+ # Check missing constraint on actual dependency
353
+ if name not in all_reqs:
354
+ self.logger.warning(f"Found dependency with missing constraint: {name}")
355
+ errors += 1
356
+ continue
357
+
358
+ # Check mismatch version
359
+ req, req_line = all_reqs[name]
360
+ if Version(version) not in req.specifier:
361
+ self.logger.warning(f"Found dependency with constraint mismatch: {name} ({version}) vs '{req_line}'")
362
+ errors += 1
363
+
364
+ assert (errors == 0) or not fail_on_error, f"{errors} error(s) found while checking dependencies vs constraints"
365
+
316
366
 
317
367
  class PythonIgnoredLockfileResolver(NmkListConfigResolver):
318
368
  """
@@ -326,5 +376,40 @@ class PythonIgnoredLockfileResolver(NmkListConfigResolver):
326
376
 
327
377
  # Ignore uv.lock file if using uv env backend and project is not locked
328
378
  if not self.model.env_backend.is_locked and self.model.env_backend.name == "uv":
329
- return ["uv.lock"] # pragma: no cover
330
- return []
379
+ return ["uv.lock"]
380
+ return [] # pragma: no cover
381
+
382
+
383
+ class PythonMergedConstraintsResolver(NmkListConfigResolver):
384
+ """
385
+ Python merged constraints resolver
386
+ """
387
+
388
+ def get_value(self, name: str, constraints: list[str], constraints_files: list[str]) -> list[str]: # pyright: ignore[reportIncompatibleMethodOverride]
389
+ """
390
+ Return the merged list of constraints, coming from raw items and files
391
+ """
392
+
393
+ all_constraints: list[str] = []
394
+
395
+ # Step 1: read files
396
+ for constraints_file in map(Path, constraints_files):
397
+ # Check file existence
398
+ if not constraints_file.is_file():
399
+ NmkLogger.warning(f"Constraints file not found: {constraints_file}")
400
+ continue
401
+
402
+ def clean_line(line: str) -> str | None:
403
+ line = line.strip()
404
+ if not line.startswith("#"):
405
+ # Remove end of line comments (keep full line ones)
406
+ line = line.split("#", 1)[0].strip()
407
+ return line
408
+
409
+ # Get lines
410
+ all_constraints.extend(filter(None, map(clean_line, constraints_file.read_text().splitlines())))
411
+
412
+ # Step 2: add items
413
+ all_constraints.extend(constraints)
414
+
415
+ return all_constraints
nmk_python/build.yml CHANGED
@@ -108,6 +108,22 @@ config:
108
108
  # Generated python dependencies metadata file
109
109
  pythonDepsMetadata: ${outputDir}/python_deps.json
110
110
 
111
+ # Python constraints, raw listed in nmk.yml files
112
+ pythonConstraints: []
113
+
114
+ # Python constraints files
115
+ pythonConstraintsFiles: []
116
+
117
+ # Merged constraints (from items + files)
118
+ pythonMergedConstraints:
119
+ __resolver__: nmk_python.build.PythonMergedConstraintsResolver
120
+ params:
121
+ constraints: ${pythonConstraints}
122
+ constraints_files: ${pythonConstraintsFiles}
123
+
124
+ # Constraints check mode (strict or not)
125
+ pythonConstraintsStrictCheck: false
126
+
111
127
  tasks:
112
128
  # Python editable install
113
129
  py.editable:
@@ -141,6 +157,8 @@ tasks:
141
157
  params:
142
158
  root_name: ${pythonPackage}
143
159
  local_deps: ${pythonLocalDepsPatterns}
160
+ constraints: ${pythonMergedConstraints}
161
+ fail_on_error: ${pythonConstraintsStrictCheck}
144
162
 
145
163
  # Python wheel build
146
164
  py.build:
@@ -1,5 +1,5 @@
1
1
  [build-system]
2
- requires = ["{% if pythonUseUvBuildBackend %}uv_build>=0.9.18,<0.10.0{% else %}setuptools{% endif %}"]
2
+ requires = ["{% if pythonUseUvBuildBackend %}uv_build>=0.9.18,<0.10.0{% else %}setuptools", "setuptools_scm", "wheel{% endif %}"]
3
3
  build-backend = "{% if pythonUseUvBuildBackend %}uv_build{% else %}setuptools.build_meta{% endif %}"
4
4
 
5
5
  [project]
@@ -38,8 +38,10 @@ namespaces = false
38
38
  [tool.setuptools.package-data]
39
39
  "*" = ["*"]
40
40
 
41
- [tool.setuptools.dynamic.version]
42
- file = "{{ pythonVersionStamp }}"
41
+ [tool.setuptools_scm]
42
+ version_scheme = "{{ pythonVersionScheme }}"
43
+ local_scheme = "{{ pythonVersionLocalScheme }}"
44
+ fallback_version = "{{ pythonVersionFallback }}"
43
45
 
44
46
  {% endif %}[tool.distutils.bdist_wheel]
45
47
  plat-name = "{{ pythonPackagePlatform }}"
@@ -47,4 +49,11 @@ plat-name = "{{ pythonPackagePlatform }}"
47
49
  [tool.pyright]
48
50
  include = {{ pythonSrcFolders }}
49
51
  typeCheckingMode = "{{ pythonTypeCheckingMode }}"
50
- reportMissingTypeStubs = false
52
+ reportMissingTypeStubs = false{% if not backendUseRequirements %}
53
+
54
+ [tool.uv]
55
+ cache-keys = [{ file = "pyproject.toml" }, { git = { commit = true, tags = true } }]
56
+ {% if pythonMergedConstraints %}
57
+ constraint-dependencies = {{ pythonMergedConstraints }}
58
+ {% endif %}
59
+ {% endif %}
nmk_python/version.py CHANGED
@@ -3,13 +3,11 @@ Python version handling
3
3
  """
4
4
 
5
5
  import platform
6
- import re
6
+ from typing import cast
7
7
 
8
8
  from nmk.model.builder import NmkTaskBuilder
9
9
  from nmk.model.resolver import NmkListConfigResolver, NmkStrConfigResolver
10
-
11
- # Git version pattern
12
- _GIT_VERSION_PATTERN = re.compile("([^-]+)(?:-([0-9]+))?(?:-(.+))?")
10
+ from setuptools_scm import get_version
13
11
 
14
12
 
15
13
  class PythonVersionResolver(NmkStrConfigResolver):
@@ -17,26 +15,12 @@ class PythonVersionResolver(NmkStrConfigResolver):
17
15
  Python version resolver
18
16
  """
19
17
 
20
- def get_value(self, name: str) -> str:
18
+ def get_value(self, name: str, root: str, version_scheme: str, local_scheme: str, fallback_version: str) -> str: # type: ignore
21
19
  """
22
- Turn the git version in the Python way
20
+ Delegates to setuptools_scm to get the version from git
23
21
  """
24
- git_version = self.model.config["gitVersion"].value
25
- m = _GIT_VERSION_PATTERN.match(git_version)
26
- if m is not None:
27
- # Build python version from git version segments
28
- out = m.group(1)
29
- if m.group(2) is not None:
30
- # Add commits count
31
- out += f".post{m.group(2)}"
32
- if m.group(3) is not None:
33
- # Add hash/dirty
34
- out += f"+{m.group(3)}".replace("-", ".")
35
- return out
36
-
37
- # Probably a simpler version (without segments)
38
- # Assume it is already compliant...
39
- return git_version
22
+
23
+ return get_version(root=root, version_scheme=version_scheme, local_scheme=local_scheme, fallback_version=fallback_version)
40
24
 
41
25
 
42
26
  class PythonVersionRefresh(NmkTaskBuilder):
@@ -44,11 +28,11 @@ class PythonVersionRefresh(NmkTaskBuilder):
44
28
  Python version builder
45
29
  """
46
30
 
47
- def build(self, version: str):
31
+ def build(self, version: str): # type: ignore
48
32
  """
49
33
  Simple python version dump
50
34
  """
51
- self.logger.info(self.task.emoji, self.task.description)
35
+ self.logger.info(self.task.emoji, self.task.description) # type: ignore
52
36
  with self.main_output.open("w") as f:
53
37
  f.write(version)
54
38
 
@@ -69,13 +53,13 @@ class PythonSupportedVersionsResolver(NmkListConfigResolver):
69
53
  return list(map(int, v.split(".")))
70
54
 
71
55
  # Get min/max values, and verify consistency
72
- min_ver, max_ver = self.model.config["pythonMinVersion"].value, self.model.config["pythonMaxVersion"].value
56
+ min_ver, max_ver = cast(tuple[str, str], (self.model.config["pythonMinVersion"].value, self.model.config["pythonMaxVersion"].value))
73
57
  min_split, max_split = _split_version(min_ver), _split_version(max_ver)
74
58
  prefix = "Inconsistency in python min/max supported versions: "
75
59
  assert len(min_split) == len(max_split), prefix + "not the same segments count"
76
60
  assert len(min_split) == 2, prefix + "can only deal with X.Y versions (2 segments expected)"
77
61
  assert min_split[0] == max_split[0], prefix + "can't deal with different major versions"
78
- assert max_split[1] > min_split[1], prefix + "max isn't greater than min"
62
+ assert max_split[1] >= min_split[1], prefix + "max isn't greater than min"
79
63
 
80
64
  # Also verifies current runtime is in range
81
65
  p_ver = platform.python_version()
nmk_python/version.yml CHANGED
@@ -1,28 +1,38 @@
1
1
  config:
2
- # The python version itself
3
- pythonVersion:
4
- __resolver__: nmk_python.version.PythonVersionResolver
2
+ # Automated version computing from git tags -- see https://setuptools-scm.readthedocs.io/en/latest/config/
3
+ pythonVersionScheme: no-guess-dev
4
+ pythonVersionLocalScheme: node-and-date
5
+ pythonVersionFallback: "0.0.0"
5
6
 
6
- # Python version stamp file
7
- pythonVersionStamp: ${outputDir}/.pythonversion
7
+ # The python version itself
8
+ pythonVersion:
9
+ __resolver__: nmk_python.version.PythonVersionResolver
10
+ params:
11
+ root: ${PROJECTDIR}
12
+ version_scheme: ${pythonVersionScheme}
13
+ local_scheme: ${pythonVersionLocalScheme}
14
+ fallback_version: ${pythonVersionFallback}
8
15
 
9
- # Python supported versions range (min-max)
10
- pythonMinVersion: "3.10"
11
- pythonMaxVersion: "3.14"
12
- pythonSupportedVersions:
13
- __resolver__: nmk_python.version.PythonSupportedVersionsResolver
16
+ # Python version stamp file
17
+ pythonVersionStamp: ${outputDir}/.pythonversion
18
+
19
+ # Python supported versions range (min-max)
20
+ pythonMinVersion: "3.10"
21
+ pythonMaxVersion: "3.14"
22
+ pythonSupportedVersions:
23
+ __resolver__: nmk_python.version.PythonSupportedVersionsResolver
14
24
 
15
25
  tasks:
16
- # To refresh python version stamp file
17
- py.version:
18
- description: Refresh python version
19
- emoji: ":snake:.:label: "
20
- input: ${gitVersionStamp}
21
- output: ${pythonVersionStamp}
22
- params:
23
- version: ${pythonVersion}
24
- silent: true
25
- builder: nmk_python.version.PythonVersionRefresh
26
- deps:
27
- - git.version
28
- appendToDeps: setup
26
+ # To refresh python version stamp file
27
+ py.version:
28
+ description: Refresh python version
29
+ emoji: ":snake:.:label: "
30
+ input: ${gitVersionStamp}
31
+ output: ${pythonVersionStamp}
32
+ params:
33
+ version: ${pythonVersion}
34
+ silent: true
35
+ builder: nmk_python.version.PythonVersionRefresh
36
+ deps:
37
+ - git.version
38
+ appendToDeps: setup
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nmk-python
3
- Version: 1.10.3
3
+ Version: 1.12.0
4
4
  Summary: Python plugin for nmk build system
5
5
  Author: The dynod project
6
6
  Maintainer: The dynod project
@@ -22,6 +22,7 @@ Requires-Dist: Jinja2
22
22
  Requires-Dist: tomlkit
23
23
  Requires-Dist: setuptools
24
24
  Requires-Dist: wheel
25
+ Requires-Dist: setuptools-scm
25
26
  Requires-Dist: build
26
27
  Requires-Dist: ruff
27
28
  Requires-Dist: pytest-xdist
@@ -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=K-ZPBSN0YgWQqS4Nz2tRg-y2zTFvcutDiNR7Ii1NrMY,12979
4
- nmk_python/build.yml,sha256=kkaJV535tgcfDV65Pjxfh4HMexCS3muQ5oazFtqgYXI,5958
3
+ nmk_python/build.py,sha256=V2CiDI-srmFriYR7XuKJWZPuuBAv7LYX8drMz06jmug,16828
4
+ nmk_python/build.yml,sha256=vMVlI6KndmtgeMBzQlkCIunpq7ukqTdYLBvS5-vSdZc,6517
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
@@ -11,17 +11,17 @@ nmk_python/ruff.py,sha256=TBmn5nFflcFRvjj36JtJGJ-GYHOK6XfhK9Jp-2dO5_E,1557
11
11
  nmk_python/ruff.yml,sha256=L3vSTLGI3ZP46D64VxenhF9Gz3lo5-J9cRwgKBrVl48,2732
12
12
  nmk_python/tests.py,sha256=p2dl41eZW8cpUMOa2DXi3CN3iVQEnElC88Ke89PRyy8,1597
13
13
  nmk_python/tests.yml,sha256=by_Ml1JXjgt1-J96AMp-6gwhISVFVylRZowUvaMkfpk,1636
14
- nmk_python/version.py,sha256=fLpOWdujYwlJB7XhWaOGCTeg3gQaClk2YHoRkkW64dE,3109
15
- nmk_python/version.yml,sha256=WpZyQ2mChmvA_6eVb_Yp6ZaFIkX6oINxWBhKgb8h4GE,833
14
+ nmk_python/version.py,sha256=ivSff_1l-u-rSACF91s58zX_EUzl0ate_JcX_l7dSQk,2739
15
+ nmk_python/version.yml,sha256=D_rUnEzjEtCmCgUhfaDPSsANaRkcDW7aZgPX6GZOUIk,1159
16
16
  nmk_python/_buildenv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- nmk_python/_buildenv/template.py,sha256=avDeQuMSYHTiTwAgLbrpTPZ6bSaEqjCZDkcpzFxNt88,4568
17
+ nmk_python/_buildenv/template.py,sha256=-yugMcl93gcKfPKrLYTmIMOEIoNvVWGVnqkY3-z4JF8,3922
18
18
  nmk_python/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  nmk_python/backends/build_backend.py,sha256=WO0wZaxGdPna4K2yK7pNLtZX3cKf6atLLa00931N43Y,1400
20
20
  nmk_python/backends/factory.py,sha256=NMYByORffwSSIjeNMLkOnwh6x1xhJQVhoV-0rSooq6Q,953
21
21
  nmk_python/backends/pip_build_backend.py,sha256=4MGYghBeMjZhUlKTwE0svSHArYwOAaK1I6_gmeNnwaI,1698
22
- nmk_python/backends/uv_build_backend.py,sha256=cIQwKVsYWHlVQCmHWjjoC-3aRmWiHK55VSGexQbn_vw,1963
22
+ nmk_python/backends/uv_build_backend.py,sha256=gpM1L5FuJ5CF-OkRORnAbZHACPNhjkoO1sKZtdAhpf0,1671
23
23
  nmk_python/templates/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- nmk_python/templates/build.toml.jinja,sha256=6F1Kdb32JVBWEitxLC7AsUdhx2VTyQEyWhhSb7n3oBs,1770
24
+ nmk_python/templates/build.toml.jinja,sha256=D-RYPUGiqkYUKyQt_dP_tNFU-83eer7bnv57k4pMmIw,2137
25
25
  nmk_python/templates/pytest.toml.jinja,sha256=zQ3SRWnF23Omxm7zInE54j0l3OyjXSOn5pQ5Pak8Boo,641
26
26
  nmk_python/templates/python-settings.json.jinja,sha256=v-GlXJSGdtfaEZIinSC_aT54rlKArFe1RZ-BgPdbANM,666
27
27
  nmk_python/templates/python-test-debug-launch.json.jinja,sha256=J_xju2EpHNXvgvqBxlf99p7g-ZMh3xE-_2r7o_57gpU,364
@@ -30,9 +30,9 @@ nmk_python/templates/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
30
30
  nmk_python/templates/src/__init__.py.jinja,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
31
  nmk_python/templates/src/sample.py.jinja,sha256=OOTps7EjviwYFCIb5GpMHcidxhBY5NLQVlcFLqxuxNU,227
32
32
  nmk_python/templates/src/test_sample.py.jinja,sha256=u-ShBoKDF3se9KvgQ1SzO4NwymjqNowwURF4Q1oR3wo,221
33
- nmk_python-1.10.3.dist-info/licenses/LICENSE,sha256=PROo9EW7wP6jmSr_90OluItAsIB411b_CAqEBioMKpI,1074
34
- nmk_python-1.10.3.dist-info/METADATA,sha256=4IagnIbEAXFlSZ2U0s1Qnmp9pMQDVwwQEkPcqQiM8mU,3175
35
- nmk_python-1.10.3.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
36
- nmk_python-1.10.3.dist-info/entry_points.txt,sha256=QLXIIXl6wODHDnVkh7KuiLv_XzfFtNfdWwpxyB675ak,88
37
- nmk_python-1.10.3.dist-info/top_level.txt,sha256=MCb5w_hoOZ0kk3Dajxrd9Pz6lZ3pyuS6TQCRA3vddTo,11
38
- nmk_python-1.10.3.dist-info/RECORD,,
33
+ nmk_python-1.12.0.dist-info/licenses/LICENSE,sha256=PROo9EW7wP6jmSr_90OluItAsIB411b_CAqEBioMKpI,1074
34
+ nmk_python-1.12.0.dist-info/METADATA,sha256=N0TnAaHGx4s9cOE5QAn1s341QtZQkSVv62IGU4nm97U,3205
35
+ nmk_python-1.12.0.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
36
+ nmk_python-1.12.0.dist-info/entry_points.txt,sha256=QLXIIXl6wODHDnVkh7KuiLv_XzfFtNfdWwpxyB675ak,88
37
+ nmk_python-1.12.0.dist-info/top_level.txt,sha256=MCb5w_hoOZ0kk3Dajxrd9Pz6lZ3pyuS6TQCRA3vddTo,11
38
+ nmk_python-1.12.0.dist-info/RECORD,,