ducktools-pythonfinder 0.6.7__tar.gz → 0.6.8__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.
Files changed (39) hide show
  1. {ducktools_pythonfinder-0.6.7/src/ducktools_pythonfinder.egg-info → ducktools_pythonfinder-0.6.8}/PKG-INFO +2 -2
  2. ducktools_pythonfinder-0.6.8/src/ducktools/pythonfinder/_version.py +2 -0
  3. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/linux/pyenv_search.py +2 -1
  4. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/shared.py +16 -5
  5. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/win32/pyenv_search.py +4 -2
  6. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/win32/registry_search.py +1 -0
  7. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8/src/ducktools_pythonfinder.egg-info}/PKG-INFO +2 -2
  8. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/test_pyenv.py +7 -4
  9. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/test_uv_finder.py +2 -0
  10. ducktools_pythonfinder-0.6.7/src/ducktools/pythonfinder/_version.py +0 -2
  11. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/.gitignore +0 -0
  12. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/LICENSE +0 -0
  13. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/MANIFEST.in +0 -0
  14. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/README.md +0 -0
  15. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/pyproject.toml +0 -0
  16. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/scripts/build_zipapp.py +0 -0
  17. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/scripts/detail_this_python.py +0 -0
  18. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/scripts/print_python_versions.py +0 -0
  19. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/setup.cfg +0 -0
  20. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/__init__.py +0 -0
  21. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/__main__.py +0 -0
  22. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/darwin/__init__.py +0 -0
  23. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/details_script.py +0 -0
  24. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/linux/__init__.py +0 -0
  25. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/pythonorg_search.py +0 -0
  26. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools/pythonfinder/win32/__init__.py +0 -0
  27. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools_pythonfinder.egg-info/SOURCES.txt +0 -0
  28. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools_pythonfinder.egg-info/dependency_links.txt +0 -0
  29. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools_pythonfinder.egg-info/entry_points.txt +0 -0
  30. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools_pythonfinder.egg-info/requires.txt +0 -0
  31. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/src/ducktools_pythonfinder.egg-info/top_level.txt +0 -0
  32. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/conftest.py +0 -0
  33. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/sources/python_versions.txt +0 -0
  34. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/sources/release.json +0 -0
  35. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/sources/release_file.json +0 -0
  36. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/test_details_script.py +0 -0
  37. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/test_foldersearch.py +0 -0
  38. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/test_orgsearch.py +0 -0
  39. {ducktools_pythonfinder-0.6.7 → ducktools_pythonfinder-0.6.8}/tests/test_shared.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ducktools-pythonfinder
3
- Version: 0.6.7
3
+ Version: 0.6.8
4
4
  Summary: Cross platform tool to find available python installations
5
5
  Author: David C Ellis
6
6
  Project-URL: Homepage, https://github.com/davidcellis/ducktools-pythonfinder
@@ -0,0 +1,2 @@
1
+ __version__ = "0.6.8"
2
+ __version_tuple__ = (0, 6, 8)
@@ -78,6 +78,7 @@ def get_pyenv_pythons(
78
78
  version=version_tuple,
79
79
  executable=executable,
80
80
  metadata=metadata,
81
+ managed_by="pyenv",
81
82
  )
82
- elif query_executables and (install := get_install_details(executable)):
83
+ elif query_executables and (install := get_install_details(executable, managed_by="pyenv")):
83
84
  yield install
@@ -137,6 +137,7 @@ class PythonInstall(Prefab):
137
137
  executable: str
138
138
  architecture: str = "64bit"
139
139
  implementation: str = "cpython"
140
+ managed_by: str | None = None
140
141
  metadata: dict = attribute(default_factory=dict)
141
142
  shadowed: bool = False
142
143
  _implementation_version: tuple[int, int, int, str, int] | None = attribute(default=None, private=True)
@@ -180,6 +181,7 @@ class PythonInstall(Prefab):
180
181
  executable: str,
181
182
  architecture: str = "64bit",
182
183
  implementation: str = "cpython",
184
+ managed_by: str | None = None,
183
185
  metadata: dict | None = None,
