esgvoc 1.0.1__py3-none-any.whl → 1.1.2__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.

Potentially problematic release.


This version of esgvoc might be problematic. Click here for more details.

Files changed (41) hide show
  1. esgvoc/__init__.py +1 -1
  2. esgvoc/api/__init__.py +0 -6
  3. esgvoc/api/data_descriptors/__init__.py +6 -0
  4. esgvoc/api/data_descriptors/archive.py +5 -0
  5. esgvoc/api/data_descriptors/citation_url.py +5 -0
  6. esgvoc/api/data_descriptors/experiment.py +2 -2
  7. esgvoc/api/data_descriptors/known_branded_variable.py +58 -5
  8. esgvoc/api/data_descriptors/regex.py +5 -0
  9. esgvoc/api/data_descriptors/vertical_label.py +2 -2
  10. esgvoc/api/project_specs.py +48 -130
  11. esgvoc/api/projects.py +104 -63
  12. esgvoc/apps/drs/generator.py +47 -42
  13. esgvoc/apps/drs/validator.py +22 -38
  14. esgvoc/apps/jsg/json_schema_generator.py +252 -136
  15. esgvoc/apps/jsg/templates/template.jinja +249 -0
  16. esgvoc/apps/test_cv/README.md +214 -0
  17. esgvoc/apps/test_cv/cv_tester.py +1368 -0
  18. esgvoc/apps/test_cv/example_usage.py +216 -0
  19. esgvoc/apps/vr/__init__.py +12 -0
  20. esgvoc/apps/vr/build_variable_registry.py +71 -0
  21. esgvoc/apps/vr/example_usage.py +60 -0
  22. esgvoc/apps/vr/vr_app.py +333 -0
  23. esgvoc/cli/config.py +671 -86
  24. esgvoc/cli/drs.py +39 -21
  25. esgvoc/cli/main.py +2 -0
  26. esgvoc/cli/test_cv.py +257 -0
  27. esgvoc/core/constants.py +10 -7
  28. esgvoc/core/data_handler.py +24 -22
  29. esgvoc/core/db/connection.py +7 -0
  30. esgvoc/core/db/project_ingestion.py +34 -9
  31. esgvoc/core/db/universe_ingestion.py +1 -2
  32. esgvoc/core/service/configuration/setting.py +192 -21
  33. esgvoc/core/service/data_merger.py +1 -1
  34. esgvoc/core/service/state.py +18 -2
  35. {esgvoc-1.0.1.dist-info → esgvoc-1.1.2.dist-info}/METADATA +3 -1
  36. {esgvoc-1.0.1.dist-info → esgvoc-1.1.2.dist-info}/RECORD +40 -29
  37. esgvoc/apps/jsg/cmip6_template.json +0 -74
  38. /esgvoc/apps/{py.typed → test_cv/__init__.py} +0 -0
  39. {esgvoc-1.0.1.dist-info → esgvoc-1.1.2.dist-info}/WHEEL +0 -0
  40. {esgvoc-1.0.1.dist-info → esgvoc-1.1.2.dist-info}/entry_points.txt +0 -0
  41. {esgvoc-1.0.1.dist-info → esgvoc-1.1.2.dist-info}/licenses/LICENSE.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  from typing import ClassVar, Dict, Optional
2
+
2
3
  import toml
3
4
  from pydantic import BaseModel, Field
4
5
 
@@ -22,8 +23,54 @@ class ServiceSettings(BaseModel):
22
23
  universe: UniverseSettings
23
24
  projects: Dict[str, ProjectSettings] = Field(default_factory=dict)
24
25
 
