fmtr.tools 1.1.1__py3-none-any.whl → 1.3.81__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. fmtr/tools/__init__.py +68 -52
  2. fmtr/tools/ai_tools/__init__.py +2 -2
  3. fmtr/tools/ai_tools/agentic_tools.py +151 -32
  4. fmtr/tools/ai_tools/inference_tools.py +2 -1
  5. fmtr/tools/api_tools.py +8 -5
  6. fmtr/tools/caching_tools.py +101 -3
  7. fmtr/tools/constants.py +33 -0
  8. fmtr/tools/context_tools.py +23 -0
  9. fmtr/tools/data_modelling_tools.py +227 -14
  10. fmtr/tools/database_tools/__init__.py +6 -0
  11. fmtr/tools/database_tools/document.py +51 -0
  12. fmtr/tools/datatype_tools.py +21 -1
  13. fmtr/tools/datetime_tools.py +12 -0
  14. fmtr/tools/debugging_tools.py +60 -0
  15. fmtr/tools/dns_tools/__init__.py +7 -0
  16. fmtr/tools/dns_tools/client.py +97 -0
  17. fmtr/tools/dns_tools/dm.py +257 -0
  18. fmtr/tools/dns_tools/proxy.py +66 -0
  19. fmtr/tools/dns_tools/server.py +138 -0
  20. fmtr/tools/docker_tools/__init__.py +6 -0
  21. fmtr/tools/entrypoints/__init__.py +0 -0
  22. fmtr/tools/entrypoints/cache_hfh.py +3 -0
  23. fmtr/tools/entrypoints/ep_test.py +2 -0
  24. fmtr/tools/entrypoints/install_yamlscript.py +8 -0
  25. fmtr/tools/{console_script_tools.py → entrypoints/remote_debug_test.py} +1 -6
  26. fmtr/tools/entrypoints/shell_debug.py +8 -0
  27. fmtr/tools/environment_tools.py +2 -2
  28. fmtr/tools/function_tools.py +77 -1
  29. fmtr/tools/google_api_tools.py +15 -4
  30. fmtr/tools/http_tools.py +26 -0
  31. fmtr/tools/inherit_tools.py +27 -0
  32. fmtr/tools/interface_tools/__init__.py +8 -0
  33. fmtr/tools/interface_tools/context.py +13 -0
  34. fmtr/tools/interface_tools/controls.py +354 -0
  35. fmtr/tools/interface_tools/interface_tools.py +189 -0
  36. fmtr/tools/iterator_tools.py +29 -0
  37. fmtr/tools/logging_tools.py +43 -16
  38. fmtr/tools/packaging_tools.py +14 -0
  39. fmtr/tools/path_tools/__init__.py +12 -0
  40. fmtr/tools/path_tools/app_path_tools.py +40 -0
  41. fmtr/tools/{path_tools.py → path_tools/path_tools.py} +156 -12
  42. fmtr/tools/path_tools/type_path_tools.py +3 -0
  43. fmtr/tools/pattern_tools.py +260 -0
  44. fmtr/tools/pdf_tools.py +39 -1
  45. fmtr/tools/settings_tools.py +23 -4
  46. fmtr/tools/setup_tools/__init__.py +8 -0
  47. fmtr/tools/setup_tools/setup_tools.py +447 -0
  48. fmtr/tools/string_tools.py +92 -13
  49. fmtr/tools/tabular_tools.py +61 -0
  50. fmtr/tools/tools.py +27 -2
  51. fmtr/tools/version +1 -1
  52. fmtr/tools/version_tools/__init__.py +12 -0
  53. fmtr/tools/version_tools/version_tools.py +51 -0
  54. fmtr/tools/webhook_tools.py +17 -0
  55. fmtr/tools/yaml_tools.py +66 -5
  56. {fmtr_tools-1.1.1.dist-info → fmtr_tools-1.3.81.dist-info}/METADATA +136 -54
  57. fmtr_tools-1.3.81.dist-info/RECORD +93 -0
  58. {fmtr_tools-1.1.1.dist-info → fmtr_tools-1.3.81.dist-info}/WHEEL +1 -1
  59. fmtr_tools-1.3.81.dist-info/entry_points.txt +6 -0
  60. fmtr_tools-1.3.81.dist-info/top_level.txt +1 -0
  61. fmtr/tools/docker_tools.py +0 -30
  62. fmtr/tools/interface_tools.py +0 -64
  63. fmtr/tools/version_tools.py +0 -62
  64. fmtr_tools-1.1.1.dist-info/RECORD +0 -65
  65. fmtr_tools-1.1.1.dist-info/entry_points.txt +0 -3
  66. fmtr_tools-1.1.1.dist-info/top_level.txt +0 -2
  67. {fmtr_tools-1.1.1.dist-info → fmtr_tools-1.3.81.dist-info}/licenses/LICENSE +0 -0
@@ -1,7 +1,68 @@
1
+ import deepdiff
2
+ import numpy as np
1
3
  import pandas as pd
2
4
 
5
+ from fmtr.tools.iterator_tools import dedupe
6
+
3
7
  Table = DataFrame = pd.DataFrame
4
8
  Series = pd.Series
5
9
 
10
+ nan = np.nan
11
+
6
12
  CONCAT_HORIZONTALLY = 1
7
13
  CONCAT_VERTICALLY = 0
