arctrl 3.0.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.
Files changed (511) hide show
  1. arctrl/__init__.py +23 -0
  2. arctrl/cwl.py +12 -0
  3. arctrl/py/CWL/__init__.py +0 -0
  4. arctrl/py/CWL/cwlprocessing_unit.py +221 -0
  5. arctrl/py/CWL/cwltypes.py +364 -0
  6. arctrl/py/CWL/decode.py +3532 -0
  7. arctrl/py/CWL/encode.py +1905 -0
  8. arctrl/py/CWL/expression_tool_description.py +192 -0
  9. arctrl/py/CWL/hash_helpers.py +60 -0
  10. arctrl/py/CWL/inputs.py +122 -0
  11. arctrl/py/CWL/operation_description.py +169 -0
  12. arctrl/py/CWL/outputs.py +171 -0
  13. arctrl/py/CWL/parameter_reference.py +74 -0
  14. arctrl/py/CWL/requirements.py +350 -0
  15. arctrl/py/CWL/tool_description.py +192 -0
  16. arctrl/py/CWL/workflow_description.py +181 -0
  17. arctrl/py/CWL/workflow_steps.py +354 -0
  18. arctrl/py/Contract/__init__.py +0 -0
  19. arctrl/py/Contract/arc.py +89 -0
  20. arctrl/py/Contract/arc_assay.py +125 -0
  21. arctrl/py/Contract/arc_investigation.py +88 -0
  22. arctrl/py/Contract/arc_run.py +291 -0
  23. arctrl/py/Contract/arc_study.py +126 -0
  24. arctrl/py/Contract/arc_workflow.py +213 -0
  25. arctrl/py/Contract/contract.py +153 -0
  26. arctrl/py/Contract/datamap.py +396 -0
  27. arctrl/py/Contract/git.py +116 -0
  28. arctrl/py/Contract/license.py +58 -0
  29. arctrl/py/Contract/validation_packages_config.py +107 -0
  30. arctrl/py/ContractIO/__init__.py +0 -0
  31. arctrl/py/ContractIO/contract_io.py +350 -0
  32. arctrl/py/ContractIO/file_system_helper.py +264 -0
  33. arctrl/py/Conversion/__init__.py +0 -0
  34. arctrl/py/Conversion/assay.py +151 -0
  35. arctrl/py/Conversion/basic.py +559 -0
  36. arctrl/py/Conversion/column_index.py +91 -0
  37. arctrl/py/Conversion/datamap.py +36 -0
  38. arctrl/py/Conversion/date_time.py +32 -0
  39. arctrl/py/Conversion/investigation.py +171 -0
  40. arctrl/py/Conversion/person.py +148 -0
  41. arctrl/py/Conversion/process.py +828 -0
  42. arctrl/py/Conversion/run.py +367 -0
  43. arctrl/py/Conversion/scholarly_article.py +163 -0
  44. arctrl/py/Conversion/study.py +99 -0
  45. arctrl/py/Conversion/table.py +229 -0
  46. arctrl/py/Conversion/workflow.py +680 -0
  47. arctrl/py/Core/Helper/__init__.py +0 -0
  48. arctrl/py/Core/Helper/collections_.py +512 -0
  49. arctrl/py/Core/Helper/date_time.py +26 -0
  50. arctrl/py/Core/Helper/hash_codes.py +60 -0
  51. arctrl/py/Core/Helper/identifier.py +290 -0
  52. arctrl/py/Core/Helper/orcid.py +42 -0
  53. arctrl/py/Core/Helper/printer.py +13 -0
  54. arctrl/py/Core/Helper/regex.py +554 -0
  55. arctrl/py/Core/Helper/sem_ver.py +71 -0
  56. arctrl/py/Core/Helper/url.py +148 -0
  57. arctrl/py/Core/Process/__init__.py +0 -0
  58. arctrl/py/Core/Process/column_index.py +280 -0
  59. arctrl/py/Core/Process/component.py +200 -0
  60. arctrl/py/Core/Process/factor.py +151 -0
  61. arctrl/py/Core/Process/factor_value.py +182 -0
  62. arctrl/py/Core/Process/material.py +74 -0
  63. arctrl/py/Core/Process/material_attribute.py +95 -0
  64. arctrl/py/Core/Process/material_attribute_value.py +184 -0
  65. arctrl/py/Core/Process/material_type.py +45 -0
  66. arctrl/py/Core/Process/process.py +477 -0
  67. arctrl/py/Core/Process/process_input.py +265 -0
  68. arctrl/py/Core/Process/process_output.py +235 -0
  69. arctrl/py/Core/Process/process_parameter_value.py +200 -0
  70. arctrl/py/Core/Process/process_sequence.py +435 -0
  71. arctrl/py/Core/Process/protocol.py +175 -0
  72. arctrl/py/Core/Process/protocol_parameter.py +98 -0
  73. arctrl/py/Core/Process/sample.py +82 -0
  74. arctrl/py/Core/Process/source.py +62 -0
  75. arctrl/py/Core/Table/__init__.py +0 -0
  76. arctrl/py/Core/Table/arc_table.py +1206 -0
  77. arctrl/py/Core/Table/arc_table_aux.py +1308 -0
  78. arctrl/py/Core/Table/arc_tables.py +574 -0
  79. arctrl/py/Core/Table/composite_cell.py +319 -0
  80. arctrl/py/Core/Table/composite_column.py +73 -0
  81. arctrl/py/Core/Table/composite_header.py +739 -0
  82. arctrl/py/Core/__init__.py +0 -0
  83. arctrl/py/Core/arc_types.py +5312 -0
  84. arctrl/py/Core/comment.py +128 -0
  85. arctrl/py/Core/comment_list.py +127 -0
  86. arctrl/py/Core/conversion.py +1375 -0
  87. arctrl/py/Core/data.py +247 -0
  88. arctrl/py/Core/data_context.py +157 -0
  89. arctrl/py/Core/data_file.py +112 -0
  90. arctrl/py/Core/datamap.py +217 -0
  91. arctrl/py/Core/identifier_setters.py +43 -0
  92. arctrl/py/Core/iproperty_value.py +36 -0
  93. arctrl/py/Core/ontology_annotation.py +298 -0
  94. arctrl/py/Core/ontology_source_reference.py +114 -0
  95. arctrl/py/Core/person.py +259 -0
  96. arctrl/py/Core/publication.py +161 -0
  97. arctrl/py/Core/template.py +231 -0
  98. arctrl/py/Core/templates.py +148 -0
  99. arctrl/py/Core/uri.py +11 -0
  100. arctrl/py/Core/value.py +188 -0
  101. arctrl/py/FileSystem/__init__.py +0 -0
  102. arctrl/py/FileSystem/commit.py +21 -0
  103. arctrl/py/FileSystem/default_gitattributes.py +1 -0
  104. arctrl/py/FileSystem/default_gitignore.py +1 -0
  105. arctrl/py/FileSystem/default_license.py +1 -0
  106. arctrl/py/FileSystem/file_system.py +58 -0
  107. arctrl/py/FileSystem/file_system_tree.py +483 -0
  108. arctrl/py/FileSystem/path.py +266 -0
  109. arctrl/py/Json/Datamap/__init__.py +0 -0
  110. arctrl/py/Json/Datamap/data_context.py +101 -0
  111. arctrl/py/Json/Datamap/datamap.py +53 -0
  112. arctrl/py/Json/Process/__init__.py +0 -0
  113. arctrl/py/Json/Process/assay_materials.py +46 -0
  114. arctrl/py/Json/Process/component.py +125 -0
  115. arctrl/py/Json/Process/factor.py +107 -0
  116. arctrl/py/Json/Process/factor_value.py +101 -0
  117. arctrl/py/Json/Process/material.py +226 -0
  118. arctrl/py/Json/Process/material_attribute.py +79 -0
  119. arctrl/py/Json/Process/material_attribute_value.py +101 -0
  120. arctrl/py/Json/Process/material_type.py +53 -0
  121. arctrl/py/Json/Process/process.py +296 -0
  122. arctrl/py/Json/Process/process_input.py +83 -0
  123. arctrl/py/Json/Process/process_output.py +67 -0
  124. arctrl/py/Json/Process/process_parameter_value.py +81 -0
  125. arctrl/py/Json/Process/protocol.py +354 -0
  126. arctrl/py/Json/Process/protocol_parameter.py +91 -0
  127. arctrl/py/Json/Process/sample.py +277 -0
  128. arctrl/py/Json/Process/source.py +214 -0
  129. arctrl/py/Json/Process/study_materials.py +52 -0
  130. arctrl/py/Json/Process/value.py +56 -0
  131. arctrl/py/Json/ROCrate/__init__.py +0 -0
  132. arctrl/py/Json/ROCrate/ldcontext.py +143 -0
  133. arctrl/py/Json/ROCrate/ldgraph.py +117 -0
  134. arctrl/py/Json/ROCrate/ldnode.py +304 -0
  135. arctrl/py/Json/ROCrate/ldref.py +44 -0
  136. arctrl/py/Json/ROCrate/ldvalue.py +102 -0
  137. arctrl/py/Json/Table/__init__.py +0 -0
  138. arctrl/py/Json/Table/arc_table.py +375 -0
  139. arctrl/py/Json/Table/cell_table.py +83 -0
  140. arctrl/py/Json/Table/composite_cell.py +136 -0
  141. arctrl/py/Json/Table/composite_header.py +67 -0
  142. arctrl/py/Json/Table/iotype.py +24 -0
  143. arctrl/py/Json/Table/oatable.py +82 -0
  144. arctrl/py/Json/Table/templates.py +281 -0
  145. arctrl/py/Json/__init__.py +0 -0
  146. arctrl/py/Json/assay.py +600 -0
  147. arctrl/py/Json/comment.py +206 -0
  148. arctrl/py/Json/context/rocrate/__init__.py +0 -0
  149. arctrl/py/Json/context/rocrate/isa_assay_context.py +101 -0
  150. arctrl/py/Json/context/rocrate/isa_comment_context.py +60 -0
  151. arctrl/py/Json/context/rocrate/isa_component_context.py +77 -0
  152. arctrl/py/Json/context/rocrate/isa_data_context.py +74 -0
  153. arctrl/py/Json/context/rocrate/isa_factor_context.py +74 -0
  154. arctrl/py/Json/context/rocrate/isa_factor_value_context.py +84 -0
  155. arctrl/py/Json/context/rocrate/isa_investigation_context.py +110 -0
  156. arctrl/py/Json/context/rocrate/isa_material_attribute_context.py +64 -0
  157. arctrl/py/Json/context/rocrate/isa_material_attribute_value_context.py +80 -0
  158. arctrl/py/Json/context/rocrate/isa_material_context.py +71 -0
  159. arctrl/py/Json/context/rocrate/isa_ontology_annotation_context.py +68 -0
  160. arctrl/py/Json/context/rocrate/isa_ontology_source_reference_context.py +75 -0
  161. arctrl/py/Json/context/rocrate/isa_organization_context.py +55 -0
  162. arctrl/py/Json/context/rocrate/isa_person_context.py +131 -0
  163. arctrl/py/Json/context/rocrate/isa_process_context.py +94 -0
  164. arctrl/py/Json/context/rocrate/isa_process_parameter_value_context.py +80 -0
  165. arctrl/py/Json/context/rocrate/isa_protocol_context.py +97 -0
  166. arctrl/py/Json/context/rocrate/isa_protocol_parameter_context.py +64 -0
  167. arctrl/py/Json/context/rocrate/isa_publication_context.py +78 -0
  168. arctrl/py/Json/context/rocrate/isa_sample_context.py +65 -0
  169. arctrl/py/Json/context/rocrate/isa_source_context.py +66 -0
  170. arctrl/py/Json/context/rocrate/isa_study_context.py +125 -0
  171. arctrl/py/Json/context/rocrate/property_value_context.py +73 -0
  172. arctrl/py/Json/context/rocrate/rocrate_context.py +81 -0
  173. arctrl/py/Json/converter_options.py +23 -0
  174. arctrl/py/Json/data.py +356 -0
  175. arctrl/py/Json/data_file.py +63 -0
  176. arctrl/py/Json/decode.py +271 -0
  177. arctrl/py/Json/encode.py +140 -0
  178. arctrl/py/Json/idtable.py +44 -0
  179. arctrl/py/Json/investigation.py +695 -0
  180. arctrl/py/Json/ontology_annotation.py +404 -0
  181. arctrl/py/Json/ontology_source_reference.py +255 -0
  182. arctrl/py/Json/person.py +658 -0
  183. arctrl/py/Json/property_value.py +359 -0
  184. arctrl/py/Json/publication.py +279 -0
  185. arctrl/py/Json/run.py +275 -0
  186. arctrl/py/Json/string_table.py +87 -0
  187. arctrl/py/Json/study.py +793 -0
  188. arctrl/py/Json/workflow.py +307 -0
  189. arctrl/py/JsonIO/Process/__init__.py +0 -0
  190. arctrl/py/JsonIO/Process/component.py +60 -0
  191. arctrl/py/JsonIO/Process/factor.py +36 -0
  192. arctrl/py/JsonIO/Process/factor_value.py +38 -0
  193. arctrl/py/JsonIO/Process/material.py +60 -0
  194. arctrl/py/JsonIO/Process/material_attribute.py +38 -0
  195. arctrl/py/JsonIO/Process/material_attribute_value.py +60 -0
  196. arctrl/py/JsonIO/Process/material_type.py +36 -0
  197. arctrl/py/JsonIO/Process/process.py +60 -0
  198. arctrl/py/JsonIO/Process/process_input.py +38 -0
  199. arctrl/py/JsonIO/Process/process_output.py +60 -0
  200. arctrl/py/JsonIO/Process/process_parameter_value.py +60 -0
  201. arctrl/py/JsonIO/Process/process_sequence.py +71 -0
  202. arctrl/py/JsonIO/Process/protocol.py +60 -0
  203. arctrl/py/JsonIO/Process/protocol_parameter.py +36 -0
  204. arctrl/py/JsonIO/Process/sample.py +60 -0
  205. arctrl/py/JsonIO/Process/source.py +60 -0
  206. arctrl/py/JsonIO/Process/study_materials.py +52 -0
  207. arctrl/py/JsonIO/Process/value.py +32 -0
  208. arctrl/py/JsonIO/Table/__init__.py +0 -0
  209. arctrl/py/JsonIO/Table/arc_table.py +103 -0
  210. arctrl/py/JsonIO/Table/composite_cell.py +36 -0
  211. arctrl/py/JsonIO/Table/composite_header.py +36 -0
  212. arctrl/py/JsonIO/Table/compression.py +67 -0
  213. arctrl/py/JsonIO/Table/iotype.py +36 -0
  214. arctrl/py/JsonIO/Table/templates.py +113 -0
  215. arctrl/py/JsonIO/__init__.py +0 -0
  216. arctrl/py/JsonIO/assay.py +113 -0
  217. arctrl/py/JsonIO/comment.py +80 -0
  218. arctrl/py/JsonIO/data.py +60 -0
  219. arctrl/py/JsonIO/data_file.py +58 -0
  220. arctrl/py/JsonIO/datamap.py +36 -0
  221. arctrl/py/JsonIO/decode.py +9 -0
  222. arctrl/py/JsonIO/encode.py +1 -0
  223. arctrl/py/JsonIO/investigation.py +91 -0
  224. arctrl/py/JsonIO/ldobject.py +106 -0
  225. arctrl/py/JsonIO/ontology_annotation.py +80 -0
  226. arctrl/py/JsonIO/ontology_source_reference.py +80 -0
  227. arctrl/py/JsonIO/person.py +82 -0
  228. arctrl/py/JsonIO/publication.py +82 -0
  229. arctrl/py/JsonIO/run.py +68 -0
  230. arctrl/py/JsonIO/study.py +114 -0
  231. arctrl/py/JsonIO/workflow.py +68 -0
  232. arctrl/py/ROCrate/ISAProfile/__init__.py +0 -0
  233. arctrl/py/ROCrate/ISAProfile/assay.py +70 -0
  234. arctrl/py/ROCrate/ISAProfile/data.py +65 -0
  235. arctrl/py/ROCrate/ISAProfile/dataset.py +24 -0
  236. arctrl/py/ROCrate/ISAProfile/investigation.py +73 -0
  237. arctrl/py/ROCrate/ISAProfile/lab_process.py +162 -0
  238. arctrl/py/ROCrate/ISAProfile/lab_protocol.py +37 -0
  239. arctrl/py/ROCrate/ISAProfile/person.py +72 -0
  240. arctrl/py/ROCrate/ISAProfile/property_value.py +98 -0
  241. arctrl/py/ROCrate/ISAProfile/sample.py +64 -0
  242. arctrl/py/ROCrate/ISAProfile/scholarly_article.py +98 -0
  243. arctrl/py/ROCrate/ISAProfile/study.py +74 -0
  244. arctrl/py/ROCrate/LDTypes/__init__.py +0 -0
  245. arctrl/py/ROCrate/LDTypes/comment.py +131 -0
  246. arctrl/py/ROCrate/LDTypes/computational_workflow.py +455 -0
  247. arctrl/py/ROCrate/LDTypes/computer_language.py +269 -0
  248. arctrl/py/ROCrate/LDTypes/create_action.py +303 -0
  249. arctrl/py/ROCrate/LDTypes/creative_work.py +566 -0
  250. arctrl/py/ROCrate/LDTypes/dataset.py +943 -0
  251. arctrl/py/ROCrate/LDTypes/defined_term.py +131 -0
  252. arctrl/py/ROCrate/LDTypes/file.py +281 -0
  253. arctrl/py/ROCrate/LDTypes/formal_parameter.py +431 -0
  254. arctrl/py/ROCrate/LDTypes/lab_process.py +352 -0
  255. arctrl/py/ROCrate/LDTypes/lab_protocol.py +395 -0
  256. arctrl/py/ROCrate/LDTypes/organization.py +83 -0
  257. arctrl/py/ROCrate/LDTypes/person.py +484 -0
  258. arctrl/py/ROCrate/LDTypes/postal_address.py +195 -0
  259. arctrl/py/ROCrate/LDTypes/property_value.py +952 -0
  260. arctrl/py/ROCrate/LDTypes/sample.py +202 -0
  261. arctrl/py/ROCrate/LDTypes/scholarly_article.py +229 -0
  262. arctrl/py/ROCrate/LDTypes/software_source_code.py +310 -0
  263. arctrl/py/ROCrate/LDTypes/workflow_invocation.py +48 -0
  264. arctrl/py/ROCrate/LDTypes/workflow_protocol.py +52 -0
  265. arctrl/py/ROCrate/__init__.py +0 -0
  266. arctrl/py/ROCrate/arc_rocrate_metadata.py +39 -0
  267. arctrl/py/ROCrate/dyn_obj_extensions.py +1 -0
  268. arctrl/py/ROCrate/helper.py +8 -0
  269. arctrl/py/ROCrate/ldcontext.py +406 -0
  270. arctrl/py/ROCrate/ldobject.py +1247 -0
  271. arctrl/py/ROCrate/rocrate_context.py +51 -0
  272. arctrl/py/Spreadsheet/AnnotationTable/__init__.py +0 -0
  273. arctrl/py/Spreadsheet/AnnotationTable/arc_table.py +203 -0
  274. arctrl/py/Spreadsheet/AnnotationTable/composite_cell.py +78 -0
  275. arctrl/py/Spreadsheet/AnnotationTable/composite_column.py +305 -0
  276. arctrl/py/Spreadsheet/AnnotationTable/composite_header.py +623 -0
  277. arctrl/py/Spreadsheet/DatamapTable/__init__.py +0 -0
  278. arctrl/py/Spreadsheet/DatamapTable/datamap_column.py +114 -0
  279. arctrl/py/Spreadsheet/DatamapTable/datamap_header.py +621 -0
  280. arctrl/py/Spreadsheet/DatamapTable/datamap_table.py +118 -0
  281. arctrl/py/Spreadsheet/Metadata/__init__.py +0 -0
  282. arctrl/py/Spreadsheet/Metadata/assays.py +125 -0
  283. arctrl/py/Spreadsheet/Metadata/comment.py +77 -0
  284. arctrl/py/Spreadsheet/Metadata/contacts.py +134 -0
  285. arctrl/py/Spreadsheet/Metadata/conversions.py +190 -0
  286. arctrl/py/Spreadsheet/Metadata/design_descriptors.py +34 -0
  287. arctrl/py/Spreadsheet/Metadata/factors.py +107 -0
  288. arctrl/py/Spreadsheet/Metadata/ontology_annotation.py +88 -0
  289. arctrl/py/Spreadsheet/Metadata/ontology_source_reference.py +96 -0
  290. arctrl/py/Spreadsheet/Metadata/protocols.py +146 -0
  291. arctrl/py/Spreadsheet/Metadata/publication.py +122 -0
  292. arctrl/py/Spreadsheet/Metadata/run.py +122 -0
  293. arctrl/py/Spreadsheet/Metadata/sparse_table.py +499 -0
  294. arctrl/py/Spreadsheet/Metadata/study.py +312 -0
  295. arctrl/py/Spreadsheet/Metadata/workflow.py +159 -0
  296. arctrl/py/Spreadsheet/__init__.py +0 -0
  297. arctrl/py/Spreadsheet/arc_assay.py +233 -0
  298. arctrl/py/Spreadsheet/arc_investigation.py +435 -0
  299. arctrl/py/Spreadsheet/arc_run.py +190 -0
  300. arctrl/py/Spreadsheet/arc_study.py +144 -0
  301. arctrl/py/Spreadsheet/arc_workflow.py +177 -0
  302. arctrl/py/Spreadsheet/assembly_info.py +1 -0
  303. arctrl/py/Spreadsheet/collection_aux.py +167 -0
  304. arctrl/py/Spreadsheet/datamap.py +43 -0
  305. arctrl/py/Spreadsheet/template.py +460 -0
  306. arctrl/py/ValidationPackages/__init__.py +0 -0
  307. arctrl/py/ValidationPackages/validation_package.py +82 -0
  308. arctrl/py/ValidationPackages/validation_packages_config.py +132 -0
  309. arctrl/py/WebRequest/__init__.py +0 -0
  310. arctrl/py/WebRequest/web_request.py +9 -0
  311. arctrl/py/WebRequest/web_request_py.py +135 -0
  312. arctrl/py/WorkflowGraph/__init__.py +0 -0
  313. arctrl/py/WorkflowGraph/adapters.py +141 -0
  314. arctrl/py/WorkflowGraph/build_options.py +45 -0
  315. arctrl/py/WorkflowGraph/builder.py +720 -0
  316. arctrl/py/WorkflowGraph/graph_types.py +260 -0
  317. arctrl/py/WorkflowGraph/query_helpers.py +76 -0
  318. arctrl/py/WorkflowGraph/reference_parsing.py +59 -0
  319. arctrl/py/WorkflowGraph/visualization_siren.py +574 -0
  320. arctrl/py/WorkflowGraph/workflow_graph.py +119 -0
  321. arctrl/py/Yaml/__init__.py +0 -0
  322. arctrl/py/Yaml/decode.py +1 -0
  323. arctrl/py/Yaml/encode.py +10 -0
  324. arctrl/py/Yaml/validation_package.py +77 -0
  325. arctrl/py/Yaml/validation_packages_config.py +86 -0
  326. arctrl/py/__init__.py +0 -0
  327. arctrl/py/arc.py +1891 -0
  328. arctrl/py/column_index.py +280 -0
  329. arctrl/py/conversion.py +142 -0
  330. arctrl/py/cross_async.py +76 -0
  331. arctrl/py/cwlrun_resolver.py +228 -0
  332. arctrl/py/fable_modules/dynamic_obj/__init__.py +0 -0
  333. arctrl/py/fable_modules/dynamic_obj/dyn_obj.py +136 -0
  334. arctrl/py/fable_modules/dynamic_obj/dynamic_obj.py +415 -0
  335. arctrl/py/fable_modules/dynamic_obj/fable_js.py +1 -0
  336. arctrl/py/fable_modules/dynamic_obj/fable_py.py +288 -0
  337. arctrl/py/fable_modules/dynamic_obj/hash_codes.py +82 -0
  338. arctrl/py/fable_modules/dynamic_obj/property_helper.py +25 -0
  339. arctrl/py/fable_modules/dynamic_obj/reflection_utils.py +87 -0
  340. arctrl/py/fable_modules/fable_library/__init__.py +0 -0
  341. arctrl/py/fable_modules/fable_library/array_.py +1528 -0
  342. arctrl/py/fable_modules/fable_library/async_.py +377 -0
  343. arctrl/py/fable_modules/fable_library/async_builder.py +379 -0
  344. arctrl/py/fable_modules/fable_library/big_int.py +330 -0
  345. arctrl/py/fable_modules/fable_library/bit_converter.py +131 -0
  346. arctrl/py/fable_modules/fable_library/boolean.py +26 -0
  347. arctrl/py/fable_modules/fable_library/char.py +237 -0
  348. arctrl/py/fable_modules/fable_library/choice.py +212 -0
  349. arctrl/py/fable_modules/fable_library/date.py +779 -0
  350. arctrl/py/fable_modules/fable_library/date_offset.py +79 -0
  351. arctrl/py/fable_modules/fable_library/decimal_.py +190 -0
  352. arctrl/py/fable_modules/fable_library/diagnostics.py +54 -0
  353. arctrl/py/fable_modules/fable_library/double.py +87 -0
  354. arctrl/py/fable_modules/fable_library/encoding.py +41 -0
  355. arctrl/py/fable_modules/fable_library/event.py +206 -0
  356. arctrl/py/fable_modules/fable_library/file.py +107 -0
  357. arctrl/py/fable_modules/fable_library/fsharp_collections.py +52 -0
  358. arctrl/py/fable_modules/fable_library/fsharp_core.py +123 -0
  359. arctrl/py/fable_modules/fable_library/global_.py +63 -0
  360. arctrl/py/fable_modules/fable_library/guid.py +41 -0
  361. arctrl/py/fable_modules/fable_library/int32.py +73 -0
  362. arctrl/py/fable_modules/fable_library/list.py +1788 -0
  363. arctrl/py/fable_modules/fable_library/long.py +240 -0
  364. arctrl/py/fable_modules/fable_library/mailbox_processor.py +179 -0
  365. arctrl/py/fable_modules/fable_library/map.py +1854 -0
  366. arctrl/py/fable_modules/fable_library/map_util.py +148 -0
  367. arctrl/py/fable_modules/fable_library/mutable_map.py +397 -0
  368. arctrl/py/fable_modules/fable_library/mutable_set.py +279 -0
  369. arctrl/py/fable_modules/fable_library/native.py +45 -0
  370. arctrl/py/fable_modules/fable_library/numeric.py +46 -0
  371. arctrl/py/fable_modules/fable_library/observable.py +222 -0
  372. arctrl/py/fable_modules/fable_library/option.py +128 -0
  373. arctrl/py/fable_modules/fable_library/path.py +62 -0
  374. arctrl/py/fable_modules/fable_library/range.py +117 -0
  375. arctrl/py/fable_modules/fable_library/reflection.py +463 -0
  376. arctrl/py/fable_modules/fable_library/reg_exp.py +137 -0
  377. arctrl/py/fable_modules/fable_library/resize_array.py +31 -0
  378. arctrl/py/fable_modules/fable_library/result.py +212 -0
  379. arctrl/py/fable_modules/fable_library/seq.py +1979 -0
  380. arctrl/py/fable_modules/fable_library/seq2.py +221 -0
  381. arctrl/py/fable_modules/fable_library/set.py +2414 -0
  382. arctrl/py/fable_modules/fable_library/singleton_local_time_zone.py +36 -0
  383. arctrl/py/fable_modules/fable_library/string_.py +573 -0
  384. arctrl/py/fable_modules/fable_library/system_collections_generic.py +462 -0
  385. arctrl/py/fable_modules/fable_library/system_text.py +237 -0
  386. arctrl/py/fable_modules/fable_library/task.py +116 -0
  387. arctrl/py/fable_modules/fable_library/task_builder.py +122 -0
  388. arctrl/py/fable_modules/fable_library/thread.py +5 -0
  389. arctrl/py/fable_modules/fable_library/time_span.py +283 -0
  390. arctrl/py/fable_modules/fable_library/timer.py +24 -0
  391. arctrl/py/fable_modules/fable_library/types.py +401 -0
  392. arctrl/py/fable_modules/fable_library/uri.py +109 -0
  393. arctrl/py/fable_modules/fable_library/util.py +2735 -0
  394. arctrl/py/fable_modules/fable_openpyxl/__init__.py +0 -0
  395. arctrl/py/fable_modules/fable_openpyxl/openpyxl.py +362 -0
  396. arctrl/py/fable_modules/fable_python/cognite-sdk/__init__.py +0 -0
  397. arctrl/py/fable_modules/fable_python/cognite-sdk/cognite_sdk.py +22 -0
  398. arctrl/py/fable_modules/fable_python/flask/__init__.py +0 -0
  399. arctrl/py/fable_modules/fable_python/flask/flask.py +34 -0
  400. arctrl/py/fable_modules/fable_python/jupyter/__init__.py +0 -0
  401. arctrl/py/fable_modules/fable_python/jupyter/ipy_widgets.py +47 -0
  402. arctrl/py/fable_modules/fable_python/jupyter/ipython.py +13 -0
  403. arctrl/py/fable_modules/fable_python/stdlib/__init__.py +0 -0
  404. arctrl/py/fable_modules/fable_python/stdlib/ast.py +1 -0
  405. arctrl/py/fable_modules/fable_python/stdlib/asyncio/__init__.py +0 -0
  406. arctrl/py/fable_modules/fable_python/stdlib/asyncio/events.py +17 -0
  407. arctrl/py/fable_modules/fable_python/stdlib/asyncio/futures.py +52 -0
  408. arctrl/py/fable_modules/fable_python/stdlib/asyncio/tasks.py +38 -0
  409. arctrl/py/fable_modules/fable_python/stdlib/base64_.py +1 -0
  410. arctrl/py/fable_modules/fable_python/stdlib/builtins_.py +38 -0
  411. arctrl/py/fable_modules/fable_python/stdlib/html.py +1 -0
  412. arctrl/py/fable_modules/fable_python/stdlib/json.py +1 -0
  413. arctrl/py/fable_modules/fable_python/stdlib/math_.py +1 -0
  414. arctrl/py/fable_modules/fable_python/stdlib/os_.py +1 -0
  415. arctrl/py/fable_modules/fable_python/stdlib/queue_.py +1 -0
  416. arctrl/py/fable_modules/fable_python/stdlib/string_.py +1 -0
  417. arctrl/py/fable_modules/fable_python/stdlib/sys_.py +30 -0
  418. arctrl/py/fable_modules/fable_python/stdlib/time_.py +1 -0
  419. arctrl/py/fable_modules/fable_python/stdlib/tk_inter.py +1 -0
  420. arctrl/py/fable_modules/fs_spreadsheet/Cells/__init__.py +0 -0
  421. arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cell.py +340 -0
  422. arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cells_collection.py +466 -0
  423. arctrl/py/fable_modules/fs_spreadsheet/DSL/__init__.py +0 -0
  424. arctrl/py/fable_modules/fs_spreadsheet/DSL/cell_builder.py +214 -0
  425. arctrl/py/fable_modules/fs_spreadsheet/DSL/column_builder.py +139 -0
  426. arctrl/py/fable_modules/fs_spreadsheet/DSL/dsl.py +50 -0
  427. arctrl/py/fable_modules/fs_spreadsheet/DSL/expression.py +65 -0
  428. arctrl/py/fable_modules/fs_spreadsheet/DSL/operators.py +9 -0
  429. arctrl/py/fable_modules/fs_spreadsheet/DSL/row_builder.py +139 -0
  430. arctrl/py/fable_modules/fs_spreadsheet/DSL/sheet_builder.py +118 -0
  431. arctrl/py/fable_modules/fs_spreadsheet/DSL/table_builder.py +122 -0
  432. arctrl/py/fable_modules/fs_spreadsheet/DSL/transform.py +463 -0
  433. arctrl/py/fable_modules/fs_spreadsheet/DSL/types.py +314 -0
  434. arctrl/py/fable_modules/fs_spreadsheet/DSL/workbook_builder.py +106 -0
  435. arctrl/py/fable_modules/fs_spreadsheet/Json/__init__.py +0 -0
  436. arctrl/py/fable_modules/fs_spreadsheet/Json/cell.py +103 -0
  437. arctrl/py/fable_modules/fs_spreadsheet/Json/column.py +70 -0
  438. arctrl/py/fable_modules/fs_spreadsheet/Json/row.py +70 -0
  439. arctrl/py/fable_modules/fs_spreadsheet/Json/table.py +54 -0
  440. arctrl/py/fable_modules/fs_spreadsheet/Json/value.py +93 -0
  441. arctrl/py/fable_modules/fs_spreadsheet/Json/workbook.py +71 -0
  442. arctrl/py/fable_modules/fs_spreadsheet/Json/worksheet.py +216 -0
  443. arctrl/py/fable_modules/fs_spreadsheet/Ranges/__init__.py +0 -0
  444. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range.py +43 -0
  445. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_address.py +190 -0
  446. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_base.py +92 -0
  447. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_column.py +77 -0
  448. arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_row.py +48 -0
  449. arctrl/py/fable_modules/fs_spreadsheet/Tables/__init__.py +0 -0
  450. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table.py +461 -0
  451. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_field.py +117 -0
  452. arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_row.py +23 -0
  453. arctrl/py/fable_modules/fs_spreadsheet/__init__.py +0 -0
  454. arctrl/py/fable_modules/fs_spreadsheet/fs_address.py +236 -0
  455. arctrl/py/fable_modules/fs_spreadsheet/fs_column.py +172 -0
  456. arctrl/py/fable_modules/fs_spreadsheet/fs_row.py +183 -0
  457. arctrl/py/fable_modules/fs_spreadsheet/fs_workbook.py +192 -0
  458. arctrl/py/fable_modules/fs_spreadsheet/fs_worksheet.py +610 -0
  459. arctrl/py/fable_modules/fs_spreadsheet/hash_codes.py +60 -0
  460. arctrl/py/fable_modules/fs_spreadsheet/sheet_builder.py +329 -0
  461. arctrl/py/fable_modules/fs_spreadsheet_py/__init__.py +0 -0
  462. arctrl/py/fable_modules/fs_spreadsheet_py/cell.py +60 -0
  463. arctrl/py/fable_modules/fs_spreadsheet_py/cell_type.py +50 -0
  464. arctrl/py/fable_modules/fs_spreadsheet_py/fs_extension.py +60 -0
  465. arctrl/py/fable_modules/fs_spreadsheet_py/json.py +47 -0
  466. arctrl/py/fable_modules/fs_spreadsheet_py/table.py +54 -0
  467. arctrl/py/fable_modules/fs_spreadsheet_py/workbook.py +41 -0
  468. arctrl/py/fable_modules/fs_spreadsheet_py/worksheet.py +52 -0
  469. arctrl/py/fable_modules/fs_spreadsheet_py/xlsx.py +37 -0
  470. arctrl/py/fable_modules/siren/__init__.py +0 -0
  471. arctrl/py/fable_modules/siren/config.py +1038 -0
  472. arctrl/py/fable_modules/siren/formatting.py +1121 -0
  473. arctrl/py/fable_modules/siren/siren.py +1941 -0
  474. arctrl/py/fable_modules/siren/siren_types.py +1229 -0
  475. arctrl/py/fable_modules/siren/theme_variables.py +517 -0
  476. arctrl/py/fable_modules/siren/util.py +37 -0
  477. arctrl/py/fable_modules/siren/yaml.py +101 -0
  478. arctrl/py/fable_modules/thoth_json_core/__init__.py +0 -0
  479. arctrl/py/fable_modules/thoth_json_core/decode.py +1614 -0
  480. arctrl/py/fable_modules/thoth_json_core/encode.py +305 -0
  481. arctrl/py/fable_modules/thoth_json_core/types.py +181 -0
  482. arctrl/py/fable_modules/thoth_json_python/__init__.py +0 -0
  483. arctrl/py/fable_modules/thoth_json_python/decode.py +112 -0
  484. arctrl/py/fable_modules/thoth_json_python/encode.py +72 -0
  485. arctrl/py/fable_modules/thoth_json_python/python.py +1 -0
  486. arctrl/py/fable_modules/yamlicious/Interop/__init__.py +0 -0
  487. arctrl/py/fable_modules/yamlicious/Interop/js_interop.py +1 -0
  488. arctrl/py/fable_modules/yamlicious/Interop/py_interop.py +7 -0
  489. arctrl/py/fable_modules/yamlicious/__init__.py +0 -0
  490. arctrl/py/fable_modules/yamlicious/decode.py +1784 -0
  491. arctrl/py/fable_modules/yamlicious/encode.py +84 -0
  492. arctrl/py/fable_modules/yamlicious/flow_to_block.py +994 -0
  493. arctrl/py/fable_modules/yamlicious/library.py +10 -0
  494. arctrl/py/fable_modules/yamlicious/persil.py +57 -0
  495. arctrl/py/fable_modules/yamlicious/preprocessing.py +99 -0
  496. arctrl/py/fable_modules/yamlicious/reader.py +739 -0
  497. arctrl/py/fable_modules/yamlicious/regex.py +29 -0
  498. arctrl/py/fable_modules/yamlicious/regex_active_patterns.py +265 -0
  499. arctrl/py/fable_modules/yamlicious/writer.py +175 -0
  500. arctrl/py/fable_modules/yamlicious/yamlicious_types.py +128 -0
  501. arctrl/py/json.py +389 -0
  502. arctrl/py/license.py +169 -0
  503. arctrl/py/rocrate_io.py +242 -0
  504. arctrl/py/template_web.py +23 -0
  505. arctrl/py/xlsx.py +212 -0
  506. arctrl/py/yaml.py +79 -0
  507. arctrl/rocrate.py +21 -0
  508. arctrl-3.0.0.dist-info/METADATA +157 -0
  509. arctrl-3.0.0.dist-info/RECORD +511 -0
  510. arctrl-3.0.0.dist-info/WHEEL +4 -0
  511. arctrl-3.0.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,36 @@
