cognite-neat 1.0.24__tar.gz → 1.0.26__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.24 → cognite_neat-1.0.26}/PKG-INFO +1 -1
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/__init__.py +1 -1
- cognite_neat-1.0.26/cognite/neat/_client/api.py +178 -0
- cognite_neat-1.0.26/cognite/neat/_client/containers_api.py +77 -0
- cognite_neat-1.0.26/cognite/neat/_client/data_model_api.py +87 -0
- cognite_neat-1.0.26/cognite/neat/_client/filters.py +40 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/init/credentials.py +0 -10
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/init/env_vars.py +34 -22
- cognite_neat-1.0.26/cognite/neat/_client/init/interactive.py +133 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/init/main.py +25 -15
- cognite_neat-1.0.26/cognite/neat/_client/spaces_api.py +80 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/statistics_api.py +9 -4
- cognite_neat-1.0.26/cognite/neat/_client/views_api.py +94 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_base.py +3 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_session.py +13 -1
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/http_client/_client.py +3 -1
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/http_client/_data_classes.py +3 -3
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/repo.py +6 -4
- cognite_neat-1.0.26/cognite/neat/_version.py +2 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/pyproject.toml +1 -1
- cognite_neat-1.0.24/cognite/neat/_client/api.py +0 -8
- cognite_neat-1.0.24/cognite/neat/_client/containers_api.py +0 -138
- cognite_neat-1.0.24/cognite/neat/_client/data_model_api.py +0 -115
- cognite_neat-1.0.24/cognite/neat/_client/spaces_api.py +0 -115
- cognite_neat-1.0.24/cognite/neat/_client/views_api.py +0 -144
- cognite_neat-1.0.24/cognite/neat/_version.py +0 -2
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/README.md +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/client.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/config.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/data_classes.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_client/init/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_config.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/_analysis.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/_identifiers.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/_shared.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/_snapshot.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/_differ.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/_differ_container.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/_differ_data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/_differ_space.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/_differ_view.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/data_classes.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/deployer/deployer.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/_api_exporter.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/_table_exporter/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/_table_exporter/exporter.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/_table_exporter/workbook.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/exporters/_table_exporter/writer.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_api_importer.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_table_importer/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_table_importer/data_classes.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_table_importer/importer.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_table_importer/reader.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/importers/_table_importer/source.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/conceptual/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/conceptual/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/conceptual/_concept.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/conceptual/_data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/conceptual/_properties.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/conceptual/_property.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_constraints.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_container.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_data_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_http.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_indexes.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_limits.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_references.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_schema.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_space.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_view_filter.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_view_property.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/dms/_views.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/entities/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/entities/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/entities/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/entities/_data_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/entities/_identifiers.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/models/entities/_parser.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_ai_readiness.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_connections.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_consistency.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_containers.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_limits.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_orchestrator.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_data_model/validation/dms/_views.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_exceptions.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_issues.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/_render.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/static/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/static/deployment.css +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/static/deployment.js +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/static/issues.css +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/static/issues.js +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/static/shared.css +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/templates/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/templates/deployment.html +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_html/templates/issues.html +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_issues.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_physical.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/_deployment/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/_deployment/_physical/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/_deployment/_physical/_changes.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/_deployment/_physical/_statistics.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/_deployment/_physical/serializer.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_result/_result.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_usage_analytics/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_usage_analytics/_collector.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_usage_analytics/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_usage_analytics/_storage.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_session/_wrappers.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_state_machine/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_state_machine/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_state_machine/_states.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_store/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_store/_provenance.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_store/_store.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/_reader.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/auxiliary.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/collection.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/http_client/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/http_client/_config.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/http_client/_tracker.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/text.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/useful_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_utils/validation.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/_api/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/_api/data_modeling_loaders.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/_api/neat_instances.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/_api/schema.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/_api/statistics.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/_api_client.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/data_classes/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/data_classes/data_modeling.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/data_classes/neat_sequence.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/data_classes/schema.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/data_classes/statistics.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_client/testing.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_config.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/_shared.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/analysis/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/analysis/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/catalog/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/catalog/classic_model.xlsx +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/catalog/conceptual-imf-data-model.xlsx +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/catalog/hello_world_pump.xlsx +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/_data_model2dms.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/_data_model2excel.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/_data_model2instance_template.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/_data_model2semantic_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/exporters/_data_model2yaml.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_base_file_reader.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_dict2data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_dms2data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_graph2data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_rdf/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_rdf/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_rdf/_inference2rdata_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_rdf/_owl2data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_rdf/_shared.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/importers/_spreadsheet2data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/_base_unverified.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/_base_verified.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/_import_contexts.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/conceptual/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/conceptual/_unverified.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/conceptual/_validation.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/conceptual/_verified.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/data_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_constants.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_loaders.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_multi_value.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_restrictions.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_single_value.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_types.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/entities/_wrapped.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/mapping/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/mapping/_classic2core.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/mapping/_classic2core.yaml +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/physical/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/physical/_exporter.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/physical/_unverified.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/physical/_validation.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/models/physical/_verified.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/transformers/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/transformers/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/transformers/_converters.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/transformers/_mapping.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/transformers/_union_conceptual.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_data_model/transformers/_verification.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/_shared.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/_tracking/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/_tracking/base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/_tracking/log.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/examples/Knowledge-Graph-Nordic44-dirty.xml +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/examples/Knowledge-Graph-Nordic44.xml +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/examples/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/examples/skos-capturing-sheet-wind-topics.xlsx +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_assets.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_classic.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_data_sets.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_events.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_files.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_labels.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_relationships.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_sequences.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_classic_cdf/_timeseries.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_dict.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_dms.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_dms_graph.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_mock_graph_generator.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_raw.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/extractors/_rdf_file.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/loaders/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/loaders/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/loaders/_rdf2dms.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/loaders/_rdf_to_instance_space.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/queries/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/queries/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/queries/_queries.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/queries/_select.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/queries/_update.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/transformers/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/transformers/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/transformers/_classic_cdf.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/transformers/_prune_graph.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/transformers/_rdfpath.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_instances/transformers/_value_type.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/_contextmanagers.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/_factory.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/errors/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/errors/_external.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/errors/_general.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/errors/_properties.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/errors/_resources.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/errors/_wrapper.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/formatters.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/_external.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/_general.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/_models.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/_properties.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/_resources.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_issues/warnings/user_modeling.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_shared.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_store/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_store/_data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_store/_instance.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_store/_provenance.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_store/exceptions.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/auth.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/auxiliary.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/collection_.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/graph_transformations_report.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/io_.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/rdf_.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/reader/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/reader/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/spreadsheet.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/tarjan.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/text.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/time_.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/upload.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/core/_utils/xml_.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/engine/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/engine/_import.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/engine/_interface.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/engine/_load.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/plugins/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/plugins/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/plugins/_data_model.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/plugins/_issues.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/plugins/_manager.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/__init__.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_base.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_collector.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_diff.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_drop.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_experimental.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_explore.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_fix.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_inspect.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_mapping.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_plugin.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_prepare.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_read.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_set.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_show.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_state/README.md +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_state.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_subset.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_template.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_to.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/_wizard.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/_v0/session/exceptions.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/legacy.py +0 -0
- {cognite_neat-1.0.24 → cognite_neat-1.0.26}/cognite/neat/py.typed +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.26
|
|
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,178 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from collections.abc import Iterable, Sequence
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any, Generic, Literal, TypeAlias, TypeVar
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel, JsonValue, TypeAdapter
|
|
7
|
+
|
|
8
|
+
from cognite.neat._client.config import NeatClientConfig
|
|
9
|
+
from cognite.neat._data_model.models.dms._base import T_Resource, T_Response
|
|
10
|
+
from cognite.neat._utils.collection import chunker_sequence
|
|
11
|
+
from cognite.neat._utils.http_client import HTTPClient, ParametersRequest, SimpleBodyRequest, SuccessResponse
|
|
12
|
+
from cognite.neat._utils.useful_types import T_Reference
|
|
13
|
+
|
|
14
|
+
from .data_classes import PagedResponse
|
|
15
|
+
|
|
16
|
+
_T_BaseModel = TypeVar("_T_BaseModel", bound=BaseModel)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass(frozen=True)
|
|
20
|
+
class Endpoint:
|
|
21
|
+
method: Literal["GET", "POST"]
|
|
22
|
+
path: str
|
|
23
|
+
item_limit: int
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
APIMethod: TypeAlias = Literal["apply", "retrieve", "delete", "list"]
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class NeatAPI(Generic[T_Reference, T_Resource, T_Response], ABC):
|
|
30
|
+
def __init__(
|
|
31
|
+
self, neat_config: NeatClientConfig, http_client: HTTPClient, endpoint_map: dict[APIMethod, Endpoint]
|
|
32
|
+
) -> None:
|
|
33
|
+
self._config = neat_config
|
|
34
|
+
self._http_client = http_client
|
|
35
|
+
self._method_endpoint_map = endpoint_map
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def _validate_page_response(self, response: SuccessResponse) -> PagedResponse[T_Response]:
|
|
39
|
+
"""Parse a single item response."""
|
|
40
|
+
raise NotImplementedError()
|
|
41
|
+
|
|
42
|
+
@abstractmethod
|
|
43
|
+
def _validate_id_response(self, response: SuccessResponse) -> list[T_Reference]:
|
|
44
|
+
"""Parse a single item response."""
|
|
45
|
+
raise NotImplementedError()
|
|
46
|
+
|
|
47
|
+
def _make_url(self, path: str = "") -> str:
|
|
48
|
+
"""Create the full URL for this resource endpoint."""
|
|
49
|
+
return self._config.create_api_url(path)
|
|
50
|
+
|
|
51
|
+
def _request_item_response(
|
|
52
|
+
self,
|
|
53
|
+
items: Sequence[BaseModel],
|
|
54
|
+
method: APIMethod,
|
|
55
|
+
extra_body: dict[str, Any] | None = None,
|
|
56
|
+
) -> list[T_Response]:
|
|
57
|
+
response_items: list[T_Response] = []
|
|
58
|
+
for response in self._chunk_requests(items, method, extra_body):
|
|
59
|
+
response_items.extend(self._validate_page_response(response).items)
|
|
60
|
+
return response_items
|
|
61
|
+
|
|
62
|
+
def _request_id_response(
|
|
63
|
+
self,
|
|
64
|
+
items: Sequence[BaseModel],
|
|
65
|
+
method: APIMethod,
|
|
66
|
+
extra_body: dict[str, Any] | None = None,
|
|
67
|
+
) -> list[T_Reference]:
|
|
68
|
+
response_items: list[T_Reference] = []
|
|
69
|
+
for response in self._chunk_requests(items, method, extra_body):
|
|
70
|
+
response_items.extend(self._validate_id_response(response))
|
|
71
|
+
return response_items
|
|
72
|
+
|
|
73
|
+
def _chunk_requests(
|
|
74
|
+
self,
|
|
75
|
+
items: Sequence[_T_BaseModel],
|
|
76
|
+
method: APIMethod,
|
|
77
|
+
extra_body: dict[str, Any] | None = None,
|
|
78
|
+
) -> Iterable[SuccessResponse]:
|
|
79
|
+
"""Send requests in chunks and yield responses.
|
|
80
|
+
|
|
81
|
+
Args:
|
|
82
|
+
items: The items to process.
|
|
83
|
+
method: The API method to use. This is used ot look the up the endpoint.
|
|
84
|
+
extra_body: Optional extra body content to include in the request.
|
|
85
|
+
|
|
86
|
+
Yields:
|
|
87
|
+
The successful responses from the API.
|
|
88
|
+
"""
|
|
89
|
+
# Filter out None
|
|
90
|
+
endpoint = self._method_endpoint_map[method]
|
|
91
|
+
|
|
92
|
+
for chunk in chunker_sequence(items, endpoint.item_limit):
|
|
93
|
+
request = SimpleBodyRequest(
|
|
94
|
+
endpoint_url=self._make_url(endpoint.path),
|
|
95
|
+
method=endpoint.method,
|
|
96
|
+
body=TypeAdapter(dict[str, JsonValue]).dump_json(
|
|
97
|
+
{
|
|
98
|
+
"items": [item.model_dump(by_alias=True) for item in chunk],
|
|
99
|
+
**(extra_body or {}),
|
|
100
|
+
},
|
|
101
|
+
),
|
|
102
|
+
)
|
|
103
|
+
response = self._http_client.request_with_retries(request)
|
|
104
|
+
response.raise_for_status()
|
|
105
|
+
yield response.success_response
|
|
106
|
+
|
|
107
|
+
@classmethod
|
|
108
|
+
def _filter_out_none_values(cls, params: dict[str, Any] | None) -> dict[str, Any] | None:
|
|
109
|
+
request_params: dict[str, Any] | None = None
|
|
110
|
+
if params:
|
|
111
|
+
request_params = {k: v for k, v in params.items() if v is not None}
|
|
112
|
+
return request_params
|
|
113
|
+
|
|
114
|
+
def _paginate(
|
|
115
|
+
self,
|
|
116
|
+
limit: int,
|
|
117
|
+
cursor: str | None = None,
|
|
118
|
+
params: dict[str, Any] | None = None,
|
|
119
|
+
) -> PagedResponse[T_Response]:
|
|
120
|
+
"""Fetch a single page of resources.
|
|
121
|
+
|
|
122
|
+
Args:
|
|
123
|
+
params: Query parameters for the request. Supported parameters depend on
|
|
124
|
+
the resource type but typically include:
|
|
125
|
+
- cursor: Cursor for pagination
|
|
126
|
+
- limit: Maximum number of items (defaults to list limit)
|
|
127
|
+
- space: Filter by space
|
|
128
|
+
- includeGlobal: Whether to include global resources
|
|
129
|
+
limit: Maximum number of items to return in the page.
|
|
130
|
+
cursor: Cursor for pagination.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
A Page containing the items and the cursor for the next page.
|
|
134
|
+
"""
|
|
135
|
+
endpoint = self._method_endpoint_map["list"]
|
|
136
|
+
if not (0 < limit <= endpoint.item_limit):
|
|
137
|
+
raise ValueError(f"Limit must be between 1 and {endpoint.item_limit}, got {limit}.")
|
|
138
|
+
if endpoint.method != "GET":
|
|
139
|
+
raise NotImplementedError(f"Pagination not implemented for method {endpoint.method}.")
|
|
140
|
+
request_params = self._filter_out_none_values(params) or {}
|
|
141
|
+
request_params["limit"] = limit
|
|
142
|
+
if cursor is not None:
|
|
143
|
+
request_params["cursor"] = cursor
|
|
144
|
+
request = ParametersRequest(
|
|
145
|
+
endpoint_url=self._make_url(endpoint.path),
|
|
146
|
+
method=endpoint.method,
|
|
147
|
+
parameters=request_params,
|
|
148
|
+
)
|
|
149
|
+
result = self._http_client.request_with_retries(request)
|
|
150
|
+
result.raise_for_status()
|
|
151
|
+
return self._validate_page_response(result.success_response)
|
|
152
|
+
|
|
153
|
+
def _iterate(
|
|
154
|
+
self,
|
|
155
|
+
limit: int | None = None,
|
|
156
|
+
cursor: str | None = None,
|
|
157
|
+
params: dict[str, Any] | None = None,
|
|
158
|
+
) -> Iterable[list[T_Response]]:
|
|
159
|
+
"""Iterate over all resources, handling pagination automatically."""
|
|
160
|
+
next_cursor = cursor
|
|
161
|
+
total = 0
|
|
162
|
+
endpoint = self._method_endpoint_map["list"]
|
|
163
|
+
while True:
|
|
164
|
+
page_limit = endpoint.item_limit if limit is None else min(limit - total, endpoint.item_limit)
|
|
165
|
+
page = self._paginate(limit=page_limit, cursor=next_cursor, params=params)
|
|
166
|
+
yield page.items
|
|
167
|
+
total += len(page.items)
|
|
168
|
+
if page.next_cursor is None or (limit is not None and total >= limit):
|
|
169
|
+
break
|
|
170
|
+
next_cursor = page.next_cursor
|
|
171
|
+
|
|
172
|
+
def _list(
|
|
173
|
+
self,
|
|
174
|
+
limit: int | None = None,
|
|
175
|
+
params: dict[str, Any] | None = None,
|
|
176
|
+
) -> list[T_Response]:
|
|
177
|
+
"""List all resources, handling pagination automatically."""
|
|
178
|
+
return [item for batch in self._iterate(limit=limit, params=params) for item in batch]
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
from collections.abc import Sequence
|
|
2
|
+
|
|
3
|
+
from cognite.neat._data_model.models.dms import ContainerReference, ContainerRequest, ContainerResponse
|
|
4
|
+
from cognite.neat._utils.http_client import HTTPClient, SuccessResponse
|
|
5
|
+
|
|
6
|
+
from .api import Endpoint, NeatAPI
|
|
7
|
+
from .config import NeatClientConfig
|
|
8
|
+
from .data_classes import PagedResponse
|
|
9
|
+
from .filters import ContainerFilter
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ContainersAPI(NeatAPI):
|
|
13
|
+
def __init__(self, neat_config: NeatClientConfig, http_client: HTTPClient) -> None:
|
|
14
|
+
super().__init__(
|
|
15
|
+
neat_config,
|
|
16
|
+
http_client,
|
|
17
|
+
endpoint_map={
|
|
18
|
+
"apply": Endpoint("POST", "models/containers", item_limit=100),
|
|
19
|
+
"retrieve": Endpoint("POST", "models/containers/byids", item_limit=100),
|
|
20
|
+
"delete": Endpoint("POST", "models/containers/delete", item_limit=100),
|
|
21
|
+
"list": Endpoint("GET", "models/containers", item_limit=1000),
|
|
22
|
+
},
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def _validate_page_response(self, response: SuccessResponse) -> PagedResponse[ContainerResponse]:
|
|
26
|
+
return PagedResponse[ContainerResponse].model_validate_json(response.body)
|
|
27
|
+
|
|
28
|
+
def _validate_id_response(self, response: SuccessResponse) -> list[ContainerReference]:
|
|
29
|
+
return PagedResponse[ContainerReference].model_validate_json(response.body).items
|
|
30
|
+
|
|
31
|
+
def apply(self, items: Sequence[ContainerRequest]) -> list[ContainerResponse]:
|
|
32
|
+
"""Apply (create or update) containers in CDF.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
items: List of ContainerRequest objects to apply.
|
|
36
|
+
Returns:
|
|
37
|
+
List of ContainerResponse objects.
|
|
38
|
+
"""
|
|
39
|
+
return self._request_item_response(items, "apply")
|
|
40
|
+
|
|
41
|
+
def retrieve(self, items: list[ContainerReference]) -> list[ContainerResponse]:
|
|
42
|
+
"""Retrieve containers by their identifiers.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
items: List of (space, external_id) tuples identifying the containers to retrieve.
|
|
46
|
+
|
|
47
|
+
Returns:
|
|
48
|
+
List of ContainerResponse objects.
|
|
49
|
+
"""
|
|
50
|
+
return self._request_item_response(items, "retrieve")
|
|
51
|
+
|
|
52
|
+
def delete(self, items: list[ContainerReference]) -> list[ContainerReference]:
|
|
53
|
+
"""Delete containers by their identifiers.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
items: List of ContainerReference objects identifying the containers to delete.
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
List of ContainerReference objects representing the deleted containers.
|
|
60
|
+
"""
|
|
61
|
+
return self._request_id_response(items, "delete")
|
|
62
|
+
|
|
63
|
+
def list(
|
|
64
|
+
self, space: str | None = None, include_global: bool = False, limit: int | None = 10
|
|
65
|
+
) -> list[ContainerResponse]:
|
|
66
|
+
"""List containers in CDF Project.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
space: If specified, only containers in this space are returned.
|
|
70
|
+
include_global: If True, include global containers.
|
|
71
|
+
limit: Maximum number of containers to return. If None, return all containers.
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
List of ContainerResponse objects.
|
|
75
|
+
"""
|
|
76
|
+
filter = ContainerFilter(space=space, include_global=include_global)
|
|
77
|
+
return self._list(limit=limit, params=filter.dump())
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
from collections.abc import Sequence
|
|
2
|
+
|
|
3
|
+
from cognite.neat._data_model.models.dms import DataModelReference, DataModelRequest, DataModelResponse
|
|
4
|
+
from cognite.neat._utils.http_client import HTTPClient, SuccessResponse
|
|
5
|
+
|
|
6
|
+
from .api import Endpoint, NeatAPI
|
|
7
|
+
from .config import NeatClientConfig
|
|
8
|
+
from .data_classes import PagedResponse
|
|
9
|
+
from .filters import DataModelFilter
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DataModelsAPI(NeatAPI):
|
|
13
|
+
def __init__(self, neat_config: NeatClientConfig, http_client: HTTPClient) -> None:
|
|
14
|
+
super().__init__(
|
|
15
|
+
neat_config,
|
|
16
|
+
http_client,
|
|
17
|
+
endpoint_map={
|
|
18
|
+
"apply": Endpoint("POST", "/models/datamodels", item_limit=100),
|
|
19
|
+
"retrieve": Endpoint("POST", "/models/datamodels/byids", item_limit=100),
|
|
20
|
+
"delete": Endpoint("POST", "/models/datamodels/delete", item_limit=100),
|
|
21
|
+
"list": Endpoint("GET", "/models/datamodels", item_limit=1000),
|
|
22
|
+
},
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
def _validate_page_response(self, response: SuccessResponse) -> PagedResponse[DataModelResponse]:
|
|
26
|
+
return PagedResponse[DataModelResponse].model_validate_json(response.body)
|
|
27
|
+
|
|
28
|
+
def _validate_id_response(self, response: SuccessResponse) -> list[DataModelReference]:
|
|
29
|
+
return PagedResponse[DataModelReference].model_validate_json(response.body).items
|
|
30
|
+
|
|
31
|
+
def apply(self, data_models: Sequence[DataModelRequest]) -> list[DataModelResponse]:
|
|
32
|
+
"""Apply (create or update) data models in CDF.
|
|
33
|
+
|
|
34
|
+
Args:
|
|
35
|
+
data_models: List of DataModelRequest objects to apply.
|
|
36
|
+
Returns:
|
|
37
|
+
List of DataModelResponse objects.
|
|
38
|
+
"""
|
|
39
|
+
return self._request_item_response(data_models, "apply")
|
|
40
|
+
|
|
41
|
+
def retrieve(self, items: list[DataModelReference]) -> list[DataModelResponse]:
|
|
42
|
+
"""Retrieve data models by their identifiers.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
items: List of data models references identifying the data models to retrieve.
|
|
46
|
+
Returns:
|
|
47
|
+
List of DataModelResponse objects.
|
|
48
|
+
"""
|
|
49
|
+
return self._request_item_response(items, "retrieve")
|
|
50
|
+
|
|
51
|
+
def delete(self, items: list[DataModelReference]) -> list[DataModelReference]:
|
|
52
|
+
"""Delete data models by their identifiers.
|
|
53
|
+
|
|
54
|
+
Args:
|
|
55
|
+
items: List of data model references identifying the data models to delete.
|
|
56
|
+
Returns:
|
|
57
|
+
List of DataModelReference objects representing the deleted data models.
|
|
58
|
+
"""
|
|
59
|
+
return self._request_id_response(items, "delete")
|
|
60
|
+
|
|
61
|
+
def list(
|
|
62
|
+
self,
|
|
63
|
+
space: str | None = None,
|
|
64
|
+
all_versions: bool = False,
|
|
65
|
+
inline_views: bool = False,
|
|
66
|
+
include_global: bool = False,
|
|
67
|
+
limit: int | None = 10,
|
|
68
|
+
) -> list[DataModelResponse]:
|
|
69
|
+
"""List data models in CDF Project.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
space: If specified, only data models in this space are returned.
|
|
73
|
+
all_versions: If True, return all versions. If False, only return the latest version.
|
|
74
|
+
inline_views: If True, include views inline in the response.
|
|
75
|
+
include_global: If True, include global data models.
|
|
76
|
+
limit: Maximum number of data models to return. If None, return all data models.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
List of DataModelResponse objects.
|
|
80
|
+
"""
|
|
81
|
+
filter = DataModelFilter(
|
|
82
|
+
space=space,
|
|
83
|
+
all_versions=all_versions,
|
|
84
|
+
inline_views=inline_views,
|
|
85
|
+
include_global=include_global,
|
|
86
|
+
)
|
|
87
|
+
return self._list(limit=limit, params=filter.dump())
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from typing import Any, Literal
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, ConfigDict
|
|
4
|
+
from pydantic.alias_generators import to_camel
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class BaseModelRequest(BaseModel):
|
|
8
|
+
"""Base class for all object. This includes resources and nested objects."""
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Filter(BaseModel):
|
|
12
|
+
model_config = ConfigDict(alias_generator=to_camel, extra="ignore", populate_by_name=True)
|
|
13
|
+
|
|
14
|
+
def dump(self, camel_case: bool = True) -> dict[str, Any]:
|
|
15
|
+
"""Dump the object to a dictionary.
|
|
16
|
+
|
|
17
|
+
Args:
|
|
18
|
+
camel_case (bool): Whether to use camelCase for the keys. Default is True.
|
|
19
|
+
|
|
20
|
+
"""
|
|
21
|
+
return self.model_dump(mode="json", by_alias=camel_case, exclude_unset=True)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DataModelingFilter(Filter):
|
|
25
|
+
space: str | None = None
|
|
26
|
+
include_global: bool | None = None
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ContainerFilter(DataModelingFilter):
|
|
30
|
+
used_for: Literal["node", "edge", "record", "all"] | None = None
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ViewFilter(DataModelingFilter):
|
|
34
|
+
include_inherited_properties: bool | None = None
|
|
35
|
+
all_versions: bool | None = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class DataModelFilter(DataModelingFilter):
|
|
39
|
+
inline_views: bool | None = None
|
|
40
|
+
all_versions: bool | None = None
|
|
@@ -12,7 +12,6 @@ def get_credentials(env_vars: ClientEnvironmentVariables) -> CredentialProvider:
|
|
|
12
12
|
"client_credentials": create_client_credentials,
|
|
13
13
|
"interactive": create_interactive_credentials,
|
|
14
14
|
"token": create_token_credentials,
|
|
15
|
-
"infer": create_infer_credentials,
|
|
16
15
|
}
|
|
17
16
|
return options[env_vars.LOGIN_FLOW](env_vars)
|
|
18
17
|
|
|
@@ -59,12 +58,3 @@ def create_token_credentials(env_vars: ClientEnvironmentVariables) -> Credential
|
|
|
59
58
|
if not env_vars.CDF_TOKEN:
|
|
60
59
|
raise ValueError("CDF_TOKEN environment variable must be set for token authentication.")
|
|
61
60
|
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)
|
|
@@ -4,7 +4,6 @@ from typing import Any, Literal, TypeAlias, get_args
|
|
|
4
4
|
|
|
5
5
|
from pydantic import BaseModel, ConfigDict, ValidationError
|
|
6
6
|
|
|
7
|
-
from cognite.neat._utils.repo import get_repo_root
|
|
8
7
|
from cognite.neat._utils.validation import humanize_validation_error
|
|
9
8
|
|
|
10
9
|
if sys.version_info >= (3, 11):
|
|
@@ -12,9 +11,10 @@ if sys.version_info >= (3, 11):
|
|
|
12
11
|
else:
|
|
13
12
|
from typing_extensions import Self
|
|
14
13
|
|
|
15
|
-
LoginFlow: TypeAlias = Literal["
|
|
16
|
-
|
|
14
|
+
LoginFlow: TypeAlias = Literal["client_credentials", "interactive", "token"]
|
|
15
|
+
AVAILABLE_LOGIN_FLOWS: tuple[LoginFlow, ...] = get_args(LoginFlow)
|
|
17
16
|
Provider: TypeAlias = Literal["entra_id", "auth0", "cdf", "other"]
|
|
17
|
+
AVAILABLE_PROVIDERS: tuple[Provider, ...] = get_args(Provider)
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
class ClientEnvironmentVariables(BaseModel):
|
|
@@ -24,7 +24,7 @@ class ClientEnvironmentVariables(BaseModel):
|
|
|
24
24
|
CDF_CLUSTER: str
|
|
25
25
|
CDF_PROJECT: str
|
|
26
26
|
PROVIDER: Provider = "entra_id"
|
|
27
|
-
LOGIN_FLOW: LoginFlow = "
|
|
27
|
+
LOGIN_FLOW: LoginFlow = "client_credentials"
|
|
28
28
|
|
|
29
29
|
IDP_CLIENT_ID: str | None = None
|
|
30
30
|
IDP_CLIENT_SECRET: str | None = None
|
|
@@ -103,24 +103,7 @@ class ClientEnvironmentVariables(BaseModel):
|
|
|
103
103
|
)
|
|
104
104
|
|
|
105
105
|
|
|
106
|
-
def
|
|
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:
|
|
106
|
+
def parse_env_file(env_file_path: Path) -> ClientEnvironmentVariables:
|
|
124
107
|
content = env_file_path.read_text()
|
|
125
108
|
variables: dict[str, Any] = {}
|
|
126
109
|
for line in content.splitlines():
|
|
@@ -129,3 +112,32 @@ def _parse_env_file(env_file_path: Path) -> ClientEnvironmentVariables:
|
|
|
129
112
|
key, value = line.strip().split("=", 1)
|
|
130
113
|
variables[key] = value
|
|
131
114
|
return ClientEnvironmentVariables.create_humanize(variables)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def create_env_file_content(provider: Provider, login_flow: LoginFlow) -> str:
|
|
118
|
+
lines = [
|
|
119
|
+
"# Cognite NEAT Client Environment Variables",
|
|
120
|
+
"CDF_CLUSTER=<your-cdf-cluster>",
|
|
121
|
+
"CDF_PROJECT=<your-cdf-project>",
|
|
122
|
+
"",
|
|
123
|
+
]
|
|
124
|
+
if login_flow != "token":
|
|
125
|
+
lines.append(f"PROVIDER={provider}")
|
|
126
|
+
lines.append(f"LOGIN_FLOW={login_flow}")
|
|
127
|
+
lines.append("")
|
|
128
|
+
if login_flow in ("client_credentials", "interactive"):
|
|
129
|
+
lines.append("IDP_CLIENT_ID=<your-idp-client-id>")
|
|
130
|
+
if login_flow == "client_credentials":
|
|
131
|
+
lines.append("IDP_CLIENT_SECRET=<your-idp-client-secret>")
|
|
132
|
+
if provider == "entra_id":
|
|
133
|
+
lines.append("IDP_TENANT_ID=<your-idp-tenant-id>")
|
|
134
|
+
if provider not in ("cdf", "entra_id"):
|
|
135
|
+
lines.append("IDP_TOKEN_URL=<your-idp-token-url>")
|
|
136
|
+
if provider == "other":
|
|
137
|
+
lines.append("IDP_AUDIENCE=<your-idp-audience>")
|
|
138
|
+
lines.append("IDP_SCOPES=<your-idp-scopes-comma-separated>")
|
|
139
|
+
lines.append("IDP_AUTHORITY_URL=<your-idp-authority-url>")
|
|
140
|
+
elif login_flow == "token":
|
|
141
|
+
lines.append("CDF_TOKEN=<your-cdf-token>")
|
|
142
|
+
|
|
143
|
+
return "\n".join(lines)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import importlib.util
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from .env_vars import AVAILABLE_LOGIN_FLOWS, AVAILABLE_PROVIDERS, LoginFlow, Provider, create_env_file_content
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class InteractiveFlow(ABC):
|
|
10
|
+
def __init__(self, env_path: Path):
|
|
11
|
+
self.env_path = env_path
|
|
12
|
+
|
|
13
|
+
@abstractmethod
|
|
14
|
+
def run(self) -> None: ...
|
|
15
|
+
|
|
16
|
+
def create_env_file(self, provider: Provider, login_flow: LoginFlow) -> None:
|
|
17
|
+
env_content = create_env_file_content(provider, login_flow)
|
|
18
|
+
self.env_path.write_text(env_content, encoding="utf-8", newline="\n")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_interactive_flow(env_file_path: Path) -> InteractiveFlow:
|
|
22
|
+
try:
|
|
23
|
+
importlib.util.find_spec("IPython")
|
|
24
|
+
importlib.util.find_spec("ipywidgets")
|
|
25
|
+
if not _is_in_notebook():
|
|
26
|
+
return NoDependencyFlow(env_file_path)
|
|
27
|
+
return NotebookFlow(env_file_path)
|
|
28
|
+
except ImportError:
|
|
29
|
+
return NoDependencyFlow(env_file_path)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _is_in_notebook() -> bool:
|
|
33
|
+
try:
|
|
34
|
+
from IPython import get_ipython
|
|
35
|
+
|
|
36
|
+
if "IPKernelApp" not in get_ipython().config:
|
|
37
|
+
return False
|
|
38
|
+
except ImportError:
|
|
39
|
+
return False
|
|
40
|
+
except AttributeError:
|
|
41
|
+
return False
|
|
42
|
+
return True
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class NoDependencyFlow(InteractiveFlow):
|
|
46
|
+
def run(self) -> None:
|
|
47
|
+
if not self.should_create_env_file():
|
|
48
|
+
return None
|
|
49
|
+
provider = self.provider()
|
|
50
|
+
login_flow: LoginFlow
|
|
51
|
+
if provider != "cdf":
|
|
52
|
+
login_flow = self.login_flow()
|
|
53
|
+
else:
|
|
54
|
+
login_flow = "client_credentials"
|
|
55
|
+
self.create_env_file(provider, login_flow)
|
|
56
|
+
print(f"Created environment file at {self.env_path!r}.")
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
def should_create_env_file(self) -> bool:
|
|
60
|
+
env_file_name = self.env_path.name
|
|
61
|
+
answer = input(
|
|
62
|
+
f"Would you like to create a new {env_file_name!r} file with the required environment variables? [y/N]: "
|
|
63
|
+
)
|
|
64
|
+
return answer.strip().lower() == "y"
|
|
65
|
+
|
|
66
|
+
@classmethod
|
|
67
|
+
def provider(cls) -> Provider:
|
|
68
|
+
index = cls._prompt_choice(AVAILABLE_PROVIDERS, "Select provider:")
|
|
69
|
+
return AVAILABLE_PROVIDERS[index]
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def login_flow(cls) -> LoginFlow:
|
|
73
|
+
index = cls._prompt_choice(AVAILABLE_LOGIN_FLOWS, "Select login flow:")
|
|
74
|
+
return AVAILABLE_LOGIN_FLOWS[index]
|
|
75
|
+
|
|
76
|
+
@classmethod
|
|
77
|
+
def _prompt_choice(cls, options: tuple[str, ...], prompt: str) -> int:
|
|
78
|
+
for i, option in enumerate(options, start=1):
|
|
79
|
+
print(f"{i}. {option}")
|
|
80
|
+
question = f"{prompt} [1-{len(options)}]: "
|
|
81
|
+
while True:
|
|
82
|
+
answer = input(question)
|
|
83
|
+
if answer.isdigit():
|
|
84
|
+
index = int(answer)
|
|
85
|
+
if 1 <= index <= len(options):
|
|
86
|
+
return index - 1
|
|
87
|
+
print(f"Invalid input. Please enter a number between 1 and {len(options)}.")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class NotebookFlow(InteractiveFlow):
|
|
91
|
+
def __init__(self, env_path: Path):
|
|
92
|
+
super().__init__(env_path)
|
|
93
|
+
import ipywidgets as widgets # type: ignore[import-untyped]
|
|
94
|
+
from IPython.display import display
|
|
95
|
+
|
|
96
|
+
self._widgets = widgets
|
|
97
|
+
self._display = display
|
|
98
|
+
|
|
99
|
+
def run(self) -> None:
|
|
100
|
+
dropdown_providers = self._widgets.Dropdown(
|
|
101
|
+
options=list(AVAILABLE_PROVIDERS),
|
|
102
|
+
value=AVAILABLE_PROVIDERS[0],
|
|
103
|
+
description="Provider:",
|
|
104
|
+
)
|
|
105
|
+
dropdown_login_flows = self._widgets.Dropdown(
|
|
106
|
+
options=list(AVAILABLE_LOGIN_FLOWS),
|
|
107
|
+
value=AVAILABLE_LOGIN_FLOWS[0],
|
|
108
|
+
description="Login Flow:",
|
|
109
|
+
)
|
|
110
|
+
confirm_button = self._widgets.Button(description="Create template .env file", button_style="primary")
|
|
111
|
+
dropdowns = self._widgets.HBox([dropdown_providers, dropdown_login_flows])
|
|
112
|
+
output = self._widgets.Output()
|
|
113
|
+
container = self._widgets.VBox([dropdowns, confirm_button, output])
|
|
114
|
+
|
|
115
|
+
self._display(container)
|
|
116
|
+
|
|
117
|
+
def on_confirm_clicked(b: Any) -> None:
|
|
118
|
+
with output:
|
|
119
|
+
provider = dropdown_providers.value
|
|
120
|
+
login_flow = dropdown_login_flows.value
|
|
121
|
+
if provider == "cdf" and login_flow != "client_credentials":
|
|
122
|
+
print(
|
|
123
|
+
"Warning: 'cdf' provider only supports 'client_credentials' login flow. Overriding selection."
|
|
124
|
+
)
|
|
125
|
+
login_flow = "client_credentials"
|
|
126
|
+
is_existing = self.env_path.exists()
|
|
127
|
+
self.create_env_file(provider, login_flow)
|
|
128
|
+
if is_existing:
|
|
129
|
+
print(f"Overwrote existing environment file at {self.env_path!r}.")
|
|
130
|
+
else:
|
|
131
|
+
print(f"Created environment file at {self.env_path!r}.")
|
|
132
|
+
|
|
133
|
+
confirm_button.on_click(on_confirm_clicked)
|