184
186
  ):
185
187
  version_tuple = version_str_to_tuple(version)
@@ -190,16 +192,23 @@ class PythonInstall(Prefab):
190
192
  executable=executable,
191
193
  architecture=architecture,
192
194
  implementation=implementation,
195
+ managed_by=managed_by,
193
196
  metadata=metadata,
194
197
  )
195
198
 
196
199
  @classmethod
197
- def from_json(cls, version, executable, architecture, implementation, metadata):
200
+ def from_json(cls, version, executable, architecture, implementation, metadata, managed_by=None):
198
201
  if arch_ver := metadata.get(f"{implementation}_version"):
199
202
  metadata[f"{implementation}_version"] = tuple(arch_ver)
200
203
 
204
+ # noinspection PyArgumentList
201
205
  return cls(
202
- tuple(version), executable, architecture, implementation, metadata # noqa
206
+ version=tuple(version),
207
+ executable=executable,
208
+ architecture=architecture,
209
+ implementation=implementation,
210
+ managed_by=managed_by,
211
+ metadata=metadata,
203
212
  )
204
213
 
205
214
  def get_pip_version(self) -> str | None:
@@ -229,7 +238,7 @@ def _python_exe_regex(basename: str = "python"):
229
238
  return _laz.re.compile(rf"{basename}\d?\.?\d*")
230
239
 
231
240
 
232
- def get_install_details(executable: str) -> PythonInstall | None:
241
+ def get_install_details(executable: str, managed_by=None) -> PythonInstall | None:
233
242
  try:
234
243
  source = details.get_source_code()
235
244
  except FileNotFoundError:
@@ -270,7 +279,7 @@ def get_install_details(executable: str) -> PythonInstall | None:
270
279
  except _laz.json.JSONDecodeError as e:
271
280
  return None
272
281
 
273
- return PythonInstall.from_json(**output)
282
+ return PythonInstall.from_json(**output, managed_by=managed_by)
274
283
 
275
284
 
