cognite-neat 1.0.20__tar.gz → 1.0.22__tar.gz
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.
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/PKG-INFO +1 -1
- cognite_neat-1.0.22/cognite/neat/_client/__init__.py +5 -0
- cognite_neat-1.0.22/cognite/neat/_client/init/credentials.py +70 -0
- cognite_neat-1.0.22/cognite/neat/_client/init/env_vars.py +131 -0
- cognite_neat-1.0.22/cognite/neat/_client/init/main.py +51 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/_analysis.py +47 -14
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/_identifiers.py +1 -1
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/exporters/_table_exporter/writer.py +59 -3
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/_table_importer/data_classes.py +46 -23
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/_table_importer/reader.py +54 -15
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/conceptual/_data_model.py +1 -1
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_space.py +1 -1
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/entities/_identifiers.py +1 -1
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_views.py +38 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_exceptions.py +12 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_store/_store.py +1 -2
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/auxiliary.py +10 -0
- cognite_neat-1.0.22/cognite/neat/_utils/repo.py +19 -0
- cognite_neat-1.0.22/cognite/neat/_version.py +2 -0
- cognite_neat-1.0.22/cognite/neat/py.typed +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/pyproject.toml +4 -2
- cognite_neat-1.0.20/cognite/neat/_client/__init__.py +0 -4
- cognite_neat-1.0.20/cognite/neat/_version.py +0 -2
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/README.md +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/api.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/client.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/config.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/containers_api.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/data_classes.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/data_model_api.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model → cognite_neat-1.0.22/cognite/neat/_client/init}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/spaces_api.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/statistics_api.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_client/views_api.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_config.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model/deployer → cognite_neat-1.0.22/cognite/neat/_data_model}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/_constants.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/_shared.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/_snapshot.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model/exporters/_table_exporter → cognite_neat-1.0.22/cognite/neat/_data_model/deployer}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/_differ.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/_differ_container.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/_differ_data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/_differ_space.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/_differ_view.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/data_classes.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/deployer/deployer.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/exporters/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/exporters/_api_exporter.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/exporters/_base.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model/importers/_table_importer → cognite_neat-1.0.22/cognite/neat/_data_model/exporters/_table_exporter}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/exporters/_table_exporter/exporter.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/exporters/_table_exporter/workbook.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/_api_importer.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/_base.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model/models → cognite_neat-1.0.22/cognite/neat/_data_model/importers/_table_importer}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/_table_importer/importer.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/importers/_table_importer/source.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model/models/conceptual → cognite_neat-1.0.22/cognite/neat/_data_model/models}/__init__.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_data_model/validation → cognite_neat-1.0.22/cognite/neat/_data_model/models/conceptual}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/conceptual/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/conceptual/_concept.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/conceptual/_properties.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/conceptual/_property.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_constants.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_constraints.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_container.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_data_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_http.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_indexes.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_limits.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_references.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_schema.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_view_filter.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_view_property.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/dms/_views.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/entities/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/entities/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/entities/_constants.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/entities/_data_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/models/entities/_parser.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_session/_html → cognite_neat-1.0.22/cognite/neat/_data_model/validation}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_ai_readiness.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_connections.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_consistency.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_containers.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_limits.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_data_model/validation/dms/_orchestrator.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_issues.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/__init__.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_session/_result/_deployment → cognite_neat-1.0.22/cognite/neat/_session/_html}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/_render.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/static/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/static/deployment.css +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/static/deployment.js +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/static/issues.css +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/static/issues.js +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/static/shared.css +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/templates/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/templates/deployment.html +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_html/templates/issues.html +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_issues.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_physical.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_result/__init__.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_session/_result/_deployment/_physical → cognite_neat-1.0.22/cognite/neat/_session/_result/_deployment}/__init__.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_session/_usage_analytics → cognite_neat-1.0.22/cognite/neat/_session/_result/_deployment/_physical}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_result/_deployment/_physical/_changes.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_result/_deployment/_physical/_statistics.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_result/_deployment/_physical/serializer.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_result/_result.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_session.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_utils → cognite_neat-1.0.22/cognite/neat/_session/_usage_analytics}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_usage_analytics/_collector.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_usage_analytics/_constants.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_usage_analytics/_storage.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_session/_wrappers.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_state_machine/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_state_machine/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_state_machine/_states.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_store/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_store/_provenance.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0 → cognite_neat-1.0.22/cognite/neat/_utils}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/_reader.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/collection.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/http_client/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/http_client/_client.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/http_client/_config.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/http_client/_data_classes.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/http_client/_tracker.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/text.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/useful_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_utils/validation.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core → cognite_neat-1.0.22/cognite/neat/_v0}/__init__.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core/_client/_api → cognite_neat-1.0.22/cognite/neat/_v0/core}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/__init__.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core/_client/data_classes → cognite_neat-1.0.22/cognite/neat/_v0/core/_client/_api}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/_api/data_modeling_loaders.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/_api/neat_instances.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/_api/schema.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/_api/statistics.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/_api_client.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core/_data_model → cognite_neat-1.0.22/cognite/neat/_v0/core/_client/data_classes}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/data_classes/data_modeling.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/data_classes/neat_sequence.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/data_classes/schema.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/data_classes/statistics.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_client/testing.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_config.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_constants.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core/_instances → cognite_neat-1.0.22/cognite/neat/_v0/core/_data_model}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/_constants.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/_shared.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/analysis/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/analysis/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/catalog/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/catalog/classic_model.xlsx +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/catalog/hello_world_pump.xlsx +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/_data_model2dms.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/_data_model2excel.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/_data_model2instance_template.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/_data_model2semantic_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/exporters/_data_model2yaml.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_base_file_reader.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_dict2data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_dms2data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_graph2data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_rdf/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_rdf/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_rdf/_inference2rdata_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_rdf/_owl2data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_rdf/_shared.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/importers/_spreadsheet2data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/_base_unverified.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/_base_verified.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/_import_contexts.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/conceptual/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/conceptual/_unverified.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/conceptual/_validation.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/conceptual/_verified.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/data_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_constants.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_loaders.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_multi_value.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_restrictions.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_single_value.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_types.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/entities/_wrapped.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/mapping/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/mapping/_classic2core.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/mapping/_classic2core.yaml +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/physical/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/physical/_exporter.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/physical/_unverified.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/physical/_validation.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/models/physical/_verified.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/transformers/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/transformers/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/transformers/_converters.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/transformers/_mapping.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/transformers/_union_conceptual.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_data_model/transformers/_verification.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core/_instances/extractors/_classic_cdf → cognite_neat-1.0.22/cognite/neat/_v0/core/_instances}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/_shared.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/_tracking/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/_tracking/base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/_tracking/log.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/examples/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_base.py +0 -0
- {cognite_neat-1.0.20/cognite/neat/_v0/core/_utils → cognite_neat-1.0.22/cognite/neat/_v0/core/_instances/extractors/_classic_cdf}/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_assets.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_classic.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_events.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_files.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_labels.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_relationships.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_sequences.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_dict.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_dms.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_dms_graph.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_mock_graph_generator.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_raw.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/extractors/_rdf_file.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/loaders/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/loaders/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/loaders/_rdf2dms.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/loaders/_rdf_to_instance_space.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/queries/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/queries/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/queries/_queries.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/queries/_select.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/queries/_update.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/transformers/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/transformers/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/transformers/_classic_cdf.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/transformers/_prune_graph.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/transformers/_rdfpath.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_instances/transformers/_value_type.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/_contextmanagers.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/_factory.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/errors/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/errors/_external.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/errors/_general.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/errors/_properties.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/errors/_resources.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/errors/_wrapper.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/formatters.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/_external.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/_general.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/_models.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/_properties.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/_resources.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_issues/warnings/user_modeling.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_shared.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_store/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_store/_data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_store/_instance.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_store/_provenance.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_store/exceptions.py +0 -0
- /cognite_neat-1.0.20/cognite/neat/py.typed → /cognite_neat-1.0.22/cognite/neat/_v0/core/_utils/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/auth.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/auxiliary.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/collection_.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/graph_transformations_report.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/io_.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/rdf_.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/reader/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/reader/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/spreadsheet.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/tarjan.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/text.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/time_.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/upload.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/core/_utils/xml_.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/engine/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/engine/_import.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/engine/_interface.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/engine/_load.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/plugins/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/plugins/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/plugins/_data_model.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/plugins/_issues.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/plugins/_manager.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/__init__.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_base.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_collector.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_diff.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_drop.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_experimental.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_explore.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_fix.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_inspect.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_mapping.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_plugin.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_prepare.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_read.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_set.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_show.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_state/README.md +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_state.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_subset.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_template.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_to.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/_wizard.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/_v0/session/exceptions.py +0 -0
- {cognite_neat-1.0.20 → cognite_neat-1.0.22}/cognite/neat/legacy.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: cognite-neat
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.22
|
|
4
4
|
Summary: Knowledge graph transformation
|
|
5
5
|
Author: Nikola Vasiljevic, Anders Albert
|
|
6
6
|
Author-email: Nikola Vasiljevic <nikola.vasiljevic@cognite.com>, Anders Albert <anders.albert@cognite.com>
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from collections.abc import Callable
|
|
2
|
+
|
|
3
|
+
from cognite.client.credentials import CredentialProvider, OAuthClientCredentials, OAuthInteractive, Token
|
|
4
|
+
|
|
5
|
+
from cognite.neat._utils.text import humanize_collection
|
|
6
|
+
|
|
7
|
+
from .env_vars import ClientEnvironmentVariables, LoginFlow
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def get_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
|
|
11
|
+
options: dict[LoginFlow, Callable[[ClientEnvironmentVariables], CredentialProvider]] = {
|
|
12
|
+
"client_credentials": create_client_credentials,
|
|
13
|
+
"interactive": create_interactive_credentials,
|
|
14
|
+
"token": create_token_credentials,
|
|
15
|
+
"infer": create_infer_credentials,
|
|
16
|
+
}
|
|
17
|
+
return options[env_vars.LOGIN_FLOW](env_vars)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def create_client_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
|
|
21
|
+
missing: list[str] = []
|
|
22
|
+
if not env_vars.IDP_CLIENT_ID:
|
|
23
|
+
missing.append("IDP_CLIENT_ID")
|
|
24
|
+
if not env_vars.IDP_CLIENT_SECRET:
|
|
25
|
+
missing.append("IDP_CLIENT_SECRET")
|
|
26
|
+
if env_vars.IDP_CLIENT_ID is None or env_vars.IDP_CLIENT_SECRET is None:
|
|
27
|
+
raise ValueError(
|
|
28
|
+
f"The following environment variables must be set for "
|
|
29
|
+
f"client credentials authentication: {humanize_collection(missing)}"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
if env_vars.PROVIDER == "cdf":
|
|
33
|
+
return OAuthClientCredentials(
|
|
34
|
+
client_id=env_vars.IDP_CLIENT_ID,
|
|
35
|
+
client_secret=env_vars.IDP_CLIENT_SECRET,
|
|
36
|
+
token_url=env_vars.idp_token_url,
|
|
37
|
+
scopes=None, # type: ignore[arg-type]
|
|
38
|
+
)
|
|
39
|
+
return OAuthClientCredentials(
|
|
40
|
+
client_id=env_vars.IDP_CLIENT_ID,
|
|
41
|
+
client_secret=env_vars.IDP_CLIENT_SECRET,
|
|
42
|
+
token_url=env_vars.idp_token_url,
|
|
43
|
+
audience=env_vars.idp_audience,
|
|
44
|
+
scopes=env_vars.idp_scopes,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def create_interactive_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
|
|
49
|
+
if not env_vars.IDP_CLIENT_ID:
|
|
50
|
+
raise ValueError("IDP_CLIENT_ID environment variable must be set for interactive authentication.")
|
|
51
|
+
return OAuthInteractive(
|
|
52
|
+
client_id=env_vars.IDP_CLIENT_ID,
|
|
53
|
+
authority_url=env_vars.idp_authority_url,
|
|
54
|
+
scopes=env_vars.idp_scopes,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def create_token_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
|
|
59
|
+
if not env_vars.CDF_TOKEN:
|
|
60
|
+
raise ValueError("CDF_TOKEN environment variable must be set for token authentication.")
|
|
61
|
+
return Token(env_vars.CDF_TOKEN)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def create_infer_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
|
|
65
|
+
if env_vars.IDP_CLIENT_SECRET:
|
|
66
|
+
return create_client_credentials(env_vars)
|
|
67
|
+
elif env_vars.CDF_TOKEN:
|
|
68
|
+
return create_token_credentials(env_vars)
|
|
69
|
+
else:
|
|
70
|
+
return create_interactive_credentials(env_vars)
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Any, Literal, TypeAlias, get_args
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel, ConfigDict, ValidationError
|
|
6
|
+
|
|
7
|
+
from cognite.neat._utils.repo import get_repo_root
|
|
8
|
+
from cognite.neat._utils.validation import humanize_validation_error
|
|
9
|
+
|
|
10
|
+
if sys.version_info >= (3, 11):
|
|
11
|
+
from typing import Self
|
|
12
|
+
else:
|
|
13
|
+
from typing_extensions import Self
|
|
14
|
+
|
|
15
|
+
LoginFlow: TypeAlias = Literal["infer", "client_credentials", "interactive", "token"]
|
|
16
|
+
VALID_LOGIN_FLOWS = get_args(LoginFlow)
|
|
17
|
+
Provider: TypeAlias = Literal["entra_id", "auth0", "cdf", "other"]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ClientEnvironmentVariables(BaseModel):
|
|
21
|
+
"""Configuration for environment variables used by the NEAT client."""
|
|
22
|
+
|
|
23
|
+
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
24
|
+
CDF_CLUSTER: str
|
|
25
|
+
CDF_PROJECT: str
|
|
26
|
+
PROVIDER: Provider = "entra_id"
|
|
27
|
+
LOGIN_FLOW: LoginFlow = "infer"
|
|
28
|
+
|
|
29
|
+
IDP_CLIENT_ID: str | None = None
|
|
30
|
+
IDP_CLIENT_SECRET: str | None = None
|
|
31
|
+
CDF_TOKEN: str | None = None
|
|
32
|
+
|
|
33
|
+
IDP_TENANT_ID: str | None = None
|
|
34
|
+
IDP_TOKEN_URL: str | None = None
|
|
35
|
+
|
|
36
|
+
CDF_URL: str | None = None
|
|
37
|
+
IDP_AUDIENCE: str | None = None
|
|
38
|
+
IDP_SCOPES: str | None = None
|
|
39
|
+
IDP_AUTHORITY_URL: str | None = None
|
|
40
|
+
IDP_DISCOVERY_URL: str | None = None
|
|
41
|
+
CDF_MAX_WORKERS: int | None = None
|
|
42
|
+
CDF_CLIENT_TIMEOUT: int | None = None
|
|
43
|
+
CDF_REDIRECT_PORT: int = 53_000
|
|
44
|
+
|
|
45
|
+
@classmethod
|
|
46
|
+
def create_humanize(cls, values: dict[str, Any]) -> Self:
|
|
47
|
+
try:
|
|
48
|
+
return cls.model_validate(values)
|
|
49
|
+
except ValidationError as e:
|
|
50
|
+
errors = [humanize_validation_error(error) for error in e.errors()]
|
|
51
|
+
raise ValueError("Invalid environment variable configuration:\n" + "\n - ".join(errors)) from e
|
|
52
|
+
|
|
53
|
+
@property
|
|
54
|
+
def idp_tenant_id(self) -> str:
|
|
55
|
+
if self.IDP_TENANT_ID:
|
|
56
|
+
return self.IDP_TENANT_ID
|
|
57
|
+
# This line is technically unreachable due to the checks in idp_token_url and idp_authority_url
|
|
58
|
+
raise RuntimeError("IDP_TENANT_ID is missing")
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def idp_token_url(self) -> str:
|
|
62
|
+
if self.PROVIDER == "cdf":
|
|
63
|
+
return "https://auth.cognite.com/oauth2/token"
|
|
64
|
+
if self.IDP_TOKEN_URL:
|
|
65
|
+
return self.IDP_TOKEN_URL
|
|
66
|
+
if self.PROVIDER == "entra_id" and self.IDP_TENANT_ID:
|
|
67
|
+
return f"https://login.microsoftonline.com/{self.IDP_TENANT_ID}/oauth2/v2.0/token"
|
|
68
|
+
alternative = " or provide IDP_TENANT_ID" if self.PROVIDER == "entra_id" else ""
|
|
69
|
+
raise ValueError(
|
|
70
|
+
f"IDP_TOKEN_URL is missing. Please provide it{alternative} in the environment variables.",
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def cdf_url(self) -> str:
|
|
75
|
+
return self.CDF_URL or f"https://{self.CDF_CLUSTER}.cognitedata.com"
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def idp_audience(self) -> str:
|
|
79
|
+
if self.IDP_AUDIENCE:
|
|
80
|
+
return self.IDP_AUDIENCE
|
|
81
|
+
if self.PROVIDER == "auth0":
|
|
82
|
+
return f"https://{self.CDF_PROJECT}.fusion.cognite.com/{self.CDF_PROJECT}"
|
|
83
|
+
else:
|
|
84
|
+
return f"https://{self.CDF_CLUSTER}.cognitedata.com"
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def idp_scopes(self) -> list[str]:
|
|
88
|
+
if self.IDP_SCOPES:
|
|
89
|
+
return self.IDP_SCOPES.split(",")
|
|
90
|
+
if self.PROVIDER == "auth0":
|
|
91
|
+
return ["IDENTITY", "user_impersonation"]
|
|
92
|
+
return [f"https://{self.CDF_CLUSTER}.cognitedata.com/.default"]
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def idp_authority_url(self) -> str:
|
|
96
|
+
if self.IDP_AUTHORITY_URL:
|
|
97
|
+
return self.IDP_AUTHORITY_URL
|
|
98
|
+
if self.PROVIDER == "entra_id" and self.IDP_TENANT_ID:
|
|
99
|
+
return f"https://login.microsoftonline.com/{self.IDP_TENANT_ID}"
|
|
100
|
+
alternative = " or provide IDP_TENANT_ID" if self.PROVIDER == "entra_id" else ""
|
|
101
|
+
raise ValueError(
|
|
102
|
+
f"IDP_AUTHORITY_URL is missing. Please provide it{alternative} in the environment variables.",
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_environment_variables(env_file_name: str) -> ClientEnvironmentVariables:
|
|
107
|
+
to_search: list[tuple[str, Path]] = []
|
|
108
|
+
try:
|
|
109
|
+
repo_root = get_repo_root()
|
|
110
|
+
except RuntimeError:
|
|
111
|
+
...
|
|
112
|
+
else:
|
|
113
|
+
to_search.append(("repository root", repo_root))
|
|
114
|
+
to_search.append(("current working directory", Path.cwd()))
|
|
115
|
+
for location_desc, path in to_search:
|
|
116
|
+
env_path = path / env_file_name
|
|
117
|
+
if env_path.is_file():
|
|
118
|
+
print(f"Found {env_file_name} in {location_desc}.")
|
|
119
|
+
return _parse_env_file(env_path)
|
|
120
|
+
raise FileNotFoundError(f"Could not find {env_file_name} in the repository root or current working directory.")
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def _parse_env_file(env_file_path: Path) -> ClientEnvironmentVariables:
|
|
124
|
+
content = env_file_path.read_text()
|
|
125
|
+
variables: dict[str, Any] = {}
|
|
126
|
+
for line in content.splitlines():
|
|
127
|
+
if line.startswith("#") or "=" not in line:
|
|
128
|
+
continue
|
|
129
|
+
key, value = line.strip().split("=", 1)
|
|
130
|
+
variables[key] = value
|
|
131
|
+
return ClientEnvironmentVariables.create_humanize(variables)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
from cognite.client import CogniteClient
|
|
2
|
+
from cognite.client.config import ClientConfig, global_config
|
|
3
|
+
|
|
4
|
+
from cognite.neat import _version
|
|
5
|
+
|
|
6
|
+
from .credentials import get_credentials
|
|
7
|
+
from .env_vars import ClientEnvironmentVariables, get_environment_variables
|
|
8
|
+
|
|
9
|
+
CLIENT_NAME = f"CogniteNeat:{_version.__version__}"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def get_cognite_client(env_file_name: str) -> CogniteClient:
|
|
13
|
+
"""Get a CogniteClient using environment variables from a .env file."
|
|
14
|
+
|
|
15
|
+
Args:
|
|
16
|
+
env_file_name: The name of the .env file to look for in the repository root / current working directory. If
|
|
17
|
+
the file is found, the variables will be loaded from the file. If the file is not found, the user will
|
|
18
|
+
be prompted to enter the variables and the file will be created.
|
|
19
|
+
|
|
20
|
+
Returns:
|
|
21
|
+
CogniteClient: An instance of CogniteClient configured with the loaded environment variables.
|
|
22
|
+
"""
|
|
23
|
+
try:
|
|
24
|
+
return get_cognite_client_internal(env_file_name)
|
|
25
|
+
except Exception as e:
|
|
26
|
+
raise RuntimeError(f"Failed to create client ❌: {e!s}") from None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def get_cognite_client_internal(env_file_name: str) -> CogniteClient:
|
|
30
|
+
# This function raises exceptions on failure
|
|
31
|
+
if not env_file_name.endswith(".env"):
|
|
32
|
+
raise ValueError(f"env_file_name must end with '.env'. Got: {env_file_name!r}")
|
|
33
|
+
global_config.disable_pypi_version_check = True
|
|
34
|
+
global_config.silence_feature_preview_warnings = True
|
|
35
|
+
env_vars = get_environment_variables(env_file_name)
|
|
36
|
+
client_config = create_client_config_from_env_vars(env_vars)
|
|
37
|
+
# Todo validate credentials by making a simple call to CDF
|
|
38
|
+
# Offer to store credentials securely if valid
|
|
39
|
+
#
|
|
40
|
+
return CogniteClient(client_config)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def create_client_config_from_env_vars(env_vars: ClientEnvironmentVariables) -> ClientConfig:
|
|
44
|
+
return ClientConfig(
|
|
45
|
+
client_name=CLIENT_NAME,
|
|
46
|
+
project=env_vars.CDF_PROJECT,
|
|
47
|
+
credentials=get_credentials(env_vars),
|
|
48
|
+
max_workers=env_vars.CDF_MAX_WORKERS,
|
|
49
|
+
timeout=env_vars.CDF_CLIENT_TIMEOUT,
|
|
50
|
+
base_url=env_vars.cdf_url,
|
|
51
|
+
)
|
|
@@ -23,7 +23,7 @@ from cognite.neat._data_model.models.dms._view_property import (
|
|
|
23
23
|
ViewRequestProperty,
|
|
24
24
|
)
|
|
25
25
|
from cognite.neat._data_model.models.dms._views import ViewRequest
|
|
26
|
-
from cognite.neat._utils.useful_types import ModusOperandi
|
|
26
|
+
from cognite.neat._utils.useful_types import ModusOperandi, T_Reference
|
|
27
27
|
|
|
28
28
|
# Type aliases for better readability
|
|
29
29
|
ViewsByReference: TypeAlias = dict[ViewReference, ViewRequest]
|
|
@@ -458,9 +458,42 @@ class ValidationResources:
|
|
|
458
458
|
view_sets = [self.views_by_container.get(c, set()) for c in containers]
|
|
459
459
|
return set.intersection(*view_sets)
|
|
460
460
|
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
461
|
+
@cached_property
|
|
462
|
+
def implements_graph(self) -> nx.DiGraph:
|
|
463
|
+
"""Build a weighted directed graph of view implements.
|
|
464
|
+
|
|
465
|
+
Nodes are ViewReferences, edges represent implements.
|
|
466
|
+
An edge A → B means view A implements view B. Order of views in implements is used to set weight of an edge.
|
|
467
|
+
|
|
468
|
+
Includes views from both merged schema and CDF
|
|
469
|
+
"""
|
|
470
|
+
graph: nx.DiGraph = nx.DiGraph()
|
|
471
|
+
|
|
472
|
+
for view_ref in self.cdf.views:
|
|
473
|
+
graph.add_node(view_ref)
|
|
474
|
+
for view_ref in self.merged.views:
|
|
475
|
+
graph.add_node(view_ref)
|
|
476
|
+
|
|
477
|
+
# Add edges for implements
|
|
478
|
+
for view_ref in graph.nodes():
|
|
479
|
+
view = self.select_view(view_ref)
|
|
480
|
+
if not view or not view.implements:
|
|
481
|
+
continue
|
|
482
|
+
|
|
483
|
+
# Adding weight to preserve order of implements
|
|
484
|
+
for i, implement in enumerate(view.implements):
|
|
485
|
+
graph.add_edge(view_ref, implement, weight=i + 1)
|
|
486
|
+
|
|
487
|
+
return graph
|
|
488
|
+
|
|
489
|
+
@cached_property
|
|
490
|
+
def implements_cycles(self) -> list[list[ViewReference]]:
|
|
491
|
+
"""Find all cycles in the implements graph.
|
|
492
|
+
Returns:
|
|
493
|
+
List of lists, where each list contains the ordered Views involved in forming the implements cycle.
|
|
494
|
+
"""
|
|
495
|
+
|
|
496
|
+
return self.graph_cycles(self.implements_graph)
|
|
464
497
|
|
|
465
498
|
@cached_property
|
|
466
499
|
def requires_constraint_graph(self) -> nx.DiGraph:
|
|
@@ -524,15 +557,15 @@ class ValidationResources:
|
|
|
524
557
|
return False
|
|
525
558
|
|
|
526
559
|
@cached_property
|
|
527
|
-
def requires_constraint_cycles(self) -> list[
|
|
528
|
-
"""Find all cycles in the requires constraint graph
|
|
529
|
-
|
|
530
|
-
Uses strongly connected components (SCC) to identify cycles efficiently.
|
|
531
|
-
An SCC with more than one node indicates a cycle.
|
|
532
|
-
|
|
560
|
+
def requires_constraint_cycles(self) -> list[list[ContainerReference]]:
|
|
561
|
+
"""Find all cycles in the requires constraint graph.
|
|
533
562
|
Returns:
|
|
534
|
-
List of
|
|
563
|
+
List of lists, where each list contains the ordered containers involved in forming the requires cycle.
|
|
535
564
|
"""
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
565
|
+
|
|
566
|
+
return self.graph_cycles(self.requires_constraint_graph)
|
|
567
|
+
|
|
568
|
+
@staticmethod
|
|
569
|
+
def graph_cycles(graph: nx.DiGraph) -> list[list[T_Reference]]:
|
|
570
|
+
"""Returns cycles in the graph otherwise empty list"""
|
|
571
|
+
return [candidate for candidate in nx.simple_cycles(graph) if len(candidate) > 1]
|
|
@@ -3,6 +3,8 @@ from collections import defaultdict
|
|
|
3
3
|
from dataclasses import dataclass, field
|
|
4
4
|
from typing import Any, Literal
|
|
5
5
|
|
|
6
|
+
from pydantic import ValidationError
|
|
7
|
+
|
|
6
8
|
from cognite.neat._data_model._constants import DEFAULT_MAX_LIST_SIZE, DEFAULT_MAX_LIST_SIZE_DIRECT_RELATIONS
|
|
7
9
|
from cognite.neat._data_model.importers._table_importer.data_classes import (
|
|
8
10
|
CREATOR_KEY,
|
|
@@ -12,8 +14,11 @@ from cognite.neat._data_model.importers._table_importer.data_classes import (
|
|
|
12
14
|
DMSNode,
|
|
13
15
|
DMSProperty,
|
|
14
16
|
DMSView,
|
|
17
|
+
EntityTableFilter,
|
|
15
18
|
MetadataValue,
|
|
19
|
+
RAWFilterTableFilter,
|
|
16
20
|
TableDMS,
|
|
21
|
+
TableViewFilter,
|
|
17
22
|
)
|
|
18
23
|
from cognite.neat._data_model.models.dms import (
|
|
19
24
|
ContainerPropertyDefinition,
|
|
@@ -23,7 +28,11 @@ from cognite.neat._data_model.models.dms import (
|
|
|
23
28
|
DataType,
|
|
24
29
|
DirectNodeRelation,
|
|
25
30
|
EnumProperty,
|
|
31
|
+
EqualsFilterData,
|
|
32
|
+
Filter,
|
|
26
33
|
FilterAdapter,
|
|
34
|
+
HasDataFilter,
|
|
35
|
+
InFilterData,
|
|
27
36
|
ListablePropertyTypeDefinition,
|
|
28
37
|
NodeReference,
|
|
29
38
|
RequestSchema,
|
|
@@ -299,13 +308,60 @@ class DMSTableWriter:
|
|
|
299
308
|
implements=[self._create_view_entity(parent) for parent in view.implements]
|
|
300
309
|
if view.implements
|
|
301
310
|
else None,
|
|
302
|
-
filter=
|
|
303
|
-
if view.filter
|
|
304
|
-
else None,
|
|
311
|
+
filter=self.write_view_filter(view.filter),
|
|
305
312
|
)
|
|
306
313
|
for view in views
|
|
307
314
|
]
|
|
308
315
|
|
|
316
|
+
def write_view_filter(self, filter: Filter | None) -> TableViewFilter | None:
|
|
317
|
+
if filter is None:
|
|
318
|
+
return None
|
|
319
|
+
filter_type, entities = self._get_entity_filter(filter)
|
|
320
|
+
if filter_type is not None and entities:
|
|
321
|
+
return EntityTableFilter(type=filter_type, entities=entities)
|
|
322
|
+
else:
|
|
323
|
+
return RAWFilterTableFilter(filter=FilterAdapter.dump_json(filter, by_alias=True).decode(encoding="utf-8"))
|
|
324
|
+
|
|
325
|
+
def _get_entity_filter(self, filter: Filter) -> tuple[Literal["nodeType", "hasData"] | None, list[ParsedEntity]]:
|
|
326
|
+
"""If the filter is an entity-based filter (Equals or In on nodes), return the type and entities.
|
|
327
|
+
Otherwise, return (None, [])."""
|
|
328
|
+
if filter is None or len(filter) != 1:
|
|
329
|
+
return None, []
|
|
330
|
+
filter_name, body = next(iter(filter.items()))
|
|
331
|
+
if (
|
|
332
|
+
isinstance(body, EqualsFilterData)
|
|
333
|
+
and body.property == ["node", "type"]
|
|
334
|
+
and isinstance(body.value, dict)
|
|
335
|
+
and (node_reference := self._try_get_node_reference(body.value))
|
|
336
|
+
):
|
|
337
|
+
return "nodeType", [self._create_node_entity(node_reference)]
|
|
338
|
+
elif (
|
|
339
|
+
isinstance(body, InFilterData)
|
|
340
|
+
and body.property == ["node", "type"]
|
|
341
|
+
and isinstance(body.values, list)
|
|
342
|
+
# All values must be node references
|
|
343
|
+
and len(node_references := [ref for value in body.values if (ref := self._try_get_node_reference(value))])
|
|
344
|
+
== len(body.values)
|
|
345
|
+
):
|
|
346
|
+
return "nodeType", [self._create_node_entity(node) for node in node_references]
|
|
347
|
+
elif (
|
|
348
|
+
isinstance(body, HasDataFilter)
|
|
349
|
+
and
|
|
350
|
+
# All data must be container references, a single view reference makes it a raw filter
|
|
351
|
+
len(container_refs := [item for item in body.data if isinstance(item, ContainerReference)])
|
|
352
|
+
== len(body.data)
|
|
353
|
+
):
|
|
354
|
+
return "hasData", [self._create_container_entity(item) for item in container_refs]
|
|
355
|
+
else:
|
|
356
|
+
return None, []
|
|
357
|
+
|
|
358
|
+
@staticmethod
|
|
359
|
+
def _try_get_node_reference(value: Any) -> NodeReference | None:
|
|
360
|
+
try:
|
|
361
|
+
return NodeReference.model_validate(value)
|
|
362
|
+
except ValidationError:
|
|
363
|
+
return None
|
|
364
|
+
|
|
309
365
|
def write_view_properties(self, views: list[ViewRequest], container: ContainerProperties) -> ViewProperties:
|
|
310
366
|
output = ViewProperties()
|
|
311
367
|
for view in views:
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import json
|
|
2
1
|
from collections.abc import Mapping
|
|
3
2
|
from typing import Annotated, Literal, cast, get_args
|
|
4
3
|
|
|
@@ -18,11 +17,6 @@ from traitlets import Any
|
|
|
18
17
|
from cognite.neat._data_model.models.entities import ParsedEntity, parse_entities, parse_entity
|
|
19
18
|
from cognite.neat._utils.text import title_case
|
|
20
19
|
from cognite.neat._utils.useful_types import CellValueType
|
|
21
|
-
from cognite.neat._v0.core._data_model.models.entities import (
|
|
22
|
-
HasDataFilter,
|
|
23
|
-
NodeTypeFilter,
|
|
24
|
-
RawFilter,
|
|
25
|
-
)
|
|
26
20
|
|
|
27
21
|
# This marker is used to identify creator in the description field.
|
|
28
22
|
CREATOR_MARKER = "Creator: "
|
|
@@ -146,30 +140,59 @@ class DMSProperty(TableObj):
|
|
|
146
140
|
return self
|
|
147
141
|
|
|
148
142
|
|
|
143
|
+
class EntityTableFilter(BaseModel):
|
|
144
|
+
"""These are special formats that Neat Table format supports for filters."""
|
|
145
|
+
|
|
146
|
+
type: Literal["hasData", "nodeType"]
|
|
147
|
+
entities: EntityList
|
|
148
|
+
|
|
149
|
+
def __str__(self) -> str:
|
|
150
|
+
entities_str = ",".join(str(entity) for entity in self.entities)
|
|
151
|
+
return f"{self.type}({entities_str})"
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class RAWFilterTableFilter(BaseModel):
|
|
155
|
+
"""This is a generic filter that holds raw JSON filter."""
|
|
156
|
+
|
|
157
|
+
type: Literal["rawFilter"] = "rawFilter"
|
|
158
|
+
filter: str
|
|
159
|
+
|
|
160
|
+
def __str__(self) -> str:
|
|
161
|
+
return f"rawFilter({self.filter})"
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _parse_table_filter(v: str) -> dict[str, str] | EntityTableFilter | RAWFilterTableFilter:
|
|
165
|
+
if isinstance(v, EntityTableFilter | RAWFilterTableFilter):
|
|
166
|
+
return v
|
|
167
|
+
filter_configs = {
|
|
168
|
+
"hasdata(": ("hasData", "entities"),
|
|
169
|
+
"nodetype(": ("nodeType", "entities"),
|
|
170
|
+
"rawfilter(": ("rawFilter", "filter"),
|
|
171
|
+
}
|
|
172
|
+
v_lowered = v.casefold()
|
|
173
|
+
for prefix, (filter_type, field_name) in filter_configs.items():
|
|
174
|
+
if v_lowered.startswith(prefix) and v_lowered.endswith(")"):
|
|
175
|
+
return {"type": filter_type, field_name: v[len(prefix) : -1]}
|
|
176
|
+
# Fallback to raw filter with the whole string
|
|
177
|
+
return {"type": "rawFilter", "filter": v}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
TableViewFilter = Annotated[
|
|
181
|
+
EntityTableFilter | RAWFilterTableFilter,
|
|
182
|
+
Field(discriminator="type"),
|
|
183
|
+
BeforeValidator(_parse_table_filter, str),
|
|
184
|
+
PlainSerializer(func=str),
|
|
185
|
+
]
|
|
186
|
+
|
|
187
|
+
|
|
149
188
|
class DMSView(TableObj):
|
|
150
189
|
view: Entity
|
|
151
190
|
name: str | None = None
|
|
152
191
|
description: str | None = None
|
|
153
192
|
implements: EntityList | None = None
|
|
154
|
-
filter:
|
|
193
|
+
filter: TableViewFilter | None = None
|
|
155
194
|
in_model: bool | None = Field(None, exclude=True, description="Legacy column")
|
|
156
195
|
|
|
157
|
-
@field_validator("filter", mode="after")
|
|
158
|
-
def _legacy_filter(cls, value: str | None) -> str | None:
|
|
159
|
-
if value is None:
|
|
160
|
-
return value
|
|
161
|
-
|
|
162
|
-
value_lower = value.lower()
|
|
163
|
-
|
|
164
|
-
if value_lower.startswith("hasdata("):
|
|
165
|
-
return json.dumps(HasDataFilter.load(value).as_dms_filter().dump())
|
|
166
|
-
elif value_lower.startswith("nodetype("):
|
|
167
|
-
return json.dumps(NodeTypeFilter.load(value).as_dms_filter().dump())
|
|
168
|
-
elif value_lower.startswith("rawfilter("):
|
|
169
|
-
return json.dumps(RawFilter.load(value).as_dms_filter().dump())
|
|
170
|
-
|
|
171
|
-
return value
|
|
172
|
-
|
|
173
196
|
|
|
174
197
|
class DMSContainer(TableObj):
|
|
175
198
|
container: Entity
|
|
@@ -30,7 +30,19 @@ from cognite.neat._issues import ModelSyntaxError
|
|
|
30
30
|
from cognite.neat._utils.text import humanize_collection
|
|
31
31
|
from cognite.neat._utils.validation import ValidationContext, humanize_validation_error
|
|
32
32
|
|
|
33
|
-
from .data_classes import
|
|
33
|
+
from .data_classes import (
|
|
34
|
+
CREATOR_KEY,
|
|
35
|
+
CREATOR_MARKER,
|
|
36
|
+
DMSContainer,
|
|
37
|
+
DMSEnum,
|
|
38
|
+
DMSNode,
|
|
39
|
+
DMSProperty,
|
|
40
|
+
DMSView,
|
|
41
|
+
EntityTableFilter,
|
|
42
|
+
RAWFilterTableFilter,
|
|
43
|
+
TableDMS,
|
|
44
|
+
TableViewFilter,
|
|
45
|
+
)
|
|
34
46
|
from .source import TableSource
|
|
35
47
|
|
|
36
48
|
T_BaseModel = TypeVar("T_BaseModel", bound=BaseModel)
|
|
@@ -845,19 +857,6 @@ class DMSTableReader:
|
|
|
845
857
|
views_requests: list[ViewRequest] = []
|
|
846
858
|
rows_by_seen: dict[ParsedEntity, list[int]] = defaultdict(list)
|
|
847
859
|
for row_no, view in enumerate(views):
|
|
848
|
-
filter_dict: dict[str, Any] | None = None
|
|
849
|
-
if view.filter is not None:
|
|
850
|
-
try:
|
|
851
|
-
filter_dict = json.loads(view.filter)
|
|
852
|
-
except ValueError as e:
|
|
853
|
-
self.errors.append(
|
|
854
|
-
ModelSyntaxError(
|
|
855
|
-
message=(
|
|
856
|
-
f"In {self.source.location((self.Sheets.views, row_no, self.ViewColumns.filter))} "
|
|
857
|
-
f"must be valid json. Got error {e!s}"
|
|
858
|
-
)
|
|
859
|
-
)
|
|
860
|
-
)
|
|
861
860
|
view_request = self._validate_obj(
|
|
862
861
|
ViewRequest,
|
|
863
862
|
dict(
|
|
@@ -865,7 +864,7 @@ class DMSTableReader:
|
|
|
865
864
|
name=view.name,
|
|
866
865
|
description=view.description,
|
|
867
866
|
implements=[self._create_view_ref(impl) for impl in view.implements] if view.implements else None,
|
|
868
|
-
filter=
|
|
867
|
+
filter=self._create_filter_dict(view.filter, row_no) if view.filter else None,
|
|
869
868
|
properties=properties.get(view.view, {}),
|
|
870
869
|
),
|
|
871
870
|
(self.Sheets.views, row_no),
|
|
@@ -891,6 +890,46 @@ class DMSTableReader:
|
|
|
891
890
|
)
|
|
892
891
|
return views_requests, set(rows_by_seen.keys())
|
|
893
892
|
|
|
893
|
+
def _create_filter_dict(self, filter: TableViewFilter, row_no: int) -> dict[str, Any] | None:
|
|
894
|
+
if isinstance(filter, RAWFilterTableFilter):
|
|
895
|
+
try:
|
|
896
|
+
return json.loads(filter.filter)
|
|
897
|
+
except ValueError as e:
|
|
898
|
+
self.errors.append(
|
|
899
|
+
ModelSyntaxError(
|
|
900
|
+
message=(
|
|
901
|
+
f"In {self.source.location((self.Sheets.views, row_no, self.ViewColumns.filter))} "
|
|
902
|
+
f"must be valid json. Got error {e!s}"
|
|
903
|
+
)
|
|
904
|
+
)
|
|
905
|
+
)
|
|
906
|
+
return None
|
|
907
|
+
elif isinstance(filter, EntityTableFilter):
|
|
908
|
+
return self._create_entity_filter_dict(filter)
|
|
909
|
+
else:
|
|
910
|
+
# This is unreachable due to validation of the TableViewFilter model.
|
|
911
|
+
raise RuntimeError(f"Unknown filter type {filter.__class__.__name__}")
|
|
912
|
+
|
|
913
|
+
def _create_entity_filter_dict(self, filter: EntityTableFilter) -> dict[str, Any]:
|
|
914
|
+
"""Creates the filter dictionary from an EntityTableFilter."""
|
|
915
|
+
if filter.type == "hasData":
|
|
916
|
+
return {
|
|
917
|
+
"hasData": [{**self._create_container_ref(entity), "type": "container"} for entity in filter.entities]
|
|
918
|
+
}
|
|
919
|
+
elif filter.type == "nodeType":
|
|
920
|
+
if len(filter.entities) == 1:
|
|
921
|
+
return {"equals": {"property": ["node", "type"], "value": self._create_node_ref(filter.entities[0])}}
|
|
922
|
+
else:
|
|
923
|
+
return {
|
|
924
|
+
"in": {
|
|
925
|
+
"property": ["node", "type"],
|
|
926
|
+
"values": [self._create_node_ref(entity) for entity in filter.entities],
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
else:
|
|
930
|
+
# This is unreachable due to validation of the EntityTableFilter model.
|
|
931
|
+
raise RuntimeError(f"Unknown filter type {filter.__class__.__name__}")
|
|
932
|
+
|
|
894
933
|
def read_data_model(self, tables: TableDMS, valid_view_entities: set[ParsedEntity]) -> DataModelRequest:
|
|
895
934
|
data: dict[str, Any] = {
|
|
896
935
|
**{meta.key: meta.value for meta in tables.metadata},
|
|
@@ -2,9 +2,9 @@ from collections import Counter
|
|
|
2
2
|
|
|
3
3
|
from pydantic import Field, ValidationInfo, field_validator
|
|
4
4
|
|
|
5
|
+
from cognite.neat._data_model.models.entities import ConceptEntity
|
|
5
6
|
from cognite.neat._data_model.models.entities._constants import PREFIX_PATTERN, SUFFIX_PATTERN, VERSION_PATTERN
|
|
6
7
|
from cognite.neat._utils.text import humanize_collection
|
|
7
|
-
from cognite.neat._v0.core._data_model.models.entities._single_value import ConceptEntity
|
|
8
8
|
|
|
9
9
|
from ._base import ResourceMetadata
|
|
10
10
|
from ._concept import Concept
|
|
@@ -3,7 +3,7 @@ from abc import ABC
|
|
|
3
3
|
from pydantic import Field, field_validator
|
|
4
4
|
|
|
5
5
|
from cognite.neat._data_model.models.dms._references import SpaceReference
|
|
6
|
-
from cognite.neat.
|
|
6
|
+
from cognite.neat._utils.text import humanize_collection
|
|
7
7
|
|
|
8
8
|
from ._base import APIResource, Resource, WriteableResource
|
|
9
9
|
from ._constants import FORBIDDEN_SPACES, SPACE_FORMAT_PATTERN
|