corio 2.2.6__tar.gz → 2.2.7__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 (171) hide show
  1. {corio-2.2.6 → corio-2.2.7}/PKG-INFO +4 -1
  2. {corio-2.2.6 → corio-2.2.7}/corio/infra/incrementor_pyproject.py +81 -87
  3. {corio-2.2.6 → corio-2.2.7}/corio/pyproject.package.toml +12 -15
  4. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_infra.py +48 -37
  5. {corio-2.2.6 → corio-2.2.7}/corio.egg-info/PKG-INFO +4 -1
  6. {corio-2.2.6 → corio-2.2.7}/corio.egg-info/SOURCES.txt +0 -1
  7. {corio-2.2.6 → corio-2.2.7}/corio.egg-info/requires.txt +4 -0
  8. {corio-2.2.6 → corio-2.2.7}/pyproject.toml +12 -15
  9. corio-2.2.6/scripts/infra-sync +0 -24
  10. {corio-2.2.6 → corio-2.2.7}/LICENSE +0 -0
  11. {corio-2.2.6 → corio-2.2.7}/README.md +0 -0
  12. {corio-2.2.6 → corio-2.2.7}/corio/__init__.py +0 -0
  13. {corio-2.2.6 → corio-2.2.7}/corio/ai/__init__.py +0 -0
  14. {corio-2.2.6 → corio-2.2.7}/corio/ai/agentic.py +0 -0
  15. {corio-2.2.6 → corio-2.2.7}/corio/ai/infer.py +0 -0
  16. {corio-2.2.6 → corio-2.2.7}/corio/aio.py +0 -0
  17. {corio-2.2.6 → corio-2.2.7}/corio/api.py +0 -0
  18. {corio-2.2.6 → corio-2.2.7}/corio/augmentation.py +0 -0
  19. {corio-2.2.6 → corio-2.2.7}/corio/av.py +0 -0
  20. {corio-2.2.6 → corio-2.2.7}/corio/caching.py +0 -0
  21. {corio-2.2.6 → corio-2.2.7}/corio/constants.py +0 -0
  22. {corio-2.2.6 → corio-2.2.7}/corio/context.py +0 -0
  23. {corio-2.2.6 → corio-2.2.7}/corio/dataclass.py +0 -0
  24. {corio-2.2.6 → corio-2.2.7}/corio/datatype.py +0 -0
  25. {corio-2.2.6 → corio-2.2.7}/corio/db/__init__.py +0 -0
  26. {corio-2.2.6 → corio-2.2.7}/corio/db/document.py +0 -0
  27. {corio-2.2.6 → corio-2.2.7}/corio/debug.py +0 -0
  28. {corio-2.2.6 → corio-2.2.7}/corio/dm.py +0 -0
  29. {corio-2.2.6 → corio-2.2.7}/corio/dns/__init__.py +0 -0
  30. {corio-2.2.6 → corio-2.2.7}/corio/dns/client.py +0 -0
  31. {corio-2.2.6 → corio-2.2.7}/corio/dns/dm.py +0 -0
  32. {corio-2.2.6 → corio-2.2.7}/corio/dns/proxy.py +0 -0
  33. {corio-2.2.6 → corio-2.2.7}/corio/dns/server.py +0 -0
  34. {corio-2.2.6 → corio-2.2.7}/corio/docker/__init__.py +0 -0
  35. {corio-2.2.6 → corio-2.2.7}/corio/dt.py +0 -0
  36. {corio-2.2.6 → corio-2.2.7}/corio/encrypt.py +0 -0
  37. {corio-2.2.6 → corio-2.2.7}/corio/entrypoint.py +0 -0
  38. {corio-2.2.6 → corio-2.2.7}/corio/env.py +0 -0
  39. {corio-2.2.6 → corio-2.2.7}/corio/function.py +0 -0
  40. {corio-2.2.6 → corio-2.2.7}/corio/google_api.py +0 -0
  41. {corio-2.2.6 → corio-2.2.7}/corio/ha/__init__.py +0 -0
  42. {corio-2.2.6 → corio-2.2.7}/corio/ha/constants.py +0 -0
  43. {corio-2.2.6 → corio-2.2.7}/corio/ha/core.py +0 -0
  44. {corio-2.2.6 → corio-2.2.7}/corio/ha/supervisor.py +0 -0
  45. {corio-2.2.6 → corio-2.2.7}/corio/ha/utils.py +0 -0
  46. {corio-2.2.6 → corio-2.2.7}/corio/hash.py +0 -0
  47. {corio-2.2.6 → corio-2.2.7}/corio/hfh.py +0 -0
  48. {corio-2.2.6 → corio-2.2.7}/corio/hook.py +0 -0
  49. {corio-2.2.6 → corio-2.2.7}/corio/https.py +0 -0
  50. {corio-2.2.6 → corio-2.2.7}/corio/infra/__init__.py +0 -0
  51. {corio-2.2.6 → corio-2.2.7}/corio/infra/api.py +0 -0
  52. {corio-2.2.6 → corio-2.2.7}/corio/infra/project.py +0 -0
  53. {corio-2.2.6 → corio-2.2.7}/corio/infra/releaser.py +0 -0
  54. {corio-2.2.6 → corio-2.2.7}/corio/infra/repository.py +0 -0
  55. {corio-2.2.6 → corio-2.2.7}/corio/infra/stack.py +0 -0
  56. {corio-2.2.6 → corio-2.2.7}/corio/inherit.py +0 -0
  57. {corio-2.2.6 → corio-2.2.7}/corio/inspection.py +0 -0
  58. {corio-2.2.6 → corio-2.2.7}/corio/interface/__init__.py +0 -0
  59. {corio-2.2.6 → corio-2.2.7}/corio/interface/context.py +0 -0
  60. {corio-2.2.6 → corio-2.2.7}/corio/interface/controls.py +0 -0
  61. {corio-2.2.6 → corio-2.2.7}/corio/interface/interface.py +0 -0
  62. {corio-2.2.6 → corio-2.2.7}/corio/iterator.py +0 -0
  63. {corio-2.2.6 → corio-2.2.7}/corio/jsn.py +0 -0
  64. {corio-2.2.6 → corio-2.2.7}/corio/json_fix.py +0 -0
  65. {corio-2.2.6 → corio-2.2.7}/corio/logs.py +0 -0
  66. {corio-2.2.6 → corio-2.2.7}/corio/markup.py +0 -0
  67. {corio-2.2.6 → corio-2.2.7}/corio/merging.py +0 -0
  68. {corio-2.2.6 → corio-2.2.7}/corio/metric.py +0 -0
  69. {corio-2.2.6 → corio-2.2.7}/corio/mqtt.py +0 -0
  70. {corio-2.2.6 → corio-2.2.7}/corio/name.py +0 -0
  71. {corio-2.2.6 → corio-2.2.7}/corio/net.py +0 -0
  72. {corio-2.2.6 → corio-2.2.7}/corio/netrc.py +0 -0
  73. {corio-2.2.6 → corio-2.2.7}/corio/openai.py +0 -0
  74. {corio-2.2.6 → corio-2.2.7}/corio/parallel.py +0 -0
  75. {corio-2.2.6 → corio-2.2.7}/corio/path/__init__.py +0 -0
  76. {corio-2.2.6 → corio-2.2.7}/corio/path/app.py +0 -0
  77. {corio-2.2.6 → corio-2.2.7}/corio/path/path.py +0 -0
  78. {corio-2.2.6 → corio-2.2.7}/corio/path/type.py +0 -0
  79. {corio-2.2.6 → corio-2.2.7}/corio/paths.py +0 -0
  80. {corio-2.2.6 → corio-2.2.7}/corio/patterns.py +0 -0
  81. {corio-2.2.6 → corio-2.2.7}/corio/pdf.py +0 -0
  82. {corio-2.2.6 → corio-2.2.7}/corio/plat.py +0 -0
  83. {corio-2.2.6 → corio-2.2.7}/corio/process.py +0 -0
  84. {corio-2.2.6 → corio-2.2.7}/corio/profiling.py +0 -0
  85. {corio-2.2.6 → corio-2.2.7}/corio/rand.py +0 -0
  86. {corio-2.2.6 → corio-2.2.7}/corio/sec.py +0 -0
  87. {corio-2.2.6 → corio-2.2.7}/corio/semantic.py +0 -0
  88. {corio-2.2.6 → corio-2.2.7}/corio/sets.py +0 -0
  89. {corio-2.2.6 → corio-2.2.7}/corio/setup/__init__.py +0 -0
  90. {corio-2.2.6 → corio-2.2.7}/corio/spaces.py +0 -0
  91. {corio-2.2.6 → corio-2.2.7}/corio/strings.py +0 -0
  92. {corio-2.2.6 → corio-2.2.7}/corio/tabular.py +0 -0
  93. {corio-2.2.6 → corio-2.2.7}/corio/tests/__init__.py +0 -0
  94. {corio-2.2.6 → corio-2.2.7}/corio/tests/conftest.py +0 -0
  95. {corio-2.2.6 → corio-2.2.7}/corio/tests/helpers.py +0 -0
  96. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_caching.py +0 -0
  97. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_datatype.py +0 -0
  98. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_dns.py +0 -0
  99. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_dt.py +0 -0
  100. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_encrypt.py +0 -0
  101. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_env.py +0 -0
  102. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_hash.py +0 -0
  103. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_hook.py +0 -0
  104. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_iterator.py +0 -0
  105. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_jsn.py +0 -0
  106. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_name.py +0 -0
  107. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_path.py +0 -0
  108. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_patterns.py +0 -0
  109. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_rand.py +0 -0
  110. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_strings.py +0 -0
  111. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_toml.py +0 -0
  112. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_tools.py +0 -0
  113. {corio-2.2.6 → corio-2.2.7}/corio/tests/test_yaml.py +0 -0
  114. {corio-2.2.6 → corio-2.2.7}/corio/tokenization.py +0 -0
  115. {corio-2.2.6 → corio-2.2.7}/corio/toml.py +0 -0
  116. {corio-2.2.6 → corio-2.2.7}/corio/tools.py +0 -0
  117. {corio-2.2.6 → corio-2.2.7}/corio/unicode.py +0 -0
  118. {corio-2.2.6 → corio-2.2.7}/corio/version/__init__.py +0 -0
  119. {corio-2.2.6 → corio-2.2.7}/corio/version/version.py +0 -0
  120. {corio-2.2.6 → corio-2.2.7}/corio/webhook.py +0 -0
  121. {corio-2.2.6 → corio-2.2.7}/corio/yml.py +0 -0
  122. {corio-2.2.6 → corio-2.2.7}/corio/youtube.py +0 -0
  123. {corio-2.2.6 → corio-2.2.7}/corio.egg-info/dependency_links.txt +0 -0
  124. {corio-2.2.6 → corio-2.2.7}/corio.egg-info/entry_points.txt +0 -0
  125. {corio-2.2.6 → corio-2.2.7}/corio.egg-info/top_level.txt +0 -0
  126. {corio-2.2.6 → corio-2.2.7}/scripts/add-service +0 -0
  127. {corio-2.2.6 → corio-2.2.7}/scripts/add-user-path +0 -0
  128. {corio-2.2.6 → corio-2.2.7}/scripts/add-ve-shell +0 -0
  129. {corio-2.2.6 → corio-2.2.7}/scripts/apt-essentials +0 -0
  130. {corio-2.2.6 → corio-2.2.7}/scripts/apt-headless +0 -0
  131. {corio-2.2.6 → corio-2.2.7}/scripts/auth-token +0 -0
  132. {corio-2.2.6 → corio-2.2.7}/scripts/compose-update +0 -0
  133. {corio-2.2.6 → corio-2.2.7}/scripts/compress-dir +0 -0
  134. {corio-2.2.6 → corio-2.2.7}/scripts/cru +0 -0
  135. {corio-2.2.6 → corio-2.2.7}/scripts/docker-build-bases +0 -0
  136. {corio-2.2.6 → corio-2.2.7}/scripts/docker-build-bases-dev +0 -0
  137. {corio-2.2.6 → corio-2.2.7}/scripts/docker-install-deps +0 -0
  138. {corio-2.2.6 → corio-2.2.7}/scripts/docker-install-prod +0 -0
  139. {corio-2.2.6 → corio-2.2.7}/scripts/docker-prune +0 -0
  140. {corio-2.2.6 → corio-2.2.7}/scripts/docker-sandbox +0 -0
  141. {corio-2.2.6 → corio-2.2.7}/scripts/docker-sandbox-init +0 -0
  142. {corio-2.2.6 → corio-2.2.7}/scripts/docs-deploy +0 -0
  143. {corio-2.2.6 → corio-2.2.7}/scripts/download +0 -0
  144. {corio-2.2.6 → corio-2.2.7}/scripts/encrypt-secrets +0 -0
  145. {corio-2.2.6 → corio-2.2.7}/scripts/fmtr-test-script +0 -0
  146. {corio-2.2.6 → corio-2.2.7}/scripts/git-clone +0 -0
  147. {corio-2.2.6 → corio-2.2.7}/scripts/ha-addon-launch +0 -0
  148. {corio-2.2.6 → corio-2.2.7}/scripts/infra +0 -0
  149. {corio-2.2.6 → corio-2.2.7}/scripts/install-browser +0 -0
  150. {corio-2.2.6 → corio-2.2.7}/scripts/install-docker +0 -0
  151. {corio-2.2.6 → corio-2.2.7}/scripts/install-ts +0 -0
  152. {corio-2.2.6 → corio-2.2.7}/scripts/install-ys +0 -0
  153. {corio-2.2.6 → corio-2.2.7}/scripts/mirror-dir +0 -0
  154. {corio-2.2.6 → corio-2.2.7}/scripts/opt-dev-init +0 -0
  155. {corio-2.2.6 → corio-2.2.7}/scripts/parse-args +0 -0
  156. {corio-2.2.6 → corio-2.2.7}/scripts/pypi-check +0 -0
  157. {corio-2.2.6 → corio-2.2.7}/scripts/pypi-reserve +0 -0
  158. {corio-2.2.6 → corio-2.2.7}/scripts/run-script +0 -0
  159. {corio-2.2.6 → corio-2.2.7}/scripts/run-tests +0 -0
  160. {corio-2.2.6 → corio-2.2.7}/scripts/set-password +0 -0
  161. {corio-2.2.6 → corio-2.2.7}/scripts/set-secure-path +0 -0
  162. {corio-2.2.6 → corio-2.2.7}/scripts/set-user-sudo +0 -0
  163. {corio-2.2.6 → corio-2.2.7}/scripts/snips-install +0 -0
  164. {corio-2.2.6 → corio-2.2.7}/scripts/ssh-auth +0 -0
  165. {corio-2.2.6 → corio-2.2.7}/scripts/ssh-serve +0 -0
  166. {corio-2.2.6 → corio-2.2.7}/scripts/tasmota-config +0 -0
  167. {corio-2.2.6 → corio-2.2.7}/scripts/tasmota-flash +0 -0
  168. {corio-2.2.6 → corio-2.2.7}/scripts/tasmota-terminal +0 -0
  169. {corio-2.2.6 → corio-2.2.7}/scripts/vlc-tn +0 -0
  170. {corio-2.2.6 → corio-2.2.7}/scripts/vm-launch +0 -0
  171. {corio-2.2.6 → corio-2.2.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: corio
3
- Version: 2.2.6
3
+ Version: 2.2.7
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
5
  Author-email: Frontmatter AI <innovative.fowler@mask.pro.fmtr.dev>
6
6
  License-Expression: Apache-2.0
@@ -44,6 +44,9 @@ Requires-Dist: pytest-cov; extra == "dev"
44
44
  Provides-Extra: test
45
45
  Requires-Dist: pytest; extra == "test"
46
46
  Requires-Dist: pytest-cov; extra == "test"
47
+ Provides-Extra: yml
48
+ Requires-Dist: yamlscript; extra == "yml"
49
+ Requires-Dist: pyyaml; extra == "yml"
47
50
  Provides-Extra: yaml
48
51
  Requires-Dist: yamlscript; extra == "yaml"
49
52
  Requires-Dist: pyyaml; extra == "yaml"
@@ -12,16 +12,12 @@ from corio.path import Path, PackagePaths
12
12
  from corio.path.path import Metadata
13
13
  from corio.toml import ensure_table
14
14
 
15
-
16
15
  class IncrementorPyproject(Incrementor):
17
16
  AUTHOR_EMAIL = "innovative.fowler@mask.pro.fmtr.dev"
18
17
  ENTRYPOINT_COMMAND_SEP = "-"
19
18
  ENTRYPOINT_FUNCTION_SEP = "_"
20
19
  ENTRYPOINT_FUNC_NAME = "main"
21
20
  DEPENDENCIES_SECTION_PATH = ("tool", "corio", "dependencies")
22
- TEST_FILENAME_PREFIX = "test_"
23
- TEST_FILENAME_SUFFIX = ".py"
24
- TOX_REQUIRES = ["tox>=4.22", "tox-uv>=1"]
25
21
 
26
22
  @cached_property
27
23
  def path(self) -> Path:
@@ -86,7 +82,7 @@ class IncrementorPyproject(Incrementor):
86
82
 
87
83
  if requirement.specifier:
88
84
  operators = {specifier.operator for specifier in requirement.specifier}
89
- if not operators.issubset({"==", "==="}):
85
+ if operators != {"~="}:
90
86
  return dep
91
87
 
92
88
  extras = ""
@@ -97,23 +93,22 @@ class IncrementorPyproject(Incrementor):
97
93
  if requirement.marker:
98
94
  marker = f"; {requirement.marker}"
99
95
 
100
- pinned = f"{requirement.name}{extras}=={metadata.version}{marker}"
96
+ pinned = f"{requirement.name}{extras}~={metadata.version}{marker}"
101
97
  logger.info(f'Pinning editable dependency "{dep}" -> "{pinned}".')
102
98
  return pinned
103
99
 
104
- def _process_deps(self, deps: str|list[str]) -> str|list[str]:
100
+ def _process_deps(self, deps: str | list[str]) -> str | list[str]:
105
101
 
106
102
  if isinstance(deps, list):
107
- deps=[self._process_deps(dep) for dep in deps]
108
- deps=dedupe(deps)
103
+ deps = [self._process_deps(dep) for dep in deps]
104
+ deps = dedupe(deps)
109
105
  return deps
110
106
 
111
- dep=deps
112
- dep=self._pin_editable(dep)
107
+ dep = deps
108
+ dep = self._pin_editable(dep)
113
109
 
114
110
  return dep
115
111
 
116
-
117
112
  def apply(self) -> Path | list[Path] | None:
118
113
  if not self.path.exists():
119
114
  logger.info(f'pyproject.toml not found: "{self.path}". Skipping.')
@@ -132,7 +127,6 @@ class IncrementorPyproject(Incrementor):
132
127
  self.path.write_toml(data)
133
128
  return self.path
134
129
 
135
-
136
130
  @property
137
131
  def _author(self) -> str:
138
132
  if self.paths.metadata.is_client:
@@ -196,13 +190,11 @@ class IncrementorPyproject(Incrementor):
196
190
  values_resolved += resolve_values(value)
197
191
  return values_resolved
198
192
 
199
-
200
193
  extras = {key: dedupe(resolve_values(key)) for key in dependencies}
201
194
  install = extras.pop("install", [])
202
195
  extras["all"] = dedupe(list(chain.from_iterable(extras.values())))
203
196
  return install, extras
204
197
 
205
-
206
198
  def _enrich_toml(self, data):
207
199
  version = str(self.version)
208
200
  logger.info(f'Applying release version "{version}" to "{self.path}"...')
@@ -223,7 +215,6 @@ class IncrementorPyproject(Incrementor):
223
215
  elif "license-files" in project:
224
216
  del project["license-files"]
225
217
 
226
-
227
218
  deps_corio = data.get("tool", {}).get("corio", {}).get("dependencies", None)
228
219
  if deps_corio is not None:
229
220
  install, extras = self._flatten_dependencies(deps_corio)
@@ -232,7 +223,6 @@ class IncrementorPyproject(Incrementor):
232
223
  else:
233
224
  logger.info(f'No dependencies section found in "{self.path}". Skipping dependency enrichment.')
234
225
 
235
-
236
226
  deps = project.get("dependencies")
237
227
  if deps is not None:
238
228
  project["dependencies"] = self._process_deps(deps)
@@ -278,89 +268,93 @@ class IncrementorPyproject(Incrementor):
278
268
  del setuptools["script-files"]
279
269
 
280
270
  dependencies = project.get("optional-dependencies", {})
281
- envs = self._tox_envs(dependencies=dependencies)
271
+ gen = GeneratorTestEnvs(paths=self.paths, optionals=dependencies)
272
+
282
273
  tox = ensure_table(data, ("tool", "tox"))
283
- tox["requires"] = list(self.TOX_REQUIRES)
284
- tox["env_list"] = list(envs.keys())
285
- tox["env"] = envs
274
+ tox["requires"] = gen.TOX_REQUIRES
275
+ tox["env_list"] = list(gen.envs.keys())
276
+ tox["env"] = gen.envs
286
277
 
287
278
  return data
288
279
 
280
+ class GeneratorTestEnvs:
281
+ TEST_FILENAME_PREFIX = "test_"
282
+ TEST_FILENAME_SUFFIX = ".py"
283
+ TOX_REQUIRES = ["tox>=4.22", "tox-uv>=1"]
284
+
285
+ def __init__(self, *, paths, optionals: dict[str, list[str]]):
286
+ self.paths = paths
287
+ self.optionals = optionals
288
+
289
289
  @cached_property
290
290
  def _tests_modules(self) -> list[str]:
291
- if not self.paths.tests.exists():
292
- return []
293
-
294
291
  modules = []
295
- for path in sorted(self.paths.tests.glob(f"{self.TEST_FILENAME_PREFIX}*{self.TEST_FILENAME_SUFFIX}")):
296
- module = path.stem.removeprefix(self.TEST_FILENAME_PREFIX)
297
- if module:
298
- modules.append(module)
299
- return modules
300
-
301
- def _tox_get_extras_module(self, module: str, dependencies: dict[str, list[str]]) -> list[str]:
302
- extras = ["test"]
303
- extras_available = set(dependencies.keys())
304
- module_canonical = canonicalize_name(module)
305
-
306
- extras_exact = [extra for extra in extras_available if canonicalize_name(extra) == module_canonical]
307
- if extras_exact:
308
- extras = sorted(extras_exact) + extras
309
-
310
- extras_children = sorted(
311
- extra
312
- for extra in extras_available
313
- if canonicalize_name(extra).startswith(f"{module_canonical}-")
314
- )
315
- return extras_children + extras
316
-
317
- def _tox_get_deps_extras(self, extras: list[str], dependencies: dict[str, list[str]]) -> list[str]:
292
+ for path in self.paths.path.iterdir():
293
+ if path.is_dir():
294
+ if path.name in {"tests", "__pycache__"}:
295
+ continue
296
+ module = path.name
297
+ else:
298
+ if path.suffix != self.TEST_FILENAME_SUFFIX:
299
+ continue
300
+ if path.stem.startswith("_"):
301
+ continue
302
+ module = path.stem
303
+
304
+ path_test = self.get_path_test(module)
305
+ if not path_test.exists():
306
+ continue
307
+ modules.append(module)
308
+
309
+ return dedupe(sorted(modules))
310
+
311
+ @property
312
+ def deps_test(self):
313
+ return sorted(self.optionals['test'])
314
+
315
+ def get_deps(self, name):
316
+
318
317
  deps = []
319
- for extra in extras:
320
- deps += dependencies.get(extra, [])
321
- deps = dedupe(deps)
318
+ keys = [key for key in self.optionals.keys() if key == name or key.startswith(f"{name}.")]
319
+ for key in keys:
320
+ deps += self.optionals[key]
321
+
322
+ deps += self.deps_test
323
+
324
+ deps = sorted(dedupe(deps))
325
+
322
326
  return deps
323
327
 
324
- def _tox_get_env(
325
- self,
326
- *,
327
- name: str,
328
- path_tests: Path,
329
- extras: list[str],
330
- dependencies: dict[str, list[str]],
331
- ) -> dict:
332
- if path_tests.is_relative_to(self.paths.repo):
333
- path_tests = path_tests.relative_to(self.paths.repo)
334
- deps = self._tox_get_deps_extras(extras=extras, dependencies=dependencies)
335
- env = {
336
- "description": f"Run {name} tests.",
337
- "deps": deps,
338
- "commands": [["python", "-m", "pytest", "-q", str(path_tests)]],
328
+ def get_path_test(self, module: str) -> Path:
329
+ return self.paths.tests / f"{self.TEST_FILENAME_PREFIX}{module}{self.TEST_FILENAME_SUFFIX}"
330
+
331
+ def get_env(self, name, deps, path):
332
+ path=path.relative_to(self.paths.repo)
333
+ return {
334
+ name: dict(
335
+ description=f"Run {name} tests.",
336
+ deps=deps,
337
+ commands=[["python", "-m", "pytest", "-q", str(path)]],
338
+ )
339
339
  }
340
- return env
341
340
 
342
- def _tox_envs(self, dependencies: dict[str, list[str]]) -> dict[str, dict]:
341
+ @cached_property
342
+ def env(self):
343
+ name = self.paths.name_ns
344
+ path_tests = self.paths.tests
345
+ return self.get_env(name, self.deps_test, path_tests)
346
+
347
+ @cached_property
348
+ def envs(self) -> dict[str, dict]:
349
+
350
+ if not self._tests_modules:
351
+ return {}
352
+
343
353
  if not self.paths.metadata.test_envs:
344
- if not self._tests_modules:
345
- return {}
346
- return {
347
- self.paths.name_ns: self._tox_get_env(
348
- name=self.paths.name_ns,
349
- path_tests=self.paths.tests,
350
- extras=["test"],
351
- dependencies=dependencies,
352
- )
353
- }
354
+ return self.env
354
355
 
355
356
  envs = {}
356
357
  for module in self._tests_modules:
357
- extras = self._tox_get_extras_module(module=module, dependencies=dependencies)
358
- path_test = self.paths.tests / f"{self.TEST_FILENAME_PREFIX}{module}{self.TEST_FILENAME_SUFFIX}"
359
- name = module
360
- envs[name] = self._tox_get_env(
361
- name=name,
362
- path_tests=path_test,
363
- extras=extras,
364
- dependencies=dependencies,
365
- )
366
- return envs
358
+ path_test = self.get_path_test(module)
359
+ envs |= self.get_env(module, self.get_deps(module), path_test)
360
+ return envs
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "corio"
3
- version = "2.2.6"
3
+ version = "2.2.7"
4
4
  description = "Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML"
5
5
  readme = "README.md"
6
6
  dependencies = []
@@ -11,6 +11,7 @@ keywords = []
11
11
  [project.optional-dependencies]
12
12
  dev = ["logfire", "semver", "pydevd-pycharm~=251.25410.159", "pydantic-settings", "pydantic", "pydantic-extra-types", "pycountry", "yamlscript", "pyyaml", "beanie", "setuptools", "mkdocs", "mkdocs-material", "mkdocstrings[python]", "mike", "mkdocs-include-dir-to-nav", "build", "twine", "packaging", "pygit2", "python-on-whales", "deepmerge", "httpx", "httpx_retries", "logfire[httpx]", "fastapi", "uvicorn[standard]", "logfire[fastapi]", "tomlkit", "pyrage", "dotenv", "pytest", "pytest-cov"]
13
13
  test = ["pytest", "pytest-cov"]
14
+ yml = ["yamlscript", "pyyaml"]
14
15
  yaml = ["yamlscript", "pyyaml"]
15
16
  logging = ["logfire"]
16
17
  parallel = ["dask[bag]", "distributed", "bokeh"]
@@ -82,7 +83,7 @@ Homepage = "https://github.com/fmtr/corio"
82
83
  corio = "corio.entrypoint:main"
83
84
 
84
85
  [tool.corio.metadata]
85
- version = "2.2.6"
86
+ version = "2.2.7"
86
87
  port = 0
87
88
  base = "python"
88
89
  description = "Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML"
@@ -103,7 +104,8 @@ test_envs = true
103
104
  dev = ["logging", "version.dev", "debug", "sets", "yaml", "db.document", "infra"]
104
105
  install = []
105
106
  test = ["pytest", "pytest-cov"]
106
- yaml = ["yamlscript", "pyyaml"]
107
+ yml = ["yamlscript", "pyyaml"]
108
+ yaml = ["yml"]
107
109
  logging = ["logfire", "version"]
108
110
  parallel = ["dask[bag]", "distributed", "bokeh"]
109
111
  tokenization = ["tokenizers"]
@@ -163,7 +165,7 @@ secrets = ["encrypt", "env.io", "yaml", "logging", "sets", "vcs"]
163
165
  cli = ["sets", "logging"]
164
166
 
165
167
  [tool.setuptools]
166
- script-files = ["scripts/opt-dev-init", "scripts/docker-prune", "scripts/vlc-tn", "scripts/ha-addon-launch", "scripts/install-ys", "scripts/tasmota-config", "scripts/download", "scripts/run-script", "scripts/ssh-auth", "scripts/cru", "scripts/ssh-serve", "scripts/set-secure-path", "scripts/vm-launch", "scripts/auth-token", "scripts/set-user-sudo", "scripts/docker-build-bases", "scripts/fmtr-test-script", "scripts/compose-update", "scripts/add-ve-shell", "scripts/apt-headless", "scripts/snips-install", "scripts/install-ts", "scripts/tasmota-flash", "scripts/docs-deploy", "scripts/infra-sync", "scripts/parse-args", "scripts/docker-install-deps", "scripts/run-tests", "scripts/pypi-reserve", "scripts/install-docker", "scripts/set-password", "scripts/tasmota-terminal", "scripts/mirror-dir", "scripts/compress-dir", "scripts/pypi-check", "scripts/git-clone", "scripts/docker-sandbox", "scripts/docker-install-prod", "scripts/docker-sandbox-init", "scripts/install-browser", "scripts/docker-build-bases-dev", "scripts/apt-essentials", "scripts/encrypt-secrets", "scripts/add-user-path", "scripts/infra", "scripts/add-service"]
168
+ script-files = ["scripts/opt-dev-init", "scripts/docker-prune", "scripts/vlc-tn", "scripts/ha-addon-launch", "scripts/install-ys", "scripts/tasmota-config", "scripts/download", "scripts/run-script", "scripts/ssh-auth", "scripts/cru", "scripts/ssh-serve", "scripts/set-secure-path", "scripts/vm-launch", "scripts/auth-token", "scripts/set-user-sudo", "scripts/docker-build-bases", "scripts/fmtr-test-script", "scripts/compose-update", "scripts/add-ve-shell", "scripts/apt-headless", "scripts/snips-install", "scripts/install-ts", "scripts/tasmota-flash", "scripts/docs-deploy", "scripts/parse-args", "scripts/docker-install-deps", "scripts/run-tests", "scripts/pypi-reserve", "scripts/install-docker", "scripts/set-password", "scripts/tasmota-terminal", "scripts/mirror-dir", "scripts/compress-dir", "scripts/pypi-check", "scripts/git-clone", "scripts/docker-sandbox", "scripts/docker-install-prod", "scripts/docker-sandbox-init", "scripts/install-browser", "scripts/docker-build-bases-dev", "scripts/apt-essentials", "scripts/encrypt-secrets", "scripts/add-user-path", "scripts/infra", "scripts/add-service"]
167
169
 
168
170
  [tool.setuptools.packages.find]
169
171
  where = ["."]
@@ -175,11 +177,11 @@ corio = ["pyproject.package.toml"]
175
177
 
176
178
  [tool.tox]
177
179
  requires = ["tox>=4.22", "tox-uv>=1"]
178
- env_list = ["caching", "datatype", "dns", "dt", "encrypt", "env", "hash", "hook", "infra", "iterator", "jsn", "name", "path", "patterns", "rand", "strings", "toml", "tools", "yaml"]
180
+ env_list = ["caching", "datatype", "dns", "dt", "encrypt", "env", "hash", "hook", "infra", "iterator", "jsn", "name", "path", "patterns", "rand", "strings", "toml", "tools"]
179
181
 
180
182
  [tool.tox.env.caching]
181
183
  description = "Run caching tests."
182
- deps = ["diskcache", "cachetools", "pytest", "pytest-cov"]
184
+ deps = ["cachetools", "diskcache", "pytest", "pytest-cov"]
183
185
  commands = [["python", "-m", "pytest", "-q", "corio/tests/test_caching.py"]]
184
186
 
185
187
  [tool.tox.env.datatype]
@@ -189,7 +191,7 @@ commands = [["python", "-m", "pytest", "-q", "corio/tests/test_datatype.py"]]
189
191
 
190
192
  [tool.tox.env.dns]
191
193
  description = "Run dns tests."
192
- deps = ["dnspython[doh]", "httpx", "httpx_retries", "logfire", "logfire[httpx]", "diskcache", "cachetools", "pytest", "pytest-cov"]
194
+ deps = ["cachetools", "diskcache", "dnspython[doh]", "httpx", "httpx_retries", "logfire", "logfire[httpx]", "pytest", "pytest-cov"]
193
195
  commands = [["python", "-m", "pytest", "-q", "corio/tests/test_dns.py"]]
194
196
 
195
197
  [tool.tox.env.dt]
@@ -219,7 +221,7 @@ commands = [["python", "-m", "pytest", "-q", "corio/tests/test_hook.py"]]
219
221
 
220
222
  [tool.tox.env.infra]
221
223
  description = "Run infra tests."
222
- deps = ["semver", "logfire", "setuptools", "mkdocs", "mkdocs-material", "mkdocstrings[python]", "mike", "mkdocs-include-dir-to-nav", "pydantic-settings", "pydantic", "pydantic-extra-types", "pycountry", "yamlscript", "pyyaml", "build", "twine", "packaging", "pygit2", "python-on-whales", "deepmerge", "httpx", "httpx_retries", "logfire[httpx]", "fastapi", "uvicorn[standard]", "logfire[fastapi]", "tomlkit", "pyrage", "dotenv", "pytest", "pytest-cov"]
224
+ deps = ["build", "deepmerge", "dotenv", "fastapi", "httpx", "httpx_retries", "logfire", "logfire[fastapi]", "logfire[httpx]", "mike", "mkdocs", "mkdocs-include-dir-to-nav", "mkdocs-material", "mkdocstrings[python]", "packaging", "pycountry", "pydantic", "pydantic-extra-types", "pydantic-settings", "pygit2", "pyrage", "pytest", "pytest-cov", "python-on-whales", "pyyaml", "semver", "setuptools", "tomlkit", "twine", "uvicorn[standard]", "yamlscript"]
223
225
  commands = [["python", "-m", "pytest", "-q", "corio/tests/test_infra.py"]]
224
226
 
225
227
  [tool.tox.env.iterator]
@@ -244,7 +246,7 @@ commands = [["python", "-m", "pytest", "-q", "corio/tests/test_path.py"]]
244
246
 
245
247
  [tool.tox.env.patterns]
246
248
  description = "Run patterns tests."
247
- deps = ["regex", "pytest", "pytest-cov"]
249
+ deps = ["pytest", "pytest-cov", "regex"]
248
250
  commands = [["python", "-m", "pytest", "-q", "corio/tests/test_patterns.py"]]
249
251
 
250
252
  [tool.tox.env.rand]
@@ -259,7 +261,7 @@ commands = [["python", "-m", "pytest", "-q", "corio/tests/test_strings.py"]]
259
261
 
260
262
  [tool.tox.env.toml]
261
263
  description = "Run toml tests."
262
- deps = ["tomlkit", "pytest", "pytest-cov"]
264
+ deps = ["pytest", "pytest-cov", "tomlkit"]
263
265
  commands = [["python", "-m", "pytest", "-q", "corio/tests/test_toml.py"]]
264
266
 
265
267
  [tool.tox.env.tools]
@@ -267,11 +269,6 @@ description = "Run tools tests."
267
269
  deps = ["pytest", "pytest-cov"]
268
270
  commands = [["python", "-m", "pytest", "-q", "corio/tests/test_tools.py"]]
269
271
 
270
- [tool.tox.env.yaml]
271
- description = "Run yaml tests."
272
- deps = ["yamlscript", "pyyaml", "pytest", "pytest-cov"]
273
- commands = [["python", "-m", "pytest", "-q", "corio/tests/test_yaml.py"]]
274
-
275
272
  [build-system]
276
273
  requires = ["setuptools>=82", "wheel"]
277
274
  build-backend = "setuptools.build_meta"
@@ -2,7 +2,7 @@ from types import SimpleNamespace
2
2
 
3
3
  from packaging.requirements import Requirement
4
4
 
5
- from corio.infra.incrementor_pyproject import IncrementorPyproject
5
+ from corio.infra.incrementor_pyproject import IncrementorPyproject, GeneratorTestEnvs
6
6
  from corio.infra.releaser import Tester as ReleaserTester
7
7
  from corio.path import Path
8
8
 
@@ -18,6 +18,8 @@ def _write_editable_repo(path_repo: Path, name: str, version: str) -> None:
18
18
 
19
19
 
20
20
  def _make_incrementor(path_repo: Path, is_pre: bool = False, test_envs: bool = True) -> IncrementorPyproject:
21
+ path_package = path_repo / "corio"
22
+ path_package.mkdir(parents=True, exist_ok=True)
21
23
  path_tests = path_repo / "corio" / "tests"
22
24
  path_tests.mkdir(parents=True, exist_ok=True)
23
25
  parent = SimpleNamespace(
@@ -25,6 +27,7 @@ def _make_incrementor(path_repo: Path, is_pre: bool = False, test_envs: bool = T
25
27
  repo=path_repo,
26
28
  pyproject_repo=path_repo / "pyproject.toml",
27
29
  name_ns="corio",
30
+ path=path_package,
28
31
  tests=path_tests,
29
32
  metadata=SimpleNamespace(test_envs=test_envs),
30
33
  ),
@@ -48,7 +51,7 @@ def test_pin_editables_and_flatten_dependencies(tmp_path):
48
51
 
49
52
  incrementor = _make_incrementor(path_main_repo)
50
53
 
51
- assert incrementor._pin_editable("haco") == "haco==1.2.3"
54
+ assert incrementor._pin_editable("haco") == "haco~=1.2.3"
52
55
  assert incrementor._pin_editable("requests") == "requests"
53
56
 
54
57
  install, extras = incrementor._flatten_dependencies(
@@ -76,7 +79,7 @@ def test_pin_editables_resolves_uv_source_path(tmp_path):
76
79
  )
77
80
 
78
81
  incrementor = _make_incrementor(path_main_repo)
79
- assert incrementor._pin_editable("corio") == "corio==1.2.3"
82
+ assert incrementor._pin_editable("corio") == "corio~=1.2.3"
80
83
 
81
84
 
82
85
  def test_pin_editables_preserves_extras_and_skips_existing_specifiers(tmp_path):
@@ -98,9 +101,10 @@ def test_pin_editables_preserves_extras_and_skips_existing_specifiers(tmp_path):
98
101
  req = Requirement(dep)
99
102
  assert req.name == "haco"
100
103
  assert req.extras == {"version.dev", "logging", "sets", "yaml", "debug", "caching", "api", "mqtt"}
101
- assert str(req.specifier) == "==1.2.3"
104
+ assert str(req.specifier) == "~=1.2.3"
102
105
 
103
- assert incrementor._pin_editable("haco==1.0.0") == "haco==1.2.3"
106
+ assert incrementor._pin_editable("haco==1.0.0") == "haco==1.0.0"
107
+ assert incrementor._pin_editable("haco~=1.0.0") == "haco~=1.2.3"
104
108
  assert incrementor._pin_editable("haco>=1.0.0") == "haco>=1.0.0"
105
109
 
106
110
 
@@ -142,7 +146,7 @@ def test_pin_editables_allows_prerelease_when_current_is_prerelease(tmp_path):
142
146
 
143
147
  incrementor = _make_incrementor(path_main_repo, is_pre=True)
144
148
 
145
- assert incrementor._pin_editable("haco") == "haco==1.2.3-rc.1"
149
+ assert incrementor._pin_editable("haco") == "haco~=1.2.3-rc.1"
146
150
 
147
151
 
148
152
  def test_process_deps_pins_project_dependencies(tmp_path):
@@ -163,8 +167,13 @@ def test_process_deps_pins_project_dependencies(tmp_path):
163
167
  dependencies = ["haco", "requests>=2"]
164
168
  optional_dev = ["haco[logging]", "pytest"]
165
169
 
166
- assert incrementor._process_deps(dependencies) == ["haco==1.2.3", "requests>=2"]
167
- assert incrementor._process_deps(optional_dev) == ["haco[logging]==1.2.3", "pytest"]
170
+ assert incrementor._process_deps(dependencies) == ["haco~=1.2.3", "requests>=2"]
171
+ assert incrementor._process_deps(optional_dev) == ["haco[logging]~=1.2.3", "pytest"]
172
+
173
+
174
+ def _make_test_env_generator(path_repo: Path, *, test_envs: bool, dependencies: dict[str, list[str]]) -> GeneratorTestEnvs:
175
+ incrementor = _make_incrementor(path_repo, test_envs=test_envs)
176
+ return GeneratorTestEnvs(paths=incrementor.paths, optionals=dependencies)
168
177
 
169
178
 
170
179
  def _make_tester(path_repo: Path, *, env_list: list[str] | None = None) -> ReleaserTester:
@@ -200,45 +209,40 @@ def _make_tester(path_repo: Path, *, env_list: list[str] | None = None) -> Relea
200
209
  return ReleaserTester(parent)
201
210
 
202
211
 
203
- def test_incrementor_tox_get_extras_module_merges_module_and_dotted_children(tmp_path):
212
+ def test_generator_test_envs_get_deps_merges_module_and_dotted_children(tmp_path):
204
213
  path_repo = Path(tmp_path / "corio")
205
214
  path_repo.mkdir(parents=True)
206
- incrementor = _make_incrementor(path_repo, test_envs=True)
207
- dependencies = {
215
+ generator = _make_test_env_generator(path_repo, test_envs=True, dependencies={
208
216
  "test": ["pytest", "pytest-cov"],
209
217
  "path": [],
210
218
  "path.app": ["appdirs"],
211
219
  "path.type": ["filetype"],
212
220
  "strings": [],
213
- }
214
-
215
- assert incrementor._tox_get_extras_module("path", dependencies) == ["path.app", "path.type", "path", "test"]
216
- assert incrementor._tox_get_extras_module("strings", dependencies) == ["strings", "test"]
217
- assert incrementor._tox_get_extras_module("missing", dependencies) == ["test"]
221
+ })
222
+ assert generator.get_deps("path") == ["appdirs", "filetype", "pytest", "pytest-cov"]
223
+ assert generator.get_deps("strings") == ["pytest", "pytest-cov"]
224
+ assert generator.get_deps("missing") == ["pytest", "pytest-cov"]
218
225
 
219
226
 
220
- def test_incrementor_tox_get_deps_extras_resolves_superset(tmp_path):
227
+ def test_generator_test_envs_deps_resolves_superset(tmp_path):
221
228
  path_repo = Path(tmp_path / "corio")
222
229
  path_repo.mkdir(parents=True)
223
- incrementor = _make_incrementor(path_repo, test_envs=True)
224
230
  dependencies = {
225
231
  "test": ["pytest", "pytest-cov"],
226
232
  "path": [],
227
233
  "path.app": ["appdirs"],
228
234
  "path.type": ["filetype"],
229
235
  }
236
+ generator = _make_test_env_generator(path_repo, test_envs=True, dependencies=dependencies)
237
+ (generator.paths.path / "path.py").write_text("", encoding="utf-8")
238
+ (generator.paths.tests / "test_path.py").write_text("", encoding="utf-8")
230
239
 
231
- deps = incrementor._tox_get_deps_extras(["path.app", "path.type", "path", "test"], dependencies)
232
- assert deps == ["appdirs", "filetype", "pytest", "pytest-cov"]
240
+ assert generator.get_deps("path") == ["appdirs", "filetype", "pytest", "pytest-cov"]
233
241
 
234
242
 
235
- def test_incrementor_tox_envs_use_file_module_name_with_test_envs(tmp_path):
243
+ def test_generator_test_envs_use_file_module_name_with_test_envs(tmp_path):
236
244
  path_repo = Path(tmp_path / "corio")
237
245
  path_repo.mkdir(parents=True)
238
- incrementor = _make_incrementor(path_repo, test_envs=True)
239
- (incrementor.paths.tests / "test_path.py").write_text("", encoding="utf-8")
240
- (incrementor.paths.tests / "test_strings.py").write_text("", encoding="utf-8")
241
-
242
246
  dependencies = {
243
247
  "test": ["pytest", "pytest-cov"],
244
248
  "path": [],
@@ -246,38 +250,45 @@ def test_incrementor_tox_envs_use_file_module_name_with_test_envs(tmp_path):
246
250
  "path.type": ["filetype"],
247
251
  "strings": [],
248
252
  }
249
- envs = incrementor._tox_envs(dependencies=dependencies)
253
+ generator = _make_test_env_generator(path_repo, test_envs=True, dependencies=dependencies)
254
+ (generator.paths.path / "path.py").write_text("", encoding="utf-8")
255
+ (generator.paths.path / "strings.py").write_text("", encoding="utf-8")
256
+ (generator.paths.tests / "test_path.py").write_text("", encoding="utf-8")
257
+ (generator.paths.tests / "test_strings.py").write_text("", encoding="utf-8")
258
+ envs = generator.envs
250
259
 
251
260
  assert set(envs) == {"path", "strings"}
252
261
  assert envs["path"]["deps"] == ["appdirs", "filetype", "pytest", "pytest-cov"]
253
262
  assert envs["strings"]["deps"] == ["pytest", "pytest-cov"]
254
263
 
255
264
 
256
- def test_incrementor_tox_envs_fall_back_to_single_env_when_test_envs_disabled(tmp_path):
265
+ def test_generator_test_envs_fall_back_to_single_env_when_test_envs_disabled(tmp_path):
257
266
  path_repo = Path(tmp_path / "corio")
258
267
  path_repo.mkdir(parents=True)
259
- incrementor = _make_incrementor(path_repo, test_envs=False)
260
- (incrementor.paths.tests / "test_path.py").write_text("", encoding="utf-8")
261
-
262
- envs = incrementor._tox_envs(dependencies={"test": ["pytest", "pytest-cov"]})
268
+ generator = _make_test_env_generator(path_repo, test_envs=False, dependencies={"test": ["pytest", "pytest-cov"]})
269
+ (generator.paths.path / "path.py").write_text("", encoding="utf-8")
270
+ (generator.paths.tests / "test_path.py").write_text("", encoding="utf-8")
271
+ envs = generator.envs
263
272
 
264
273
  assert set(envs) == {"corio"}
265
274
  assert envs["corio"]["deps"] == ["pytest", "pytest-cov"]
266
275
 
267
276
 
268
- def test_incrementor_tox_envs_canonicalizes_dotted_extras(tmp_path):
277
+ def test_generator_test_envs_resolves_dotted_extras(tmp_path):
269
278
  path_repo = Path(tmp_path / "corio")
270
279
  path_repo.mkdir(parents=True)
271
- incrementor = _make_incrementor(path_repo, test_envs=True)
272
- (incrementor.paths.tests / "test_env.py").write_text("", encoding="utf-8")
273
-
274
- envs = incrementor._tox_envs(
280
+ generator = _make_test_env_generator(
281
+ path_repo,
282
+ test_envs=True,
275
283
  dependencies={
276
284
  "test": ["pytest", "pytest-cov"],
277
285
  "env": [],
278
286
  "env.io": ["dotenv"],
279
- }
287
+ },
280
288
  )
289
+ (generator.paths.path / "env.py").write_text("", encoding="utf-8")
290
+ (generator.paths.tests / "test_env.py").write_text("", encoding="utf-8")
291
+ envs = generator.envs
281
292
 
282
293
  assert envs["env"]["deps"] == ["dotenv", "pytest", "pytest-cov"]
283
294
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: corio
3
- Version: 2.2.6
3
+ Version: 2.2.7
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
5
  Author-email: Frontmatter AI <innovative.fowler@mask.pro.fmtr.dev>
6
6
  License-Expression: Apache-2.0
@@ -44,6 +44,9 @@ Requires-Dist: pytest-cov; extra == "dev"
44
44
  Provides-Extra: test
45
45
  Requires-Dist: pytest; extra == "test"
46
46
  Requires-Dist: pytest-cov; extra == "test"
47
+ Provides-Extra: yml
48
+ Requires-Dist: yamlscript; extra == "yml"
49
+ Requires-Dist: pyyaml; extra == "yml"
47
50
  Provides-Extra: yaml
48
51
  Requires-Dist: yamlscript; extra == "yaml"
49
52
  Requires-Dist: pyyaml; extra == "yaml"
@@ -144,7 +144,6 @@ scripts/fmtr-test-script
144
144
  scripts/git-clone
145
145
  scripts/ha-addon-launch
146
146
  scripts/infra
147
- scripts/infra-sync
148
147
  scripts/install-browser
149
148
  scripts/install-docker
150
149
  scripts/install-ts
@@ -443,5 +443,9 @@ logfire[httpx]
443
443
  yamlscript
444
444
  pyyaml
445
445
 
446
+ [yml]
447
+ yamlscript
448
+ pyyaml
449
+
446
450
  [youtube]
447
451
  pytubefix