climate-ref 0.6.6__py3-none-any.whl → 0.7.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. climate_ref/cli/__init__.py +12 -3
  2. climate_ref/cli/_utils.py +56 -2
  3. climate_ref/cli/datasets.py +48 -9
  4. climate_ref/cli/executions.py +333 -24
  5. climate_ref/cli/providers.py +1 -2
  6. climate_ref/config.py +4 -4
  7. climate_ref/database.py +62 -4
  8. climate_ref/dataset_registry/obs4ref_reference.txt +0 -9
  9. climate_ref/dataset_registry/sample_data.txt +10 -19
  10. climate_ref/datasets/__init__.py +3 -3
  11. climate_ref/datasets/base.py +121 -20
  12. climate_ref/datasets/cmip6.py +2 -0
  13. climate_ref/datasets/obs4mips.py +26 -15
  14. climate_ref/executor/result_handling.py +4 -1
  15. climate_ref/migrations/env.py +12 -10
  16. climate_ref/migrations/versions/2025-09-10T1358_2f6e36738e06_use_version_as_version_facet_for_.py +35 -0
  17. climate_ref/migrations/versions/2025-09-22T2359_20cd136a5b04_add_pmp_version.py +35 -0
  18. climate_ref/models/__init__.py +1 -6
  19. climate_ref/models/base.py +4 -20
  20. climate_ref/models/dataset.py +2 -0
  21. climate_ref/models/diagnostic.py +2 -1
  22. climate_ref/models/execution.py +219 -7
  23. climate_ref/models/metric_value.py +25 -110
  24. climate_ref/models/mixins.py +144 -0
  25. climate_ref/models/provider.py +2 -1
  26. climate_ref/provider_registry.py +4 -4
  27. climate_ref/slurm.py +2 -2
  28. climate_ref/testing.py +1 -1
  29. {climate_ref-0.6.6.dist-info → climate_ref-0.7.0.dist-info}/METADATA +1 -1
  30. climate_ref-0.7.0.dist-info/RECORD +58 -0
  31. climate_ref-0.6.6.dist-info/RECORD +0 -55
  32. {climate_ref-0.6.6.dist-info → climate_ref-0.7.0.dist-info}/WHEEL +0 -0
  33. {climate_ref-0.6.6.dist-info → climate_ref-0.7.0.dist-info}/entry_points.txt +0 -0
  34. {climate_ref-0.6.6.dist-info → climate_ref-0.7.0.dist-info}/licenses/LICENCE +0 -0
  35. {climate_ref-0.6.6.dist-info → climate_ref-0.7.0.dist-info}/licenses/NOTICE +0 -0
