sciform 0.38.2__py3-none-any.whl → 0.39.0__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.
sciform/api/formatter.py CHANGED
@@ -118,7 +118,6 @@ class Formatter:
118
118
  'left_pad_dec_place': 0,
119
119
  'exp_format': 'standard',
120
120
  'extra_si_prefixes': {},
121
- 'extra_iec_prefixes': {},
122
121
  'extra_parts_per_forms': {},
123
122
  'capitalize': False,
124
123
  'superscript': True,
@@ -153,7 +152,6 @@ class Formatter:
153
152
  left_pad_dec_place: int | None = None,
154
153
  exp_format: option_types.ExpFormat | None = None,
155
154
  extra_si_prefixes: dict[int, str] | None = None,
156
- extra_iec_prefixes: dict[int, str] | None = None,
157
155
  extra_parts_per_forms: dict[int, str] | None = None,
158
156
  capitalize: bool | None = None,
159
157
  superscript: bool | None = None,
@@ -180,7 +178,6 @@ class Formatter:
180
178
  * ``exp_val`` must be 0 for fixed point and percent modes
181
179
  * ``exp_val`` must be a multiple of 3 for engineering and
182
180
  shifted engineering modes
183
- * ``exp_val`` must be a multiple of 10 for binary iec mode
184
181
 
185
182
  * ``upper_separator`` may be any of ``['', ',', '.', ' ', '_']``
186
183
  but must be different from ``decimal_separator``
@@ -189,13 +186,12 @@ class Formatter:
189
186
 
190
187
  :param exp_mode: Specify the exponent formatting mode.
191
188
  :type exp_mode: ``Literal['fixed_point', 'percent',
192
- 'scientific', 'engineering', 'engineering_shifted', 'binary',
193
- 'binary_iec'] | None``
189
+ 'scientific', 'engineering', 'engineering_shifted'] | None``
194
190
  :param exp_val: Indicates how the exponent value should be
195
191
  chosen. If an integer is specified, the value must be 0 for
196
192
  fixed point and percent modes, an integer multiple of 3 for
197
- engineering and engineering shifted modes, and an integer
198
- multiple of 10 for binary IEC mode. Can be set to ``"auto"``.
193
+ engineering and engineering shifted modes. Can be set to
194
+ ``"auto"``.
199
195
  :type exp_val: ``int | Literal['auto'] | None``
200
196
  :param round_mode: Indicate how to round numbers during
201
197
  formatting.
@@ -231,11 +227,6 @@ class Formatter:
231
227
  values to si prefixes. Entries overwrite default values. A
232
228
  value of ``None`` means that exponent will not be converted.
233
229
  :type extra_si_prefixes: ``dict[int, Union[str, None]] | None``
234
- :param extra_iec_prefixes: Dictionary mapping additional
235
- exponent values to iec prefixes. Entries overwrite default
236
- values. A value of ``None`` means that exponent will not be
237
- converted.
238
- :type extra_iec_prefixes: ``dict[int, Union[str, None]] | None``
239
230
  :param extra_parts_per_forms: Dictionary mapping additional
240
231
  exponent values to "parts-per" forms. Entries overwrite
241
232
  default values. A value of ``None`` means that exponent will
@@ -297,7 +288,6 @@ class Formatter:
297
288
  left_pad_dec_place=left_pad_dec_place,
298
289
  exp_format=exp_format,
299
290
  extra_si_prefixes=extra_si_prefixes,
300
- extra_iec_prefixes=extra_iec_prefixes,
301
291
  extra_parts_per_forms=extra_parts_per_forms,
302
292
  capitalize=capitalize,
303
293
  superscript=superscript,