14
+
15
+
16
+ def normalize_nan(df, value=np.nan):
17
+ return df.replace({pd.NA: value, None: value, np.nan: value})
18
+
19
+
20
+ class Differ:
21
+ """
22
+
23
+ Diff two dataframes via DeepDiff, after shape normalization, datatype simplification, etc.
24
+
25
+ """
26
+
27
+ def __init__(self, left: Table, right: Table):
28
+
29
+ self.cols = dedupe(left.columns.tolist() + right.columns.tolist())
30
+ self.rows = dedupe(left.index.values.tolist() + right.index.values.tolist())
31
+ self.left = self.process(left)
32
+ self.right = self.process(right)
33
+ self.dfs = [self.left, self.right]
34
+
35
+ def process(self, df: Table) -> Table:
36
+ """
37
+
38
+ Ensure same rows/columns, plus simplify datatypes via JSON round-robin.
39
+
40
+ """
41
+
42
+ df_rows = set(df.index.values.tolist())
43
+ for row in self.rows:
44
+ if row in df_rows:
45
+ continue
46
+ df.loc[len(df)] = None
47
+
48
+ df_cols = set(df.columns.tolist())
49
+ for col in self.cols:
50
+ if col in df_cols:
51
+ continue
52
+ df[col] = None
53
+
54
+ df = pd.read_json(df.to_json(date_format='iso'))
55
+ df = normalize_nan(df, value=None)
56
+
57
+ return df
58
+
59
+ def get_diff(self) -> deepdiff.DeepDiff:
60
+ """
61
+
62
+ Cast to dicts and get diff
63
+
64
+ """
65
+
66
+ dicts = [df.to_dict(orient='index') for df in self.dfs]
67
+ diff = deepdiff.DeepDiff(*dicts, ignore_order=True)
68
+ return diff
fmtr/tools/tools.py CHANGED
@@ -27,7 +27,15 @@ def identity(x: Any) -> Any:
27
27
  return x
28
28
 
29
29
 
30
- class Empty:
30
+ class Special:
31
+ """
32
+
33
+ Classes to differentiate special arguments from primitive arguments.
34
+
35
+ """
36
+
37
+
38
+ class Empty(Special):
31
39
  """
32
40
 
33
41
  Class to denote an unspecified object (e.g. argument) when `None` cannot be used.
@@ -35,7 +43,7 @@ class Empty:
35
43
  """
36
44
 
37
45
 
38
- class Raise:
46
+ class Raise(Special):
39
47
  """
40
48
 
41
49
  Class to denote when a function should raise instead of e.g. returning a default.
@@ -43,4 +51,21 @@ class Raise:
43
51
  """
44
52
 
45
53
 
54
+ class Auto(Special):
55
+ """
56
+
57
+ Class to denote when an argument should be inferred.
58
+
59
+ """
60
+
61
+
62
+ class Required(Special):
63
+ """
64
+
65
+ Class to denote when an argument is required.
66
+
67
+ """
68
+
69
+
70
+
46
71
  EMPTY = Empty()
fmtr/tools/version CHANGED
@@ -1 +1 @@
1
- 1.1.1
1
+ 1.3.81
@@ -0,0 +1,12 @@
1
+ from fmtr.tools.import_tools import MissingExtraMockModule
2
+
3
+ from fmtr.tools.version_tools.version_tools import read, read_path, get
4
+
5
+ try:
6
+ import semver
7
+
8
+ semver = semver
9
+ parse = semver.VersionInfo.parse
10
+
11
+ except ModuleNotFoundError as exception:
12
+ semver = parse = MissingExtraMockModule('version.dev', exception)
@@ -0,0 +1,51 @@
1
+ from fmtr.tools import environment_tools as env
2
+ from fmtr.tools.constants import Constants
3
+ from fmtr.tools.inspection_tools import get_call_path
4
+
5
+
6
+ def read() -> str:
7
+ """
8
+
9
+ Read a generic version file from the calling package path.
10
+
11
+ """
12
+
13
+ path = get_call_path(offset=2).parent / Constants.FILENAME_VERSION
14
+ return read_path(path)
15
+
16
+
17
+ def read_path(path) -> str:
18
+ """
19
+
20
+ Read in version from specified path
21
+
22
+ """
23
+ from fmtr.tools.tools import Constants
24
+ text = path.read_text(encoding=Constants.ENCODING).strip()
25
+
26
+ text = get(text)
27
+ return text
28
+
29
+
30
+ def get(text) -> str:
31
+ """
32
+
33
+ Optionally add dev build info to raw version string.
34
+
35
+ """
36
+
37
+ if not env.IS_DEV:
38
+ return text
39
+
40
+ import datetime
41
+ from fmtr.tools.tools import Constants
42
+ from fmtr.tools.version_tools import parse
43
+
44
+ timestamp = datetime.datetime.now(datetime.timezone.utc).strftime(Constants.DATETIME_SEMVER_BUILD_FORMAT)
45
+
46
+ version = parse(text)
47
+ version = version.bump_patch()
48
+ version = version.replace(prerelease=Constants.DEVELOPMENT, build=timestamp)
49
+ text = str(version)
50
+
51
+ return text
@@ -0,0 +1,17 @@
1
+ from fmtr.tools import environment_tools, Constants
2
+ from fmtr.tools.http_tools import client
3
+
4
+
5
+ def notify(title, body, url=None):
6
+ """
7
+
8
+ Send simple debug notification
9
+
10
+ """
11
+ url = url or environment_tools.get(Constants.WEBHOOK_URL_NOTIFY_KEY)
12
+ client.post(url, json=dict(title=title, body=body))
13
+
14
+
15
+ if __name__ == '__main__':
16
+ notify('Title', 'Body')
17
+ notify
fmtr/tools/yaml_tools.py CHANGED
@@ -1,12 +1,65 @@
1
+ from functools import lru_cache
1
2
  from typing import Any
2
- from yaml import CLoader as Loader, CDumper as Dumper
3
- from yaml import load, dump
3
+ from yaml import CDumper as Dumper
4
+ from yaml import dump
4
5
 
6
+ from fmtr.tools import environment_tools as env
5
7
 
