tricc-oo 1.5.21__py3-none-any.whl → 1.5.23__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.
Files changed (42) hide show
  1. tests/build.py +13 -23
  2. tests/test_cql.py +37 -108
  3. tests/to_ocl.py +15 -17
  4. tricc_oo/__init__.py +0 -6
  5. tricc_oo/converters/codesystem_to_ocl.py +51 -40
  6. tricc_oo/converters/cql/cqlLexer.py +1 -0
  7. tricc_oo/converters/cql/cqlListener.py +1 -0
  8. tricc_oo/converters/cql/cqlParser.py +1 -0
  9. tricc_oo/converters/cql/cqlVisitor.py +1 -0
  10. tricc_oo/converters/cql_to_operation.py +125 -123
  11. tricc_oo/converters/datadictionnary.py +39 -53
  12. tricc_oo/converters/drawio_type_map.py +143 -61
  13. tricc_oo/converters/tricc_to_xls_form.py +14 -24
  14. tricc_oo/converters/utils.py +3 -3
  15. tricc_oo/converters/xml_to_tricc.py +286 -231
  16. tricc_oo/models/__init__.py +2 -1
  17. tricc_oo/models/base.py +300 -308
  18. tricc_oo/models/calculate.py +63 -49
  19. tricc_oo/models/lang.py +26 -27
  20. tricc_oo/models/ocl.py +146 -161
  21. tricc_oo/models/ordered_set.py +15 -19
  22. tricc_oo/models/tricc.py +144 -88
  23. tricc_oo/parsers/xml.py +15 -30
  24. tricc_oo/serializers/planuml.py +4 -6
  25. tricc_oo/serializers/xls_form.py +81 -135
  26. tricc_oo/strategies/input/base_input_strategy.py +28 -32
  27. tricc_oo/strategies/input/drawio.py +57 -69
  28. tricc_oo/strategies/output/base_output_strategy.py +108 -67
  29. tricc_oo/strategies/output/spice.py +106 -127
  30. tricc_oo/strategies/output/xls_form.py +275 -200
  31. tricc_oo/strategies/output/xlsform_cdss.py +623 -142
  32. tricc_oo/strategies/output/xlsform_cht.py +114 -120
  33. tricc_oo/strategies/output/xlsform_cht_hf.py +13 -24
  34. tricc_oo/visitors/tricc.py +1191 -1021
  35. tricc_oo/visitors/utils.py +16 -16
  36. tricc_oo/visitors/xform_pd.py +91 -89
  37. {tricc_oo-1.5.21.dist-info → tricc_oo-1.5.23.dist-info}/METADATA +3 -1
  38. tricc_oo-1.5.23.dist-info/RECORD +47 -0
  39. tricc_oo-1.5.23.dist-info/licenses/LICENSE +373 -0
  40. tricc_oo-1.5.21.dist-info/RECORD +0 -46
  41. {tricc_oo-1.5.21.dist-info → tricc_oo-1.5.23.dist-info}/WHEEL +0 -0
  42. {tricc_oo-1.5.21.dist-info → tricc_oo-1.5.23.dist-info}/top_level.txt +0 -0
@@ -1,17 +1,17 @@
1
1
  PROCESSES = [
2
- "triage",
3
- "emergency-care",
4
- "registration",
5
- "history-and-physical",
6
- "local-urgent-care",
7
- "acute-tertiary-care",
8
- "diagnostic-testing",
9
- "determine-diagnosis",
10
- "provide-counseling",
11
- "dispense-medications",
12
- "monitor-and-follow-up-of-patient",
13
- "alerts-reminders-education",
14
- "discharge-referral-of-patient",
15
- "charge-for-service",
16
- "record-and-report",
17
- ]
2
+ "triage",
3
+ "emergency-care",
4
+ "registration",
5
+ "history-and-physical",
6
+ "local-urgent-care",
7
+ "acute-tertiary-care",
8
+ "diagnostic-testing",
9
+ "determine-diagnosis",
10
+ "provide-counseling",
11
+ "dispense-medications",
12
+ "monitor-and-follow-up-of-patient",
13
+ "alerts-reminders-education",
14
+ "discharge-referral-of-patient",
15
+ "charge-for-service",
16
+ "record-and-report",
17
+ ]
@@ -4,15 +4,16 @@ Created on Thu Sep 1 11:21:39 2022
4
4
 
