omdev 0.0.0.dev44__tar.gz → 0.0.0.dev45__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.

Potentially problematic release.


This version of omdev might be problematic. Click here for more details.

Files changed (128) hide show
  1. {omdev-0.0.0.dev44/omdev.egg-info → omdev-0.0.0.dev45}/PKG-INFO +2 -2
  2. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cli/install.py +3 -1
  3. omdev-0.0.0.dev45/omdev/cli/managers.py +107 -0
  4. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/piptools.py +1 -1
  5. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45/omdev.egg-info}/PKG-INFO +2 -2
  6. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev.egg-info/requires.txt +1 -1
  7. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/pyproject.toml +2 -2
  8. omdev-0.0.0.dev44/omdev/cli/managers.py +0 -77
  9. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/LICENSE +0 -0
  10. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/MANIFEST.in +0 -0
  11. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/README.rst +0 -0
  12. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/.manifests.json +0 -0
  13. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/__about__.py +0 -0
  14. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/__init__.py +0 -0
  15. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/amalg/__init__.py +0 -0
  16. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/amalg/__main__.py +0 -0
  17. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/amalg/amalg.py +0 -0
  18. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/bracepy.py +0 -0
  19. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/__init__.py +0 -0
  20. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/__init__.py +0 -0
  21. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/cache.py +0 -0
  22. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/contexts.py +0 -0
  23. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/currents.py +0 -0
  24. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/fns.py +0 -0
  25. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/resolvers.py +0 -0
  26. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/storage.py +0 -0
  27. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/compute/types.py +0 -0
  28. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/__init__.py +0 -0
  29. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/actions.py +0 -0
  30. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/cache.py +0 -0
  31. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/consts.py +0 -0
  32. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/defaults.py +0 -0
  33. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/manifests.py +0 -0
  34. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cache/data/specs.py +0 -0
  35. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/__init__.py +0 -0
  36. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_boilerplate.cc +0 -0
  37. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/LICENSE +0 -0
  38. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/__init__.py +0 -0
  39. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/build_ext.py +0 -0
  40. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/compilers/__init__.py +0 -0
  41. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/compilers/ccompiler.py +0 -0
  42. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/compilers/options.py +0 -0
  43. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/compilers/unixccompiler.py +0 -0
  44. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/dir_util.py +0 -0
  45. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/errors.py +0 -0
  46. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/extension.py +0 -0
  47. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/file_util.py +0 -0
  48. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/modified.py +0 -0
  49. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/spawn.py +0 -0
  50. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/sysconfig.py +0 -0
  51. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/util.py +0 -0
  52. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/_distutils/version.py +0 -0
  53. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/build.py +0 -0
  54. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/cmake.py +0 -0
  55. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/importhook.py +0 -0
  56. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/magic.py +0 -0
  57. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cexts/scan.py +0 -0
  58. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/classdot.py +0 -0
  59. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cli/__init__.py +0 -0
  60. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cli/__main__.py +0 -0
  61. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cli/clicli.py +0 -0
  62. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cli/main.py +0 -0
  63. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cli/types.py +0 -0
  64. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/cmake.py +0 -0
  65. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/findimports.py +0 -0
  66. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/findmagic.py +0 -0
  67. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/git.py +0 -0
  68. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/__init__.py +0 -0
  69. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/__main__.py +0 -0
  70. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/cli.py +0 -0
  71. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/inspect.py +0 -0
  72. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/providers.py +0 -0
  73. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/pyenv.py +0 -0
  74. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/resolvers.py +0 -0
  75. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/standalone.py +0 -0
  76. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/system.py +0 -0
  77. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/interp/types.py +0 -0
  78. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/manifests/__init__.py +0 -0
  79. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/manifests/build.py +0 -0
  80. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/manifests/load.py +0 -0
  81. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/manifests/types.py +0 -0
  82. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/mypy/__init__.py +0 -0
  83. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/mypy/debug.py +0 -0
  84. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/packaging/__init__.py +0 -0
  85. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/packaging/names.py +0 -0
  86. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/packaging/requires.py +0 -0
  87. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/packaging/specifiers.py +0 -0
  88. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/packaging/versions.py +0 -0
  89. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/__init__.py +0 -0
  90. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/__main__.py +0 -0
  91. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/base.py +0 -0
  92. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/git.py +0 -0
  93. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/lite.py +0 -0
  94. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/precheck.py +0 -0
  95. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/precheck/scripts.py +0 -0
  96. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/__init__.py +0 -0
  97. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/__main__.py +0 -0
  98. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/cexts.py +0 -0
  99. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/cli.py +0 -0
  100. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/configs.py +0 -0
  101. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/pkg.py +0 -0
  102. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/pyproject/reqs.py +0 -0
  103. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/revisions.py +0 -0
  104. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/__init__.py +0 -0
  105. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/bumpversion.py +0 -0
  106. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/execrss.py +0 -0
  107. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/exectime.py +0 -0
  108. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/importtrace.py +0 -0
  109. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/interp.py +0 -0
  110. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/scripts/pyproject.py +0 -0
  111. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/secrets.py +0 -0
  112. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tokens.py +0 -0
  113. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/toml/__init__.py +0 -0
  114. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/toml/parser.py +0 -0
  115. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/toml/writer.py +0 -0
  116. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/__init__.py +0 -0
  117. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/dockertools.py +0 -0
  118. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/gittools.py +0 -0
  119. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/importscan.py +0 -0
  120. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/proftools.py +0 -0
  121. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/rst.py +0 -0
  122. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/tools/sqlrepl.py +0 -0
  123. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev/wheelfile.py +0 -0
  124. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev.egg-info/SOURCES.txt +0 -0
  125. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev.egg-info/dependency_links.txt +0 -0
  126. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev.egg-info/entry_points.txt +0 -0
  127. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/omdev.egg-info/top_level.txt +0 -0
  128. {omdev-0.0.0.dev44 → omdev-0.0.0.dev45}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev44
