fmtr.tools 1.3.60__tar.gz → 1.3.62__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (100) hide show
  1. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/PKG-INFO +50 -50
  2. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/ai_tools/agentic_tools.py +19 -4
  3. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/pdf_tools.py +28 -4
  4. fmtr_tools-1.3.62/fmtr/tools/version +1 -0
  5. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr.tools.egg-info/PKG-INFO +50 -50
  6. fmtr_tools-1.3.60/fmtr/tools/version +0 -1
  7. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/LICENSE +0 -0
  8. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/README.md +0 -0
  9. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/__init__.py +0 -0
  10. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/ai_tools/__init__.py +0 -0
  11. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/ai_tools/inference_tools.py +0 -0
  12. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/api_tools.py +0 -0
  13. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/async_tools.py +0 -0
  14. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/augmentation_tools.py +0 -0
  15. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/caching_tools.py +0 -0
  16. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/constants.py +0 -0
  17. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/context_tools.py +0 -0
  18. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/data_modelling_tools.py +0 -0
  19. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/database_tools/__init__.py +0 -0
  20. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/database_tools/document.py +0 -0
  21. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/dataclass_tools.py +0 -0
  22. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/datatype_tools.py +0 -0
  23. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/datetime_tools.py +0 -0
  24. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/debugging_tools.py +0 -0
  25. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/dns_tools/__init__.py +0 -0
  26. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/dns_tools/client.py +0 -0
  27. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/dns_tools/dm.py +0 -0
  28. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/dns_tools/proxy.py +0 -0
  29. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/dns_tools/server.py +0 -0
  30. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/docker_tools/__init__.py +0 -0
  31. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/entrypoints/__init__.py +0 -0
  32. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/entrypoints/cache_hfh.py +0 -0
  33. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/entrypoints/ep_test.py +0 -0
  34. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/entrypoints/install_yamlscript.py +0 -0
  35. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/entrypoints/remote_debug_test.py +0 -0
  36. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/entrypoints/shell_debug.py +0 -0
  37. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/environment_tools.py +0 -0
  38. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/function_tools.py +0 -0
  39. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/google_api_tools.py +0 -0
  40. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/hash_tools.py +0 -0
  41. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/hfh_tools.py +0 -0
  42. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/html_tools.py +0 -0
  43. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/http_tools.py +0 -0
  44. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/import_tools.py +0 -0
  45. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/inherit_tools.py +0 -0
  46. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/inspection_tools.py +0 -0
  47. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/interface_tools/__init__.py +0 -0
  48. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/interface_tools/context.py +0 -0
  49. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/interface_tools/controls.py +0 -0
  50. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/interface_tools/interface_tools.py +0 -0
  51. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/iterator_tools.py +0 -0
  52. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/json_fix_tools.py +0 -0
  53. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/json_tools.py +0 -0
  54. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/logging_tools.py +0 -0
  55. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/merging_tools.py +0 -0
  56. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/metric_tools.py +0 -0
  57. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/name_tools.py +0 -0
  58. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/netrc_tools.py +0 -0
  59. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/openai_tools.py +0 -0
  60. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/packaging_tools.py +0 -0
  61. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/parallel_tools.py +0 -0
  62. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/path_tools/__init__.py +0 -0
  63. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/path_tools/app_path_tools.py +0 -0
  64. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/path_tools/path_tools.py +0 -0
  65. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/path_tools/type_path_tools.py +0 -0
  66. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/pattern_tools.py +0 -0
  67. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/platform_tools.py +0 -0
  68. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/process_tools.py +0 -0
  69. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/profiling_tools.py +0 -0
  70. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/random_tools.py +0 -0
  71. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/semantic_tools.py +0 -0
  72. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/settings_tools.py +0 -0
  73. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/setup_tools/__init__.py +0 -0
  74. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/setup_tools/setup_tools.py +0 -0
  75. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/spaces_tools.py +0 -0
  76. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/string_tools.py +0 -0
  77. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tabular_tools.py +0 -0
  78. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/__init__.py +0 -0
  79. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/conftest.py +0 -0
  80. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/helpers.py +0 -0
  81. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/test_datatype.py +0 -0
  82. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/test_environment.py +0 -0
  83. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/test_json.py +0 -0
  84. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/test_path.py +0 -0
  85. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tests/test_yaml.py +0 -0
  86. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tokenization_tools.py +0 -0
  87. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/tools.py +0 -0
  88. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/unicode_tools.py +0 -0
  89. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/version_tools/__init__.py +0 -0
  90. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/version_tools/version_tools.py +0 -0
  91. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/webhook_tools.py +0 -0
  92. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr/tools/yaml_tools.py +0 -0
  93. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr.tools.egg-info/SOURCES.txt +0 -0
  94. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr.tools.egg-info/dependency_links.txt +0 -0
  95. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr.tools.egg-info/entry_points.txt +0 -0
  96. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr.tools.egg-info/requires.txt +49 -49
  97. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/fmtr.tools.egg-info/top_level.txt +0 -0
  98. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/pyproject.toml +0 -0
  99. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/setup.cfg +0 -0
  100. {fmtr_tools-1.3.60 → fmtr_tools-1.3.62}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.60