276
285
  def get_folder_pythons(
@@ -344,7 +353,8 @@ def _implementation_from_uv_dir(
344
353
  executable=python_path,
345
354
  architecture="32bit" if arch in {"i686", "armv7"} else "64bit",
346
355
  implementation=implementation,
347
- metadata=metadata
356
+ metadata=metadata,
357
+ managed_by="Astral UV",
348
358
  )
349
359
  except ValueError:
350
360
  pass
@@ -354,6 +364,7 @@ def _implementation_from_uv_dir(
354
364
  # Slow backup - ask python itself
355
365
  if query_executables:
356
366
  install = get_install_details(python_path)
367
+ install.managed_by = "Astral UV"
357
368
 
358
369
  return install
359
370
 
@@ -48,13 +48,13 @@ def get_pyenv_pythons(
48
48
  if path_base.startswith("pypy"):
49
49
  executable = os.path.join(p.path, "pypy.exe")
50
50
  if os.path.exists(executable):
51
- yield get_install_details(executable)
51
+ yield get_install_details(executable, managed_by="pyenv")
52
52
  continue
53
53
  elif path_base.startswith("graalpy"):
54
54
  # Graalpy exe in bin subfolder
55
55
  executable = os.path.join(p.path, "bin", "graalpy.exe")
56
56
  if os.path.exists(executable):
57
- yield get_install_details(executable)
57
+ yield get_install_details(executable, managed_by="pyenv")
58
58
  continue
59
59
 
60
60
  # Regular CPython
@@ -76,6 +76,7 @@ def get_pyenv_pythons(
76
76
  version=version,
77
77
  executable=executable,
78
78
  architecture=arch,
79
+ managed_by="pyenv",
79
80
  )
80
81
  except ValueError:
81
82
  pass
@@ -86,6 +87,7 @@ def get_pyenv_pythons(
86
87
  version=version,
87
88
  executable=executable,
88
89
  architecture="64bit",
90
+ managed_by="pyenv",
89
91
  )
90
92
  except ValueError:
91
93
  pass
@@ -126,6 +126,7 @@ def get_registered_pythons() -> Iterator[PythonInstall]:
126
126
  executable=python_path,
127
127
  architecture=architecture,
128
128
  metadata=metadata,
129
+ managed_by=metadata["Company"],
129
130
  )
130
131
  except ValueError:
131
132
  pass
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: ducktools-pythonfinder
3
- Version: 0.6.7
3
+ Version: 0.6.8
4
4
  Summary: Cross platform tool to find available python installations
5
5
  Author: David C Ellis
6
6
  Project-URL: Homepage, https://github.com/davidcellis/ducktools-pythonfinder
@@ -72,7 +72,7 @@ def test_mock_versions_folder():
72
72
 
73
73
  python_versions = list(get_pyenv_pythons())
74
74
 
75
- assert python_versions == [PythonInstall.from_str(version=out_ver, executable=out_executable)]
75
+ assert python_versions == [PythonInstall.from_str(version=out_ver, executable=out_executable, managed_by="pyenv")]
76
76
 
77
77
 
78
78
  @pytest.mark.skipif(sys.platform != "win32", reason="Test for Windows only")
@@ -89,7 +89,7 @@ def test_fs_versions_win(fs):
89
89
 
90
90
  versions = list(get_pyenv_pythons(tmpdir))
91
91
 
92
- assert versions == [PythonInstall.from_str(version="3.12.1", executable=py_exe)]
92
+ assert versions == [PythonInstall.from_str(version="3.12.1", executable=py_exe, managed_by="pyenv")]
93
93
 
94
94
 
95
95
  @pytest.mark.skipif(sys.platform != "win32", reason="Test for Windows only")
@@ -106,7 +106,9 @@ def test_32bit_version(fs):
106
106
 
107
107
  versions = list(get_pyenv_pythons(tmpdir))
108
108
 
109
- assert versions == [PythonInstall.from_str(version="3.12.1", executable=py_exe, architecture="32bit")]
109
+ assert versions == [
110
+ PythonInstall.from_str(version="3.12.1", executable=py_exe, architecture="32bit", managed_by="pyenv")
111
+ ]
110
112
 
111
113
 
112
114
  @pytest.mark.skipif(sys.platform != "win32", reason="Test for Windows only")
@@ -155,7 +157,7 @@ def test_fs_versions_nix(fs):
155
157
 
156
158
  versions = list(get_pyenv_pythons(tmpdir))
157
159
 
158
- assert versions == [PythonInstall.from_str(version="3.12.1", executable=py_exe)]
160
+ assert versions == [PythonInstall.from_str(version="3.12.1", executable=py_exe, managed_by="pyenv")]
159
161
 
160
162
 
161
163
  @pytest.mark.skipif(sys.platform == "win32", reason="Test for non-Windows only")
@@ -235,6 +237,7 @@ def test_pypy_version(fs):
235
237
  architecture="64bit",
236
238
  implementation="pypy",
237
239
  metadata={"pypy_version": (7, 3, 15, "final", 0)},
240
+ managed_by="pyenv",
238
241
  )
239
242
 
240
243
  assert versions == [out_version]
@@ -132,6 +132,7 @@ class TestUVReal:
132
132
  assert len(pythons) == 1
133
133
  assert pythons[0].version_str == "3.12.6"
134
134
  assert pythons[0].implementation == "cpython"
135
+ assert pythons[0].managed_by == "Astral UV"
135
136
 
136
137
  @pytest.mark.uv_python
137
138
  def test_finds_installed_pypy(self, uv_pythondir):
@@ -145,6 +146,7 @@ class TestUVReal:
145
146
  assert pythons[0].version >= (3, 10, 14)
146
147
  assert pythons[0].implementation == "pypy"
147
148
  assert pythons[0].implementation_version >= (7, 3, 17)
149
+ assert pythons[0].managed_by == "Astral UV"
148
150
 
149
151
 
150
152
  def test_regex_matches():
@@ -1,2 +0,0 @@
1
- __version__ = "0.6.7"
2
- __version_tuple__ = (0, 6, 7)