dsp-tools 0.9.13__py3-none-any.whl → 18.3.0.post13__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.
- dsp_tools/__init__.py +5 -0
- dsp_tools/cli/args.py +47 -0
- dsp_tools/cli/call_action.py +85 -0
- dsp_tools/cli/call_action_files_only.py +101 -0
- dsp_tools/cli/call_action_with_network.py +207 -0
- dsp_tools/cli/create_parsers.py +479 -0
- dsp_tools/cli/entry_point.py +322 -0
- dsp_tools/cli/utils.py +87 -0
- dsp_tools/clients/CLAUDE.md +420 -0
- dsp_tools/clients/authentication_client.py +14 -0
- dsp_tools/clients/authentication_client_live.py +66 -0
- dsp_tools/clients/connection.py +35 -0
- dsp_tools/clients/connection_live.py +233 -0
- dsp_tools/clients/fuseki_metrics.py +60 -0
- dsp_tools/clients/group_user_clients.py +35 -0
- dsp_tools/clients/group_user_clients_live.py +181 -0
- dsp_tools/clients/legal_info_client.py +23 -0
- dsp_tools/clients/legal_info_client_live.py +132 -0
- dsp_tools/clients/list_client.py +49 -0
- dsp_tools/clients/list_client_live.py +166 -0
- dsp_tools/clients/metadata_client.py +24 -0
- dsp_tools/clients/metadata_client_live.py +47 -0
- dsp_tools/clients/ontology_clients.py +49 -0
- dsp_tools/clients/ontology_create_client_live.py +166 -0
- dsp_tools/clients/ontology_get_client_live.py +80 -0
- dsp_tools/clients/permissions_client.py +68 -0
- dsp_tools/clients/project_client.py +16 -0
- dsp_tools/clients/project_client_live.py +66 -0
- dsp_tools/commands/create/communicate_problems.py +24 -0
- dsp_tools/commands/create/create.py +134 -0
- dsp_tools/commands/create/create_on_server/cardinalities.py +111 -0
- dsp_tools/commands/create/create_on_server/classes.py +99 -0
- dsp_tools/commands/create/create_on_server/complete_ontologies.py +116 -0
- dsp_tools/commands/create/create_on_server/default_permissions.py +134 -0
- dsp_tools/commands/create/create_on_server/group_users.py +165 -0
- dsp_tools/commands/create/create_on_server/lists.py +163 -0
- dsp_tools/commands/create/create_on_server/mappers.py +12 -0
- dsp_tools/commands/create/create_on_server/onto_utils.py +74 -0
- dsp_tools/commands/create/create_on_server/ontology.py +52 -0
- dsp_tools/commands/create/create_on_server/project.py +68 -0
- dsp_tools/commands/create/create_on_server/properties.py +119 -0
- dsp_tools/commands/create/exceptions.py +29 -0
- dsp_tools/commands/create/lists_only.py +66 -0
- dsp_tools/commands/create/models/create_problems.py +87 -0
- dsp_tools/commands/create/models/parsed_ontology.py +88 -0
- dsp_tools/commands/create/models/parsed_project.py +81 -0
- dsp_tools/commands/create/models/rdf_ontology.py +12 -0
- dsp_tools/commands/create/models/server_project_info.py +100 -0
- dsp_tools/commands/create/parsing/parse_lists.py +45 -0
- dsp_tools/commands/create/parsing/parse_ontology.py +243 -0
- dsp_tools/commands/create/parsing/parse_project.py +149 -0
- dsp_tools/commands/create/parsing/parsing_utils.py +40 -0
- dsp_tools/commands/create/project_validate.py +595 -0
- dsp_tools/commands/create/serialisation/ontology.py +119 -0
- dsp_tools/commands/create/serialisation/project.py +44 -0
- dsp_tools/commands/excel2json/CLAUDE.md +101 -0
- dsp_tools/commands/excel2json/json_header.py +321 -0
- dsp_tools/commands/excel2json/lists/__init__.py +0 -0
- dsp_tools/commands/excel2json/lists/compliance_checks.py +292 -0
- dsp_tools/commands/excel2json/lists/make_lists.py +247 -0
- dsp_tools/commands/excel2json/lists/models/__init__.py +0 -0
- dsp_tools/commands/excel2json/lists/models/deserialise.py +30 -0
- dsp_tools/commands/excel2json/lists/models/input_error.py +216 -0
- dsp_tools/commands/excel2json/lists/models/serialise.py +57 -0
- dsp_tools/commands/excel2json/lists/utils.py +81 -0
- dsp_tools/commands/excel2json/models/__init__.py +0 -0
- dsp_tools/commands/excel2json/models/input_error.py +416 -0
- dsp_tools/commands/excel2json/models/json_header.py +175 -0
- dsp_tools/commands/excel2json/models/list_node_name.py +16 -0
- dsp_tools/commands/excel2json/models/ontology.py +76 -0
- dsp_tools/commands/excel2json/old_lists.py +328 -0
- dsp_tools/commands/excel2json/project.py +280 -0
- dsp_tools/commands/excel2json/properties.py +370 -0
- dsp_tools/commands/excel2json/resources.py +336 -0
- dsp_tools/commands/excel2json/utils.py +352 -0
- dsp_tools/commands/excel2xml/__init__.py +7 -0
- dsp_tools/commands/excel2xml/excel2xml_cli.py +523 -0
- dsp_tools/commands/excel2xml/excel2xml_lib.py +1953 -0
- dsp_tools/commands/excel2xml/propertyelement.py +47 -0
- dsp_tools/commands/get/__init__.py +0 -0
- dsp_tools/commands/get/get.py +166 -0
- dsp_tools/commands/get/get_permissions.py +257 -0
- dsp_tools/commands/get/get_permissions_legacy.py +89 -0
- dsp_tools/commands/get/legacy_models/__init__.py +0 -0
- dsp_tools/commands/get/legacy_models/context.py +318 -0
- dsp_tools/commands/get/legacy_models/group.py +241 -0
- dsp_tools/commands/get/legacy_models/helpers.py +47 -0
- dsp_tools/commands/get/legacy_models/listnode.py +390 -0
- dsp_tools/commands/get/legacy_models/model.py +12 -0
- dsp_tools/commands/get/legacy_models/ontology.py +324 -0
- dsp_tools/commands/get/legacy_models/project.py +366 -0
- dsp_tools/commands/get/legacy_models/propertyclass.py +417 -0
- dsp_tools/commands/get/legacy_models/resourceclass.py +676 -0
- dsp_tools/commands/get/legacy_models/user.py +438 -0
- dsp_tools/commands/get/models/__init__.py +0 -0
- dsp_tools/commands/get/models/permissions_models.py +10 -0
- dsp_tools/commands/id2iri.py +258 -0
- dsp_tools/commands/ingest_xmlupload/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/bulk_ingest_client.py +178 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/apply_ingest_id.py +69 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/upload_xml.py +166 -0
- dsp_tools/commands/ingest_xmlupload/create_resources/user_information.py +121 -0
- dsp_tools/commands/ingest_xmlupload/ingest_files/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/ingest_files/ingest_files.py +64 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/__init__.py +0 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/filechecker.py +20 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/input_error.py +57 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/upload_failures.py +66 -0
- dsp_tools/commands/ingest_xmlupload/upload_files/upload_files.py +67 -0
- dsp_tools/commands/resume_xmlupload/__init__.py +0 -0
- dsp_tools/commands/resume_xmlupload/resume_xmlupload.py +96 -0
- dsp_tools/commands/start_stack.py +428 -0
- dsp_tools/commands/update_legal/CLAUDE.md +344 -0
- dsp_tools/commands/update_legal/__init__.py +0 -0
- dsp_tools/commands/update_legal/core.py +182 -0
- dsp_tools/commands/update_legal/csv_operations.py +135 -0
- dsp_tools/commands/update_legal/models.py +87 -0
- dsp_tools/commands/update_legal/xml_operations.py +247 -0
- dsp_tools/commands/validate_data/CLAUDE.md +159 -0
- dsp_tools/commands/validate_data/__init__.py +0 -0
- dsp_tools/commands/validate_data/constants.py +59 -0
- dsp_tools/commands/validate_data/mappers.py +143 -0
- dsp_tools/commands/validate_data/models/__init__.py +0 -0
- dsp_tools/commands/validate_data/models/api_responses.py +45 -0
- dsp_tools/commands/validate_data/models/input_problems.py +119 -0
- dsp_tools/commands/validate_data/models/rdf_like_data.py +117 -0
- dsp_tools/commands/validate_data/models/validation.py +106 -0
- dsp_tools/commands/validate_data/prepare_data/__init__.py +0 -0
- dsp_tools/commands/validate_data/prepare_data/get_rdf_like_data.py +296 -0
- dsp_tools/commands/validate_data/prepare_data/make_data_graph.py +91 -0
- dsp_tools/commands/validate_data/prepare_data/prepare_data.py +184 -0
- dsp_tools/commands/validate_data/process_validation_report/__init__.py +0 -0
- dsp_tools/commands/validate_data/process_validation_report/get_user_validation_message.py +358 -0
- dsp_tools/commands/validate_data/process_validation_report/query_validation_result.py +507 -0
- dsp_tools/commands/validate_data/process_validation_report/reformat_validation_results.py +150 -0
- dsp_tools/commands/validate_data/shacl_cli_validator.py +70 -0
- dsp_tools/commands/validate_data/sparql/__init__.py +0 -0
- dsp_tools/commands/validate_data/sparql/cardinality_shacl.py +209 -0
- dsp_tools/commands/validate_data/sparql/construct_shacl.py +92 -0
- dsp_tools/commands/validate_data/sparql/legal_info_shacl.py +36 -0
- dsp_tools/commands/validate_data/sparql/value_shacl.py +357 -0
- dsp_tools/commands/validate_data/utils.py +59 -0
- dsp_tools/commands/validate_data/validate_data.py +283 -0
- dsp_tools/commands/validate_data/validation/__init__.py +0 -0
- dsp_tools/commands/validate_data/validation/check_duplicate_files.py +55 -0
- dsp_tools/commands/validate_data/validation/check_for_unknown_classes.py +67 -0
- dsp_tools/commands/validate_data/validation/get_validation_report.py +94 -0
- dsp_tools/commands/validate_data/validation/validate_ontology.py +107 -0
- dsp_tools/commands/xmlupload/CLAUDE.md +292 -0
- dsp_tools/commands/xmlupload/__init__.py +0 -0
- dsp_tools/commands/xmlupload/iri_resolver.py +21 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/__init__.py +0 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/constants.py +63 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/jsonld_utils.py +44 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_file_value.py +77 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_resource_and_values.py +114 -0
- dsp_tools/commands/xmlupload/make_rdf_graph/make_values.py +262 -0
- dsp_tools/commands/xmlupload/models/__init__.py +0 -0
- dsp_tools/commands/xmlupload/models/bitstream_info.py +18 -0
- dsp_tools/commands/xmlupload/models/formatted_text_value.py +10 -0
- dsp_tools/commands/xmlupload/models/ingest.py +143 -0
- dsp_tools/commands/xmlupload/models/input_problems.py +58 -0
- dsp_tools/commands/xmlupload/models/lookup_models.py +21 -0
- dsp_tools/commands/xmlupload/models/permission.py +45 -0
- dsp_tools/commands/xmlupload/models/permissions_parsed.py +93 -0
- dsp_tools/commands/xmlupload/models/processed/__init__.py +0 -0
- dsp_tools/commands/xmlupload/models/processed/file_values.py +29 -0
- dsp_tools/commands/xmlupload/models/processed/res.py +27 -0
- dsp_tools/commands/xmlupload/models/processed/values.py +101 -0
- dsp_tools/commands/xmlupload/models/rdf_models.py +26 -0
- dsp_tools/commands/xmlupload/models/upload_clients.py +14 -0
- dsp_tools/commands/xmlupload/models/upload_state.py +20 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/__init__.py +0 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/ark2iri.py +55 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/get_processed_resources.py +252 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/iiif_uri_validator.py +50 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/list_client.py +120 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/prepare_xml_input.py +67 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/read_validate_xml_file.py +58 -0
- dsp_tools/commands/xmlupload/prepare_xml_input/transform_input_values.py +118 -0
- dsp_tools/commands/xmlupload/resource_create_client.py +25 -0
- dsp_tools/commands/xmlupload/richtext_id2iri.py +37 -0
- dsp_tools/commands/xmlupload/stash/__init__.py +0 -0
- dsp_tools/commands/xmlupload/stash/analyse_circular_reference_graph.py +236 -0
- dsp_tools/commands/xmlupload/stash/create_info_for_graph.py +53 -0
- dsp_tools/commands/xmlupload/stash/graph_models.py +87 -0
- dsp_tools/commands/xmlupload/stash/stash_circular_references.py +68 -0
- dsp_tools/commands/xmlupload/stash/stash_models.py +109 -0
- dsp_tools/commands/xmlupload/stash/upload_stashed_resptr_props.py +106 -0
- dsp_tools/commands/xmlupload/stash/upload_stashed_xml_texts.py +196 -0
- dsp_tools/commands/xmlupload/upload_config.py +76 -0
- dsp_tools/commands/xmlupload/write_diagnostic_info.py +27 -0
- dsp_tools/commands/xmlupload/xmlupload.py +516 -0
- dsp_tools/config/__init__.py +0 -0
- dsp_tools/config/logger_config.py +69 -0
- dsp_tools/config/warnings_config.py +32 -0
- dsp_tools/error/__init__.py +0 -0
- dsp_tools/error/custom_warnings.py +39 -0
- dsp_tools/error/exceptions.py +204 -0
- dsp_tools/error/problems.py +10 -0
- dsp_tools/error/xmllib_errors.py +20 -0
- dsp_tools/error/xmllib_warnings.py +54 -0
- dsp_tools/error/xmllib_warnings_util.py +159 -0
- dsp_tools/error/xsd_validation_error_msg.py +19 -0
- dsp_tools/legacy_models/__init__.py +0 -0
- dsp_tools/legacy_models/datetimestamp.py +81 -0
- dsp_tools/legacy_models/langstring.py +253 -0
- dsp_tools/legacy_models/projectContext.py +49 -0
- dsp_tools/py.typed +0 -0
- dsp_tools/resources/schema/data.xsd +648 -0
- dsp_tools/resources/schema/lists-only.json +72 -0
- dsp_tools/resources/schema/project.json +1258 -0
- dsp_tools/resources/schema/properties-only.json +874 -0
- dsp_tools/resources/schema/resources-only.json +140 -0
- dsp_tools/resources/start-stack/docker-compose.override-host.j2 +11 -0
- dsp_tools/resources/start-stack/docker-compose.override.yml +11 -0
- dsp_tools/resources/start-stack/docker-compose.yml +88 -0
- dsp_tools/resources/start-stack/dsp-app-config.json +45 -0
- dsp_tools/resources/start-stack/dsp-app-config.override-host.j2 +26 -0
- dsp_tools/resources/validate_data/api-shapes-resource-cardinalities.ttl +191 -0
- dsp_tools/resources/validate_data/api-shapes.ttl +804 -0
- dsp_tools/resources/validate_data/shacl-cli-image.yml +4 -0
- dsp_tools/resources/validate_data/validate-ontology.ttl +99 -0
- dsp_tools/utils/__init__.py +0 -0
- dsp_tools/utils/ansi_colors.py +32 -0
- dsp_tools/utils/data_formats/__init__.py +0 -0
- dsp_tools/utils/data_formats/date_util.py +166 -0
- dsp_tools/utils/data_formats/iri_util.py +30 -0
- dsp_tools/utils/data_formats/shared.py +81 -0
- dsp_tools/utils/data_formats/uri_util.py +76 -0
- dsp_tools/utils/fuseki_bloating.py +63 -0
- dsp_tools/utils/json_parsing.py +22 -0
- dsp_tools/utils/rdf_constants.py +42 -0
- dsp_tools/utils/rdflib_utils.py +10 -0
- dsp_tools/utils/replace_id_with_iri.py +66 -0
- dsp_tools/utils/request_utils.py +238 -0
- dsp_tools/utils/xml_parsing/__init__.py +0 -0
- dsp_tools/utils/xml_parsing/get_lookups.py +32 -0
- dsp_tools/utils/xml_parsing/get_parsed_resources.py +325 -0
- dsp_tools/utils/xml_parsing/models/__init__.py +0 -0
- dsp_tools/utils/xml_parsing/models/parsed_resource.py +76 -0
- dsp_tools/utils/xml_parsing/parse_clean_validate_xml.py +137 -0
- dsp_tools/xmllib/CLAUDE.md +302 -0
- dsp_tools/xmllib/__init__.py +49 -0
- dsp_tools/xmllib/general_functions.py +877 -0
- dsp_tools/xmllib/internal/__init__.py +0 -0
- dsp_tools/xmllib/internal/checkers.py +162 -0
- dsp_tools/xmllib/internal/circumvent_circular_imports.py +36 -0
- dsp_tools/xmllib/internal/constants.py +46 -0
- dsp_tools/xmllib/internal/input_converters.py +155 -0
- dsp_tools/xmllib/internal/serialise_file_value.py +57 -0
- dsp_tools/xmllib/internal/serialise_resource.py +177 -0
- dsp_tools/xmllib/internal/serialise_values.py +152 -0
- dsp_tools/xmllib/internal/type_aliases.py +11 -0
- dsp_tools/xmllib/models/__init__.py +0 -0
- dsp_tools/xmllib/models/config_options.py +28 -0
- dsp_tools/xmllib/models/date_formats.py +48 -0
- dsp_tools/xmllib/models/dsp_base_resources.py +1542 -0
- dsp_tools/xmllib/models/internal/__init__.py +0 -0
- dsp_tools/xmllib/models/internal/file_values.py +172 -0
- dsp_tools/xmllib/models/internal/geometry.py +162 -0
- dsp_tools/xmllib/models/internal/migration_metadata.py +55 -0
- dsp_tools/xmllib/models/internal/serialise_permissions.py +66 -0
- dsp_tools/xmllib/models/internal/values.py +342 -0
- dsp_tools/xmllib/models/licenses/__init__.py +0 -0
- dsp_tools/xmllib/models/licenses/other.py +59 -0
- dsp_tools/xmllib/models/licenses/recommended.py +107 -0
- dsp_tools/xmllib/models/permissions.py +41 -0
- dsp_tools/xmllib/models/res.py +1782 -0
- dsp_tools/xmllib/models/root.py +348 -0
- dsp_tools/xmllib/value_checkers.py +434 -0
- dsp_tools/xmllib/value_converters.py +777 -0
- dsp_tools-18.3.0.post13.dist-info/METADATA +90 -0
- dsp_tools-18.3.0.post13.dist-info/RECORD +286 -0
- dsp_tools-18.3.0.post13.dist-info/WHEEL +4 -0
- dsp_tools-18.3.0.post13.dist-info/entry_points.txt +3 -0
- dsp_tools-0.9.13.dist-info/LICENSE +0 -674
- dsp_tools-0.9.13.dist-info/METADATA +0 -144
- dsp_tools-0.9.13.dist-info/RECORD +0 -71
- dsp_tools-0.9.13.dist-info/WHEEL +0 -5
- dsp_tools-0.9.13.dist-info/entry_points.txt +0 -3
- dsp_tools-0.9.13.dist-info/top_level.txt +0 -1
- dsplib/models/connection.py +0 -272
- dsplib/models/group.py +0 -296
- dsplib/models/helpers.py +0 -505
- dsplib/models/langstring.py +0 -277
- dsplib/models/listnode.py +0 -578
- dsplib/models/model.py +0 -20
- dsplib/models/ontology.py +0 -448
- dsplib/models/permission.py +0 -112
- dsplib/models/project.py +0 -547
- dsplib/models/propertyclass.py +0 -505
- dsplib/models/resource.py +0 -366
- dsplib/models/resourceclass.py +0 -810
- dsplib/models/sipi.py +0 -30
- dsplib/models/user.py +0 -731
- dsplib/models/value.py +0 -1000
- dsplib/utils/knora-data-schema.xsd +0 -454
- dsplib/utils/knora-schema-lists.json +0 -83
- dsplib/utils/knora-schema.json +0 -434
- dsplib/utils/onto_commons.py +0 -24
- dsplib/utils/onto_create_lists.py +0 -73
- dsplib/utils/onto_create_ontology.py +0 -442
- dsplib/utils/onto_get.py +0 -58
- dsplib/utils/onto_validate.py +0 -33
- dsplib/utils/xml_upload.py +0 -539
- dsplib/widgets/doublepassword.py +0 -80
- knora/MLS-import-libraries.py +0 -84
- knora/dsp_tools.py +0 -96
- knora/dsplib/models/connection.py +0 -272
- knora/dsplib/models/group.py +0 -296
- knora/dsplib/models/helpers.py +0 -506
- knora/dsplib/models/langstring.py +0 -277
- knora/dsplib/models/listnode.py +0 -578
- knora/dsplib/models/model.py +0 -20
- knora/dsplib/models/ontology.py +0 -448
- knora/dsplib/models/permission.py +0 -112
- knora/dsplib/models/project.py +0 -583
- knora/dsplib/models/propertyclass.py +0 -505
- knora/dsplib/models/resource.py +0 -416
- knora/dsplib/models/resourceclass.py +0 -811
- knora/dsplib/models/sipi.py +0 -35
- knora/dsplib/models/user.py +0 -731
- knora/dsplib/models/value.py +0 -1000
- knora/dsplib/utils/knora-data-schema.xsd +0 -464
- knora/dsplib/utils/knora-schema-lists.json +0 -83
- knora/dsplib/utils/knora-schema.json +0 -444
- knora/dsplib/utils/onto_commons.py +0 -24
- knora/dsplib/utils/onto_create_lists.py +0 -73
- knora/dsplib/utils/onto_create_ontology.py +0 -451
- knora/dsplib/utils/onto_get.py +0 -58
- knora/dsplib/utils/onto_validate.py +0 -33
- knora/dsplib/utils/xml_upload.py +0 -540
- knora/dsplib/widgets/doublepassword.py +0 -80
- knora/knora.py +0 -2108
- knora/test.py +0 -99
- knora/testit.py +0 -76
- knora/xml2knora.py +0 -633
- {dsplib → dsp_tools/cli}/__init__.py +0 -0
- {dsplib/models → dsp_tools/clients}/__init__.py +0 -0
- {dsplib/utils → dsp_tools/commands}/__init__.py +0 -0
- {dsplib/widgets → dsp_tools/commands/create}/__init__.py +0 -0
- {knora → dsp_tools/commands/create/create_on_server}/__init__.py +0 -0
- {knora/dsplib → dsp_tools/commands/create/models}/__init__.py +0 -0
- {knora/dsplib/models → dsp_tools/commands/create/parsing}/__init__.py +0 -0
- {knora/dsplib/utils → dsp_tools/commands/create/serialisation}/__init__.py +0 -0
- {knora/dsplib/widgets → dsp_tools/commands/excel2json}/__init__.py +0 -0
dsplib/models/helpers.py
DELETED
|
@@ -1,505 +0,0 @@
|
|
|
1
|
-
from dataclasses import dataclass
|
|
2
|
-
from typing import NewType, List, Set, Dict, Tuple, Optional, Any, Union, Pattern
|
|
3
|
-
from enum import Enum, unique
|
|
4
|
-
from traceback import format_exc
|
|
5
|
-
from pystrict import strict
|
|
6
|
-
import re
|
|
7
|
-
import sys
|
|
8
|
-
|
|
9
|
-
#
|
|
10
|
-
# here we do some data typing that should help
|
|
11
|
-
#
|
|
12
|
-
@dataclass
|
|
13
|
-
class OntoInfo:
|
|
14
|
-
"""
|
|
15
|
-
A small class thats holds an ontology IRI. The variable "hashtag" is True, if "#" is used s separate elements,
|
|
16
|
-
False if the element name is just appended
|
|
17
|
-
"""
|
|
18
|
-
iri: str
|
|
19
|
-
hashtag: bool
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
ContextType = NewType("ContextType", Dict[str, OntoInfo])
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def LINE():
|
|
26
|
-
return sys._getframe(1).f_lineno
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@strict
|
|
30
|
-
class IriTest:
|
|
31
|
-
__iri_regexp = re.compile("^(http)s?://([\\w\\.\\-~]+)?(:\\d{,6})?(/[\\w\\-~]+)*(#[\\w\\-~]*)?")
|
|
32
|
-
|
|
33
|
-
@classmethod
|
|
34
|
-
def test(cls, val: str) -> bool:
|
|
35
|
-
m = cls.__iri_regexp.match(val)
|
|
36
|
-
return m.span()[1] == len(val) if m else False
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
@strict
|
|
40
|
-
class BaseError(Exception):
|
|
41
|
-
"""
|
|
42
|
-
A basic error class
|
|
43
|
-
"""
|
|
44
|
-
_message: str
|
|
45
|
-
|
|
46
|
-
def __init__(self, message: str) -> None:
|
|
47
|
-
"""
|
|
48
|
-
Constructor for error message
|
|
49
|
-
:param message: error message string
|
|
50
|
-
"""
|
|
51
|
-
super().__init__()
|
|
52
|
-
self._message = message
|
|
53
|
-
|
|
54
|
-
def __str__(self) -> str:
|
|
55
|
-
"""
|
|
56
|
-
Convert to string
|
|
57
|
-
:return: stringyfied error message
|
|
58
|
-
"""
|
|
59
|
-
return "ERROR: " + self._message + "!\n\n" + format_exc()
|
|
60
|
-
|
|
61
|
-
@property
|
|
62
|
-
def message(self) -> str:
|
|
63
|
-
return self._message
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@unique
|
|
67
|
-
class Actions(Enum):
|
|
68
|
-
Create = 1
|
|
69
|
-
Read = 2
|
|
70
|
-
Update = 3
|
|
71
|
-
Delete = 4
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
@unique
|
|
75
|
-
class Cardinality(Enum):
|
|
76
|
-
C_1 = "1"
|
|
77
|
-
C_0_1 = "0-1"
|
|
78
|
-
C_1_n = "1-n"
|
|
79
|
-
C_0_n = "0-n"
|
|
80
|
-
|
|
81
|
-
@strict
|
|
82
|
-
class ContextIterator:
|
|
83
|
-
_context: 'Context'
|
|
84
|
-
_prefixes: List[str]
|
|
85
|
-
_index: int
|
|
86
|
-
|
|
87
|
-
def __init__(self, context: 'Context'):
|
|
88
|
-
self._context = context
|
|
89
|
-
self._prefixes = [x for x in self._context.context]
|
|
90
|
-
self._index = 0
|
|
91
|
-
|
|
92
|
-
def __next__(self):
|
|
93
|
-
if len(self._context.context) == 0 and self._index == 0:
|
|
94
|
-
return None, None
|
|
95
|
-
elif self._index < len(self._context.context):
|
|
96
|
-
tmp = self._prefixes[self._index]
|
|
97
|
-
self._index += 1
|
|
98
|
-
return tmp, self._context.context[tmp]
|
|
99
|
-
else:
|
|
100
|
-
raise StopIteration
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
@strict
|
|
104
|
-
class Context:
|
|
105
|
-
"""
|
|
106
|
-
This class holds a JSON-LD context with the ontology IRI's and the associated prefixes
|
|
107
|
-
"""
|
|
108
|
-
_context: ContextType
|
|
109
|
-
_rcontext: Dict[str, str]
|
|
110
|
-
_exp: Pattern
|
|
111
|
-
|
|
112
|
-
common_ontologies: ContextType = {
|
|
113
|
-
"foaf": OntoInfo("http://xmlns.com/foaf/0.1/", False),
|
|
114
|
-
"dc": OntoInfo("http://purl.org/dc/elements/1.1/", False),
|
|
115
|
-
"dcterms": OntoInfo("http://purl.org/dc/terms/", False),
|
|
116
|
-
"dcmi": OntoInfo("http://purl.org/dc/dcmitype/", False),
|
|
117
|
-
"skos": OntoInfo("http://www.w3.org/2004/02/skos/core", True),
|
|
118
|
-
"bibtex": OntoInfo("http://purl.org/net/nknouf/ns/bibtex", True),
|
|
119
|
-
"bibo": OntoInfo("http://purl.org/ontology/bibo/", False),
|
|
120
|
-
"cidoc": OntoInfo("http://purl.org/NET/cidoc-crm/core", True)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
knora_ontologies: ContextType = {
|
|
124
|
-
"knora-api": OntoInfo("http://api.knora.org/ontology/knora-api/v2", True),
|
|
125
|
-
"salsah-gui": OntoInfo("http://api.knora.org/ontology/salsah-gui/v2", True)
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
base_ontologies: ContextType = {
|
|
129
|
-
"rdf": OntoInfo("http://www.w3.org/1999/02/22-rdf-syntax-ns", True),
|
|
130
|
-
"rdfs": OntoInfo("http://www.w3.org/2000/01/rdf-schema", True),
|
|
131
|
-
"owl": OntoInfo("http://www.w3.org/2002/07/owl", True),
|
|
132
|
-
"xsd": OntoInfo("http://www.w3.org/2001/XMLSchema", True)
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
def __is_iri(self, val: str) -> bool:
|
|
136
|
-
"""
|
|
137
|
-
Test if string has a valid IRI pattern
|
|
138
|
-
|
|
139
|
-
:param val: Input string
|
|
140
|
-
:return: True, if val corresponds to IRI pattern
|
|
141
|
-
"""
|
|
142
|
-
|
|
143
|
-
m = self._exp.match(val)
|
|
144
|
-
return m.span()[1] == len(val) if m else False
|
|
145
|
-
|
|
146
|
-
def __init__(self, context: Optional[Dict[str, str]] = None):
|
|
147
|
-
"""
|
|
148
|
-
THe Constructor of the Context. It takes one optional parameter which as a dict of
|
|
149
|
-
prefix - ontology-iri pairs. If the hashtag "#" is used to append element name, the
|
|
150
|
-
ontology-iri *must* end with "#"!
|
|
151
|
-
:param context: A dict of prefix - ontology-iri pairs
|
|
152
|
-
"""
|
|
153
|
-
#
|
|
154
|
-
# regexp to test for a complete IRI (including fragment identifier)
|
|
155
|
-
#
|
|
156
|
-
self._exp = re.compile("^(http)s?://([\\w\\.\\-~]+)?(:\\d{,6})?(/[\\w\\-~]+)*(#[\\w\\-~]*)?")
|
|
157
|
-
|
|
158
|
-
if context:
|
|
159
|
-
cleaned_input: Dict[str, str] = {prefix: onto for (prefix, onto) in context.items() if self.base_ontologies.get(prefix) is None and self.knora_ontologies.get(prefix) is None}
|
|
160
|
-
self._context = {}
|
|
161
|
-
for prefix, onto in cleaned_input.items():
|
|
162
|
-
self._context[prefix] = OntoInfo(onto[:-1], True) if onto.endswith('#') else OntoInfo(onto, False)
|
|
163
|
-
#
|
|
164
|
-
# we always want the base ontologies/prefixes included in the context
|
|
165
|
-
#
|
|
166
|
-
for cc in self.base_ontologies.items():
|
|
167
|
-
if self._context.get(cc[0]) is None:
|
|
168
|
-
self._context[cc[0]] = cc[1]
|
|
169
|
-
#
|
|
170
|
-
# we always want the knora ontologies/prefixes included in the context
|
|
171
|
-
#
|
|
172
|
-
for cc in self.knora_ontologies.items():
|
|
173
|
-
if self._context.get(cc[0]) is None:
|
|
174
|
-
self._context[cc[0]] = cc[1]
|
|
175
|
-
else:
|
|
176
|
-
self._context = {
|
|
177
|
-
"rdf": OntoInfo("http://www.w3.org/1999/02/22-rdf-syntax-ns", True),
|
|
178
|
-
"rdfs": OntoInfo("http://www.w3.org/2000/01/rdf-schema", True),
|
|
179
|
-
"owl": OntoInfo("http://www.w3.org/2002/07/owl", True),
|
|
180
|
-
"xsd": OntoInfo("http://www.w3.org/2001/XMLSchema", True),
|
|
181
|
-
"knora-api": OntoInfo("http://api.knora.org/ontology/knora-api/v2", True),
|
|
182
|
-
"salsah-gui": OntoInfo("http://api.knora.org/ontology/salsah-gui/v2", True)
|
|
183
|
-
}
|
|
184
|
-
self._rcontext = dict(map(lambda x: (x[1].iri, x[0]), self._context.items()))
|
|
185
|
-
|
|
186
|
-
def __len__(self) -> int:
|
|
187
|
-
return len(self._context)
|
|
188
|
-
|
|
189
|
-
def __getitem__(self, key: str) -> OntoInfo:
|
|
190
|
-
return self._context[key]
|
|
191
|
-
|
|
192
|
-
def __setitem__(self, key: str, value: OntoInfo):
|
|
193
|
-
self._context[key] = value
|
|
194
|
-
self._rcontext[value.iri] = key
|
|
195
|
-
|
|
196
|
-
def __delitem__(self, key: str) -> None:
|
|
197
|
-
iri = self._context[key].iri
|
|
198
|
-
del self._context[key].iri
|
|
199
|
-
del self._rcontext[iri]
|
|
200
|
-
|
|
201
|
-
def __contains__(self, key: str) -> bool:
|
|
202
|
-
return key in self._context
|
|
203
|
-
|
|
204
|
-
def __iter__(self) -> ContextIterator:
|
|
205
|
-
return ContextIterator(self)
|
|
206
|
-
|
|
207
|
-
def __str__(self) -> str:
|
|
208
|
-
output = "Context:\n"
|
|
209
|
-
for prefix, val in self._context.items():
|
|
210
|
-
output += " " + prefix + ": " + val.iri + "\n"
|
|
211
|
-
return output
|
|
212
|
-
|
|
213
|
-
#
|
|
214
|
-
# now we have a lot of getters/setters
|
|
215
|
-
#
|
|
216
|
-
@property
|
|
217
|
-
def context(self) -> ContextType:
|
|
218
|
-
return self._context
|
|
219
|
-
|
|
220
|
-
@context.setter
|
|
221
|
-
def context(self, value: ContextType) -> None:
|
|
222
|
-
"""
|
|
223
|
-
Setter function for the context out of a dict in the form { prefix1 : iri1, prefix2, iri2, …}
|
|
224
|
-
|
|
225
|
-
:param value: Dictionary of context
|
|
226
|
-
:return: None
|
|
227
|
-
"""
|
|
228
|
-
if value is not None and isinstance(value, ContextType):
|
|
229
|
-
self._context = value
|
|
230
|
-
else:
|
|
231
|
-
raise BaseError("Error in parameter to context setter")
|
|
232
|
-
|
|
233
|
-
@property
|
|
234
|
-
def rcontext(self) -> Dict[str, str]:
|
|
235
|
-
return self._rcontext
|
|
236
|
-
|
|
237
|
-
def add_context(self, prefix: str, iri: Optional[str] = None) -> None:
|
|
238
|
-
"""
|
|
239
|
-
Add a new context to a context instance
|
|
240
|
-
|
|
241
|
-
:param prefix: The prefix that should be used
|
|
242
|
-
:param iri: The IRI that belongs to this context prefix
|
|
243
|
-
:return: None
|
|
244
|
-
"""
|
|
245
|
-
if iri is None:
|
|
246
|
-
if prefix in self.knora_ontologies:
|
|
247
|
-
return
|
|
248
|
-
if prefix in self.base_ontologies:
|
|
249
|
-
return
|
|
250
|
-
if prefix in self.common_ontologies:
|
|
251
|
-
self._context[prefix] = self.common_ontologies[prefix]
|
|
252
|
-
else:
|
|
253
|
-
raise BaseError("The prefix '{}' is not known!".format(prefix))
|
|
254
|
-
else:
|
|
255
|
-
if iri.endswith("#"):
|
|
256
|
-
iri = iri[:-1]
|
|
257
|
-
self._context[prefix] = OntoInfo(iri, True)
|
|
258
|
-
else:
|
|
259
|
-
self._context[prefix] = OntoInfo(iri, False)
|
|
260
|
-
self._rcontext[iri] = prefix
|
|
261
|
-
|
|
262
|
-
def iri_from_prefix(self, prefix: str) -> Optional[str]:
|
|
263
|
-
"""
|
|
264
|
-
Returns the full IRI belonging to this prefix, without trailing "#"!
|
|
265
|
-
|
|
266
|
-
:param prefix: Prefix of the context entry
|
|
267
|
-
:return: The full IRI without trailing "#"
|
|
268
|
-
"""
|
|
269
|
-
#if self.__is_iri(prefix):
|
|
270
|
-
if IriTest.test(prefix):
|
|
271
|
-
return prefix
|
|
272
|
-
if self._context.get(prefix) is not None:
|
|
273
|
-
return self._context.get(prefix).iri
|
|
274
|
-
else:
|
|
275
|
-
return None
|
|
276
|
-
|
|
277
|
-
def prefix_from_iri(self, iri: str) -> Optional[str]:
|
|
278
|
-
"""
|
|
279
|
-
Get the IRI from a full context that has or has not a a trailing "#". It first searches in the normal list
|
|
280
|
-
of contexted. If the iri is not found there, it looks in the list common (external) ontologies. If the
|
|
281
|
-
ontology is found there, this ontology is added to the list of known ontology and it's prefix is returned.
|
|
282
|
-
If nothing is found, None is returns
|
|
283
|
-
|
|
284
|
-
:param iri: The full IRI with or without trailing "#", or
|
|
285
|
-
:return: the prefix of this context element, or None, if not found
|
|
286
|
-
"""
|
|
287
|
-
#if not self.__is_iri(iri):
|
|
288
|
-
if not IriTest.test(iri):
|
|
289
|
-
raise BaseError("String does not conform to IRI patter: " + iri)
|
|
290
|
-
if iri.endswith("#"):
|
|
291
|
-
iri = iri[:-1]
|
|
292
|
-
result = self._rcontext.get(iri)
|
|
293
|
-
if result is None:
|
|
294
|
-
entrylist = list(filter(lambda x: x[1].iri == iri, self.common_ontologies.items()))
|
|
295
|
-
if len(entrylist) == 1:
|
|
296
|
-
entry = entrylist[0]
|
|
297
|
-
self._context[entry[0]] = entry[1] # add to list of prefixes used
|
|
298
|
-
self._rcontext[entry[1].iri] = entry[0]
|
|
299
|
-
result = entry[0]
|
|
300
|
-
else:
|
|
301
|
-
tmp = iri.split('/')
|
|
302
|
-
if tmp[-1] == "v2":
|
|
303
|
-
#
|
|
304
|
-
# we have a knora ontology name "http://server/ontology/shortcode/shortname/v2"
|
|
305
|
-
self._context[tmp[-2]] = OntoInfo(iri, True) # add to list of prefixes used
|
|
306
|
-
self._rcontext[iri] = tmp[-2]
|
|
307
|
-
else:
|
|
308
|
-
raise BaseError("Iri cannot be resolved to a well-known prefix!")
|
|
309
|
-
return result
|
|
310
|
-
|
|
311
|
-
def get_qualified_iri(self, val: Optional[str]) -> Optional[str]:
|
|
312
|
-
"""
|
|
313
|
-
We will return the full qualified IRI, if it is not yet a full qualified IRI. If
|
|
314
|
-
the IRI is already fully qualified, the we just return it.
|
|
315
|
-
|
|
316
|
-
:param val: The input short form
|
|
317
|
-
:return: the fully qualified IRI
|
|
318
|
-
"""
|
|
319
|
-
if val is None:
|
|
320
|
-
return None
|
|
321
|
-
#if self.__is_iri(val):
|
|
322
|
-
if IriTest.test(val):
|
|
323
|
-
return val
|
|
324
|
-
tmp = val.split(':')
|
|
325
|
-
if len(tmp) < 2:
|
|
326
|
-
raise BaseError("There is no separator to identify the prefix: " + val)
|
|
327
|
-
iri_info = self._context.get(tmp[0])
|
|
328
|
-
if iri_info is None:
|
|
329
|
-
entrylist = list(filter(lambda x: x[1].iri == tmp[0], self.common_ontologies.items()))
|
|
330
|
-
if len(entrylist) == 1:
|
|
331
|
-
entry = entrylist[0]
|
|
332
|
-
self._context[entry[0]] = entry[1] # add to list of prefixes used
|
|
333
|
-
self._rcontext[entry[1].iri] = entry[0]
|
|
334
|
-
iri_info = entry[1]
|
|
335
|
-
else:
|
|
336
|
-
raise BaseError("Ontology not known! Cannot generate full qualified IRI")
|
|
337
|
-
if iri_info.hashtag:
|
|
338
|
-
return iri_info.iri + '#' + tmp[1]
|
|
339
|
-
else:
|
|
340
|
-
return iri_info.iri + tmp[1]
|
|
341
|
-
|
|
342
|
-
def get_prefixed_iri(self, iri: Optional[str]) -> Optional[str]:
|
|
343
|
-
"""
|
|
344
|
-
We reduce a fully qualified IRI to a short one in the form "prefix:name"
|
|
345
|
-
|
|
346
|
-
:param iri: Fully qualified IRI
|
|
347
|
-
:return: Return short from of IRI ("prefix:name")
|
|
348
|
-
"""
|
|
349
|
-
|
|
350
|
-
if iri is None:
|
|
351
|
-
return None
|
|
352
|
-
#
|
|
353
|
-
# check if the iri already has the form "prefix:name"
|
|
354
|
-
#
|
|
355
|
-
m = re.match("([\\w-]+):([\\w-]+)", iri)
|
|
356
|
-
if m and m.span()[1] == len(iri):
|
|
357
|
-
return iri
|
|
358
|
-
#if not self.__is_iri(iri):
|
|
359
|
-
if not IriTest.test(iri):
|
|
360
|
-
raise BaseError("String does not conform to IRI patter: " + iri)
|
|
361
|
-
|
|
362
|
-
splitpoint = iri.find('#')
|
|
363
|
-
if splitpoint == -1:
|
|
364
|
-
splitpoint = iri.rfind('/')
|
|
365
|
-
ontopart = iri[:splitpoint + 1]
|
|
366
|
-
element = iri[splitpoint + 1:]
|
|
367
|
-
else:
|
|
368
|
-
ontopart = iri[:splitpoint]
|
|
369
|
-
element = iri[splitpoint + 1:]
|
|
370
|
-
prefix = self._rcontext.get(ontopart)
|
|
371
|
-
if prefix is None:
|
|
372
|
-
entrylist = list(filter(lambda x: x[1].iri == ontopart, self.common_ontologies.items()))
|
|
373
|
-
if len(entrylist) == 1:
|
|
374
|
-
entry = entrylist[0]
|
|
375
|
-
self._context[entry[0]] = entry[1] # add to list of prefixes used
|
|
376
|
-
self._rcontext[entry[1].iri] = entry[0]
|
|
377
|
-
prefix = entry[0]
|
|
378
|
-
else:
|
|
379
|
-
raise BaseError("Ontology {} not known! Cannot generate full qualified IRI: prefix={}".format(iri, prefix))
|
|
380
|
-
return prefix + ':' + element
|
|
381
|
-
|
|
382
|
-
def reduce_iri(self, iristr: str, ontoname: Optional[str] = None) -> str:
|
|
383
|
-
"""
|
|
384
|
-
Reduce an IRI to the form that is used within the definition json file. It expects
|
|
385
|
-
the context object to have entries (prefixes) for all IRI's
|
|
386
|
-
- if it's an external IRI, it returns: "prefix:name"
|
|
387
|
-
- if it's in the same ontology, it returns ":name"
|
|
388
|
-
- if it's a system ontoloy ("knora-api" or "salsah-gui") it returns "name"
|
|
389
|
-
:param iristr:
|
|
390
|
-
:return:
|
|
391
|
-
"""
|
|
392
|
-
rdf = self.prefix_from_iri("http://www.w3.org/1999/02/22-rdf-syntax-ns#")
|
|
393
|
-
rdfs = self.prefix_from_iri("http://www.w3.org/2000/01/rdf-schema#")
|
|
394
|
-
owl = self.prefix_from_iri("http://www.w3.org/2002/07/owl#")
|
|
395
|
-
xsd = self.prefix_from_iri("http://www.w3.org/2001/XMLSchema#")
|
|
396
|
-
knora_api = self.prefix_from_iri("http://api.knora.org/ontology/knora-api/v2#")
|
|
397
|
-
salsah_gui = self.prefix_from_iri("http://api.knora.org/ontology/salsah-gui/v2#")
|
|
398
|
-
|
|
399
|
-
#if self.__is_iri(iristr):
|
|
400
|
-
if IriTest.test(iristr):
|
|
401
|
-
iristr = self.get_prefixed_iri(iristr)
|
|
402
|
-
tmp = iristr.split(':')
|
|
403
|
-
if tmp[0] == knora_api or tmp[0] == salsah_gui:
|
|
404
|
-
return tmp[1]
|
|
405
|
-
elif ontoname is not None and tmp[0] == ontoname:
|
|
406
|
-
return ':' + tmp[1]
|
|
407
|
-
else:
|
|
408
|
-
return iristr
|
|
409
|
-
|
|
410
|
-
def toJsonObj(self) -> Dict[str, str]:
|
|
411
|
-
"""
|
|
412
|
-
Return a python object that can be jsonfied...
|
|
413
|
-
:return: Object to be jsonfied
|
|
414
|
-
"""
|
|
415
|
-
return {prefix: oinfo.iri + '#' if oinfo.hashtag else oinfo.iri
|
|
416
|
-
for prefix, oinfo in self._context.items()}
|
|
417
|
-
|
|
418
|
-
def get_externals_used(self) -> Dict[str, str]:
|
|
419
|
-
exclude = ["rdf", "rdfs", "owl", "xsd", "knora-api", "salsah-gui"]
|
|
420
|
-
return {prefix: onto.iri for prefix, onto in self._context.items() if prefix not in exclude}
|
|
421
|
-
|
|
422
|
-
def print(self) -> None:
|
|
423
|
-
for a in self._context.items():
|
|
424
|
-
print(a[0] + ': "' + a[1].iri + '"')
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
class LastModificationDate:
|
|
428
|
-
"""
|
|
429
|
-
Class to hold and process the last modification date of a ontology
|
|
430
|
-
"""
|
|
431
|
-
_last_modification_date: str;
|
|
432
|
-
|
|
433
|
-
def __init__(self, val: Any):
|
|
434
|
-
"""
|
|
435
|
-
The constructor works for different inputs:
|
|
436
|
-
- a string holding the modification date
|
|
437
|
-
- an instance of "LastModificationDate"
|
|
438
|
-
- json-ld construct of the form { "@type": "xsd:dateTimeStamp", "@value": "date-str" }
|
|
439
|
-
:param val: datetimestamp as string, instance of "LastModificationDate" or json-ld construct
|
|
440
|
-
"""
|
|
441
|
-
if isinstance(val, str):
|
|
442
|
-
self._last_modification_date = val;
|
|
443
|
-
elif isinstance(val, LastModificationDate):
|
|
444
|
-
self._last_modification_date = str(val)
|
|
445
|
-
else:
|
|
446
|
-
if val.get("@type") is not None and val.get("@type") == "xsd:dateTimeStamp":
|
|
447
|
-
self._last_modification_date = val["@value"]
|
|
448
|
-
else:
|
|
449
|
-
raise BaseError("Invalid LastModificationDate")
|
|
450
|
-
|
|
451
|
-
def __eq__(self, other: Union[str, 'LastModificationDate']) -> bool:
|
|
452
|
-
if isinstance(other, str):
|
|
453
|
-
other = LastModificationDate(other)
|
|
454
|
-
return self._last_modification_date == other._last_modification_date
|
|
455
|
-
|
|
456
|
-
def __lt__(self, other: 'LastModificationDate') -> bool:
|
|
457
|
-
if isinstance(other, str):
|
|
458
|
-
other = LastModificationDate(other)
|
|
459
|
-
return self._last_modification_date < other._last_modification_date
|
|
460
|
-
|
|
461
|
-
def __le__(self, other: 'LastModificationDate') -> bool:
|
|
462
|
-
if isinstance(other, str):
|
|
463
|
-
other = LastModificationDate(other)
|
|
464
|
-
return self._last_modification_date <= other._last_modification_date
|
|
465
|
-
|
|
466
|
-
def __gt__(self, other: 'LastModificationDate') -> bool:
|
|
467
|
-
if isinstance(other, str):
|
|
468
|
-
other = LastModificationDate(other)
|
|
469
|
-
return self._last_modification_date > other._last_modification_date
|
|
470
|
-
|
|
471
|
-
def __ge__(self, other: 'LastModificationDate') -> bool:
|
|
472
|
-
if isinstance(other, str):
|
|
473
|
-
other = LastModificationDate(other)
|
|
474
|
-
return self._last_modification_date >= other._last_modification_date
|
|
475
|
-
|
|
476
|
-
def __ne__(self, other: 'LastModificationDate') -> bool:
|
|
477
|
-
if isinstance(other, str):
|
|
478
|
-
other = LastModificationDate(other)
|
|
479
|
-
return self._last_modification_date != other._last_modification_date
|
|
480
|
-
|
|
481
|
-
def __str__(self: 'LastModificationDate') -> Union[None, str]:
|
|
482
|
-
return self._last_modification_date
|
|
483
|
-
|
|
484
|
-
def toJsonObj(self):
|
|
485
|
-
return {
|
|
486
|
-
"@type": "xsd:dateTimeStamp",
|
|
487
|
-
"@value": self._last_modification_date
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
class WithId:
|
|
492
|
-
"""
|
|
493
|
-
Class helper to get json-ld "@id" thingies
|
|
494
|
-
"""
|
|
495
|
-
_tmp: str = None
|
|
496
|
-
|
|
497
|
-
def __init__(self, obj: Optional[Dict[str, str]]):
|
|
498
|
-
if obj is None:
|
|
499
|
-
return
|
|
500
|
-
self._tmp = obj.get('@id')
|
|
501
|
-
|
|
502
|
-
def str(self) -> Optional[str]:
|
|
503
|
-
return self._tmp
|
|
504
|
-
|
|
505
|
-
|