3
+ Version: 1.3.62
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
@@ -154,68 +154,68 @@ Provides-Extra: db-document
154
154
  Requires-Dist: beanie[odm]; extra == "db-document"
155
155
  Requires-Dist: motor; extra == "db-document"
156
156
  Provides-Extra: all
157
- Requires-Dist: pydantic-settings; extra == "all"
158
- Requires-Dist: openai; extra == "all"
159
157
  Requires-Dist: setuptools; extra == "all"
160
- Requires-Dist: deepdiff; extra == "all"
161
- Requires-Dist: diskcache; extra == "all"
162
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
163
- Requires-Dist: openpyxl; extra == "all"
164
- Requires-Dist: deepmerge; extra == "all"
165
- Requires-Dist: dask[bag]; extra == "all"
166
- Requires-Dist: google-auth-httplib2; extra == "all"
167
- Requires-Dist: flet-webview; extra == "all"
168
- Requires-Dist: appdirs; extra == "all"
169
- Requires-Dist: pycountry; extra == "all"
170
- Requires-Dist: pytest-cov; extra == "all"
171
- Requires-Dist: faker; extra == "all"
172
- Requires-Dist: httpx_retries; extra == "all"
173
- Requires-Dist: distributed; extra == "all"
174
- Requires-Dist: uvicorn[standard]; extra == "all"
158
+ Requires-Dist: google-auth; extra == "all"
159
+ Requires-Dist: google-auth-oauthlib; extra == "all"
175
160
  Requires-Dist: cachetools; extra == "all"
176
- Requires-Dist: pymupdf4llm; extra == "all"
177
- Requires-Dist: tinynetrc; extra == "all"
178
- Requires-Dist: filetype; extra == "all"
179
- Requires-Dist: torchvision; extra == "all"
180
- Requires-Dist: torchaudio; extra == "all"
161
+ Requires-Dist: uvicorn[standard]; extra == "all"
162
+ Requires-Dist: pydantic; extra == "all"
163
+ Requires-Dist: openai; extra == "all"
164
+ Requires-Dist: ollama; extra == "all"
165
+ Requires-Dist: json_repair; extra == "all"
181
166
  Requires-Dist: sentence_transformers; extra == "all"
167
+ Requires-Dist: tabulate; extra == "all"
168
+ Requires-Dist: sre_yield; extra == "all"
169
+ Requires-Dist: google-api-python-client; extra == "all"
182
170
  Requires-Dist: pyyaml; extra == "all"
183
- Requires-Dist: transformers[sentencepiece]; extra == "all"
171
+ Requires-Dist: regex; extra == "all"
172
+ Requires-Dist: httpx_retries; extra == "all"
173
+ Requires-Dist: flet-video; extra == "all"
184
174
  Requires-Dist: pandas; extra == "all"
185
- Requires-Dist: odfpy; extra == "all"
186
- Requires-Dist: bokeh; extra == "all"
175
+ Requires-Dist: openpyxl; extra == "all"
176
+ Requires-Dist: google-auth-httplib2; extra == "all"
177
+ Requires-Dist: semver; extra == "all"
178
+ Requires-Dist: yamlscript; extra == "all"
179
+ Requires-Dist: dask[bag]; extra == "all"
180
+ Requires-Dist: peft; extra == "all"
181
+ Requires-Dist: html2text; extra == "all"
182
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
183
+ Requires-Dist: tinynetrc; extra == "all"
187
184
  Requires-Dist: flet[all]; extra == "all"
188
- Requires-Dist: logfire[fastapi]; extra == "all"
185
+ Requires-Dist: appdirs; extra == "all"
186
+ Requires-Dist: deepmerge; extra == "all"
189
187
  Requires-Dist: httpx; extra == "all"
190
- Requires-Dist: tabulate; extra == "all"
191
- Requires-Dist: pydantic-extra-types; extra == "all"
192
- Requires-Dist: google-auth-oauthlib; extra == "all"
193
- Requires-Dist: html2text; extra == "all"
194
- Requires-Dist: flet-video; extra == "all"
195
- Requires-Dist: regex; extra == "all"
196
- Requires-Dist: Unidecode; extra == "all"
197
188
  Requires-Dist: huggingface_hub; extra == "all"
198
- Requires-Dist: pydantic; extra == "all"
199
- Requires-Dist: yamlscript; extra == "all"
200
- Requires-Dist: tokenizers; extra == "all"
201
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
202
- Requires-Dist: semver; extra == "all"
203
- Requires-Dist: beanie[odm]; extra == "all"
204
189
  Requires-Dist: pymupdf; extra == "all"
190
+ Requires-Dist: pytest-cov; extra == "all"
191
+ Requires-Dist: beanie[odm]; extra == "all"
192
+ Requires-Dist: logfire[httpx]; extra == "all"
193
+ Requires-Dist: deepdiff; extra == "all"
194
+ Requires-Dist: bokeh; extra == "all"
195
+ Requires-Dist: pycountry; extra == "all"
196
+ Requires-Dist: dnspython[doh]; extra == "all"
197
+ Requires-Dist: faker; extra == "all"
198
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
199
+ Requires-Dist: odfpy; extra == "all"
200
+ Requires-Dist: pydantic-settings; extra == "all"
201
+ Requires-Dist: pydantic-extra-types; extra == "all"
202
+ Requires-Dist: torchaudio; extra == "all"
205
203
  Requires-Dist: motor; extra == "all"
204
+ Requires-Dist: torchvision; extra == "all"
205
+ Requires-Dist: filetype; extra == "all"
206
206
  Requires-Dist: python-on-whales; extra == "all"
207
- Requires-Dist: json_repair; extra == "all"
208
- Requires-Dist: google-auth; extra == "all"
209
- Requires-Dist: google-api-python-client; extra == "all"
210
- Requires-Dist: ollama; extra == "all"
211
- Requires-Dist: dnspython[doh]; extra == "all"
212
- Requires-Dist: fastapi; extra == "all"
213
- Requires-Dist: peft; extra == "all"
214
- Requires-Dist: logfire[httpx]; extra == "all"
207
+ Requires-Dist: pymupdf4llm; extra == "all"
215
208
  Requires-Dist: logfire; extra == "all"
216
- Requires-Dist: playwright; extra == "all"
209
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
210
+ Requires-Dist: logfire[fastapi]; extra == "all"
217
211
  Requires-Dist: contexttimer; extra == "all"
