esgvoc 1.0.1__py3-none-any.whl → 1.1.1__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.
- esgvoc/__init__.py +1 -1
- esgvoc/api/__init__.py +0 -6
- esgvoc/api/data_descriptors/__init__.py +6 -0
- esgvoc/api/data_descriptors/archive.py +5 -0
- esgvoc/api/data_descriptors/citation_url.py +5 -0
- esgvoc/api/data_descriptors/experiment.py +2 -2
- esgvoc/api/data_descriptors/known_branded_variable.py +58 -5
- esgvoc/api/data_descriptors/regex.py +5 -0
- esgvoc/api/data_descriptors/vertical_label.py +2 -2
- esgvoc/api/project_specs.py +48 -130
- esgvoc/api/projects.py +104 -63
- esgvoc/apps/drs/generator.py +47 -42
- esgvoc/apps/drs/validator.py +22 -38
- esgvoc/apps/jsg/json_schema_generator.py +252 -136
- esgvoc/apps/jsg/templates/template.jinja +249 -0
- esgvoc/apps/test_cv/README.md +214 -0
- esgvoc/apps/test_cv/cv_tester.py +1368 -0
- esgvoc/apps/test_cv/example_usage.py +216 -0
- esgvoc/apps/vr/__init__.py +12 -0
- esgvoc/apps/vr/build_variable_registry.py +71 -0
- esgvoc/apps/vr/example_usage.py +60 -0
- esgvoc/apps/vr/vr_app.py +333 -0
- esgvoc/cli/config.py +671 -86
- esgvoc/cli/drs.py +39 -21
- esgvoc/cli/main.py +2 -0
- esgvoc/cli/test_cv.py +257 -0
- esgvoc/core/constants.py +10 -7
- esgvoc/core/data_handler.py +24 -22
- esgvoc/core/db/connection.py +7 -0
- esgvoc/core/db/project_ingestion.py +34 -9
- esgvoc/core/db/universe_ingestion.py +1 -2
- esgvoc/core/service/configuration/setting.py +192 -21
- esgvoc/core/service/data_merger.py +1 -1
- esgvoc/core/service/state.py +18 -2
- {esgvoc-1.0.1.dist-info → esgvoc-1.1.1.dist-info}/METADATA +2 -1
- {esgvoc-1.0.1.dist-info → esgvoc-1.1.1.dist-info}/RECORD +40 -29
- esgvoc/apps/jsg/cmip6_template.json +0 -74
- /esgvoc/apps/{py.typed → test_cv/__init__.py} +0 -0
- {esgvoc-1.0.1.dist-info → esgvoc-1.1.1.dist-info}/WHEEL +0 -0
- {esgvoc-1.0.1.dist-info → esgvoc-1.1.1.dist-info}/entry_points.txt +0 -0
- {esgvoc-1.0.1.dist-info → esgvoc-1.1.1.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
|
-
# 🔹
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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()
|
esgvoc/core/service/state.py
CHANGED
|
@@ -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,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: esgvoc
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.1.1
|
|
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
|
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
esgvoc/__init__.py,sha256=
|
|
2
|
-
esgvoc/api/__init__.py,sha256=
|
|
3
|
-
esgvoc/api/project_specs.py,sha256=
|
|
4
|
-
esgvoc/api/projects.py,sha256=
|
|
1
|
+
esgvoc/__init__.py,sha256=xC83Z2-Xjyr_rPnfy4Hh5cwrX2ZaweIaNfAM2Guu27o,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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
62
|
-
esgvoc/apps/jsg/
|
|
63
|
-
esgvoc/apps/jsg/
|
|
64
|
-
esgvoc/
|
|
65
|
-
esgvoc/
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
80
|
-
esgvoc/core/db/project_ingestion.py,sha256=
|
|
81
|
-
esgvoc/core/db/universe_ingestion.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
91
|
-
esgvoc-1.
|
|
92
|
-
esgvoc-1.
|
|
93
|
-
esgvoc-1.
|
|
94
|
-
esgvoc-1.
|
|
95
|
-
esgvoc-1.
|
|
101
|
+
esgvoc/core/service/configuration/setting.py,sha256=yzxK9LVHMIRF1pnzcL0zhN77LXA8kKF_QGzw5k-fJxY,9213
|
|
102
|
+
esgvoc-1.1.1.dist-info/METADATA,sha256=1gq9zs-f2QusXGKuaVB7LRlYok5DAMK7K-p64jLpHKc,2066
|
|
103
|
+
esgvoc-1.1.1.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
|
|
104
|
+
esgvoc-1.1.1.dist-info/entry_points.txt,sha256=ZXufSC7Jlx1lb52U6Buv9IitJMcqAAXOerR2V9DaIto,48
|
|
105
|
+
esgvoc-1.1.1.dist-info/licenses/LICENSE.txt,sha256=rWJoZt3vach8ZNdLq-Ee5djzCMFnJ1gIfBeJU5RIop4,21782
|
|
106
|
+
esgvoc-1.1.1.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
|
|
File without changes
|
|
File without changes
|