labfreed 0.2.12__py3-none-any.whl → 0.3.0a0__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.

Files changed (37) hide show
  1. labfreed/__init__.py +1 -1
  2. labfreed/labfreed_infrastructure.py +3 -3
  3. labfreed/pac_attributes/api_data_models/request.py +56 -0
  4. labfreed/pac_attributes/api_data_models/response.py +184 -0
  5. labfreed/pac_attributes/api_data_models/server_capabilities_response.py +7 -0
  6. labfreed/pac_attributes/client/__init__.py +1 -0
  7. labfreed/pac_attributes/client/attribute_cache.py +78 -0
  8. labfreed/pac_attributes/client/client.py +148 -0
  9. labfreed/pac_attributes/server/attribute_data_sources.py +69 -0
  10. labfreed/pac_attributes/server/server.py +237 -0
  11. labfreed/pac_attributes/server/translation_data_sources.py +60 -0
  12. labfreed/pac_attributes/well_knonw_attribute_keys.py +11 -0
  13. labfreed/pac_cat/category_base.py +19 -0
  14. labfreed/pac_cat/pac_cat.py +1 -1
  15. labfreed/pac_id/extension.py +32 -7
  16. labfreed/pac_id/pac_id.py +2 -2
  17. labfreed/pac_id/url_parser.py +4 -4
  18. labfreed/pac_id/url_serializer.py +11 -5
  19. labfreed/pac_id_resolver/cit_common.py +1 -1
  20. labfreed/pac_id_resolver/cit_v1.py +0 -3
  21. labfreed/pac_id_resolver/cit_v2.py +1 -6
  22. labfreed/pac_id_resolver/resolver.py +12 -7
  23. labfreed/pac_id_resolver/services.py +0 -1
  24. labfreed/trex/python_convenience/quantity.py +86 -5
  25. labfreed/trex/value_segments.py +1 -1
  26. labfreed/utilities/ensure_utc_time.py +6 -0
  27. labfreed/utilities/translations.py +60 -0
  28. labfreed/well_known_extensions/display_name_extension.py +3 -3
  29. labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py +4 -0
  30. labfreed/well_known_keys/labfreed/well_known_keys.py +12 -2
  31. labfreed/well_known_keys/unece/unece_units.py +2 -1
  32. {labfreed-0.2.12.dist-info → labfreed-0.3.0a0.dist-info}/METADATA +8 -1
  33. labfreed-0.3.0a0.dist-info/RECORD +56 -0
  34. labfreed/well_known_keys/gs1/gs1.py +0 -4
  35. labfreed-0.2.12.dist-info/RECORD +0 -45
  36. {labfreed-0.2.12.dist-info → labfreed-0.3.0a0.dist-info}/WHEEL +0 -0
  37. {labfreed-0.2.12.dist-info → labfreed-0.3.0a0.dist-info}/licenses/LICENSE +0 -0
@@ -1,3 +1,4 @@
1
+ import re
1
2
  from pydantic import BaseModel, model_validator
2
3
  from labfreed.well_known_keys.unece.unece_units import unece_units
3
4
 
@@ -9,19 +10,27 @@ class Quantity(BaseModel):
9
10
  '''unit. Use SI symbols. Set to None of the Quantity is dimensionless'''
10
11
  log_least_significant_digit: int|None = None
11
12
 
13
+
12
14
  @model_validator(mode='before')
13
15
  @classmethod
14
16
  def transform_inputs(cls, d:dict):
15
17
  if not isinstance(d, dict):
16
18
  return d
19
+
17
20
  # decimals_to_log_significant_digits
18
21
  if decimals:= d.pop('decimals', None):
19
22
  d['log_least_significant_digit'] = - decimals
20
23
 
21
24
  #dimensionless_unit
22
- unit= d.get('unit')
25
+ unit:str= d.get('unit')
23
26
  if unit and unit in ['1', '', 'dimensionless']:
24
27
  d['unit'] = None
28
+
29
+ #try to coerce to ucum. catch the two most likely mistakes to use blanks for multiplication and ^ for exponents.
30
+ if unit:
31
+ unit = unit.replace('/ ', '/').replace(' /', '/').replace(' ', '.').replace('^', '')
32
+ d['unit'] = unit
33
+
25
34
  return d