1
+ from __future__ import annotations
2
+
3
+ import time as _time
4
+ from datetime import datetime, timedelta, tzinfo
5
+
6
+
7
+ class LocalTimezone(tzinfo):
8
+ def utcoffset(self, dt: datetime | None = None):
9
+ # Return offset of local timezone from UTC
10
+ if dt is not None and self._isdst(dt):
11
+ return timedelta(seconds=-_time.altzone)
12
+ else:
13
+ return timedelta(seconds=-_time.timezone)
14
+
15
+ def dst(self, dt: datetime | None = None):
16
+ # Return the daylight saving time (DST) adjustment
17
+ if dt is not None and self._isdst(dt):
18
+ return timedelta(seconds=-_time.altzone)
19
+ else:
20
+ return timedelta(seconds=-_time.timezone)
21
+
22
+ def tzname(self, dt: datetime | None = None) -> str:
23
+ # Return the name of the time zone
24
+ return "localtime"
25
+
26
+ def _isdst(self, dt: datetime):
27
+ # Determine whether or not DST is in effect
28
+ tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, 0)
29
+ stamp = _time.mktime(tt)
30
+ tt = _time.localtime(stamp)
31
+ return tt.tm_isdst > 0
32
+
33
+
34
+ local_time_zone = LocalTimezone()
35
+
36
+ __all__ = ["local_time_zone"]
@@ -0,0 +1,573 @@
1
+ from __future__ import annotations
2
+
3
+ import locale
4
+ import re
5
+ from base64 import b64decode, b64encode
6
+ from collections.abc import Callable, Iterable
7
+ from dataclasses import dataclass
8
+ from datetime import datetime
9
+ from enum import IntEnum
10
+ from re import Match, Pattern
11
+ from typing import (
12
+ Any,
13
+ NoReturn,
14
+ TypeVar,
15
+ cast,
16
+ overload,
17
+ )
18
+
19
+ from .date import to_string as date_to_string
20
+ from .numeric import multiply, to_exponential, to_fixed, to_hex, to_precision
21
+ from .reg_exp import escape
22
+ from .types import to_string
23
+
24
+
25
+ T = TypeVar("T")
26
+
27
+
28
+ _fs_format_regexp: Pattern[str] = re.compile(r"(^|[^%])%([0+\- ]*)(\d+)?(?:\.(\d+))?(\w)")
29
+ _interpolate_regexp: Pattern[str] = re.compile(r"(?:(^|[^%])%([0+\- ]*)(\d+)?(?:\.(\d+))?(\w))?%P\(\)")
30
+ _format_regexp: Pattern[str] = re.compile(r"\{(\d+)(,-?\d+)?(?:\:([a-zA-Z])(\d{0,2})|\:(.+?))?\}")
31
+
32
+
33
+ IPrintfFormatContinuation = Callable[[Callable[[str], Any]], Callable[[str], Any]]
34
+
35
+
36
+ @dataclass
37
+ class IPrintfFormat:
38
+ input: str
39
+ cont: IPrintfFormatContinuation
40
+
41
+
42
+ def printf(input: str) -> IPrintfFormat:
43
+ format: IPrintfFormatContinuation = fs_format(input)
44
+ return IPrintfFormat(input=input, cont=format)
45
+
46
+
47
+ def continue_print(cont: Callable[[str], Any], arg: IPrintfFormat | str) -> Any:
48
+ """Print continuation."""
49
+
50
+ if isinstance(arg, IPrintfFormat):
51
+ ret = arg.cont(cont)
52
+ return ret
53
+
54
+ return cont(arg)
55
+
56
+
57
+ def to_console(arg: IPrintfFormat | Any) -> Any:
58
+ return continue_print(print, arg)
59
+
60
+
61
+ def to_console_error(arg: IPrintfFormat | str):
62
+ return continue_print(lambda x: print(x), arg) # noqa: T201
63
+
64
+
65
+ def to_text(arg: IPrintfFormat | str) -> str | Callable[..., Any]:
66
+ def cont(x: str) -> Any:
67
+ return x
68
+
69
+ return continue_print(cont, arg)
70
+
71
+
72
+ def to_fail(arg: IPrintfFormat | str):
73
+ def fail(msg: str):
74
+ raise Exception(msg)
75
+
76
+ return continue_print(fail, arg)
77
+
78
+
79
+ def format_replacement(rep: Any, flags: Any, padLength: Any, precision: Any, format: Any):
80
+ sign = ""
81
+ flags = flags or ""
82
+ format = format or ""
83
+
84
+ if isinstance(rep, int | float):
85
+ if format not in ["x", "X"]:
86
+ if rep < 0:
87
+ rep = rep * -1
88
+ sign = "-"
89
+ else:
90
+ if flags.find(" ") >= 0:
91
+ sign = " "
92
+ elif flags.find("+") >= 0:
93
+ sign = "+"
94
+
95
+ if format == "x":
96
+ rep = to_hex(cast(int, rep))
97
+ elif format == "X":
98
+ rep = to_hex(cast(int, rep)).upper()
99
+ if format in ("f", "F"):
100
+ precision = int(precision) if precision is not None else 6
101
+ rep = to_fixed(rep, precision)
102
+ elif format in ("g", "G"):
103
+ rep = to_precision(rep, precision) if precision is not None else to_precision(rep)
104
+ elif format in ("e", "E"):
105
+ rep = to_exponential(rep, precision) if precision is not None else to_exponential(rep)
106
+ else: # AOid
107
+ rep = to_string(rep)
108
+
109
+ elif isinstance(rep, datetime):
110
+ rep = date_to_string(rep)
111
+ else:
112
+ rep = to_string(rep)
113
+
114
+ if padLength is not None:
115
+ padLength = int(padLength)
116
+ zeroFlag = flags.find("0") >= 0 # Use '0' for left padding
117
+ minusFlag = flags.find("-") >= 0 # Right padding
118
+ ch = " " if minusFlag or not zeroFlag else "0"
119
+ if ch == "0":
120
+ rep = pad_left(rep, padLength - len(sign), ch, minusFlag)
121
+ rep = sign + rep
122
+ else:
123
+ rep = pad_left(sign + rep, padLength, ch, minusFlag)
124
+
125
+ else:
126
+ rep = sign + rep
127
+
128
+ return rep
129
+
130
+
131
+ def interpolate(string: str, values: list[Any]) -> str:
132
+ valIdx = 0
133
+ strIdx = 0
134
+ result = ""
135
+ matches = _interpolate_regexp.finditer(string)
136
+ for match in matches:
137
+ # The first group corresponds to the no-escape char (^|[^%]), the actual pattern starts in the next char
138
+ # Note: we don't use negative lookbehind because some browsers don't support it yet
139
+ matchIndex = match.start() + len(match[1] or "")
140
+ result += string[strIdx:matchIndex].replace("%%", "%")
141
+ [_, flags, padLength, precision, format] = match.groups()
142
+ result += format_replacement(values[valIdx], flags, padLength, precision, format)
143
+ valIdx += 1
144
+
145
+ strIdx = match.end()
146
+
147
+ result += string[strIdx:].replace("%%", "%")
148
+ return result
149
+
150
+
151
+ def format_once(str2: str, rep: Any):
152
+ def match(m: Match[str]):
153
+ prefix, flags, pad_length, precision, format = m.groups()
154
+ once: str = format_replacement(rep, flags, pad_length, precision, format)
155
+ return prefix + once.replace("%", "%%")
156
+
157
+ ret = _fs_format_regexp.sub(match, str2, count=1)
158
+ return ret
159
+
160
+
161
+ def create_printer(string: str, cont: Callable[..., Any]):
162
+ def _(*args: Any):
163
+ str_copy: str = string
164
+ for arg in args:
165
+ str_copy = format_once(str_copy, arg)
166
+
167
+ if _fs_format_regexp.search(str_copy):
168
+ return create_printer(str_copy, cont)
169
+ return cont(str_copy.replace("%%", "%"))
170
+
171
+ return _
172
+
173
+
174
+ def fs_format(str: str) -> Callable[[Callable[..., Any]], Any]:
175
+ def _(cont: Callable[..., Any]):
176
+ if _fs_format_regexp.search(str):
177
+ return create_printer(str, cont)
178
+ return cont(str)
179
+
180
+ return _
181
+
182
+
183
+ def format(string: str, *args: Any) -> str:
184
+ if not string and args:
185
+ # Called with culture info
186
+ string = args[0]
187
+ args = args[1:]
188
+
189
+ def match(m: Match[str]) -> str:
190
+ idx, padLength, format, precision_, pattern = list(m.groups())
191
+ rep = args[int(idx)]
192
+ if isinstance(rep, int | float):
193
+ precision: int | None = None
194
+ try:
195
+ precision: int | None = int(precision_)
196
+ except Exception:
197
+ pass
198
+
199
+ if format in ["f", "F"]:
200
+ precision = precision if precision is not None else 2
201
+ rep = to_fixed(rep, precision)
202
+
203
+ elif format in ["g", "G"]:
204
+ rep = to_precision(rep, precision) if precision is not None else to_precision(rep)
205
+
206
+ elif format in ["e", "E"]:
207
+ rep = to_exponential(rep, precision) if precision is not None else to_exponential(rep)
208
+
209
+ elif format in ["p", "P"]:
210
+ precision = precision if precision is not None else 2
211
+ rep = to_fixed(multiply(rep, 100), precision) + " %"
212
+
213
+ elif format in ["d", "D"]:
214
+ rep = pad_left(str(rep), precision, "0") if precision is not None else str(rep)
215
+
216
+ elif format in ["x", "X"] and isinstance(rep, int):
217
+ rep = pad_left(to_hex(rep), precision, "0") if precision is not None else to_hex(rep)
218
+ if format == "X":
219
+ rep = rep.upper()
220
+ elif pattern:
221
+ sign = ""
222
+
223
+ def match(m: Match[str]):
224
+ nonlocal sign, rep
225
+
226
+ intPart, decimalPart = list(m.groups())
227
+ if rep < 0:
228
+ rep = multiply(rep, -1)
229
+ sign = "-"
230
+
231
+ rep = to_fixed(rep, len(decimalPart) - 1 if decimalPart else 0)
232
+ return pad_left(
233
+ rep,
234
+ len(intPart or "") - len(sign) + (len(decimalPart) if decimalPart else 0),
235
+ "0",
236
+ )
237
+
238
+ rep = re.sub(r"(0+)(\.0+)?", match, pattern)
239
+ rep = sign + rep
240
+
241
+ elif isinstance(rep, datetime):
242
+ rep = date_to_string(rep, pattern or format)
243
+ else:
244
+ rep = to_string(rep)
245
+
246
+ try:
247
+ padLength = int((padLength or " ")[1:])
248
+ rep = pad_left(str(rep), abs(padLength), " ", padLength < 0)
249
+ except ValueError:
250
+ pass
251
+
252
+ return str(rep)
253
+
254
+ return _format_regexp.sub(match, string)
255
+
256
+
257
+ def initialize(n: int, f: Callable[[int], str]) -> str:
258
+ if n < 0:
259
+ raise Exception("String length must be non-negative")
260
+
261
+ return "".join([f(i) for i in range(n)])
262
+
263
+
264
+ def insert(string: str, startIndex: int, value: str):
265
+ if startIndex < 0 or startIndex > len(string):
266
+ raise ValueError("startIndex is negative or greater than the length of this instance.")
267
+
268
+ return string[:startIndex] + value + string[startIndex:]
269
+
270
+
271
+ def is_null_or_empty(string: str | None):
272
+ return not isinstance(string, str) or not len(string)
273
+
274
+
275
+ def is_null_or_white_space(string: Any | None) -> bool:
276
+ return not string or not isinstance(string, str) or string.isspace()
277
+
278
+
279
+ def concat(*xs: Iterable[Any]) -> str:
280
+ return "".join(map(str, xs))
281
+
282
+
283
+ def join(delimiter: str, xs: Iterable[Any]) -> str:
284
+ return delimiter.join(str(x) for x in xs)
285
+
286
+
287
+ def join_with_indices(delimiter: str, xs: list[str], startIndex: int, count: int):
288
+ endIndexPlusOne = startIndex + count
289
+ if endIndexPlusOne > len(xs):
290
+ raise ValueError("Index and count must refer to a location within the buffer.")
291
+
292
+ return delimiter.join(xs[startIndex:endIndexPlusOne])
293
+
294
+
295
+ def not_supported(name: str) -> NoReturn:
296
+ raise Exception("The environment doesn't support '" + name + "', please use a polyfill.")
297
+
298
+
299
+ def to_base64string(in_array: bytes) -> str:
300
+ return b64encode(in_array).decode("utf8")
301
+
302
+
303
+ def from_base64string(b64encoded: str) -> bytes:
304
+ return b64decode(b64encoded)
305
+
306
+
307
+ def pad_left(string: str, length: int, ch: str | None = None, isRight: bool | None = False) -> str:
308
+ ch = ch or " "
309
+ length = length - len(string)
310
+ for _ in range(length):
311
+ string = string + ch if isRight else ch + string
312
+
313
+ return string
314
+
315
+
316
+ def pad_right(string: str, len: int, ch: str | None = None) -> str:
317
+ return pad_left(string, len, ch, True)
318
+
319
+
320
+ def remove(string: str, startIndex: int, count: int | None = None):
321
+ if startIndex >= len(string):
322
+ raise ValueError("startIndex must be less than length of string")
323
+
324
+ if count and (startIndex + count) > len(string):
325
+ raise ValueError("Index and count must refer to a location within the string.")
326
+
327
+ return string[:startIndex] + (string[startIndex + count :] if count is not None else "")
328
+
329
+
330
+ def replace(string: str, search: str, replace: str):
331
+ return string.replace(search, replace)
332
+
333
+
334
+ def replicate(n: int, x: str) -> str:
335
+ return initialize(n, lambda _=0: x)
336
+
337
+
338
+ def get_char_at_index(input: str, index: int):
339
+ if index < 0 or index >= len(input):
340
+ raise ValueError("Index was outside the bounds of the array.")
341
+
342
+ return input[index]
343
+
344
+
345
+ def split(
346
+ string: str,
347
+ splitters: str | list[str],
348
+ count: int | None = None,
349
+ removeEmpty: int = 0,
350
+ ) -> list[str]:
351
+ """Split string
352
+
353
+ Returns a string array that contains the substrings in this instance
354
+ that are delimited by elements of a specified string or Unicode
355
+ character array."""
356
+
357
+ if count and count < 0:
358
+ raise ValueError("Count cannot be less than zero")
359
+
360
+ if count == 0:
361
+ return []
362
+
363
+ if isinstance(splitters, str):
364
+ if not removeEmpty:
365
+ return string.split(splitters, count - 1 if count else -1)
366
+
367
+ splitters = [splitters]
368
+
369
+ splitters = [escape(x) for x in splitters] or [" "]
370
+
371
+ i = 0
372
+ splits: list[str] = []
373
+ matches = re.finditer("|".join(splitters), string)
374
+ for m in matches:
375
+ if count is not None and count <= 1:
376
+ break
377
+
378
+ split = string[i : m.start()]
379
+ if split or not removeEmpty:
380
+ splits.append(split)
381
+
382
+ count = count - 1 if count is not None else count
383
+
384
+ i = m.end()
385
+
386
+ if (count is None or count and count > 0) and len(string) - i > -1:
387
+ split = string[i:]
388
+ if split or not removeEmpty:
389
+ splits.append(split)
390
+
391
+ return splits
392
+
393
+
394
+ def trim(string: str, *chars: str) -> str:
395
+ if not len(chars):
396
+ return string.strip()
397
+
398
+ pattern = "[" + escape("".join(chars)) + "]+"
399
+ return re.sub(pattern + "$", "", re.sub("^" + pattern, "", string))
400
+
401
+
402
+ def trim_start(string: str, *chars: str) -> str:
403
+ if not len(chars):
404
+ return string.lstrip()
405
+
406
+ return re.sub("^[" + escape("".join(chars)) + "]+", "", string)
407
+
408
+
409
+ def trim_end(string: str, *chars: str) -> str:
410
+ if not len(chars):
411
+ return string.rstrip()
412
+
413
+ return re.sub("[" + escape("".join(chars)) + "]+$", "", string)
414
+
415
+
416
+ def filter(pred: Callable[[str], bool], x: str) -> str:
417
+ return "".join(c for c in x if pred(c))
418
+
419
+
420
+ def substring(string: str, startIndex: int, length: int | None = None) -> str:
421
+ if startIndex + (length or 0) > len(string):
422
+ raise ValueError("Invalid startIndex and/or length")
423
+
424
+ if length is not None:
425
+ return string[startIndex : startIndex + length]
426
+
427
+ return string[startIndex:]
428
+
429
+
430
+ def to_char_array2(string: str, startIndex: int, length: int) -> list[str]:
431
+ return list(substring(string, startIndex, length))
432
+
433
+
434
+ class StringComparison(IntEnum):
435
+ CurrentCulture = 0
436
+ CurrentCultureIgnoreCase = 1
437
+ InvariantCulture = 2
438
+ InvariantCultureIgnoreCase = 3
439
+ Ordinal = 4
440
+ OrdinalIgnoreCase = 5
441
+
442
+
443
+ def cmp(x: str, y: str, ic: bool | StringComparison) -> int:
444
+ def is_ignore_case(i: bool | StringComparison) -> bool:
445
+ return (
446
+ i is True
447
+ or i == StringComparison.CurrentCultureIgnoreCase
448
+ or i == StringComparison.InvariantCultureIgnoreCase
449
+ or i == StringComparison.OrdinalIgnoreCase
450
+ )
451
+
452
+ def is_ordinal(i: bool | int) -> bool:
453
+ return i == StringComparison.Ordinal or i == StringComparison.OrdinalIgnoreCase
454
+
455
+ if not x:
456
+ return 0 if not y else -1
457
+ if not y:
458
+ return 1 # everything is bigger than None
459
+
460
+ if is_ordinal(ic):
461
+ if is_ignore_case(ic):
462
+ x = x.lower()
463
+ y = y.lower()
464
+
465
+ return 0 if x == y else -1 if x < y else 1
466
+ elif is_ignore_case(ic):
467
+ x = x.lower()
468
+ y = y.lower()
469
+
470
+ return locale.strcoll(x, y)
471
+
472
+
473
+ @overload
474
+ def compare(string1: str, string2: str, /) -> int:
475
+ """Compares two specified String objects and returns an integer that
476
+ indicates their relative position in the sort order."""
477
+ ...
478
+
479
+
480
+ @overload
481
+ def compare(string1: str, string2: str, ignore_case: bool, culture: StringComparison, /) -> int: ...
482
+
483
+
484
+ def compare(*args: Any) -> int:
485
+ """Compares two specified String objects and returns an integer that
486
+ indicates their relative position in the sort order.
487
+
488
+ All overloads of the Compare method return a 32-bit signed integer
489
+ indicating the lexical relationship between the two comparands.
490
+
491
+ - Less than zero: The first substring precedes the second
492
+ substring in the sort order.
493
+ - Zero: The substrings occur in the same position in the sort
494
+ order, or length is zero.
495
+ - Greater than zero: The first substring follows the second
496
+ substring in the sort order.
497
+
498
+ Returns:
499
+ Integer that indicates the relationship of the two substrings
500
+ to each other in the sort order:
501
+ """
502
+ length = len(args)
503
+
504
+ if length == 2:
505
+ return cmp(args[0], args[1], False)
506
+ if length == 3:
507
+ return cmp(args[0], args[1], args[2])
508
+ if length == 4:
509
+ return cmp(args[0], args[1], args[2])
510
+ if length == 5:
511
+ return cmp(args[0][args[1] : args[4] + 1], args[2][args[3] : args[4] + 1], False)
512
+ if length == 6:
513
+ return cmp(args[0][args[1] : args[4] + 1], args[2][args[3] : args[4] + 1], args[5])
514
+ if length == 7:
515
+ return cmp(args[0][args[1] : args[4] + 1], args[2][args[3] : args[4] + 1], args[5])
516
+ raise Exception("String.compare: Unsupported number of parameters")
517
+
518
+
519
+ def compare_to(this: str, other: str) -> int:
520
+ """Compare this string with other
521
+
522
+ Compares this instance with a specified String object and indicates
523
+ whether this instance precedes, follows, or appears in the same
524
+ position in the sort order as the specified string.
525
+ """
526
+ return cmp(this, other, StringComparison.CurrentCulture)
527
+
528
+
529
+ def ends_with_exact(string: str, pattern: str):
530
+ idx = string.rfind(pattern)
531
+ return idx >= 0 and idx == len(string) - len(pattern)
532
+
533
+
534
+ def ends_with(string: str, pattern: str, ic: bool | StringComparison):
535
+ if len(string) >= len(pattern):
536
+ return cmp(string[len(string) - len(pattern) : len(string)], pattern, ic) == 0
537
+ return False
538
+
539
+
540
+ def starts_with_exact(string: str, pattern: str):
541
+ idx = string.find(pattern)
542
+ return idx == 0
543
+
544
+
545
+ def starts_with(string: str, pattern: str, ic: bool | StringComparison):
546
+ if len(string) >= len(pattern):
547
+ return cmp(string[0 : len(pattern)], pattern, ic) == 0
548
+ return False
549
+
550
+
551
+ def index_of_any(string: str, any_of: list[str], *args: int):
552
+ if not string:
553
+ return -1
554
+
555
+ start_index = args[0] if len(args) > 0 else 0
556
+ if start_index < 0:
557
+ raise ValueError("Start index cannot be negative")
558
+
559
+ length = args[1] if len(args) > 1 else len(string) - start_index
560
+ if length < 0:
561
+ raise ValueError("Length cannot be negative")
562
+
563
+ if length > len(string) - start_index:
564
+ raise ValueError("Invalid start_index and length")
565
+
566
+ string = string[start_index:length]
567
+ any_of_str = "".join(any_of)
568
+ for i, c in enumerate(string):
569
+ index = any_of_str.find(c)
570
+ if index > -1:
571
+ return i + start_index
572
+
573
+ return -1