5
5
  @author: kluera
6
6
 
7
- Make subforms that allow to be releoaded seperately as a 'task' in CHT,
8
- allowing to simulate a pause functionality.
7
+ Make subforms that allow to be releoaded seperately as a 'task' in CHT,
8
+ allowing to simulate a pause functionality.
9
9
  """
10
10
 
11
11
  import pandas as pd
12
- import json
12
+
13
13
 
14
14
  def remove_dots(s):
15
- return s.replace('.','_')
15
+ return s.replace(".", "_")
16
+
16
17
 
17
18
  def chf_clean_name(s, remove_dots=False):
18
19
  # Check if there is a dot in the string
@@ -24,159 +25,161 @@ def chf_clean_name(s, remove_dots=False):
24
25
  # If no dot is present, return None or handle it as needed
25
26
  return s
26
27
 
28
+
27
29
  # df is the dataframe to be split
28
30
  # pausepoint is the index of the row after which the form should pause
29
31
  def make_breakpoints(df, pausepoint, calculate_name=None, replace_dots=False):
30
32
  """
31
33
  Creates a dataframe for a follow-up questionnaire while preserving previous inputs.
32
-
34
+
33
35
  Args:
34
36
  df: Input dataframe containing the questionnaire
35
37
  pausepoint: Point where the questionnaire should pause
36
38
  calculate_name: Optional name for calculation fields