6
- def to_yaml(obj: Any) -> str:
8
+ try:
9
+ import yamlscript
10
+ except ImportError:
11
+ raise # Raise if even the package isn't installed, to trigger the regular missing extra exception.
12
+ except Exception as exception:
13
+ pass # Allow missing binary, so we can install on-demand
14
+
15
+
16
+ def install():
7
17
  """
8
18
 
19
+ Installs the YAML Script runtime binary of the specified version.
9
20
 
21
+ """
22
+ import subprocess
23
+ from fmtr.tools import logger, packaging
24
+
25
+ version = packaging.get_version('yamlscript')
26
+ logger.warning(f"Installing YAML Script runtime binary version {version}...")
27
+ result = subprocess.run(f"curl https://yamlscript.org/install | VERSION={version} LIB=1 bash", shell=True, check=True)
28
+ return result
29
+
30
+
31
+ @lru_cache
32
+ def get_module(is_auto=env.IS_DEV):
33
+ """
34
+
35
+ Get the YAML Script runtime module, installing the runtime if specified
36
+
37
+ """
38
+ try:
39
+ import yamlscript
40
+ except Exception as exception:
41
+ if not is_auto:
42
+ raise ImportError(f'YAML Script runtime missing and {is_auto=}. Set to {True} to install.') from exception
43
+ install()
44
+ import yamlscript
45
+ return yamlscript
46
+
47
+
48
+ @lru_cache
49
+ def get_interpreter():
50
+ """
51
+
52
+ Fetches and returns a cached instance of the YAMLScript interpreter.
53
+
54
+ """
55
+ module = get_module()
56
+ interpreter = module.YAMLScript()
57
+ return interpreter
58
+
59
+ def to_yaml(obj: Any) -> str:
60
+ """
61
+
62
+ Serialize to YAML
10
63
 
11
64
  """
12
65
  yaml_str = dump(obj, allow_unicode=True, Dumper=Dumper)
@@ -16,8 +69,16 @@ def to_yaml(obj: Any) -> str:
16
69
  def from_yaml(yaml_str: str) -> Any:
17
70
  """
18
71
 
19
-
72
+ Deserialize from YAML
20
73
 
21
74
  """
22
- obj = load(yaml_str, Loader=Loader)
75
+ obj = get_interpreter().load(yaml_str)
23
76
  return obj
77
+
78
+
79
+ if __name__ == '__main__':
80
+ from fmtr.tools import Path
81
+
82
+ py = Path('hw.yml')
83
+ data = py.read_yaml()
84
+ data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.1.1
3
+ Version: 1.3.81
4
4
  Summary: Collection of high-level tools to simplify everyday development tasks, with a focus on AI/ML
5
5
  Home-page: https://github.com/fmtr/fmtr.tools
6
6
  Author: Frontmatter
@@ -8,56 +8,26 @@ Author-email: innovative.fowler@mask.pro.fmtr.dev
8
8
  License: Copyright © 2025 Frontmatter. All rights reserved.
9
9
  Description-Content-Type: text/markdown
10
10
  License-File: LICENSE
11
+ Provides-Extra: dev
12
+ Requires-Dist: logfire; extra == "dev"
13
+ Requires-Dist: semver; extra == "dev"
14
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "dev"
15
+ Requires-Dist: pydantic-settings; extra == "dev"
16
+ Requires-Dist: pydantic; extra == "dev"
17
+ Requires-Dist: pydantic-extra-types; extra == "dev"
18
+ Requires-Dist: pycountry; extra == "dev"
19
+ Requires-Dist: yamlscript; extra == "dev"
20
+ Requires-Dist: pyyaml; extra == "dev"
21
+ Requires-Dist: yamlscript; extra == "dev"
22
+ Requires-Dist: pyyaml; extra == "dev"
23
+ Requires-Dist: beanie[odm]; extra == "dev"
11
24
  Provides-Extra: test
12
- Requires-Dist: peft; extra == "test"
13
- Requires-Dist: flet-webview; extra == "test"
14
- Requires-Dist: html2text; extra == "test"
15
- Requires-Dist: deepmerge; extra == "test"
16
- Requires-Dist: tabulate; extra == "test"
17
- Requires-Dist: torchvision; extra == "test"
18
- Requires-Dist: pandas; extra == "test"
19
- Requires-Dist: distributed; extra == "test"
20
- Requires-Dist: google-api-python-client; extra == "test"
21
- Requires-Dist: semver; extra == "test"
22
- Requires-Dist: pymupdf; extra == "test"
23
- Requires-Dist: openpyxl; extra == "test"
24
- Requires-Dist: google-auth; extra == "test"
25
- Requires-Dist: logfire; extra == "test"
26
- Requires-Dist: pymupdf4llm; extra == "test"
27
- Requires-Dist: sentence_transformers; extra == "test"
28
- Requires-Dist: tinynetrc; extra == "test"
29
- Requires-Dist: torchaudio; extra == "test"
30
- Requires-Dist: google-auth-httplib2; extra == "test"
31
- Requires-Dist: flet-video; extra == "test"
32
- Requires-Dist: Unidecode; extra == "test"
33
- Requires-Dist: uvicorn; extra == "test"
34
- Requires-Dist: pyyaml; extra == "test"
35
- Requires-Dist: transformers[sentencepiece]; extra == "test"
36
- Requires-Dist: pydantic-settings; extra == "test"
37
- Requires-Dist: openai; extra == "test"
38
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "test"
39
- Requires-Dist: pydantic; extra == "test"
40
- Requires-Dist: sre_yield; extra == "test"
41
- Requires-Dist: dask[bag]; extra == "test"
42
- Requires-Dist: tokenizers; extra == "test"
43
- Requires-Dist: huggingface_hub; extra == "test"
44
25
  Requires-Dist: pytest-cov; extra == "test"