3
+ Version: 0.0.0.dev45
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: ~=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev44
15
+ Requires-Dist: omlish==0.0.0.dev45
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -120,7 +120,7 @@ class PipxInstallManager(InstallManager):
120
120
 
121
121
  dct = self._list_installed()
122
122
 
123
- exe = dct[opts.cli_pkg]['metadata']['main_package']['app_paths'][0]['__Path__']
123
+ exe = dct['venvs'][opts.cli_pkg]['metadata']['main_package']['app_paths'][0]['__Path__']
124
124
 
125
125
  subprocess.check_call([
126
126
  exe,
@@ -148,6 +148,8 @@ def _main() -> None:
148
148
  if not (cli := args.cli):
149
149
  raise ValueError(f'Must specify cli')
150
150
 
151
+ cli = cli.lower().replace('_', '-')
152
+
151
153
  if not (py := args.py):
152
154
  raise ValueError(f'Must specify py')
153
155
 
@@ -0,0 +1,107 @@
1
+ import enum
2
+ import os.path
3
+ import site
4
+ import sys
5
+
6
+
7
+ ##
8
+
9
+
10
+ def _normalize_pkg_name(s: str) -> str:
11
+ return s.lower().replace('_', '-')
12
+
13
+
14
+ CLI_PKG = _normalize_pkg_name(__name__.split('.')[0])
15
+
16
+
17
+ ##
18
+
19
+
20
+ class ManagerType(enum.Enum):
21
+ UVX = 'uvx'
22
+ PIPX = 'pipx'
23
+
24
+
25
+ def _detect_install_manager() -> ManagerType | None:
26
+ if os.path.isfile(fp := os.path.join(sys.prefix, 'uv-receipt.toml')):
27
+ import tomllib
28
+
29
+ with open(fp) as f:
30
+ dct = tomllib.loads(f.read())
31
+
32
+ reqs = dct.get('tool', {}).get('requirements')
33
+ main_pkg = _normalize_pkg_name(reqs[0].get('name', ''))
34
+ if reqs and main_pkg == CLI_PKG:
35
+ return ManagerType.UVX
36
+
37
+ if os.path.isfile(fp := os.path.join(sys.prefix, 'pipx_metadata.json')):
38
+ import json
39
+
40
+ with open(fp) as f:
41
+ dct = json.loads(f.read())
42
+
43
+ main_pkg = _normalize_pkg_name(dct.get('main_package', {}).get('package_or_url', ''))
44
+ if main_pkg == CLI_PKG:
45
+ return ManagerType.PIPX
46
+
47
+ return None
48
+
49
+
50
+ def detect_install_manager() -> ManagerType | None:
51
+ try:
52
+ return globals()['_DETECTED_MANAGER_TYPE']
53
+ except KeyError:
54
+ pass
55
+ ret = globals()['_DETECTED_MANAGER_TYPE'] = _detect_install_manager()
56
+ return ret
57
+
58
+
59
+ ##
60
+ # Python is insistent in prepending sys.path with an empty string (translating to the current working directory),
61
+ # which leads to problems when using the cli in directories containing python packages (such as within this very
62
+ # source tree). This can't be done in cli main as the code frequently spawns other sys.executable processes which
63
+ # wouldn't know to do that, so a .pth file hack is used. Cleaning sys.path solely there is also insufficient as that
64
+ # code runs before the problematic empty string is added, so a sys.meta_path hook is prepended.
65
+ #
66
+ # See:
67
+ # https://github.com/python/cpython/blob/da1e5526aee674bb33c17a498aa3781587b9850c/Python/sysmodule.c#L3939
68
+
69
+
70
+ def _remove_empty_from_sys_path() -> None:
71
+ while '' in sys.path:
72
+ sys.path.remove('')
73
+
74
+
75
+ class _PathHackMetaFinder:
76
+ def find_spec(self, fullname, path, target=None):
77
+ _remove_empty_from_sys_path()
78
+ return None # noqa
79
+
80
+
81
+ def _activate_path_hack() -> None:
82
+ if not any(isinstance(mp, _PathHackMetaFinder) for mp in sys.meta_path):
83
+ sys.meta_path.insert(0, _PathHackMetaFinder())
84
+
85
+
86
+ _PATH_HACK_FILE_NAME = f'{"-".join(__name__.split("."))}-path-hack.pth'
87
+
88
+
89
+ def _install_path_hack_file() -> None:
90
+ sp = site.getsitepackages()[0]
91
+ if os.path.isfile(fp := os.path.join(sp, _PATH_HACK_FILE_NAME)):
92
+ return
93
+
94
+ with open(fp, 'w') as f:
95
+ f.write(f'import {__name__}; {__name__}._activate_path_hack()')
96
+
97
+ _activate_path_hack()
98
+
99
+
100
+ ##
101
+
102
+
103
+ def setup_install_manager() -> None:
104
+ if detect_install_manager() is None:
105
+ return
106
+
107
+ _install_path_hack_file()
@@ -66,7 +66,7 @@ class Cli(ap.Cli):
66
66
  dist_cn = canonicalize_name(dist.metadata['Name'], validate=True)
67
67
  if dist_cn in dists:
68
68
  # raise NameError(dist_cn)
69
- print(f'!! duplicate dist: {dist_cn}', file=sys.stderr)
69
+ # print(f'!! duplicate dist: {dist_cn}', file=sys.stderr)
70
70
  continue
71
71
 
72
72
  dists.add(dist_cn)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: omdev
3
- Version: 0.0.0.dev44
3
+ Version: 0.0.0.dev45
4
4
  Summary: omdev
5
5
  Author: wrmsr
6
6
  License: BSD-3-Clause
@@ -12,7 +12,7 @@ Classifier: Operating System :: OS Independent
12
12
  Classifier: Operating System :: POSIX
13
13
  Requires-Python: ~=3.12
14
14
  License-File: LICENSE
15
- Requires-Dist: omlish==0.0.0.dev44
15
+ Requires-Dist: omlish==0.0.0.dev45
16
16
  Provides-Extra: all
17
17
  Requires-Dist: pycparser~=2.22; extra == "all"
18
18
  Requires-Dist: cffi~=1.17; extra == "all"
@@ -1,4 +1,4 @@
1
- omlish==0.0.0.dev44
1
+ omlish==0.0.0.dev45
2
2
 
3
3
  [all]
4
4
  pycparser~=2.22
@@ -12,7 +12,7 @@ authors = [
12
12
  urls = {source = 'https://github.com/wrmsr/omlish'}
13
13
  license = {text = 'BSD-3-Clause'}
14
14
  requires-python = '~=3.12'
15
- version = '0.0.0.dev44'
15
+ version = '0.0.0.dev45'
16
16
  classifiers = [
17
17
  'License :: OSI Approved :: BSD License',
18
18
  'Development Status :: 2 - Pre-Alpha',
@@ -22,7 +22,7 @@ classifiers = [
22
22
  ]
23
23
  description = 'omdev'
24
24
  dependencies = [
25
- 'omlish == 0.0.0.dev44',
25
+ 'omlish == 0.0.0.dev45',
26
26
  ]
27
27
 
28
28
  [project.optional-dependencies]
@@ -1,77 +0,0 @@
1
- import enum
2
- import os.path
3
- import site
4
- import sys
5
-
6
-
7
- ##
8
-
9
-
10
- class ManagerType(enum.Enum):
11
- UVX = 'uvx'
12
- PIPX = 'pipx'
13
-
14
-
15
- def _detect_install_manager() -> ManagerType | None:
16
- if os.path.isfile(fp := os.path.join(sys.prefix, 'uv-receipt.toml')):
17
- with open(fp) as f:
18
- if any(l.strip() == '[tool]' for l in f):
19
- return ManagerType.UVX
20
-
21
- if os.path.isfile(os.path.join(sys.prefix, 'pipx_metadata.json')):
22
- return ManagerType.PIPX
23
-
24
- return None
25
-
26
-
27
- def detect_install_manager() -> ManagerType | None:
28
- try:
29
- return globals()['_DETECTED_MANAGER_TYPE']
30
- except KeyError:
31
- pass
32
- ret = globals()['_DETECTED_MANAGER_TYPE'] = _detect_install_manager()
33
- return ret
34
-
35
-
36
- ##
37
-
38
-
39
- def _ensure_correct_path() -> None:
40
- sp = site.getsitepackages()[0]
41
- if sys.path[0] != sp:
42
- sys.path.insert(0, sp)
43
-
44
-
45
- class _PathHackMetaFinder:
46
- def find_spec(self, fullname, path, target=None):
47
- _ensure_correct_path()
48
- return None # noqa
49
-
50
-
51
- def _activate_path_hack() -> None:
52
- if not any(isinstance(mp, _PathHackMetaFinder) for mp in sys.meta_path):
53
- sys.meta_path.insert(0, _PathHackMetaFinder())
54
-
55
-
56
- _PATH_HACK_FILE_NAME = f'{"-".join(__name__.split("."))}-path-hack.pth'
57
-
58
-
59
- def _install_path_hack_file() -> None:
60
- sp = site.getsitepackages()[0]
61
- if os.path.isfile(fp := os.path.join(sp, _PATH_HACK_FILE_NAME)):
62
- return
63
-
64
- with open(fp, 'w') as f:
65
- f.write(f'import {__name__}; {__name__}._activate_path_hack()')
66
-
67
- _activate_path_hack()
68
-
69
-
70
- ##
71
-
72
-
73
- def setup_install_manager() -> None:
74
- if detect_install_manager() is None:
75
- return
76
-
77
- _install_path_hack_file()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes