fmtr.tools 1.3.37__py3-none-any.whl → 1.3.39__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.
Potentially problematic release.
This version of fmtr.tools might be problematic. Click here for more details.
- fmtr/tools/ai_tools/agentic_tools.py +2 -3
- fmtr/tools/google_api_tools.py +15 -4
- fmtr/tools/iterator_tools.py +12 -0
- fmtr/tools/string_tools.py +60 -6
- fmtr/tools/version +1 -1
- {fmtr_tools-1.3.37.dist-info → fmtr_tools-1.3.39.dist-info}/METADATA +46 -46
- {fmtr_tools-1.3.37.dist-info → fmtr_tools-1.3.39.dist-info}/RECORD +11 -11
- {fmtr_tools-1.3.37.dist-info → fmtr_tools-1.3.39.dist-info}/WHEEL +0 -0
- {fmtr_tools-1.3.37.dist-info → fmtr_tools-1.3.39.dist-info}/entry_points.txt +0 -0
- {fmtr_tools-1.3.37.dist-info → fmtr_tools-1.3.39.dist-info}/licenses/LICENSE +0 -0
- {fmtr_tools-1.3.37.dist-info → fmtr_tools-1.3.39.dist-info}/top_level.txt +0 -0
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
from typing import List, Optional, Any, Annotated
|
|
2
|
-
|
|
3
1
|
import pydantic_ai
|
|
4
2
|
from pydantic import PlainValidator
|
|
5
3
|
from pydantic_ai import RunContext, ModelRetry
|
|
6
4
|
from pydantic_ai.agent import AgentRunResult, Agent
|
|
7
5
|
from pydantic_ai.models.openai import OpenAIModel
|
|
8
6
|
from pydantic_ai.providers.openai import OpenAIProvider
|
|
7
|
+
from typing import List, Optional, Any, Annotated
|
|
9
8
|
|
|
10
9
|
from fmtr.tools import environment_tools as env
|
|
11
10
|
from fmtr.tools.constants import Constants
|
|
@@ -153,7 +152,7 @@ def default_prompt_none_specified(text):
|
|
|
153
152
|
return text
|
|
154
153
|
|
|
155
154
|
|
|
156
|
-
StringDefaultNoneSpecified = Annotated[str, PlainValidator(default_prompt_none_specified)]
|
|
155
|
+
StringDefaultNoneSpecified = Annotated[Optional[str], PlainValidator(default_prompt_none_specified)]
|
|
157
156
|
|
|
158
157
|
|
|
159
158
|
if __name__ == '__main__':
|
fmtr/tools/google_api_tools.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from google.auth.transport.requests import Request
|
|
1
2
|
from google.oauth2.credentials import Credentials
|
|
2
3
|
from google_auth_oauthlib.flow import InstalledAppFlow
|
|
3
4
|
from googleapiclient.discovery import build
|
|
@@ -20,8 +21,12 @@ class Authenticator:
|
|
|
20
21
|
|
|
21
22
|
@classmethod
|
|
22
23
|
def auth(cls):
|
|
23
|
-
|
|
24
|
-
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
Do initial authentication or refresh token if expired.
|
|
27
|
+
|
|
28
|
+
"""
|
|
29
|
+
logger.info(f'Doing auth for service {cls.SERVICE} ({cls.VERSION})...')
|
|
25
30
|
|
|
26
31
|
PATH_CREDS = cls.PATH / 'credentials.json'
|
|
27
32
|
PATH_TOKEN = cls.PATH / f'{cls.SERVICE}.json'
|
|
@@ -29,9 +34,15 @@ class Authenticator:
|
|
|
29
34
|
if PATH_TOKEN.exists():
|
|
30
35
|
data_token = PATH_TOKEN.read_json()
|
|
31
36
|
credentials = Credentials.from_authorized_user_info(data_token, cls.SCOPES)
|
|
37
|
+
if credentials.expired:
|
|
38
|
+
with logger.span(f'Credentials expired for {cls.SERVICE}. Will refresh...'):
|
|
39
|
+
logger.warning(f'{cls.SERVICE}. {PATH_CREDS.exists()=} {PATH_TOKEN.exists()=} {credentials.valid=} {credentials.expired=} {credentials.expiry=}')
|
|
40
|
+
credentials.refresh(Request())
|
|
41
|
+
PATH_TOKEN.write_text(credentials.to_json())
|
|
32
42
|
else:
|
|
33
43
|
flow = InstalledAppFlow.from_client_secrets_file(PATH_CREDS, cls.SCOPES)
|
|
44
|
+
flow.authorization_url(prompt='consent', access_type='offline')
|
|
34
45
|
credentials = flow.run_local_server(open_browser=False, port=cls.PORT)
|
|
35
46
|
PATH_TOKEN.write_text(credentials.to_json())
|
|
36
|
-
|
|
37
|
-
return
|
|
47
|
+
|
|
48
|
+
return build(cls.SERVICE, cls.VERSION, credentials=credentials)
|
fmtr/tools/iterator_tools.py
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
from itertools import chain, batched
|
|
2
|
+
|
|
2
3
|
from typing import List, Dict, Any
|
|
3
4
|
|
|
5
|
+
from fmtr.tools.datatype_tools import is_none
|
|
6
|
+
|
|
4
7
|
|
|
5
8
|
def enlist(value) -> List[Any]:
|
|
6
9
|
"""
|
|
@@ -52,3 +55,12 @@ def rebatch(batches, size: int):
|
|
|
52
55
|
|
|
53
56
|
"""
|
|
54
57
|
return batched(chain.from_iterable(batches), size)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def strip_none(*items):
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
Remove nones from a list of arguments
|
|
64
|
+
|
|
65
|
+
"""
|
|
66
|
+
return [item for item in items if not is_none(item)]
|
fmtr/tools/string_tools.py
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
from collections import namedtuple
|
|
2
|
+
from string import Formatter
|
|
2
3
|
|
|
3
4
|
import re
|
|
4
|
-
from
|
|
5
|
+
from dataclasses import dataclass
|
|
5
6
|
from textwrap import dedent
|
|
6
7
|
from typing import List
|
|
7
8
|
|
|
@@ -84,17 +85,70 @@ def sanitize(*strings, sep: str = '-') -> str:
|
|
|
84
85
|
return string
|
|
85
86
|
|
|
86
87
|
|
|
87
|
-
|
|
88
|
+
@dataclass
|
|
89
|
+
class Truncation:
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
Result type for truncation functions
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
text: str
|
|
96
|
+
text_without_sep: str | None
|
|
97
|
+
original: str
|
|
98
|
+
remainder: str | None
|
|
99
|
+
sep: str
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def truncate(text, length=None, sep=ELLIPSIS, return_type=str):
|
|
103
|
+
"""
|
|
104
|
+
|
|
105
|
+
Truncate a string to length characters
|
|
106
|
+
|
|
88
107
|
"""
|
|
108
|
+
text = flatten(text)
|
|
109
|
+
if len(text) <= length or not length:
|
|
110
|
+
return text if return_type is str else Truncation(text, text, text, None, sep)
|
|
111
|
+
|
|
112
|
+
cutoff = length - len(sep)
|
|
113
|
+
truncated = text[:cutoff] + sep
|
|
114
|
+
|
|
115
|
+
if return_type is str:
|
|
116
|
+
return truncated
|
|
117
|
+
else:
|
|
118
|
+
return Truncation(
|
|
119
|
+
text=truncated,
|
|
120
|
+
text_without_sep=text[:cutoff],
|
|
121
|
+
original=text,
|
|
122
|
+
remainder=text[cutoff:] or None,
|
|
123
|
+
sep=sep
|
|
124
|
+
)
|
|
89
125
|
|
|
90
|
-
|
|
126
|
+
|
|
127
|
+
def truncate_mid(text, length=None, sep=ELLIPSIS, return_type=str):
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
Truncate a string to `length` characters in the middle.
|
|
91
131
|
|
|
92
132
|
"""
|
|
93
133
|
text = flatten(text)
|
|
94
134
|
if len(text) <= length or not length:
|
|
95
|
-
return text
|
|
96
|
-
|
|
97
|
-
|
|
135
|
+
return text if return_type is str else Truncation(text, text, text, '', sep)
|
|
136
|
+
|
|
137
|
+
half = (length - len(sep)) // 2
|
|
138
|
+
left = text[:half]
|
|
139
|
+
right = text[-half:]
|
|
140
|
+
truncated = left + sep + right
|
|
141
|
+
|
|
142
|
+
if return_type is str:
|
|
143
|
+
return truncated
|
|
144
|
+
else:
|
|
145
|
+
return Truncation(
|
|
146
|
+
text=truncated,
|
|
147
|
+
text_without_sep=None,
|
|
148
|
+
original=text,
|
|
149
|
+
remainder=None,
|
|
150
|
+
sep=sep
|
|
151
|
+
)
|
|
98
152
|
|
|
99
153
|
|
|
100
154
|
def flatten(raw):
|
fmtr/tools/version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.3.
|
|
1
|
+
1.3.39
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fmtr.tools
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.39
|
|
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
|
|
@@ -133,62 +133,62 @@ Requires-Dist: logfire[httpx]; extra == "webhook"
|
|
|
133
133
|
Provides-Extra: browsers
|
|
134
134
|
Requires-Dist: playwright; extra == "browsers"
|
|
135
135
|
Provides-Extra: all
|
|
136
|
-
Requires-Dist:
|
|
137
|
-
Requires-Dist:
|
|
136
|
+
Requires-Dist: Unidecode; extra == "all"
|
|
137
|
+
Requires-Dist: tabulate; extra == "all"
|
|
138
|
+
Requires-Dist: tokenizers; extra == "all"
|
|
139
|
+
Requires-Dist: bokeh; extra == "all"
|
|
140
|
+
Requires-Dist: google-auth; extra == "all"
|
|
138
141
|
Requires-Dist: flet-video; extra == "all"
|
|
139
|
-
Requires-Dist:
|
|
142
|
+
Requires-Dist: appdirs; extra == "all"
|
|
143
|
+
Requires-Dist: logfire[fastapi]; extra == "all"
|
|
144
|
+
Requires-Dist: contexttimer; extra == "all"
|
|
145
|
+
Requires-Dist: json_repair; extra == "all"
|
|
146
|
+
Requires-Dist: httpx_retries; extra == "all"
|
|
147
|
+
Requires-Dist: html2text; extra == "all"
|
|
148
|
+
Requires-Dist: deepmerge; extra == "all"
|
|
140
149
|
Requires-Dist: openpyxl; extra == "all"
|
|
141
|
-
Requires-Dist:
|
|
142
|
-
Requires-Dist:
|
|
143
|
-
Requires-Dist: tinynetrc; extra == "all"
|
|
144
|
-
Requires-Dist: diskcache; extra == "all"
|
|
150
|
+
Requires-Dist: pandas; extra == "all"
|
|
151
|
+
Requires-Dist: dnspython[doh]; extra == "all"
|
|
145
152
|
Requires-Dist: docker; extra == "all"
|
|
146
153
|
Requires-Dist: pymupdf; extra == "all"
|
|
147
|
-
Requires-Dist:
|
|
148
|
-
Requires-Dist: Unidecode; extra == "all"
|
|
149
|
-
Requires-Dist: fastapi; extra == "all"
|
|
150
|
-
Requires-Dist: semver; extra == "all"
|
|
151
|
-
Requires-Dist: pandas; extra == "all"
|
|
152
|
-
Requires-Dist: distributed; extra == "all"
|
|
153
|
-
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
154
|
-
Requires-Dist: openai; extra == "all"
|
|
155
|
-
Requires-Dist: contexttimer; extra == "all"
|
|
156
|
-
Requires-Dist: logfire; extra == "all"
|
|
157
|
-
Requires-Dist: pydantic-settings; extra == "all"
|
|
158
|
-
Requires-Dist: torchvision; extra == "all"
|
|
159
|
-
Requires-Dist: torchaudio; extra == "all"
|
|
160
|
-
Requires-Dist: json_repair; extra == "all"
|
|
154
|
+
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
161
155
|
Requires-Dist: pymupdf4llm; extra == "all"
|
|
162
|
-
Requires-Dist:
|
|
163
|
-
Requires-Dist:
|
|
164
|
-
Requires-Dist:
|
|
165
|
-
Requires-Dist: logfire
|
|
166
|
-
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
167
|
-
Requires-Dist: pytest-cov; extra == "all"
|
|
156
|
+
Requires-Dist: distributed; extra == "all"
|
|
157
|
+
Requires-Dist: cachetools; extra == "all"
|
|
158
|
+
Requires-Dist: peft; extra == "all"
|
|
159
|
+
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
168
160
|
Requires-Dist: faker; extra == "all"
|
|
169
|
-
Requires-Dist:
|
|
170
|
-
Requires-Dist:
|
|
171
|
-
Requires-Dist:
|
|
172
|
-
Requires-Dist: flet[all]; extra == "all"
|
|
161
|
+
Requires-Dist: filetype; extra == "all"
|
|
162
|
+
Requires-Dist: sentence_transformers; extra == "all"
|
|
163
|
+
Requires-Dist: setuptools; extra == "all"
|
|
173
164
|
Requires-Dist: yamlscript; extra == "all"
|
|
174
|
-
Requires-Dist:
|
|
165
|
+
Requires-Dist: dask[bag]; extra == "all"
|
|
166
|
+
Requires-Dist: logfire[httpx]; extra == "all"
|
|
167
|
+
Requires-Dist: flet[all]; extra == "all"
|
|
175
168
|
Requires-Dist: pydantic; extra == "all"
|
|
176
|
-
Requires-Dist: pydantic-ai[logfire,openai]; extra == "all"
|
|
177
|
-
Requires-Dist: tabulate; extra == "all"
|
|
178
|
-
Requires-Dist: deepmerge; extra == "all"
|
|
179
|
-
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
180
169
|
Requires-Dist: regex; extra == "all"
|
|
170
|
+
Requires-Dist: google-api-python-client; extra == "all"
|
|
171
|
+
Requires-Dist: huggingface_hub; extra == "all"
|
|
172
|
+
Requires-Dist: pydantic-settings; extra == "all"
|
|
173
|
+
Requires-Dist: tinynetrc; extra == "all"
|
|
174
|
+
Requires-Dist: transformers[sentencepiece]; extra == "all"
|
|
175
|
+
Requires-Dist: ollama; extra == "all"
|
|
176
|
+
Requires-Dist: google-auth-oauthlib; extra == "all"
|
|
177
|
+
Requires-Dist: pytest-cov; extra == "all"
|
|
178
|
+
Requires-Dist: torchaudio; extra == "all"
|
|
179
|
+
Requires-Dist: httpx; extra == "all"
|
|
180
|
+
Requires-Dist: uvicorn[standard]; extra == "all"
|
|
181
|
+
Requires-Dist: diskcache; extra == "all"
|
|
181
182
|
Requires-Dist: playwright; extra == "all"
|
|
182
|
-
Requires-Dist:
|
|
183
|
-
Requires-Dist:
|
|
184
|
-
Requires-Dist:
|
|
185
|
-
Requires-Dist:
|
|
186
|
-
Requires-Dist:
|
|
183
|
+
Requires-Dist: logfire; extra == "all"
|
|
184
|
+
Requires-Dist: fastapi; extra == "all"
|
|
185
|
+
Requires-Dist: sre_yield; extra == "all"
|
|
186
|
+
Requires-Dist: openai; extra == "all"
|
|
187
|
+
Requires-Dist: semver; extra == "all"
|
|
188
|
+
Requires-Dist: pydevd-pycharm~=251.25410.159; extra == "all"
|
|
189
|
+
Requires-Dist: torchvision; extra == "all"
|
|
187
190
|
Requires-Dist: pyyaml; extra == "all"
|
|
188
|
-
Requires-Dist:
|
|
189
|
-
Requires-Dist: peft; extra == "all"
|
|
190
|
-
Requires-Dist: google-auth-httplib2; extra == "all"
|
|
191
|
-
Requires-Dist: setuptools; extra == "all"
|
|
191
|
+
Requires-Dist: flet-webview; extra == "all"
|
|
192
192
|
Dynamic: author
|
|
193
193
|
Dynamic: author-email
|
|
194
194
|
Dynamic: description
|
|
@@ -12,7 +12,7 @@ fmtr/tools/debugging_tools.py,sha256=_xzqS0V5BpL8d06j-jVQjGgI7T020QsqVXKAKMz7Du8
|
|
|
12
12
|
fmtr/tools/docker_tools.py,sha256=rdaZje2xhlmnfQqZnR7IHgRdWncTLjrJcViUTt5oEwk,617
|
|
13
13
|
fmtr/tools/environment_tools.py,sha256=43uqfj1G1bNX0IwKz-NKbu3AbFYSdbBuGN9rlThe030,1845
|
|
14
14
|
fmtr/tools/function_tools.py,sha256=O1K8HwftXfzrBblNZrj-BhWNbr4poJghrXNr2mFcylI,2831
|
|
15
|
-
fmtr/tools/google_api_tools.py,sha256=
|
|
15
|
+
fmtr/tools/google_api_tools.py,sha256=QUungBoj5SCaBQnMjn9QpXtWmdNCplbw8ZPK9LXi77U,1691
|
|
16
16
|
fmtr/tools/hash_tools.py,sha256=tr4HXpeT6rRrDk6TvMlRPUSrLRRaov96y128OI2tzsc,729
|
|
17
17
|
fmtr/tools/hfh_tools.py,sha256=DCDIWuWlhtmIGCtp9cLcOTTEw_4yN_NocLX8w5NZsbk,2384
|
|
18
18
|
fmtr/tools/html_tools.py,sha256=0nN8Nz5HtG9bXyApYfHSKEivLlxjsm3Gn6Mg2TK0brI,394
|
|
@@ -20,7 +20,7 @@ fmtr/tools/http_tools.py,sha256=RVwGrBNMyjfbpgAPCSnxEkXfSzXXWARb3ayq981ONQE,464
|
|
|
20
20
|
fmtr/tools/import_tools.py,sha256=XJmiWLukRncJAcaGReDn4jIz1_IpVBjfYCQHH1hIg7c,588
|
|
21
21
|
fmtr/tools/inherit_tools.py,sha256=gTGL4mRm5RsbFW76s25AbuAJ2vlymbh1c8Q4Hl2uJGU,646
|
|
22
22
|
fmtr/tools/inspection_tools.py,sha256=tLTRvzy9XVomQPi0dfnF_cgwc7KiDVZAr7gPTk4S_bQ,278
|
|
23
|
-
fmtr/tools/iterator_tools.py,sha256=
|
|
23
|
+
fmtr/tools/iterator_tools.py,sha256=ysNT2h39_ukEGrj8k7Z_CLKjWoguKBqVdjj4PLe7faE,1502
|
|
24
24
|
fmtr/tools/json_fix_tools.py,sha256=vNSlswVQnujPmKEqDjFJcO901mjMyv59q3awsT7mlhs,477
|
|
25
25
|
fmtr/tools/json_tools.py,sha256=WkFc5q7oqMtcFejhN1K5zQFULa9TdLOup83Fr0saDRY,348
|
|
26
26
|
fmtr/tools/logging_tools.py,sha256=M7I5igs_tX5SIRv4f-jfb75LOODclSdmEg5ziAAMSPE,2503
|
|
@@ -40,16 +40,16 @@ fmtr/tools/random_tools.py,sha256=4VlQdk5THbR8ka4pZaLbk_ZO_4yy6PF_lHZes_rgenY,22
|
|
|
40
40
|
fmtr/tools/semantic_tools.py,sha256=cxY9NSAHWj4nEc6Oj4qA1omR3dWbl2OuH7_PkINc6_E,1386
|
|
41
41
|
fmtr/tools/settings_tools.py,sha256=o11W3T60UZSvCTkh_eEQq1Mx74GycQ6JxUr0plBDbsk,2356
|
|
42
42
|
fmtr/tools/spaces_tools.py,sha256=D_he3mve6DruB3OPS6QyzqD05ChHnRTb4buViKPe7To,1099
|
|
43
|
-
fmtr/tools/string_tools.py,sha256=
|
|
43
|
+
fmtr/tools/string_tools.py,sha256=On6YRLTAK1i6mmMpOUWVM618CykJiuaoyKIsU1cB_mA,4952
|
|
44
44
|
fmtr/tools/tabular_tools.py,sha256=tpIpZzYku1HcJrHZJL6BC39LmN3WUWVhFbK2N7nDVmE,120
|
|
45
45
|
fmtr/tools/tokenization_tools.py,sha256=me-IBzSLyNYejLybwjO9CNB6Mj2NYfKPaOVThXyaGNg,4268
|
|
46
46
|
fmtr/tools/tools.py,sha256=CAsApa1YwVdNE6H66Vjivs_mXYvOas3rh7fPELAnTpk,795
|
|
47
47
|
fmtr/tools/unicode_tools.py,sha256=yS_9wpu8ogNoiIL7s1G_8bETFFO_YQlo4LNPv1NLDeY,52
|
|
48
|
-
fmtr/tools/version,sha256=
|
|
48
|
+
fmtr/tools/version,sha256=X0h-7BeauKqNJDa25REZFacQpPeKRTGCByBGn_deWBk,6
|
|
49
49
|
fmtr/tools/webhook_tools.py,sha256=q3pVJ1NCem2SrMuFcLxiWd7DibFs7Q-uGtojfXd3Qcg,380
|
|
50
50
|
fmtr/tools/yaml_tools.py,sha256=Bhhyd6GQVKO72Lp8ky7bAUjIB_65Hdh0Q45SKIEe6S8,1901
|
|
51
51
|
fmtr/tools/ai_tools/__init__.py,sha256=JZrLuOFNV1A3wvJgonxOgz_4WS-7MfCuowGWA5uYCjs,372
|
|
52
|
-
fmtr/tools/ai_tools/agentic_tools.py,sha256
|
|
52
|
+
fmtr/tools/ai_tools/agentic_tools.py,sha256=-6q9Cp8WUbLu9AmS5SI5R8qtWMp1Ky4rFXMtfLvcQ7A,4791
|
|
53
53
|
fmtr/tools/ai_tools/inference_tools.py,sha256=2UP2gXEyOJUjyyV6zmFIYmIxUsh1rXkRH0IbFvr2bRs,11908
|
|
54
54
|
fmtr/tools/dns_tools/__init__.py,sha256=Mzaepy8lEdT0SJtUOCnF3IkpOt0vrZn-IOgOf4xfd8Q,258
|
|
55
55
|
fmtr/tools/dns_tools/client.py,sha256=IBbd7Xgx9ExTn_EPoL7ts9JfXokHHuOiD9m4K6tl1Q0,2817
|
|
@@ -81,9 +81,9 @@ fmtr/tools/tests/test_path.py,sha256=AkZQa6_8BQ-VaCyL_J-iKmdf2ZaM-xFYR37Kun3k4_g
|
|
|
81
81
|
fmtr/tools/tests/test_yaml.py,sha256=jc0TwwKu9eC0LvFGNMERdgBue591xwLxYXFbtsRwXVM,287
|
|
82
82
|
fmtr/tools/version_tools/__init__.py,sha256=pg4iLtmIr5HtyEW_j0fMFoIdzqi_w9xH8-grQaXLB28,318
|
|
83
83
|
fmtr/tools/version_tools/version_tools.py,sha256=Hcc6yferZS1hHbugRTdiHhSNmXEEG0hjCiTTXKna-YY,1127
|
|
84
|
-
fmtr_tools-1.3.
|
|
85
|
-
fmtr_tools-1.3.
|
|
86
|
-
fmtr_tools-1.3.
|
|
87
|
-
fmtr_tools-1.3.
|
|
88
|
-
fmtr_tools-1.3.
|
|
89
|
-
fmtr_tools-1.3.
|
|
84
|
+
fmtr_tools-1.3.39.dist-info/licenses/LICENSE,sha256=FW9aa6vVN5IjRQWLT43hs4_koYSmpcbIovlKeAJ0_cI,10757
|
|
85
|
+
fmtr_tools-1.3.39.dist-info/METADATA,sha256=LioB91BL767fAM6aTZjf73CDtwZD39UnOw6XnrMcSuk,16259
|
|
86
|
+
fmtr_tools-1.3.39.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
87
|
+
fmtr_tools-1.3.39.dist-info/entry_points.txt,sha256=h-r__Xh5njtFqreMLg6cGuTFS4Qh-QqJPU1HB-_BS-Q,357
|
|
88
|
+
fmtr_tools-1.3.39.dist-info/top_level.txt,sha256=LXem9xCgNOD72tE2gRKESdiQTL902mfFkwWb6-dlwEE,5
|
|
89
|
+
fmtr_tools-1.3.39.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|