25
- # 🔹 Define default settings
26
- DEFAULT_SETTINGS : ClassVar[dict]= {
26
+ # 🔹 Centralized default project configurations
27
+ DEFAULT_PROJECT_CONFIGS: ClassVar[Dict[str, dict]] = {
28
+ "cmip6": {
29
+ "project_name": "cmip6",
30
+ "github_repo": "https://github.com/WCRP-CMIP/CMIP6_CVs",
31
+ "branch": "esgvoc",
32
+ "local_path": "repos/CMIP6_CVs",
33
+ "db_path": "dbs/cmip6.sqlite",
34
+ },
35
+ "cmip6plus": {
36
+ "project_name": "cmip6plus",
37
+ "github_repo": "https://github.com/WCRP-CMIP/CMIP6Plus_CVs",
38
+ "branch": "esgvoc",
39
+ "local_path": "repos/CMIP6Plus_CVs",
40
+ "db_path": "dbs/cmip6plus.sqlite",
41
+ },
42
+ "input4mip": {
43
+ "project_name": "input4mip",
44
+ "github_repo": "https://github.com/PCMDI/input4MIPs_CVs",
45
+ "branch": "esgvoc",
46
+ "local_path": "repos/Input4MIP_CVs",
47
+ "db_path": "dbs/input4mips.sqlite",
48
+ },
49
+ "obs4ref": {
50
+ "project_name": "obs4ref",
51
+ "github_repo": "https://github.com/Climate-REF/Obs4REF_CVs",
52
+ "branch": "main",
53
+ "local_path": "repos/obs4REF_CVs",
54
+ "db_path": "dbs/obs4ref.sqlite",
55
+ },
56
+ "cordex-cmip6": {
57
+ "project_name": "cordex-cmip6",
58
+ "github_repo": "https://github.com/WCRP-CORDEX/cordex-cmip6-cv",
59
+ "branch": "esgvoc",
60
+ "local_path": "repos/cordex-cmip6-cv",
61
+ "db_path": "dbs/cordex-cmip6.sqlite",
62
+ },
63
+ "cmip7": {
64
+ "project_name": "cmip7",
65
+ "github_repo": "https://github.com/WCRP-CMIP/CMIP7-CVs",
66
+ "branch": "esgvoc",
67
+ "local_path": "repos/CMIP7-CVs",
68
+ "db_path": "dbs/cmip7.sqlite",
69
+ },
70
+ }
71
+
72
+ # 🔹 Default settings - only includes cmip6 and cmip6plus by default
73
+ DEFAULT_SETTINGS: ClassVar[dict] = {
27
74
  "universe": {
28
75
  "github_repo": "https://github.com/WCRP-CMIP/WCRP-universe",
29
76
  "branch": "esgvoc",
@@ -31,20 +78,8 @@ class ServiceSettings(BaseModel):
31
78
  "db_path": "dbs/universe.sqlite",
32
79
  },
33
80
  "projects": [
34
- {
35
- "project_name": "cmip6",
36
- "github_repo": "https://github.com/WCRP-CMIP/CMIP6_CVs",
37
- "branch": "esgvoc",
38
- "local_path": "repos/CMIP6_CVs",
39
- "db_path": "dbs/cmip6.sqlite",
40
- },
41
- {
42
- "project_name": "cmip6plus",
43
- "github_repo": "https://github.com/WCRP-CMIP/CMIP6Plus_CVs",
44
- "branch": "esgvoc",
45
- "local_path": "repos/CMIP6Plus_CVs",
46
- "db_path": "dbs/cmip6plus.sqlite",
47
- },
81
+ DEFAULT_PROJECT_CONFIGS["cmip6"],
82
+ DEFAULT_PROJECT_CONFIGS["cmip6plus"],
48
83
  ],
49
84
  }
50
85
 
@@ -54,7 +89,7 @@ class ServiceSettings(BaseModel):
54
89
  try:
55
90
  data = toml.load(file_path)
56
91
  except FileNotFoundError:
57
- data = cls.DEFAULT_SETTINGS # Use defaults if the file is missing
92
+ data = cls.DEFAULT_SETTINGS.copy() # Use defaults if the file is missing
58
93
 
59
94
  projects = {p["project_name"]: ProjectSettings(**p) for p in data.pop("projects", [])}
60
95
  return cls(universe=UniverseSettings(**data["universe"]), projects=projects)
@@ -78,11 +113,147 @@ class ServiceSettings(BaseModel):
78
113
  }
79
114
  with open(file_path, "w") as f:
80
115
  toml.dump(data, f)