218
- Requires-Dist: sre_yield; extra == "all"
212
+ Requires-Dist: fastapi; extra == "all"
213
+ Requires-Dist: flet-webview; extra == "all"
214
+ Requires-Dist: playwright; extra == "all"
215
+ Requires-Dist: Unidecode; extra == "all"
216
+ Requires-Dist: distributed; extra == "all"
217
+ Requires-Dist: diskcache; extra == "all"
218
+ Requires-Dist: tokenizers; extra == "all"
219
219
  Dynamic: author
220
220
  Dynamic: author-email
221
221
  Dynamic: description
@@ -6,6 +6,7 @@ from pydantic_ai import RunContext, ModelRetry
6
6
  from pydantic_ai._output import OutputDataT
7
7
  from pydantic_ai.agent import AgentRunResult, Agent
8
8
  from pydantic_ai.models.openai import OpenAIModel
9
+ from pydantic_ai.output import OutputSpec, NativeOutput, ToolOutput
9
10
  from pydantic_ai.providers.openai import OpenAIProvider
10
11
  from pydantic_ai.tools import AgentDepsT
11
12
 
@@ -47,7 +48,7 @@ class Task(Generic[AgentDepsT, OutputDataT]):
47
48
  PROVIDER_FMTR = OpenAIProvider(base_url=API_URL_FMTR)
48
49
 
49
50
  MODEL_ID = 'gpt-4o'
50
- MODEL_ID_FMTR = 'qwen2.5-coder:14b'
51
+ MODEL_ID_FMTR = 'qwen2.5-coder:32b'
51
52
  SYSTEM_PROMPT_STATIC = None
52
53
  RESULT_RETRIES = 5
53
54
  VALIDATORS: List[Validator] = []
@@ -65,7 +66,7 @@ class Task(Generic[AgentDepsT, OutputDataT]):
65
66
  model=self.model,
66
67
  system_prompt=self.SYSTEM_PROMPT_STATIC or [],
67
68
  deps_type=self.TypeDeps,
68
- output_type=self.TypeOutput,
69
+ output_type=self.tool_output,
69
70
  output_retries=self.RESULT_RETRIES,
70
71
  **kwargs
71
72
  )
@@ -74,6 +75,16 @@ class Task(Generic[AgentDepsT, OutputDataT]):
74
75
  self.agent.system_prompt(self.add_system_prompt)
75
76
  self.history = []
76
77
 
78
+ @property
79
+ def tool_output(self) -> OutputSpec[OutputDataT]:
80
+ """
81
+
82
+ Tool output specification (e.g. ToolOutput/NativeOutput etc.)
83
+
84
+ """
85
+ return ToolOutput(self.TypeOutput)
86
+
87
+
77
88
  @property
78
89
  def sync_runner(self):
79
90
  """
@@ -183,11 +194,15 @@ if __name__ == '__main__':
183
194
 
184
195
 
185
196
  class TaskTest(Task):
186
- # PROVIDER = Task.PROVIDER_FMTR
187
- # MODEL_ID = 'qwen2.5-coder:14b'
197
+ PROVIDER = Task.PROVIDER_FMTR
198
+ MODEL_ID = Task.MODEL_ID_FMTR
188
199
  TypeOutput = TestOutput
189
200
  SYSTEM_PROMPT_STATIC = 'Tell the user jokes.'
190
201
 
202
+ @property
203
+ def tool_output(self) -> OutputSpec[TestOutput]:
204
+ return NativeOutput(self.TypeOutput)
205
+
191
206
  def add_system_prompt(self, ctx: RunContext[TestDeps]) -> str:
192
207
  return f'The jokes must be in the {ctx.deps.lang} language.'
193
208
 
@@ -1,6 +1,7 @@
1
+ from typing import List, Tuple, Dict, Any, Self
2
+
1
3
  import pymupdf as pm
2
4
  import pymupdf4llm
3
- from typing import List, Tuple, Dict, Any, Self
4
5
 
5
6
  from fmtr.tools import data_modelling_tools
6
7
 
@@ -179,10 +180,10 @@ class Document(pm.Document):
179
180
  """