@@ -38,7 +38,6 @@ def set_global_options( # noqa: PLR0913
38
38
  left_pad_dec_place: int | None = None,
39
39
  exp_format: option_types.ExpFormat | None = None,
40
40
  extra_si_prefixes: dict[int, str] | None = None,
41
- extra_iec_prefixes: dict[int, str] | None = None,
42
41
  extra_parts_per_forms: dict[int, str] | None = None,
43
42
  capitalize: bool | None = None,
44
43
  superscript: bool | None = None,
@@ -69,7 +68,6 @@ def set_global_options( # noqa: PLR0913
69
68
  left_pad_dec_place=left_pad_dec_place,
70
69
  exp_format=exp_format,
71
70
  extra_si_prefixes=extra_si_prefixes,
72
- extra_iec_prefixes=extra_iec_prefixes,
73
71
  extra_parts_per_forms=extra_parts_per_forms,
74
72
  capitalize=capitalize,
75
73
  superscript=superscript,
@@ -119,7 +117,6 @@ class GlobalOptionsContext:
119
117
  left_pad_dec_place: int | None = None,
120
118
  exp_format: option_types.ExpFormat | None = None,
121
119
  extra_si_prefixes: dict[int, str] | None = None,
122
- extra_iec_prefixes: dict[int, str] | None = None,
123
120
  extra_parts_per_forms: dict[int, str] | None = None,
124
121
  capitalize: bool | None = None,
125
122
  superscript: bool | None = None,
@@ -145,7 +142,6 @@ class GlobalOptionsContext:
145
142
  left_pad_dec_place=left_pad_dec_place,
146
143
  exp_format=exp_format,
147
144
  extra_si_prefixes=extra_si_prefixes,
148
- extra_iec_prefixes=extra_iec_prefixes,
149
145
  extra_parts_per_forms=extra_parts_per_forms,
150
146
  capitalize=capitalize,
151
147
  superscript=superscript,
@@ -24,18 +24,6 @@ val_to_si_dict = {
24
24
  -30: "q",
25
25
  }
26
26
 
27
- val_to_iec_dict = {
28
- 0: "",
29
- 10: "Ki",
30
- 20: "Mi",
31
- 30: "Gi",
32
- 40: "Ti",
33
- 50: "Pi",
34
- 60: "Ei",
35
- 70: "Zi",
36
- 80: "Yi",
37
- }
38
-
39
27
  val_to_parts_per_dict = {
40
28
  0: "",
41
29
  -6: "ppm",
@@ -2,15 +2,14 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import TYPE_CHECKING, Literal, cast
5
+ from typing import TYPE_CHECKING
6
6
 
7
7
  from sciform.format_utils.exp_translations import (
8
- val_to_iec_dict,
9
8
  val_to_parts_per_dict,
10
9
  val_to_si_dict,
11
10
  )
12
11
  from sciform.format_utils.numbers import (
13
- get_mantissa_exp_base,
12
+ get_mantissa_exp,
14
13
  )
15
14
  from sciform.options.option_types import (
16
15
  ExpFormatEnum,
@@ -24,22 +23,13 @@ if TYPE_CHECKING: # pragma: no cover
24
23
 
25
24
  def get_translation_dict(
26
25
  exp_format: ExpFormatEnum,
27
- base: Literal[10, 2],
28
26
  extra_si_prefixes: dict[int, str],
29
- extra_iec_prefixes: dict[int, str],
30
27
  extra_parts_per_forms: dict[int, str],
31
28
  ) -> dict[int, str]:
32
29
  """Resolve dictionary of prefix translations."""
33
30
  if exp_format is ExpFormatEnum.PREFIX:
34
- if base == 10:
35
- translation_dict = val_to_si_dict.copy()
36
- translation_dict.update(extra_si_prefixes)
37
- elif base == 2:
38
- translation_dict = val_to_iec_dict.copy()
39
- translation_dict.update(extra_iec_prefixes)
40
- else:
41
- msg = f"Unhandled base {base}"
42
- raise ValueError(msg)
31
+ translation_dict = val_to_si_dict.copy()
32
+ translation_dict.update(extra_si_prefixes)
43
33
  elif exp_format is ExpFormatEnum.PARTS_PER:
44
34
  translation_dict = val_to_parts_per_dict.copy()
45
35
  translation_dict.update(extra_parts_per_forms)
@@ -50,24 +40,21 @@ def get_translation_dict(
50
40
  return translation_dict
51
41
 
52
42
 
53
- base_exp_symbol_dict = {10: "e", 2: "b"}
54
-
55
-
56
- def get_standard_exp_str(base: int, exp_val: int, *, capitalize: bool = False) -> str:
43
+ def get_standard_exp_str(exp_val: int, *, capitalize: bool = False) -> str:
57
44
  """Get standard (eg. 'e+02') exponent string."""
58
- exp_symbol = base_exp_symbol_dict[base]
45
+ base_symbol = "e"
59
46
  if capitalize:
60
- exp_symbol = exp_symbol.capitalize()
61
- return f"{exp_symbol}{exp_val:+03d}"
47
+ base_symbol = base_symbol.capitalize()
48
+ return f"{base_symbol}{exp_val:+03d}"
62
49
 
63
50
 
64
51
  superscript_translate = str.maketrans("+-0123456789", "⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹")
65
52
 
66
53
 
67
- def get_superscript_exp_str(base: int, exp_val: int) -> str:
54
+ def get_superscript_exp_str(exp_val: int) -> str:
68
55
  """Get superscript (e.g. '×10⁺²') exponent string."""
69
56
  exp_val_str = f"{exp_val}".translate(superscript_translate)
70
- return f"×{base}{exp_val_str}"
57
+ return f"×10{exp_val_str}"
71
58
 
72
59
 
73
60
  def get_exp_str( # noqa: PLR0913
@@ -76,7 +63,6 @@ def get_exp_str( # noqa: PLR0913
76
63
  exp_mode: ExpModeEnum,
77
64
  exp_format: ExpFormatEnum,
78
65
  extra_si_prefixes: dict[int, str],
79
- extra_iec_prefixes: dict[int, str],
80
66
  extra_parts_per_forms: dict[int, str],
81
67
  capitalize: bool,
82
68
  superscript: bool,
@@ -87,18 +73,10 @@ def get_exp_str( # noqa: PLR0913
87
73
  if exp_mode is ExpModeEnum.PERCENT:
88
74
  return "%"
89
75
 
90
- if exp_mode is ExpModeEnum.BINARY or exp_mode is ExpModeEnum.BINARY_IEC:
91
- base = 2
92
- else:
93
- base = 10
94
- base = cast(Literal[10, 2], base)
95
-
96
76
  if exp_format is ExpFormatEnum.PREFIX or exp_format is ExpFormatEnum.PARTS_PER:
97
77
  translation_dict = get_translation_dict(
98
78
  exp_format,
99
- base,
100
79
  extra_si_prefixes,
101
- extra_iec_prefixes,
102
80
  extra_parts_per_forms,
103
81
  )
104
82
  if (
@@ -110,9 +88,9 @@ def get_exp_str( # noqa: PLR0913
110
88
  return exp_str
111
89
 
112
90
  if superscript:
113
- return get_superscript_exp_str(base, exp_val)
91
+ return get_superscript_exp_str(exp_val)
114
92
 
115
- return get_standard_exp_str(base, exp_val, capitalize=capitalize)
93
+ return get_standard_exp_str(exp_val, capitalize=capitalize)
116
94
 
117
95
 
118
96
  def get_val_unc_exp(
@@ -132,7 +110,7 @@ def get_val_unc_exp(
132
110
  else:
133
111
  exp_driver_val = unc
134
112
 
135
- _, exp_val, _ = get_mantissa_exp_base(
113
+ _, exp_val = get_mantissa_exp(
136
114
  exp_driver_val,
137
115
  exp_mode=exp_mode,
138
116
  input_exp=input_exp,
@@ -1,10 +1,9 @@
1
- """Utilities for parsing mantissa, base, and exp."""
1
+ """Utilities for parsing mantissa, and exp."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
5
  import re
6
6
  from decimal import Decimal
7
- from math import floor, log2
8
7
  from typing import Literal
9
8
 
10
9
  from sciform.formatting.parser import (
@@ -26,13 +25,6 @@ def get_top_dec_place(num: Decimal) -> int:
26
25
  return len(digits) + exp - 1
27
26
 
28
27
 
29
- def get_top_dec_place_binary(num: Decimal) -> int:
30
- """Get the decimal place of a decimal's most significant digit."""
31
- if not num.is_finite() or num == 0:
32
- return 0
33
- return floor(log2(abs(num)))
34
-
35
-
36
28
  def get_bottom_dec_place(num: Decimal) -> int:
37
29
  """Get the decimal place of a decimal's least significant digit."""
38
30
  if not num.is_finite():
@@ -102,39 +94,12 @@ def get_engineering_exp(
102
94
  return exp_val
103
95
 
104
96
 
105
- def get_binary_exp(
106
- num: Decimal,
107
- input_exp: int | ExpValEnum,
108
- *,
109
- iec: bool = False,
110
- ) -> int:
111
- """Get the exponent for binary formatting modes."""
112
- if input_exp is ExpValEnum.AUTO:
113
- exp_val = get_top_dec_place_binary(num)
114
- if iec:
115
- exp_val = (exp_val // 10) * 10
116
- else:
117
- if iec and input_exp % 10 != 0:
118
- msg = (
119
- f"Exponent must be an integer multiple of 10 in binary IEC mode, not "
120
- f"{input_exp}."
121
- )
122
- raise ValueError(msg)
123
- exp_val = input_exp
124
- return exp_val
125
-
126
-
127
- def get_mantissa_exp_base(
97
+ def get_mantissa_exp(
128
98
  num: Decimal,
129
99
  exp_mode: ExpModeEnum,
130
100
  input_exp: int | ExpValEnum,
131
- ) -> tuple[Decimal, int, int]:
132
- """Get mantissa, exponent, and base for formatting a decimal number."""
133
- if exp_mode is ExpModeEnum.BINARY or exp_mode is ExpModeEnum.BINARY_IEC:
134
- base = 2
135
- else:
136
- base = 10
137
-
101
+ ) -> tuple[Decimal, int]:
102
+ """Get mantissa and exponent for formatting a decimal number."""
138
103
  if num == 0 or not num.is_finite():
139
104
  mantissa = Decimal(num)
140
105
  exp = 0 if input_exp is ExpValEnum.AUTO else input_exp
@@ -147,16 +112,12 @@ def get_mantissa_exp_base(
147
112
  exp = get_engineering_exp(num, input_exp)
148
113
  elif exp_mode is ExpModeEnum.ENGINEERING_SHIFTED:
149
114
  exp = get_engineering_exp(num, input_exp, shifted=True)
150
- elif exp_mode is ExpModeEnum.BINARY:
151
- exp = get_binary_exp(num, input_exp)
152
- elif exp_mode is ExpModeEnum.BINARY_IEC:
153
- exp = get_binary_exp(num, input_exp, iec=True)
154
115
  else:
155
116
  msg = f"Unhandled exponent mode {exp_mode}."
156
117
  raise ValueError(msg)
157
- mantissa = num * Decimal(base) ** Decimal(-exp)
118
+ mantissa = num * Decimal(10) ** Decimal(-exp)
158
119
  mantissa = mantissa.normalize()
159
- return mantissa, exp, base
120
+ return mantissa, exp
160
121
 
161
122
 
162
123
  # language=pythonverboseregexp noqa: ERA001
@@ -18,7 +18,7 @@ pattern = re.compile(
18
18
  |
19
19
  (?P<round_mode_special>[AP])
20
20
  )?
21
- (?P<exp_mode>[fF%eErRbB])?
21
+ (?P<exp_mode>[fF%eErR])?
22
22
  (?:x(?P<exp_val>[+-]?\d+))?
23
23
  (?P<prefix_mode>p)?
24
24
  (?P<paren_uncertainty>\(\))?
@@ -46,11 +46,6 @@ def parse_exp_mode(
46
46
  exp_mode = "engineering_shifted"
47
47
  else:
48
48
  exp_mode = "engineering"
49
- elif exp_mode in ["b", "B"]:
50
- if alternate_mode:
51
- exp_mode = "binary_iec"
52
- else:
53
- exp_mode = "binary"
54
49
  else:
55
50
  capitalize = None
56
51
  return exp_mode, capitalize
@@ -16,7 +16,7 @@ from sciform.format_utils.make_strings import (
16
16
  get_sign_str,
17
17
  )
18
18
  from sciform.format_utils.numbers import (
19
- get_mantissa_exp_base,
19
+ get_mantissa_exp,
20
20
  get_val_unc_top_dec_place,
21
21
  parse_mantissa_from_ascii_exp_str,
22
22
  )
@@ -88,7 +88,6 @@ def format_non_finite(num: Decimal, options: FinalizedOptions) -> str:
88
88
  capitalize=options.capitalize,
89
89
  superscript=options.superscript,
90
90
  extra_si_prefixes=options.extra_si_prefixes,
91
- extra_iec_prefixes=options.extra_iec_prefixes,
92
91
  extra_parts_per_forms=options.extra_parts_per_forms,
93
92
  )
94
93
  else:
@@ -120,7 +119,7 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
120
119
  round_mode = options.round_mode
121
120
  exp_mode = options.exp_mode
122
121
  ndigits = options.ndigits
123
- mantissa, temp_exp_val, base = get_mantissa_exp_base(num, exp_mode, exp_val)
122
+ mantissa, temp_exp_val = get_mantissa_exp(num, exp_mode, exp_val)
124
123
  round_digit = get_round_dec_place(mantissa, round_mode, ndigits)
125
124
  mantissa_rounded = round(mantissa, -round_digit)
126
125
 
@@ -128,8 +127,8 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
128
127
  Repeat mantissa + exponent discovery after rounding in case rounding
129
128
  altered the required exponent.
130
129
  """
131
- rounded_num = mantissa_rounded * Decimal(base) ** Decimal(temp_exp_val)
132
- mantissa, exp_val, base = get_mantissa_exp_base(rounded_num, exp_mode, exp_val)
130
+ rounded_num = mantissa_rounded * Decimal(10) ** Decimal(temp_exp_val)
131
+ mantissa, exp_val = get_mantissa_exp(rounded_num, exp_mode, exp_val)
133
132
  round_digit = get_round_dec_place(mantissa, round_mode, ndigits)
134
133
  mantissa_rounded = round(mantissa, -int(round_digit))
135
134
  mantissa_rounded = cast(Decimal, mantissa_rounded)
@@ -170,7 +169,6 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
170
169
  capitalize=options.capitalize,
171
170
  superscript=options.superscript,
172
171
  extra_si_prefixes=options.extra_si_prefixes,
173
- extra_iec_prefixes=options.extra_iec_prefixes,
174
172
  extra_parts_per_forms=options.extra_parts_per_forms,
175
173
  )
176
174
 
@@ -179,16 +177,10 @@ def format_num(num: Decimal, options: FinalizedOptions) -> str:
179
177
  return result
180
178
 
181
179
 
182
- def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str: # noqa: PLR0915
180
+ def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str:
183
181
  """Format value/uncertainty pair according to input options."""
184
182
  exp_mode = options.exp_mode
185
183
 
186
- if exp_mode is ExpModeEnum.BINARY or exp_mode is ExpModeEnum.BINARY_IEC:
187
- msg = (
188
- "Binary exponent modes are not supported for value/uncertainty formatting."
189
- )
190
- raise NotImplementedError(msg)
191
-
192
184
  unc = abs(unc)
193
185
  if exp_mode is ExpModeEnum.PERCENT:
194
186
  val *= 100
@@ -269,12 +261,12 @@ def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str
269
261
  """
270
262
  ndigits = -round_digit + exp_val
271
263
 
272
- val_mantissa, _, _ = get_mantissa_exp_base(
264
+ val_mantissa, _ = get_mantissa_exp(
273
265
  val_rounded,
274
266
  exp_mode=exp_mode,
275
267
  input_exp=exp_val,
276
268
  )
277
- unc_mantissa, _, _ = get_mantissa_exp_base(
269
+ unc_mantissa, _ = get_mantissa_exp(
278
270
  unc_rounded,
279
271
  exp_mode=exp_mode,
280
272
  input_exp=exp_val,
@@ -337,7 +329,6 @@ def format_val_unc(val: Decimal, unc: Decimal, options: FinalizedOptions) -> str
337
329
  exp_mode=exp_mode,
338
330
  exp_format=options.exp_format,
339
331
  extra_si_prefixes=options.extra_si_prefixes,
340
- extra_iec_prefixes=options.extra_iec_prefixes,
341
332
  extra_parts_per_forms=options.extra_parts_per_forms,
342
333
  capitalize=options.capitalize,
343
334
  superscript=options.superscript,
@@ -6,12 +6,11 @@ import re
6
6
  from typing import Literal, get_args
7
7
 
8
8
  ascii_exp_pattern = re.compile(
9
- r"^(?P<mantissa>.*)(?P<ascii_base>[eEbB])(?P<exp>[+-]\d+)$",
9
+ r"^(?P<mantissa>.*)(?P<ascii_base>[eE])(?P<exp>[+-]\d+)$",
10
10
  )
11
- ascii_base_dict = {"e": 10, "E": 10, "b": 2, "B": 2}
12
11
 
13
12
  unicode_exp_pattern = re.compile(
14
- r"^(?P<mantissa>.*)×(?P<base>10|2)(?P<super_exp>[⁺⁻]?[⁰¹²³⁴⁵⁶⁷⁸⁹]+)$",
13
+ r"^(?P<mantissa>.*)×10(?P<super_exp>[⁺⁻]?[⁰¹²³⁴⁵⁶⁷⁸⁹]+)$",
15
14
  )
16
15
  superscript_translation = str.maketrans("⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹", "+-0123456789")
17
16
 
@@ -19,24 +18,17 @@ output_formats = Literal["latex", "html", "ascii"]
19
18
 
20
19
 
21
20
  def _make_exp_str(
22
- base: int,
23
21
  exp: int,
24
22
  output_format: output_formats,
25
23
  *,
26
24
  capitalize: bool = False,
27
25
  ) -> str:
28
26
  if output_format == "latex":
29
- return rf"\times{base}^{{{exp}}}"
27
+ return rf"\times10^{{{exp}}}"
30
28
  if output_format == "html":
31
- return f"×{base}<sup>{exp}</sup>"
29
+ return f"×10<sup>{exp}</sup>"
32
30
  if output_format == "ascii":
33
- if base == 10:
34
- exp_str = f"e{exp:+03d}"
35
- elif base == 2:
36
- exp_str = f"b{exp:+03d}"
37
- else:
38
- msg = f"base must be 10 or 2, not {base}"
39
- raise ValueError(msg)
31
+ exp_str = f"e{exp:+03d}"
40
32
  if capitalize:
41
33
  exp_str = exp_str.upper()
42
34
  return exp_str
@@ -116,10 +108,8 @@ def convert_sciform_format(
116
108
  if match := re.match(ascii_exp_pattern, formatted_str):
117
109
  mantissa = match.group("mantissa")
118
110
  ascii_base = match.group("ascii_base")
119
- base = ascii_base_dict[ascii_base]
120
111
  exp = int(match.group("exp"))
121
112
  exp_str = _make_exp_str(
122
- base,
123
113
  exp,
124
114
  output_format,
125
115
  capitalize=ascii_base.isupper(),
@@ -128,10 +118,9 @@ def convert_sciform_format(
128
118
  suffix_str = exp_str
129
119
  elif match := re.match(unicode_exp_pattern, formatted_str):
130
120
  mantissa = match.group("mantissa")
131
- base = int(match.group("base"))
132
121
  super_exp = match.group("super_exp")
133
122
  exp = int(super_exp.translate(superscript_translation))
134
- exp_str = _make_exp_str(base, exp, output_format)
123
+ exp_str = _make_exp_str(exp, output_format)
135
124
  main_str = mantissa
136
125
  suffix_str = exp_str
137
126
  else:
@@ -51,9 +51,9 @@ paren_pattern = rf"""
51
51
  """
52
52
 
53
53
  # language=pythonverboseregexp
54
- ascii_exp_pattern = r"(?P<ascii_exp>(?P<ascii_base>[eEbB])(?P<ascii_exp_val>[+-]\d+))"
54
+ ascii_exp_pattern = r"(?P<ascii_exp>(?P<ascii_base>[eE])(?P<ascii_exp_val>[+-]\d+))"
55
55
  # language=pythonverboseregexp
56
- uni_exp_pattern = r"(?P<uni_exp>×(?P<uni_base>10|2)(?P<uni_exp_val>[⁺⁻]?[⁰¹²³⁴⁵⁶⁷⁸⁹]+))"
56
+ uni_exp_pattern = r"(?P<uni_exp>×10(?P<uni_exp_val>[⁺⁻]?[⁰¹²³⁴⁵⁶⁷⁸⁹]+))"
57
57
  # language=pythonverboseregexp
58
58
  prefix_exp_pattern = r"(\ (?P<prefix_exp>[a-zA-zμ]+))"
59
59
  # language=pythonverboseregexp
@@ -88,79 +88,58 @@ $
88
88
  superscript_translation = str.maketrans("⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹", "+-0123456789")
89
89
 
90
90
 
91
- def _get_ascii_base_exp_val(match: re.Match) -> tuple[int, int]:
92
- base = match.group("ascii_base")
93
- if base.lower() == "e":
94
- base = 10
95
- elif base.lower() == "b":
96
- base = 2
97
- else: # pragma: no cover
98
- msg = f'Unexpected ASCII base: "{base}"'
99
- raise ValueError(msg)
100
- exp_val = int(match.group("ascii_exp_val"))
101
- return base, exp_val
91
+ def _get_ascii_exp_val(match: re.Match) -> int:
92
+ return int(match.group("ascii_exp_val"))
102
93
 
103
94
 
104
- def _get_unicode_base_exp_val(match: re.Match) -> tuple[int, int]:
105
- base = int(match.group("uni_base"))
106
- exp_val = int(match.group("uni_exp_val").translate(superscript_translation))
107
- return base, exp_val
95
+ def _get_unicode_exp_val(match: re.Match) -> int:
96
+ return int(match.group("uni_exp_val").translate(superscript_translation))
108
97
 
109
98
 
110
- def _get_prefix_base_exp_val(prefix_exp: str) -> tuple[int, int]:
111
- candidate_base_exp_val_pairs = []
99
+ def _get_prefix_exp_val(prefix_exp: str) -> int:
100
+ candidate_exp_vals = []
112
101
  global_options = global_options_module.GLOBAL_DEFAULT_OPTIONS
113
102
 
114
103
  si_translations = exp_translations.val_to_si_dict.copy()
115
104
  si_translations.update(global_options.extra_si_prefixes)
116
105
  for key, value in si_translations.items():
117
106
  if prefix_exp == value:
118
- candidate_base_exp_val_pairs.append((10, key))
107
+ candidate_exp_vals.append(key)
119
108
 
120
109
  pp_translations = exp_translations.val_to_parts_per_dict.copy()
121
110
  pp_translations.update(global_options.extra_parts_per_forms)
122
111
  for key, value in pp_translations.items():
123
112
  if prefix_exp == value:
124
- candidate_base_exp_val_pairs.append((10, key))
125
-
126
- iec_translations = exp_translations.val_to_iec_dict.copy()
127
- iec_translations.update(global_options.extra_iec_prefixes)
128
- for key, value in iec_translations.items():
129
- if prefix_exp == value:
130
- candidate_base_exp_val_pairs.append((2, key))
113
+ candidate_exp_vals.append(key)
131
114
 
132
- if len(candidate_base_exp_val_pairs) == 0:
115
+ if len(candidate_exp_vals) == 0:
133
116
  msg = f'Unrecognized prefix: "{prefix_exp}". Unable to parse input.'
134
117
  raise ValueError(msg)
135
- if len(set(candidate_base_exp_val_pairs)) > 1:
136
- candidate_exps = [
137
- candidate_pair[1] for candidate_pair in candidate_base_exp_val_pairs
138
- ]
118
+ if len(set(candidate_exp_vals)) > 1:
139
119
  msg = (
140
- f'Multiple translations found for "{prefix_exp}": {candidate_exps}. '
120
+ f'Multiple translations found for "{prefix_exp}": {candidate_exp_vals}. '
141
121
  f"Unable to parse input."
142
122
  )
143
123
  raise ValueError(msg)
144
- base, exp_val = candidate_base_exp_val_pairs[0]
145
- return base, exp_val
124
+ exp_val = candidate_exp_vals[0]
125
+ return exp_val
146
126
 
147
127
 
148
- def _extract_exp_base_exp_val(
128
+ def _extract_exp_val(
149
129
  match: re.Match,
150
130
  ) -> tuple[int, int]:
151
131
  if match.group("ascii_exp"):
152
- base, exp_val = _get_ascii_base_exp_val(match)
132
+ exp_val = _get_ascii_exp_val(match)
153
133
  elif match.group("uni_exp"):
154
- base, exp_val = _get_unicode_base_exp_val(match)
134
+ exp_val = _get_unicode_exp_val(match)
155
135
  elif prefix_exp := match.group("prefix_exp"):
156
- base, exp_val = _get_prefix_base_exp_val(prefix_exp)
136
+ exp_val = _get_prefix_exp_val(prefix_exp)
157
137
  elif match.group("percent_exp"):
158
- base = 10
159
138
  exp_val = -2
160
139
  else: # pragma: no cover
161
140
  msg = "Expected named match groups not found."
162
141
  raise ValueError(msg)
163
- return base, exp_val
142
+ return exp_val
164
143
 
165
144
 
166
145
  def _infer_decimal_separator(
@@ -252,54 +231,52 @@ def _normalize_separators(
252
231
  return input_str
253
232
 
254
233
 
255
- def _parse_no_exp_pattern(match: re.Match) -> tuple[str, str | None, int, int]:
234
+ def _parse_no_exp_pattern(match: re.Match) -> tuple[str, str | None, int]:
256
235
  if val := match.group("non_finite_val"):
257
236
  unc = None
258
237
  else:
259
238
  val = match.group("pm_val")
260
239
  unc = match.group("pm_unc")
261
- base = 10
262
240
  exp_val = 0
263
- return val, unc, base, exp_val
241
+ return val, unc, exp_val
264
242
 
265
243
 
266
- def _parse_optional_exp_pattern(match: re.Match) -> tuple[str, str | None, int, int]:
244
+ def _parse_optional_exp_pattern(match: re.Match) -> tuple[str, str | None, int]:
267
245
  if match.group("exp"):
268
- base, exp_val = _extract_exp_base_exp_val(match)
246
+ exp_val = _extract_exp_val(match)
269
247
  else:
270
- base = 10
271
248
  exp_val = 0
272
249
  if val := match.group("val"):
273
250
  unc = None
274
251
  else:
275
252
  val = match.group("paren_val")
276
253
  unc = match.group("paren_unc")
277
- return val, unc, base, exp_val
254
+ return val, unc, exp_val
278
255
 
279
256
 
280
- def _parse_always_exp_pattern(match: re.Match) -> tuple[str, str | None, int, int]:
281
- base, exp_val = _extract_exp_base_exp_val(match)
257
+ def _parse_always_exp_pattern(match: re.Match) -> tuple[str, str | None, int]:
258
+ exp_val = _extract_exp_val(match)
282
259
  if val := match.group("non_finite_val"):
283
260
  unc = None
284
261
  else:
285
262
  val = match.group("pm_val")
286
263
  unc = match.group("pm_unc")
287
- return val, unc, base, exp_val
264
+ return val, unc, exp_val
288
265
 
289
266
 
290
- def _extract_val_unc_base_exp(
267
+ def _extract_val_unc_exp(
291
268
  input_str: str,
292
- ) -> tuple[str, str | None, int, int]:
269
+ ) -> tuple[str, str | None, int]:
293
270
  if match := re.fullmatch(no_exp_pattern, input_str, re.VERBOSE):
294
- val, unc, base, exp_val = _parse_no_exp_pattern(match)
271
+ val, unc, exp_val = _parse_no_exp_pattern(match)
295
272
  elif match := re.fullmatch(optional_exp_pattern, input_str, re.VERBOSE):
296
- val, unc, base, exp_val = _parse_optional_exp_pattern(match)
273
+ val, unc, exp_val = _parse_optional_exp_pattern(match)
297
274
  elif match := re.fullmatch(always_exp_pattern, input_str, re.VERBOSE):
298
- val, unc, base, exp_val = _parse_always_exp_pattern(match)
275
+ val, unc, exp_val = _parse_always_exp_pattern(match)
299
276
  else:
300
277
  msg = f'Input string "{input_str}" does not match any expected input format.'
301
278
  raise ValueError(msg)
302
- return val, unc, base, exp_val
279
+ return val, unc, exp_val
303
280
 
304
281
 
305
282
  def parse_val_unc_from_str(
@@ -319,8 +296,8 @@ def parse_val_unc_from_str(
319
296
  (INF)e+00, or "(123.000 ± 0.456)e+01"
320
297
 
321
298
  Whichever pattern is matched is then parsed to extract the value,
322
- uncertainty, and exponent base and value (if no exponent information
323
- is available then base is set to 10 and value is set to 0).
299
+ uncertainty, and exponent value (if no exponent information
300
+ is available then the exponent value is set to 0).
324
301
 
325
302
  Next, grouping separators such as "_" or " " are stripped from the
326
303
  value and uncertainty strings. An algorithm is then run to detect
@@ -339,7 +316,7 @@ def parse_val_unc_from_str(
339
316
  Finally, the value and uncertainty strings are converted to decimals
340
317
  and multiplied by the extracted exponents.
341
318
  """
342
- val, unc, base, exp_val = _extract_val_unc_base_exp(input_str)
319
+ val, unc, exp_val = _extract_val_unc_exp(input_str)
343
320
 
344
321
  decimal_separator = _parse_decimal_separator(val, unc, decimal_separator)
345
322
 
@@ -372,16 +349,15 @@ def parse_val_unc_from_str(
372
349
  raise ValueError(msg)
373
350
  unc = "0." + "0" * num_missing_zeros + unc
374
351
 
375
- base = Decimal(base)
376
352
  exp_val = Decimal(exp_val)
377
353
  val = Decimal(val)
378
354
  if val.is_finite():
379
- val *= base**exp_val
355
+ val *= 10**exp_val
380
356
 
381
357
  if unc is not None:
382
358
  unc = Decimal(unc)
383
359
  if unc.is_finite():
384
- unc *= base**exp_val
360
+ unc *= 10**exp_val
385
361
 
386
362
  return val, unc
387
363
 
@@ -30,7 +30,6 @@ class FinalizedOptions:
30
30
  left_pad_dec_place: int
31
31
  exp_format: option_types.ExpFormatEnum
32
32
  extra_si_prefixes: dict[int, str]
33
- extra_iec_prefixes: dict[int, str]
34
33
  extra_parts_per_forms: dict[int, str]
35
34
  capitalize: bool
36
35
  superscript: bool
@@ -15,7 +15,6 @@ PKG_DEFAULT_OPTIONS = PopulatedOptions(
15
15
  left_pad_dec_place=0,
16
16
  exp_format="standard",
17
17
  extra_si_prefixes={},
18
- extra_iec_prefixes={},
19
18
  extra_parts_per_forms={},
20
19
  capitalize=False,
21
20
  superscript=False,
@@ -62,7 +62,6 @@ class InputOptions:
62
62
  left_pad_dec_place: int | None = None
63
63
  exp_format: option_types.ExpFormat | None = None
64
64
  extra_si_prefixes: dict[int, str] | None = None
65
- extra_iec_prefixes: dict[int, str] | None = None
66
65
  extra_parts_per_forms: dict[int, str] | None = None
67
66
  capitalize: bool | None = None
68
67
  superscript: bool | None = None
@@ -74,8 +74,6 @@ ExpMode = Literal[
74
74
  "scientific",
75
75
  "engineering",
76
76
  "engineering_shifted",
77
- "binary",
78
- "binary_iec",
79
77
  ]
80
78
 
81
79
 
@@ -87,8 +85,6 @@ class ExpModeEnum(str, Enum):
87
85
  SCIENTIFIC = "scientific"
88
86
  ENGINEERING = "engineering"
89
87
  ENGINEERING_SHIFTED = "engineering_shifted"
90
- BINARY = "binary"
91
- BINARY_IEC = "binary_iec"
92
88
 
93
89
 
94
90
  ExpFormat = Literal["standard", "prefix", "parts_per"]
@@ -55,7 +55,6 @@ class PopulatedOptions:
55
55
  'left_pad_dec_place': 0,
56
56
  'exp_format': 'standard',
57
57
  'extra_si_prefixes': {},
58
- 'extra_iec_prefixes': {},
59
58
  'extra_parts_per_forms': {},
60
59
  'capitalize': False,
61
60
  'superscript': True,
@@ -66,7 +65,7 @@ class PopulatedOptions:
66
65
  'pm_whitespace': True,
67
66
  )
68
67
  >>> print(formatter.populated_options.as_dict())
69
- {'exp_mode': 'engineering', 'exp_val': 'auto', 'round_mode': 'sig_fig', 'ndigits': 2, 'upper_separator': '', 'decimal_separator': '.', 'lower_separator': '', 'sign_mode': '-', 'left_pad_char': ' ', 'left_pad_dec_place': 0, 'exp_format': 'standard', 'extra_si_prefixes': {}, 'extra_iec_prefixes': {}, 'extra_parts_per_forms': {}, 'capitalize': False, 'superscript': True, 'nan_inf_exp': False, 'paren_uncertainty': False, 'left_pad_matching': False, 'paren_uncertainty_trim': True, 'pm_whitespace': True}
68
+ {'exp_mode': 'engineering', 'exp_val': 'auto', 'round_mode': 'sig_fig', 'ndigits': 2, 'upper_separator': '', 'decimal_separator': '.', 'lower_separator': '', 'sign_mode': '-', 'left_pad_char': ' ', 'left_pad_dec_place': 0, 'exp_format': 'standard', 'extra_si_prefixes': {}, 'extra_parts_per_forms': {}, 'capitalize': False, 'superscript': True, 'nan_inf_exp': False, 'paren_uncertainty': False, 'left_pad_matching': False, 'paren_uncertainty_trim': True, 'pm_whitespace': True}
70
69
 
71
70
  Note that :class:`PopulatedOptions` lacks the ``add_c_prefix``,
72
71
  ``add_small_si_prefixes`` and ``add_ppth_form`` options present
@@ -103,7 +102,6 @@ class PopulatedOptions:
103
102
  left_pad_dec_place: int
104
103
  exp_format: option_types.ExpFormat
105
104
  extra_si_prefixes: dict[int, str]
106
- extra_iec_prefixes: dict[int, str]
107
105
  extra_parts_per_forms: dict[int, str]
108
106
  capitalize: bool
109
107
  superscript: bool
@@ -89,12 +89,6 @@ def validate_exp_val(
89
89
  f"for engineering exponent modes."
90
90
  )
91
91
  raise ValueError(msg)
92
- if options.exp_mode == "binary_iec" and options.exp_val % 10 != 0:
93
- msg = (
94
- f"Exponent must be a multiple of 10, not "
95
- f"exp_val={options.exp_val}, for binary IEC exponent mode."
96
- )
97
- raise ValueError(msg)
98
92
 
99
93
 
100
94
  def validate_exp_options(
@@ -188,7 +182,6 @@ def validate_extra_translations(
188
182
  """Validate translation dictionary have int keys and alphabetic values."""
189
183
  translations_dicts = [
190
184
  options.extra_si_prefixes,
191
- options.extra_iec_prefixes,
192
185
  options.extra_parts_per_forms,
193
186
  ]
194
187
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sciform
3
- Version: 0.38.2
3
+ Version: 0.39.0
4
4
  Summary: A package for formatting numbers into scientific formatted strings.
5
5
  Author-email: Justin Gerber <justin.gerber48@gmail.com>
6
6
  Project-URL: homepage, https://github.com/jagerber48/sciform
@@ -90,10 +90,9 @@ Overview
90
90
 
91
91
  ``sciform`` is used to convert python numbers into strings according to
92
92
  a variety of user-selected scientific formatting options including
93
- decimal, binary, fixed-point, scientific and engineering formats.
93
+ fixed-point, scientific and engineering formats.
94
94
  Where possible, formatting follows documented standards such as those
95
- published by `BIPM <https://www.bipm.org/en/>`_ or
96
- `IEC <https://iec.ch/homepage>`_.
95
+ published by `BIPM <https://www.bipm.org/en/>`_.
97
96
  ``sciform`` provides certain options, such as engineering notation,
98
97
  well-controlled significant figure rounding, and separator customization
99
98
  which are not provided by the python built-in
@@ -0,0 +1,31 @@
1
+ sciform/__init__.py,sha256=Lnb1fep9vjJ7n4U5YdNqRkq9saXuRvppedpW1TZm99Y,781
2
+ sciform/api/__init__.py,sha256=kWXKOuVgwn3580EBGGs4t2uK7_uBgjfvQq2r8b9ZPrM,24
3
+ sciform/api/formatted_number.py,sha256=VdQGRXmUy_Pwc2SeYT8KlZMJBJDu0maI0HHv9DXu1fQ,2804
4
+ sciform/api/formatter.py,sha256=-Cgfbk8M9DGoP0Da8PAzjJVnNqya8NBd-A9osHL0Ov8,14962
5
+ sciform/api/global_configuration.py,sha256=f6N5GqbvBvNL1mHm4uTnyoom28dwoxtfEys1f1YpPmc,6656
6
+ sciform/api/scinum.py,sha256=XF4QiBAlehEKnk_NwDDVWmLnRDwfEalmuzC8b2qUE4Q,3363
7
+ sciform/format_utils/__init__.py,sha256=9tCbjsOOiqvw0DoMUo9qcIC8pFykfVZZ8wkEIRAh-OE,132
8
+ sciform/format_utils/exp_translations.py,sha256=e7yJkWsbTJfF_k8kfvctZ2llZRrn908biyZ1ulu1M4w,429
9
+ sciform/format_utils/exponents.py,sha256=Wq6m6N9qZcyf1hAeWhKraHOJTtd8NiYiB9niNI4DiXI,3254
10
+ sciform/format_utils/grouping.py,sha256=1hZjjVKRUy477LGGFniZwwEHHBDaSb6E0K3SAeCACVY,1641
11
+ sciform/format_utils/make_strings.py,sha256=4g1E3UBDLeoF272OpIGCiuzeZ4KsDjWNiXvbMIfr3sg,5258
12
+ sciform/format_utils/numbers.py,sha256=Se3F9qTooRrtBw_b9n-Nx4Nd1tkV-44glO1KZ9kCjVg,4603
13
+ sciform/format_utils/rounding.py,sha256=VkvIg_UNpGfBG8QQQVGLZPwNfw5Tj3jlM8Wgx1r6ils,3491
14
+ sciform/formatting/__init__.py,sha256=T_DnF4vkeAQx1xuzff7rRZbWj-hEbNI6Pj2D2831L9E,38
15
+ sciform/formatting/fsml.py,sha256=-dLnJ0ZfmQw4XdeAi1EF9brgiGsFLOIJmBWCzr9bTEc,3679
16
+ sciform/formatting/number_formatting.py,sha256=rOwBCsr2_ccmGiU9JpPs2aNwlw82GJf-iOlZqOfQoxg,11802
17
+ sciform/formatting/output_conversion.py,sha256=kwYJsj33RE1BVPMfK28wYni6KhcMhfHNap78cQfE-qo,5136
18
+ sciform/formatting/parser.py,sha256=j9rdxXrV_6gMD0_AdvdS4PJ5aGMAxyJ9yRSr2_WvDLM,15190
19
+ sciform/options/__init__.py,sha256=tw_CZHaNrdixZoQyG6ZD5UMKkQxXok0qBQCxt28Gh20,51
20
+ sciform/options/conversion.py,sha256=2ad0Mwwb7qqJ5xClevxaUVkVznokQBmAVVewh_5-7jU,4146
21
+ sciform/options/finalized_options.py,sha256=6LNX38NBsiZkZD4zZtmIMJ7LteP8-bmQGBweDNfWPyI,1223
22
+ sciform/options/global_options.py,sha256=3uJT47dg2cmiCc-DSeQi-9ES39RagZcN1lrp6eXg_6A,670
23
+ sciform/options/input_options.py,sha256=0PIc4JINvY2XRPpv9s4zhclPsII3MTT77j4Kf1tWb1k,3753
24
+ sciform/options/option_types.py,sha256=nEzkj3QHRSGEYr6R2hCOKtRcHIwhHS9BD8QRAX931vM,2262
25
+ sciform/options/populated_options.py,sha256=0n0vWH8ixNxwWGxAJdGzi46--noDfiOrOJpx4Hu6iaw,4865
26
+ sciform/options/validation.py,sha256=8Zg5dcp-sPqyZWo5zMZVMzAmFS5KlA8kTjdMGBG9VmU,7754
27
+ sciform-0.39.0.dist-info/LICENSE,sha256=-oyCEZu-6HLrRSfRg44uuNDE0c59GVEdqYIgidqSP70,1056
28
+ sciform-0.39.0.dist-info/METADATA,sha256=S6iVxqbYucDB_mI4XKUSBiykbRbzZMGltkKkP4tnLUM,8937
29
+ sciform-0.39.0.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
30
+ sciform-0.39.0.dist-info/top_level.txt,sha256=mC01YOQ-1u5pDk9BJia-pQKLUMvkreMsldDpFcp7NV8,8
31
+ sciform-0.39.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,31 +0,0 @@
1
- sciform/__init__.py,sha256=Lnb1fep9vjJ7n4U5YdNqRkq9saXuRvppedpW1TZm99Y,781
2
- sciform/api/__init__.py,sha256=kWXKOuVgwn3580EBGGs4t2uK7_uBgjfvQq2r8b9ZPrM,24
3
- sciform/api/formatted_number.py,sha256=VdQGRXmUy_Pwc2SeYT8KlZMJBJDu0maI0HHv9DXu1fQ,2804
4
- sciform/api/formatter.py,sha256=0eOLQmrNnhDO05rbMMOhPjYUYYkW5fT-SiUAxGKXWEI,15554
5
- sciform/api/global_configuration.py,sha256=iSmGcnfs-2cvWz27t9ka9ibDuN732sLwDsLJTi8SA-g,6866
6
- sciform/api/scinum.py,sha256=XF4QiBAlehEKnk_NwDDVWmLnRDwfEalmuzC8b2qUE4Q,3363
7
- sciform/format_utils/__init__.py,sha256=9tCbjsOOiqvw0DoMUo9qcIC8pFykfVZZ8wkEIRAh-OE,132
8
- sciform/format_utils/exp_translations.py,sha256=uh9ZxDKcGcMVSNwj7qkr5TSA6MINIaU1RHZeqKVwEQ0,575
9
- sciform/format_utils/exponents.py,sha256=khG9mkHRG-qb2Xnd_lpkLXwV8KcHUJekgC8MwgfSL_U,3976
10
- sciform/format_utils/grouping.py,sha256=1hZjjVKRUy477LGGFniZwwEHHBDaSb6E0K3SAeCACVY,1641
11
- sciform/format_utils/make_strings.py,sha256=4g1E3UBDLeoF272OpIGCiuzeZ4KsDjWNiXvbMIfr3sg,5258
12
- sciform/format_utils/numbers.py,sha256=L3J8B7GR6RWNaYthDmnY5d4bLYBviCYw-Evqb754VTw,5799
13
- sciform/format_utils/rounding.py,sha256=VkvIg_UNpGfBG8QQQVGLZPwNfw5Tj3jlM8Wgx1r6ils,3491
14
- sciform/formatting/__init__.py,sha256=T_DnF4vkeAQx1xuzff7rRZbWj-hEbNI6Pj2D2831L9E,38
15
- sciform/formatting/fsml.py,sha256=J2Zd7RD4E32hNTP2Vo_2PEvzHBt3aIUerhLT72stovQ,3843
16
- sciform/formatting/number_formatting.py,sha256=_4SxAzo3VLp6_ThrJfn9yQu3rH_0_27NOftNSPfIMA8,12268
17
- sciform/formatting/output_conversion.py,sha256=TdcfQa0p7S7iIkqcwVYbxCGwoGu4mPOV3XzjABnaGmA,5523
18
- sciform/formatting/parser.py,sha256=58noOOyg5m3NKJwGfEEwiUivzm5vGPG3K1_OXIrrVAk,16310
19
- sciform/options/__init__.py,sha256=tw_CZHaNrdixZoQyG6ZD5UMKkQxXok0qBQCxt28Gh20,51
20
- sciform/options/conversion.py,sha256=2ad0Mwwb7qqJ5xClevxaUVkVznokQBmAVVewh_5-7jU,4146
21
- sciform/options/finalized_options.py,sha256=r38T1qp2sLD0mVIOovfax2Q46zb7yjjypr1CpUsqMCA,1262
22
- sciform/options/global_options.py,sha256=T_OXFKi2qO5PV-LTZt9ClppWYsUmStBgyQqFuoX6idM,697
23
- sciform/options/input_options.py,sha256=ibUMS9q_hdf9lms90hA6FzbEZpe-KVdZg5K-A1H7j3Q,3806
24
- sciform/options/option_types.py,sha256=nZa_HZHlRf6ILbKxXbP1lqB3s9WoJRYv0uLQonY5ud8,2346
25
- sciform/options/populated_options.py,sha256=7TBuSxBvcUopF16NIMQuGoAT6B0vq0HLigO7qrIld1A,4961
26
- sciform/options/validation.py,sha256=b70AE6AqbNjEsBkVXwYDQRCQnwVbqWWJ7eUxh2jkyqU,8092
27
- sciform-0.38.2.dist-info/LICENSE,sha256=-oyCEZu-6HLrRSfRg44uuNDE0c59GVEdqYIgidqSP70,1056
28
- sciform-0.38.2.dist-info/METADATA,sha256=unQrN6dtmkyuGB6Yl2WsKHZyZgO5isUV7ywTEgvWCyY,8990
29
- sciform-0.38.2.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
30
- sciform-0.38.2.dist-info/top_level.txt,sha256=mC01YOQ-1u5pDk9BJia-pQKLUMvkreMsldDpFcp7NV8,8
31
- sciform-0.38.2.dist-info/RECORD,,