arctrl 3.0.0a3__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 (456) hide show
  1. arctrl/__init__.py +18 -0
  2. arctrl/py/CWL/__init__.py +0 -0
  3. arctrl/py/CWL/cwltypes.py +150 -0
  4. arctrl/py/CWL/decode.py +973 -0
  5. arctrl/py/CWL/encode.py +1 -0
  6. arctrl/py/CWL/inputs.py +88 -0
  7. arctrl/py/CWL/outputs.py +85 -0
  8. arctrl/py/CWL/requirements.py +77 -0
  9. arctrl/py/CWL/tool_description.py +103 -0
  10. arctrl/py/CWL/workflow_description.py +104 -0
  11. arctrl/py/CWL/workflow_steps.py +113 -0
  12. arctrl/py/Contract/__init__.py +0 -0
  13. arctrl/py/Contract/arc.py +60 -0
  14. arctrl/py/Contract/arc_assay.py +125 -0
  15. arctrl/py/Contract/arc_investigation.py +88 -0
  16. arctrl/py/Contract/arc_run.py +125 -0
  17. arctrl/py/Contract/arc_study.py +126 -0
  18. arctrl/py/Contract/arc_workflow.py +125 -0
  19. arctrl/py/Contract/contract.py +153 -0
  20. arctrl/py/Contract/datamap.py +372 -0
  21. arctrl/py/Contract/git.py +118 -0
  22. arctrl/py/Contract/validation_packages_config.py +107 -0
  23. arctrl/py/ContractIO/__init__.py +0 -0
  24. arctrl/py/ContractIO/contract_io.py +344 -0
  25. arctrl/py/ContractIO/file_system_helper.py +264 -0
  26. arctrl/py/Core/Helper/__init__.py +0 -0
  27. arctrl/py/Core/Helper/collections_.py +438 -0
  28. arctrl/py/Core/Helper/date_time.py +26 -0
  29. arctrl/py/Core/Helper/hash_codes.py +60 -0
  30. arctrl/py/Core/Helper/identifier.py +248 -0
  31. arctrl/py/Core/Helper/orcid.py +42 -0
  32. arctrl/py/Core/Helper/printer.py +13 -0
  33. arctrl/py/Core/Helper/regex.py +554 -0
  34. arctrl/py/Core/Helper/sem_ver.py +71 -0
  35. arctrl/py/Core/Helper/url.py +148 -0
  36. arctrl/py/Core/Process/__init__.py +0 -0
  37. arctrl/py/Core/Process/column_index.py +280 -0
  38. arctrl/py/Core/Process/component.py +200 -0
  39. arctrl/py/Core/Process/factor.py +151 -0
  40. arctrl/py/Core/Process/factor_value.py +182 -0
  41. arctrl/py/Core/Process/material.py +74 -0
  42. arctrl/py/Core/Process/material_attribute.py +95 -0
  43. arctrl/py/Core/Process/material_attribute_value.py +184 -0
  44. arctrl/py/Core/Process/material_type.py +45 -0
  45. arctrl/py/Core/Process/process.py +477 -0
  46. arctrl/py/Core/Process/process_input.py +265 -0
  47. arctrl/py/Core/Process/process_output.py +235 -0
  48. arctrl/py/Core/Process/process_parameter_value.py +200 -0
  49. arctrl/py/Core/Process/process_sequence.py +435 -0
  50. arctrl/py/Core/Process/protocol.py +175 -0
  51. arctrl/py/Core/Process/protocol_parameter.py +98 -0
  52. arctrl/py/Core/Process/sample.py +82 -0
  53. arctrl/py/Core/Process/source.py +62 -0
  54. arctrl/py/Core/Table/__init__.py +0 -0
  55. arctrl/py/Core/Table/arc_table.py +1264 -0
  56. arctrl/py/Core/Table/arc_table_aux.py +575 -0
  57. arctrl/py/Core/Table/arc_tables.py +591 -0
  58. arctrl/py/Core/Table/composite_cell.py +319 -0
  59. arctrl/py/Core/Table/composite_column.py +73 -0
  60. arctrl/py/Core/Table/composite_header.py +739 -0
  61. arctrl/py/Core/__init__.py +0 -0
  62. arctrl/py/Core/arc_types.py +5064 -0
  63. arctrl/py/Core/comment.py +128 -0
  64. arctrl/py/Core/comment_list.py +127 -0
  65. arctrl/py/Core/conversion.py +1313 -0
  66. arctrl/py/Core/data.py +245 -0
  67. arctrl/py/Core/data_context.py +157 -0
  68. arctrl/py/Core/data_file.py +112 -0
  69. arctrl/py/Core/data_map.py +225 -0
  70. arctrl/py/Core/identifier_setters.py +31 -0
  71. arctrl/py/Core/iproperty_value.py +36 -0
  72. arctrl/py/Core/ontology_annotation.py +299 -0
  73. arctrl/py/Core/ontology_source_reference.py +114 -0
  74. arctrl/py/Core/person.py +259 -0
  75. arctrl/py/Core/publication.py +161 -0
  76. arctrl/py/Core/template.py +231 -0
  77. arctrl/py/Core/templates.py +148 -0
  78. arctrl/py/Core/uri.py +11 -0
  79. arctrl/py/Core/value.py +188 -0
  80. arctrl/py/FileSystem/__init__.py +0 -0
  81. arctrl/py/FileSystem/commit.py +21 -0
  82. arctrl/py/FileSystem/default_gitattributes.py +5 -0
  83. arctrl/py/FileSystem/default_gitignore.py +5 -0
  84. arctrl/py/FileSystem/file_system.py +58 -0
  85. arctrl/py/FileSystem/file_system_tree.py +426 -0
  86. arctrl/py/FileSystem/path.py +64 -0
  87. arctrl/py/Json/DataMap/__init__.py +0 -0
  88. arctrl/py/Json/DataMap/data_context.py +101 -0
  89. arctrl/py/Json/DataMap/data_map.py +53 -0
  90. arctrl/py/Json/Process/__init__.py +0 -0
  91. arctrl/py/Json/Process/assay_materials.py +46 -0
  92. arctrl/py/Json/Process/component.py +79 -0
  93. arctrl/py/Json/Process/factor.py +107 -0
  94. arctrl/py/Json/Process/factor_value.py +101 -0
  95. arctrl/py/Json/Process/material.py +226 -0
  96. arctrl/py/Json/Process/material_attribute.py +79 -0
  97. arctrl/py/Json/Process/material_attribute_value.py +101 -0
  98. arctrl/py/Json/Process/material_type.py +53 -0
  99. arctrl/py/Json/Process/process.py +296 -0
  100. arctrl/py/Json/Process/process_input.py +83 -0
  101. arctrl/py/Json/Process/process_output.py +67 -0
  102. arctrl/py/Json/Process/process_parameter_value.py +81 -0
  103. arctrl/py/Json/Process/protocol.py +354 -0
  104. arctrl/py/Json/Process/protocol_parameter.py +79 -0
  105. arctrl/py/Json/Process/sample.py +277 -0
  106. arctrl/py/Json/Process/source.py +214 -0
  107. arctrl/py/Json/Process/study_materials.py +52 -0
  108. arctrl/py/Json/Process/value.py +56 -0
  109. arctrl/py/Json/ROCrate/__init__.py +0 -0
  110. arctrl/py/Json/ROCrate/ldcontext.py +133 -0
  111. arctrl/py/Json/ROCrate/ldgraph.py +111 -0
  112. arctrl/py/Json/ROCrate/ldnode.py +290 -0
  113. arctrl/py/Json/ROCrate/ldref.py +44 -0
  114. arctrl/py/Json/ROCrate/ldvalue.py +102 -0
  115. arctrl/py/Json/Table/__init__.py +0 -0
  116. arctrl/py/Json/Table/arc_table.py +393 -0
  117. arctrl/py/Json/Table/cell_table.py +83 -0
  118. arctrl/py/Json/Table/composite_cell.py +136 -0
  119. arctrl/py/Json/Table/composite_header.py +67 -0
  120. arctrl/py/Json/Table/iotype.py +24 -0
  121. arctrl/py/Json/Table/oatable.py +82 -0
  122. arctrl/py/Json/Table/templates.py +281 -0
  123. arctrl/py/Json/__init__.py +0 -0
  124. arctrl/py/Json/assay.py +600 -0
  125. arctrl/py/Json/comment.py +206 -0
  126. arctrl/py/Json/context/rocrate/__init__.py +0 -0
  127. arctrl/py/Json/context/rocrate/isa_assay_context.py +101 -0
  128. arctrl/py/Json/context/rocrate/isa_comment_context.py +60 -0
  129. arctrl/py/Json/context/rocrate/isa_component_context.py +77 -0
  130. arctrl/py/Json/context/rocrate/isa_data_context.py +74 -0
  131. arctrl/py/Json/context/rocrate/isa_factor_context.py +74 -0
  132. arctrl/py/Json/context/rocrate/isa_factor_value_context.py +84 -0
  133. arctrl/py/Json/context/rocrate/isa_investigation_context.py +110 -0
  134. arctrl/py/Json/context/rocrate/isa_material_attribute_context.py +64 -0
  135. arctrl/py/Json/context/rocrate/isa_material_attribute_value_context.py +80 -0
  136. arctrl/py/Json/context/rocrate/isa_material_context.py +71 -0
  137. arctrl/py/Json/context/rocrate/isa_ontology_annotation_context.py +68 -0
  138. arctrl/py/Json/context/rocrate/isa_ontology_source_reference_context.py +75 -0
  139. arctrl/py/Json/context/rocrate/isa_organization_context.py +55 -0
  140. arctrl/py/Json/context/rocrate/isa_person_context.py +131 -0
  141. arctrl/py/Json/context/rocrate/isa_process_context.py +94 -0
  142. arctrl/py/Json/context/rocrate/isa_process_parameter_value_context.py +80 -0
  143. arctrl/py/Json/context/rocrate/isa_protocol_context.py +97 -0
  144. arctrl/py/Json/context/rocrate/isa_protocol_parameter_context.py +64 -0
  145. arctrl/py/Json/context/rocrate/isa_publication_context.py +78 -0
  146. arctrl/py/Json/context/rocrate/isa_sample_context.py +65 -0
  147. arctrl/py/Json/context/rocrate/isa_source_context.py +66 -0
  148. arctrl/py/Json/context/rocrate/isa_study_context.py +125 -0
  149. arctrl/py/Json/context/rocrate/property_value_context.py +73 -0
  150. arctrl/py/Json/context/rocrate/rocrate_context.py +81 -0
  151. arctrl/py/Json/converter_options.py +23 -0
  152. arctrl/py/Json/data.py +356 -0
  153. arctrl/py/Json/data_file.py +63 -0
  154. arctrl/py/Json/decode.py +155 -0
  155. arctrl/py/Json/encode.py +92 -0
  156. arctrl/py/Json/idtable.py +44 -0
  157. arctrl/py/Json/investigation.py +695 -0
  158. arctrl/py/Json/ontology_annotation.py +404 -0
  159. arctrl/py/Json/ontology_source_reference.py +255 -0
  160. arctrl/py/Json/person.py +658 -0
  161. arctrl/py/Json/property_value.py +359 -0
  162. arctrl/py/Json/publication.py +279 -0
  163. arctrl/py/Json/string_table.py +76 -0
  164. arctrl/py/Json/study.py +793 -0
  165. arctrl/py/JsonIO/DataMap/__init__.py +0 -0
  166. arctrl/py/JsonIO/DataMap/data_map.py +53 -0
  167. arctrl/py/JsonIO/Process/__init__.py +0 -0
  168. arctrl/py/JsonIO/Process/component.py +60 -0
  169. arctrl/py/JsonIO/Process/factor.py +36 -0
  170. arctrl/py/JsonIO/Process/factor_value.py +38 -0
  171. arctrl/py/JsonIO/Process/material.py +60 -0
  172. arctrl/py/JsonIO/Process/material_attribute.py +38 -0
  173. arctrl/py/JsonIO/Process/material_attribute_value.py +60 -0
  174. arctrl/py/JsonIO/Process/material_type.py +36 -0
  175. arctrl/py/JsonIO/Process/process.py +60 -0
  176. arctrl/py/JsonIO/Process/process_input.py +38 -0
  177. arctrl/py/JsonIO/Process/process_output.py +60 -0
  178. arctrl/py/JsonIO/Process/process_parameter_value.py +60 -0
  179. arctrl/py/JsonIO/Process/process_sequence.py +71 -0
  180. arctrl/py/JsonIO/Process/protocol.py +60 -0
  181. arctrl/py/JsonIO/Process/protocol_parameter.py +36 -0
  182. arctrl/py/JsonIO/Process/sample.py +60 -0
  183. arctrl/py/JsonIO/Process/source.py +60 -0
  184. arctrl/py/JsonIO/Process/study_materials.py +52 -0
  185. arctrl/py/JsonIO/Process/value.py +32 -0
  186. arctrl/py/JsonIO/Table/__init__.py +0 -0
  187. arctrl/py/JsonIO/Table/arc_table.py +121 -0
  188. arctrl/py/JsonIO/Table/composite_cell.py +36 -0
  189. arctrl/py/JsonIO/Table/composite_header.py +36 -0
  190. arctrl/py/JsonIO/Table/compression.py +85 -0
  191. arctrl/py/JsonIO/Table/iotype.py +36 -0
  192. arctrl/py/JsonIO/Table/templates.py +113 -0
  193. arctrl/py/JsonIO/__init__.py +0 -0
  194. arctrl/py/JsonIO/assay.py +113 -0
  195. arctrl/py/JsonIO/comment.py +80 -0
  196. arctrl/py/JsonIO/data.py +60 -0
  197. arctrl/py/JsonIO/data_file.py +58 -0
  198. arctrl/py/JsonIO/decode.py +9 -0
  199. arctrl/py/JsonIO/encode.py +1 -0
  200. arctrl/py/JsonIO/investigation.py +113 -0
  201. arctrl/py/JsonIO/ldobject.py +106 -0
  202. arctrl/py/JsonIO/ontology_annotation.py +80 -0
  203. arctrl/py/JsonIO/ontology_source_reference.py +80 -0
  204. arctrl/py/JsonIO/person.py +82 -0
  205. arctrl/py/JsonIO/publication.py +82 -0
  206. arctrl/py/JsonIO/study.py +114 -0
  207. arctrl/py/ROCrate/Generic/__init__.py +0 -0
  208. arctrl/py/ROCrate/Generic/comment.py +131 -0
  209. arctrl/py/ROCrate/Generic/dataset.py +817 -0
  210. arctrl/py/ROCrate/Generic/defined_term.py +131 -0
  211. arctrl/py/ROCrate/Generic/file.py +237 -0
  212. arctrl/py/ROCrate/Generic/lab_process.py +324 -0
  213. arctrl/py/ROCrate/Generic/lab_protocol.py +338 -0
  214. arctrl/py/ROCrate/Generic/organization.py +83 -0
  215. arctrl/py/ROCrate/Generic/person.py +484 -0
  216. arctrl/py/ROCrate/Generic/postal_address.py +195 -0
  217. arctrl/py/ROCrate/Generic/property_value.py +696 -0
  218. arctrl/py/ROCrate/Generic/sample.py +202 -0
  219. arctrl/py/ROCrate/Generic/scholarly_article.py +229 -0
  220. arctrl/py/ROCrate/ISAProfile/__init__.py +0 -0
  221. arctrl/py/ROCrate/ISAProfile/assay.py +70 -0
  222. arctrl/py/ROCrate/ISAProfile/data.py +65 -0
  223. arctrl/py/ROCrate/ISAProfile/dataset.py +24 -0
  224. arctrl/py/ROCrate/ISAProfile/investigation.py +73 -0
  225. arctrl/py/ROCrate/ISAProfile/lab_process.py +162 -0
  226. arctrl/py/ROCrate/ISAProfile/lab_protocol.py +37 -0
  227. arctrl/py/ROCrate/ISAProfile/person.py +72 -0
  228. arctrl/py/ROCrate/ISAProfile/property_value.py +98 -0
  229. arctrl/py/ROCrate/ISAProfile/sample.py +64 -0
  230. arctrl/py/ROCrate/ISAProfile/scholarly_article.py +98 -0
  231. arctrl/py/ROCrate/ISAProfile/study.py +74 -0
  232. arctrl/py/ROCrate/__init__.py +0 -0
  233. arctrl/py/ROCrate/arc_rocrate_metadata.py +39 -0
  234. arctrl/py/ROCrate/dyn_obj_extensions.py +1 -0
  235. arctrl/py/ROCrate/helper.py +8 -0
  236. arctrl/py/ROCrate/ldcontext.py +362 -0
  237. arctrl/py/ROCrate/ldobject.py +1247 -0
  238. arctrl/py/ROCrate/rocrate_context.py +51 -0
  239. arctrl/py/Spreadsheet/AnnotationTable/__init__.py +0 -0
  240. arctrl/py/Spreadsheet/AnnotationTable/arc_table.py +193 -0
  241. arctrl/py/Spreadsheet/AnnotationTable/composite_cell.py +78 -0
  242. arctrl/py/Spreadsheet/AnnotationTable/composite_column.py +210 -0
  243. arctrl/py/Spreadsheet/AnnotationTable/composite_header.py +623 -0
  244. arctrl/py/Spreadsheet/DataMapTable/__init__.py +0 -0
  245. arctrl/py/Spreadsheet/DataMapTable/data_map_column.py +114 -0
  246. arctrl/py/Spreadsheet/DataMapTable/data_map_header.py +618 -0
  247. arctrl/py/Spreadsheet/DataMapTable/data_map_table.py +119 -0
  248. arctrl/py/Spreadsheet/Metadata/__init__.py +0 -0
  249. arctrl/py/Spreadsheet/Metadata/assays.py +125 -0
  250. arctrl/py/Spreadsheet/Metadata/comment.py +77 -0
  251. arctrl/py/Spreadsheet/Metadata/contacts.py +134 -0
  252. arctrl/py/Spreadsheet/Metadata/conversions.py +190 -0
  253. arctrl/py/Spreadsheet/Metadata/design_descriptors.py +34 -0
  254. arctrl/py/Spreadsheet/Metadata/factors.py +107 -0
  255. arctrl/py/Spreadsheet/Metadata/ontology_annotation.py +88 -0
  256. arctrl/py/Spreadsheet/Metadata/ontology_source_reference.py +96 -0
  257. arctrl/py/Spreadsheet/Metadata/protocols.py +146 -0
  258. arctrl/py/Spreadsheet/Metadata/publication.py +122 -0
  259. arctrl/py/Spreadsheet/Metadata/run.py +122 -0
  260. arctrl/py/Spreadsheet/Metadata/sparse_table.py +508 -0
  261. arctrl/py/Spreadsheet/Metadata/study.py +312 -0
  262. arctrl/py/Spreadsheet/Metadata/workflow.py +151 -0
  263. arctrl/py/Spreadsheet/__init__.py +0 -0
  264. arctrl/py/Spreadsheet/arc_assay.py +233 -0
  265. arctrl/py/Spreadsheet/arc_investigation.py +418 -0
  266. arctrl/py/Spreadsheet/arc_run.py +190 -0
  267. arctrl/py/Spreadsheet/arc_study.py +144 -0
  268. arctrl/py/Spreadsheet/arc_workflow.py +176 -0
  269. arctrl/py/Spreadsheet/assembly_info.py +1 -0
  270. arctrl/py/Spreadsheet/collection_aux.py +167 -0
  271. arctrl/py/Spreadsheet/data_map.py +44 -0
  272. arctrl/py/Spreadsheet/template.py +460 -0
  273. arctrl/py/ValidationPackages/__init__.py +0 -0
  274. arctrl/py/ValidationPackages/validation_package.py +82 -0
  275. arctrl/py/ValidationPackages/validation_packages_config.py +132 -0
  276. arctrl/py/WebRequest/__init__.py +0 -0
  277. arctrl/py/WebRequest/web_request.py +9 -0
  278. arctrl/py/WebRequest/web_request_py.py +135 -0
  279. arctrl/py/Yaml/__init__.py +0 -0
  280. arctrl/py/Yaml/decode.py +1 -0
  281. arctrl/py/Yaml/encode.py +10 -0
  282. arctrl/py/Yaml/validation_package.py +77 -0
  283. arctrl/py/Yaml/validation_packages_config.py +86 -0
  284. arctrl/py/__init__.py +0 -0
  285. arctrl/py/arc.py +1400 -0
  286. arctrl/py/column_index.py +280 -0
  287. arctrl/py/conversion.py +2184 -0
  288. arctrl/py/cross_async.py +76 -0
  289. arctrl/py/fable_modules/dynamic_obj/__init__.py +0 -0
  290. arctrl/py/fable_modules/dynamic_obj/dyn_obj.py +136 -0
  291. arctrl/py/fable_modules/dynamic_obj/dynamic_obj.py +415 -0
  292. arctrl/py/fable_modules/dynamic_obj/fable_js.py +1 -0
  293. arctrl/py/fable_modules/dynamic_obj/fable_py.py +288 -0
  294. arctrl/py/fable_modules/dynamic_obj/hash_codes.py +82 -0
  295. arctrl/py/fable_modules/dynamic_obj/property_helper.py +25 -0
  296. arctrl/py/fable_modules/dynamic_obj/reflection_utils.py +87 -0
  297. arctrl/py/fable_modules/fable_library/__init__.py +0 -0
  298. arctrl/py/fable_modules/fable_library/array_.py +1528 -0
  299. arctrl/py/fable_modules/fable_library/async_.py +377 -0
  300. arctrl/py/fable_modules/fable_library/async_builder.py +379 -0
  301. arctrl/py/fable_modules/fable_library/big_int.py +330 -0
  302. arctrl/py/fable_modules/fable_library/bit_converter.py +131 -0
  303. arctrl/py/fable_modules/fable_library/boolean.py +26 -0
  304. arctrl/py/fable_modules/fable_library/char.py +237 -0
  305. arctrl/py/fable_modules/fable_library/choice.py +212 -0
  306. arctrl/py/fable_modules/fable_library/date.py +779 -0
  307. arctrl/py/fable_modules/fable_library/date_offset.py +79 -0
  308. arctrl/py/fable_modules/fable_library/decimal_.py +190 -0
  309. arctrl/py/fable_modules/fable_library/diagnostics.py +54 -0
  310. arctrl/py/fable_modules/fable_library/double.py +87 -0
  311. arctrl/py/fable_modules/fable_library/encoding.py +41 -0
  312. arctrl/py/fable_modules/fable_library/event.py +206 -0
  313. arctrl/py/fable_modules/fable_library/file.py +107 -0
  314. arctrl/py/fable_modules/fable_library/fsharp_collections.py +52 -0
  315. arctrl/py/fable_modules/fable_library/fsharp_core.py +123 -0
  316. arctrl/py/fable_modules/fable_library/global_.py +63 -0
  317. arctrl/py/fable_modules/fable_library/guid.py +41 -0
  318. arctrl/py/fable_modules/fable_library/int32.py +73 -0
  319. arctrl/py/fable_modules/fable_library/list.py +1788 -0
  320. arctrl/py/fable_modules/fable_library/long.py +240 -0
  321. arctrl/py/fable_modules/fable_library/mailbox_processor.py +179 -0
  322. arctrl/py/fable_modules/fable_library/map.py +1854 -0
  323. arctrl/py/fable_modules/fable_library/map_util.py +148 -0
  324. arctrl/py/fable_modules/fable_library/mutable_map.py +397 -0
  325. arctrl/py/fable_modules/fable_library/mutable_set.py +279 -0
  326. arctrl/py/fable_modules/fable_library/native.py +45 -0
  327. arctrl/py/fable_modules/fable_library/numeric.py +46 -0
  328. arctrl/py/fable_modules/fable_library/observable.py +222 -0
  329. arctrl/py/fable_modules/fable_library/option.py +128 -0
  330. arctrl/py/fable_modules/fable_library/path.py +62 -0
  331. arctrl/py/fable_modules/fable_library/range.py +117 -0
  332. arctrl/py/fable_modules/fable_library/reflection.py +463 -0
  333. arctrl/py/fable_modules/fable_library/reg_exp.py +137 -0
  334. arctrl/py/fable_modules/fable_library/resize_array.py +31 -0
  335. arctrl/py/fable_modules/fable_library/result.py +212 -0
  336. arctrl/py/fable_modules/fable_library/seq.py +1979 -0
  337. arctrl/py/fable_modules/fable_library/seq2.py +221 -0
  338. arctrl/py/fable_modules/fable_library/set.py +2414 -0
  339. arctrl/py/fable_modules/fable_library/singleton_local_time_zone.py +36 -0
  340. arctrl/py/fable_modules/fable_library/string_.py +573 -0
  341. arctrl/py/fable_modules/fable_library/system_collections_generic.py +462 -0
  342. arctrl/py/fable_modules/fable_library/system_text.py +237 -0
  343. arctrl/py/fable_modules/fable_library/task.py +116 -0
  344. arctrl/py/fable_modules/fable_library/task_builder.py +122 -0
  345. arctrl/py/fable_modules/fable_library/thread.py +5 -0
  346. arctrl/py/fable_modules/fable_library/time_span.py +283 -0
  347. arctrl/py/fable_modules/fable_library/timer.py +24 -0
  348. arctrl/py/fable_modules/fable_library/types.py +401 -0
  349. arctrl/py/fable_modules/fable_library/uri.py +109 -0
  350. arctrl/py/fable_modules/fable_library/util.py +2735 -0
  351. arctrl/py/fable_modules/fable_openpyxl/__init__.py +0 -0
  352. arctrl/py/fable_modules/fable_openpyxl/openpyxl.py +362 -0
  353. arctrl/py/fable_modules/fable_python/cognite-sdk/__init__.py +0 -0
  354. arctrl/py/fable_modules/fable_python/cognite-sdk/cognite_sdk.py +22 -0
  355. arctrl/py/fable_modules/fable_python/flask/__init__.py +0 -0
  356. arctrl/py/fable_modules/fable_python/flask/flask.py +34 -0
  357. arctrl/py/fable_modules/fable_python/jupyter/__init__.py +0 -0
  358. arctrl/py/fable_modules/fable_python/jupyter/ipy_widgets.py +47 -0
  359. arctrl/py/fable_modules/fable_python/jupyter/ipython.py +13 -0
  360. arctrl/py/fable_modules/fable_python/stdlib/__init__.py +0 -0
  361. arctrl/py/fable_modules/fable_python/stdlib/ast.py +1 -0
  362. arctrl/py/fable_modules/fable_python/stdlib/asyncio/__init__.py +0 -0
  363. arctrl/py/fable_modules/fable_python/stdlib/asyncio/events.py +17 -0
  364. arctrl/py/fable_modules/fable_python/stdlib/asyncio/futures.py +52 -0
  365. arctrl/py/fable_modules/fable_python/stdlib/asyncio/tasks.py +38 -0
  366. arctrl/py/fable_modules/fable_python/stdlib/base64_.py +1 -0
  367. arctrl/py/fable_modules/fable_python/stdlib/builtins_.py +38 -0
  368. arctrl/py/fable_modules/fable_python/stdlib/html.py +1 -0
  369. arctrl/py/fable_modules/fable_python/stdlib/json.py +1 -0
  370. arctrl/py/fable_modules/fable_python/stdlib/math_.py +1 -0
  371. arctrl/py/fable_modules/fable_python/stdlib/os_.py +1 -0
  372. arctrl/py/fable_modules/fable_python/stdlib/queue_.py +1 -0
  373. arctrl/py/fable_modules/fable_python/stdlib/string_.py +1 -0
  374. arctrl/py/fable_modules/fable_python/stdlib/sys_.py +30 -0
  375. arctrl/py/fable_modules/fable_python/stdlib/time_.py +1 -0
  376. arctrl/py/fable_modules/fable_python/stdlib/tk_inter.py +1 -0
  377. arctrl/py/fable_modules/fs_spreadsheet/Cells/__init__.py +0 -0
  378. arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cell.py +338 -0
  379. arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cells_collection.py +469 -0
  380. arctrl/py/fable_modules/fs_spreadsheet/DSL/__init__.py +0 -0
  381. arctrl/py/fable_modules/fs_spreadsheet/DSL/cell_builder.py +214 -0
  382. arctrl/py/fable_modules/fs_spreadsheet/DSL/column_builder.py +139 -0
  383. arctrl/py/fable_modules/fs_spreadsheet/DSL/dsl.py +50 -0
  384. arctrl/py/fable_modules/fs_spreadsheet/DSL/expression.py +65 -0
  385. arctrl/py/fable_modules/fs_spreadsheet/DSL/operators.py +9 -0
  386. arctrl/py/fable_modules/fs_spreadsheet/DSL/row_builder.py +139 -0
  387. arctrl/py/fable_modules/fs_spreadsheet/DSL/sheet_builder.py +118 -0
  388. arctrl/py/fable_modules/fs_spreadsheet/DSL/table_builder.py +122 -0
  389. arctrl/py/fable_modules/fs_spreadsheet/DSL/transform.py +464 -0
  390. arctrl/py/fable_modules/fs_spreadsheet/DSL/types.py +314 -0
  391. arctrl/py/fable_modules/fs_spreadsheet/DSL/workbook_builder.py +106 -0
  392. arctrl/py/fable_modules/fs_spreadsheet/Json/__init__.py +0 -0
  393. arctrl/py/fable_modules/fs_spreadsheet/Json/cell.py +103 -0
  394. arctrl/py/fable_modules/fs_spreadsheet/Json/column.py +70 -0
  395. arctrl/py/fable_modules/fs_spreadsheet/Json/row.py +70 -0
  396. arctrl/py/fable_modules/fs_spreadsheet/Json/table.py +57 -0
  397. arctrl/py/fable_modules/fs_spreadsheet/Json/value.py +93 -0
  398. arctrl/py/fable_modules/fs_spreadsheet/Json/workbook.py +71 -0
  399. arctrl/py/fable_modules/fs_spreadsheet/Json/worksheet.py +217 -0
  400. arctrl/py/fable_modules/fs_spreadsheet/Ranges/__init__.py +0 -0
  401. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range.py +47 -0
  402. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_address.py +186 -0
  403. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_base.py +90 -0
  404. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_column.py +78 -0
  405. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_row.py +48 -0
  406. arctrl/py/fable_modules/fs_spreadsheet/Tables/__init__.py +0 -0
  407. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table.py +393 -0
  408. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_field.py +127 -0
  409. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_row.py +23 -0
  410. arctrl/py/fable_modules/fs_spreadsheet/__init__.py +0 -0
  411. arctrl/py/fable_modules/fs_spreadsheet/fs_address.py +218 -0
  412. arctrl/py/fable_modules/fs_spreadsheet/fs_column.py +172 -0
  413. arctrl/py/fable_modules/fs_spreadsheet/fs_row.py +183 -0
  414. arctrl/py/fable_modules/fs_spreadsheet/fs_workbook.py +180 -0
  415. arctrl/py/fable_modules/fs_spreadsheet/fs_worksheet.py +600 -0
  416. arctrl/py/fable_modules/fs_spreadsheet/sheet_builder.py +330 -0
  417. arctrl/py/fable_modules/fs_spreadsheet_py/__init__.py +0 -0
  418. arctrl/py/fable_modules/fs_spreadsheet_py/cell.py +63 -0
  419. arctrl/py/fable_modules/fs_spreadsheet_py/cell_type.py +50 -0
  420. arctrl/py/fable_modules/fs_spreadsheet_py/fs_extension.py +60 -0
  421. arctrl/py/fable_modules/fs_spreadsheet_py/json.py +47 -0
  422. arctrl/py/fable_modules/fs_spreadsheet_py/table.py +53 -0
  423. arctrl/py/fable_modules/fs_spreadsheet_py/workbook.py +40 -0
  424. arctrl/py/fable_modules/fs_spreadsheet_py/worksheet.py +54 -0
  425. arctrl/py/fable_modules/fs_spreadsheet_py/xlsx.py +37 -0
  426. arctrl/py/fable_modules/thoth_json_core/__init__.py +0 -0
  427. arctrl/py/fable_modules/thoth_json_core/decode.py +1588 -0
  428. arctrl/py/fable_modules/thoth_json_core/encode.py +261 -0
  429. arctrl/py/fable_modules/thoth_json_core/types.py +181 -0
  430. arctrl/py/fable_modules/thoth_json_python/__init__.py +0 -0
  431. arctrl/py/fable_modules/thoth_json_python/decode.py +112 -0
  432. arctrl/py/fable_modules/thoth_json_python/encode.py +72 -0
  433. arctrl/py/fable_modules/thoth_json_python/python.py +1 -0
  434. arctrl/py/fable_modules/yamlicious/Interop/__init__.py +0 -0
  435. arctrl/py/fable_modules/yamlicious/Interop/js_interop.py +1 -0
  436. arctrl/py/fable_modules/yamlicious/Interop/py_interop.py +7 -0
  437. arctrl/py/fable_modules/yamlicious/__init__.py +0 -0
  438. arctrl/py/fable_modules/yamlicious/decode.py +1784 -0
  439. arctrl/py/fable_modules/yamlicious/encode.py +84 -0
  440. arctrl/py/fable_modules/yamlicious/library.py +10 -0
  441. arctrl/py/fable_modules/yamlicious/persil.py +57 -0
  442. arctrl/py/fable_modules/yamlicious/preprocessing.py +99 -0
  443. arctrl/py/fable_modules/yamlicious/reader.py +665 -0
  444. arctrl/py/fable_modules/yamlicious/regex.py +21 -0
  445. arctrl/py/fable_modules/yamlicious/regex_active_patterns.py +256 -0
  446. arctrl/py/fable_modules/yamlicious/writer.py +175 -0
  447. arctrl/py/fable_modules/yamlicious/yamlicious_types.py +128 -0
  448. arctrl/py/json.py +213 -0
  449. arctrl/py/rocrate_io.py +72 -0
  450. arctrl/py/template_web.py +23 -0
  451. arctrl/py/xlsx.py +148 -0
  452. arctrl/rocrate.py +21 -0
  453. arctrl-3.0.0a3.dist-info/LICENSE +21 -0
  454. arctrl-3.0.0a3.dist-info/METADATA +119 -0
  455. arctrl-3.0.0a3.dist-info/RECORD +456 -0
  456. arctrl-3.0.0a3.dist-info/WHEEL +4 -0