45
- Requires-Dist: diskcache; extra == "test"
46
- Requires-Dist: json_repair; extra == "test"
47
- Requires-Dist: ollama; extra == "test"
48
- Requires-Dist: bokeh; extra == "test"
49
- Requires-Dist: google-auth-oauthlib; extra == "test"
50
- Requires-Dist: contexttimer; extra == "test"
51
- Requires-Dist: flet[all]; extra == "test"
52
- Requires-Dist: pydevd-pycharm; extra == "test"
53
- Requires-Dist: faker; extra == "test"
54
- Requires-Dist: docker; extra == "test"
55
- Requires-Dist: fastapi; extra == "test"
56
26
  Provides-Extra: yaml
27
+ Requires-Dist: yamlscript; extra == "yaml"
57
28
  Requires-Dist: pyyaml; extra == "yaml"
58
29
  Provides-Extra: logging
59
30
  Requires-Dist: logfire; extra == "logging"
60
- Requires-Dist: semver; extra == "logging"
61
31
  Provides-Extra: parallel
62
32
  Requires-Dist: dask[bag]; extra == "parallel"
63
33
  Requires-Dist: distributed; extra == "parallel"
@@ -69,15 +39,15 @@ Requires-Dist: faker; extra == "augmentation"
69
39
  Requires-Dist: sre_yield; extra == "augmentation"
70
40
  Provides-Extra: process
71
41
  Requires-Dist: logfire; extra == "process"
72
- Requires-Dist: semver; extra == "process"
73
42
  Provides-Extra: profiling
74
43
  Requires-Dist: contexttimer; extra == "profiling"
75
- Provides-Extra: docker-api
76
- Requires-Dist: docker; extra == "docker-api"
44
+ Provides-Extra: docker-client
45
+ Requires-Dist: python-on-whales; extra == "docker-client"
77
46
  Provides-Extra: unicode
78
47
  Requires-Dist: Unidecode; extra == "unicode"
79
48
  Provides-Extra: version
80
- Requires-Dist: semver; extra == "version"
49
+ Provides-Extra: version-dev
50
+ Requires-Dist: semver; extra == "version-dev"
81
51
  Provides-Extra: spaces
82
52
  Requires-Dist: tinynetrc; extra == "spaces"
83
53
  Provides-Extra: netrc
@@ -88,24 +58,31 @@ Provides-Extra: merging
88
58
  Requires-Dist: deepmerge; extra == "merging"
89
59
  Provides-Extra: api
90
60
  Requires-Dist: fastapi; extra == "api"
91
- Requires-Dist: uvicorn; extra == "api"
61
+ Requires-Dist: uvicorn[standard]; extra == "api"
92
62
  Requires-Dist: logfire; extra == "api"
93
- Requires-Dist: semver; extra == "api"
94
63
  Requires-Dist: pydantic; extra == "api"
64
+ Requires-Dist: pydantic-extra-types; extra == "api"
65
+ Requires-Dist: pycountry; extra == "api"
66
+ Requires-Dist: logfire[fastapi]; extra == "api"
95
67
  Provides-Extra: ai
96
68
  Requires-Dist: peft; extra == "ai"
97
69
  Requires-Dist: transformers[sentencepiece]; extra == "ai"
98
70
  Requires-Dist: torchvision; extra == "ai"
99
71
  Requires-Dist: torchaudio; extra == "ai"
100
72
  Requires-Dist: pydantic; extra == "ai"
73
+ Requires-Dist: pydantic-extra-types; extra == "ai"
74
+ Requires-Dist: pycountry; extra == "ai"
101
75
  Provides-Extra: dm
102
76
  Requires-Dist: pydantic; extra == "dm"
77
+ Requires-Dist: pydantic-extra-types; extra == "dm"
78
+ Requires-Dist: pycountry; extra == "dm"
103
79
  Provides-Extra: openai-api
104
80
  Requires-Dist: openai; extra == "openai-api"
105
81
  Provides-Extra: ai-client
106
82
  Requires-Dist: logfire; extra == "ai-client"
107
- Requires-Dist: semver; extra == "ai-client"
108
83
  Requires-Dist: pydantic; extra == "ai-client"
84
+ Requires-Dist: pydantic-extra-types; extra == "ai-client"
85
+ Requires-Dist: pycountry; extra == "ai-client"
109
86
  Requires-Dist: openai; extra == "ai-client"
110
87
  Requires-Dist: pydantic-ai[logfire,openai]; extra == "ai-client"
111
88
  Requires-Dist: ollama; extra == "ai-client"
@@ -116,21 +93,26 @@ Requires-Dist: sentence_transformers; extra == "semantic"
116
93
  Requires-Dist: pandas; extra == "semantic"
117
94
  Requires-Dist: tabulate; extra == "semantic"
118
95
  Requires-Dist: openpyxl; extra == "semantic"
96
+ Requires-Dist: odfpy; extra == "semantic"
97
+ Requires-Dist: deepdiff; extra == "semantic"
119
98
  Provides-Extra: metric
120
99
  Requires-Dist: pandas; extra == "metric"
121
100
  Requires-Dist: tabulate; extra == "metric"
122
101
  Requires-Dist: openpyxl; extra == "metric"
102
+ Requires-Dist: odfpy; extra == "metric"
103
+ Requires-Dist: deepdiff; extra == "metric"
123
104
  Provides-Extra: tabular
124
105
  Requires-Dist: pandas; extra == "tabular"
125
106
  Requires-Dist: tabulate; extra == "tabular"
126
107
  Requires-Dist: openpyxl; extra == "tabular"
