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.
- arctrl/__init__.py +18 -0
- arctrl/py/CWL/__init__.py +0 -0
- arctrl/py/CWL/cwltypes.py +150 -0
- arctrl/py/CWL/decode.py +973 -0
- arctrl/py/CWL/encode.py +1 -0
- arctrl/py/CWL/inputs.py +88 -0
- arctrl/py/CWL/outputs.py +85 -0
- arctrl/py/CWL/requirements.py +77 -0
- arctrl/py/CWL/tool_description.py +103 -0
- arctrl/py/CWL/workflow_description.py +104 -0
- arctrl/py/CWL/workflow_steps.py +113 -0
- arctrl/py/Contract/__init__.py +0 -0
- arctrl/py/Contract/arc.py +60 -0
- arctrl/py/Contract/arc_assay.py +125 -0
- arctrl/py/Contract/arc_investigation.py +88 -0
- arctrl/py/Contract/arc_run.py +125 -0
- arctrl/py/Contract/arc_study.py +126 -0
- arctrl/py/Contract/arc_workflow.py +125 -0
- arctrl/py/Contract/contract.py +153 -0
- arctrl/py/Contract/datamap.py +372 -0
- arctrl/py/Contract/git.py +118 -0
- arctrl/py/Contract/validation_packages_config.py +107 -0
- arctrl/py/ContractIO/__init__.py +0 -0
- arctrl/py/ContractIO/contract_io.py +344 -0
- arctrl/py/ContractIO/file_system_helper.py +264 -0
- arctrl/py/Core/Helper/__init__.py +0 -0
- arctrl/py/Core/Helper/collections_.py +438 -0
- arctrl/py/Core/Helper/date_time.py +26 -0
- arctrl/py/Core/Helper/hash_codes.py +60 -0
- arctrl/py/Core/Helper/identifier.py +248 -0
- arctrl/py/Core/Helper/orcid.py +42 -0
- arctrl/py/Core/Helper/printer.py +13 -0
- arctrl/py/Core/Helper/regex.py +554 -0
- arctrl/py/Core/Helper/sem_ver.py +71 -0
- arctrl/py/Core/Helper/url.py +148 -0
- arctrl/py/Core/Process/__init__.py +0 -0
- arctrl/py/Core/Process/column_index.py +280 -0
- arctrl/py/Core/Process/component.py +200 -0
- arctrl/py/Core/Process/factor.py +151 -0
- arctrl/py/Core/Process/factor_value.py +182 -0
- arctrl/py/Core/Process/material.py +74 -0
- arctrl/py/Core/Process/material_attribute.py +95 -0
- arctrl/py/Core/Process/material_attribute_value.py +184 -0
- arctrl/py/Core/Process/material_type.py +45 -0
- arctrl/py/Core/Process/process.py +477 -0
- arctrl/py/Core/Process/process_input.py +265 -0
- arctrl/py/Core/Process/process_output.py +235 -0
- arctrl/py/Core/Process/process_parameter_value.py +200 -0
- arctrl/py/Core/Process/process_sequence.py +435 -0
- arctrl/py/Core/Process/protocol.py +175 -0
- arctrl/py/Core/Process/protocol_parameter.py +98 -0
- arctrl/py/Core/Process/sample.py +82 -0
- arctrl/py/Core/Process/source.py +62 -0
- arctrl/py/Core/Table/__init__.py +0 -0
- arctrl/py/Core/Table/arc_table.py +1264 -0
- arctrl/py/Core/Table/arc_table_aux.py +575 -0
- arctrl/py/Core/Table/arc_tables.py +591 -0
- arctrl/py/Core/Table/composite_cell.py +319 -0
- arctrl/py/Core/Table/composite_column.py +73 -0
- arctrl/py/Core/Table/composite_header.py +739 -0
- arctrl/py/Core/__init__.py +0 -0
- arctrl/py/Core/arc_types.py +5064 -0
- arctrl/py/Core/comment.py +128 -0
- arctrl/py/Core/comment_list.py +127 -0
- arctrl/py/Core/conversion.py +1313 -0
- arctrl/py/Core/data.py +245 -0
- arctrl/py/Core/data_context.py +157 -0
- arctrl/py/Core/data_file.py +112 -0
- arctrl/py/Core/data_map.py +225 -0
- arctrl/py/Core/identifier_setters.py +31 -0
- arctrl/py/Core/iproperty_value.py +36 -0
- arctrl/py/Core/ontology_annotation.py +299 -0
- arctrl/py/Core/ontology_source_reference.py +114 -0
- arctrl/py/Core/person.py +259 -0
- arctrl/py/Core/publication.py +161 -0
- arctrl/py/Core/template.py +231 -0
- arctrl/py/Core/templates.py +148 -0
- arctrl/py/Core/uri.py +11 -0
- arctrl/py/Core/value.py +188 -0
- arctrl/py/FileSystem/__init__.py +0 -0
- arctrl/py/FileSystem/commit.py +21 -0
- arctrl/py/FileSystem/default_gitattributes.py +5 -0
- arctrl/py/FileSystem/default_gitignore.py +5 -0
- arctrl/py/FileSystem/file_system.py +58 -0
- arctrl/py/FileSystem/file_system_tree.py +426 -0
- arctrl/py/FileSystem/path.py +64 -0
- arctrl/py/Json/DataMap/__init__.py +0 -0
- arctrl/py/Json/DataMap/data_context.py +101 -0
- arctrl/py/Json/DataMap/data_map.py +53 -0
- arctrl/py/Json/Process/__init__.py +0 -0
- arctrl/py/Json/Process/assay_materials.py +46 -0
- arctrl/py/Json/Process/component.py +79 -0
- arctrl/py/Json/Process/factor.py +107 -0
- arctrl/py/Json/Process/factor_value.py +101 -0
- arctrl/py/Json/Process/material.py +226 -0
- arctrl/py/Json/Process/material_attribute.py +79 -0
- arctrl/py/Json/Process/material_attribute_value.py +101 -0
- arctrl/py/Json/Process/material_type.py +53 -0
- arctrl/py/Json/Process/process.py +296 -0
- arctrl/py/Json/Process/process_input.py +83 -0
- arctrl/py/Json/Process/process_output.py +67 -0
- arctrl/py/Json/Process/process_parameter_value.py +81 -0
- arctrl/py/Json/Process/protocol.py +354 -0
- arctrl/py/Json/Process/protocol_parameter.py +79 -0
- arctrl/py/Json/Process/sample.py +277 -0
- arctrl/py/Json/Process/source.py +214 -0
- arctrl/py/Json/Process/study_materials.py +52 -0
- arctrl/py/Json/Process/value.py +56 -0
- arctrl/py/Json/ROCrate/__init__.py +0 -0
- arctrl/py/Json/ROCrate/ldcontext.py +133 -0
- arctrl/py/Json/ROCrate/ldgraph.py +111 -0
- arctrl/py/Json/ROCrate/ldnode.py +290 -0
- arctrl/py/Json/ROCrate/ldref.py +44 -0
- arctrl/py/Json/ROCrate/ldvalue.py +102 -0
- arctrl/py/Json/Table/__init__.py +0 -0
- arctrl/py/Json/Table/arc_table.py +393 -0
- arctrl/py/Json/Table/cell_table.py +83 -0
- arctrl/py/Json/Table/composite_cell.py +136 -0
- arctrl/py/Json/Table/composite_header.py +67 -0
- arctrl/py/Json/Table/iotype.py +24 -0
- arctrl/py/Json/Table/oatable.py +82 -0
- arctrl/py/Json/Table/templates.py +281 -0
- arctrl/py/Json/__init__.py +0 -0
- arctrl/py/Json/assay.py +600 -0
- arctrl/py/Json/comment.py +206 -0
- arctrl/py/Json/context/rocrate/__init__.py +0 -0
- arctrl/py/Json/context/rocrate/isa_assay_context.py +101 -0
- arctrl/py/Json/context/rocrate/isa_comment_context.py +60 -0
- arctrl/py/Json/context/rocrate/isa_component_context.py +77 -0
- arctrl/py/Json/context/rocrate/isa_data_context.py +74 -0
- arctrl/py/Json/context/rocrate/isa_factor_context.py +74 -0
- arctrl/py/Json/context/rocrate/isa_factor_value_context.py +84 -0
- arctrl/py/Json/context/rocrate/isa_investigation_context.py +110 -0
- arctrl/py/Json/context/rocrate/isa_material_attribute_context.py +64 -0
- arctrl/py/Json/context/rocrate/isa_material_attribute_value_context.py +80 -0
- arctrl/py/Json/context/rocrate/isa_material_context.py +71 -0
- arctrl/py/Json/context/rocrate/isa_ontology_annotation_context.py +68 -0
- arctrl/py/Json/context/rocrate/isa_ontology_source_reference_context.py +75 -0
- arctrl/py/Json/context/rocrate/isa_organization_context.py +55 -0
- arctrl/py/Json/context/rocrate/isa_person_context.py +131 -0
- arctrl/py/Json/context/rocrate/isa_process_context.py +94 -0
- arctrl/py/Json/context/rocrate/isa_process_parameter_value_context.py +80 -0
- arctrl/py/Json/context/rocrate/isa_protocol_context.py +97 -0
- arctrl/py/Json/context/rocrate/isa_protocol_parameter_context.py +64 -0
- arctrl/py/Json/context/rocrate/isa_publication_context.py +78 -0
- arctrl/py/Json/context/rocrate/isa_sample_context.py +65 -0
- arctrl/py/Json/context/rocrate/isa_source_context.py +66 -0
- arctrl/py/Json/context/rocrate/isa_study_context.py +125 -0
- arctrl/py/Json/context/rocrate/property_value_context.py +73 -0
- arctrl/py/Json/context/rocrate/rocrate_context.py +81 -0
- arctrl/py/Json/converter_options.py +23 -0
- arctrl/py/Json/data.py +356 -0
- arctrl/py/Json/data_file.py +63 -0
- arctrl/py/Json/decode.py +155 -0
- arctrl/py/Json/encode.py +92 -0
- arctrl/py/Json/idtable.py +44 -0
- arctrl/py/Json/investigation.py +695 -0
- arctrl/py/Json/ontology_annotation.py +404 -0
- arctrl/py/Json/ontology_source_reference.py +255 -0
- arctrl/py/Json/person.py +658 -0
- arctrl/py/Json/property_value.py +359 -0
- arctrl/py/Json/publication.py +279 -0
- arctrl/py/Json/string_table.py +76 -0
- arctrl/py/Json/study.py +793 -0
- arctrl/py/JsonIO/DataMap/__init__.py +0 -0
- arctrl/py/JsonIO/DataMap/data_map.py +53 -0
- arctrl/py/JsonIO/Process/__init__.py +0 -0
- arctrl/py/JsonIO/Process/component.py +60 -0
- arctrl/py/JsonIO/Process/factor.py +36 -0
- arctrl/py/JsonIO/Process/factor_value.py +38 -0
- arctrl/py/JsonIO/Process/material.py +60 -0
- arctrl/py/JsonIO/Process/material_attribute.py +38 -0
- arctrl/py/JsonIO/Process/material_attribute_value.py +60 -0
- arctrl/py/JsonIO/Process/material_type.py +36 -0
- arctrl/py/JsonIO/Process/process.py +60 -0
- arctrl/py/JsonIO/Process/process_input.py +38 -0
- arctrl/py/JsonIO/Process/process_output.py +60 -0
- arctrl/py/JsonIO/Process/process_parameter_value.py +60 -0
- arctrl/py/JsonIO/Process/process_sequence.py +71 -0
- arctrl/py/JsonIO/Process/protocol.py +60 -0
- arctrl/py/JsonIO/Process/protocol_parameter.py +36 -0
- arctrl/py/JsonIO/Process/sample.py +60 -0
- arctrl/py/JsonIO/Process/source.py +60 -0
- arctrl/py/JsonIO/Process/study_materials.py +52 -0
- arctrl/py/JsonIO/Process/value.py +32 -0
- arctrl/py/JsonIO/Table/__init__.py +0 -0
- arctrl/py/JsonIO/Table/arc_table.py +121 -0
- arctrl/py/JsonIO/Table/composite_cell.py +36 -0
- arctrl/py/JsonIO/Table/composite_header.py +36 -0
- arctrl/py/JsonIO/Table/compression.py +85 -0
- arctrl/py/JsonIO/Table/iotype.py +36 -0
- arctrl/py/JsonIO/Table/templates.py +113 -0
- arctrl/py/JsonIO/__init__.py +0 -0
- arctrl/py/JsonIO/assay.py +113 -0
- arctrl/py/JsonIO/comment.py +80 -0
- arctrl/py/JsonIO/data.py +60 -0
- arctrl/py/JsonIO/data_file.py +58 -0
- arctrl/py/JsonIO/decode.py +9 -0
- arctrl/py/JsonIO/encode.py +1 -0
- arctrl/py/JsonIO/investigation.py +113 -0
- arctrl/py/JsonIO/ldobject.py +106 -0
- arctrl/py/JsonIO/ontology_annotation.py +80 -0
- arctrl/py/JsonIO/ontology_source_reference.py +80 -0
- arctrl/py/JsonIO/person.py +82 -0
- arctrl/py/JsonIO/publication.py +82 -0
- arctrl/py/JsonIO/study.py +114 -0
- arctrl/py/ROCrate/Generic/__init__.py +0 -0
- arctrl/py/ROCrate/Generic/comment.py +131 -0
- arctrl/py/ROCrate/Generic/dataset.py +817 -0
- arctrl/py/ROCrate/Generic/defined_term.py +131 -0
- arctrl/py/ROCrate/Generic/file.py +237 -0
- arctrl/py/ROCrate/Generic/lab_process.py +324 -0
- arctrl/py/ROCrate/Generic/lab_protocol.py +338 -0
- arctrl/py/ROCrate/Generic/organization.py +83 -0
- arctrl/py/ROCrate/Generic/person.py +484 -0
- arctrl/py/ROCrate/Generic/postal_address.py +195 -0
- arctrl/py/ROCrate/Generic/property_value.py +696 -0
- arctrl/py/ROCrate/Generic/sample.py +202 -0
- arctrl/py/ROCrate/Generic/scholarly_article.py +229 -0
- arctrl/py/ROCrate/ISAProfile/__init__.py +0 -0
- arctrl/py/ROCrate/ISAProfile/assay.py +70 -0
- arctrl/py/ROCrate/ISAProfile/data.py +65 -0
- arctrl/py/ROCrate/ISAProfile/dataset.py +24 -0
- arctrl/py/ROCrate/ISAProfile/investigation.py +73 -0
- arctrl/py/ROCrate/ISAProfile/lab_process.py +162 -0
- arctrl/py/ROCrate/ISAProfile/lab_protocol.py +37 -0
- arctrl/py/ROCrate/ISAProfile/person.py +72 -0
- arctrl/py/ROCrate/ISAProfile/property_value.py +98 -0
- arctrl/py/ROCrate/ISAProfile/sample.py +64 -0
- arctrl/py/ROCrate/ISAProfile/scholarly_article.py +98 -0
- arctrl/py/ROCrate/ISAProfile/study.py +74 -0
- arctrl/py/ROCrate/__init__.py +0 -0
- arctrl/py/ROCrate/arc_rocrate_metadata.py +39 -0
- arctrl/py/ROCrate/dyn_obj_extensions.py +1 -0
- arctrl/py/ROCrate/helper.py +8 -0
- arctrl/py/ROCrate/ldcontext.py +362 -0
- arctrl/py/ROCrate/ldobject.py +1247 -0
- arctrl/py/ROCrate/rocrate_context.py +51 -0
- arctrl/py/Spreadsheet/AnnotationTable/__init__.py +0 -0
- arctrl/py/Spreadsheet/AnnotationTable/arc_table.py +193 -0
- arctrl/py/Spreadsheet/AnnotationTable/composite_cell.py +78 -0
- arctrl/py/Spreadsheet/AnnotationTable/composite_column.py +210 -0
- arctrl/py/Spreadsheet/AnnotationTable/composite_header.py +623 -0
- arctrl/py/Spreadsheet/DataMapTable/__init__.py +0 -0
- arctrl/py/Spreadsheet/DataMapTable/data_map_column.py +114 -0
- arctrl/py/Spreadsheet/DataMapTable/data_map_header.py +618 -0
- arctrl/py/Spreadsheet/DataMapTable/data_map_table.py +119 -0
- arctrl/py/Spreadsheet/Metadata/__init__.py +0 -0
- arctrl/py/Spreadsheet/Metadata/assays.py +125 -0
- arctrl/py/Spreadsheet/Metadata/comment.py +77 -0
- arctrl/py/Spreadsheet/Metadata/contacts.py +134 -0
- arctrl/py/Spreadsheet/Metadata/conversions.py +190 -0
- arctrl/py/Spreadsheet/Metadata/design_descriptors.py +34 -0
- arctrl/py/Spreadsheet/Metadata/factors.py +107 -0
- arctrl/py/Spreadsheet/Metadata/ontology_annotation.py +88 -0
- arctrl/py/Spreadsheet/Metadata/ontology_source_reference.py +96 -0
- arctrl/py/Spreadsheet/Metadata/protocols.py +146 -0
- arctrl/py/Spreadsheet/Metadata/publication.py +122 -0
- arctrl/py/Spreadsheet/Metadata/run.py +122 -0
- arctrl/py/Spreadsheet/Metadata/sparse_table.py +508 -0
- arctrl/py/Spreadsheet/Metadata/study.py +312 -0
- arctrl/py/Spreadsheet/Metadata/workflow.py +151 -0
- arctrl/py/Spreadsheet/__init__.py +0 -0
- arctrl/py/Spreadsheet/arc_assay.py +233 -0
- arctrl/py/Spreadsheet/arc_investigation.py +418 -0
- arctrl/py/Spreadsheet/arc_run.py +190 -0
- arctrl/py/Spreadsheet/arc_study.py +144 -0
- arctrl/py/Spreadsheet/arc_workflow.py +176 -0
- arctrl/py/Spreadsheet/assembly_info.py +1 -0
- arctrl/py/Spreadsheet/collection_aux.py +167 -0
- arctrl/py/Spreadsheet/data_map.py +44 -0
- arctrl/py/Spreadsheet/template.py +460 -0
- arctrl/py/ValidationPackages/__init__.py +0 -0
- arctrl/py/ValidationPackages/validation_package.py +82 -0
- arctrl/py/ValidationPackages/validation_packages_config.py +132 -0
- arctrl/py/WebRequest/__init__.py +0 -0
- arctrl/py/WebRequest/web_request.py +9 -0
- arctrl/py/WebRequest/web_request_py.py +135 -0
- arctrl/py/Yaml/__init__.py +0 -0
- arctrl/py/Yaml/decode.py +1 -0
- arctrl/py/Yaml/encode.py +10 -0
- arctrl/py/Yaml/validation_package.py +77 -0
- arctrl/py/Yaml/validation_packages_config.py +86 -0
- arctrl/py/__init__.py +0 -0
- arctrl/py/arc.py +1400 -0
- arctrl/py/column_index.py +280 -0
- arctrl/py/conversion.py +2184 -0
- arctrl/py/cross_async.py +76 -0
- arctrl/py/fable_modules/dynamic_obj/__init__.py +0 -0
- arctrl/py/fable_modules/dynamic_obj/dyn_obj.py +136 -0
- arctrl/py/fable_modules/dynamic_obj/dynamic_obj.py +415 -0
- arctrl/py/fable_modules/dynamic_obj/fable_js.py +1 -0
- arctrl/py/fable_modules/dynamic_obj/fable_py.py +288 -0
- arctrl/py/fable_modules/dynamic_obj/hash_codes.py +82 -0
- arctrl/py/fable_modules/dynamic_obj/property_helper.py +25 -0
- arctrl/py/fable_modules/dynamic_obj/reflection_utils.py +87 -0
- arctrl/py/fable_modules/fable_library/__init__.py +0 -0
- arctrl/py/fable_modules/fable_library/array_.py +1528 -0
- arctrl/py/fable_modules/fable_library/async_.py +377 -0
- arctrl/py/fable_modules/fable_library/async_builder.py +379 -0
- arctrl/py/fable_modules/fable_library/big_int.py +330 -0
- arctrl/py/fable_modules/fable_library/bit_converter.py +131 -0
- arctrl/py/fable_modules/fable_library/boolean.py +26 -0
- arctrl/py/fable_modules/fable_library/char.py +237 -0
- arctrl/py/fable_modules/fable_library/choice.py +212 -0
- arctrl/py/fable_modules/fable_library/date.py +779 -0
- arctrl/py/fable_modules/fable_library/date_offset.py +79 -0
- arctrl/py/fable_modules/fable_library/decimal_.py +190 -0
- arctrl/py/fable_modules/fable_library/diagnostics.py +54 -0
- arctrl/py/fable_modules/fable_library/double.py +87 -0
- arctrl/py/fable_modules/fable_library/encoding.py +41 -0
- arctrl/py/fable_modules/fable_library/event.py +206 -0
- arctrl/py/fable_modules/fable_library/file.py +107 -0
- arctrl/py/fable_modules/fable_library/fsharp_collections.py +52 -0
- arctrl/py/fable_modules/fable_library/fsharp_core.py +123 -0
- arctrl/py/fable_modules/fable_library/global_.py +63 -0
- arctrl/py/fable_modules/fable_library/guid.py +41 -0
- arctrl/py/fable_modules/fable_library/int32.py +73 -0
- arctrl/py/fable_modules/fable_library/list.py +1788 -0
- arctrl/py/fable_modules/fable_library/long.py +240 -0
- arctrl/py/fable_modules/fable_library/mailbox_processor.py +179 -0
- arctrl/py/fable_modules/fable_library/map.py +1854 -0
- arctrl/py/fable_modules/fable_library/map_util.py +148 -0
- arctrl/py/fable_modules/fable_library/mutable_map.py +397 -0
- arctrl/py/fable_modules/fable_library/mutable_set.py +279 -0
- arctrl/py/fable_modules/fable_library/native.py +45 -0
- arctrl/py/fable_modules/fable_library/numeric.py +46 -0
- arctrl/py/fable_modules/fable_library/observable.py +222 -0
- arctrl/py/fable_modules/fable_library/option.py +128 -0
- arctrl/py/fable_modules/fable_library/path.py +62 -0
- arctrl/py/fable_modules/fable_library/range.py +117 -0
- arctrl/py/fable_modules/fable_library/reflection.py +463 -0
- arctrl/py/fable_modules/fable_library/reg_exp.py +137 -0
- arctrl/py/fable_modules/fable_library/resize_array.py +31 -0
- arctrl/py/fable_modules/fable_library/result.py +212 -0
- arctrl/py/fable_modules/fable_library/seq.py +1979 -0
- arctrl/py/fable_modules/fable_library/seq2.py +221 -0
- arctrl/py/fable_modules/fable_library/set.py +2414 -0
- arctrl/py/fable_modules/fable_library/singleton_local_time_zone.py +36 -0
- arctrl/py/fable_modules/fable_library/string_.py +573 -0
- arctrl/py/fable_modules/fable_library/system_collections_generic.py +462 -0
- arctrl/py/fable_modules/fable_library/system_text.py +237 -0
- arctrl/py/fable_modules/fable_library/task.py +116 -0
- arctrl/py/fable_modules/fable_library/task_builder.py +122 -0
- arctrl/py/fable_modules/fable_library/thread.py +5 -0
- arctrl/py/fable_modules/fable_library/time_span.py +283 -0
- arctrl/py/fable_modules/fable_library/timer.py +24 -0
- arctrl/py/fable_modules/fable_library/types.py +401 -0
- arctrl/py/fable_modules/fable_library/uri.py +109 -0
- arctrl/py/fable_modules/fable_library/util.py +2735 -0
- arctrl/py/fable_modules/fable_openpyxl/__init__.py +0 -0
- arctrl/py/fable_modules/fable_openpyxl/openpyxl.py +362 -0
- arctrl/py/fable_modules/fable_python/cognite-sdk/__init__.py +0 -0
- arctrl/py/fable_modules/fable_python/cognite-sdk/cognite_sdk.py +22 -0
- arctrl/py/fable_modules/fable_python/flask/__init__.py +0 -0
- arctrl/py/fable_modules/fable_python/flask/flask.py +34 -0
- arctrl/py/fable_modules/fable_python/jupyter/__init__.py +0 -0
- arctrl/py/fable_modules/fable_python/jupyter/ipy_widgets.py +47 -0
- arctrl/py/fable_modules/fable_python/jupyter/ipython.py +13 -0
- arctrl/py/fable_modules/fable_python/stdlib/__init__.py +0 -0
- arctrl/py/fable_modules/fable_python/stdlib/ast.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/asyncio/__init__.py +0 -0
- arctrl/py/fable_modules/fable_python/stdlib/asyncio/events.py +17 -0
- arctrl/py/fable_modules/fable_python/stdlib/asyncio/futures.py +52 -0
- arctrl/py/fable_modules/fable_python/stdlib/asyncio/tasks.py +38 -0
- arctrl/py/fable_modules/fable_python/stdlib/base64_.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/builtins_.py +38 -0
- arctrl/py/fable_modules/fable_python/stdlib/html.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/json.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/math_.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/os_.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/queue_.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/string_.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/sys_.py +30 -0
- arctrl/py/fable_modules/fable_python/stdlib/time_.py +1 -0
- arctrl/py/fable_modules/fable_python/stdlib/tk_inter.py +1 -0
- arctrl/py/fable_modules/fs_spreadsheet/Cells/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cell.py +338 -0
- arctrl/py/fable_modules/fs_spreadsheet/Cells/fs_cells_collection.py +469 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/cell_builder.py +214 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/column_builder.py +139 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/dsl.py +50 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/expression.py +65 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/operators.py +9 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/row_builder.py +139 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/sheet_builder.py +118 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/table_builder.py +122 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/transform.py +464 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/types.py +314 -0
- arctrl/py/fable_modules/fs_spreadsheet/DSL/workbook_builder.py +106 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/cell.py +103 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/column.py +70 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/row.py +70 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/table.py +57 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/value.py +93 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/workbook.py +71 -0
- arctrl/py/fable_modules/fs_spreadsheet/Json/worksheet.py +217 -0
- arctrl/py/fable_modules/fs_spreadsheet/Ranges/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range.py +47 -0
- arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_address.py +186 -0
- arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_base.py +90 -0
- arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_column.py +78 -0
- arctrl/py/fable_modules/fs_spreadsheet/Ranges/fs_range_row.py +48 -0
- arctrl/py/fable_modules/fs_spreadsheet/Tables/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table.py +393 -0
- arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_field.py +127 -0
- arctrl/py/fable_modules/fs_spreadsheet/Tables/fs_table_row.py +23 -0
- arctrl/py/fable_modules/fs_spreadsheet/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet/fs_address.py +218 -0
- arctrl/py/fable_modules/fs_spreadsheet/fs_column.py +172 -0
- arctrl/py/fable_modules/fs_spreadsheet/fs_row.py +183 -0
- arctrl/py/fable_modules/fs_spreadsheet/fs_workbook.py +180 -0
- arctrl/py/fable_modules/fs_spreadsheet/fs_worksheet.py +600 -0
- arctrl/py/fable_modules/fs_spreadsheet/sheet_builder.py +330 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/__init__.py +0 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/cell.py +63 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/cell_type.py +50 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/fs_extension.py +60 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/json.py +47 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/table.py +53 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/workbook.py +40 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/worksheet.py +54 -0
- arctrl/py/fable_modules/fs_spreadsheet_py/xlsx.py +37 -0
- arctrl/py/fable_modules/thoth_json_core/__init__.py +0 -0
- arctrl/py/fable_modules/thoth_json_core/decode.py +1588 -0
- arctrl/py/fable_modules/thoth_json_core/encode.py +261 -0
- arctrl/py/fable_modules/thoth_json_core/types.py +181 -0
- arctrl/py/fable_modules/thoth_json_python/__init__.py +0 -0
- arctrl/py/fable_modules/thoth_json_python/decode.py +112 -0
- arctrl/py/fable_modules/thoth_json_python/encode.py +72 -0
- arctrl/py/fable_modules/thoth_json_python/python.py +1 -0
- arctrl/py/fable_modules/yamlicious/Interop/__init__.py +0 -0
- arctrl/py/fable_modules/yamlicious/Interop/js_interop.py +1 -0
- arctrl/py/fable_modules/yamlicious/Interop/py_interop.py +7 -0
- arctrl/py/fable_modules/yamlicious/__init__.py +0 -0
- arctrl/py/fable_modules/yamlicious/decode.py +1784 -0
- arctrl/py/fable_modules/yamlicious/encode.py +84 -0
- arctrl/py/fable_modules/yamlicious/library.py +10 -0
- arctrl/py/fable_modules/yamlicious/persil.py +57 -0
- arctrl/py/fable_modules/yamlicious/preprocessing.py +99 -0
- arctrl/py/fable_modules/yamlicious/reader.py +665 -0
- arctrl/py/fable_modules/yamlicious/regex.py +21 -0
- arctrl/py/fable_modules/yamlicious/regex_active_patterns.py +256 -0
- arctrl/py/fable_modules/yamlicious/writer.py +175 -0
- arctrl/py/fable_modules/yamlicious/yamlicious_types.py +128 -0
- arctrl/py/json.py +213 -0
- arctrl/py/rocrate_io.py +72 -0
- arctrl/py/template_web.py +23 -0
- arctrl/py/xlsx.py +148 -0
- arctrl/rocrate.py +21 -0
- arctrl-3.0.0a3.dist-info/LICENSE +21 -0
- arctrl-3.0.0a3.dist-info/METADATA +119 -0
- arctrl-3.0.0a3.dist-info/RECORD +456 -0
- 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]
|