180
181
  return pymupdf4llm.to_markdown(self, **kwargs)
181
182
 
182
- def to_text(self):
183
+ def to_text_pages(self) -> List[str]:
183
184
  """
184
185
 
185
- Simple text output.
186
+ Simple text output per-page.
186
187
 
187
188
  """
188
189
  lines = []
@@ -190,9 +191,32 @@ class Document(pm.Document):
190
191
  text = page.get_text()
191
192
  lines.append(text)
192
193
 
193
- text = '\n'.join(lines)
194
+ return lines
195
+
196
+ def to_text(self) -> str:
197
+ """
198
+
199
+ Simple text output.
200
+
201
+ """
202
+
203
+ text = '\n'.join(self.to_text_pages())
194
204
  return text
195
205
 
206
+ def split(self) -> List[Self]:
207
+ """
208
+
209
+ Split pages into individual documents.
210
+
211
+ """
212
+
213
+ documents = []
214
+ for i, page in enumerate(self, start=1):
215
+ document = self.__class__()
216
+ document.insert_pdf(self, from_page=i, to_page=i)
217
+ documents.append(document)
218
+
219
+ return documents
196
220
 
197
221
  if __name__ == '__main__':
198
222
  from fmtr.tools.path_tools import Path
@@ -0,0 +1 @@
1
+ 1.3.62
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fmtr.tools
3
- Version: 1.3.60
3
+ Version: 1.3.62
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
@@ -154,68 +154,68 @@ Provides-Extra: db-document
154
154
  Requires-Dist: beanie[odm]; extra == "db-document"
155
155
  Requires-Dist: motor; extra == "db-document"
156
156
  Provides-Extra: all
157
- Requires-Dist: pydantic-settings; extra == "all"
158
- Requires-Dist: openai; extra == "all"
159
157
  Requires-Dist: setuptools; extra == "all"
160
- Requires-Dist: deepdiff; extra == "all"
161
- Requires-Dist: diskcache; extra == "all"
162
- Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
163
- Requires-Dist: openpyxl; extra == "all"
164
- Requires-Dist: deepmerge; extra == "all"
165
- Requires-Dist: dask[bag]; extra == "all"
166
- Requires-Dist: google-auth-httplib2; extra == "all"
167
- Requires-Dist: flet-webview; extra == "all"
168
- Requires-Dist: appdirs; extra == "all"
169
- Requires-Dist: pycountry; extra == "all"
170
- Requires-Dist: pytest-cov; extra == "all"
171
- Requires-Dist: faker; extra == "all"
172
- Requires-Dist: httpx_retries; extra == "all"
173
- Requires-Dist: distributed; extra == "all"
174
- Requires-Dist: uvicorn[standard]; extra == "all"
158
+ Requires-Dist: google-auth; extra == "all"
159
+ Requires-Dist: google-auth-oauthlib; extra == "all"
175
160
  Requires-Dist: cachetools; extra == "all"
176
- Requires-Dist: pymupdf4llm; extra == "all"
177
- Requires-Dist: tinynetrc; extra == "all"
178
- Requires-Dist: filetype; extra == "all"
179
- Requires-Dist: torchvision; extra == "all"
180
- Requires-Dist: torchaudio; extra == "all"
161
+ Requires-Dist: uvicorn[standard]; extra == "all"
162
+ Requires-Dist: pydantic; extra == "all"
163
+ Requires-Dist: openai; extra == "all"
164
+ Requires-Dist: ollama; extra == "all"
165
+ Requires-Dist: json_repair; extra == "all"
181
166
  Requires-Dist: sentence_transformers; extra == "all"
167
+ Requires-Dist: tabulate; extra == "all"
168
+ Requires-Dist: sre_yield; extra == "all"
169
+ Requires-Dist: google-api-python-client; extra == "all"
182
170
  Requires-Dist: pyyaml; extra == "all"