108
+ Requires-Dist: odfpy; extra == "tabular"
109
+ Requires-Dist: deepdiff; extra == "tabular"
127
110
  Provides-Extra: html
128
111
  Requires-Dist: html2text; extra == "html"
129
112
  Provides-Extra: interface
130
113
  Requires-Dist: flet[all]; extra == "interface"
131
114
  Requires-Dist: flet-video; extra == "interface"
132
115
  Requires-Dist: flet-webview; extra == "interface"
133
- Requires-Dist: pydantic; extra == "interface"
134
116
  Provides-Extra: google-api
135
117
  Requires-Dist: google-auth; extra == "google-api"
136
118
  Requires-Dist: google-auth-oauthlib; extra == "google-api"
@@ -138,15 +120,113 @@ Requires-Dist: google-auth-httplib2; extra == "google-api"
138
120
  Requires-Dist: google-api-python-client; extra == "google-api"
139
121
  Provides-Extra: caching
140
122
  Requires-Dist: diskcache; extra == "caching"
123
+ Requires-Dist: cachetools; extra == "caching"
141
124
  Provides-Extra: pdf
142
125
  Requires-Dist: pymupdf; extra == "pdf"
143
126
  Requires-Dist: pydantic; extra == "pdf"
127
+ Requires-Dist: pydantic-extra-types; extra == "pdf"
128
+ Requires-Dist: pycountry; extra == "pdf"
144
129
  Requires-Dist: pymupdf4llm; extra == "pdf"
145
130
  Provides-Extra: debug
146
- Requires-Dist: pydevd-pycharm; extra == "debug"
131
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "debug"
147
132
  Provides-Extra: sets
148
133
  Requires-Dist: pydantic-settings; extra == "sets"
149
134
  Requires-Dist: pydantic; extra == "sets"
135
+ Requires-Dist: pydantic-extra-types; extra == "sets"
136
+ Requires-Dist: pycountry; extra == "sets"
137
+ Requires-Dist: yamlscript; extra == "sets"
138
+ Requires-Dist: pyyaml; extra == "sets"
139
+ Provides-Extra: path-app
140
+ Requires-Dist: appdirs; extra == "path-app"
141
+ Provides-Extra: path-type
142
+ Requires-Dist: filetype; extra == "path-type"
143
+ Provides-Extra: dns
144
+ Requires-Dist: dnspython[doh]; extra == "dns"
145
+ Requires-Dist: httpx; extra == "dns"
146
+ Requires-Dist: httpx_retries; extra == "dns"
147
+ Requires-Dist: logfire; extra == "dns"
148
+ Requires-Dist: logfire[httpx]; extra == "dns"
149
+ Provides-Extra: patterns
150
+ Requires-Dist: regex; extra == "patterns"
151
+ Provides-Extra: http
152
+ Requires-Dist: httpx; extra == "http"
153
+ Requires-Dist: httpx_retries; extra == "http"
154
+ Requires-Dist: logfire; extra == "http"
155
+ Requires-Dist: logfire[httpx]; extra == "http"
156
+ Provides-Extra: setup
157
+ Requires-Dist: setuptools; extra == "setup"
158
+ Provides-Extra: webhook
159
+ Requires-Dist: httpx; extra == "webhook"
160
+ Requires-Dist: httpx_retries; extra == "webhook"
161
+ Requires-Dist: logfire; extra == "webhook"
162
+ Requires-Dist: logfire[httpx]; extra == "webhook"
163
+ Provides-Extra: browsers
164
+ Requires-Dist: playwright; extra == "browsers"
165
+ Provides-Extra: db
166
+ Provides-Extra: db-document
167
+ Requires-Dist: beanie[odm]; extra == "db-document"
168
+ Provides-Extra: all
169
+ Requires-Dist: pycountry; extra == "all"
170
+ Requires-Dist: httpx; extra == "all"
171
+ Requires-Dist: bokeh; extra == "all"
172
+ Requires-Dist: httpx_retries; extra == "all"
173
+ Requires-Dist: odfpy; extra == "all"
174
+ Requires-Dist: faker; extra == "all"
175
+ Requires-Dist: Unidecode; extra == "all"
176
+ Requires-Dist: pymupdf4llm; extra == "all"
177
+ Requires-Dist: cachetools; extra == "all"
178
+ Requires-Dist: distributed; extra == "all"
179
+ Requires-Dist: openpyxl; extra == "all"
180
+ Requires-Dist: beanie[odm]; extra == "all"
181
+ Requires-Dist: torchvision; extra == "all"
182
+ Requires-Dist: torchaudio; extra == "all"
183
+ Requires-Dist: pandas; extra == "all"
184
+ Requires-Dist: tabulate; extra == "all"
185
+ Requires-Dist: pydantic-extra-types; extra == "all"
186
+ Requires-Dist: ollama; extra == "all"
187
+ Requires-Dist: json_repair; extra == "all"
188
+ Requires-Dist: logfire[httpx]; extra == "all"
189
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
190
+ Requires-Dist: peft; extra == "all"
191
+ Requires-Dist: tokenizers; extra == "all"
192
+ Requires-Dist: fastapi; extra == "all"
193
+ Requires-Dist: pyyaml; extra == "all"
194
+ Requires-Dist: pymupdf; extra == "all"
195
+ Requires-Dist: sre_yield; extra == "all"
196
+ Requires-Dist: pydantic-settings; extra == "all"
197
+ Requires-Dist: pydantic; extra == "all"
198
+ Requires-Dist: flet[all]; extra == "all"
199
+ Requires-Dist: google-auth; extra == "all"
200
+ Requires-Dist: google-auth-oauthlib; extra == "all"
201
+ Requires-Dist: appdirs; extra == "all"
202
+ Requires-Dist: playwright; extra == "all"
203
+ Requires-Dist: deepdiff; extra == "all"
204
+ Requires-Dist: regex; extra == "all"
205
+ Requires-Dist: dask[bag]; extra == "all"
206
+ Requires-Dist: python-on-whales; extra == "all"
207
+ Requires-Dist: uvicorn[standard]; extra == "all"
208
+ Requires-Dist: pytest-cov; extra == "all"
209
+ Requires-Dist: sentence_transformers; extra == "all"
210
+ Requires-Dist: logfire[fastapi]; extra == "all"
211
+ Requires-Dist: contexttimer; extra == "all"
212
+ Requires-Dist: filetype; extra == "all"
213
+ Requires-Dist: dnspython[doh]; extra == "all"
214
+ Requires-Dist: diskcache; extra == "all"
215
+ Requires-Dist: semver; extra == "all"
216
+ Requires-Dist: flet-video; extra == "all"
217
+ Requires-Dist: setuptools; extra == "all"
218
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
219
+ Requires-Dist: google-auth-httplib2; extra == "all"
220
+ Requires-Dist: logfire; extra == "all"
221
+ Requires-Dist: openai; extra == "all"
222
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
223
+ Requires-Dist: html2text; extra == "all"
224
+ Requires-Dist: flet-webview; extra == "all"
225
+ Requires-Dist: huggingface_hub; extra == "all"
226
+ Requires-Dist: google-api-python-client; extra == "all"
227
+ Requires-Dist: tinynetrc; extra == "all"
228
+ Requires-Dist: deepmerge; extra == "all"
229
+ Requires-Dist: yamlscript; extra == "all"
150
230
  Dynamic: author