81
-
82
- def dump(self)->dict:
83
- data = {
116
+
117
+ def dump(self) -> dict:
118
+ """Return the configuration as a dictionary."""
119
+ return {
84
120
  "universe": self.universe.model_dump(),
85
121
  "projects": [p.model_dump() for p in self.projects.values()],
86
122
  }
87
- return data
88
123
 
124
+ # 🔹 NEW: Project management methods
125
+
126
+ def add_project_from_default(self, project_name: str) -> bool:
127
+ """
128
+ Add a project using its default configuration.
129
+
130
+ Args:
131
+ project_name: Name of the project to add (must exist in DEFAULT_PROJECT_CONFIGS)
132
+
133
+ Returns:
134
+ bool: True if project was added, False if it already exists or is unknown
135
+ """
136
+ if project_name in self.projects:
137
+ return False # Project already exists
138
+
139
+ if project_name not in self.DEFAULT_PROJECT_CONFIGS:
140
+ raise ValueError(
141
+ f"Unknown project '{project_name}'. Available defaults: {list(self.DEFAULT_PROJECT_CONFIGS.keys())}"
142
+ )
143
+
144
+ config = self.DEFAULT_PROJECT_CONFIGS[project_name].copy()
145
+ self.projects[project_name] = ProjectSettings(**config)
146
+ return True
147
+
148
+ def add_project_custom(self, project_config: dict) -> bool:
149
+ """
150
+ Add a project with custom configuration.
151
+
152
+ Args:
153
+ project_config: Dictionary containing project configuration
154
+
155
+ Returns:
156
+ bool: True if project was added, False if it already exists
157
+ """
158
+ project_settings = ProjectSettings(**project_config)
159
+ project_name = project_settings.project_name
160
+
161
+ if project_name in self.projects:
162
+ return False # Project already exists
163
+
164
+ self.projects[project_name] = project_settings
165
+ return True
166
+
167
+ def remove_project(self, project_name: str) -> bool:
168
+ """
169
+ Remove a project from the configuration.
170
+
171
+ Args:
172
+ project_name: Name of the project to remove
173
+
174
+ Returns:
175
+ bool: True if project was removed, False if it didn't exist
176
+ """
177
+ if project_name in self.projects:
178
+ del self.projects[project_name]
179
+ return True
180
+ return False
181
+
182
+ def update_project(self, project_name: str, **kwargs) -> bool:
183
+ """
184
+ Update specific fields of an existing project.
185
+
186
+ Args:
187
+ project_name: Name of the project to update
188
+ **kwargs: Fields to update
189
+
190
+ Returns:
191
+ bool: True if project was updated, False if it doesn't exist
192
+ """
193
+ if project_name not in self.projects:
194
+ return False
195
+
196
+ # Get current config and update with new values
197
+ current_config = self.projects[project_name].model_dump()
198
+ current_config.update(kwargs)
199
+
200
+ # Recreate the ProjectSettings with updated config
201
+ self.projects[project_name] = ProjectSettings(**current_config)
202
+ return True
203
+
204
+ def get_available_default_projects(self) -> list[str]:
205
+ """Return list of available default project names."""
206
+ return list(self.DEFAULT_PROJECT_CONFIGS.keys())
207
+
208
+ def has_project(self, project_name: str) -> bool:
209
+ """Check if a project exists in the current configuration."""
210
+ return project_name in self.projects
211
+
212
+ def get_project(self, project_name: str) -> Optional[ProjectSettings]:
213
+ """Get a specific project configuration."""
214
+ return self.projects.get(project_name)
215
+
216
+
217
+ # 🔹 Usage Examples
218
+ def main():
219
+ # Create default settings (only cmip6 and cmip6plus)
220
+ settings = ServiceSettings.load_default()
221
+ print(f"Default projects: {list(settings.projects.keys())}") # ['cmip6', 'cmip6plus']
222
+
223
+ # See what other projects are available to add
224
+ available = settings.get_available_default_projects()
225
+ print(f"Available default projects: {available}") # ['cmip6', 'cmip6plus', 'input4mip', 'obs4mip']
226
+
227
+ # Add optional projects when needed
228
+ added_input4mip = settings.add_project_from_default("input4mip")
229
+ print(f"Added input4mip: {added_input4mip}")
230
+
231
+ added_obs4mip = settings.add_project_from_default("obs4mip")
232
+ print(f"Added obs4mip: {added_obs4mip}")
233
+
234
+ print(f"Projects after adding optional ones: {list(settings.projects.keys())}")
235
+
236
+ # Remove a project if no longer needed
237
+ removed = settings.remove_project("obs4mip")
238
+ print(f"Removed obs4mip: {removed}")
239
+ print(f"Projects after removal: {list(settings.projects.keys())}")
240
+
241
+ # Try to add a custom project
242
+ custom_project = {
243
+ "project_name": "my_custom_project",
244
+ "github_repo": "https://github.com/me/my-project",
245
+ "branch": "develop",
246
+ "local_path": "repos/my_project",
247
+ "db_path": "dbs/my_project.sqlite",
248
+ }
249
+ added_custom = settings.add_project_custom(custom_project)
250
+ print(f"Added custom project: {added_custom}")
251
+ print(f"Final projects: {list(settings.projects.keys())}")
252
+
253
+ # Update a project
254
+ updated = settings.update_project("my_custom_project", branch="main", db_path="dbs/updated.sqlite")
255
+ print(f"Updated custom project: {updated}")
256
+
257
+
258
+ if __name__ == "__main__":
259
+ main()
@@ -72,8 +72,8 @@ class DataMerger:
72
72
  current_data = next_data_instance
73
73
  return result_list
74
74
  except Exception as e:
75
+ print("ERROR when merging", e)
75
76
  print(self.data)
76
- print(e)
77
77
 
78
78
 
79
79
  if __name__ == "__main__":
@@ -167,6 +167,7 @@ class BaseState:
167
167
 
168
168
  def sync(self):
169
169
  summary = self.check_sync_status()
170
+ updated = False
170
171
  if (
171
172
  self.github_access
172
173
  and summary["github_db_sync"] is None
@@ -175,25 +176,32 @@ class BaseState:
175
176
  ):
176
177
  self.clone_remote()
177
178
  self.build_db()
179
+ updated = True
178
180
  elif self.github_access and not summary["github_db_sync"]:
179
181
  if not summary["local_db_sync"] and summary["local_db_sync"] is not None:
180
182
  self.clone_remote()
181
183
  self.build_db()
184
+ updated = True
182
185
  elif not summary["github_local_sync"]:
183
186
  self.clone_remote()
184
187
  self.build_db()
188
+ updated = True
185
189
  else: # can be simply build in root and clone if neccessary
186
190
  self.build_db()
191
+ updated = True
187
192
  elif self.local_access:
188
193
  if not summary["local_db_sync"] and summary["local_db_sync"] is not None:
189
194
  self.build_db()
195
+ updated = True
190
196
  else:
191
197
  print("Cache db is uptodate from local repository")
192
198
  elif not self.db_access: # it can happen if the db is created but not filled
193
199
  self.build_db()
200
+ updated = True
194
201
  else:
195
202
  print("Nothing to install, everything up to date")
196
203
  print("Try 'esgvoc status' for more details")
204
+ return updated
197
205
 
198
206
 
199
207
  class StateUniverse(BaseState):
@@ -233,11 +241,19 @@ class StateService:
233
241
 
234
242
  def synchronize_all(self):
235
243
  print("sync universe")
236
- self.universe.sync()
244
+ universe_updated = self.universe.sync()
237
245
  print("sync projects")
238
246
  for project in self.projects.values():
239
- project.sync()
247
+ project_updated = project.sync()
248
+ if universe_updated and not project_updated:
249
+ project.build_db()
240
250
  self.connect_db()
251
+
252
+ # Display state table after synchronization
253
+ table = self.table()
254
+ from rich.console import Console
255
+ console = Console()
256
+ console.print(table)
241
257
 
242
258
  def table(self):
243
259
  table = Table(show_header=False, show_lines=True)
@@ -1,15 +1,17 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: esgvoc
3
- Version: 1.0.1
3
+ Version: 1.1.2
4
4
  Summary: python library and CLI to interact with WCRP CVs
5
5
  Project-URL: Repository, https://github.com/ESGF/esgf-vocab
6
6
  Author-email: Sébastien Gardoll <sebastien@gardoll.fr>, Guillaume Levavasseur <guillaume.levavasseur@ipsl.fr>, Laurent Troussellier <laurent.troussellier@ipsl.fr>
7
7
  License: CECILL-2.1
8
8
  Requires-Python: >=3.10
9
9
  Requires-Dist: idna>=3.10
10
+ Requires-Dist: jinja2>=3.1.6
10
11
  Requires-Dist: platformdirs>=4.3.6
11
12
  Requires-Dist: pydantic>=2.9.2
12
13
  Requires-Dist: pyld>=2.0.4
14
+ Requires-Dist: pyyaml>=6.0.2
13
15
  Requires-Dist: requests>=2.32.3
14
16
  Requires-Dist: sqlalchemy>=2.0.36
15
17
  Requires-Dist: sqlmodel>=0.0.22
@@ -1,16 +1,18 @@
1
- esgvoc/__init__.py,sha256=u3ucA4xC8eQ_WbPjLI1E9a3kvkwtU5n8TUNRaCFQMfs,66
2
- esgvoc/api/__init__.py,sha256=w68CdVRS553bDWezZoCTxIFq_vsP7mFluSoO4yUo_Uc,4130
3
- esgvoc/api/project_specs.py,sha256=ZvDAVn3-ZFpReCozK-_cVt6Sqkwrwww0X4vKUoxr1I4,5502
4
- esgvoc/api/projects.py,sha256=LUasPF5cPSG1aD6vOkFwGNCMNSf5e--LdDtDkrMjcTU,56720
1
+ esgvoc/__init__.py,sha256=roYsHxvc3ZJqEuVzFCfPfebASQoCUCAnNluFrXM5BgA,66
2
+ esgvoc/api/__init__.py,sha256=5MK2lhD2L8DC_qlVjj5KNJNQ90UkX60eoPJOBuSG18A,3916
3
+ esgvoc/api/project_specs.py,sha256=GZ26U5B-LsBQN8u5JMFxeUWMjdqIw8Xh6kWdp-WgErU,3310
4
+ esgvoc/api/projects.py,sha256=mAoAdrK6xj0AoXb3zai_a9JGMUH8Y7z6ACT2TuWL4Z4,58953
5
5
  esgvoc/api/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  esgvoc/api/report.py,sha256=OlK5ApnaikMKmC6FyJ1uTSBeTezZe85yTCJwsk14uZE,3526
7
7
  esgvoc/api/search.py,sha256=C4IRhfNezSV6ztwMXo-P8W_41qIPiO5nQXdU9etPy3k,7595
8
8
  esgvoc/api/universe.py,sha256=i3bSIwUvO8S3COLvn_fz2K9Diegfeniccwx6QZXzIGc,22842
9
- esgvoc/api/data_descriptors/__init__.py,sha256=JFdB-Qfzxbws2zlWRqq77TTQFIlb6MosXe7fv9zimDg,4420
9
+ esgvoc/api/data_descriptors/__init__.py,sha256=ft2xTuSmi1C3b-DNknEQLyGgQRkkKpoc3HebwmnvaZI,4670
10
10
  esgvoc/api/data_descriptors/activity.py,sha256=uu7e-fNvk_0oOOrtVWujDIBbF88fvhqwUfqYS_2Fabs,621
11
+ esgvoc/api/data_descriptors/archive.py,sha256=5tmY5AsKAvyoU8839VdzLCbvP0pAhrCYP6EggZXFMTY,131
11
12
  esgvoc/api/data_descriptors/area_label.py,sha256=Vyny3nmESGLOTVhGCE1iJbdITpN_wvB_onKy44dsVRY,842
12
13
  esgvoc/api/data_descriptors/branded_suffix.py,sha256=jliXbvygKjcxqipalRZT694nXGVUp0k4uAORzMX9B0I,822
13
14
  esgvoc/api/data_descriptors/branded_variable.py,sha256=1ZELmysGUQfid0Njef1rGlWZCvuordpT6bVMC5kZI4Q,698
15
+ esgvoc/api/data_descriptors/citation_url.py,sha256=R0bjM8MU6IdqvLzc4q0aeAbndmRodAcLu_YJVD-BhBA,139
14
16
  esgvoc/api/data_descriptors/consortium.py,sha256=-pyzpxXIbB-GZlF_sAMH6vl6pecp9q7bMfUruAjHEsM,812
15
17
  esgvoc/api/data_descriptors/contact.py,sha256=q1tNm8VcG7xvv4ophVIuy58_2y-rSozs86c7_gMupdk,135
16
18
  esgvoc/api/data_descriptors/conventions.py,sha256=DUFq9sxu3CT7IoJOHJKMN9ACg5oeCebEdlVGJD_6smo,161
@@ -19,7 +21,7 @@ esgvoc/api/data_descriptors/data_descriptor.py,sha256=obRJ4VnbJhVmK5dw85iMc5vsBC
19
21
  esgvoc/api/data_descriptors/data_specs_version.py,sha256=UlAWiQ7WuzdiFcRkekG4YKWmgyMJq4AeFwl6rUjCeiM,144
20
22
  esgvoc/api/data_descriptors/date.py,sha256=mkWivY0orl0wha38sMamrVbUbdZks-iUS_Wf6Gqz0-4,132
21
23
  esgvoc/api/data_descriptors/directory_date.py,sha256=nGanDZqmFzeK7yZttWwov7OsK1HxhEN1mW2ALcKwtvA,141
22
- esgvoc/api/data_descriptors/experiment.py,sha256=ITNNlY75DzRqEyEv0QS2DaqxtAGdG4mImuNrkryb8mI,1089
24
+ esgvoc/api/data_descriptors/experiment.py,sha256=D9lgeL_NwaK4lKI5yfMBgKX5pdtNU-AXvQmHLubPy2c,1101
23
25
  esgvoc/api/data_descriptors/forcing_index.py,sha256=EYUFK4FnctBVAaOarmTDiuJMnrSYFKQ1aVEYqQpH-bk,140
24
26
  esgvoc/api/data_descriptors/frequency.py,sha256=E_IR3GTUEwtRt43wcroju-e_Uti4dI-swaJk8ldqowE,192
25
27
  esgvoc/api/data_descriptors/further_info_url.py,sha256=9z8_WNjcUm1XTEe7WpBUZmgoQ8EosjkVPw-AP_993cA,142
@@ -27,7 +29,7 @@ esgvoc/api/data_descriptors/grid_label.py,sha256=4bMvUYVJ2cBSu4J9BU8rdjWiKsptUGQ
27
29
  esgvoc/api/data_descriptors/horizontal_label.py,sha256=7yqpkWbtrj1559PNdVYMSup7I9QNjCwlakFoI8aLBjM,855
28
30
  esgvoc/api/data_descriptors/initialisation_index.py,sha256=VjgIHq1j7xoR5VvMW_eFR9l2_UJMhyqCgS3ZNnJH4lY,147
29
31
  esgvoc/api/data_descriptors/institution.py,sha256=dUqyMS_HsLz72dvE4-9ZTIoF3QBXDKASC3OKoFX4S8w,547
30
- esgvoc/api/data_descriptors/known_branded_variable.py,sha256=IXeMgxkCPWssSuNU56O7GU6oOjJ-hju03ZKpDg0gz7Q,834
32
+ esgvoc/api/data_descriptors/known_branded_variable.py,sha256=PsPSWfY5ikzEOYxFIoafdsy0nH_pyKicC0--WIOeATI,3528
31
33
  esgvoc/api/data_descriptors/license.py,sha256=BQK8GcbGYuXHSei_CxXlbUct3SM0G15waJDEc6jyr7o,180
32
34
  esgvoc/api/data_descriptors/member_id.py,sha256=L9Kcbz6mtRZDqSJiIqQwTBoU8A4z8JgI3UTfn2ZiMo8,703
33
35
  esgvoc/api/data_descriptors/mip_era.py,sha256=ubxwqJL8xPgCZu7bmjg-vvphBlG_aqogwE-ewu3lB2Q,176
@@ -39,6 +41,7 @@ esgvoc/api/data_descriptors/product.py,sha256=992roUfIoPfQSKsbqCpIckWjlTBQEPdUz-
39
41
  esgvoc/api/data_descriptors/publication_status.py,sha256=l0NbOclehirlgr6hKSDLmYCHF3-TmtFJS73xJVvh0tU,153
40
42
  esgvoc/api/data_descriptors/realisation_index.py,sha256=4MnYOyPOZ5EsFuAVplXy35E_rUCOGUOcaN60zSuK4gQ,144
41
43
  esgvoc/api/data_descriptors/realm.py,sha256=zFSQPucqj-mtHDJzq0Mym_MrhOBMZzyxdwROS2xEFGI,155
44
+ esgvoc/api/data_descriptors/regex.py,sha256=Tdb6JwpKF7sKwlJR5Vj5cKyUHjO2wvyyIX-QGdwaNyA,133
42
45
  esgvoc/api/data_descriptors/region.py,sha256=ZIn3aZECuiCvDP2fqeXelMMXeylhcOhWhOOEcig5ooI,142
43
46
  esgvoc/api/data_descriptors/resolution.py,sha256=5eYYhgKfqmJXpJtFp9FTwaXWtZg4tuoOQd0VAgyaMEA,189
44
47
  esgvoc/api/data_descriptors/source.py,sha256=lryCpb-lPuu0SzOArXbfhsKMpe8d6C8VAN_D2pOnDtQ,1197
@@ -51,45 +54,53 @@ esgvoc/api/data_descriptors/title.py,sha256=9lqRLAN3MTLYpdZ62MI3oXVFlWzD7rJEUFxe
51
54
  esgvoc/api/data_descriptors/tracking_id.py,sha256=VFUrvLwdfh0sAKWdKqlNvqAn8-iXAp5ktXpgV-SrGHc,150
52
55
  esgvoc/api/data_descriptors/variable.py,sha256=f5Azl8_SCRE_g0RCnJ8T2S0ck0rtg5soXFdhPCanKbQ,1238
53
56
  esgvoc/api/data_descriptors/variant_label.py,sha256=jH1QIGafMKWFZIkx3oBydOz4EpSPVCaG00hbGfeNRFo,152
54
- esgvoc/api/data_descriptors/vertical_label.py,sha256=_1SUkL7aYWEnvUonyEBkSlsLbMOwAftsKV7FCQzWyS4,809
57
+ esgvoc/api/data_descriptors/vertical_label.py,sha256=xwsfu6LLDqE7hUyXWCa-MudlqWRQsNQmSWIqz8o1aeA,805
55
58
  esgvoc/apps/__init__.py,sha256=Kyq36qRjvTWN7gu4_iFaLOjNUYvW0k1xp8bvkgJlQ5w,269
56
- esgvoc/apps/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
59
  esgvoc/apps/drs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
60
  esgvoc/apps/drs/constants.py,sha256=rVWq1QQwAFgISjvl3YzJDLLPNUPXHpqgv66spmjyPMQ,96
59
- esgvoc/apps/drs/generator.py,sha256=rFGuqbfAvYeWC9qQWqgI57Z48XZ3mhIC14XngVMTqJs,21667
61
+ esgvoc/apps/drs/generator.py,sha256=BTXMO_MpeBnvIoMkBFbQaUAc1sCd9qiKR8tpzQ0ng3M,22255
60
62
  esgvoc/apps/drs/report.py,sha256=ZRu5l6T-U-hqY7O3ZwAseYbWZPcJiMhJ2dpFKZJE3Gk,17371
61
- esgvoc/apps/drs/validator.py,sha256=yNijdOPhF9adgZbya5Ugvs13GbL4MvgQepCT38A66vM,13825
62
- esgvoc/apps/jsg/cmip6_template.json,sha256=KJHhr0FSrIVB5kXVt57k_KtvB3uhs9Xz5hoX8ajAZis,1916
63
- esgvoc/apps/jsg/json_schema_generator.py,sha256=2Y8d3fnso_6b7aAO18_Zws4UoyJ2IRhT5kfDl_0ewGM,9274
64
- esgvoc/cli/config.py,sha256=MNrpYzEM9gwqCzPUs-ZzFv6Tg-p0ySMGeBUzB0nXXo0,18714
65
- esgvoc/cli/drs.py,sha256=PvVbLxef34A1IO600AFWOEWb5iLaWrBRHwwgMJ4u-PM,9237
63
+ esgvoc/apps/drs/validator.py,sha256=UJaVBbMGpJnkQ8xLzMvK_HKgk7OjhB-3okQtp1yDAs0,12975
64
+ esgvoc/apps/jsg/json_schema_generator.py,sha256=V5s-G8o9iy_CsNSFUnx8UiID2yL5FLDqdjdcAv7Dy8s,14474
65
+ esgvoc/apps/jsg/templates/template.jinja,sha256=kpSNCc2xygjApK6XwD-1wTPj8DBBXW0vdS5olmrtYAQ,6513
66
+ esgvoc/apps/test_cv/README.md,sha256=hS8CpTXAF7vqeuX2rBWsdjfFJhhM8oLX4Fw_KaX1MAo,6865
67
+ esgvoc/apps/test_cv/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
+ esgvoc/apps/test_cv/cv_tester.py,sha256=Q8J2B5hf_rJ2mGrhXrojEty6an9Zgz_9LbxFgkGnP44,67637
69
+ esgvoc/apps/test_cv/example_usage.py,sha256=_ZAVqpqWNRqHaxOb-GBokzG4hfjgUA_3JlmFtsCefyg,7234
70
+ esgvoc/apps/vr/__init__.py,sha256=1qiZQV1KKI9DQRnmJpmExv9GxokuwP-VlakbUdxRdHY,537
71
+ esgvoc/apps/vr/build_variable_registry.py,sha256=lQRusU5BAIUr9C2B-ROweE5R3RtMSxd4kIentfWmCrA,2573
72
+ esgvoc/apps/vr/example_usage.py,sha256=I4rq5GJWb5MlUXerpJ23ekSp8L6uCyqBTw2zDXkYkLE,2362
73
+ esgvoc/apps/vr/vr_app.py,sha256=NVglaj2tdGOU7YB3nwx46I_VnD8kzWHhwKLoJZ2VXTo,12745
74
+ esgvoc/cli/config.py,sha256=RjmEd5VmB0yXuUPDvcK33zLJ9Wuq_DwrPgjJaL7GbL4,42805
75
+ esgvoc/cli/drs.py,sha256=X89syVrxs82ZIc1YdWRPw_HmafOZH1u-wXRe6N-xBcM,9427
66
76
  esgvoc/cli/find.py,sha256=DxpEvSbQIJ3-XL-pgH5RicBzS3asjG2Cn_fJhjXKSoU,4497
67
77
  esgvoc/cli/get.py,sha256=DmYyYB0Wn8OLq2ZkYb4xIFLQ4jncL6qB3tV2QX5lQBs,5628
68
78
  esgvoc/cli/install.py,sha256=zMssevZDrigrUlw1QHWITGUL1TvsHMZBQdYeNtHgWQA,433
69
- esgvoc/cli/main.py,sha256=jYNGaE-1MzeCJKb5hI_UGc6yMOwNQ0mZ1CzwV-FdlbM,636
79
+ esgvoc/cli/main.py,sha256=95GIXS0mHwgK7VUG4n-mqrlUhbU2dGwuWiDxjh_4ui0,726
70
80
  esgvoc/cli/status.py,sha256=1HSdbM5ABJ9Mri3hIgGeycCm4qKK3sO9OY0lmXecbtk,1450
81
+ esgvoc/cli/test_cv.py,sha256=3MR_QchSWCk_YxOrtb0AkBkPtGXfvU9QtcHdf01c8EQ,9696
71
82
  esgvoc/cli/valid.py,sha256=4ccakK5_QM9PhaBsfGH9VsfglApxDaKBG8oucRYbKqg,6937
72
- esgvoc/core/constants.py,sha256=i03VR29sQmg89DdQpGZ1fzBT-elT3-_S0bTNraGA6T4,432
83
+ esgvoc/core/constants.py,sha256=jKY1uxd10Hps7GIfrY4T3b1sNg_0NZXvFNYgL5giOhM,562
73
84
  esgvoc/core/convert.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
74
- esgvoc/core/data_handler.py,sha256=BmcD_dSvX5fCkUEGAQnadPTeuKA7IvgMmQtesMXKh5g,5004
85
+ esgvoc/core/data_handler.py,sha256=xs2O4Lm6iTW-3WcT6Ea7aq1Hli3OdMYoaOXSDMpNCv0,5013
75
86
  esgvoc/core/exceptions.py,sha256=hs2D1lRWYhFuXDRbApKyJmEZMs8HxTPlSGkDSpkeQiA,538
76
87
  esgvoc/core/logging_handler.py,sha256=kJn14stODJ3hIsCROY0XrHaYiSyy1qYwlcUopSi8pzE,599
77
88
  esgvoc/core/repo_fetcher.py,sha256=3ZySBlmQvStabHqcGZ4G5aWvCLJiNs5RBfBhLXWSm88,9661
78
89
  esgvoc/core/db/__init__.py,sha256=fszGxJfRUa6uuuogrdh8_ExtdyMLZSaaVawpdgXzqKM,113
79
- esgvoc/core/db/connection.py,sha256=AIFo0IWznu0Alk0SK_4bqp6FL5ZqSezNrfc_AlM9Z14,882
80
- esgvoc/core/db/project_ingestion.py,sha256=Qbr2F55c_P6RZzjBLH-Sxp5QhG4fHYcJyvr6FXtNB-I,7427
81
- esgvoc/core/db/universe_ingestion.py,sha256=dNi3GxPE7RbSCxSMaC5WO5R07nZ4Vt6ykpSTBu-KgqU,6433
90
+ esgvoc/core/db/connection.py,sha256=bVX--zrUOfvOr-KGFjkiYbcFw2z_c-JkJyYT-3tueMA,1046
91
+ esgvoc/core/db/project_ingestion.py,sha256=1Vv0etfZsQRdrFy-UZCFQpGxT84Agg8S050nVhKXhTE,8786
92
+ esgvoc/core/db/universe_ingestion.py,sha256=QL-wEk8EUGT3sT2TVTDzfNRD2OTOCDWqRWlZS71pSdw,6535
82
93
  esgvoc/core/db/models/mixins.py,sha256=S4_6iuKf1kYLdUXAgqRKSTXs8H9I--43MKlEq4F-dm4,445
83
94
  esgvoc/core/db/models/project.py,sha256=e3C_DPwwlrX-10BBHhodjRim4uX7yNU7rAMvUNAwBoQ,4384
84
95
  esgvoc/core/db/models/universe.py,sha256=SI-lL-Yrl-t232m0mQJqCEHuuUhM8qNnUOXl3Q4-NSk,4205
85
96
  esgvoc/core/service/__init__.py,sha256=hveqCB4oC6gKDf_L-wZxu9iBz7RiY4x9OeJGP6S5xtU,1534
86
- esgvoc/core/service/data_merger.py,sha256=0XogkIy_ANMOyt57Sfev3bpQFW7HhchoRkNy11QCR3E,3681
97
+ esgvoc/core/service/data_merger.py,sha256=1jEmwvMPKpEfJh7SM-BW3DpuujSt4J-O3eiYipvlD0U,3703
87
98
  esgvoc/core/service/esg_voc.py,sha256=5G0P4_xmQzoI_RG_agpq-yHoYYZx220P27v2nPrpyNs,2420
88
- esgvoc/core/service/state.py,sha256=CGlVbmvW5WB6DKivzqz9i8PsMDKHGuNdIWyohQVdBhQ,11113
99
+ esgvoc/core/service/state.py,sha256=fyKQuC71ezuFLFm4IRUW_IC2uBa3DIsrcr7UcDW9AbQ,11655
89
100
  esgvoc/core/service/configuration/config_manager.py,sha256=K-gU3Kd-eJMunxDKOk4x72CRcyJ50IZXLfqQgyI9zTs,8282
90
- esgvoc/core/service/configuration/setting.py,sha256=WJgo9ZjZJrTGR9WEBhp1d7ab0Yb2Y6XmnO1oImTPc2s,3042
91
- esgvoc-1.0.1.dist-info/METADATA,sha256=FKkE2Cw5w3QVFnkr4Wi6grYHeCS-lUvWXxm9D0GQFsg,2037
92
- esgvoc-1.0.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
93
- esgvoc-1.0.1.dist-info/entry_points.txt,sha256=ZXufSC7Jlx1lb52U6Buv9IitJMcqAAXOerR2V9DaIto,48
94
- esgvoc-1.0.1.dist-info/licenses/LICENSE.txt,sha256=rWJoZt3vach8ZNdLq-Ee5djzCMFnJ1gIfBeJU5RIop4,21782
95
- esgvoc-1.0.1.dist-info/RECORD,,
101
+ esgvoc/core/service/configuration/setting.py,sha256=yzxK9LVHMIRF1pnzcL0zhN77LXA8kKF_QGzw5k-fJxY,9213
102
+ esgvoc-1.1.2.dist-info/METADATA,sha256=n9DD4yNB956Jnf70n-E2NYd045r60XOWSk-qOYhvsK4,2095
103
+ esgvoc-1.1.2.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
104
+ esgvoc-1.1.2.dist-info/entry_points.txt,sha256=ZXufSC7Jlx1lb52U6Buv9IitJMcqAAXOerR2V9DaIto,48
105
+ esgvoc-1.1.2.dist-info/licenses/LICENSE.txt,sha256=rWJoZt3vach8ZNdLq-Ee5djzCMFnJ1gIfBeJU5RIop4,21782
106
+ esgvoc-1.1.2.dist-info/RECORD,,
@@ -1,74 +0,0 @@
1
- {
2
- "$schema": "http://json-schema.org/draft-07/schema#",
3
- "$id": "https://stac-extensions.github.io/cmip6/v1.0.0/schema.json#",
4
- "title": "CMIP6 Extension",
5
- "description": "STAC CMIP6 Extension for STAC Items and STAC Collection Summaries.",
6
- "type": "object",
7
- "required": [
8
- "stac_extensions"
9
- ],
10
- "properties": {
11
- "stac_extensions": {
12
- "type": "array",
13
- "contains": {
14
- "const": "https://stac-extensions.github.io/cmip6/v1.0.0/schema.json"
15
- }
16
- }
17
- },
18
- "oneOf": [
19
- {
20
- "$comment": "This is the schema for STAC Items.",
21
- "type": "object",
22
- "required": [
23
- "type",
24
- "properties"
25
- ],
26
- "properties": {
27
- "type": {
28
- "const": "Feature"
29
- },
30
- "properties": {
31
- "allOf": [
32
- {
33
- "$ref": "#/definitions/require_any"
34
- },
35
- {
36
- "$ref": "#/definitions/fields"
37
- }
38
- ]
39
- }
40
- }
41
- },
42
- {
43
- "$comment": "This is the schema for STAC Collections, or more specifically only Collection Summaries in this case. By default, only checks the existence of the properties, but not the schema of the summaries.",
44
- "type": "object",
45
- "required": [
46
- "type",
47
- "summaries"
48
- ],
49
- "properties": {
50
- "type": {
51
- "const": "Collection"
52
- },
53
- "summaries": {
54
- "$ref": "#/definitions/require_any"
55
- }
56
- }
57
- }
58
- ],
59
- "definitions": {
60
- "require_any": {
61
- "$comment": "Please list all fields here so that we can force the existence of one of them in other parts of the schemas."
62
- },
63
- "fields": {
64
- "$comment": " Don't require fields here, do that above in the corresponding schema.",
65
- "type": "object",
66
- "properties": {
67
- },
68
- "patternProperties": {
69
- "^(?!cmip6:)": {}
70
- },
71
- "additionalProperties": false
72
- }
73
- }
74
- }
File without changes
File without changes