climate-ref-core 0.6.3__tar.gz → 0.6.4__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 (46) hide show
  1. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/PKG-INFO +1 -1
  2. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/pyproject.toml +1 -1
  3. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/providers.py +8 -10
  4. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_providers.py +7 -7
  5. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/.gitignore +0 -0
  6. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/LICENCE +0 -0
  7. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/NOTICE +0 -0
  8. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/README.md +0 -0
  9. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/__init__.py +0 -0
  10. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/constraints.py +0 -0
  11. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/dataset_registry.py +0 -0
  12. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/datasets.py +0 -0
  13. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/diagnostics.py +0 -0
  14. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/env.py +0 -0
  15. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/exceptions.py +0 -0
  16. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/executor.py +0 -0
  17. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/logging.py +0 -0
  18. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/metric_values/__init__.py +0 -0
  19. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/metric_values/typing.py +0 -0
  20. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/py.typed +0 -0
  21. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/pycmec/README.md +0 -0
  22. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/pycmec/__init__.py +0 -0
  23. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/pycmec/controlled_vocabulary.py +0 -0
  24. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/pycmec/cv_cmip7_aft.yaml +0 -0
  25. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/pycmec/metric.py +0 -0
  26. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/src/climate_ref_core/pycmec/output.py +0 -0
  27. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/metric_values/test_typing.py +0 -0
  28. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/cmec_testdata/cmec_metric_sample.json +0 -0
  29. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/cmec_testdata/cmec_output_sample.json +0 -0
  30. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/cmec_testdata/cv_sample.yaml +0 -0
  31. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/cmec_testdata/test_metric_json_schema.yml +0 -0
  32. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/cmec_testdata/test_output_json_schema.yml +0 -0
  33. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/conftest.py +0 -0
  34. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/test_cmec_metric.py +0 -0
  35. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/test_cmec_output.py +0 -0
  36. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/pycmec/test_controlled_vocabulary.py +0 -0
  37. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_constraints.py +0 -0
  38. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_dataset_registry/test_dataset_registry.py +0 -0
  39. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_datasets/dataset_collection_hash.yml +0 -0
  40. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_datasets/dataset_collection_obs4mips_hash.yml +0 -0
  41. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_datasets/metric_dataset_hash.yml +0 -0
  42. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_datasets.py +0 -0
  43. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_exceptions.py +0 -0
  44. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_executor.py +0 -0
  45. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_logging.py +0 -0
  46. {climate_ref_core-0.6.3 → climate_ref_core-0.6.4}/tests/unit/test_metrics.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: climate-ref-core
3
- Version: 0.6.3
3
+ Version: 0.6.4
4
4
  Summary: Core library for 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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "climate-ref-core"
3
- version = "0.6.3"
3
+ version = "0.6.4"
4
4
  description = "Core library for the CMIP Rapid Evaluation Framework"
5
5
  readme = "README.md"
6
6
  authors = [
@@ -136,7 +136,7 @@ def import_provider(fqn: str) -> DiagnosticProvider:
136
136
  fqn
137
137
  Full package and attribute name of the provider to import
138
138
 
139
- For example: `climate_ref_example.provider` will use the `provider` attribute from the
139
+ For example: `climate_ref_example:provider` will use the `provider` attribute from the
140
140
  `climate_ref_example` package.
141
141
 
142
142
  If only a package name is provided, the default attribute name is `provider`.
@@ -153,24 +153,22 @@ def import_provider(fqn: str) -> DiagnosticProvider:
153
153
  :
154
154
  DiagnosticProvider instance
155
155
  """
156
- if "." in fqn:
157
- module, name = fqn.rsplit(".", 1)
158
- else:
159
- module = fqn
160
- name = "provider"
156
+ if ":" not in fqn:
157
+ fqn = f"{fqn}:provider"
158
+
159
+ entrypoint = importlib.metadata.EntryPoint(name="provider", value=fqn, group="climate-ref.providers")
161
160
 
162
161
  try:
163
- imp = importlib.import_module(module)
164
- provider = getattr(imp, name)
162
+ provider = entrypoint.load()
165
163
  if not isinstance(provider, DiagnosticProvider):
166
164
  raise InvalidProviderException(fqn, f"Expected DiagnosticProvider, got {type(provider)}")
167
165
  return provider
168
166
  except ModuleNotFoundError:
169
167
  logger.error(f"Module '{fqn}' not found")
170
- raise InvalidProviderException(fqn, f"Module '{module}' not found")
168
+ raise InvalidProviderException(fqn, "Module not found")
171
169
  except AttributeError:
172
170
  logger.error(f"Provider '{fqn}' not found")
173
- raise InvalidProviderException(fqn, f"Provider '{name}' not found in {module}")
171
+ raise InvalidProviderException(fqn, "Provider not found in module")
174
172
 
175
173
 
176
174
  class CommandLineDiagnosticProvider(DiagnosticProvider):
@@ -52,7 +52,7 @@ class TestMetricsProvider:
52
52
  assert isinstance(result, Diagnostic)
53
53
 
54
54
 
55
- @pytest.mark.parametrize("fqn", ["climate_ref_esmvaltool.provider", "climate_ref_esmvaltool"])
55
+ @pytest.mark.parametrize("fqn", ["climate_ref_esmvaltool:provider", "climate_ref_esmvaltool"])
56
56
  def test_import_provider(fqn):
57
57
  provider = import_provider(fqn)
58
58
 
@@ -63,21 +63,21 @@ def test_import_provider(fqn):
63
63
 
64
64
  def test_import_provider_missing():
65
65
  fqn = "climate_ref"
66
- match = f"Invalid provider: '{fqn}'\n Provider 'provider' not found in climate_ref"
66
+ match = f"Invalid provider: '{fqn}.provider'\n Provider not found in module"
67
67
  with pytest.raises(InvalidProviderException, match=match):
68
68
  import_provider(fqn)
69
69
 
70
- fqn = "climate_ref.datasets.WrongProvider"
71
- match = f"Invalid provider: '{fqn}'\n Provider 'WrongProvider' not found in climate_ref.datasets"
70
+ fqn = "climate_ref.datasets:WrongProvider"
71
+ match = f"Invalid provider: '{fqn}'\n Provider not found in module"
72
72
  with pytest.raises(InvalidProviderException, match=match):
73
73
  import_provider(fqn)
74
74
 
75
- fqn = "missing.local.WrongProvider"
76
- match = f"Invalid provider: '{fqn}'\n Module 'missing.local' not found"
75
+ fqn = "missing.local:WrongProvider"
76
+ match = f"Invalid provider: '{fqn}'\n Module not found"
77
77
  with pytest.raises(InvalidProviderException, match=match):
78
78
  import_provider(fqn)
79
79
 
80
- fqn = "climate_ref.__version__"
80
+ fqn = "climate_ref:__version__"
81
81
  match = f"Invalid provider: '{fqn}'\n Expected DiagnosticProvider, got <class 'str'>"
82
82
  with pytest.raises(InvalidProviderException, match=match):
83
83
  import_provider(fqn)