labfreed 0.0.18__py2.py3-none-any.whl → 0.0.20__py2.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 labfreed might be problematic. Click here for more details.

@@ -364,16 +364,16 @@ class VisualMarker:
364
364
  app = typer.Typer()
365
365
 
366
366
 
367
- def generate_qr_with_markers(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT):
367
+ def _generate_qr_with_markers(qr_str, text, title, direction):
368
368
  if title:
369
369
  #try to use standard size 10. Go bigger if 10 does not fit the data
370
370
  try:
371
- qr = segno.make_qr(url, error="L", version=10)
371
+ qr = segno.make_qr(qr_str, error="L", version=10)
372
372
  except DataOverflowError as e:
373
- qr = segno.make_qr(url, error="L")
373
+ qr = segno.make_qr(qr_str, error="L")
374
374
  v = qr.version
375
375
  else:
376
- qr = segno.make_qr(url, error="L")
376
+ qr = segno.make_qr(qr_str, error="L")
377
377
  v = qr.version
378
378
 
379
379
  if(qr.mode != "alphanumeric"):
@@ -396,42 +396,18 @@ def generate_qr_with_markers(url, text="PAC", title=None, direction = Direction.
396
396
  combined_matrix = np.concatenate((title_marker, padding, qr_matrix, padding, visual_marker), axis=append_axis)
397
397
  else:
398
398
  combined_matrix = np.concatenate((qr_matrix, padding, visual_marker), axis=append_axis)
399
-
399
+
400
400
  return combined_matrix
401
-
402
- def generate_qr_with_markers_file(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT, fmt='svg', path=str):
403
- combined_matrix = generate_qr_with_markers(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT)
404
- outfile = f'{path}.{fmt}'
405
- match fmt:
406
- case 'png':
407
- segno.writers.write_png(combined_matrix, combined_matrix.shape[::-1], out=outfile, border=9)
408
- case 'svg':
409
- segno.writers.write_svg(combined_matrix, combined_matrix.shape[::-1], out=outfile, border=9)
410
401
 
411
-
412
- def generate_qr_with_markers_uri(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT, fmt='svg'):
413
- combined_matrix = generate_qr_with_markers(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT)
402
+ def save_qr_with_markers(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT, fmt='png', path='qr'):
403
+ combined_matrix = _generate_qr_with_markers(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT)
404
+ outfile = f'{path}.{fmt}'
414
405
  match fmt:
415
406
  case 'png':
416
- out = segno.writers.as_png_data_uri(combined_matrix, combined_matrix.shape[::-1], border=9)
407
+ writers.write_png(combined_matrix, combined_matrix.shape[::-1], out=outfile, border=9)
417
408
  case 'svg':
418
- out = segno.writers.as_svg_data_uri(combined_matrix, combined_matrix.shape[::-1], border=9)
419
- return out
420
-
421
- def generate_qr_with_markers_svg(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT, width=None, height=None, border=9, svg_omitsize=False):
422
- combined_matrix = generate_qr_with_markers(url, text="PAC", title=None, direction = Direction.LEFT_TO_RIGHT)
423
- with io.BytesIO() as out:
424
- version = combined_matrix.shape[::-1]
425
- scalex = width / (version[0] + 2*border) if width else 1
426
- scaley = height / (version[1] + 2*border) if height else 1
427
- scale = min(scalex, scaley)
428
- segno.writers.write_svg(combined_matrix, version, out, border=border,
429
- xmldecl=False, svgns=True, scale=scale, omitsize=svg_omitsize
430
- )
431
- s = out.getvalue().decode()
432
- return s
433
-
434
-
409
+ writers.write_svg(combined_matrix, combined_matrix.shape[::-1], out=outfile, border=9)
410
+
435
411
 
436
412
 
437
413
 
@@ -440,8 +416,7 @@ def main(url: Annotated[str, typer.Argument(help="The PAC-ID to be rendered as Q
440
416
  text: Annotated[str, typer.Option(help="The text of the PAC decoration.")] = "PAC",
441
417
  direction: Annotated[Direction, typer.Option(help="The position/direction of the PAC decoration.")] = Direction.TOP_TO_BOTTOM):
442
418
 
443
- img = generate_qr_with_markers(url, text=text, direction=direction)
444
- img.save('generated_codes', f"{outfile}.svg", format='svg')
419
+ save_qr_with_markers(url, text=text, direction=direction, path=outfile)
445
420
 
446
421
 
447
422
 
@@ -9,9 +9,9 @@ from labfreed.PAC_ID.extensions import Extension, UnknownExtension
9
9
  from labfreed.TREX.data_model import TREX
10
10
 
11
11
 
12
- from .PAC_ID.data_model import *
12
+ from ..PAC_ID.data_model import *
13
13
 
14
- from .validation import ValidationMessage, LabFREEDValidationError
14
+ from ..validation import ValidationMessage, LabFREEDValidationError
15
15
 
16
16
 
17
17
 
@@ -1,8 +1,5 @@
1
1
 
2
2
  from abc import ABC, abstractproperty, abstractstaticmethod
3
- from types import MappingProxyType
4
-
5
- from pydantic import Field
6
3
 
7
4
  from labfreed.validation import BaseModelWithValidationMessages
8
5
  from labfreed.PAC_ID.data_model import PACID
@@ -436,7 +436,7 @@ class TREX_Table(TREX_Segment):
436
436
  self.add_validation_message(
437
437
  source=f"Table {self.key}",
438
438
  type="Error",
439
- msg=f"Size mismatch: Table header contains {self.col_names} keys, while most rows have {most_common_len}",
439
+ msg=f"Size mismatch: Table header contains {self.column_names} keys, while most rows have {most_common_len}",
440
440
  highlight_pattern = self.key
441
441
  )
442
442
  expected_row_len = most_common_len
@@ -527,7 +527,7 @@ class TREX_Table(TREX_Segment):
527
527
  r.append(Quantity(value=e.value, unit=unit))
528
528
  else:
529
529
  r.append(e.value_to_python_type())
530
- table.append(r)
530
+ table.append(r)
531
531
  return table
532
532
 
533
533
 
labfreed/__init__.py CHANGED
@@ -2,4 +2,4 @@
2
2
  Python implementation of LabFREED building blocks
3
3
  '''
4
4
 
5
- __version__ = "0.0.18"
5
+ __version__ = "0.0.20"
@@ -1,37 +1,7 @@
1
- from functools import cache
2
- import json
3
- from pathlib import Path
4
-
5
- from rich import print
6
-
7
- from typing import Any, Tuple
8
- from typing_extensions import Annotated
9
- from pydantic import BaseModel, AfterValidator
10
- import quantities as pq
11
- from quantities import units
1
+ from pydantic import BaseModel
12
2
 
13
3
  from labfreed.TREX.unece_units import unece_units
14
4
 
15
- def validate_unit(unit_name:str) -> str :
16
- """
17
- Pydantic validator function for the unit.
18
- Checks if the unit is a valid unit.
19
-
20
-
21
- Args:
22
- unit (str): unit symbol, e.g. 'kg'
23
-
24
- Returns:
25
- str: the input unit.
26
-
27
- Errors:
28
- raises an AssertionError if validation fails
29
- """
30
- if hasattr(pq, unit_name):
31
- return unit_name
32
- else:
33
- assert False
34
-
35
5
 
36
6
  class Unit(BaseModel):
37
7
  name: str
labfreed/validation.py CHANGED
@@ -113,7 +113,7 @@ class BaseModelWithValidationMessages(BaseModel):
113
113
  return filter_warnings(self.get_nested_validation_messages())
114
114
 
115
115
 
116
- def print_validation_messages(self, str_to_highlight_in=None):
116
+ def print_validation_messages(self, str_to_highlight_in=None, target='console'):
117
117
  if not str_to_highlight_in:
118
118
  str_to_highlight_in = str(self)
119
119
  msgs = self.get_nested_validation_messages()
@@ -133,7 +133,13 @@ class BaseModelWithValidationMessages(BaseModel):
133
133
 
134
134
  text = Text.from_markup(f'\n [bold {color}]{m.type} [/bold {color}] in \t {m.source}' )
135
135
  print(text)
136
- formatted_highlight = m.emphazised_highlight.replace('emph', f'bold {color}')
136
+ match target:
137
+ case 'markdown':
138
+ formatted_highlight = m.emphazised_highlight.replace('emph', f'🔸').replace('[/', '').replace('[', '').replace(']', '')
139
+ case 'console':
140
+ formatted_highlight = m.emphazised_highlight.replace('emph', f'bold {color}')
141
+ case 'html':
142
+ formatted_highlight = m.emphazised_highlight.replace('emph', f'b').replace('[', '<').replace(']', '>')
137
143
  fmtd = str_to_highlight_in.replace(m.highlight, formatted_highlight)
138
144
  fmtd = Text.from_markup(fmtd)
139
145
  print(fmtd)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labfreed
3
- Version: 0.0.18
3
+ Version: 0.0.20
4
4
  Summary: Python implementation of LabFREED building blocks
5
5
  Author-email: Reto Thürer <thuerer.r@buchi.com>
6
6
  Description-Content-Type: text/markdown
@@ -19,7 +19,7 @@ Requires-Dist: typer>=0.15.2
19
19
  [![Tests](https://github.com/retothuerer/LabFREED/actions/workflows/ci.yml/badge.svg)](https://github.com/retothuerer/LabFREED/actions/workflows/ci.yml)
20
20
  -->
21
21
 
22
- This is a Python implementation of [LabFREED](www.labfreed.wega-it.com) building blocks.
22
+ This is a Python implementation of [LabFREED](https://labfreed.wega-it.com) building blocks.
23
23
 
24
24
  ## Supported Building Blocks
25
25
  - PAC-ID
@@ -41,7 +41,7 @@ pip install labfreed
41
41
  ### Parse a simple PAC-ID
42
42
 
43
43
  ```python
44
- from labfreed.parse_pac import PAC_Parser
44
+ from labfreed.IO.parse_pac import PAC_Parser
45
45
 
46
46
  # Parse the PAC-ID
47
47
  pac_str = 'HTTPS://PAC.METTORIUS.COM/-MD/bal500/@1234'
@@ -53,17 +53,44 @@ is_valid = pac_id.is_valid()
53
53
  print(f'PAC-ID is valid: {is_valid}')
54
54
  ```
55
55
  ```text
56
- >> [Error during execution: No module named 'quantities']
56
+ >> PAC-ID is valid: True
57
57
  ```
58
58
  ### Show recommendations:
59
59
  Note that the PAC-ID -- while valid -- uses characters which are not recommended (results in larger QR code).
60
60
  There is a nice function to highlight problems
61
61
 
62
62
  ```python
63
- pac_id.print_validation_messages()
63
+ pac_id.print_validation_messages(target='markdown')
64
64
  ```
65
65
  ```text
66
- >> [Error during execution: name 'pac_id' is not defined]
66
+ >> =======================================
67
+ >> Validation Results
68
+ >> ---------------------------------------
69
+ >>
70
+ >> Recommendation in id segment value bal500
71
+ >> HTTPS://PAC.METTORIUS.COM/-MD/🔸b🔸🔸a🔸🔸l🔸500/@1234
72
+ >> Characters b l a should not be used.
73
+ >>
74
+ >> Recommendation in id segment value @1234
75
+ >> HTTPS://PAC.METTORIUS.COM/-MD/bal500/🔸@🔸1234
76
+ >> Characters @ should not be used.
77
+ >>
78
+ >> Warning in Category -MD
79
+ >> HTTPS://PAC.METTORIUS.COM/🔸-MD🔸/bal500/@1234
80
+ >> Category key -MD is not a well known key. It is recommended to use well known keys only
81
+ ```
82
+ ### Save as QR Code
83
+
84
+ ```python
85
+ from labfreed.IO.generate_qr import save_qr_with_markers
86
+
87
+ save_qr_with_markers(pac_str, fmt='png')
88
+ ```
89
+ ```text
90
+ >> Large QR: Provided URL is not alphanumeric!
91
+ >> Size: 29
92
+ >> Version: 3
93
+ >> Error Level: M
67
94
  ```
68
95
  ### PAC-CAT
69
96
 
@@ -75,7 +102,15 @@ if isinstance(pac_id, PAC_CAT):
75
102
  pac_id.print_categories()
76
103
  ```
77
104
  ```text
78
- >> [Error during execution: name 'PAC_Parser' is not defined]
105
+ >> Main Category
106
+ >> ----------
107
+ >> key (): -DR
108
+ >> id (21): XQ908756
109
+ >> Category
110
+ >> ------
111
+ >> key (): -MD
112
+ >> model_number (240): bal500
113
+ >> serial_number (21): @1234
79
114
  ```
80
115
  ### Parse a PAC-ID with extensions
81
116
  PAC-ID can have extensions. Here we parse a PAC-ID with attached display names and summary.
@@ -89,7 +124,7 @@ display_names = pac_id.get_extension('N') # display name has name 'N'
89
124
  print(display_names)
90
125
  ```
91
126
  ```text
92
- >> [Error during execution: name 'PAC_Parser' is not defined]
127
+ >> Display names: My Balance ❤️
93
128
  ```
94
129
  ```python
95
130
  # TREX
@@ -99,7 +134,7 @@ v = trex.get_segment('WEIGHT').to_python_type()
99
134
  print(f'WEIGHT = {v}')
100
135
  ```
101
136
  ```text
102
- >> [Error during execution: name 'pac_id' is not defined]
137
+ >> WEIGHT = 67.89 g
103
138
  ```
104
139
  ### Create a PAC-ID with Extensions
105
140
 
@@ -109,12 +144,12 @@ print(f'WEIGHT = {v}')
109
144
  from labfreed.PAC_ID.data_model import PACID, IDSegment
110
145
  from labfreed.utilities.well_known_keys import WellKnownKeys
111
146
 
112
- pac_id = PACID(issuer='METTORIUS:COM', identifier=[IDSegment(key=WellKnownKeys.SERIAL, value='1234')])
147
+ pac_id = PACID(issuer='METTORIUS.COM', identifier=[IDSegment(key=WellKnownKeys.SERIAL, value='1234')])
113
148
  pac_str = pac_id.serialize()
114
149
  print(pac_str)
115
150
  ```
116
151
  ```text
117
- >> HTTPS://PAC.METTORIUS:COM/21:1234
152
+ >> HTTPS://PAC.METTORIUS.COM/21:1234
118
153
  ```
119
154
  #### Create a TREX
120
155
  TREX can conveniently be created from a python dictionary.
@@ -139,7 +174,7 @@ trex.update(
139
174
  )
140
175
 
141
176
  # Create a table
142
- table = DataTable(['DURATION', 'DATE', 'OK', 'COMMENT'])
177
+ table = DataTable(['DURATION', 'Date', 'OK', 'COMMENT'])
143
178
  table.append([Quantity(value=1, unit=Unit(symbol='h', name='hour')), datetime.now(), True, 'FOO'])
144
179
  table.append([ 1.1, datetime.now(), True, 'BAR'])
145
180
  table.append([ 1.3, datetime.now(), False, 'BLUBB'])
@@ -147,26 +182,35 @@ table.append([ 1.3, datetime.no
147
182
  trex.update({'TABLE': table})
148
183
 
149
184
  # Validation also works the same way for TREX
150
- if trex.get_nested_validation_messages():
151
- trex.print_validation_messages()
152
-
153
- # Side Note: The TREX can be turned back into a dict
154
- d = trex.dict()
185
+ trex.print_validation_messages(target='markdown')
155
186
  ```
156
187
  ```text
157
- >> [Error during execution: No module named 'quantities']
188
+ >> =======================================
189
+ >> Validation Results
190
+ >> ---------------------------------------
191
+ >>
192
+ >> Error in TREX table column Date
193
+ >> DEMO$TREX/STOP$T.D:20240505T1306+TEMP$KEL:10.15+OK$T.B:F+COMMENT$T.A:FOO+COMMENT2$T.T:12G3+TABLE$$DURATION$HUR:D🔸a🔸🔸t🔸🔸e🔸$T.D:OK$T.B:COMMENT$T.A::1:20250409T094048.268:T:FOO::1.1:20250409T094048.268:T:BAR::1.3:20250409T094048.268:F:BLUBB
194
+ >> Column header key contains invalid characters: e,t,a
195
+ ```
196
+ ```python
197
+ # there is an error. 'Date' uses lower case. Lets fix it
198
+ d = trex.dict()
199
+ d['TABLE'].col_names[1] = 'DATE'
200
+ trex = TREX(name_='DEMO')
201
+ trex.update(d)
158
202
  ```
159
203
  #### Combine PAC-ID and TREX and serialize
160
204
 
161
205
  ```python
162
- from labfreed.parse_pac import PACID_With_Extensions
206
+ from labfreed.IO.parse_pac import PACID_With_Extensions
163
207
 
164
208
  pac_with_trex = PACID_With_Extensions(pac_id=pac_id, extensions=[trex])
165
209
  pac_str = pac_with_trex.serialize()
166
210
  print(pac_str)
167
211
  ```
168
212
  ```text
169
- >> [Error during execution: No module named 'quantities']
213
+ >> HTTPS://PAC.METTORIUS.COM/21:1234*DEMO$TREX/STOP$T.D:20240505T1306+TEMP$KEL:10.15+OK$T.B:F+COMMENT$T.A:FOO+COMMENT2$T.T:12G3+TABLE$$DURATION$HUR:DATE$T.D:OK$T.B:COMMENT$T.A::1:20250409T094048.268:T:FOO::1.1:20250409T094048.268:T:BAR::1.3:20250409T094048.268:F:BLUBB
170
214
  ```
171
215
  <!-- END EXAMPLES -->
172
216
 
@@ -174,9 +218,13 @@ print(pac_str)
174
218
 
175
219
  ## Change Log
176
220
 
177
- ### v0.0.17
178
- - dependencies are installed automatically
221
+ ### v0.0.20
222
+ - bugfix in TREX table to dict conversion
223
+ - markdown compatible validation printing
179
224
 
180
- ### v0.0.16
225
+ ### v0.0.19
181
226
  - supports PAC-ID, PAC-CAT, TREX and DisplayName
227
+ - QR generation
182
228
  - ok-ish test coverage
229
+
230
+
@@ -0,0 +1,21 @@
1
+ labfreed/__init__.py,sha256=JJg9mHM5goSWphrIerAaoiUjcOEZ7AXqGJIlmFog-pA,88
2
+ labfreed/validation.py,sha256=he9utRxQwks4ro94AVi8t5rU4jgRcA-6uz1XEmqoAnM,6359
3
+ labfreed/DisplayNameExtension/DisplayNameExtension.py,sha256=l9JZY2eRS0V-H5h3-WXIHiiBJuljns-_e_t9Bp84_CU,1155
4
+ labfreed/IO/generate_qr.py,sha256=wdZSf51Id03xSY8liK2RfB7WyGAw9O4s0VhZzrkAa-g,16680
5
+ labfreed/IO/parse_pac.py,sha256=2c-HXkiQdUrGTL8zGb5CmO9l6ZrCb07rrTMMKdMi3_o,6253
6
+ labfreed/PAC_CAT/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
7
+ labfreed/PAC_CAT/data_model.py,sha256=dGwcQGLy1Dk6SFbs9utxKQKm_4ROZrXdv618APlQg7M,14308
8
+ labfreed/PAC_ID/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ labfreed/PAC_ID/data_model.py,sha256=g09qgC-TV6fjJw9VyDF6mTJ6co2i2RKZc0Z-BmiiUIQ,7483
10
+ labfreed/PAC_ID/extensions.py,sha256=YKIE-aFf1jdL4sqCqUe3txjnP8-dA2zCJrT5lBSjvuE,1092
11
+ labfreed/TREX/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
12
+ labfreed/TREX/data_model.py,sha256=tGgjp76wbS1MSS1Ep842CZyintsbecTZrlapj8WwGH8,29704
13
+ labfreed/TREX/parse.py,sha256=86962VEJpkrTcT436iFIB5dNed5WHABzpjxRjkA3PXo,2043
14
+ labfreed/TREX/unece_units.py,sha256=scPKdsPzY1neAdFOhA08_tRZaR-yplM8mBhIzzDqZBk,3006
15
+ labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
16
+ labfreed/utilities/utility_types.py,sha256=dM0qZgshF3cHJThVzia7UIAOdkNLKukAaaduLqKSaMY,2195
17
+ labfreed/utilities/well_known_keys.py,sha256=nqk66kHdSwJTJfMKlP-xQbBglS8F_NoWsGkfOVITFN0,331
18
+ labfreed-0.0.20.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
19
+ labfreed-0.0.20.dist-info/WHEEL,sha256=Dyt6SBfaasWElUrURkknVFAZDHSTwxg3PaTza7RSbkY,100
20
+ labfreed-0.0.20.dist-info/METADATA,sha256=phvfg_T1RGixhz1rN27aqGk7xRlxLNs_yjj-Ts2Pc-k,6961
21
+ labfreed-0.0.20.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- from labfreed.DisplayNameExtension.DisplayNameExtension import DisplayNames
2
- from labfreed.TREX.data_model import TREX
3
-
4
-
@@ -1,22 +0,0 @@
1
- labfreed/__init__.py,sha256=reRp78_6uZrtmaZRtPjFWADn6svJqLZMou47EfBjrmU,88
2
- labfreed/parse_pac.py,sha256=7y65HO1A3OEr5zftiEtrCaiLLI_8LoRPtQpPcKUNVik,6251
3
- labfreed/validation.py,sha256=QwkZWJhAjWbPUZtJJwjVYsw9TxeFhdbZaKjrPPIpuAA,5937
4
- labfreed/DisplayNameExtension/DisplayNameExtension.py,sha256=l9JZY2eRS0V-H5h3-WXIHiiBJuljns-_e_t9Bp84_CU,1155
5
- labfreed/PAC_CAT/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
6
- labfreed/PAC_CAT/data_model.py,sha256=dGwcQGLy1Dk6SFbs9utxKQKm_4ROZrXdv618APlQg7M,14308
7
- labfreed/PAC_ID/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
- labfreed/PAC_ID/data_model.py,sha256=g09qgC-TV6fjJw9VyDF6mTJ6co2i2RKZc0Z-BmiiUIQ,7483
9
- labfreed/PAC_ID/extensions.py,sha256=bvuZnlNKUdwsDLrPm8fyifqPn_PR4wCVkkScFnvRiuM,1158
10
- labfreed/QR_Generator/generate_qr.py,sha256=A4Bw_UESaB_igTDV2Y7a5T7vdz2Sb3yZCfHM0qKnu0M,18091
11
- labfreed/TREX/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
12
- labfreed/TREX/data_model.py,sha256=neKYBc5_S4t-v86DSaWLq81VJF4oS6eFUch3ChPTYJA,29705
13
- labfreed/TREX/parse.py,sha256=86962VEJpkrTcT436iFIB5dNed5WHABzpjxRjkA3PXo,2043
14
- labfreed/TREX/unece_units.py,sha256=scPKdsPzY1neAdFOhA08_tRZaR-yplM8mBhIzzDqZBk,3006
15
- labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
16
- labfreed/utilities/extension_intertpreters.py,sha256=B3IFJLfVMJQuPfBBtX6ywlDUZEi7_x6tY4g8V7SpWSs,124
17
- labfreed/utilities/utility_types.py,sha256=Zhk8Mu4hHjkn1gs8oh7vOxxaT7L7wLMVG40ZOWCKGK4,2865
18
- labfreed/utilities/well_known_keys.py,sha256=nqk66kHdSwJTJfMKlP-xQbBglS8F_NoWsGkfOVITFN0,331
19
- labfreed-0.0.18.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
20
- labfreed-0.0.18.dist-info/WHEEL,sha256=Dyt6SBfaasWElUrURkknVFAZDHSTwxg3PaTza7RSbkY,100
21
- labfreed-0.0.18.dist-info/METADATA,sha256=FiS8P177t3OE6BwQMsQCUhg4y4GQihwmU4-U98WacAU,5382
22
- labfreed-0.0.18.dist-info/RECORD,,