Skip to content

Commit 30e32df

Browse files
authored
Merge pull request #285 from MerginMaps/integrate-py-client-v2-project-version
add support for v2 project response from project versions
2 parents c3d10f9 + 0f898f8 commit 30e32df

File tree

4 files changed

+118
-4
lines changed

4 files changed

+118
-4
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,4 @@ htmlcov
1313
deps
1414
venv
1515
.vscode/settings.json
16+
debug.py

mergin/merginproject.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,11 @@ def project_full_name(self) -> str:
141141
"""Returns fully qualified project name: <workspace>/<name>"""
142142
self._read_metadata()
143143
if self.is_old_metadata:
144-
return self._metadata["name"]
145-
else:
146-
return f"{self._metadata['namespace']}/{self._metadata['name']}"
144+
return self._metadata.get("name")
145+
workspace = self._metadata.get("workspace", {})
146+
if workspace:
147+
return f"{workspace.get('name')}/{self._metadata['name']}"
148+
return f"{self._metadata.get('namespace')}/{self._metadata['name']}"
147149

148150
def project_name(self) -> str:
149151
"""Returns only project name, without its workspace name"""
@@ -193,7 +195,11 @@ def workspace_id(self) -> int:
193195
"The project directory has been created with an old version of the Mergin Maps client. "
194196
"Please delete the project directory and re-download the project."
195197
)
196-
return self._metadata["workspace_id"]
198+
199+
workspace = self._metadata.get("workspace", {})
200+
if workspace:
201+
return workspace.get("id")
202+
return self._metadata.get("workspace_id")
197203

198204
def version(self) -> str:
199205
"""Returns project version (e.g. "v123")"""
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"created_at": "2025-12-04T15:51:55Z",
3+
"files": [
4+
{
5+
"checksum": "22afdbbf504087ea0ff7f1a2aeca2e265cc01bb5",
6+
"mtime": "2025-12-04T15:52:09Z",
7+
"path": "qgs_project.qgs",
8+
"size": 72024
9+
},
10+
{
11+
"checksum": "7f46f5d1a160a71aff5450f55853b0d552958f58",
12+
"mtime": "2025-12-04T15:52:09Z",
13+
"path": "photo.jpg",
14+
"size": 5646973
15+
},
16+
{
17+
"checksum": "3a8c54469e4fe498faffe66f4671fb9b0e6c0221",
18+
"mtime": "2025-12-04T15:54:21Z",
19+
"path": "data.gpkg",
20+
"size": 126976
21+
}
22+
],
23+
"id": "e5cd45e5-8250-422a-ac16-e8c771689fd8",
24+
"name": "diff_8dfb",
25+
"public": false,
26+
"role": "owner",
27+
"size": 5845973,
28+
"updated_at": "2025-12-04T15:54:21Z",
29+
"version": "v101",
30+
"workspace": {
31+
"id": 1,
32+
"name": "my-workspace"
33+
}
34+
}

mergin/test/test_mergin_project.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import os
2+
import shutil
3+
import json
4+
import tempfile
5+
import pytest
6+
from mergin.merginproject import MerginProject
7+
8+
TEST_DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "test_data")
9+
10+
11+
def test_project_metadata():
12+
13+
with tempfile.TemporaryDirectory() as tmp_dir:
14+
test_project = "test_project_metadata"
15+
api_user = "test_user"
16+
project_dir = os.path.join(tmp_dir, test_project)
17+
18+
# prepare local project
19+
shutil.copytree(TEST_DATA_DIR, project_dir)
20+
# copy metadata in old format
21+
os.makedirs(os.path.join(project_dir, ".mergin"), exist_ok=True)
22+
metadata_file = os.path.join(project_dir, "old_metadata.json")
23+
24+
# rewrite metadata namespace
25+
with open(metadata_file, "r") as f:
26+
metadata = json.load(f)
27+
28+
project_metadata_file = os.path.join(project_dir, ".mergin", "mergin.json")
29+
with open(project_metadata_file, "w") as f:
30+
json.dump(metadata, f, indent=2)
31+
32+
# verify we have correct metadata
33+
mp = MerginProject(project_dir)
34+
assert mp.project_full_name() == metadata.get("name")
35+
project_name = metadata.get("name").split("/")[1]
36+
workspace_name = metadata.get("name").split("/")[0]
37+
assert mp.project_name() == project_name
38+
assert mp.workspace_name() == workspace_name
39+
assert mp.version() == metadata.get("version")
40+
41+
# copy metadata in new format
42+
metadata_file = os.path.join(project_dir, "new_metadata.json")
43+
with open(metadata_file, "r") as f:
44+
metadata = json.load(f)
45+
metadata["namespace"] = api_user
46+
with open(project_metadata_file, "w") as f:
47+
json.dump(metadata, f, indent=2)
48+
49+
# verify we have correct metadata
50+
mp = MerginProject(project_dir)
51+
project_name = metadata.get("name")
52+
workspace_name = metadata.get("namespace")
53+
assert mp.project_full_name() == f"{workspace_name}/{project_name}"
54+
assert mp.project_name() == project_name
55+
assert mp.workspace_name() == workspace_name
56+
assert mp.version() == metadata.get("version")
57+
58+
# copy metadata in new format (v2)
59+
metadata_file = os.path.join(project_dir, "v2_metadata.json")
60+
with open(metadata_file, "r") as f:
61+
metadata = json.load(f)
62+
with open(project_metadata_file, "w") as f:
63+
json.dump(metadata, f, indent=2)
64+
65+
# verify we have correct metadata
66+
mp = MerginProject(project_dir)
67+
project_name = metadata.get("name")
68+
workspace_name = metadata.get("workspace").get("name")
69+
assert mp.project_full_name() == f"{workspace_name}/{project_name}"
70+
assert mp.project_name() == project_name
71+
assert mp.workspace_name() == workspace_name
72+
assert mp.version() == metadata.get("version")
73+
assert mp.files() == metadata.get("files")

0 commit comments

Comments
 (0)