@@ -0,0 +1,144 @@
1
+ """Model mixins for shared functionality"""
2
+
3
+ import datetime
4
+ from typing import TYPE_CHECKING, ClassVar
5
+
6
+ from loguru import logger
7
+ from sqlalchemy import Column, Text, func
8
+ from sqlalchemy.orm import Mapped, mapped_column
9
+
10
+ if TYPE_CHECKING:
11
+ from climate_ref_core.pycmec.controlled_vocabulary import CV, Dimension
12
+
13
+
14
+ class CreatedUpdatedMixin:
15
+ """
16
+ Mixin for models that have a created_at and updated_at fields
17
+ """
18
+
19
+ created_at: Mapped[datetime.datetime] = mapped_column(server_default=func.now())
20
+ """
21
+ When the dataset was added to the database
22
+ """
23
+
24
+ updated_at: Mapped[datetime.datetime] = mapped_column(
25
+ server_default=func.now(), onupdate=func.now(), index=True
26
+ )
27
+ """
28
+ When the dataset was updated.
29
+ """
30
+
31
+
32
+ class DimensionMixin:
33
+ """
34
+ Mixin that adds controlled vocabulary dimension support to a model
35
+
36
+ This mixin provides methods and properties for managing CV dimensions
37
+ on database models. Dimensions are stored as individual indexed columns
38
+ that are registered at runtime based on the controlled vocabulary.
39
+
40
+ Classes using this mixin must:
41
+ - Define _cv_dimensions as a ClassVar[list[str]] = []
42
+ - Have a __tablename__ attribute (SQLAlchemy requirement)
43
+ """
44
+
45
+ _cv_dimensions: ClassVar[list[str]]
46
+
47
+ @property
48
+ def dimensions(self) -> dict[str, str]:
49
+ """
50
+ Get the non-null dimensions and their values
51
+
52
+ Any changes to the resulting dictionary are not reflected in the object
53
+
54
+ Returns
55
+ -------
56
+ Collection of dimension names and their values
57
+ """
58
+ dims = {}
59
+ for key in self._cv_dimensions:
60
+ value = getattr(self, key)
61
+ if value is not None:
62
+ dims[key] = value
63
+ return dims
64
+
65
+ @staticmethod
66
+ def build_dimension_column(dimension: "Dimension") -> Column[str]:
67
+ """
68
+ Create a column representing a CV dimension
69
+
70
+ These columns are not automatically generated with alembic revisions.
71
+ Any changes to this functionality likely require a manual database migration
72
+ of the existing columns.
73
+
74
+ Parameters
75
+ ----------
76
+ dimension
77
+ Dimension definition to create the column for.
78
+ Currently only the "name" field is being used.
79
+
80
+ Returns
81
+ -------
82
+ An instance of a sqlalchemy Column
83
+
84
+ This doesn't create the column in the database,
85
+ but enables the ORM to access it.
86
+ """
87
+ return Column(
88
+ dimension.name,
89
+ Text,
90
+ index=True,
91
+ nullable=True,
92
+ info={"skip_autogenerate": True},
93
+ )
94
+
95
+ @classmethod
96
+ def register_cv_dimensions(cls, cv: "CV") -> None:
97
+ """
98
+ Register the dimensions supplied in the controlled vocabulary
99
+
100
+ This has to be done at run-time to support custom CVs.
101
+ Any extra columns already in the database, but not in the CV are ignored.
102
+
103
+ Parameters
104
+ ----------
105
+ cv
106
+ Controlled vocabulary being used by the application.
107
+ This controlled vocabulary contains the definitions of the dimensions that can be used.
108
+ """
109
+ model_name = cls.__name__
110
+
111
+ for dimension in cv.dimensions:
112
+ target_attribute = dimension.name
113
+ if target_attribute in cls._cv_dimensions:
114
+ continue
115
+
116
+ cls._cv_dimensions.append(target_attribute)
117
+ logger.debug(f"Registered {model_name} dimension: {target_attribute}")
118
+
119
+ if hasattr(cls, target_attribute):
120
+ # This should only occur in test suite as we don't support removing dimensions at runtime
121
+ logger.warning(f"Column attribute already exists on {model_name}. Ignoring")
122
+ else:
123
+ setattr(cls, target_attribute, cls.build_dimension_column(dimension))
124
+
125
+ @classmethod
126
+ def _reset_cv_dimensions(cls) -> None:
127
+ """
128
+ Remove any previously registered dimensions
129
+
130
+ Used by the test suite and should not be called at runtime.
131
+
132
+ This doesn't remove any previous column definitions due to a limitation that columns in
133
+ declarative classes cannot be removed.
134
+ This means that `hasattr(cls, "old_attribute")`
135
+ will still return True after resetting, but the values will not be included in any executions.
136
+ """
137
+ model_name = cls.__name__
138
+ logger.warning(f"Removing {model_name} dimensions: {cls._cv_dimensions}")
139
+
140
+ keys = list(cls._cv_dimensions)
141
+ for key in keys:
142
+ cls._cv_dimensions.remove(key)
143
+
144
+ assert not len(cls._cv_dimensions)
@@ -2,7 +2,8 @@ from typing import TYPE_CHECKING
2
2
 
3
3
  from sqlalchemy.orm import Mapped, mapped_column, relationship
4
4
 
5
- from climate_ref.models.base import Base, CreatedUpdatedMixin
5
+ from .base import Base
6
+ from .mixins import CreatedUpdatedMixin
6
7
 
7
8
  if TYPE_CHECKING:
8
9
  from climate_ref.models.diagnostic import Diagnostic
@@ -14,6 +14,8 @@ from loguru import logger
14
14
 
15
15
  from climate_ref.config import Config
16
16
  from climate_ref.database import Database
17
+ from climate_ref.models import Diagnostic as DiagnosticModel
18
+ from climate_ref.models import Provider as ProviderModel
17
19
  from climate_ref_core.diagnostics import Diagnostic
18
20
  from climate_ref_core.providers import DiagnosticProvider, import_provider
19
21
 
@@ -29,10 +31,8 @@ def _register_provider(db: Database, provider: DiagnosticProvider) -> None:
29
31
  provider