26
35
 
27
36
 
@@ -36,14 +45,86 @@ class Quantity(BaseModel):
36
45
  ''' for clarity returns the value'''
37
46
  return self.value
38
47
 
48
+ @classmethod
49
+ def from_str_value(cls, value:str, unit:str|None, log_least_significant_digit=None):
50
+ '''
51
+ Creates a quantity from a string representing a number (e.g. -12.345E-8 ).
52
+ It does some magic to find the least significant digit. NOTE: for numbers like 11000 it is ambiguous if the
53
+ trailing zeros are significant. They will be treated as significant. Use scientific notation to be specific (i.e. 11e3 if the zeros are not significant)
54
+ '''
55
+ if '.' not in value and 'E' not in value:
56
+ num_val = int(value)
57
+ else:
58
+ num_val = float(value)
59
+
60
+
61
+ if log_least_significant_digit is None:
62
+ log_least_significant_digit = cls._find_log_significant_digits(value)
63
+
64
+ q = Quantity(value = num_val, unit=unit, log_least_significant_digit=log_least_significant_digit)
65
+ return q
66
+
67
+ @classmethod
68
+ def from_str_with_unit(cls, value:str):
69
+ ''' assumes value and unit are separated by " " '''
70
+ try:
71
+ parts = value.strip().split(' ', 1)
72
+ if len(parts) == 2:
73
+ str_value = parts[0]
74
+ unit = parts[1]
75
+ return cls.from_str_value(str_value, unit)
76
+ except Exception:
77
+ return None
78
+
79
+ @staticmethod
80
+ def _find_log_significant_digits(value:str):
81
+ s = value.strip()
82
+ m = re.match(r'^(?P<mantissa>-?\d+(\.\d+)?)([Ee]-?(?P<exponent>\d+))?$', s)
83
+ if m:
84
+ exponent = int( m.group('exponent') or 0 )
85
+ mantissa = m.group('mantissa')
86
+
87
+ if '.' not in mantissa:
88
+ digits_after_decimal = 0
89
+ int_part = mantissa
90
+ m = re.match(r'-?\d+?(?P<trailing_zeros>0*)(\.\d+)?$', int_part)
91
+ if m:
92
+ trailing_zeros = m.group('trailing_zeros')
93
+ possible_non_significant_digits = len(trailing_zeros) # there is no way to know if they are really insignificant. # noqa: F841
94
+ log_least_significant_digit = exponent
95
+
96
+ else:
97
+ int_part, frac_part = mantissa.rsplit('.', 1)
98
+ digits_after_decimal = len(frac_part)
99
+
100
+ log_least_significant_digit = -digits_after_decimal + exponent
101
+
102
+ return log_least_significant_digit
103
+
104
+
105
+
106
+
107
+
108
+
109
+
110
+ def value_as_str(self):
111
+ if self.log_least_significant_digit is not None:
112
+ log_digit = self.log_least_significant_digit
113
+ if log_digit <= 0:
114
+ val = f"{self.value:.{-log_digit}f}"
115
+ else:
116
+ factor = 10 ** log_digit
117
+ rounded = round(self.value / factor) * factor
118
+ val = str(int(rounded))
119
+ else:
120
+ val = str(self.value)
121
+ return val
122
+
39
123
  def __str__(self):
40
124
  unit_symbol = self.unit
41
125
  if self.unit == "dimensionless" or not self.unit:
42
126
  unit_symbol = ""
43
- if self.log_least_significant_digit is not None:
44
- val = f"{self.value:.{self.log_least_significant_digit}f}"
45
- else:
46
- val = str(self.value)
127
+ val = self.value_as_str()
47
128
  return f"{val} {unit_symbol}"
48
129
 
49
130
  def __repr__(self):
@@ -14,7 +14,7 @@ class ValueSegment(TREX_Segment, Value, ABC):
14
14
 
15
15
  @model_validator(mode='after')
16
16
  def _validate_type(self):
17
- valid_types = valid_types = unece_unit_codes() + ['T.D', 'T.B', 'T.A', 'T.T', 'T.X', 'E']
17
+ valid_types = unece_unit_codes() + ['T.D', 'T.B', 'T.A', 'T.T', 'T.X', 'E']
18
18
  if self.type not in valid_types:
