math-spec-mapping 0.3.1__py3-none-any.whl → 0.3.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1,2 @@
1
- from .documentation import write_top_level_json_description
1
+ # from .documentation import write_top_level_json_description
2
+ from .starter import remove_dummy_repo_components
@@ -1,4 +1,4 @@
1
- from src import schema
1
+ from src.math_spec_mapping import schema
2
2
 
3
3
 
4
4
  def write_json_description(schema, key, name):
@@ -0,0 +1,271 @@
1
+ import os
2
+
3
+
4
+ def remove_dummy_repo_components(path):
5
+
6
+ directory_folders = os.listdir(path)
7
+
8
+ if "StatefulMetrics" in directory_folders:
9
+ path2 = path + "/StatefulMetrics"
10
+ contents = os.listdir(path2)
11
+ if "Dummy.py" in contents:
12
+ os.remove(path2 + "/Dummy.py")
13
+ if "__init__.py" in contents:
14
+ with open(path2 + "/__init__.py", "r") as f:
15
+ contents = f.read()
16
+ contents = contents.replace(
17
+ "from .Dummy import dummy_stateful_metrics\n", ""
18
+ )
19
+ contents = contents.replace(
20
+ "stateful_metrics.extend(dummy_stateful_metrics)\n", ""
21
+ )
22
+ contents = contents.replace(
23
+ "stateful_metrics.extend(dummy_stateful_metrics)", ""
24
+ )
25
+ with open(path2 + "/__init__.py", "w") as f:
26
+ f.write(contents)
27
+
28
+ if "Metrics" in directory_folders:
29
+ path2 = path + "/Metrics"
30
+ contents = os.listdir(path2)
31
+ if "Dummy.py" in contents:
32
+ os.remove(path2 + "/Dummy.py")
33
+ if "__init__.py" in contents:
34
+ with open(path2 + "/__init__.py", "r") as f:
35
+ contents = f.read()
36
+ contents = contents.replace("from .Dummy import metrics_x\n", "")
37
+ contents = contents.replace("metrics.extend(metrics_x)\n", "")
38
+ contents = contents.replace("metrics.extend(metrics_x)", "")
39
+ with open(path2 + "/__init__.py", "w") as f:
40
+ f.write(contents)
41
+
42
+ """if "Displays" in directory_folders:
43
+ path2 = path + "/Displays"
44
+ contents = os.listdir(path2)
45
+ if "Dummy.py" in contents:
46
+ os.remove(path2 + "/Dummy.py")
47
+ if "__init__.py" in contents:
48
+ with open(path2 + "/__init__.py", "r") as f:
49
+ contents = f.read()
50
+ contents = contents.replace("from .Dummy import metrics_x\n", "")
51
+ contents = contents.replace("metrics.extend(metrics_x)\n", "")
52
+ contents = contents.replace("metrics.extend(metrics_x)", "")
53
+ with open(path2 + "/__init__.py", "w") as f:
54
+ f.write(contents)"""
55
+
56
+ if "Wiring" in directory_folders:
57
+ path2 = path + "/Wiring"
58
+ contents = os.listdir(path2)
59
+ if "Dummy.py" in contents:
60
+ os.remove(path2 + "/Dummy.py")
61
+ if "__init__.py" in contents:
62
+ with open(path2 + "/__init__.py", "r") as f:
63
+ contents = f.read()
64
+ contents = contents.replace("from .Dummy import dummy_wiring\n", "")
65
+ contents = contents.replace("wiring.extend(dummy_wiring)\n", "")
66
+ contents = contents.replace("wiring.extend(dummy_wiring)", "")
67
+ with open(path2 + "/__init__.py", "w") as f:
68
+ f.write(contents)
69
+
70
+ if "Mechanisms" in directory_folders:
71
+ path2 = path + "/Mechanisms"
72
+ contents = os.listdir(path2)
73
+ if "Dummy.py" in contents:
74
+ os.remove(path2 + "/Dummy.py")
75
+ if "__init__.py" in contents:
76
+ with open(path2 + "/__init__.py", "r") as f:
77
+ contents = f.read()
78
+ contents = contents.replace("from .Dummy import dummy_mechanisms\n", "")
79
+ contents = contents.replace("mechanism.extend(dummy_mechanisms)\n", "")
80
+ contents = contents.replace("mechanism.extend(dummy_mechanisms)", "")
81
+ with open(path2 + "/__init__.py", "w") as f:
82
+ f.write(contents)
83
+
84
+ if "Policies" in directory_folders:
85
+ path2 = path + "/Policies"
86
+ contents = os.listdir(path2)
87
+ if "Dummy.py" in contents:
88
+ os.remove(path2 + "/Dummy.py")
89
+ if "__init__.py" in contents:
90
+ with open(path2 + "/__init__.py", "r") as f:
91
+ contents = f.read()
92
+ contents = contents.replace("from .Dummy import dummy_policies\n", "")
93
+ contents = contents.replace("policies.extend(dummy_policies)\n", "")
94
+ contents = contents.replace("policies.extend(dummy_policies)", "")
95
+ with open(path2 + "/__init__.py", "w") as f:
96
+ f.write(contents)
97
+
98
+ if "BoundaryActions" in directory_folders:
99
+ path2 = path + "/BoundaryActions"
100
+ contents = os.listdir(path2)
101
+ if "Dummy.py" in contents:
102
+ os.remove(path2 + "/Dummy.py")
103
+ if "__init__.py" in contents:
104
+ with open(path2 + "/__init__.py", "r") as f:
105
+ contents = f.read()
106
+ contents = contents.replace(
107
+ "from .Dummy import dummy_boundary_action\n", ""
108
+ )
109
+ contents = contents.replace("dummy_boundary_action,\n", "")
110
+ contents = contents.replace("dummy_boundary_action,", "")
111
+ contents = contents.replace("dummy_boundary_action", "")
112
+ with open(path2 + "/__init__.py", "w") as f:
113
+ f.write(contents)
114
+
115
+ if "ControlActions" in directory_folders:
116
+ path2 = path + "/ControlActions"
117
+ contents = os.listdir(path2)
118
+ if "Dummy.py" in contents:
119
+ os.remove(path2 + "/Dummy.py")
120
+ if "__init__.py" in contents:
121
+ with open(path2 + "/__init__.py", "r") as f:
122
+ contents = f.read()
123
+ contents = contents.replace(
124
+ "from .Dummy import dummy_control_action\n", ""
125
+ )
126
+ contents = contents.replace("dummy_control_action,\n", "")
127
+ contents = contents.replace("dummy_control_action,", "")
128
+ contents = contents.replace("dummy_control_action", "")
129
+ with open(path2 + "/__init__.py", "w") as f:
130
+ f.write(contents)
131
+ if "Entities" in directory_folders:
132
+ path2 = path + "/Entities"
133
+ contents = os.listdir(path2)
134
+ if "Dummy.py" in contents:
135
+ os.remove(path2 + "/Dummy.py")
136
+ if "__init__.py" in contents:
137
+ with open(path2 + "/__init__.py", "r") as f:
138
+ contents = f.read()
139
+ contents = contents.replace("from .Dummy import dummy_entity\n", "")
140
+ contents = contents.replace("dummy_entity, ", "")
141
+ contents = contents.replace("dummy_entity,", "")
142
+ contents = contents.replace("dummy_entity", "")
143
+ with open(path2 + "/__init__.py", "w") as f:
144
+ f.write(contents)
145
+ if "State" in directory_folders:
146
+ path2 = path + "/State"
147
+ contents = os.listdir(path2)
148
+ if "Dummy.py" in contents:
149
+ os.remove(path2 + "/Dummy.py")
150
+ if "__init__.py" in contents:
151
+ with open(path2 + "/__init__.py", "r") as f:
152
+ contents = f.read()
153
+ contents = contents.replace("from .Dummy import dummy_state\n", "")
154
+ contents = contents.replace("dummy_state, ", "")
155
+ contents = contents.replace("dummy_state,", "")
156
+ contents = contents.replace("dummy_state", "")
157
+ with open(path2 + "/__init__.py", "w") as f:
158
+ f.write(contents)
159
+
160
+ if "Parameters" in directory_folders:
161
+ path2 = path + "/Parameters"
162
+ contents = os.listdir(path2)
163
+ if "Dummy.py" in contents:
164
+ os.remove(path2 + "/Dummy.py")
165
+ if "__init__.py" in contents:
166
+ with open(path2 + "/__init__.py", "r") as f:
167
+ contents = f.read()
168
+ contents = contents.replace(
169
+ "from .Dummy import dummy_parameter_sets", ""
170
+ )
171
+ contents = contents.replace(
172
+ "parameters.extend(dummy_parameter_sets)", ""
173
+ )
174
+
175
+ with open(path2 + "/__init__.py", "w") as f:
176
+ f.write(contents)
177
+
178
+ if "Spaces" in directory_folders:
179
+ path2 = path + "/Spaces"
180
+ contents = os.listdir(path2)
181
+ if "Dummy.py" in contents:
182
+ os.remove(path2 + "/Dummy.py")
183
+ if "__init__.py" in contents:
184
+ with open(path2 + "/__init__.py", "r") as f:
185
+ contents = f.read()
186
+ contents = contents.replace("from .Dummy import dummy_spaces\n", "")
187
+ contents = contents.replace("spaces.extend(dummy_spaces)", "")
188
+
189
+ with open(path2 + "/__init__.py", "w") as f:
190
+ f.write(contents)
191
+
192
+ if "Types" in directory_folders:
193
+ path2 = path + "/Types"
194
+ contents = os.listdir(path2)
195
+ if "Dummy.py" in contents:
196
+ os.remove(path2 + "/Dummy.py")
197
+ if "__init__.py" in contents:
198
+ with open(path2 + "/__init__.py", "r") as f:
199
+ contents = f.read()
200
+ contents = contents.replace(
201
+ "from .Dummy import DummyCompoundType, DummyType1, DummyType2\n", ""
202
+ )
203
+ contents = contents.replace(
204
+ """ DummyType1,
205
+ DummyType2,
206
+ DummyCompoundType,""",
207
+ "",
208
+ )
209
+ contents = contents.replace(
210
+ """ DummyType1,
211
+ DummyType2,
212
+ DummyCompoundType""",
213
+ "",
214
+ )
215
+
216
+ with open(path2 + "/__init__.py", "w") as f:
217
+ f.write(contents)
218
+
219
+ if "TypeMappings" in directory_folders:
220
+ path2 = path + "/TypeMappings"
221
+ contents = os.listdir(path2)
222
+
223
+ if "types.py" in contents:
224
+ with open(path2 + "/types.py", "r") as f:
225
+ contents = f.read()
226
+ contents = contents.replace(
227
+ """ "DummyType1": str,
228
+ "DummyType2": int,
229
+ "DummyCompoundType": {"A": "Dummy Type 1", "B": "Dummy Type 2"},""",
230
+ "",
231
+ )
232
+
233
+ with open(path2 + "/types.py", "w") as f:
234
+ f.write(contents)
235
+
236
+ if "TypeMappings" in directory_folders:
237
+ path2 = path + "/TypeMappings"
238
+ contents = os.listdir(path2)
239
+
240
+ if "types.py" in contents:
241
+ with open(path2 + "/types.jl", "r") as f:
242
+ contents = f.read()
243
+ contents = contents.replace(
244
+ """const DummyType1 = String
245
+ const DummyType2 = Integer
246
+ struct DummyCompoundType
247
+ A::DummyType1
248
+ B::DummyType2
249
+ end""",
250
+ "",
251
+ )
252
+
253
+ with open(path2 + "/types.jl", "w") as f:
254
+ f.write(contents)
255
+
256
+ if "TypeMappings" in directory_folders:
257
+ path2 = path + "/TypeMappings"
258
+ contents = os.listdir(path2)
259
+
260
+ if "types.py" in contents:
261
+ with open(path2 + "/types.ts", "r") as f:
262
+ contents = f.read()
263
+ contents = contents.replace(
264
+ """type DummyType1 = string
265
+ type DummyType2 = number
266
+ type DummyCompoundType = {"A": DummyType1, "B": DummyType2}""",
267
+ "",
268
+ )
269
+
270
+ with open(path2 + "/types.ts", "w") as f:
271
+ f.write(contents)
@@ -18,7 +18,9 @@ def convert_parameter_set(ms, data: Dict) -> ParameterSet:
18
18
  if "metadata" not in param:
