dsgrid-toolkit 0.2.0__tar.gz → 0.3.1__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.
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/PKG-INFO +53 -76
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/README.md +8 -4
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/__init__.py +1 -1
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/app.py +6 -7
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/response_models.py +4 -4
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/chronify.py +10 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/config.py +1 -2
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/dsgrid.py +45 -30
- dsgrid_toolkit-0.3.1/dsgrid/cli/dsgrid_admin.py +92 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/query.py +65 -47
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/registry.py +166 -77
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/common.py +1 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/annual_time_dimension_config.py +34 -27
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/common.py +22 -11
- dsgrid_toolkit-0.3.1/dsgrid/config/dataset_config.py +907 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dataset_schema_handler_factory.py +12 -7
- dsgrid_toolkit-0.3.1/dsgrid/config/date_time_dimension_config.py +136 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_mapping_base.py +16 -15
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimensions.py +419 -169
- dsgrid_toolkit-0.3.1/dsgrid/config/file_schema.py +190 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/index_time_dimension_config.py +10 -6
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/project_config.py +7 -2
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/registration_models.py +1 -12
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/time_dimension_base_config.py +15 -23
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_mapping_manager.py +1 -1
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_schema_handler_base.py +124 -78
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_schema_handler_one_table.py +31 -18
- dsgrid_toolkit-0.2.0/dsgrid/dataset/dataset_schema_handler_standard.py → dsgrid_toolkit-0.3.1/dsgrid/dataset/dataset_schema_handler_two_table.py +40 -21
- dsgrid_toolkit-0.3.1/dsgrid/dataset/models.py +51 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/table_format_handler_factory.py +6 -6
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/base_models.py +36 -24
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/standard.py +41 -2
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/time.py +7 -186
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/time_utils.py +30 -15
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dsgrid_rc.py +1 -1
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/notebooks/connect_to_dsgrid_registry.ipynb +1 -2
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/derived_dataset.py +16 -12
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/models.py +11 -9
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/query_context.py +17 -17
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/query_submitter.py +158 -11
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/report_peak_load.py +3 -3
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/bulk_register.py +15 -11
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/data_store_interface.py +10 -5
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dataset_config_generator.py +13 -11
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dataset_registry_manager.py +384 -168
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_mapping_registry_manager.py +3 -3
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/duckdb_data_store.py +36 -14
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/filesystem_data_store.py +24 -15
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/project_registry_manager.py +18 -11
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registration_context.py +1 -1
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_database.py +5 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_manager.py +63 -49
- dsgrid_toolkit-0.3.1/dsgrid/rust_ext/__init__.py +14 -0
- dsgrid_toolkit-0.3.1/dsgrid/rust_ext/find_minimal_patterns.py +129 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/spark/functions.py +66 -22
- dsgrid_toolkit-0.3.1/dsgrid/spark/types.py +110 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/common.py +2 -1
- dsgrid_toolkit-0.3.1/dsgrid/tests/make_us_data_registry.py +265 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/register_derived_datasets.py +3 -3
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/dataset.py +261 -43
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/tests.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/scratch_dir_context.py +2 -1
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/spark.py +3 -3
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/utilities.py +37 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/pyproject.toml +27 -12
- dsgrid_toolkit-0.3.1/rust/Cargo.lock +970 -0
- dsgrid_toolkit-0.3.1/rust/Cargo.toml +18 -0
- dsgrid_toolkit-0.3.1/rust/README.md +228 -0
- dsgrid_toolkit-0.3.1/rust/src/lib.rs +638 -0
- dsgrid_toolkit-0.2.0/.gitignore +0 -160
- dsgrid_toolkit-0.2.0/dsgrid/cli/dsgrid_admin.py +0 -349
- dsgrid_toolkit-0.2.0/dsgrid/config/dataset_config.py +0 -684
- dsgrid_toolkit-0.2.0/dsgrid/config/date_time_dimension_config.py +0 -108
- dsgrid_toolkit-0.2.0/dsgrid/dataset/models.py +0 -44
- dsgrid_toolkit-0.2.0/dsgrid/spark/types.py +0 -50
- dsgrid_toolkit-0.2.0/dsgrid/tests/make_us_data_registry.py +0 -204
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/LICENSE +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/api_manager.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/models.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/apps/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/apps/project_viewer/app.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/apps/registration_gui.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/common.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/download.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/install_notebooks.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/cloud_storage_interface.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/factory.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/fake_storage_interface.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/s3_storage_interface.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/config_base.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_config.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_config_factory.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_mappings_config.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimensions_config.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/input_dataset_requirements.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/mapping_tables.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/noop_time_dimension_config.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/representative_period_time_dimension_config.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/simple_models.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/supplemental_dimension.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/data_models.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_expression_handler.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/growth_rates.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/table_format_handler_base.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/unpivoted_table.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/dimension_filters.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/exceptions.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/cloud_filesystem.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/factory.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/filesystem_interface.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/local_filesystem.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/s3_filesystem.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/loggers.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/notebooks/registration.ipynb +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/notebooks/start_notebook.sh +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/project.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/dataset_mapping_plan.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/report_factory.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/reports_base.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/common.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/config_update_checker_base.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/data_store_factory.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dataset_update_checker.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_mapping_update_checker.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_registry_manager.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_update_checker.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/filter_registry_manager.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/project_config_generator.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/project_update_checker.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_auto_updater.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_interface.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_manager_base.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/versioning.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/spark/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/utils.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/time/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/time/time_conversions.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/time/types.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/constants.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/convert.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/energy.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/power.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/__init__.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/files.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/filters.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/id_remappings.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/LICENSE +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/README.md +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/run_command.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/spark_partition.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/timing.py +0 -0
- {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/versioning.py +0 -0
|
@@ -1,54 +1,16 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dsgrid-toolkit
|
|
3
|
-
Version: 0.
|
|
4
|
-
Summary: Python API for accessing demand-side grid model (dsgrid) datasets
|
|
5
|
-
Project-URL: GitHub, https://github.com/dsgrid/dsgrid
|
|
6
|
-
Project-URL: Documentation, https://dsgrid.github.io/dsgrid/
|
|
7
|
-
Project-URL: Homepage, https://www.nrel.gov/analysis/dsgrid
|
|
8
|
-
Author-email: Elaine Hale <elaine.hale@nrel.gov>, Lixi Liu <lixi.liu@nrel.gov>, Meghan Mooney <meghan.mooney@nrel.gov>, Daniel Thom <daniel.thom@nrel.gov>
|
|
9
|
-
Maintainer-email: Elaine Hale <elaine.hale@nrel.gov>
|
|
10
|
-
License: BSD 3-Clause License
|
|
11
|
-
|
|
12
|
-
Copyright (c) 2021, Alliance for Sustainable Energy, LLC
|
|
13
|
-
All rights reserved.
|
|
14
|
-
|
|
15
|
-
Redistribution and use in source and binary forms, with or without
|
|
16
|
-
modification, are permitted provided that the following conditions are met:
|
|
17
|
-
|
|
18
|
-
1. Redistributions of source code must retain the above copyright notice, this
|
|
19
|
-
list of conditions and the following disclaimer.
|
|
20
|
-
|
|
21
|
-
2. Redistributions in binary form must reproduce the above copyright notice,
|
|
22
|
-
this list of conditions and the following disclaimer in the documentation
|
|
23
|
-
and/or other materials provided with the distribution.
|
|
24
|
-
|
|
25
|
-
3. Neither the name of the copyright holder nor the names of its
|
|
26
|
-
contributors may be used to endorse or promote products derived from
|
|
27
|
-
this software without specific prior written permission.
|
|
28
|
-
|
|
29
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
30
|
-
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
31
|
-
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
32
|
-
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
33
|
-
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
34
|
-
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
35
|
-
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
36
|
-
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
37
|
-
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
38
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
39
|
-
License-File: LICENSE
|
|
40
|
-
Keywords: dsgrid
|
|
3
|
+
Version: 0.3.1
|
|
41
4
|
Classifier: Development Status :: 3 - Alpha
|
|
42
5
|
Classifier: Intended Audience :: Science/Research
|
|
43
6
|
Classifier: License :: OSI Approved :: BSD License
|
|
44
7
|
Classifier: Natural Language :: English
|
|
45
8
|
Classifier: Programming Language :: Python :: 3.11
|
|
46
|
-
Requires-
|
|
47
|
-
Requires-Dist:
|
|
48
|
-
Requires-Dist: click<9,>=8.2
|
|
9
|
+
Requires-Dist: chronify~=0.6.0
|
|
10
|
+
Requires-Dist: click>=8.2,<9
|
|
49
11
|
Requires-Dist: dash
|
|
50
12
|
Requires-Dist: dash-bootstrap-components
|
|
51
|
-
Requires-Dist: duckdb
|
|
13
|
+
Requires-Dist: duckdb>=1,<2
|
|
52
14
|
Requires-Dist: fastapi
|
|
53
15
|
Requires-Dist: json5
|
|
54
16
|
Requires-Dist: networkx
|
|
@@ -59,41 +21,51 @@ Requires-Dist: pydantic~=2.11.6
|
|
|
59
21
|
Requires-Dist: requests
|
|
60
22
|
Requires-Dist: rich-click
|
|
61
23
|
Requires-Dist: semver
|
|
62
|
-
Requires-Dist: sqlalchemy
|
|
63
|
-
Requires-Dist: tzdata
|
|
24
|
+
Requires-Dist: sqlalchemy>=2,<3
|
|
64
25
|
Requires-Dist: uvicorn
|
|
26
|
+
Requires-Dist: tzdata
|
|
27
|
+
Requires-Dist: httpx ; extra == 'dev'
|
|
28
|
+
Requires-Dist: pytest ; extra == 'dev'
|
|
29
|
+
Requires-Dist: pytest-cov ; extra == 'dev'
|
|
30
|
+
Requires-Dist: pre-commit ; extra == 'dev'
|
|
31
|
+
Requires-Dist: devtools ; extra == 'dev'
|
|
32
|
+
Requires-Dist: flake8 ; extra == 'dev'
|
|
33
|
+
Requires-Dist: mypy ; extra == 'dev'
|
|
34
|
+
Requires-Dist: pyarrow ; extra == 'dev'
|
|
35
|
+
Requires-Dist: maturin ; extra == 'dev'
|
|
36
|
+
Requires-Dist: furo ; extra == 'doc'
|
|
37
|
+
Requires-Dist: ghp-import ; extra == 'doc'
|
|
38
|
+
Requires-Dist: numpydoc ; extra == 'doc'
|
|
39
|
+
Requires-Dist: pandas-stubs ; extra == 'doc'
|
|
40
|
+
Requires-Dist: ruff ; extra == 'doc'
|
|
41
|
+
Requires-Dist: sphinx~=7.2 ; extra == 'doc'
|
|
42
|
+
Requires-Dist: sphinx-click~=5.0 ; extra == 'doc'
|
|
43
|
+
Requires-Dist: sphinx-copybutton~=0.5.2 ; extra == 'doc'
|
|
44
|
+
Requires-Dist: sphinx-tabs~=3.4 ; extra == 'doc'
|
|
45
|
+
Requires-Dist: sphinx-argparse~=0.4.0 ; extra == 'doc'
|
|
46
|
+
Requires-Dist: sphinxcontrib-programoutput ; extra == 'doc'
|
|
47
|
+
Requires-Dist: autodoc-pydantic[erdantic]~=2.0 ; extra == 'doc'
|
|
48
|
+
Requires-Dist: twine ; extra == 'release'
|
|
49
|
+
Requires-Dist: setuptools ; extra == 'release'
|
|
50
|
+
Requires-Dist: wheel ; extra == 'release'
|
|
51
|
+
Requires-Dist: chronify[spark] ; extra == 'spark'
|
|
52
|
+
Requires-Dist: pyspark==4.0.0 ; extra == 'spark'
|
|
53
|
+
Requires-Dist: thrift ; extra == 'spark'
|
|
54
|
+
Requires-Dist: thrift-sasl ; extra == 'spark'
|
|
65
55
|
Provides-Extra: dev
|
|
66
|
-
Requires-Dist: devtools; extra == 'dev'
|
|
67
|
-
Requires-Dist: flake8; extra == 'dev'
|
|
68
|
-
Requires-Dist: httpx; extra == 'dev'
|
|
69
|
-
Requires-Dist: mypy; extra == 'dev'
|
|
70
|
-
Requires-Dist: pre-commit; extra == 'dev'
|
|
71
|
-
Requires-Dist: pyarrow; extra == 'dev'
|
|
72
|
-
Requires-Dist: pytest; extra == 'dev'
|
|
73
|
-
Requires-Dist: pytest-cov; extra == 'dev'
|
|
74
56
|
Provides-Extra: doc
|
|
75
|
-
Requires-Dist: autodoc-pydantic[erdantic]~=2.0; extra == 'doc'
|
|
76
|
-
Requires-Dist: furo; extra == 'doc'
|
|
77
|
-
Requires-Dist: ghp-import; extra == 'doc'
|
|
78
|
-
Requires-Dist: numpydoc; extra == 'doc'
|
|
79
|
-
Requires-Dist: pandas-stubs; extra == 'doc'
|
|
80
|
-
Requires-Dist: ruff; extra == 'doc'
|
|
81
|
-
Requires-Dist: sphinx-argparse~=0.4.0; extra == 'doc'
|
|
82
|
-
Requires-Dist: sphinx-click~=5.0; extra == 'doc'
|
|
83
|
-
Requires-Dist: sphinx-copybutton~=0.5.2; extra == 'doc'
|
|
84
|
-
Requires-Dist: sphinx-tabs~=3.4; extra == 'doc'
|
|
85
|
-
Requires-Dist: sphinxcontrib-programoutput; extra == 'doc'
|
|
86
|
-
Requires-Dist: sphinx~=7.2; extra == 'doc'
|
|
87
57
|
Provides-Extra: release
|
|
88
|
-
Requires-Dist: setuptools; extra == 'release'
|
|
89
|
-
Requires-Dist: twine; extra == 'release'
|
|
90
|
-
Requires-Dist: wheel; extra == 'release'
|
|
91
58
|
Provides-Extra: spark
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
59
|
+
License-File: LICENSE
|
|
60
|
+
Summary: Python API for accessing demand-side grid model (dsgrid) datasets
|
|
61
|
+
Keywords: dsgrid
|
|
62
|
+
Author-email: Elaine Hale <elaine.hale@nrel.gov>, Lixi Liu <lixi.liu@nrel.gov>, Meghan Mooney <meghan.mooney@nrel.gov>, Daniel Thom <daniel.thom@nrel.gov>
|
|
63
|
+
Maintainer-email: Elaine Hale <elaine.hale@nrel.gov>
|
|
64
|
+
Requires-Python: >=3.11
|
|
65
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
66
|
+
Project-URL: Documentation, https://dsgrid.github.io/dsgrid/
|
|
67
|
+
Project-URL: GitHub, https://github.com/dsgrid/dsgrid
|
|
68
|
+
Project-URL: Homepage, https://www.nrel.gov/analysis/dsgrid
|
|
97
69
|
|
|
98
70
|
# dsgrid
|
|
99
71
|
[](https://dsgrid.github.io/dsgrid)
|
|
@@ -114,7 +86,7 @@ Python API for contributing to and accessing demand-side grid model (dsgrid) pro
|
|
|
114
86
|
Create a virtual environment in which to install dsgrid. Anaconda or miniconda is recommended.
|
|
115
87
|
|
|
116
88
|
```
|
|
117
|
-
conda create -n dsgrid python=3.
|
|
89
|
+
conda create -n dsgrid python=3.11
|
|
118
90
|
conda activate dsgrid
|
|
119
91
|
```
|
|
120
92
|
|
|
@@ -123,7 +95,7 @@ conda activate dsgrid
|
|
|
123
95
|
dsgrid uses [Apache Spark](#https://spark.apache.org/) to manage big data. There are no separate installation steps for Apache Spark beyond installing the dsgrid package and installing:
|
|
124
96
|
|
|
125
97
|
```
|
|
126
|
-
pip install
|
|
98
|
+
pip install "dsgrid-toolkit[spark]"
|
|
127
99
|
```
|
|
128
100
|
|
|
129
101
|
Otherwise installing the pyspark Python dependency handles it.
|
|
@@ -148,7 +120,11 @@ To install Apache Spark on Windows, follow [these instructions](https://towardsd
|
|
|
148
120
|
|
|
149
121
|
### From PIPY/pip
|
|
150
122
|
|
|
151
|
-
|
|
123
|
+
pip install dsgrid-toolkit
|
|
124
|
+
|
|
125
|
+
or
|
|
126
|
+
|
|
127
|
+
pip install "dsgrid-toolkit[spark]"
|
|
152
128
|
|
|
153
129
|
### From pip+git
|
|
154
130
|
|
|
@@ -190,7 +166,7 @@ pip install -e .
|
|
|
190
166
|
|
|
191
167
|
**Developers:**
|
|
192
168
|
```
|
|
193
|
-
pip install -e '.[dev]'
|
|
169
|
+
pip install -e '.[dev,spark]'
|
|
194
170
|
```
|
|
195
171
|
|
|
196
172
|
## Usage
|
|
@@ -214,3 +190,4 @@ conda deactivate
|
|
|
214
190
|
## Software Record
|
|
215
191
|
|
|
216
192
|
dsgrid is developed under NREL Software Record SWR-21-52, "demand-side grid model".
|
|
193
|
+
|
|
@@ -17,7 +17,7 @@ Python API for contributing to and accessing demand-side grid model (dsgrid) pro
|
|
|
17
17
|
Create a virtual environment in which to install dsgrid. Anaconda or miniconda is recommended.
|
|
18
18
|
|
|
19
19
|
```
|
|
20
|
-
conda create -n dsgrid python=3.
|
|
20
|
+
conda create -n dsgrid python=3.11
|
|
21
21
|
conda activate dsgrid
|
|
22
22
|
```
|
|
23
23
|
|
|
@@ -26,7 +26,7 @@ conda activate dsgrid
|
|
|
26
26
|
dsgrid uses [Apache Spark](#https://spark.apache.org/) to manage big data. There are no separate installation steps for Apache Spark beyond installing the dsgrid package and installing:
|
|
27
27
|
|
|
28
28
|
```
|
|
29
|
-
pip install
|
|
29
|
+
pip install "dsgrid-toolkit[spark]"
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Otherwise installing the pyspark Python dependency handles it.
|
|
@@ -51,7 +51,11 @@ To install Apache Spark on Windows, follow [these instructions](https://towardsd
|
|
|
51
51
|
|
|
52
52
|
### From PIPY/pip
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
pip install dsgrid-toolkit
|
|
55
|
+
|
|
56
|
+
or
|
|
57
|
+
|
|
58
|
+
pip install "dsgrid-toolkit[spark]"
|
|
55
59
|
|
|
56
60
|
### From pip+git
|
|
57
61
|
|
|
@@ -93,7 +97,7 @@ pip install -e .
|
|
|
93
97
|
|
|
94
98
|
**Developers:**
|
|
95
99
|
```
|
|
96
|
-
pip install -e '.[dev]'
|
|
100
|
+
pip install -e '.[dev,spark]'
|
|
97
101
|
```
|
|
98
102
|
|
|
99
103
|
## Usage
|
|
@@ -9,7 +9,7 @@ __description__ = (
|
|
|
9
9
|
"Python API for registring and accessing demand-side grid model (dsgrid) datasets"
|
|
10
10
|
)
|
|
11
11
|
__url__ = "https://github.com/dsgrid/dsgrid"
|
|
12
|
-
__version__ = "0.
|
|
12
|
+
__version__ = "0.3.1"
|
|
13
13
|
__author__ = "NREL"
|
|
14
14
|
__maintainer_email__ = "elaine.hale@nrel.gov"
|
|
15
15
|
__license__ = "BSD-3"
|
|
@@ -10,7 +10,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
|
|
10
10
|
from fastapi.responses import Response, FileResponse
|
|
11
11
|
|
|
12
12
|
from dsgrid.common import REMOTE_REGISTRY
|
|
13
|
-
from dsgrid.dataset.models import
|
|
13
|
+
from dsgrid.dataset.models import ValueFormat
|
|
14
14
|
from dsgrid.config.dimensions import create_dimension_common_model, create_project_dimension_model
|
|
15
15
|
from dsgrid.dimension.base_models import DimensionType, DimensionCategory
|
|
16
16
|
from dsgrid.dsgrid_rc import DsgridRuntimeConfig
|
|
@@ -44,7 +44,7 @@ from .response_models import (
|
|
|
44
44
|
ListProjectSupplementalDimensionNames,
|
|
45
45
|
ListProjectsResponse,
|
|
46
46
|
ListReportTypesResponse,
|
|
47
|
-
|
|
47
|
+
ListValueFormatsResponse,
|
|
48
48
|
SparkSubmitProjectQueryResponse,
|
|
49
49
|
)
|
|
50
50
|
|
|
@@ -280,10 +280,10 @@ async def list_report_types():
|
|
|
280
280
|
return ListReportTypesResponse(types=_list_enums(ReportType))
|
|
281
281
|
|
|
282
282
|
|
|
283
|
-
@app.get("/
|
|
284
|
-
async def
|
|
285
|
-
"""List the
|
|
286
|
-
return
|
|
283
|
+
@app.get("/value_formats", response_model=ListValueFormatsResponse)
|
|
284
|
+
async def list_value_formats():
|
|
285
|
+
"""List the value formats available for query results."""
|
|
286
|
+
return ListValueFormatsResponse(formats=_list_enums(ValueFormat))
|
|
287
287
|
|
|
288
288
|
|
|
289
289
|
@app.post("/queries/projects", response_model=SparkSubmitProjectQueryResponse)
|
|
@@ -368,7 +368,6 @@ def _submit_project_query(spark_query: SparkSubmitProjectQueryRequest, async_tas
|
|
|
368
368
|
output_dir = Path(QUERY_OUTPUT_DIR)
|
|
369
369
|
dsgrid_exec = "dsgrid-cli.py"
|
|
370
370
|
base_cmd = (
|
|
371
|
-
f"--offline "
|
|
372
371
|
f"--url={DSGRID_REGISTRY_DATABASE_URL} "
|
|
373
372
|
f"query project run "
|
|
374
373
|
f"--output={output_dir} --zip-file --overwrite {fp.name}"
|
|
@@ -2,7 +2,7 @@ from dsgrid.data_models import DSGBaseModel
|
|
|
2
2
|
from dsgrid.config.dataset_config import DatasetConfigModel
|
|
3
3
|
from dsgrid.config.dimensions import DimensionCommonModel, ProjectDimensionModel
|
|
4
4
|
from dsgrid.config.project_config import ProjectConfigModel, ProjectDimensionNamesModel
|
|
5
|
-
from dsgrid.dataset.models import
|
|
5
|
+
from dsgrid.dataset.models import ValueFormat
|
|
6
6
|
from dsgrid.dimension.base_models import DimensionType
|
|
7
7
|
from dsgrid.query.models import ReportType
|
|
8
8
|
from .models import AsyncTaskModel
|
|
@@ -92,10 +92,10 @@ class ListReportTypesResponse(DSGBaseModel):
|
|
|
92
92
|
types: list[ReportType]
|
|
93
93
|
|
|
94
94
|
|
|
95
|
-
class
|
|
96
|
-
"""Defines the response to the
|
|
95
|
+
class ListValueFormatsResponse(DSGBaseModel):
|
|
96
|
+
"""Defines the response to the list_value_formats command."""
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
formats: list[ValueFormat]
|
|
99
99
|
|
|
100
100
|
|
|
101
101
|
class SparkSubmitProjectQueryResponse(DSGBaseModel):
|
|
@@ -20,3 +20,13 @@ def create_store(store_file: Path) -> Generator[chronify.Store, None, None]:
|
|
|
20
20
|
yield store
|
|
21
21
|
finally:
|
|
22
22
|
store.dispose()
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@contextmanager
|
|
26
|
+
def create_in_memory_store() -> Generator[chronify.Store, None, None]:
|
|
27
|
+
"""Create an in-memory chronify Store."""
|
|
28
|
+
store = chronify.Store.create_in_memory_db()
|
|
29
|
+
try:
|
|
30
|
+
yield store
|
|
31
|
+
finally:
|
|
32
|
+
store.dispose()
|
|
@@ -40,7 +40,7 @@ $ dsgrid config create sqlite:////projects/dsgrid/registries/standard-scenarios/
|
|
|
40
40
|
"-b",
|
|
41
41
|
"--backend-engine",
|
|
42
42
|
type=click.Choice([x.value for x in BackendEngine]),
|
|
43
|
-
default=DEFAULT_BACKEND,
|
|
43
|
+
default=DEFAULT_BACKEND.value,
|
|
44
44
|
help="Backend engine for SQL processing",
|
|
45
45
|
)
|
|
46
46
|
@click.option(
|
|
@@ -91,7 +91,6 @@ $ dsgrid config create sqlite:////projects/dsgrid/registries/standard-scenarios/
|
|
|
91
91
|
# )
|
|
92
92
|
# @click.option(
|
|
93
93
|
# "-o",
|
|
94
|
-
# "--offline",
|
|
95
94
|
# is_flag=True,
|
|
96
95
|
# default=False,
|
|
97
96
|
# show_default=True,
|
|
@@ -6,6 +6,10 @@ from pathlib import Path
|
|
|
6
6
|
import rich_click as click
|
|
7
7
|
|
|
8
8
|
import dsgrid
|
|
9
|
+
from chronify.utils.path_utils import check_overwrite
|
|
10
|
+
from dsgrid.common import LOCAL_REGISTRY
|
|
11
|
+
from dsgrid.registry.common import DatabaseConnection, DataStoreType
|
|
12
|
+
from dsgrid.registry.registry_manager import RegistryManager
|
|
9
13
|
from dsgrid.utils.timing import timer_stats_collector
|
|
10
14
|
from dsgrid.cli.common import get_log_level_from_str, handle_scratch_dir
|
|
11
15
|
from dsgrid.cli.config import config
|
|
@@ -38,15 +42,6 @@ logger = logging.getLogger(__name__)
|
|
|
38
42
|
@click.option(
|
|
39
43
|
"-n", "--no-prompts", default=False, is_flag=True, show_default=True, help="Do not prompt."
|
|
40
44
|
)
|
|
41
|
-
@click.option(
|
|
42
|
-
"--offline/--online",
|
|
43
|
-
is_flag=True,
|
|
44
|
-
default=dsgrid.runtime_config.offline,
|
|
45
|
-
show_default=True,
|
|
46
|
-
help="Run registry commands in offline mode. WARNING: any commands you perform in offline "
|
|
47
|
-
"mode run the risk of being out-of-sync with the latest dsgrid registry, and any write "
|
|
48
|
-
"commands will not be officially synced with the remote registry",
|
|
49
|
-
)
|
|
50
45
|
@click.option(
|
|
51
46
|
"--timings/--no-timings",
|
|
52
47
|
default=dsgrid.runtime_config.timings,
|
|
@@ -54,24 +49,6 @@ logger = logging.getLogger(__name__)
|
|
|
54
49
|
show_default=True,
|
|
55
50
|
help="Enable tracking of function timings.",
|
|
56
51
|
)
|
|
57
|
-
# Server-related options are commented-out because the registry is currently only
|
|
58
|
-
# supported in SQLite. If/when we add postgres support, these can be added back.
|
|
59
|
-
# @click.option(
|
|
60
|
-
# "-U",
|
|
61
|
-
# "--username",
|
|
62
|
-
# type=str,
|
|
63
|
-
# default=dsgrid.runtime_config.database_user,
|
|
64
|
-
# help="Database username",
|
|
65
|
-
# )
|
|
66
|
-
# @click.option(
|
|
67
|
-
# "-P",
|
|
68
|
-
# "--password",
|
|
69
|
-
# prompt=True,
|
|
70
|
-
# hide_input=True,
|
|
71
|
-
# cls=OptionPromptPassword,
|
|
72
|
-
# help="dsgrid registry password. Will prompt unless it is passed or the username matches the "
|
|
73
|
-
# "runtime config file.",
|
|
74
|
-
# )
|
|
75
52
|
@click.option(
|
|
76
53
|
"-u",
|
|
77
54
|
"--url",
|
|
@@ -103,10 +80,7 @@ def cli(
|
|
|
103
80
|
file_level,
|
|
104
81
|
log_file,
|
|
105
82
|
no_prompts,
|
|
106
|
-
offline,
|
|
107
83
|
timings,
|
|
108
|
-
# username,
|
|
109
|
-
# password,
|
|
110
84
|
url,
|
|
111
85
|
reraise_exceptions,
|
|
112
86
|
scratch_dir,
|
|
@@ -135,7 +109,48 @@ def callback(*args, **kwargs):
|
|
|
135
109
|
timer_stats_collector.log_stats()
|
|
136
110
|
|
|
137
111
|
|
|
112
|
+
_create_registry_epilog = """
|
|
113
|
+
Examples:\n
|
|
114
|
+
$ dsgrid create-registry sqlite:////projects/dsgrid/my_project/registry.db -p /projects/dsgrid/my_project/registry-data\n
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
@click.command(name="create-registry", epilog=_create_registry_epilog)
|
|
119
|
+
@click.argument("url")
|
|
120
|
+
@click.option(
|
|
121
|
+
"-p",
|
|
122
|
+
"--data-path",
|
|
123
|
+
default=LOCAL_REGISTRY,
|
|
124
|
+
show_default=True,
|
|
125
|
+
callback=lambda *x: Path(x[2]),
|
|
126
|
+
help="Local dsgrid registry data path. Must not contain the registry file listed in URL.",
|
|
127
|
+
)
|
|
128
|
+
@click.option(
|
|
129
|
+
"-f",
|
|
130
|
+
"--overwrite",
|
|
131
|
+
"--force",
|
|
132
|
+
is_flag=True,
|
|
133
|
+
default=False,
|
|
134
|
+
help="Delete registry_path and the database if they already exist.",
|
|
135
|
+
)
|
|
136
|
+
@click.option(
|
|
137
|
+
"-t",
|
|
138
|
+
"--data-store-type",
|
|
139
|
+
type=click.Choice([x.value for x in DataStoreType]),
|
|
140
|
+
default=DataStoreType.FILESYSTEM.value,
|
|
141
|
+
show_default=True,
|
|
142
|
+
help="Type of store to use for the registry data.",
|
|
143
|
+
callback=lambda *x: DataStoreType(x[2]),
|
|
144
|
+
)
|
|
145
|
+
def create_registry(url: str, data_path: Path, overwrite: bool, data_store_type: DataStoreType):
|
|
146
|
+
"""Create a new registry."""
|
|
147
|
+
check_overwrite(data_path, overwrite)
|
|
148
|
+
conn = DatabaseConnection(url=url)
|
|
149
|
+
RegistryManager.create(conn, data_path, overwrite=overwrite, data_store_type=data_store_type)
|
|
150
|
+
|
|
151
|
+
|
|
138
152
|
cli.add_command(config)
|
|
153
|
+
cli.add_command(create_registry)
|
|
139
154
|
cli.add_command(download)
|
|
140
155
|
cli.add_command(install_notebooks)
|
|
141
156
|
cli.add_command(query)
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"""CLI for dsgrid admin commands (testing purposes only)."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
import rich_click as click
|
|
7
|
+
|
|
8
|
+
from dsgrid.config.simple_models import RegistrySimpleModel
|
|
9
|
+
from dsgrid.dsgrid_rc import DsgridRuntimeConfig
|
|
10
|
+
from dsgrid.loggers import setup_logging, check_log_file_size
|
|
11
|
+
from dsgrid.registry.common import DatabaseConnection
|
|
12
|
+
from dsgrid.registry.filter_registry_manager import FilterRegistryManager
|
|
13
|
+
from dsgrid.registry.registry_manager import RegistryManager
|
|
14
|
+
from dsgrid.utils.files import load_data
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
logger = logging.getLogger(__name__)
|
|
18
|
+
_config = DsgridRuntimeConfig.load()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@click.group()
|
|
22
|
+
@click.option("-l", "--log-file", default="dsgrid_admin.log", type=str, help="Log to this file.")
|
|
23
|
+
@click.option(
|
|
24
|
+
"-n", "--no-prompts", default=False, is_flag=True, show_default=True, help="Do not prompt."
|
|
25
|
+
)
|
|
26
|
+
@click.option(
|
|
27
|
+
"--verbose", is_flag=True, default=False, show_default=True, help="Enable verbose log output."
|
|
28
|
+
)
|
|
29
|
+
def cli(log_file, no_prompts, verbose):
|
|
30
|
+
"""dsgrid-admin commands (for testing purposes only)"""
|
|
31
|
+
path = Path(log_file)
|
|
32
|
+
level = logging.DEBUG if verbose else logging.INFO
|
|
33
|
+
check_log_file_size(path, no_prompts=no_prompts)
|
|
34
|
+
setup_logging("dsgrid", path, console_level=level, file_level=level, mode="a")
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@click.command()
|
|
38
|
+
@click.option(
|
|
39
|
+
"--src-database-url",
|
|
40
|
+
required=True,
|
|
41
|
+
help="Source dsgrid registry database URL.",
|
|
42
|
+
)
|
|
43
|
+
@click.option(
|
|
44
|
+
"--dst-database-url",
|
|
45
|
+
default="dsgrid",
|
|
46
|
+
required=True,
|
|
47
|
+
help="Destination dsgrid registry database URL.",
|
|
48
|
+
)
|
|
49
|
+
@click.argument("dst_data_path", type=click.Path(exists=False), callback=lambda *x: Path(x[2]))
|
|
50
|
+
@click.argument("config_file", type=click.Path(exists=True), callback=lambda *x: Path(x[2]))
|
|
51
|
+
@click.option(
|
|
52
|
+
"-m",
|
|
53
|
+
"--mode",
|
|
54
|
+
default="data-symlinks",
|
|
55
|
+
type=click.Choice(["copy", "data-symlinks", "rsync"]),
|
|
56
|
+
show_default=True,
|
|
57
|
+
help="Controls whether to copy all data, make symlinks to data files, or sync data with the "
|
|
58
|
+
"rsync utility (not available on Windows).",
|
|
59
|
+
)
|
|
60
|
+
@click.option(
|
|
61
|
+
"-f",
|
|
62
|
+
"--overwrite",
|
|
63
|
+
"--force",
|
|
64
|
+
default=False,
|
|
65
|
+
is_flag=True,
|
|
66
|
+
show_default=True,
|
|
67
|
+
help="Overwrite dst_registry_path if it already exists. Does not apply if using rsync.",
|
|
68
|
+
)
|
|
69
|
+
def make_filtered_registry(
|
|
70
|
+
src_database_url,
|
|
71
|
+
dst_database_url,
|
|
72
|
+
dst_data_path: Path,
|
|
73
|
+
config_file: Path,
|
|
74
|
+
mode,
|
|
75
|
+
overwrite,
|
|
76
|
+
):
|
|
77
|
+
"""Make a filtered registry for testing purposes."""
|
|
78
|
+
simple_model = RegistrySimpleModel(**load_data(config_file))
|
|
79
|
+
src_conn = DatabaseConnection(url=src_database_url)
|
|
80
|
+
dst_conn = DatabaseConnection(url=dst_database_url)
|
|
81
|
+
RegistryManager.copy(
|
|
82
|
+
src_conn,
|
|
83
|
+
dst_conn,
|
|
84
|
+
dst_data_path,
|
|
85
|
+
mode=mode,
|
|
86
|
+
force=overwrite,
|
|
87
|
+
)
|
|
88
|
+
with FilterRegistryManager.load(dst_conn, offline_mode=True, use_remote_data=False) as mgr:
|
|
89
|
+
mgr.filter(simple_model=simple_model)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
cli.add_command(make_filtered_registry)
|