37
39
  """
38
-
40
+
39
41
  # Get data points collected before break
40
- if 'input end' not in df['name'].values:
42
+ if "input end" not in df["name"].values:
41
43
  raise ValueError("input end field not found in input dataframe")
42
- end_inputs_loc = df.index[df['name'] == 'input end'][0]
43
- next_begin_group_loc = min([i for i in df.index[df['type'] == 'begin group'] if i > end_inputs_loc])
44
- next_pause_point_begin_group_loc = min([i for i in df.index[df['type'] == 'begin group'] if i > pausepoint])
45
-
44
+ end_inputs_loc = df.index[df["name"] == "input end"][0]
45
+ next_begin_group_loc = min([i for i in df.index[df["type"] == "begin group"] if i > end_inputs_loc])
46
+ next_pause_point_begin_group_loc = min([i for i in df.index[df["type"] == "begin group"] if i > pausepoint])
47
+
46
48
  df_input = df.loc[next_begin_group_loc:next_pause_point_begin_group_loc]
47
-
49
+
48
50
  # Define field types to handle
49
- typesconvert = ['integer', 'decimal', 'select_', 'text']
50
- typeskeep = ['hidden', 'calculate', 'string']
51
-
51
+ typesconvert = ["integer", "decimal", "select_", "text"]
52
+ typeskeep = ["hidden", "calculate", "string"]
53
+
52
54
  # Create masks for filtering
53
- type_mask = df_input['type'].str.contains('|'.join(typeskeep + typesconvert))
54
- optin_mask = ~df_input['name'].str.contains('more_info_optin', na=False)
55
-
55
+ type_mask = df_input["type"].str.contains("|".join(typeskeep + typesconvert))
56
+ optin_mask = ~df_input["name"].str.contains("more_info_optin", na=False)
57
+
56
58
  # Filter dataframe keeping important fields
57
59
  df_input = df_input.loc[type_mask & optin_mask]
58
-
60
+
59
61
  # Preserve existing hidden fields and their calculations
60
- existing_hidden = df_input[df_input['type'] == 'hidden'].copy()
61
-
62
+ existing_hidden = df_input[df_input["type"] == "hidden"].copy()
63
+
62
64
  # Convert specified types to hidden while preserving their data
63
- mask_indices = df_input.index[df_input['type'].str.contains('|'.join(typesconvert))]
65
+ mask_indices = df_input.index[df_input["type"].str.contains("|".join(typesconvert))]
64
66
  # Get hidden field names
65
67
 
66
- df_input.loc[mask_indices, 'type'] = 'hidden'
67
- df_input.loc[mask_indices, 'appearance'] = 'hidden'
68
+ df_input.loc[mask_indices, "type"] = "hidden"
69
+ df_input.loc[mask_indices, "appearance"] = "hidden"
68
70
 
69
71
  # Handle label columns while preserving existing labels where needed
70
- label_cols = [col for col in df.columns if 'label' in col]
71
- df_input.loc[mask_indices, label_cols] = 'NO_LABEL'
72
-
72
+ label_cols = [col for col in df.columns if "label" in col]
73
+ df_input.loc[mask_indices, label_cols] = "NO_LABEL"
74
+
73
75
  # Clear non-essential columns while preserving crucial data
74
- essential_cols = ['name', 'type', 'calculation'] + label_cols
76
+ essential_cols = ["name", "type", "calculation"] + label_cols
75
77
  other_cols = df_input.columns.drop(essential_cols)
76
- df_input[other_cols] = ''
77
-
78
+ df_input[other_cols] = ""
79
+
78
80
  # Preserve calculations for existing hidden fields
79
- df_input.update(existing_hidden[['calculation']])
81
+ df_input.update(existing_hidden[["calculation"]])
80
82
  # SAVE THE INPUT NAMES
81
- hidden_names = list(df_input.loc[df_input['type']=='hidden', 'name'])
83
+ hidden_names = list(df_input.loc[df_input["type"] == "hidden", "name"])
82
84
  if replace_dots:
83
- df_input['name'] = df_input['name'].map(remove_dots)
85
+ df_input["name"] = df_input["name"].map(remove_dots)
84
86
  # Handle indexing and grouping
85
87
  df_input.index = df_input.index.map(str)
86
- hidden_ids = df_input.loc[df_input['type']=='hidden'].index
87
- inputs_group_index = '0'
88
- new_hidden_ids = inputs_group_index + '.' + hidden_ids
89
-
88
+ hidden_ids = df_input.loc[df_input["type"] == "hidden"].index
89
+ inputs_group_index = "0"
90
+ new_hidden_ids = inputs_group_index + "." + hidden_ids
91
+
90
92
  # Update indices
91
93
  index_map = dict(zip(hidden_ids, new_hidden_ids))
92
94
  df_input.rename(index=index_map, inplace=True)
93
95
  df_input.sort_index(inplace=True)
94
96
  df_input.reset_index(drop=True, inplace=True)
95
-
97
+
96
98
  if remove_dots:
97
99
  # Precompute replacement dictionary
98
- replacement_dict = {f'${old_name}': f'${remove_dots(old_name)}' for old_name in hidden_names if '.' in old_name}
100
+ replacement_dict = {f"${old_name}": f"${remove_dots(old_name)}" for old_name in hidden_names if "." in old_name}
99
101
 
100
102
  # Apply replacements to entire DataFrame
101
103
  df_input = df_input.astype(str).replace(replacement_dict, regex=False)
102
-
103
104
 
104
-
105
-
106
-
107
- # put all together
108
- if 'data_load' not in df['name'].values:
105
+ # put all together
106
+ if "data_load" not in df["name"].values:
109
107
  raise ValueError("data_load field not found in input dataframe")
110
- data_load_loc = df.index[df['name'] == 'data_load'][0]
111
-
108
+ data_load_loc = df.index[df["name"] == "data_load"][0]
109
+
112
110
  # Split the dataframe into three parts
113
111
  df_before_data_load = df.loc[:data_load_loc] # Everything up to data_load
114
- df_until_begin_group = df.loc[data_load_loc+1:next_begin_group_loc-1] # From data_load to next begin_group
115
-
112
+ df_until_begin_group = df.loc[data_load_loc + 1: next_begin_group_loc - 1] # From data_load to next begin_group
113
+
116
114
  # Reset indices for proper concatenation
117
115
  df_input = df_input.reset_index(drop=True)
118
116
  df_before_data_load = df_before_data_load.reset_index(drop=True)
119
117
  df_until_begin_group = df_until_begin_group.reset_index(drop=True)
120
-
118
+
121
119
  # Concatenate in the correct order
122
- df_combined = pd.concat([
123
- df_before_data_load, # First part until data_load
124
- df_input, # Injected converted fields
125
- df_until_begin_group # Remaining part until next begin_group
126
- ]).reset_index(drop=True)
127
-
120
+ df_combined = pd.concat(
121
+ [
122
+ df_before_data_load, # First part until data_load
123
+ df_input, # Injected converted fields
124
+ df_until_begin_group, # Remaining part until next begin_group
125
+ ]
126
+ ).reset_index(drop=True)
127
+
128
128
  # Handle post-break section
129
129
  df_after = df.loc[next_pause_point_begin_group_loc:].reset_index(drop=True)
130
130
 
131
-
132
131
  # Final concatenation
133
132
  final_df = pd.concat([df_combined, df_after])
134
133
  if calculate_name:
135
- final_df.loc[final_df['name']=='hidden','calculation']='0'
136
-
137
- final_df.fillna('', inplace=True)
134
+ final_df.loc[final_df["name"] == "hidden", "calculation"] = "0"
135
+
136
+ final_df.fillna("", inplace=True)
138
137
  final_df.reset_index(inplace=True, drop=True)
139
-
140
- return final_df, hidden_names
141
138
 
139
+ return final_df, hidden_names
142
140
 
143
141
 
144
142
  def get_tasksstrings(hidden_names, df_survey):
145
- '''This function makes a list of strings of hidden fields that will be loaded into a form that continues the consultation.
146
- This is very handy as this string must be pasted into the tasks.js file in CHT.
143
+ """This function makes a list of strings of hidden fields that will be loaded
144
+ into a form that continues the consultation.
145
+ This is very handy as this string must be pasted into the tasks.js file in CHT.
147
146
  @hidden_names: are the names of the 'hidden' fields in the input group of the follow up form