151
231
  Dynamic: author-email
152
232
  Dynamic: description
@@ -284,6 +364,8 @@ The included modules, plus any extra requirements, are as follows:
284
364
  -
285
365
  `tools.PackagePaths` class for managing canonical package paths, like settings files, artifact directories, version files.
286
366
  - Extras: None
367
+ - `tools.AppPaths` Wrapper around `appdirs` for application paths.
368
+ - Extras: `paths.app`
287
369
  - `tools.platform`: Detecting if host is WSL, Docker etc.
288
370
  - Extras: None
289
371
  - `tools.ContextProcess`: Manages a function running in a separate process using a context manager. Provides methods to start, stop, and restart the process, with configurable restart delays. Useful for ensuring clean process management and automatic stopping when the context manager exits.
@@ -0,0 +1,93 @@
1
+ fmtr/tools/__init__.py,sha256=Qh3jGKdC3MMZd7vQvIlrhZ0U7oTcTpBueX39VZwxX4U,5952
2
+ fmtr/tools/api_tools.py,sha256=RyZUlTefSQozfl-8feZGauyUkwcFd-jU0KtKHFxHea4,2272
3
+ fmtr/tools/async_tools.py,sha256=ewz757WcveQJd-G5SVr2JDOQVbdLGecCgl-tsBGVZz4,284
4
+ fmtr/tools/augmentation_tools.py,sha256=-6ESbO4CDlKqVOV1J1V6qBeoBMzbFIinkDHRHnCBej0,55
5
+ fmtr/tools/caching_tools.py,sha256=74p7m2GLFfeP41LX69wxgfkilxEAoWkMIfFMjKsYpyg,4976
6
+ fmtr/tools/constants.py,sha256=h85mq2JuOsHj-TUKnV0rYTddWFRSRAd4yLyCkpeGjX0,1887
7
+ fmtr/tools/context_tools.py,sha256=4UvIHYgLqAh7dXMX9EBrLEpYp81qfzhSVrkffOSAoGA,350
8
+ fmtr/tools/data_modelling_tools.py,sha256=c703EhL2ZIj5iN0wjuohakvUnElRblQhvFSLyfRTWwA,7416
9
+ fmtr/tools/dataclass_tools.py,sha256=0Gt6KeLhtPgubo_2tYkIVqB8oQ91Qzag8OAGZDdjvMU,1209
10
+ fmtr/tools/datatype_tools.py,sha256=qFPFrZK70-an4w7H46g8eT5j6Jez--U2XnmFdrQibeE,1983
11
+ fmtr/tools/datetime_tools.py,sha256=L7wmBoQbD9h_pJIL92WQOX32r_vrXgRvE-_0PVPRAGY,232
12
+ fmtr/tools/debugging_tools.py,sha256=_xzqS0V5BpL8d06j-jVQjGgI7T020QsqVXKAKMz7Du8,2082
13
+ fmtr/tools/environment_tools.py,sha256=43uqfj1G1bNX0IwKz-NKbu3AbFYSdbBuGN9rlThe030,1845
14
+ fmtr/tools/function_tools.py,sha256=O1K8HwftXfzrBblNZrj-BhWNbr4poJghrXNr2mFcylI,2831
15
+ fmtr/tools/google_api_tools.py,sha256=QUungBoj5SCaBQnMjn9QpXtWmdNCplbw8ZPK9LXi77U,1691
16
+ fmtr/tools/hash_tools.py,sha256=tr4HXpeT6rRrDk6TvMlRPUSrLRRaov96y128OI2tzsc,729
17
+ fmtr/tools/hfh_tools.py,sha256=DCDIWuWlhtmIGCtp9cLcOTTEw_4yN_NocLX8w5NZsbk,2384
18
+ fmtr/tools/html_tools.py,sha256=0nN8Nz5HtG9bXyApYfHSKEivLlxjsm3Gn6Mg2TK0brI,394
19
+ fmtr/tools/http_tools.py,sha256=RVwGrBNMyjfbpgAPCSnxEkXfSzXXWARb3ayq981ONQE,464
20
+ fmtr/tools/import_tools.py,sha256=XJmiWLukRncJAcaGReDn4jIz1_IpVBjfYCQHH1hIg7c,588
21
+ fmtr/tools/inherit_tools.py,sha256=gTGL4mRm5RsbFW76s25AbuAJ2vlymbh1c8Q4Hl2uJGU,646
22
+ fmtr/tools/inspection_tools.py,sha256=tLTRvzy9XVomQPi0dfnF_cgwc7KiDVZAr7gPTk4S_bQ,278
23
+ fmtr/tools/iterator_tools.py,sha256=ucsDj-T4YgwRCieFvjBXLfTe4RipL1CJ1_1GOxvEIW8,1816
24
+ fmtr/tools/json_fix_tools.py,sha256=vNSlswVQnujPmKEqDjFJcO901mjMyv59q3awsT7mlhs,477
25
+ fmtr/tools/json_tools.py,sha256=WkFc5q7oqMtcFejhN1K5zQFULa9TdLOup83Fr0saDRY,348
26
+ fmtr/tools/logging_tools.py,sha256=jZFKnL-7HHOaPkn7F3fT9DyffIgwY-g7SEQ0p1RhzBo,2673
27
+ fmtr/tools/merging_tools.py,sha256=KDxCEFJEQJEwGw1qGKAgR55uUE2X2S5NWLKcfHRmX_k,227
28
+ fmtr/tools/metric_tools.py,sha256=Lvia5CGFRIfrDFA8s37btIfTU5zHbo04cPJdAMtbndQ,272
29
+ fmtr/tools/name_tools.py,sha256=5CB_phqhHjl66iI8oLxOGPF2odC1apdul-M8Fv2xBhs,5514
30
+ fmtr/tools/netrc_tools.py,sha256=PpNpz_mWlQi6VHGromKwFfTyLpHUXsd4LY6-OKLCbeI,376
31
+ fmtr/tools/openai_tools.py,sha256=6SUgejgzUzmlKKct2_ePXntvMegu3FJgfk9x7aqtqYc,742
32
+ fmtr/tools/packaging_tools.py,sha256=FlgOTnDRHZWQL2iR-wucTsyGEHRE-MlddKL30MPmUqE,253
33
+ fmtr/tools/parallel_tools.py,sha256=QEb_gN1StkxsqYaH4HSjiJX8Y3gpb2uKNsOzG4uFpaM,3071
34
+ fmtr/tools/pattern_tools.py,sha256=TTHhOOQdiPz2oDzgTjBlGDZhSPZoHq-LjTNtBQ_BPpo,6357
35
+ fmtr/tools/pdf_tools.py,sha256=6XQCNyytQSnJSc38gdMOFVcPXnPwfOlk6y4QVqmJLp8,4810
36
+ fmtr/tools/platform_tools.py,sha256=7p69CmAHe_sF68Fx9uVhns1k5EewTHTWgUYzkl6ZQKA,308
37
+ fmtr/tools/process_tools.py,sha256=Ysh5Dk2QFBhXQerArjKdt7xZd3JrN5Ho02AaOjH0Nnw,1425
38
+ fmtr/tools/profiling_tools.py,sha256=jpXVjaNKPydTasEQVNXvxzGtMhXPit08AnJddkU8uIc,46
39
+ fmtr/tools/random_tools.py,sha256=4VlQdk5THbR8ka4pZaLbk_ZO_4yy6PF_lHZes_rgenY,2223
40
+ fmtr/tools/semantic_tools.py,sha256=cxY9NSAHWj4nEc6Oj4qA1omR3dWbl2OuH7_PkINc6_E,1386
41
+ fmtr/tools/settings_tools.py,sha256=Uq1-Cdzz83I4dmr62K0L4xFUsUqp0uDI9SeYCa6EHc0,2426
42
+ fmtr/tools/spaces_tools.py,sha256=D_he3mve6DruB3OPS6QyzqD05ChHnRTb4buViKPe7To,1099
43
+ fmtr/tools/string_tools.py,sha256=ZKHBrl2tui9VjWt7qit4UWbvpuzY6zp5ytiQvhlJVG4,5610
44
+ fmtr/tools/tabular_tools.py,sha256=mw6vOij1Ch-pVAyHMPtm5zj__ULZN_TKeBYOfj33wFM,1634
45
+ fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
46
+ fmtr/tools/tools.py,sha256=sLMXk8juOL8_n_D776cJ-kzjyMHqFI_fctDEjy6PIKs,1115
47
+ fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
48
+ fmtr/tools/version,sha256=3J0Md1fBVomXIzXQrRcnC-9bSI5q8T7FQRVSY_eeRSk,6
49
+ fmtr/tools/webhook_tools.py,sha256=q3pVJ1NCem2SrMuFcLxiWd7DibFs7Q-uGtojfXd3Qcg,380
50
+ fmtr/tools/yaml_tools.py,sha256=Bhhyd6GQVKO72Lp8ky7bAUjIB_65Hdh0Q45SKIEe6S8,1901
51
+ fmtr/tools/ai_tools/__init__.py,sha256=O8VRlPnnQCncg2ZZ2l_VdWLJf4jkKH6dkZFVbv6o7IM,388
52
+ fmtr/tools/ai_tools/agentic_tools.py,sha256=Zj6WcbDc1yLFi3raTSD0BeOkWR3l5RmmccFYGx8-0XE,5534
53
+ fmtr/tools/ai_tools/inference_tools.py,sha256=2UP2gXEyOJUjyyV6zmFIYmIxUsh1rXkRH0IbFvr2bRs,11908
54
+ fmtr/tools/database_tools/__init__.py,sha256=-YXEs3P4nwg7hdvALpaW4K2Pg9FIc49rD53smqnBgT4,221
55
+ fmtr/tools/database_tools/document.py,sha256=wn1JPqFiplRx16qUgOs2tWtEZGaT4L99CTjp_MhpjqY,1198
56
+ fmtr/tools/dns_tools/__init__.py,sha256=HP0Qcwyi1C6vBH_ejuWrGJOWdp-GZ_cmH-QofjD6Mmg,266
57
+ fmtr/tools/dns_tools/client.py,sha256=IBbd7Xgx9ExTn_EPoL7ts9JfXokHHuOiD9m4K6tl1Q0,2817
58
+ fmtr/tools/dns_tools/dm.py,sha256=Lp1HaF7rpVtL_Ji4Bd32B29105H9ZKQ8AcVj_AB7nsA,6678
59
+ fmtr/tools/dns_tools/proxy.py,sha256=gCWfH1pyWjj8xnJ8Pm4id7bsBWqcar3dQ9PeP5XjRXY,1624
60
+ fmtr/tools/dns_tools/server.py,sha256=_Y5w5bGHhBI32fYWl-SmnOALAw_eF9fEbmrOqqgzSq8,4263
61
+ fmtr/tools/docker_tools/__init__.py,sha256=NzUFbOX3eQCJ9ex0YL7xZPKLb65HngvZCBRTz839A8Y,222
62
+ fmtr/tools/entrypoints/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ fmtr/tools/entrypoints/cache_hfh.py,sha256=fQNs4J9twQuZH_Yj98-oOvEX7-LrSUP3kO8nzw2HrHs,60
64
+ fmtr/tools/entrypoints/ep_test.py,sha256=B8HfWISfSgw_xVX475CbJGh_QnpOe9MH65H8qGjTWbY,46
65
+ fmtr/tools/entrypoints/install_yamlscript.py,sha256=D9-QET4uPkwMvOBQJAgzn1fYb7Z7VAgZzFdHSAXc3Qc,116
66
+ fmtr/tools/entrypoints/remote_debug_test.py,sha256=wmKg9o2pQq7eqeHmaO8oviujNgtnsCVEXOdXLIcQWs4,123
67
+ fmtr/tools/entrypoints/shell_debug.py,sha256=0No3tAg9Ri4_vvSlQCUtAY-11HR0nE45i0VVtiAViwY,106
68
+ fmtr/tools/interface_tools/__init__.py,sha256=_bgZRTqmygtYM75o6_zyQRhT_XZnDERZEHmsYVrzyxw,393
69
+ fmtr/tools/interface_tools/context.py,sha256=VpoR_ZCndDbwS0AzIPKi1hB2QckwJU5dJqAJavF3mqk,151
70
+ fmtr/tools/interface_tools/controls.py,sha256=8cI7Jq4SsxRUD1CFVwQRAr4Ci6GSqyfQ5RDZqmPId2w,7673
71
+ fmtr/tools/interface_tools/interface_tools.py,sha256=jSRwpdHqOTmNLndE-wFqTQdkT4z2BBdclSxmvs11FnU,4400
72
+ fmtr/tools/path_tools/__init__.py,sha256=XrJXt7Zzo90tYUVksMlDfKkWt775zJ9OSi2NbhnqMDI,459
73
+ fmtr/tools/path_tools/app_path_tools.py,sha256=JrJvtTDd_gkCKcZtBCDTMktsM77PZwGV_hzQX0g5GU8,1722
74
+ fmtr/tools/path_tools/path_tools.py,sha256=s3RTXsjnr2Ah7vXQGjpGs-4DlWaVGvChu0aTFXX3gsE,8867
75
+ fmtr/tools/path_tools/type_path_tools.py,sha256=Zgs-ek-GXRKDIlVDGdg3muB0PIxTg2ba0NeHw6y8FWQ,40
76
+ fmtr/tools/setup_tools/__init__.py,sha256=Ro_Qj3Xndv8Z68DeWPI7c6X-aWKsdDm0KcX_k1xDhgE,394
77
+ fmtr/tools/setup_tools/setup_tools.py,sha256=ykW7rAv6ixfXdmLKcPgotenEQ94-NSsdFnDUZqgRbpI,10956
78
+ fmtr/tools/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
+ fmtr/tools/tests/conftest.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ fmtr/tools/tests/helpers.py,sha256=N5sf9YoZV93a7tf_UxpLeyQ9vp6Ec0teNIimFDvc054,1091
81
+ fmtr/tools/tests/test_datatype.py,sha256=C04m_qFuDT239K1OyYzBQ3ImNtR-5l5kKH4GUrRM9kQ,790
82
+ fmtr/tools/tests/test_environment.py,sha256=iHaiMQfECYZPkPKwfuIZV9uHuWe3aE-p_dN_PWmmhnA,2167
83
+ fmtr/tools/tests/test_json.py,sha256=IeSP4ziPvRcmS8kq7k9tHonC9rN5YYq9GSNT2ul6Msk,287
84
+ fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g,2188
85
+ fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
86
+ fmtr/tools/version_tools/__init__.py,sha256=cjE6nO6AoVOUp3RwgTbqL9wiw8J1l2pHJOz6Gn6bxjA,326
87
+ fmtr/tools/version_tools/version_tools.py,sha256=Hcc6yferZS1hHbugRTdiHhSNmXEEG0hjCiTTXKna-YY,1127
88
+ fmtr_tools-1.3.81.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
89
+ fmtr_tools-1.3.81.dist-info/METADATA,sha256=O0Sgk3Rn1yYskitfNNvG5HJRW9CpgCz46WZo-p9MYA4,17916
90
+ fmtr_tools-1.3.81.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
91
+ fmtr_tools-1.3.81.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
92
+ fmtr_tools-1.3.81.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
93
+ fmtr_tools-1.3.81.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5