corio 2.2.4__tar.gz → 2.2.5__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.
- {corio-2.2.4 → corio-2.2.5}/PKG-INFO +1 -1
- {corio-2.2.4 → corio-2.2.5}/corio/ai/agentic.py +0 -40
- {corio-2.2.4 → corio-2.2.5}/corio/ai/infer.py +0 -5
- {corio-2.2.4 → corio-2.2.5}/corio/api.py +0 -5
- {corio-2.2.4 → corio-2.2.5}/corio/caching.py +0 -31
- {corio-2.2.4 → corio-2.2.5}/corio/debug.py +0 -10
- {corio-2.2.4 → corio-2.2.5}/corio/https.py +0 -6
- {corio-2.2.4 → corio-2.2.5}/corio/infra/api.py +0 -4
- {corio-2.2.4 → corio-2.2.5}/corio/infra/incrementor_pyproject.py +89 -0
- {corio-2.2.4 → corio-2.2.5}/corio/infra/releaser.py +11 -87
- {corio-2.2.4 → corio-2.2.5}/corio/interface/interface.py +0 -3
- {corio-2.2.4 → corio-2.2.5}/corio/logs.py +0 -6
- {corio-2.2.4 → corio-2.2.5}/corio/openai.py +0 -5
- {corio-2.2.4 → corio-2.2.5}/corio/path/path.py +0 -4
- {corio-2.2.4 → corio-2.2.5}/corio/patterns.py +0 -4
- {corio-2.2.4 → corio-2.2.5}/corio/pdf.py +0 -13
- {corio-2.2.4 → corio-2.2.5}/corio/pyproject.package.toml +173 -74
- {corio-2.2.4 → corio-2.2.5}/corio/sec.py +0 -4
- corio-2.2.5/corio/tests/test_caching.py +75 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_infra.py +99 -37
- {corio-2.2.4 → corio-2.2.5}/corio/webhook.py +0 -5
- {corio-2.2.4 → corio-2.2.5}/corio/yml.py +0 -6
- {corio-2.2.4 → corio-2.2.5}/corio.egg-info/PKG-INFO +1 -1
- {corio-2.2.4 → corio-2.2.5}/corio.egg-info/SOURCES.txt +1 -0
- {corio-2.2.4 → corio-2.2.5}/pyproject.toml +173 -74
- corio-2.2.5/scripts/run-tests +7 -0
- corio-2.2.4/corio/tests/test_caching.py +0 -39
- {corio-2.2.4 → corio-2.2.5}/LICENSE +0 -0
- {corio-2.2.4 → corio-2.2.5}/README.md +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/ai/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/aio.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/augmentation.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/av.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/constants.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/context.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dataclass.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/datatype.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/db/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/db/document.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dm.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dns/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dns/client.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dns/dm.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dns/proxy.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dns/server.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/docker/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/dt.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/encrypt.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/entrypoint.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/env.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/function.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/google_api.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/ha/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/ha/constants.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/ha/core.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/ha/supervisor.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/ha/utils.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/hash.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/hfh.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/hook.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/infra/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/infra/project.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/infra/repository.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/infra/stack.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/inherit.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/inspection.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/interface/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/interface/context.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/interface/controls.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/iterator.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/jsn.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/json_fix.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/markup.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/merging.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/metric.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/mqtt.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/name.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/net.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/netrc.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/parallel.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/path/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/path/app.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/path/type.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/paths.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/plat.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/process.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/profiling.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/rand.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/semantic.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/sets.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/setup/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/spaces.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/strings.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tabular.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/conftest.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/helpers.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_datatype.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_dns.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_dt.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_encrypt.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_env.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_hash.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_hook.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_iterator.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_jsn.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_name.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_path.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_patterns.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_rand.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_strings.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_toml.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_tools.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tests/test_yaml.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tokenization.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/toml.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/tools.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/unicode.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/version/__init__.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/version/version.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio/youtube.py +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio.egg-info/dependency_links.txt +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio.egg-info/entry_points.txt +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio.egg-info/requires.txt +0 -0
- {corio-2.2.4 → corio-2.2.5}/corio.egg-info/top_level.txt +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/add-service +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/add-user-path +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/add-ve-shell +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/apt-essentials +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/apt-headless +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/auth-token +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/compose-update +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/compress-dir +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/cru +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-build-bases +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-build-bases-dev +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-install-deps +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-install-prod +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-prune +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-sandbox +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docker-sandbox-init +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/docs-deploy +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/download +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/encrypt-secrets +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/fmtr-test-script +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/git-clone +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/ha-addon-launch +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/infra +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/infra-sync +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/install-browser +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/install-docker +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/install-ts +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/install-ys +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/mirror-dir +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/opt-dev-init +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/parse-args +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/pypi-check +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/pypi-reserve +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/run-script +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/set-password +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/set-secure-path +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/set-user-sudo +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/snips-install +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/ssh-auth +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/ssh-serve +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/tasmota-config +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/tasmota-flash +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/tasmota-terminal +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/vlc-tn +0 -0
- {corio-2.2.4 → corio-2.2.5}/scripts/vm-launch +0 -0
- {corio-2.2.4 → corio-2.2.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: corio
|
|
3
|
-
Version: 2.2.
|
|
3
|
+
Version: 2.2.5
|
|
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
|
|
@@ -177,43 +177,3 @@ def default_prompt_none_specified(text):
|
|
|
177
177
|
|
|
178
178
|
|
|
179
179
|
StringDefaultNoneSpecified = Annotated[Optional[str], PlainValidator(default_prompt_none_specified)]
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if __name__ == '__main__':
|
|
183
|
-
import asyncio
|
|
184
|
-
from corio import dm
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
class TestOutput(dm.Base):
|
|
188
|
-
text: str
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
class TestDeps(dm.Base):
|
|
192
|
-
lang: str
|
|
193
|
-
subject: str
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
class TaskTest(Task):
|
|
197
|
-
PROVIDER = Task.PROVIDER_FMTR
|
|
198
|
-
MODEL_ID = Task.MODEL_ID_FMTR
|
|
199
|
-
TypeOutput = TestOutput
|
|
200
|
-
SYSTEM_PROMPT_STATIC = 'Tell the user jokes.'
|
|
201
|
-
|
|
202
|
-
@property
|
|
203
|
-
def tool_output(self) -> OutputSpec[TestOutput]:
|
|
204
|
-
return NativeOutput(self.TypeOutput)
|
|
205
|
-
|
|
206
|
-
def add_system_prompt(self, ctx: RunContext[TestDeps]) -> str:
|
|
207
|
-
return f'The jokes must be in the {ctx.deps.lang} language.'
|
|
208
|
-
|
|
209
|
-
def get_prompt(self, deps: Optional[TestDeps]) -> str:
|
|
210
|
-
return f'Tell me one about {deps.subject}.'
|
|
211
|
-
|
|
212
|
-
task = TaskTest()
|
|
213
|
-
deps = TestDeps(lang='English', subject='eggs')
|
|
214
|
-
result1 = task.sync_runner(task.run(deps=deps))
|
|
215
|
-
result1
|
|
216
|
-
|
|
217
|
-
deps = TestDeps(lang='German', subject='sausages')
|
|
218
|
-
result2 = task.sync_runner(task.run(deps=deps))
|
|
219
|
-
result2
|
|
@@ -178,34 +178,3 @@ class TLRU(cachetools.TLRUCache):
|
|
|
178
178
|
|
|
179
179
|
"""
|
|
180
180
|
return self.dump()
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
if __name__ == '__main__':
|
|
185
|
-
sec10 = timedelta(seconds=10)
|
|
186
|
-
c = TLRU(ttu_static=sec10, maxsize=2, desc='Test Data')
|
|
187
|
-
c['test'] = 'val'
|
|
188
|
-
c['test2'] = 'val2'
|
|
189
|
-
c['test3'] = 'val3'
|
|
190
|
-
c
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
path_tmp_cache = Path.cwd().parent.parent / 'data' / 'cache'
|
|
198
|
-
tc = Disk(path_tmp_cache)
|
|
199
|
-
|
|
200
|
-
tc.setdefault('c', Disk).setdefault('c1', Disk)['subkey'] = 0000.1
|
|
201
|
-
# tc['c']=Disk.Create
|
|
202
|
-
tc['c']['test'] = False
|
|
203
|
-
tc['val'] = 123
|
|
204
|
-
tc.setdefault('b', Disk)
|
|
205
|
-
tc.setdefault('a', Disk)
|
|
206
|
-
tc['a']['value2'] = 456
|
|
207
|
-
tc['a']['value4'] = dict(mykey='myvalue')
|
|
208
|
-
|
|
209
|
-
tc['b']['value3'] = [789, True]
|
|
210
|
-
tc.dump()
|
|
211
|
-
{}.items()
|
|
@@ -78,13 +78,3 @@ def debug_shell():
|
|
|
78
78
|
data = ShellDebug.from_path(path_str)
|
|
79
79
|
trace(is_debug=True)
|
|
80
80
|
data
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
if __name__ == "__main__":
|
|
84
|
-
import sys
|
|
85
|
-
|
|
86
|
-
sys.argv = [
|
|
87
|
-
'test.py',
|
|
88
|
-
'./fmtr-debug/34e8d492-2f15-419a-8fcb-fe4fa0fa02bb',
|
|
89
|
-
]
|
|
90
|
-
debug_shell()
|
|
@@ -19,6 +19,9 @@ class IncrementorPyproject(Incrementor):
|
|
|
19
19
|
ENTRYPOINT_FUNCTION_SEP = "_"
|
|
20
20
|
ENTRYPOINT_FUNC_NAME = "main"
|
|
21
21
|
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"]
|
|
22
25
|
|
|
23
26
|
@cached_property
|
|
24
27
|
def path(self) -> Path:
|
|
@@ -274,4 +277,90 @@ class IncrementorPyproject(Incrementor):
|
|
|
274
277
|
elif "script-files" in setuptools:
|
|
275
278
|
del setuptools["script-files"]
|
|
276
279
|
|
|
280
|
+
dependencies = project.get("optional-dependencies", {})
|
|
281
|
+
envs = self._tox_envs(dependencies=dependencies)
|
|
282
|
+
tox = ensure_table(data, ("tool", "tox"))
|
|
283
|
+
tox["requires"] = list(self.TOX_REQUIRES)
|
|
284
|
+
tox["env_list"] = list(envs.keys())
|
|
285
|
+
tox["env"] = envs
|
|
286
|
+
|
|
277
287
|
return data
|
|
288
|
+
|
|
289
|
+
@cached_property
|
|
290
|
+
def _tests_modules(self) -> list[str]:
|
|
291
|
+
if not self.paths.tests.exists():
|
|
292
|
+
return []
|
|
293
|
+
|
|
294
|
+
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]:
|
|
318
|
+
deps = []
|
|
319
|
+
for extra in extras:
|
|
320
|
+
deps += dependencies.get(extra, [])
|
|
321
|
+
deps = dedupe(deps)
|
|
322
|
+
return deps
|
|
323
|
+
|
|
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)]],
|
|
339
|
+
}
|
|
340
|
+
return env
|
|
341
|
+
|
|
342
|
+
def _tox_envs(self, dependencies: dict[str, list[str]]) -> dict[str, dict]:
|
|
343
|
+
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
|
+
|
|
355
|
+
envs = {}
|
|
356
|
+
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
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import shutil
|
|
2
1
|
import subprocess
|
|
3
2
|
from functools import cached_property
|
|
4
|
-
|
|
3
|
+
import shutil
|
|
5
4
|
import build
|
|
6
5
|
import pygit2 as vcs
|
|
7
6
|
import twine.settings
|
|
@@ -571,20 +570,6 @@ class ReleaseDocumentation(Release):
|
|
|
571
570
|
class Tester(Inherit[Releaser]):
|
|
572
571
|
TEST_FILENAME_PREFIX = "test_"
|
|
573
572
|
TEST_FILENAME_SUFFIX = ".py"
|
|
574
|
-
TOX_REQUIRES = ["tox>=4.22", "tox-uv>=1"]
|
|
575
|
-
|
|
576
|
-
@cached_property
|
|
577
|
-
def path_config_dir(self) -> Path:
|
|
578
|
-
return Path.temp() / f"{self.name}-tox"
|
|
579
|
-
|
|
580
|
-
@cached_property
|
|
581
|
-
def path_config(self) -> Path:
|
|
582
|
-
return self.path_config_dir / "tox.toml"
|
|
583
|
-
|
|
584
|
-
@cached_property
|
|
585
|
-
def dependencies(self) -> dict[str, list[str]]:
|
|
586
|
-
data = self.paths.pyproject_repo.read_toml()
|
|
587
|
-
return data["project"].get("optional-dependencies",{})
|
|
588
573
|
|
|
589
574
|
@cached_property
|
|
590
575
|
def modules(self) -> list[str]:
|
|
@@ -598,69 +583,10 @@ class Tester(Inherit[Releaser]):
|
|
|
598
583
|
modules.append(module)
|
|
599
584
|
return modules
|
|
600
585
|
|
|
601
|
-
|
|
602
|
-
def get_env(self, name: str, path_tests: Path, extras: list[str]) -> dict:
|
|
603
|
-
if path_tests.is_relative_to(self.paths.repo):
|
|
604
|
-
path_tests = path_tests.relative_to(self.paths.repo)
|
|
605
|
-
deps = self.get_deps_extras(extras)
|
|
606
|
-
env = {
|
|
607
|
-
"description": f"Run {name} tests.",
|
|
608
|
-
"extras": extras,
|
|
609
|
-
"deps": deps,
|
|
610
|
-
"commands": [["python", "-m", "pytest", "-q", str(path_tests)]],
|
|
611
|
-
}
|
|
612
|
-
return env
|
|
613
|
-
|
|
614
586
|
@cached_property
|
|
615
|
-
def
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
def get_extras_module(self, module: str) -> list[str]:
|
|
619
|
-
extras = ["test"]
|
|
620
|
-
extras_available = set(self.dependencies.keys())
|
|
621
|
-
|
|
622
|
-
if module in extras_available:
|
|
623
|
-
extras.insert(0, module)
|
|
624
|
-
|
|
625
|
-
extras_children = sorted(extra for extra in extras_available if extra.startswith(f"{module}."))
|
|
626
|
-
return extras_children + extras
|
|
627
|
-
|
|
628
|
-
def get_deps_extras(self, extras: list[str]) -> list[str]:
|
|
629
|
-
resolved = []
|
|
630
|
-
for extra in extras:
|
|
631
|
-
resolved.extend(self.dependencies.get(extra, []))
|
|
632
|
-
return list(dict.fromkeys(resolved))
|
|
633
|
-
|
|
634
|
-
@cached_property
|
|
635
|
-
def envs(self) -> dict[str, dict]:
|
|
636
|
-
if not self.paths.metadata.test_envs:
|
|
637
|
-
if not self.modules:
|
|
638
|
-
return {}
|
|
639
|
-
return {self.paths.name_ns: self.env}
|
|
640
|
-
|
|
641
|
-
envs = {}
|
|
642
|
-
|
|
643
|
-
for module in self.modules:
|
|
644
|
-
extras = self.get_extras_module(module)
|
|
645
|
-
|
|
646
|
-
path_test = self.paths.tests / f"{self.TEST_FILENAME_PREFIX}{module}{self.TEST_FILENAME_SUFFIX}"
|
|
647
|
-
name = f"{self.paths.name_ns}.{module}"
|
|
648
|
-
envs[name] = self.get_env(name=name, path_tests=path_test, extras=extras)
|
|
649
|
-
|
|
650
|
-
return envs
|
|
651
|
-
|
|
652
|
-
@cached_property
|
|
653
|
-
def data(self) -> dict:
|
|
654
|
-
data = {
|
|
655
|
-
"requires": self.TOX_REQUIRES,
|
|
656
|
-
"env_list": list(self.envs.keys()),
|
|
657
|
-
"env": self.envs,
|
|
658
|
-
}
|
|
659
|
-
return data
|
|
660
|
-
|
|
661
|
-
def write_config(self):
|
|
662
|
-
self.path_config_dir.mkdir(parents=True, exist_ok=True)
|
|
663
|
-
self.path_config.write_toml(self.data)
|
|
587
|
+
def env_list(self) -> list[str]:
|
|
588
|
+
data = self.paths.pyproject_repo.read_toml()
|
|
589
|
+
return list(data.get("tool", {}).get("tox", {}).get("env_list", []))
|
|
664
590
|
|
|
665
591
|
def run_subprocess(self) -> int:
|
|
666
592
|
command = [
|
|
@@ -669,7 +595,7 @@ class Tester(Inherit[Releaser]):
|
|
|
669
595
|
"tox-uv",
|
|
670
596
|
"tox",
|
|
671
597
|
"-c",
|
|
672
|
-
str(self.
|
|
598
|
+
str(self.paths.pyproject_repo),
|
|
673
599
|
"--root",
|
|
674
600
|
str(self.paths.repo),
|
|
675
601
|
"--workdir",
|
|
@@ -695,17 +621,15 @@ class Tester(Inherit[Releaser]):
|
|
|
695
621
|
|
|
696
622
|
@logger.instrument('Running test suite for "{self.paths.name_ns}"...')
|
|
697
623
|
def run(self) -> bool:
|
|
698
|
-
if not self.
|
|
624
|
+
if not self.modules:
|
|
699
625
|
logger.warning(f'No tests found under "{self.paths.tests}". Skipping.')
|
|
700
626
|
return True
|
|
701
627
|
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
self.path_config.unlink(missing_ok=True)
|
|
708
|
-
shutil.rmtree(self.path_config_dir, ignore_errors=True)
|
|
628
|
+
if not self.env_list:
|
|
629
|
+
logger.warning(f'No tox envs found in "{self.paths.pyproject_repo}". Skipping.')
|
|
630
|
+
return True
|
|
631
|
+
|
|
632
|
+
code = self.run_subprocess()
|
|
709
633
|
|
|
710
634
|
if code == 0:
|
|
711
635
|
logger.info("All test environments passed.")
|
|
@@ -148,9 +148,3 @@ def get_native_level_from_otel(otel_name: str) -> int:
|
|
|
148
148
|
|
|
149
149
|
|
|
150
150
|
logger = get_logger(name=Constants.LIBRARY_NAME)
|
|
151
|
-
|
|
152
|
-
if __name__ == '__main__':
|
|
153
|
-
logger.info('Hello World')
|
|
154
|
-
logger.warning('test warning')
|
|
155
|
-
logger.debug('Hello World')
|
|
156
|
-
logger
|
|
@@ -216,16 +216,3 @@ class Document(pm.Document):
|
|
|
216
216
|
documents.append(document)
|
|
217
217
|
|
|
218
218
|
return documents
|
|
219
|
-
|
|
220
|
-
if __name__ == '__main__':
|
|
221
|
-
from corio.path import Path
|
|
222
|
-
|
|
223
|
-
PATH_DATA = Path.data()
|
|
224
|
-
# PATH_PDF=PATH_DATA/'chib.pdf'
|
|
225
|
-
PATH_PDF = PATH_DATA / 'kvm.pdf'
|
|
226
|
-
assert PATH_PDF.exists()
|
|
227
|
-
|
|
228
|
-
doc = Document(PATH_PDF)
|
|
229
|
-
data = doc.data
|
|
230
|
-
md = doc.to_markdown()
|
|
231
|
-
md
|