183
- Requires-Dist: transformers[sentencepiece]; extra == "all"
171
+ Requires-Dist: regex; extra == "all"
172
+ Requires-Dist: httpx_retries; extra == "all"
173
+ Requires-Dist: flet-video; extra == "all"
184
174
  Requires-Dist: pandas; extra == "all"
185
- Requires-Dist: odfpy; extra == "all"
186
- Requires-Dist: bokeh; extra == "all"
175
+ Requires-Dist: openpyxl; extra == "all"
176
+ Requires-Dist: google-auth-httplib2; extra == "all"
177
+ Requires-Dist: semver; extra == "all"
178
+ Requires-Dist: yamlscript; extra == "all"
179
+ Requires-Dist: dask[bag]; extra == "all"
180
+ Requires-Dist: peft; extra == "all"
181
+ Requires-Dist: html2text; extra == "all"
182
+ Requires-Dist: transformers[sentencepiece]; extra == "all"
183
+ Requires-Dist: tinynetrc; extra == "all"
187
184
  Requires-Dist: flet[all]; extra == "all"
188
- Requires-Dist: logfire[fastapi]; extra == "all"
185
+ Requires-Dist: appdirs; extra == "all"
186
+ Requires-Dist: deepmerge; extra == "all"
189
187
  Requires-Dist: httpx; extra == "all"
190
- Requires-Dist: tabulate; extra == "all"
191
- Requires-Dist: pydantic-extra-types; extra == "all"
192
- Requires-Dist: google-auth-oauthlib; extra == "all"
193
- Requires-Dist: html2text; extra == "all"
194
- Requires-Dist: flet-video; extra == "all"
195
- Requires-Dist: regex; extra == "all"
196
- Requires-Dist: Unidecode; extra == "all"
197
188
  Requires-Dist: huggingface_hub; extra == "all"
198
- Requires-Dist: pydantic; extra == "all"
199
- Requires-Dist: yamlscript; extra == "all"
200
- Requires-Dist: tokenizers; extra == "all"
201
- Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
202
- Requires-Dist: semver; extra == "all"
203
- Requires-Dist: beanie[odm]; extra == "all"
204
189
  Requires-Dist: pymupdf; extra == "all"
190
+ Requires-Dist: pytest-cov; extra == "all"
191
+ Requires-Dist: beanie[odm]; extra == "all"
192
+ Requires-Dist: logfire[httpx]; extra == "all"
193
+ Requires-Dist: deepdiff; extra == "all"
194
+ Requires-Dist: bokeh; extra == "all"
195
+ Requires-Dist: pycountry; extra == "all"
196
+ Requires-Dist: dnspython[doh]; extra == "all"
197
+ Requires-Dist: faker; extra == "all"
198
+ Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
199
+ Requires-Dist: odfpy; extra == "all"
200
+ Requires-Dist: pydantic-settings; extra == "all"
201
+ Requires-Dist: pydantic-extra-types; extra == "all"
202
+ Requires-Dist: torchaudio; extra == "all"
205
203
  Requires-Dist: motor; extra == "all"
204
+ Requires-Dist: torchvision; extra == "all"
205
+ Requires-Dist: filetype; extra == "all"
206
206
  Requires-Dist: python-on-whales; extra == "all"
207
- Requires-Dist: json_repair; extra == "all"
208
- Requires-Dist: google-auth; extra == "all"
209
- Requires-Dist: google-api-python-client; extra == "all"
210
- Requires-Dist: ollama; extra == "all"
211
- Requires-Dist: dnspython[doh]; extra == "all"
212
- Requires-Dist: fastapi; extra == "all"
213
- Requires-Dist: peft; extra == "all"
214
- Requires-Dist: logfire[httpx]; extra == "all"
207
+ Requires-Dist: pymupdf4llm; extra == "all"
215
208
  Requires-Dist: logfire; extra == "all"