148
147
  @df_survey: is the survey tab of the complete (original) form without breaks, going from A to Z
149
- @tasks_strings: is the string that has to be pasted into tasks.js'''
150
-
148
+ @tasks_strings: is the string that has to be pasted into tasks.js"""
149
+
151
150
  task_string_template = "content['{variableName}'] = getField(report, '{full_path}')"
152
151
  task_strings = {}
153
152
  for s in hidden_names:
154
- df_above_s = df_survey.iloc[:df_survey.loc[df_survey['name']==s].index[0]]
155
- df_above_s_groups = df_above_s.loc[df_above_s['type'].isin(['begin group', 'end group'])]
153
+ df_above_s = df_survey.iloc[: df_survey.loc[df_survey["name"] == s].index[0]]
154
+ df_above_s_groups = df_above_s.loc[df_above_s["type"].isin(["begin group", "end group"])]
156
155
  above_s_grouprows = df_above_s_groups.index
157
156
  fullpath = []
158
157
  for i in above_s_grouprows:
159
- if df_above_s.iloc[i]['type']=='begin group':
160
- fullpath.append(df_above_s.iloc[i]['name'])
161
- else:
158
+ if df_above_s.iloc[i]["type"] == "begin group":
159
+ fullpath.append(df_above_s.iloc[i]["name"])
160
+ else:
162
161
  fullpath = fullpath[:-1]
163
- if len(fullpath)>0:
164
- line = task_string_template.format(
165
- variableName=s, full_path='.'.join(fullpath) + chf_clean_name(s)
166
- )
162
+ if len(fullpath) > 0:
163
+ line = task_string_template.format(variableName=s, full_path=".".join(fullpath) + chf_clean_name(s))
167
164
  else:
168
- line = task_string_template.format(
169
- variableName=s, full_path=chf_clean_name(s)
170
- )
171
- task_strings[s]=line
172
- return list(task_strings.values())
173
-
174
-
175
- def get_task_js(form_id, calculate_name, title, form_types, hidden_names, df_survey, repalce_dots=False, task_title="'id: '+getField(report, 'g_registration.p_id')+'; age: '+getField(report, 'p_age')+getField(report, 'g_registration.p_gender')+' months; '+getField(report, 'p_weight') + 'kg; ' + getField(report, 'g_fever.p_temp')+'°'"):
165
+ line = task_string_template.format(variableName=s, full_path=chf_clean_name(s))
166
+ task_strings[s] = line
167
+ return list(task_strings.values())
168
+
169
+
170
+ def get_task_js(
171
+ form_id,
172
+ calculate_name,
173
+ title,
174
+ form_types,
175
+ hidden_names,
176
+ df_survey,
177
+ repalce_dots=False,
178
+ task_title="id: '+getField(report, 'g_registration.p_id')+';age: '+getField(report, 'p_age')+getField(report, 'g_registration.p_gender')+' months; '+getField(report, 'p_weight') + 'kg; ' + getField(report, 'g_fever.p_temp')+'°'", # noqa: E501
179
+ ):
176
180
  task_name = f"{form_id}"
177
181
  task_name_upper = task_name.upper()
178
182
 
179
-
180
183
  return f"""
181
184
  /* eslint-disable no-use-before-define */
182
185
  /* eslint-disable */
@@ -185,7 +188,7 @@ const {{injectDataFromForm, isFormArrayHasSourceId}} = require('./stph-extras');
185
188
  const {{getField}} = require("./nools-extras");
186
189
 
187
190
  const CASE_DATA = ['{"','".join(hidden_names)}'];
188
-
191
+
189
192
 
190
193
  const {task_name_upper}_FORMS = ['{"','".join(form_types)}'];
191
194
 
@@ -195,7 +198,7 @@ const {task_name_upper}_TASK_FORM = '{form_id}';
195
198
 
196
199
  const {task_name}Content = function (content, contact, report){{
197
200
 
198
- injectDataFromForm(content, '', CASE_DATA, {task_name_upper}_FORMS, [report], {'true' if repalce_dots else 'false'});
201
+ injectDataFromForm(content, '', CASE_DATA, {task_name_upper}_FORMS, [report], {'true' if repalce_dots else 'false'});
199
202
  content['patient_id'] = report.contact._id;
200
203
  content['source_id'] = report._id;
201
204
  console.log(content);
@@ -230,7 +233,7 @@ module.exports = {{
230
233
  {task_name}ResolveIf,
231
234
  {task_name}AppliesIf,
232
235
  }}
233
- //
236
+ //
234
237
  //// to be copied in task
235
238
  //
236
239
  //const {{
@@ -238,7 +241,7 @@ module.exports = {{
238
241
  // {task_name_upper}_FORMS,
239
242
  // {task_name}Content,
240
243
  // {task_name}ContactLabel,
241
- // {task_name}ResolveIf,
244
+ // {task_name}ResolveIf,
242
245
  // {task_name}AppliesIf, }} = require('./{task_name}');
243
246
  //
244
247
  //module.exports = [
@@ -270,4 +273,3 @@ module.exports = {{
270
273
  // }}
271
274
  //];
272
275
  """
273
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tricc-oo
3
- Version: 1.5.21
3
+ Version: 1.5.23
4
4
  Summary: Python library that converts CDSS L2 in L3
5
5
  Project-URL: Homepage, https://github.com/SwissTPH/tricc
6
6
  Project-URL: Issues, https://github.com/SwissTPH/tricc/issues
@@ -9,6 +9,7 @@ Classifier: Programming Language :: Python :: 3
9
9
  Classifier: Operating System :: OS Independent
10
10
  Requires-Python: >=3.8
11
11
  Description-Content-Type: text/markdown
12
+ License-File: LICENSE
12
13
  Requires-Dist: lxml
13
14
  Requires-Dist: markdownify
14
15
  Requires-Dist: pydantic
@@ -23,6 +24,7 @@ Requires-Dist: antlr4-python3-runtime==4.13.2
23
24
  Requires-Dist: antlr4-tools==0.2.1
24
25
  Requires-Dist: beautifulsoup4
25
26
  Requires-Dist: ocldev
27
+ Dynamic: license-file
26
28
 
27
29
  # design rules tricc_oo
28
30
 
@@ -0,0 +1,47 @@
1
+ tests/build.py,sha256=cfIjHza30cHlIByMxPWR-1-47UdqUDkSHf5YxzUfP6Q,6366
2
+ tests/test_cql.py,sha256=R6rLrkw4587vvR38XwI3XnuTTYI1ft1XNmBPCxyOif4,5252
3
+ tests/to_ocl.py,sha256=4e-i65K3UM6wHgdVcrZcM9AyL1bahIsXJiZTXhhHgQk,2048
4
+ tricc_oo/__init__.py,sha256=oWCE1ubmC_6iqaWOMgTei4eXVQgV202Ia-tXS1NnW_4,139
5
+ tricc_oo/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ tricc_oo/converters/codesystem_to_ocl.py,sha256=Fh7Vk73OsxljZKu1k6H9uzYwz334tpQTMZBjWWbamYE,6151
7
+ tricc_oo/converters/cql_to_operation.py,sha256=PUyV_YpUY98Ox0H_F_CN3UUf_I-BhFZVOcWWKTtwecM,14492
8
+ tricc_oo/converters/datadictionnary.py,sha256=I_1P3ws-8MmGLjiwbLtPG4m1h-uuLSvO46TlHMRukx4,3465
9
+ tricc_oo/converters/drawio_type_map.py,sha256=UCPiGs7Lw0bigKScmZUnmOhACBz-FiDq92jHkI7RTSQ,9113
10
+ tricc_oo/converters/tricc_to_xls_form.py,sha256=NwBOBy_tuEWd6d0ig9XzIm84dGDmRj-bATPB_D7HcHQ,1999
11
+ tricc_oo/converters/utils.py,sha256=Lc9oOgkuiAHA95rb9s-RCbguhPfkinNcsuwQ1cxKvSc,1675
12
+ tricc_oo/converters/xml_to_tricc.py,sha256=cDoLTwIMHIqyyNqZGwQte9YdX4y5j1Ac6r7M-zuKWZc,39403
13
+ tricc_oo/converters/cql/cqlLexer.py,sha256=8HArbRphcrpnAG4uogJ2rHv4tc1WLzjN0B1uFeYILAc,49141
14
+ tricc_oo/converters/cql/cqlListener.py,sha256=fA7-8DcS2Q69ckwjdg57-OfFHBxjTZFdoSKrtw7Hffc,57538
15
+ tricc_oo/converters/cql/cqlParser.py,sha256=x3KdrwX9nwENSEJ5Ex7_l5NMnu3kWBO0uLdYu4moTq0,414745
16
+ tricc_oo/converters/cql/cqlVisitor.py,sha256=iHuup2S7OGSVWLEcI4H3oecRqgXztC1sKnew_1P2iGY,33880
17
+ tricc_oo/models/__init__.py,sha256=CgS52LLqdDIaXHvZy08hhu_VaYw80OEdfL_llM9ICBA,108
18
+ tricc_oo/models/base.py,sha256=4mkAYAfvtdnTiLpUrttqQgIgfw1q_GkEgbVDKP8Txno,25849
19
+ tricc_oo/models/calculate.py,sha256=uNP0IDUqPQcJq9Co05H8eX5wbR_DikSxuOHxfVE5Dxg,8018
20
+ tricc_oo/models/lang.py,sha256=ZMRwdoPWe01wEDhOM0uRk-6rt3BkoAAZM8mZ61--s3A,2265
21
+ tricc_oo/models/ocl.py,sha256=MybSeB6fgCOUVJ4aektff0vrrTZsyfwZ2Gt_pPBu_FY,8728
22
+ tricc_oo/models/ordered_set.py,sha256=BpXLW8plRAy4te25PIUPvVXPnLPcypvKg3iNPhtPulA,3833
23
+ tricc_oo/models/tricc.py,sha256=I5870ekIFZ2XM57_PvdBF21Ot_cOR-MyBgnxInTaDNk,17419
24
+ tricc_oo/parsers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
25
+ tricc_oo/parsers/xml.py,sha256=uzkb1y18MHfqVFmZqVh0sKT4cx6u0-NcAT_lV_gHBt8,4208
26
+ tricc_oo/serializers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ tricc_oo/serializers/planuml.py,sha256=t57587-6L3aDncpHh58lS77Zft8yxDE9DPtXx2BeUSU,132
28
+ tricc_oo/serializers/xls_form.py,sha256=iPF-Is8EAGkgwi-I_1Opxr59KM1mhw0kihO9b2KY3U4,21750
29
+ tricc_oo/strategies/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ tricc_oo/strategies/input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ tricc_oo/strategies/input/base_input_strategy.py,sha256=BEODXS74na1QRRcJVQ4cxiD8F7uRqaLyhE3QzKpGVvk,3891
32
+ tricc_oo/strategies/input/drawio.py,sha256=qzMU-6ryUiqUpv2-HosEd5hS7UvkTVZM4zD_wAVmoBg,12773
33
+ tricc_oo/strategies/output/base_output_strategy.py,sha256=-EzrC_2xwz4beMdnGLcA_435bx_yT9-N-d5AKiJCqjE,7558
34
+ tricc_oo/strategies/output/spice.py,sha256=QMeoismVC3PdbvwTK0PtUjWX9jl9780fbQIXn76fMXw,10761
35
+ tricc_oo/strategies/output/xls_form.py,sha256=ZtzOJ5-9JgGJmr807zke6nPiM9Wqqo1r8krBqJnPFlk,32590
36
+ tricc_oo/strategies/output/xlsform_cdss.py,sha256=X00Lt5MzV8TX14dR4dFI1MqllI5S1e13bKbeysWM9uA,17435
37
+ tricc_oo/strategies/output/xlsform_cht.py,sha256=JZbVCdJbwoZpLRB_9rIl0DiwxEcx_Pe70eSMoSURNiQ,23096
38
+ tricc_oo/strategies/output/xlsform_cht_hf.py,sha256=xm6SKirV3nMZvM2w54_zJcXAeAgAkq-EEqGEjnOWv6c,988
39
+ tricc_oo/visitors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
+ tricc_oo/visitors/tricc.py,sha256=TnXWKeU8vmOvw63SXAMH_SEGOo79MrWARLNRLNkJoDc,102180
41
+ tricc_oo/visitors/utils.py,sha256=j83aAq5s5atXi3OC0jc_uJd54a8XrHHmizeeEbWZQJg,421
42
+ tricc_oo/visitors/xform_pd.py,sha256=ryAnI3V9x3eTmJ2LNsUZfvl0_yfCqo6oBgeSu-WPqaE,9613
43
+ tricc_oo-1.5.23.dist-info/licenses/LICENSE,sha256=Pz2eACSxkhsGfW9_iN60pgy-enjnbGTj8df8O3ebnQQ,16726
44
+ tricc_oo-1.5.23.dist-info/METADATA,sha256=K4UFDbnNBdPgUHwzpCLPRJCdnBMSizMsD3eOcAer1d0,7922
45
+ tricc_oo-1.5.23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
+ tricc_oo-1.5.23.dist-info/top_level.txt,sha256=NvbfMNAiy9m4b1unBsqpeOQWh4IgA1Xa33BtKA4abxk,15
47
+ tricc_oo-1.5.23.dist-info/RECORD,,