30
32
  DiagnosticProvider instance
31
33
  """
32
- from climate_ref.models import Diagnostic, Provider
33
-
34
34
  provider_model, created = db.get_or_create(
35
- Provider,
35
+ ProviderModel,
36
36
  slug=provider.slug,
37
37
  defaults={
38
38
  "name": provider.name,
@@ -46,7 +46,7 @@ def _register_provider(db: Database, provider: DiagnosticProvider) -> None:
46
46
 
47
47
  for diagnostic in provider.diagnostics():
48
48
  diagnostic_model, created = db.get_or_create(
49
- Diagnostic,
49
+ DiagnosticModel,
50
50
  slug=diagnostic.slug,
51
51
  provider_id=provider_model.id,
52
52
  defaults={
climate_ref/slurm.py CHANGED
@@ -10,14 +10,14 @@ class SlurmChecker:
10
10
 
11
11
  def __init__(self, intest: bool = False) -> None:
12
12
  if HAS_REAL_SLURM:
13
- import pyslurm # type: ignore
13
+ import pyslurm # type: ignore # noqa: PLC0415
14
14
 
15
15
  self.slurm_association: dict[int, Any] | None = pyslurm.db.Associations.load()
16
16
  self.slurm_partition: dict[str, Any] | None = pyslurm.Partitions.load()
17
17
  self.slurm_qos: dict[str, Any] | None = pyslurm.qos().get()
18
18
  self.slurm_node: dict[str, Any] | None = pyslurm.Nodes.load()
19
19
  elif intest:
20
- import pyslurm
20
+ import pyslurm # noqa: PLC0415
21
21
 
22
22
  self.slurm_association = pyslurm.db.Associations.load() # dict [num -> Association]
23
23
  self.slurm_partition = pyslurm.Partitions.load() # collection
climate_ref/testing.py CHANGED
@@ -27,7 +27,7 @@ def _determine_test_directory() -> Path | None:
27
27
 
28
28
 
29
29
  TEST_DATA_DIR = _determine_test_directory()
30
- SAMPLE_DATA_VERSION = "v0.7.2"
30
+ SAMPLE_DATA_VERSION = "v0.7.4"
31
31
 
32
32
 
33
33
  def fetch_sample_data(force_cleanup: bool = False, symlink: bool = False) -> None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: climate-ref
3
- Version: 0.6.6
3
+ Version: 0.7.0
4
4
  Summary: Application which runs the CMIP Rapid Evaluation Framework
5
5
  Author-email: Jared Lewis <jared.lewis@climate-resource.com>, Mika Pflueger <mika.pflueger@climate-resource.com>, Bouwe Andela <b.andela@esciencecenter.nl>, Jiwoo Lee <lee1043@llnl.gov>, Min Xu <xum1@ornl.gov>, Nathan Collier <collierno@ornl.gov>, Dora Hegedus <dora.hegedus@stfc.ac.uk>
6
6
  License-Expression: Apache-2.0
@@ -0,0 +1,58 @@
1
+ climate_ref/__init__.py,sha256=M45QGfl0KCPK48A8MjI08weNvZHMYH__GblraQMxsoM,808
2
+ climate_ref/_config_helpers.py,sha256=-atI5FX7SukhLE_jz_rL-EHQ7s0YYqKu3dSFYWxSyMU,6632
3
+ climate_ref/alembic.ini,sha256=WRvbwSIFuZ7hWNMnR2-yHPJAwYUnwhvRYBzkJhtpGdg,3535
4
+ climate_ref/config.py,sha256=RfyX59yGtOrzW1F6-fSBhpM24z54KU3O8HGC-O44vDo,17473
5
+ climate_ref/constants.py,sha256=9RaNLgUSuQva7ki4eRW3TjOKeVP6T81QNiu0veB1zVk,111
6
+ climate_ref/database.py,sha256=stO0K61D8Jh6zRXpjq8rTTeuz0aSi2ZEmeb_9ZqUHJc,10707
7
+ climate_ref/provider_registry.py,sha256=NJssVC0ws7BqaYnAPy-1jSxwdFSXl1VCId67WXMUeGU,4230
8
+ climate_ref/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ climate_ref/slurm.py,sha256=N2L1pZ1A79dtkASEFU4TUjrVg2qtYUf7HMeoGXErTyA,7338
10
+ climate_ref/solver.py,sha256=T5sQjweSvpUMG4q8MfbGjljxa5kBgKxNotT78PwyxqU,16804
11
+ climate_ref/testing.py,sha256=5zte0H4trwxOgRpzAJJ8by8aGuDSDOQAlUqFBgqjhWg,4256
12
+ climate_ref/cli/__init__.py,sha256=iVgsOBnf4YNgLwxoR-VCrrcnMWM90wtLBFxvI7AaHB0,4576
13
+ climate_ref/cli/_utils.py,sha256=KQDp-0YDLXqljpcUFUGoksloJocMWbwh3-kxoUqMbgo,3440
14
+ climate_ref/cli/config.py,sha256=ak4Rn9S6fH23PkHHlI-pXuPiZYOvUB4r26eu3p525-M,532
15
+ climate_ref/cli/datasets.py,sha256=fpRN9YeuZHrkNEjjd5JSrqFSmfO1rCYpdzzYjl5DZPI,9997
16
+ climate_ref/cli/executions.py,sha256=O1xm89r9cI4e99VzLgc5pbhrp71OjROEHa6-GRjaFg4,18191
17
+ climate_ref/cli/providers.py,sha256=8C3xSDBdzfUMil6HPG9a7g0_EKQEmlfPbI3VnN_NmMI,2590
18
+ climate_ref/cli/solve.py,sha256=ZTXrwDFDXNrX5GLMJTN9tFnpV3zlcZbEu2aF3JDJVxI,2367
19
+ climate_ref/dataset_registry/obs4ref_reference.txt,sha256=szXNhA5wx1n2XfYiXPl4FipmjE1Kp5Jrj2UuBLHqNvw,7351
20
+ climate_ref/dataset_registry/sample_data.txt,sha256=w3heh6MMbZ9Jp_SAwLcwWVkq91IRxZh3spwKz-YFRt0,43869
21
+ climate_ref/datasets/__init__.py,sha256=oC0fhdMfie7IfzBwU7BtD5Tv4bJP4zQOK3XgnMQXtSw,1222
22
+ climate_ref/datasets/base.py,sha256=M0hGMlRn1iiridnp7Kc0gckapdEjSSKZyQ1lv8USYIU,15383
23
+ climate_ref/datasets/cmip6.py,sha256=0R79QfRuqTa_wUHHkYCYf8zpJXHzJw2CXbuDKNlY3Bg,7212
24
+ climate_ref/datasets/cmip6_parsers.py,sha256=wH4WKQAR2_aniXwsW7nch6nIpXk2pSpPxkT4unjV4hQ,6041
25
+ climate_ref/datasets/obs4mips.py,sha256=AerO5QaISiRYPzBm_C6lGsKQgE_Zyzo4XoOOKrpB-TE,6586
26
+ climate_ref/datasets/pmp_climatology.py,sha256=goHDc_3B2Wdiy_hmpERNvWDdDYZACPOyFDt3Du6nGc0,534
27
+ climate_ref/datasets/utils.py,sha256=iLJO7h4G3DWsRe9hIC4qkIyi5_zIW1ZMw-FDASLujtM,359
28
+ climate_ref/executor/__init__.py,sha256=tXuXxoFQKH9-te4O3bJg9dVrBKtjRS2si0yzRsHVfGk,902
29
+ climate_ref/executor/hpc.py,sha256=DEp_Q5kDfBTPF_4mgyedjKbXtNZ-OmIkS9bbYo2B1FQ,14153
30
+ climate_ref/executor/local.py,sha256=65LUl41YtURFb87YTWZQHjDpIRlIKJ5Ny51c9DZjy0s,8582
31
+ climate_ref/executor/pbs_scheduler.py,sha256=WoH1sTmDl7bdmYodpcxZjkUSvInYUcWR4x7buIgBxqk,5807
32
+ climate_ref/executor/result_handling.py,sha256=Xm712JB3Lk-gmSOv_sKDtJdgHeJioSjSZV5cpX3OtS0,10961
33
+ climate_ref/executor/synchronous.py,sha256=o4TndsoKMu9AzJYLkusU9lRkgHCy6HcCP46tEs6o86U,1895
34
+ climate_ref/migrations/README,sha256=xM5osYbyEbEFA2eh5kwary_oh-5VFWtDubA-vgWwvlE,935
35
+ climate_ref/migrations/env.py,sha256=jSW4j__q39MaWRHBJ_FZFHl7gEZ7b6_YyU5wDxxzpWQ,4570
36
+ climate_ref/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
37
+ climate_ref/migrations/versions/2025-05-02T1418_341a4aa2551e_regenerate.py,sha256=S8Q4THCI4TPnlaQHgQJUCiNW5LAyQClaiTB-0dwhtXU,14050
38
+ climate_ref/migrations/versions/2025-05-09T2032_03dbb4998e49_series_metric_value.py,sha256=s9nZ_l64pSF7sWN53rRPCQlqW_xHqR8tlWhU-ovmsME,2043
39
+ climate_ref/migrations/versions/2025-07-03T1505_795c1e6cf496_drop_unique_requirement_on_slug.py,sha256=TfBHJkm3oPlz0P5Z1tiY6LBp2B1oDvdyL_OOYoV-OiI,984
40
+ climate_ref/migrations/versions/2025-07-20T1521_94beace57a9c_cmip6_finalised.py,sha256=pzxhT9aFaEqyyUOWf0AExsr6sMW9syyr1RUhy0nj3AM,2907
41
+ climate_ref/migrations/versions/2025-08-05T0327_a1b2c3d4e5f6_finalised_on_base_dataset.py,sha256=Uen3ryUfmIpASeIQYuUJd9xDxnEl5ItTx3jKuHoDSko,2033
42
+ climate_ref/migrations/versions/2025-09-05T2019_8d28e5e0f9c3_add_indexes.py,sha256=r8xKMIykdQbnrtBgmfTtfs5uHlmiQJNp7g5IdWi4zrs,5456
43
+ climate_ref/migrations/versions/2025-09-10T1358_2f6e36738e06_use_version_as_version_facet_for_.py,sha256=s7Vf28NxgKLSIJBX2n8kdfInDbHRD034g1pA5yd5tlg,1006
44
+ climate_ref/migrations/versions/2025-09-22T2359_20cd136a5b04_add_pmp_version.py,sha256=ION7atI6vPiCpM_wvEqn7H3VPyQzmeUQWjO1GRji4oY,992
45
+ climate_ref/models/__init__.py,sha256=uvy_3LLYyyCLeh7144VaHcyt_TPB8ynbQafLRJZ9qPg,741
46
+ climate_ref/models/base.py,sha256=mDfsrw6-IiSO3MbR3f0BTJySM_j3Oty--dg3A3ugn0g,857
47
+ climate_ref/models/dataset.py,sha256=AqKsBiAXfeie8POhkW25yG8wmmPDlG4dpiN15aT3CIg,8242
48
+ climate_ref/models/diagnostic.py,sha256=f2b4HoET56B_sYRGGfrpATdUmGlngUmsf2UzL1Uzp8M,1788
49
+ climate_ref/models/execution.py,sha256=gfkrs0wyySNVQpfob1Bc-26iLDV99K6aSPHs0GZmdNY,17548
50
+ climate_ref/models/metric_value.py,sha256=NFvduNVyB5aOj8rwn8KiPDzIjomBzIroAyFACkSSEUw,7400
51
+ climate_ref/models/mixins.py,sha256=1EAJU2RlhY-9UUIN8F5SZOg5k5uD9r1rG6isvrjQF0o,4683
52
+ climate_ref/models/provider.py,sha256=OnoacwAa50XBS9CCgxJnylIfsGXFP4EqTlLhBXmh6So,991
53
+ climate_ref-0.7.0.dist-info/METADATA,sha256=sswbnom4j-Fpg12A-2XVsQx8EhkqGTQoaK7e4p08Eo8,4507
54
+ climate_ref-0.7.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
55
+ climate_ref-0.7.0.dist-info/entry_points.txt,sha256=IaggEJlDIhoYWXdXJafacWbWtCcoEqUKceP1qD7_7vU,44
56
+ climate_ref-0.7.0.dist-info/licenses/LICENCE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
57
+ climate_ref-0.7.0.dist-info/licenses/NOTICE,sha256=4qTlax9aX2-mswYJuVrLqJ9jK1IkN5kSBqfVvYLF3Ws,128
58
+ climate_ref-0.7.0.dist-info/RECORD,,
@@ -1,55 +0,0 @@
1
- climate_ref/__init__.py,sha256=M45QGfl0KCPK48A8MjI08weNvZHMYH__GblraQMxsoM,808
2
- climate_ref/_config_helpers.py,sha256=-atI5FX7SukhLE_jz_rL-EHQ7s0YYqKu3dSFYWxSyMU,6632
3
- climate_ref/alembic.ini,sha256=WRvbwSIFuZ7hWNMnR2-yHPJAwYUnwhvRYBzkJhtpGdg,3535
4
- climate_ref/config.py,sha256=WW6R7RLwEDuI11XYLYO57FwvmQz1psq9bNM3WVL3e_s,17481
5
- climate_ref/constants.py,sha256=9RaNLgUSuQva7ki4eRW3TjOKeVP6T81QNiu0veB1zVk,111
6
- climate_ref/database.py,sha256=b_6XHdr78Mo7KeLqQJ5DjLsySHPdQE83P8dRpdMfzfM,8661
7
- climate_ref/provider_registry.py,sha256=dyfj4vU6unKHNXtT03HafQtAi3LilL37uvu3paCnmNY,4159
8
- climate_ref/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- climate_ref/slurm.py,sha256=XWXVPdXP-4BDib3bxYW9uPcAJdPpo1ixYZAI_y1cZuw,7305
10
- climate_ref/solver.py,sha256=T5sQjweSvpUMG4q8MfbGjljxa5kBgKxNotT78PwyxqU,16804
11
- climate_ref/testing.py,sha256=nSB8levCt0Ol6odumBJgy5HMKbusRCr19SuIbkMN3MQ,4256
12
- climate_ref/cli/__init__.py,sha256=fvENOeL4j7CMPANVxrDlWfaB0QUvvYgrWcm5ptbL0P8,4350
13
- climate_ref/cli/_utils.py,sha256=6bIb8zEVvzXyKpv8MG58T-T2L2jH-G8WNrOOGpz3uCw,1918
14
- climate_ref/cli/config.py,sha256=ak4Rn9S6fH23PkHHlI-pXuPiZYOvUB4r26eu3p525-M,532
15
- climate_ref/cli/datasets.py,sha256=4iYQZ0ceoF-Cd8eSpS4Q8b9aLt_vEDUw5slzGw02DsY,8277
16
- climate_ref/cli/executions.py,sha256=fKQ-3IvYaTEOCIhqNNrFWgwGyHPeVmKWlDQ8VH-K9rM,7721
17
- climate_ref/cli/providers.py,sha256=-5hQkJc01jON1bc1dk--tSWTesyiHOzZuYMb9Vxge9k,2613
18
- climate_ref/cli/solve.py,sha256=ZTXrwDFDXNrX5GLMJTN9tFnpV3zlcZbEu2aF3JDJVxI,2367
19
- climate_ref/dataset_registry/obs4ref_reference.txt,sha256=2zJMbsAsQ49KaWziX3CqrlILq9yN7S2ygmfV3V5rsnw,8395
20
- climate_ref/dataset_registry/sample_data.txt,sha256=MK-tvVRLOeNtEnmIQVnZrz27dSmsoSVsxmgTC6R-3v0,45237
21
- climate_ref/datasets/__init__.py,sha256=PV3u5ZmhyfcHbKqySgwVA8m4-naZgxzydLXSBqdTGLM,1171
22
- climate_ref/datasets/base.py,sha256=uZ55u625ckRNjsn-AqJg4_xO5uvHchqYvwBZIt4iHtY,11017
23
- climate_ref/datasets/cmip6.py,sha256=KO761ConHvX40n9X0xLrxjhzN7wmighNWL2JyYygRAA,7049
24
- climate_ref/datasets/cmip6_parsers.py,sha256=wH4WKQAR2_aniXwsW7nch6nIpXk2pSpPxkT4unjV4hQ,6041
25
- climate_ref/datasets/obs4mips.py,sha256=q0_erQb4k5KBaGMvEGgUtVSDvXQjuftqDmvW4QZpWZI,6138
26
- climate_ref/datasets/pmp_climatology.py,sha256=goHDc_3B2Wdiy_hmpERNvWDdDYZACPOyFDt3Du6nGc0,534
27
- climate_ref/datasets/utils.py,sha256=iLJO7h4G3DWsRe9hIC4qkIyi5_zIW1ZMw-FDASLujtM,359
28
- climate_ref/executor/__init__.py,sha256=tXuXxoFQKH9-te4O3bJg9dVrBKtjRS2si0yzRsHVfGk,902
29
- climate_ref/executor/hpc.py,sha256=DEp_Q5kDfBTPF_4mgyedjKbXtNZ-OmIkS9bbYo2B1FQ,14153
30
- climate_ref/executor/local.py,sha256=65LUl41YtURFb87YTWZQHjDpIRlIKJ5Ny51c9DZjy0s,8582
31
- climate_ref/executor/pbs_scheduler.py,sha256=WoH1sTmDl7bdmYodpcxZjkUSvInYUcWR4x7buIgBxqk,5807
32
- climate_ref/executor/result_handling.py,sha256=2VQHbLKdv109pQwQO_cTqxsAXAq9S-s4w8aYg10VWms,10796
33
- climate_ref/executor/synchronous.py,sha256=o4TndsoKMu9AzJYLkusU9lRkgHCy6HcCP46tEs6o86U,1895
34
- climate_ref/migrations/README,sha256=xM5osYbyEbEFA2eh5kwary_oh-5VFWtDubA-vgWwvlE,935
35
- climate_ref/migrations/env.py,sha256=8GvBLhGTuQy6MKYMj7QszJEQ2LNewf1Z9kB9dBHQs9I,4375
36
- climate_ref/migrations/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
37
- climate_ref/migrations/versions/2025-05-02T1418_341a4aa2551e_regenerate.py,sha256=S8Q4THCI4TPnlaQHgQJUCiNW5LAyQClaiTB-0dwhtXU,14050
38
- climate_ref/migrations/versions/2025-05-09T2032_03dbb4998e49_series_metric_value.py,sha256=s9nZ_l64pSF7sWN53rRPCQlqW_xHqR8tlWhU-ovmsME,2043
39
- climate_ref/migrations/versions/2025-07-03T1505_795c1e6cf496_drop_unique_requirement_on_slug.py,sha256=TfBHJkm3oPlz0P5Z1tiY6LBp2B1oDvdyL_OOYoV-OiI,984
40
- climate_ref/migrations/versions/2025-07-20T1521_94beace57a9c_cmip6_finalised.py,sha256=pzxhT9aFaEqyyUOWf0AExsr6sMW9syyr1RUhy0nj3AM,2907
41
- climate_ref/migrations/versions/2025-08-05T0327_a1b2c3d4e5f6_finalised_on_base_dataset.py,sha256=Uen3ryUfmIpASeIQYuUJd9xDxnEl5ItTx3jKuHoDSko,2033
42
- climate_ref/migrations/versions/2025-09-05T2019_8d28e5e0f9c3_add_indexes.py,sha256=r8xKMIykdQbnrtBgmfTtfs5uHlmiQJNp7g5IdWi4zrs,5456
43
- climate_ref/models/__init__.py,sha256=rUDKRANeAEAHVOrzJVIZoZ99dDG5O4AGzHmOpC876Nc,801
44
- climate_ref/models/base.py,sha256=jY7aMH1DAekH2Zs5v-r1O4mpAAfZq2Fn4EGXrO1vFvk,1297
45
- climate_ref/models/dataset.py,sha256=eW0FV--ImpeZH08cGlC5PPKD088F4D_zv5qEVet8iNo,8156
46
- climate_ref/models/diagnostic.py,sha256=0mKVvASEWNxx41R2Y-5VxplarZ4JAP6q0oaO14FKZuk,1751
47
- climate_ref/models/execution.py,sha256=iqT8jrbP_RTyDtIO2nAczmp-rtouuaHzkb7g1IOhJ-0,9917
48
- climate_ref/models/metric_value.py,sha256=XsmZvp21WMykBjDePDqsZsT2UefEFFskoZCd4uOXK-4,10212
49
- climate_ref/models/provider.py,sha256=RAE2qAAxwObu-72CdK4kt5ACMmKYEn07WJm7DU9hF28,990
50
- climate_ref-0.6.6.dist-info/METADATA,sha256=1Y-tl8sg-djWxY2UeLsN_A5paYJAFPvZGVf1rfJPtuE,4507
51
- climate_ref-0.6.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- climate_ref-0.6.6.dist-info/entry_points.txt,sha256=IaggEJlDIhoYWXdXJafacWbWtCcoEqUKceP1qD7_7vU,44
53
- climate_ref-0.6.6.dist-info/licenses/LICENCE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
54
- climate_ref-0.6.6.dist-info/licenses/NOTICE,sha256=4qTlax9aX2-mswYJuVrLqJ9jK1IkN5kSBqfVvYLF3Ws,128
55
- climate_ref-0.6.6.dist-info/RECORD,,