216
- Requires-Dist: playwright; extra == "all"
209
+ Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
210
+ Requires-Dist: logfire[fastapi]; extra == "all"
217
211
  Requires-Dist: contexttimer; extra == "all"
218
- Requires-Dist: sre_yield; extra == "all"
212
+ Requires-Dist: fastapi; extra == "all"
213
+ Requires-Dist: flet-webview; extra == "all"
214
+ Requires-Dist: playwright; extra == "all"
215
+ Requires-Dist: Unidecode; extra == "all"
216
+ Requires-Dist: distributed; extra == "all"
217
+ Requires-Dist: diskcache; extra == "all"
218
+ Requires-Dist: tokenizers; extra == "all"
219
219
  Dynamic: author
220
220
  Dynamic: author-email
221
221
  Dynamic: description
@@ -1 +0,0 @@
1
- 1.3.60
File without changes
File without changes
@@ -18,68 +18,68 @@ pydantic-ai[logfire,openai]
18
18
  ollama
19
19
 
20
20
  [all]
21
- pydantic-settings
22
- openai
23
21
  setuptools
24
- deepdiff
25
- diskcache
26
- pydevd-pycharm~=251.25410.159
27
- openpyxl
28
- deepmerge
29
- dask[bag]
30
- google-auth-httplib2
31
- flet-webview
32
- appdirs
33
- pycountry
34
- pytest-cov
35
- faker
36
- httpx_retries
37
- distributed
38
- uvicorn[standard]
22
+ google-auth
23
+ google-auth-oauthlib
39
24
  cachetools
40
- pymupdf4llm
41
- tinynetrc
42
- filetype
43
- torchvision
44
- torchaudio
25
+ uvicorn[standard]
26
+ pydantic
27
+ openai
28
+ ollama
29
+ json_repair
45
30
  sentence_transformers
31
+ tabulate
32
+ sre_yield
33
+ google-api-python-client
46
34
  pyyaml
47
- transformers[sentencepiece]
35
+ regex
36
+ httpx_retries
37
+ flet-video
48
38
  pandas
49
- odfpy
50
- bokeh
39
+ openpyxl
40
+ google-auth-httplib2
41
+ semver
42
+ yamlscript
43
+ dask[bag]
44
+ peft
45
+ html2text
46
+ transformers[sentencepiece]
47
+ tinynetrc
51
48
  flet[all]
52
- logfire[fastapi]
49
+ appdirs
50
+ deepmerge
53
51
  httpx
54
- tabulate
55
- pydantic-extra-types
56
- google-auth-oauthlib
57
- html2text
58
- flet-video
59
- regex
60
- Unidecode
61
52
  huggingface_hub
62
- pydantic
63
- yamlscript
64
- tokenizers
65
- pydantic-ai[logfire,openai]
66
- semver
67
- beanie[odm]
68
53
  pymupdf
54
+ pytest-cov
55
+ beanie[odm]
56
+ logfire[httpx]
57
+ deepdiff
58
+ bokeh
59
+ pycountry
60
+ dnspython[doh]
61
+ faker
62
+ pydantic-ai[logfire,openai]
63
+ odfpy
64
+ pydantic-settings
65
+ pydantic-extra-types
66
+ torchaudio
69
67
  motor
68
+ torchvision
69
+ filetype
70
70
  python-on-whales
71
- json_repair
72
- google-auth
73
- google-api-python-client
74
- ollama
75
- dnspython[doh]
76
- fastapi
77
- peft
78
- logfire[httpx]
71
+ pymupdf4llm
79
72
  logfire
80
- playwright
73
+ pydevd-pycharm~=251.25410.159
74
+ logfire[fastapi]
81
75
  contexttimer
82
- sre_yield
76
+ fastapi
77
+ flet-webview
78
+ playwright
79
+ Unidecode
80
+ distributed
81
+ diskcache
82
+ tokenizers
83
83
 
84
84
  [api]
85
85
  fastapi
File without changes
File without changes
File without changes