19
19
  param["metadata"] = {}
20
20
  check_json_keys(param, "Parameter")
21
- assert param["variable_type"] in ms["Types"], "Type not in ms"
21
+ assert param["variable_type"] in ms["Types"], "Type of {} not in ms".format(
22
+ param["variable_type"]
23
+ )
22
24
  param["variable_type"] = ms["Types"][param["variable_type"]]
23
25
  new_parameters.append(Parameter(param))
24
26
  data["parameters"] = new_parameters
@@ -71,7 +71,8 @@ def load_typescript_type_key(path):
71
71
  type_definitions = [x for x in type_definitions if len(x) > 0]
72
72
  hold = type_definitions[:]
73
73
  type_definitions = []
74
- type_definitions.append(hold.pop(0))
74
+ if len(hold) > 0:
75
+ type_definitions.append(hold.pop(0))
75
76
  while len(hold) > 0:
76
77
  curr = hold.pop(0)
77
78
  if "type" in curr or "interface" in curr:
@@ -585,7 +585,7 @@ def write_metrics_markdown_report(ms, path, metric, add_metadata=True):
585
585
 
586
586
  out += "## Variables Used\n"
587
587
  for i, x in enumerate(metric.variables_used):
588
- out += "{}. {}.{}".format(i + 1, x[0], x[1])
588
+ out += "{}. [[{}]].[[{}-{}|{}]]".format(i + 1, x[0], x[0], x[1], x[1])
589
589
  var = ms.state[x[0]].variable_map[x[1]]
