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.
Files changed (165) hide show
  1. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/PKG-INFO +53 -76
  2. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/README.md +8 -4
  3. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/__init__.py +1 -1
  4. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/app.py +6 -7
  5. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/response_models.py +4 -4
  6. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/chronify.py +10 -0
  7. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/config.py +1 -2
  8. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/dsgrid.py +45 -30
  9. dsgrid_toolkit-0.3.1/dsgrid/cli/dsgrid_admin.py +92 -0
  10. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/query.py +65 -47
  11. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/registry.py +166 -77
  12. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/common.py +1 -0
  13. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/annual_time_dimension_config.py +34 -27
  14. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/common.py +22 -11
  15. dsgrid_toolkit-0.3.1/dsgrid/config/dataset_config.py +907 -0
  16. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dataset_schema_handler_factory.py +12 -7
  17. dsgrid_toolkit-0.3.1/dsgrid/config/date_time_dimension_config.py +136 -0
  18. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_mapping_base.py +16 -15
  19. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimensions.py +419 -169
  20. dsgrid_toolkit-0.3.1/dsgrid/config/file_schema.py +190 -0
  21. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/index_time_dimension_config.py +10 -6
  22. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/project_config.py +7 -2
  23. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/registration_models.py +1 -12
  24. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/time_dimension_base_config.py +15 -23
  25. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_mapping_manager.py +1 -1
  26. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_schema_handler_base.py +124 -78
  27. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_schema_handler_one_table.py +31 -18
  28. 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
  29. dsgrid_toolkit-0.3.1/dsgrid/dataset/models.py +51 -0
  30. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/table_format_handler_factory.py +6 -6
  31. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/base_models.py +36 -24
  32. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/standard.py +41 -2
  33. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/time.py +7 -186
  34. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/time_utils.py +30 -15
  35. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dsgrid_rc.py +1 -1
  36. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/notebooks/connect_to_dsgrid_registry.ipynb +1 -2
  37. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/derived_dataset.py +16 -12
  38. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/models.py +11 -9
  39. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/query_context.py +17 -17
  40. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/query_submitter.py +158 -11
  41. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/report_peak_load.py +3 -3
  42. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/bulk_register.py +15 -11
  43. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/data_store_interface.py +10 -5
  44. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dataset_config_generator.py +13 -11
  45. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dataset_registry_manager.py +384 -168
  46. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_mapping_registry_manager.py +3 -3
  47. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/duckdb_data_store.py +36 -14
  48. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/filesystem_data_store.py +24 -15
  49. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/project_registry_manager.py +18 -11
  50. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registration_context.py +1 -1
  51. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_database.py +5 -0
  52. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_manager.py +63 -49
  53. dsgrid_toolkit-0.3.1/dsgrid/rust_ext/__init__.py +14 -0
  54. dsgrid_toolkit-0.3.1/dsgrid/rust_ext/find_minimal_patterns.py +129 -0
  55. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/spark/functions.py +66 -22
  56. dsgrid_toolkit-0.3.1/dsgrid/spark/types.py +110 -0
  57. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/common.py +2 -1
  58. dsgrid_toolkit-0.3.1/dsgrid/tests/make_us_data_registry.py +265 -0
  59. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/register_derived_datasets.py +3 -3
  60. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/dataset.py +261 -43
  61. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/__init__.py +0 -0
  62. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/tests.py +0 -0
  63. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/scratch_dir_context.py +2 -1
  64. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/spark.py +3 -3
  65. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/utilities.py +37 -0
  66. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/pyproject.toml +27 -12
  67. dsgrid_toolkit-0.3.1/rust/Cargo.lock +970 -0
  68. dsgrid_toolkit-0.3.1/rust/Cargo.toml +18 -0
  69. dsgrid_toolkit-0.3.1/rust/README.md +228 -0
  70. dsgrid_toolkit-0.3.1/rust/src/lib.rs +638 -0
  71. dsgrid_toolkit-0.2.0/.gitignore +0 -160
  72. dsgrid_toolkit-0.2.0/dsgrid/cli/dsgrid_admin.py +0 -349
  73. dsgrid_toolkit-0.2.0/dsgrid/config/dataset_config.py +0 -684
  74. dsgrid_toolkit-0.2.0/dsgrid/config/date_time_dimension_config.py +0 -108
  75. dsgrid_toolkit-0.2.0/dsgrid/dataset/models.py +0 -44
  76. dsgrid_toolkit-0.2.0/dsgrid/spark/types.py +0 -50
  77. dsgrid_toolkit-0.2.0/dsgrid/tests/make_us_data_registry.py +0 -204
  78. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/LICENSE +0 -0
  79. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/__init__.py +0 -0
  80. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/api_manager.py +0 -0
  81. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/api/models.py +0 -0
  82. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/apps/__init__.py +0 -0
  83. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/apps/project_viewer/app.py +0 -0
  84. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/apps/registration_gui.py +0 -0
  85. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/__init__.py +0 -0
  86. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/common.py +0 -0
  87. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/download.py +0 -0
  88. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cli/install_notebooks.py +0 -0
  89. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/__init__.py +0 -0
  90. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/cloud_storage_interface.py +0 -0
  91. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/factory.py +0 -0
  92. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/fake_storage_interface.py +0 -0
  93. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/cloud/s3_storage_interface.py +0 -0
  94. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/__init__.py +0 -0
  95. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/config_base.py +0 -0
  96. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_config.py +0 -0
  97. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_config_factory.py +0 -0
  98. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimension_mappings_config.py +0 -0
  99. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/dimensions_config.py +0 -0
  100. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/input_dataset_requirements.py +0 -0
  101. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/mapping_tables.py +0 -0
  102. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/noop_time_dimension_config.py +0 -0
  103. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/representative_period_time_dimension_config.py +0 -0
  104. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/simple_models.py +0 -0
  105. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/config/supplemental_dimension.py +0 -0
  106. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/data_models.py +0 -0
  107. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/__init__.py +0 -0
  108. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset.py +0 -0
  109. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/dataset_expression_handler.py +0 -0
  110. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/growth_rates.py +0 -0
  111. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/table_format_handler_base.py +0 -0
  112. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dataset/unpivoted_table.py +0 -0
  113. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/__init__.py +0 -0
  114. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/dimension/dimension_filters.py +0 -0
  115. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/exceptions.py +0 -0
  116. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/__init__.py +0 -0
  117. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/cloud_filesystem.py +0 -0
  118. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/factory.py +0 -0
  119. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/filesystem_interface.py +0 -0
  120. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/local_filesystem.py +0 -0
  121. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/filesystem/s3_filesystem.py +0 -0
  122. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/loggers.py +0 -0
  123. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/notebooks/registration.ipynb +0 -0
  124. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/notebooks/start_notebook.sh +0 -0
  125. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/project.py +0 -0
  126. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/__init__.py +0 -0
  127. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/dataset_mapping_plan.py +0 -0
  128. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/report_factory.py +0 -0
  129. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/query/reports_base.py +0 -0
  130. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/__init__.py +0 -0
  131. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/common.py +0 -0
  132. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/config_update_checker_base.py +0 -0
  133. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/data_store_factory.py +0 -0
  134. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dataset_update_checker.py +0 -0
  135. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_mapping_update_checker.py +0 -0
  136. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_registry_manager.py +0 -0
  137. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/dimension_update_checker.py +0 -0
  138. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/filter_registry_manager.py +0 -0
  139. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/project_config_generator.py +0 -0
  140. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/project_update_checker.py +0 -0
  141. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_auto_updater.py +0 -0
  142. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_interface.py +0 -0
  143. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/registry_manager_base.py +0 -0
  144. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/registry/versioning.py +0 -0
  145. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/spark/__init__.py +0 -0
  146. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/__init__.py +0 -0
  147. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/tests/utils.py +0 -0
  148. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/time/__init__.py +0 -0
  149. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/time/time_conversions.py +0 -0
  150. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/time/types.py +0 -0
  151. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/__init__.py +0 -0
  152. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/constants.py +0 -0
  153. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/convert.py +0 -0
  154. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/energy.py +0 -0
  155. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/units/power.py +0 -0
  156. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/__init__.py +0 -0
  157. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/files.py +0 -0
  158. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/filters.py +0 -0
  159. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/id_remappings.py +0 -0
  160. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/LICENSE +0 -0
  161. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/py_expression_eval/README.md +0 -0
  162. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/run_command.py +0 -0
  163. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/spark_partition.py +0 -0
  164. {dsgrid_toolkit-0.2.0 → dsgrid_toolkit-0.3.1}/dsgrid/utils/timing.py +0 -0
  165. {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.2.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-Python: >=3.11
47
- Requires-Dist: chronify~=0.3.1
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<2,>=1
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<3,>=2
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
- Requires-Dist: chronify[spark]; extra == 'spark'
93
- Requires-Dist: pyspark==4.0.0; extra == 'spark'
94
- Requires-Dist: thrift; extra == 'spark'
95
- Requires-Dist: thrift-sasl; extra == 'spark'
96
- Description-Content-Type: text/markdown
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
  [![Documentation](https://img.shields.io/badge/docs-ready-blue.svg)](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.10
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 git+https://github.com/apache/kyuubi.git#egg=pyhive&subdirectory=python
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
- *Not yet available*
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.10
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 git+https://github.com/apache/kyuubi.git#egg=pyhive&subdirectory=python
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
- *Not yet available*
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.2.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 TableFormatType
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
- ListTableFormatTypesResponse,
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("/table_formats/types", response_model=ListTableFormatTypesResponse)
284
- async def list_table_format_types():
285
- """List the table format types available for query results."""
286
- return ListTableFormatTypesResponse(types=_list_enums(TableFormatType))
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 TableFormatType
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 ListTableFormatTypesResponse(DSGBaseModel):
96
- """Defines the response to the list_table_format_types command."""
95
+ class ListValueFormatsResponse(DSGBaseModel):
96
+ """Defines the response to the list_value_formats command."""
97
97
 
98
- types: list[TableFormatType]
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)