19
19
  self._add_validation_message(
20
20
  source=f"TREX value segment {self.key}",
@@ -0,0 +1,6 @@
1
+ from datetime import datetime, timezone
2
+
3
+
4
+ def ensure_utc(dt: datetime) -> datetime:
5
+ '''Converts to UTC time. If dt has no timezone it is assumed to be in UTC and the utc timezone is explicitly added'''
6
+ return dt.replace(tzinfo=timezone.utc) if dt.tzinfo is None else dt.astimezone(timezone.utc)
@@ -0,0 +1,60 @@
1
+ from pydantic import BaseModel, model_validator
2
+ from typing import List, Optional
3
+ import re
4
+
5
+
6
+ class Translation(BaseModel):
7
+ language_code: str
8
+ text: str
9
+
10
+ @staticmethod
11
+ def create(language_code:str, text:str):
12
+ '''provides a shorter form to init the model without the need to use keywords only'''
13
+ return Translation(language_code=language_code, text=text)
14
+
15
+
16
+ @model_validator(mode="after")
17
+ def validate_language(self):
18
+ if not re.fullmatch(r"^[a-z]{2,3}(-[a-z]{2,3})?$", self.language_code.lower()):
19
+ raise ValueError(f"Invalid language code: {self.language_code}")
20
+ return self
21
+
22
+
23
+ @property
24
+ def language(self) -> str:
25
+ return self.language_code.split("-")[0].lower()
26
+
27
+ @property
28
+ def region(self) -> Optional[str]:
29
+ parts = self.language_code.split("-")
30
+ return parts[1].upper() if len(parts) == 2 else None
31
+
32
+ class Term(BaseModel):
33
+ key: str
34
+ translations: List[Translation]
35
+
36
+ @staticmethod
37
+ def create(key:str, translations:List[Translation]|List[tuple]):
38
+ '''provides a shorter form to init the model without the need to use keywords only'''
39
+ translations = [ t if isinstance(t, Translation) else Translation.create(*t) for t in translations]
40
+ return Term(key=key, translations=translations)
41
+
42
+
43
+ def in_language(self, language_key: str) -> str | None:
44
+ for t in self.translations:
45
+ if t.language_code == language_key:
46
+ return t.text
47
+ return None
48
+
49
+ class Terms(BaseModel):
50
+ terms: List[Term]
51
+
52
+ def translations_for_term(self, term_key: str) -> Term | None:
53
+ for t in self.terms:
54
+ if t.key == term_key:
55
+ return t
56
+ return None
57
+
58
+
59
+
60
+
@@ -8,7 +8,7 @@ from labfreed.utilities.base36 import from_base36, to_base36
8
8
 
9
9
  class DisplayNameExtension(ExtensionBase, LabFREED_BaseModel):
10
10
  name:Literal['N'] = 'N'
11
- type:Literal['N'] = 'N'
11
+ type:Literal['TEXT'] = 'TEXT'
12
12
  display_name: str
13
13
 
14
14
  @computed_field
@@ -28,8 +28,8 @@ class DisplayNameExtension(ExtensionBase, LabFREED_BaseModel):
28
28
  if name != 'N':
29
29
  logging.warning(f'Name {name} was given, but this extension should only be used with name "N". Will ignore input')
30
30
 
31
- if type != 'N':
32
- logging.warning(f'Type {name} was given, but this extension should only be used with type "N". Will try to parse data as display names')
31
+ if type != 'TEXT':
32
+ logging.warning(f'Type {name} was given, but this extension should only be used with type "TEXT". Will try to parse data as display names')
33
33
 
34
34
  display_name = from_base36(data)
35
35
 
@@ -54,4 +54,8 @@ class GS1ApplicationIdentifier(Enum):
54
54
  NHRN_AIM = "714"
55
55
  NHRN_NDC = "715"
56
56
  NHRN_AIC = "716"
57
+
58
+ def as_url(self) -> str:
59
+ # prefix the enum’s name to point to the description in the web
60
+ return f"ref.gs1.org/ai/{self.name}"
57
61
 
@@ -4,7 +4,7 @@ from enum import Enum
4
4
  class WellKnownKeys(Enum):
5
5
  GTIN = '01'
6
6
  BATCH = '10'
7
- CONTAINER_CODE = '20'
7
+ VARIANT = '20'
8
8
  SERIAL = '21'
9
9
  ADDITIONAL_IDENTIFIER = '240'
10
10
  SECONDARY_SERIAL = '250'
@@ -15,4 +15,14 @@ class WellKnownKeys(Enum):
15
15
  METHOD_ID = 'MTD'
16
16
  REPORT_ID = 'RPT'
17
17
  TIMESTAMP = 'TS'
18
- VERSION = 'V'
18
+ VERSION = 'V'
19
+
20
+ MAXWEIGHT = "MAXWEIGHT"
21
+ LASTCALIBRATION = "LASTCAL"
22
+ NOMINALWEIGHT = "NOMINALWEIGHT"
23
+
24
+
25
+ def as_url(self) -> str:
26
+ # prefix the enum’s name to point to the description in the web
27
+ return f"labfreed.org/wkk/{self.name}"
28
+
@@ -26,7 +26,8 @@ def unece_unit(unit_code):
26
26
  return unit[0]
27
27
 
28
28
  def unit_symbol(unit:dict) ->str:
29
- return unit.get('symbol')
29
+ symbol:str = unit.get('symbol')
30
+ return symbol
30
31
 
31
32
  def unit_name(unit:dict) ->str:
32
33
  return unit.get('name')
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: labfreed
3
- Version: 0.2.12
3
+ Version: 0.3.0a0
4
4
  Summary: Python implementation of LabFREED building blocks
5
5
  Author-email: Reto Thürer <thuerer.r@buchi.com>
6
6
  Requires-Python: >=3.11
@@ -28,16 +28,23 @@ Requires-Dist: pytest>=8.3.5 ; extra == "dev"
28
28
  Requires-Dist: pdoc>=15.0.1 ; extra == "dev"
29
29
  Requires-Dist: flit>=3.12.0 ; extra == "dev"
30
30
  Requires-Dist: ruff>=0.11.5 ; extra == "dev"
31
+ Requires-Dist: Flask>=3.1.1 ; extra == "extended"
32
+ Requires-Dist: openpyxl>=3.1.5 ; extra == "extended"
31
33
  Project-URL: Documentation, https://github.com/retothuerer/LabFREED?tab=readme-ov-file#readme
32
34
  Project-URL: Homepage, https://github.com/retothuerer/LabFREED
33
35
  Project-URL: Source, https://github.com/retothuerer/LabFREED
34
36
  Project-URL: Tracker, https://github.com/retothuerer/LabFREED/issues
35
37
  Provides-Extra: dev
38
+ Provides-Extra: extended
36
39
 
37
40
  # LabFREED for Python
38
41
 
39
42
  [![PyPI](https://img.shields.io/pypi/v/labfreed.svg)](https://pypi.org/project/labfreed/) ![Python Version](https://img.shields.io/pypi/pyversions/labfreed) [![Test Labfreed](https://github.com/retothuerer/LabFREED/actions/workflows/run-tests.yml/badge.svg)](https://github.com/retothuerer/LabFREED/actions/workflows/run-tests.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
40
43
 
44
+ <!--
45
+ [![Ruff](https://img.shields.io/badge/style-Ruff-black?logo=ruff&labelColor=gray)](https://github.com/astral-sh/ruff)
46
+ -->
47
+
41
48
 
42
49
  This is a Python implementation of [LabFREED](https://labfreed.org/) building blocks.
43
50
 
@@ -0,0 +1,56 @@
1
+ labfreed/__init__.py,sha256=NXi5VbeTAbNd98NSoKvzjqrmIRUlYv0SdoaalKH_8XM,337
2
+ labfreed/labfreed_infrastructure.py,sha256=YZmU-kgopyB1tvpTR_k_uIt1Q2ezexMrWvu-HaP65IE,10104
3
+ labfreed/pac_attributes/well_knonw_attribute_keys.py,sha256=ruHawnr1AffuhdKz1j1Nx67QphvcpmWsObgZhkuwkH0,318
4
+ labfreed/pac_attributes/api_data_models/request.py,sha256=x-GuFYhCIpqAKa1AHs968OfD8O2cJKg14YUw2hTKVg4,1871
5
+ labfreed/pac_attributes/api_data_models/response.py,sha256=czqQ59myLsN4WNgCdI_dnxRG8hSw4YI062XOPydfePU,5715
6
+ labfreed/pac_attributes/api_data_models/server_capabilities_response.py,sha256=ypDm4f8xZZl036fp8PuIe6lJHNW5Zg1fItgUlnV75V0,178
7
+ labfreed/pac_attributes/client/__init__.py,sha256=li-kVhzIH-Udpmp68e6YXrLXd2pByIbJLmzwwWtmwtE,38
8
+ labfreed/pac_attributes/client/attribute_cache.py,sha256=eWFy7h-T6gd25ENj9pLvSadNFRrzzIineqBoov2cGyw,2688
9
+ labfreed/pac_attributes/client/client.py,sha256=EdGWxi22DBx67-t_ICvm3YJGy0wwU1sMn4efwXtkvWg,6231
10
+ labfreed/pac_attributes/server/attribute_data_sources.py,sha256=6TRSpfqXJbArnKu2gQ5llWzciAkXorO89eaZtvgKWNk,2215
11
+ labfreed/pac_attributes/server/server.py,sha256=P2lqbUH9El2L4VDr2xXql0aVsJw3La7u6lhfR8EZSFs,10773
12
+ labfreed/pac_attributes/server/translation_data_sources.py,sha256=axALOqfP840sOSdVCRYtrens97mm-hpfONMUyuVlCrY,2145
13
+ labfreed/pac_cat/__init__.py,sha256=KNPtQzBD1XVohvG_ucOs7RJj-oi6biUTGB1k-T2o6pk,568
14
+ labfreed/pac_cat/category_base.py,sha256=nFa-y1IiTnPV1xz3RibqkEINISvP045329z8QgbsJ-4,2483
15
+ labfreed/pac_cat/pac_cat.py,sha256=wcb_fhvgjS2xmqTsxS8_Oibvr1nsQt5zr8aUajLfK1E,5578
16
+ labfreed/pac_cat/predefined_categories.py,sha256=5wnMCj-CrACV2W4lH13w7qynWIwi506G3uLNcxuJQGg,8832
17
+ labfreed/pac_id/__init__.py,sha256=NGMbzkwQ4txKeT5pxdIZordwHO8J3_q84jzPanjKoHg,675
18
+ labfreed/pac_id/extension.py,sha256=NgLexs1LbRMMm4ETrn5m4EY2iWoMDgOTb0UV556jatQ,2227
19
+ labfreed/pac_id/id_segment.py,sha256=r5JU1SJuRXhZJJxy5T3xjrb598wIDTLpivSJhIUAzjQ,4526
20
+ labfreed/pac_id/pac_id.py,sha256=DDcSYJ8DBWqIoW_usOT7eDjHZ9700cTYxeUgenHluOA,5378
21
+ labfreed/pac_id/url_parser.py,sha256=9_VHqklm7veknmZitKXw0-Yerl99bmeKYqnPUQPMDAw,5964
22
+ labfreed/pac_id/url_serializer.py,sha256=01LB30pNMBtv2rYHsiE_4Ga2iVA515Boj4ikOIYhiBQ,3511
23
+ labfreed/pac_id_resolver/__init__.py,sha256=RNBlrDOSR42gmSNH9wJVhK_xwEX45cvTKVgWW2bjh7Q,113
24
+ labfreed/pac_id_resolver/cit_common.py,sha256=jzoDOxog8YW68q7vyvDGCZcVcgIzJHXlMt8KwgVnx6o,2885
25
+ labfreed/pac_id_resolver/cit_v1.py,sha256=TVvOWJA6-wmBkwzoHBqNuwV-tndRTSKAK07k56eoJBU,9326
26
+ labfreed/pac_id_resolver/cit_v2.py,sha256=1Nywuv9cpROiOt7X326ePpgajPAe4F9nGqylqaZcsxY,11794
27
+ labfreed/pac_id_resolver/resolver.py,sha256=Rh_pccjFhtvpR5Bz_F0GPjZunl07eh42u3gQgacumYc,3079
28
+ labfreed/pac_id_resolver/services.py,sha256=vtnxLm38t4PNOf73cXh6UZOtWZZOGxfBCfXUDRxGHog,2592
29
+ labfreed/qr/__init__.py,sha256=fdKwP6W2Js--yMbBUdn-g_2uq2VqPpfQJeDLHsMDO-Y,61
30
+ labfreed/qr/generate_qr.py,sha256=mSt-U872O3ReHB_UdS-MzYu0wRgdlKcAOEfTxg5CLRk,16616
31
+ labfreed/trex/__init__.py,sha256=r0MYrGk_XxsqSKo9c2i9jRXApTDeTZD8QRXcRpkOVXY,428
32
+ labfreed/trex/table_segment.py,sha256=qlItBK1x3Qr7KUSM_L6dcmv3Y2fNhiqTaiXbXm5BKs0,9154
33
+ labfreed/trex/trex.py,sha256=WDoPvuhiilLtRSIkntCmDGkFBnD6oRZg0E6hhoV-I2g,2400
34
+ labfreed/trex/trex_base_models.py,sha256=591559BISc82fyIoEP_dq_GHDbPCVzApx7FM3TRQPlY,7545
35
+ labfreed/trex/value_segments.py,sha256=_fbDHDRfo7pxIWpzcbyjppv1VNd8Tnd-VXhbd6igI8g,3698
36
+ labfreed/trex/python_convenience/__init__.py,sha256=dyAQG7t-uYN6VfGXbWIq2bHxGcGI63l7FS2-VPYs2RQ,137
37
+ labfreed/trex/python_convenience/data_table.py,sha256=De0UMVCUUPeK-bUTToRTvL88EywHf6EOPYjgoUHsUpA,3158
38
+ labfreed/trex/python_convenience/pyTREX.py,sha256=mja3EDF4yPCfPyotlG6FEtIuGC0_q9mk3X1VFq5lz-U,10165
39
+ labfreed/trex/python_convenience/quantity.py,sha256=CzK3kCXopTl11qOCirkaiThDvMN6m1FbpLMrsHy2NkI,5336
40
+ labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
41
+ labfreed/utilities/ensure_utc_time.py,sha256=1ZTTzyIt7IimQ4ArTzdgw5hxiabkkplltbQe3Wdt2ZQ,307
42
+ labfreed/utilities/translations.py,sha256=XY4Wud_BfXswUOpebdh0U_D2bMzb2vqluuGWzFK-3uU,1851
43
+ labfreed/well_known_extensions/__init__.py,sha256=CjZTjx8Cn8763Hhnv_--Wj1LcFpFs2cyQwWrrzOS4xM,246
44
+ labfreed/well_known_extensions/default_extension_interpreters.py,sha256=3-BkJrAyBa99NN5Q2QPAm59CcWmPket-rvLzgltp8KY,201
45
+ labfreed/well_known_extensions/display_name_extension.py,sha256=Si2uJ0IGSO3-XyqlYwG7MovnT10oJ3JdOQAyjoZt2Rc,1477
46
+ labfreed/well_known_extensions/trex_extension.py,sha256=tffklaambkFPExcIDRAG9GJ7CHXeuFAagl6FuwS-2kI,929
47
+ labfreed/well_known_keys/gs1/__init__.py,sha256=LOFycgqS6OuV8t22TmtHy-ZI2iuXc3jJfVFwRFVDM3I,103
48
+ labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py,sha256=qSWD7bpTJQdQhXbZHJc20TRdqrnrxICD79goXWr6B-g,1405
49
+ labfreed/well_known_keys/labfreed/well_known_keys.py,sha256=p-hXwEEIs7p2SKn9DQeL9M6xdx3VI5doem-pZfddtmg,659
50
+ labfreed/well_known_keys/unece/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
51
+ labfreed/well_known_keys/unece/__init__.py,sha256=MSP9lmjg9_D9iqG9Yq2_ajYfQSNS9wIT7FXA1c--59M,122
52
+ labfreed/well_known_keys/unece/unece_units.py,sha256=J20d64H69qKDE3XlGdJoXIIh0G-d0jKoiIDsg9an5pk,1655
53
+ labfreed-0.3.0a0.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
54
+ labfreed-0.3.0a0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
55
+ labfreed-0.3.0a0.dist-info/METADATA,sha256=0Fl6mtbyjD7ihk836WY79Shb-hsUXfw-HTbk9cSjYcU,19707
56
+ labfreed-0.3.0a0.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- '''
2
- Data from
3
- https://ref.gs1.org/ai/GS1_Application_Identifiers.jsonld
4
- '''
@@ -1,45 +0,0 @@
1
- labfreed/__init__.py,sha256=t3gO6v5Ul6ergdi4-pLhvP-H26Zd1G4UdvD56f6bwHs,337
2
- labfreed/labfreed_infrastructure.py,sha256=EPDSCaGxWakAoPpHyc6ltf-pOuKyS5829lj_EG6wa74,10072
3
- labfreed/pac_cat/__init__.py,sha256=KNPtQzBD1XVohvG_ucOs7RJj-oi6biUTGB1k-T2o6pk,568
4
- labfreed/pac_cat/category_base.py,sha256=lFQNiTUukyhWdaSCAI7CZxLtj6kNtnBCE4UsePwsGqE,1801
5
- labfreed/pac_cat/pac_cat.py,sha256=FVp65Yf6AnwCB2bKQPgSRWMw3urwAELrdW8sfqsUGw8,5575
6
- labfreed/pac_cat/predefined_categories.py,sha256=5wnMCj-CrACV2W4lH13w7qynWIwi506G3uLNcxuJQGg,8832
7
- labfreed/pac_id/__init__.py,sha256=NGMbzkwQ4txKeT5pxdIZordwHO8J3_q84jzPanjKoHg,675
8
- labfreed/pac_id/extension.py,sha256=zuHI8e51otPbpO1r1xDFh32uXTT8L5pCJn74B-aOUpI,1112
9
- labfreed/pac_id/id_segment.py,sha256=r5JU1SJuRXhZJJxy5T3xjrb598wIDTLpivSJhIUAzjQ,4526
10
- labfreed/pac_id/pac_id.py,sha256=PyOa5y2IVLEcmj7ZkFuURC1lrP3BU0Yj8pzAllhtatw,5309
11
- labfreed/pac_id/url_parser.py,sha256=TAQHxFf7Li8GA517mfOivmnJAJgh782oaSDzmOOkyTE,5942
12
- labfreed/pac_id/url_serializer.py,sha256=Thh41ejth2xv5OcvLDlhVMAzKvu4bDX563cQbJHMxFc,3301
13
- labfreed/pac_id_resolver/__init__.py,sha256=RNBlrDOSR42gmSNH9wJVhK_xwEX45cvTKVgWW2bjh7Q,113
14
- labfreed/pac_id_resolver/cit_common.py,sha256=xEkSSumj_IYgnXn3yKvoTBbgExnIfPY7E-RHU-7pcX8,2905
15
- labfreed/pac_id_resolver/cit_v1.py,sha256=W7UCO0Gm0w09FSo_USFB1-V2tl3iErDxoe2OHh4fkvc,9383
16
- labfreed/pac_id_resolver/cit_v2.py,sha256=wM1wf8UWbepatWNgkJ3l0l-HNJHqsqqPMql5k8fkVso,12127
17
- labfreed/pac_id_resolver/resolver.py,sha256=UfSxRwTTjSgL4VoHfsQiaGTj3tt8dTDDd2wVcbr2Xvc,2817
18
- labfreed/pac_id_resolver/services.py,sha256=fCt-CBUKoEm4-SZqlkt94Or-BnmJ91Q5kZO9ydPw55s,2609
19
- labfreed/qr/__init__.py,sha256=fdKwP6W2Js--yMbBUdn-g_2uq2VqPpfQJeDLHsMDO-Y,61
20
- labfreed/qr/generate_qr.py,sha256=mSt-U872O3ReHB_UdS-MzYu0wRgdlKcAOEfTxg5CLRk,16616
21
- labfreed/trex/__init__.py,sha256=r0MYrGk_XxsqSKo9c2i9jRXApTDeTZD8QRXcRpkOVXY,428
22
- labfreed/trex/table_segment.py,sha256=qlItBK1x3Qr7KUSM_L6dcmv3Y2fNhiqTaiXbXm5BKs0,9154
23
- labfreed/trex/trex.py,sha256=WDoPvuhiilLtRSIkntCmDGkFBnD6oRZg0E6hhoV-I2g,2400
24
- labfreed/trex/trex_base_models.py,sha256=591559BISc82fyIoEP_dq_GHDbPCVzApx7FM3TRQPlY,7545
25
- labfreed/trex/value_segments.py,sha256=qizDsinE-ddta8jzkJbGT3OUjHpYhI2GwxjZ6InzLDs,3712
26
- labfreed/trex/python_convenience/__init__.py,sha256=dyAQG7t-uYN6VfGXbWIq2bHxGcGI63l7FS2-VPYs2RQ,137
27
- labfreed/trex/python_convenience/data_table.py,sha256=De0UMVCUUPeK-bUTToRTvL88EywHf6EOPYjgoUHsUpA,3158
28
- labfreed/trex/python_convenience/pyTREX.py,sha256=mja3EDF4yPCfPyotlG6FEtIuGC0_q9mk3X1VFq5lz-U,10165
29
- labfreed/trex/python_convenience/quantity.py,sha256=Uwu43SKCLN5C8MssRHEdiZbBIJ4C4hhLHVr25UUG_7I,2261
30
- labfreed/utilities/base36.py,sha256=_yX8aQ1OwrK5tnJU1NUEzQSFGr9xAVnNvPObpNzCPYs,2895
31
- labfreed/well_known_extensions/__init__.py,sha256=CjZTjx8Cn8763Hhnv_--Wj1LcFpFs2cyQwWrrzOS4xM,246
32
- labfreed/well_known_extensions/default_extension_interpreters.py,sha256=3-BkJrAyBa99NN5Q2QPAm59CcWmPket-rvLzgltp8KY,201
33
- labfreed/well_known_extensions/display_name_extension.py,sha256=1BZY3Tffak4bNeirBKAktYCG1u2dhEvx8RqamUT6TxU,1465
34
- labfreed/well_known_extensions/trex_extension.py,sha256=tffklaambkFPExcIDRAG9GJ7CHXeuFAagl6FuwS-2kI,929
35
- labfreed/well_known_keys/gs1/__init__.py,sha256=LOFycgqS6OuV8t22TmtHy-ZI2iuXc3jJfVFwRFVDM3I,103
36
- labfreed/well_known_keys/gs1/gs1.py,sha256=LIyy-W89m9L0gVxOu-lpBotsHN6CHvmdE3Vu2VwxUQA,79
37
- labfreed/well_known_keys/gs1/gs1_ai_enum_sorted.py,sha256=D8hE6vm-GedS7W2uC52oYrvAKa4zM-7X11JeT_k23oM,1252
38
- labfreed/well_known_keys/labfreed/well_known_keys.py,sha256=050ED8qlZ-5iKKnAZ48WZ1JSXVH4zgbXy8QMWUVxuqA,388
39
- labfreed/well_known_keys/unece/UneceUnits.json,sha256=kwfQSp_nTuWbADfBBgqTWrvPl6XtM5SedEVLbMJrM7M,898953
40
- labfreed/well_known_keys/unece/__init__.py,sha256=MSP9lmjg9_D9iqG9Yq2_ajYfQSNS9wIT7FXA1c--59M,122
41
- labfreed/well_known_keys/unece/unece_units.py,sha256=gNDQk6KGl-nGMf9Ycq_fQ8P2xxKITgLkcQWPd4H49gI,1630
42
- labfreed-0.2.12.dist-info/licenses/LICENSE,sha256=gHFOv9FRKHxO8cInP3YXyPoJnuNeqrvcHjaE_wPSsQ8,1100
43
- labfreed-0.2.12.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
44
- labfreed-0.2.12.dist-info/METADATA,sha256=b1XEweCYclOc9ApV18nvX4555dN0136b9Iu4IAaruWc,19450
45
- labfreed-0.2.12.dist-info/RECORD,,