590
590
  if var.symbol:
591
591
  out += " , symbol: {}".format(var.symbol)
@@ -26,5 +26,6 @@ from .Reports import (
26
26
  write_all_markdown_reports,
27
27
  )
28
28
  from .schema import schema
29
+ from .Convenience import remove_dummy_repo_components
29
30
 
30
31
  # from .Convenience import write_top_level_json_description
@@ -693,7 +693,8 @@
693
693
  "items": {
694
694
  "type": "integer"
695
695
  }
696
- }
696
+ },
697
+ "metadata": {"type": "object"}
697
698
  },
698
699
  "required": [
699
700
  "components",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: math-spec-mapping
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: A library for easy mapping of mathematical specifications.
5
5
  Author-email: Sean McOwen <Sean@Block.Science>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,6 +1,6 @@
1
- math_spec_mapping/__init__.py,sha256=k5KVhqX1_iIkGjTBHAHezWUeh0b3ilWpJaSIVSbKMcg,907
1
+ math_spec_mapping/__init__.py,sha256=CzT9KycdX5nuiUzDFmLXVeAIr8v8UKGbXsEQF8vjl1c,961
2
2
  math_spec_mapping/schema.py,sha256=6mrRqzEnTTSXjb19xJ63MBp0KjKH0s7i6TfT4MkAY9k,233
3
- math_spec_mapping/schema.schema.json,sha256=gvKfsWNuxnwdwtLCdQPi4GYno_QfZfRNo86ThNUckF0,29352
3
+ math_spec_mapping/schema.schema.json,sha256=5_DiubQzPo8koyx5PKFh_zIINyjtrhGWG_7N73s9b1Q,29400
4
4
  math_spec_mapping/Classes/ActionTransmissionChannel.py,sha256=zWMo5QsgPh5WGIWXl-xOrZNMXYJXmK6Vejw1dQvi0og,246
5
5
  math_spec_mapping/Classes/Block.py,sha256=hXQO221IP-TqZm_TwFKfURpEEjZm7L1TPZDCYlaOdho,17302
6
6
  math_spec_mapping/Classes/BoundaryAction.py,sha256=AOENCqCEfpjotnHhzUj_F2SOP0SGpkN1tNPr8Mtl6Tc,476
@@ -17,9 +17,9 @@ math_spec_mapping/Classes/StateUpdateTransmissionChannel.py,sha256=3hBLvD1lE64Pk
17
17
  math_spec_mapping/Classes/StatefulMetric.py,sha256=UCis1BJ7fsajHHxFF05ZiyDean2D4s4a95uYYW1Mjq4,749
18
18
  math_spec_mapping/Classes/Type.py,sha256=2KFY8d3cv1PzJJ7SSMHJf1zcfQ3ZbqxotK2KgTaLZdM,289
19
19
  math_spec_mapping/Classes/__init__.py,sha256=0zxgOqns_9JybD74HKMVh6aw8ij8WVbfQ4Q_1uWzof0,761
20
- math_spec_mapping/Convenience/__init__.py,sha256=-hNZVoaNSgTmZTiyZoMfWyg14xonC3ppz-diQk1VlUY,60
21
- math_spec_mapping/Convenience/documentation.py,sha256=Jf7-JJIk_vZkNBIGV4bs5LM3B0RVaCCtuwJ164thGfY,1607
22
- math_spec_mapping/Convenience/starter.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
+ math_spec_mapping/Convenience/__init__.py,sha256=z2W-E5Wg1CNEkDI5UqH3qIVBqp-3A1e63f3u9fA-N7w,112
21
+ math_spec_mapping/Convenience/documentation.py,sha256=1ziWVJznbCUxeAAt03nAdEYtMlXNo5TeedHfgs0vSBU,1625
22
+ math_spec_mapping/Convenience/starter.py,sha256=Pv0b5pHnv5Bxk3PkY8O9Nv62z2C_gxj5xcf8G9r4Pkw,11010
23
23
  math_spec_mapping/Load/__init__.py,sha256=_ga5nHi7U5rY5lCF36_XI9Qmybq4P8R4m5I5mmjLBk8,33
24
24
  math_spec_mapping/Load/action_transmission_channel.py,sha256=9Wer7g2s5SSOcUYuZ0PqSKUVVnW3EvGQJZNXJTwW__0,2561
25
25
  math_spec_mapping/Load/boundary_actions.py,sha256=WvEj2tqN0pUZtE4EiKUuGzMdAcWsMlLslJJeFjIu6gk,2058
@@ -31,20 +31,20 @@ math_spec_mapping/Load/implementations.py,sha256=SGKZ_YXeNpJUTnw5fajQTXji7S2bNQo
31
31
  math_spec_mapping/Load/load.py,sha256=CLprDhJpbwm9RAzKM2Ghwr8eqBu0a-wvGDOCMmc01YE,2484
32
32
  math_spec_mapping/Load/mechanism.py,sha256=JBy-QpB4W0Z2OcNiakONjD4_RtEgxlFKtLXfDqfhR-0,2037
33
33
  math_spec_mapping/Load/metrics.py,sha256=EyCFEgHpyffBPKaqISdIeTyqUtPtu2xoS0gZjh-6i3U,3434
34
- math_spec_mapping/Load/parameters.py,sha256=aid_vqYub9643s82NDtMAXLRdV9BPQkri5MadA0L0eQ,1334
34
+ math_spec_mapping/Load/parameters.py,sha256=W4utm7to3s2fo4z3XgLH0TM1agaIad1qfM2I-lLMua4,1393
35
35
  math_spec_mapping/Load/policy.py,sha256=HvlhGHGJTweVs7DOI2HSL_2_diECr8ukDUmzoFLQELo,2444
36
36
  math_spec_mapping/Load/spaces.py,sha256=7zgGA57Te7T4hfuCCDElffiidWgn1lKm5E14e1yjt8M,1116
37
37
  math_spec_mapping/Load/state_update_transmission_channels.py,sha256=FJWp5n4HdtHAfof5BUQ6BnRakljatL2h8dWCapaVSc0,2238
38
38
  math_spec_mapping/Load/stateful_metrics.py,sha256=uGSTc6x6lld5xptgSUMHrO0Vg0QDRIL14C6zTg33S8o,1977
39
39
  math_spec_mapping/Load/states.py,sha256=gAiCGxqc8_js8Gd0aRRrK4PeUW4jgZsgukR6e-5fcg4,1290
40
- math_spec_mapping/Load/type.py,sha256=wrzT3bmLn2ghvuy8hZhtQZ479HZNntKoLdIC2TcMrgw,4330
40
+ math_spec_mapping/Load/type.py,sha256=z6cBdBNjWed7cRyA0Bj7Jd5PmtemVVh07n3mWFj_5U4,4356
41
41
  math_spec_mapping/Load/wiring.py,sha256=1dR94U5N1W_WI5rL6lYBltH25ZvApB2pIpq9r5Opkug,3083
42
42
  math_spec_mapping/Reports/__init__.py,sha256=W27I6S9Ro1hWeHmnxIokCA06awB__eYey7PvKD4Hc1s,933
43
43
  math_spec_mapping/Reports/boundary_actions.py,sha256=45BPp4QjWdD-3E9ZWwqgj_nI2-YdcI2ZZ19_Qv_K7Qk,1410
44
44
  math_spec_mapping/Reports/control_actions.py,sha256=NksekZKIPFSIkubttFstKFthc5AU9B9PWRLSl9j1wWs,1216
45
45
  math_spec_mapping/Reports/general.py,sha256=WOOn6Wlb8M4fsdN49FlKLwOka6vJPQ9aCUy88TL2ki0,1610
46
46
  math_spec_mapping/Reports/html.py,sha256=tqydmwFWz_1Bg_J_avG4t9LtE-DUGbOKAPNuwg6lgRI,9007
47
- math_spec_mapping/Reports/markdown.py,sha256=r9tHxuGvmwbUy92GVoChqcs7h8pvrGMwXgogAfla4O0,22479
47
+ math_spec_mapping/Reports/markdown.py,sha256=JF4D95pocWfQFi5uFjMFewWabuo4MSlfKeoB-TUpWFk,22505
48
48
  math_spec_mapping/Reports/mechanisms.py,sha256=d2Rxt3JBYvqAOAYUynl0buYVoXEHrO8EGq7GK6hK8NA,1322
49
49
  math_spec_mapping/Reports/node_map.py,sha256=FdSMDQG16NX6n9sZcH-T5xwsvgjrV9OqBHc9J_VlNK0,3129
50
50
  math_spec_mapping/Reports/parameters.py,sha256=yizNG4lNGrgrlzYYcHMGfXKDFlPw4PMDYshDqZ3YARs,535
@@ -53,8 +53,8 @@ math_spec_mapping/Reports/spaces.py,sha256=-76hR5wQBv4lsG000ypBJ-OprjsNjI-rNRMYd
53
53
  math_spec_mapping/Reports/state.py,sha256=RkqfSonar74KVC8PpA9GgI2xaHX6BrkNdAuWMZlYQfI,2321
54
54
  math_spec_mapping/Reports/tables.py,sha256=O0CNuqh3LMECq5uLjBOoxMUk5hUvkUK660FNnwWUxDY,1505
55
55
  math_spec_mapping/Reports/wiring.py,sha256=u9SvKWy6T-WJUEgFI6-zgZanoOaTTs_2YwmEceDLsV8,1618
56
- math_spec_mapping-0.3.1.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
57
- math_spec_mapping-0.3.1.dist-info/METADATA,sha256=dhHFXSeznJ8iViRkPXM7IC0TOFEkuvSVX41dMIzpuT0,6012
58
- math_spec_mapping-0.3.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
59
- math_spec_mapping-0.3.1.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
60
- math_spec_mapping-0.3.1.dist-info/RECORD,,
56
+ math_spec_mapping-0.3.2.dist-info/LICENSE,sha256=ObyEzSw8kgCaFbEfpu1zP4TrcAKLA0xhqHMZZfyh7N0,1069
57
+ math_spec_mapping-0.3.2.dist-info/METADATA,sha256=whpL8E0F7P53HUUVAYIMsMVTOBv8oFGSok6a6IHF2BM,6012
58
+ math_spec_mapping-0.3.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
59
+ math_spec_mapping-0.3.2.dist-info/top_level.txt,sha256=AImhn9wgazkdV0a9vfiphtQR8uGe2nq-ZIOp-6yUk9o,18
60
+ math_spec_mapping-0.3.2.dist-info/RECORD,,