@@ -0,0 +1,463 @@
1
+ from __future__ import annotations
2
+
3
+ import functools
4
+ from collections.abc import Callable
5
+ from dataclasses import dataclass
6
+ from typing import Any, cast
7
+
8
+ from .types import FSharpRef, Record
9
+ from .types import Union as FsUnion
10
+ from .util import Array, combine_hash_codes, equal_arrays_with
11
+
12
+
13
+ Constructor = Callable[..., Any]
14
+
15
+ EnumCase = tuple[str, int]
16
+ FieldInfo = tuple[str, "TypeInfo"]
17
+ PropertyInfo = FieldInfo
18
+ ParameterInfo = FieldInfo
19
+
20
+
21
+ @dataclass
22
+ class CaseInfo:
23
+ declaringType: TypeInfo
24
+ tag: int
25
+ name: str
26
+ fields: list[FieldInfo]
27
+
28
+
29
+ @dataclass
30
+ class MethodInfo:
31
+ name: str
32
+ parameters: list[ParameterInfo]
33
+ returnType: TypeInfo
34
+
35
+
36
+ @dataclass
37
+ class TypeInfo:
38
+ fullname: str
39
+ generics: list[TypeInfo] | None = None
40
+ construct: Constructor | None = None
41
+ parent: TypeInfo | None = None
42
+ fields: Callable[[], list[FieldInfo]] | None = None
43
+ cases: Callable[[], list[CaseInfo]] | None = None
44
+ enum_cases: list[EnumCase] | None = None
45
+
46
+ def __str__(self) -> str:
47
+ return full_name(self)
48
+
49
+ def __eq__(self, other: Any) -> bool:
50
+ return equals(self, other)
51
+
52
+ def __hash__(self) -> int:
53
+ hashes = list(map(hash, self.generics if self.generics else []))
54
+ hashes.append(hash(self.fullname))
55
+ return combine_hash_codes(hashes)
56
+
57
+
58
+ def class_type(
59
+ fullname: str,
60
+ generics: list[TypeInfo] | None = None,
61
+ construct: Constructor | None = None,
62
+ parent: TypeInfo | None = None,
63
+ ) -> TypeInfo:
64
+ return TypeInfo(fullname, generics, construct, parent)
65
+
66
+
67
+ def union_type(
68
+ fullname: str,
69
+ generics: list[TypeInfo],
70
+ construct: type[FsUnion],
71
+ cases: Callable[[], list[list[FieldInfo]]],
72
+ ) -> TypeInfo:
73
+ def fn() -> list[CaseInfo]:
74
+ caseNames: list[str] = construct.cases()
75
+
76
+ def mapper(i: int, fields: list[FieldInfo]) -> CaseInfo:
77
+ return CaseInfo(t, i, caseNames[i], fields)
78
+
79
+ return [mapper(i, x) for i, x in enumerate(cases())]
80
+
81
+ t: TypeInfo = TypeInfo(fullname, generics, construct, None, None, fn, None)
82
+ return t
83
+
84
+
85
+ def lambda_type(argType: TypeInfo, returnType: TypeInfo):
86
+ return TypeInfo("Microsoft.FSharp.Core.FSharpFunc`2", [argType, returnType])
87
+
88
+
89
+ def delegate_type(*generics: TypeInfo) -> TypeInfo:
90
+ return TypeInfo("System.Func`%d" % len(generics), list(generics))
91
+
92
+
93
+ def record_type(
94
+ fullname: str,
95
+ generics: list[TypeInfo],
96
+ construct: Constructor,
97
+ fields: Callable[[], list[FieldInfo]],
98
+ ) -> TypeInfo:
99
+ return TypeInfo(fullname, generics, construct, fields=fields)
100
+
101
+
102
+ def anon_record_type(*fields: FieldInfo) -> TypeInfo:
103
+ return TypeInfo("", None, None, None, lambda: list(fields))
104
+
105
+
106
+ def option_type(generic: TypeInfo) -> TypeInfo:
107
+ return TypeInfo("Microsoft.FSharp.Core.FSharpOption`1", [generic])
108
+
109
+
110
+ def list_type(generic: TypeInfo) -> TypeInfo:
111
+ return TypeInfo("Microsoft.FSharp.Collections.FSharpList`1", [generic])
112
+
113
+
114
+ def array_type(generic: TypeInfo) -> TypeInfo:
115
+ return TypeInfo(generic.fullname + "[]", [generic])
116
+
117
+
118
+ def enum_type(fullname: str, underlyingType: TypeInfo, enumCases: list[EnumCase]) -> TypeInfo:
119
+ return TypeInfo(fullname, [underlyingType], None, None, None, None, enumCases)
120
+
121
+
122
+ def tuple_type(*generics: TypeInfo) -> TypeInfo:
123
+ return TypeInfo(fullname=f"System.Tuple`{len(generics)}", generics=list(generics))
124
+
125
+
126
+ obj_type: TypeInfo = TypeInfo(fullname="System.Object")
127
+ unit_type: TypeInfo = TypeInfo("Microsoft.FSharp.Core.Unit")
128
+ char_type: TypeInfo = TypeInfo("System.Char")
129
+ string_type: TypeInfo = TypeInfo("System.String")
130
+ bool_type: TypeInfo = TypeInfo("System.Boolean")
131
+ int8_type: TypeInfo = TypeInfo("System.SByte")
132
+ uint8_type: TypeInfo = TypeInfo("System.Byte")
133
+ int16_type: TypeInfo = TypeInfo("System.Int16")
134
+ uint16_type: TypeInfo = TypeInfo("System.UInt16")
135
+ int32_type: TypeInfo = TypeInfo("System.Int32")
136
+ uint32_type: TypeInfo = TypeInfo("System.UInt32")
137
+ int64_type: TypeInfo = TypeInfo("System.Int64")
138
+ uint64_type: TypeInfo = TypeInfo("System.Int64")
139
+ bigint_type: TypeInfo = TypeInfo("System.Numerics.BigInteger")
140
+ nativeint_type: TypeInfo = TypeInfo("System.IntPtr")
141
+ unativeint_type: TypeInfo = TypeInfo("System.UIntPtr")
142
+ float32_type: TypeInfo = TypeInfo("System.Single")
143
+ float64_type: TypeInfo = TypeInfo("System.Double")
144
+ decimal_type: TypeInfo = TypeInfo("System.Decimal")
145
+
146
+
147
+ def equals(t1: TypeInfo, t2: TypeInfo) -> bool:
148
+ if not t1.fullname:
149
+ return not t2.fullname and equal_arrays_with(
150
+ get_record_elements(t1),
151
+ get_record_elements(t2),
152
+ lambda kv1, kv2: kv1[0] == kv2[0] and equals(kv1[1], kv2[1]),
153
+ )
154
+
155
+ return t1.fullname == t2.fullname and equal_arrays_with(t1.generics, t2.generics, equals)
156
+
157
+
158
+ def is_generic_type(t: TypeInfo) -> bool:
159
+ return t.generics is not None and len(t.generics) > 0
160
+
161
+
162
+ def get_generic_type_definition(t: TypeInfo):
163
+ return t if t.generics is None else TypeInfo(t.fullname, list(map(lambda _: obj_type, t.generics)))
164
+
165
+
166
+ def get_generics(t: TypeInfo) -> list[TypeInfo]:
167
+ return t.generics if t.generics else []
168
+
169
+
170
+ def make_generic_type(t: TypeInfo, generics: list[TypeInfo]) -> TypeInfo:
171
+ return TypeInfo(t.fullname, generics, t.construct, t.parent, t.fields, t.cases)
172
+
173
+
174
+ def create_instance(t: TypeInfo, consArgs: list[Any]) -> Any:
175
+ # TODO: Check if consArgs length is same as t.construct?
176
+ # (Arg types can still be different)
177
+ if callable(t.construct):
178
+ return t.construct(*(consArgs or []))
179
+ else:
180
+ raise ValueError(f"Cannot access constructor of {t.fullname}")
181
+
182
+
183
+ def get_value(propertyInfo: PropertyInfo, v: Any) -> Any:
184
+ return getattr(v, str(propertyInfo[0]))
185
+
186
+
187
+ def name(info: FieldInfo | (TypeInfo | CaseInfo)) -> str:
188
+ if isinstance(info, tuple):
189
+ return info[0]
190
+
191
+ elif isinstance(info, TypeInfo):
192
+ i = info.fullname.rfind(".")
193
+ return info.fullname if i == -1 else info.fullname[i + 1 :]
194
+ else:
195
+ return info.name
196
+
197
+
198
+ def full_name(t: TypeInfo) -> str:
199
+ gen = t.generics if t.generics and not is_array(t) else []
200
+ if len(gen):
201
+ gen_ = ",".join([full_name(x) for x in gen])
202
+ return f"{t.fullname}[{gen_}]"
203
+
204
+ else:
205
+ return t.fullname
206
+
207
+
208
+ def namespace(t: TypeInfo) -> str:
209
+ i = t.fullname.rfind(".")
210
+ return "" if i == -1 else t.fullname[0:i]
211
+
212
+
213
+ def is_array(t: TypeInfo) -> bool:
214
+ return t.fullname.endswith("[]")
215
+
216
+
217
+ def is_enum(t: TypeInfo) -> bool:
218
+ return t.enum_cases is not None and len(t.enum_cases) > 0
219
+
220
+
221
+ def is_subclass_of(t1: TypeInfo, t2: TypeInfo) -> bool:
222
+ return t1.parent is not None and ((t1.parent == t2) or is_subclass_of(t1.parent, t2))
223
+
224
+
225
+ def is_erased_to_number(t: TypeInfo) -> bool:
226
+ return is_enum(t) or t.fullname in [
227
+ int8_type.fullname,
228
+ uint8_type.fullname,
229
+ int16_type.fullname,
230
+ uint16_type.fullname,
231
+ int32_type.fullname,
232
+ uint32_type.fullname,
233
+ float32_type.fullname,
234
+ float64_type.fullname,
235
+ ]
236
+
237
+
238
+ def is_instance_of_type(t: TypeInfo, o: Any) -> bool:
239
+ if t.fullname == obj_type.fullname:
240
+ return True
241
+
242
+ if isinstance(o, bool):
243
+ return t.fullname == bool_type.fullname
244
+
245
+ if isinstance(o, str):
246
+ return t.fullname == string_type.fullname
247
+
248
+ if isinstance(o, int | float):
249
+ return is_erased_to_number(t)
250
+
251
+ if callable(o):
252
+ return is_function(t)
253
+
254
+ return t.construct is not None and isinstance(o, t.construct)
255
+
256
+
257
+ def is_record(t: Any) -> bool:
258
+ return (t.fields is not None) if isinstance(t, TypeInfo) else isinstance(t, Record)
259
+
260
+
261
+ def is_tuple(t: TypeInfo) -> bool:
262
+ return t.fullname.startswith("System.Tuple") and not is_array(t)
263
+
264
+
265
+ def is_union(t: Any) -> bool:
266
+ if isinstance(t, TypeInfo):
267
+ return t.cases is not None
268
+
269
+ return isinstance(t, FsUnion)
270
+
271
+
272
+ # In .NET this is false for delegates
273
+ def is_function(t: TypeInfo) -> bool:
274
+ return t.fullname == "Microsoft.FSharp.Core.FSharpFunc`2"
275
+
276
+
277
+ def get_element_type(t: TypeInfo) -> TypeInfo | None:
278
+ return (t.generics[0] if t.generics else None) if is_array(t) else None
279
+
280
+
281
+ def get_enum_underlying_type(t: TypeInfo):
282
+ return t.generics[0] if t.generics else None
283
+
284
+
285
+ def get_enum_values(t: TypeInfo) -> list[int]:
286
+ if is_enum(t) and t.enum_cases is not None:
287
+ return [int(kv[1]) for kv in t.enum_cases]
288
+ else:
289
+ raise ValueError(f"{t.fullname} is not an enum type")
290
+
291
+
292
+ def get_enum_names(t: TypeInfo) -> list[str]:
293
+ if is_enum(t) and t.enum_cases is not None:
294
+ return [str(kv[0]) for kv in t.enum_cases]
295
+ else:
296
+ raise ValueError(f"{t.fullname} is not an enum type")
297
+
298
+
299
+ def get_enum_case(t: TypeInfo, v: int | str) -> EnumCase:
300
+ if t.enum_cases is None:
301
+ raise ValueError(f"{t.fullname} is not an enum type")
302
+
303
+ if isinstance(v, str):
304
+ for kv in t.enum_cases:
305
+ if kv[0] == v:
306
+ return kv
307
+
308
+ raise ValueError(f"{v}' was not found in {t.fullname}")
309
+
310
+ for kv in t.enum_cases:
311
+ if kv[1] == v:
312
+ return kv
313
+
314
+ # .NET returns the number even if it doesn't match any of the cases
315
+ return ("", v)
316
+
317
+
318
+ def get_tuple_elements(t: TypeInfo) -> list[TypeInfo]:
319
+ if is_tuple(t) and t.generics is not None:
320
+ return t.generics
321
+ else:
322
+ raise ValueError(f"{t.fullname} is not a tuple type")
323
+
324
+
325
+ def get_function_elements(t: TypeInfo) -> list[TypeInfo]:
326
+ if is_function(t) and t.generics is not None:
327
+ gen = t.generics
328
+ return [gen[0], gen[1]]
329
+ else:
330
+ raise ValueError(f"{t.fullname} is not an F# function type")
331
+
332
+
333
+ def parse_enum(t: TypeInfo, string: str) -> int:
334
+ value: int | None
335
+ try:
336
+ value = int(string)
337
+ except Exception:
338
+ value = None
339
+
340
+ return int(get_enum_case(t, value if value else string)[1])
341
+
342
+
343
+ def try_parse_enum(t: TypeInfo, string: str, def_value: FSharpRef[int]) -> bool:
344
+ try:
345
+ def_value.contents = parse_enum(t, string)
346
+ return True
347
+ except Exception:
348
+ return False
349
+
350
+
351
+ def get_enum_name(t: TypeInfo, v: int) -> str:
352
+ return str(get_enum_case(t, v)[0])
353
+
354
+
355
+ def is_enum_defined(t: TypeInfo, v: str | int) -> bool:
356
+ try:
357
+ kv = get_enum_case(t, v)
358
+ return kv[0] is not None and kv[0] != ""
359
+ except Exception:
360
+ # Supress error
361
+ pass
362
+
363
+ return False
364
+
365
+
366
+ def get_record_elements(t: TypeInfo) -> list[FieldInfo]:
367
+ if t.fields is not None:
368
+ return t.fields()
369
+ else:
370
+ raise ValueError(f"{t.fullname} is not an F# record type")
371
+
372
+
373
+ def get_record_fields(v: Any) -> list[str]:
374
+ if isinstance(v, dict):
375
+ return list(cast(dict[str, Any], v).values())
376
+
377
+ return [getattr(v, k) for k in v.__slots__]
378
+
379
+
380
+ def get_record_field(v: Any, field: FieldInfo) -> Any:
381
+ if not isinstance(field[0], str): # type: ignore
382
+ raise ValueError("Field not a string.")
383
+
384
+ if isinstance(v, dict):
385
+ return v[field[0]]
386
+ return getattr(v, field[0])
387
+
388
+
389
+ def get_tuple_fields(v: tuple[Any, ...]) -> Array[Any]:
390
+ return list(v)
391
+
392
+
393
+ def get_tuple_field(v: tuple[Any, ...], i: int) -> Any:
394
+ return v[i]
395
+
396
+
397
+ def make_record(t: TypeInfo, values: list[Any]) -> dict[str, Any]:
398
+ fields = get_record_elements(t)
399
+ if len(fields) != len(values):
400
+ raise ValueError(f"Expected an array of length {len(fields)} but got {len(values)}")
401
+
402
+ if t.construct is not None:
403
+ return t.construct(*values)
404
+
405
+ def reducer(obj: dict[str, Any], ifield: tuple[int, FieldInfo]):
406
+ i, field = ifield
407
+ obj[field[0]] = values[i]
408
+ return obj
409
+
410
+ initial: dict[str, Any] = {}
411
+ return functools.reduce(reducer, enumerate(fields), initial)
412
+
413
+
414
+ def make_tuple(values: list[Any], _t: TypeInfo) -> tuple[Any, ...]:
415
+ return tuple(values)
416
+
417
+
418
+ def make_union(uci: CaseInfo, values: list[Any]) -> Any:
419
+ expectedLength = len(uci.fields or [])
420
+ if len(values) != expectedLength:
421
+ raise ValueError(f"Expected an array of length {expectedLength} but got {len(values)}")
422
+
423
+ return uci.declaringType.construct(uci.tag, *values) if uci.declaringType.construct else {}
424
+
425
+
426
+ def get_union_cases(t: TypeInfo) -> list[CaseInfo]:
427
+ if t.cases and callable(t.cases):
428
+ return t.cases()
429
+ else:
430
+ raise ValueError(f"{t.fullname} is not an F# union type")
431
+
432
+
433
+ def get_union_fields(v: Any, t: TypeInfo) -> list[Any]:
434
+ cases = get_union_cases(t)
435
+ case_ = cases[v.tag]
436
+ if not case_:
437
+ raise ValueError(f"Cannot find case {v.name} in union type")
438
+
439
+ return [case_, list(v.fields)]
440
+
441
+
442
+ def get_union_case_fields(uci: CaseInfo) -> list[FieldInfo]:
443
+ return uci.fields if uci.fields else []
444
+
445
+
446
+ def assert_union(x: Any) -> None:
447
+ if not isinstance(x, FsUnion):
448
+ raise Exception("Value is not an F# union type")
449
+
450
+
451
+ def get_case_tag(x: Any) -> int:
452
+ assert_union(x)
453
+ return x.tag
454
+
455
+
456
+ def get_case_name(x: Any) -> str:
457
+ assert_union(x)
458
+ return x.cases()[x.tag]
459
+
460
+
461
+ def get_case_fields(x: Any) -> list[Any]:
462
+ assert_union(x)
463
+ return x.fields
@@ -0,0 +1,137 @@
1
+ from __future__ import annotations
2
+
3
+ import re
4
+ from collections.abc import Callable, Iterator
5
+ from re import Match, Pattern
6
+
7
+
8
+ MatchEvaluator = Callable[[Match[str]], str]
9
+
10
+
11
+ class GroupCollection:
12
+ def __init__(self, groups: list[str], named_groups: dict[str, str]) -> None:
13
+ self.named_groups = named_groups
14
+ self.groups = groups
15
+
16
+ def values(self) -> list[str]:
17
+ return list(self.groups)
18
+
19
+ def __len__(self) -> int:
20
+ return len(self.groups)
21
+
22
+ def __getitem__(self, key: int | str) -> str | None:
23
+ if isinstance(key, int):
24
+ return self.groups[key]
25
+ else:
26
+ return self.named_groups.get(key)
27
+
28
+ def __iter__(self) -> Iterator[str]:
29
+ return iter(self.groups)
30
+
31
+
32
+ def _options_to_flags(options: int) -> int:
33
+ """Convert .NET options to Python flags."""
34
+ flags = 256
35
+ if options & 1:
36
+ flags |= re.IGNORECASE
37
+ if options & 2:
38
+ flags |= re.MULTILINE
39
+ if options & 16:
40
+ flags |= re.S
41
+ return flags
42
+
43
+
44
+ def create(pattern: str, options: int = 0) -> Pattern[str]:
45
+ # raw_pattern = pattern.encode("unicode_escape").decode("utf-8")
46
+ flags = _options_to_flags(options)
47
+ pattern = pattern.replace("?<", "?P<")
48
+ return re.compile(pattern, flags=flags)
49
+
50
+
51
+ def escape(string: str) -> str:
52
+ return re.escape(string)
53
+
54
+
55
+ def unescape(string: str) -> str:
56
+ return re.sub(r"\\(.)", r"\1", string)
57
+
58
+
59
+ def match(reg: Pattern[str], input: str, start_at: int = 0) -> Match[str] | None:
60
+ return reg.search(input, pos=start_at)
61
+
62
+
63
+ def matches(reg: Pattern[str], input: str, start_at: int = 0) -> list[Match[str]]:
64
+ return list(reg.finditer(input, pos=start_at))
65
+
66
+
67
+ def is_match(reg: Pattern[str], input: str, start_at: int = 0) -> bool:
68
+ return reg.search(input, pos=start_at) is not None
69
+
70
+
71
+ def groups(m: Match[str]) -> GroupCollection:
72
+ named_groups: dict[str, str] = m.groupdict()
73
+
74
+ # .NET adds the whole capture as group 0
75
+ groups_ = [m.group(0), *m.groups()]
76
+
77
+ return GroupCollection(named_groups=named_groups, groups=groups_)
78
+
79
+
80
+ def options(reg: Pattern[str]) -> int:
81
+ options = 256 # ECMAScript
82
+ if reg.flags & re.IGNORECASE:
83
+ options |= 1
84
+ if reg.flags & re.MULTILINE:
85
+ options |= 2
86
+ if reg.flags & re.S:
87
+ options |= 16
88
+ return options
89
+
90
+
91
+ def replace(
92
+ reg: str | Pattern[str],
93
+ input: str,
94
+ replacement: str | MatchEvaluator,
95
+ limit: int | None = None,
96
+ offset: int = 0,
97
+ ) -> str:
98
+ if isinstance(replacement, str):
99
+ # Rewrite placeholders from .NET e.g $1 to \g<1> Python syntax
100
+ replacement = re.sub(pattern=r"\$(\d+)", repl=r"\\g<\g<1>>", string=replacement)
101
+
102
+ if isinstance(reg, str):
103
+ return re.sub(input, replacement, reg, count=limit or 0)
104
+ else:
105
+ return input[:offset] + reg.sub(replacement, input[offset:], count=limit or 0)
106
+
107
+
108
+ def split(
109
+ reg: str | Pattern[str],
110
+ input: str,
111
+ limit: int | None = None,
112
+ offset: int = 0,
113
+ ) -> list[str]:
114
+ if isinstance(reg, str):
115
+ return re.split(input, reg, maxsplit=limit or 0)
116
+
117
+ input = input[offset:]
118
+ return reg.split(input, maxsplit=limit or 0)[:limit]
119
+
120
+
121
+ def get_item(groups: GroupCollection, index: str | int) -> str | None:
122
+ return groups[index]
123
+
124
+
125
+ __all__ = [
126
+ "escape",
127
+ "is_match",
128
+ "match",
129
+ "matches",
130
+ "create",
131
+ "options",
132
+ "replace",
133
+ "split",
134
+ "unescape",
135
+ "groups",
136
+ "get_item",
137
+ ]
@@ -0,0 +1,31 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Callable
4
+ from typing import Any, TypeVar
5
+
6
+
7
+ _T = TypeVar("_T")
8
+
9
+
10
+ def exists(predicate: Callable[[_T], bool], xs: list[_T]) -> bool:
11
+ """Test if a predicate is true for at least one element in a list."""
12
+
13
+ for x in xs:
14
+ if predicate(x):
15
+ return True
16
+ return False
17
+
18
+
19
+ def find_index(predicate: Callable[[_T], bool], xs: list[_T]) -> int:
20
+ """Find the index of the first element in a list that satisfies a predicate."""
21
+
22
+ for i, x in enumerate(xs):
23
+ if predicate(x):
24
+ return i
25
+ return -1
26
+
27
+
28
+ def remove_range(start: int, count: int, xs: list[Any]) -> None:
29
+ """Remove a range of elements from a list in-place."""
30
+
31
+ del xs[start : start + count]