Skip to content

Commit 417a943

Browse files
committed
address review
1 parent 35e350f commit 417a943

File tree

4 files changed

+77
-91
lines changed

4 files changed

+77
-91
lines changed

mergin/merginproject.py

+14-8
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ def __init__(self, directory):
5858

5959
# metadata from JSON are lazy loaded
6060
self._metadata = None
61+
self.is_old_metadata = False
6162

6263
self.setup_logging(directory)
6364

@@ -139,11 +140,10 @@ def project_full_name(self) -> str:
139140
"""Returns fully qualified project name: <workspace>/<name>"""
140141
if self._metadata is None:
141142
self._read_metadata()
142-
return (
143-
self._metadata["name"]
144-
if "/" in self._metadata["name"]
145-
else f"{self._metadata['namespace']}/{self._metadata['name']}"
146-
)
143+
if self.is_old_metadata:
144+
return self._metadata["name"]
145+
else:
146+
return f"{self._metadata['namespace']}/{self._metadata['name']}"
147147

148148
def project_name(self) -> str:
149149
"""Returns only project name, without its workspace name"""
@@ -160,14 +160,18 @@ def workspace_name(self) -> str:
160160
def project_id(self) -> str:
161161
"""Returns ID of the project (UUID using 8-4-4-4-12 formatting without braces)
162162
163-
Raises ClientError if project id is not present in the project metadata.
163+
Raises ClientError if project id is not present in the project metadata. This should
164+
only happen with projects downloaded with old client, before February 2023,
165+
see https://github.com/MerginMaps/mergin-py-client/pull/154
164166
"""
165167
if self._metadata is None:
166168
self._read_metadata()
167169

168170
# "id" or "project_id" may not exist in projects downloaded with old client version
169171
if "id" not in self._metadata and "project_id" not in self._metadata:
170-
raise ClientError("Missed project id metadata. Please re-download your project.")
172+
raise ClientError(
173+
"The project directory has been created with an old version of the Mergin Maps client. Please delete the project directory and re-download the project."
174+
)
171175

172176
return self._metadata["project_id"] if "/" in self._metadata["name"] else self._metadata["id"]
173177

@@ -181,7 +185,7 @@ def version(self) -> str:
181185
"""Returns project version (e.g. "v123")"""
182186
if self._metadata is None:
183187
self._read_metadata()
184-
return self._metadata["version"] if self._metadata["version"] else "v0"
188+
return self._metadata["version"]
185189

186190
def files(self) -> list:
187191
"""Returns project's list of files (each file being a dictionary)"""
@@ -208,6 +212,8 @@ def _read_metadata(self):
208212
with open(self.fpath_meta("mergin.json"), "r") as file:
209213
self._metadata = json.load(file)
210214

215+
self.is_old_metadata = "/" in self._metadata["name"]
216+
211217
def update_metadata(self, data: dict):
212218
"""Writes project metadata and updates cached metadata."""
213219
self._metadata = data

mergin/test/test_client.py

+16-6
Original file line numberDiff line numberDiff line change
@@ -2011,20 +2011,30 @@ def test_project_metadata(mc):
20112011
project_dir = os.path.join(TMP_DIR, test_project)
20122012

20132013
cleanup(mc, project, [project_dir])
2014+
20142015
# prepare local project
20152016
shutil.copytree(TEST_DATA_DIR, project_dir)
20162017

2017-
# create remote project
2018-
mc.create_project_and_push(test_project, directory=project_dir)
2019-
20202018
# copy metadata in old format
2019+
os.makedirs(os.path.join(project_dir, ".mergin"), exist_ok=True)
20212020
project_metadata = os.path.join(project_dir, ".mergin", "mergin.json")
2022-
old_metadata = os.path.join(project_dir, "old_metadata.json")
2023-
shutil.copyfile(old_metadata, project_metadata)
2021+
metadata_file = os.path.join(project_dir, "old_metadata.json")
2022+
shutil.copyfile(metadata_file, project_metadata)
2023+
2024+
# verify we have correct metadata
2025+
mp = MerginProject(project_dir)
2026+
assert mp.project_full_name() == f"{API_USER}/{test_project}"
2027+
assert mp.project_name() == test_project
2028+
assert mp.workspace_name() == API_USER
2029+
assert mp.version() == "v0"
2030+
2031+
# copy metadata in new format
2032+
metadata_file = os.path.join(project_dir, "new_metadata.json")
2033+
shutil.copyfile(metadata_file, project_metadata)
20242034

20252035
# verify we have correct metadata
20262036
mp = MerginProject(project_dir)
20272037
assert mp.project_full_name() == f"{API_USER}/{test_project}"
20282038
assert mp.project_name() == test_project
20292039
assert mp.workspace_name() == API_USER
2030-
assert mp.version() == "v1"
2040+
assert mp.version() == "v0"
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"access": {
3+
"owners": [
4+
2
5+
],
6+
"ownersnames": [
7+
"test_plugin"
8+
],
9+
"public": false,
10+
"readers": [
11+
2
12+
],
13+
"readersnames": [
14+
"test_plugin"
15+
],
16+
"writers": [
17+
2
18+
],
19+
"writersnames": [
20+
"test_plugin"
21+
]
22+
},
23+
"created": "2023-10-16T09:17:27Z",
24+
"creator": 2,
25+
"disk_usage": 0,
26+
"files": [],
27+
"id": "a6f9d38c-e30d-49f2-bfc5-76495afdbf27",
28+
"name": "test_project_metadata",
29+
"namespace": "test_plugin",
30+
"permissions": {
31+
"delete": true,
32+
"update": true,
33+
"upload": true
34+
},
35+
"removed_at": null,
36+
"removed_by": null,
37+
"role": "owner",
38+
"tags": [],
39+
"updated": "2023-10-16T09:17:27.345127",
40+
"uploads": [],
41+
"version": "v0",
42+
"workspace_id": 18
43+
}
+4-77
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,6 @@
11
{
22
"name": "test_plugin/test_project_metadata",
3-
"version": "v1",
4-
"project_id": "46e0a252-eb74-456c-9a64-b21d3fba59d6",
5-
"files": [
6-
{
7-
"checksum": "b3426f7d02643c1e0b24d738eee7a54f1c74eca4",
8-
"mtime": "2023-10-12T06:38:49.314490Z",
9-
"path": "two_tables_drop.gpkg",
10-
"size": 118784
11-
},
12-
{
13-
"checksum": "67e64b55b36e945df8c97afc46ff64acfe46b32a",
14-
"mtime": "2023-10-12T06:38:49.314496Z",
15-
"path": "base.gpkg",
16-
"size": 98304
17-
},
18-
{
19-
"checksum": "38662e5645cd0a80009d43fd0f32db79dffabafa",
20-
"mtime": "2023-10-12T06:38:49.314497Z",
21-
"path": "test.txt",
22-
"size": 13
23-
},
24-
{
25-
"checksum": "4973d10c6350604fe5347a11c7d2c59fb06a36e1",
26-
"mtime": "2023-10-12T06:38:49.314497Z",
27-
"path": "inserted_1_A_mod.gpkg",
28-
"size": 98304
29-
},
30-
{
31-
"checksum": "a191cd1dc405642b70f3525f638e1cf8d1052828",
32-
"mtime": "2023-10-12T06:38:49.314498Z",
33-
"path": "two_tables.gpkg",
34-
"size": 118784
35-
},
36-
{
37-
"checksum": "38662e5645cd0a80009d43fd0f32db79dffabafa",
38-
"mtime": "2023-10-12T06:38:49.314499Z",
39-
"path": "test3.txt",
40-
"size": 13
41-
},
42-
{
43-
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
44-
"mtime": "2023-10-12T06:38:49.314499Z",
45-
"path": "test.qgs",
46-
"size": 0
47-
},
48-
{
49-
"checksum": "473501ebd51a3ade52f07d8e6c3887bcf2d7803f",
50-
"mtime": "2023-10-12T06:38:49.314500Z",
51-
"path": "two_tables_1_A.gpkg",
52-
"size": 118784
53-
},
54-
{
55-
"checksum": "fa2a379a0626b9505ba61f85d207ad66e9548f83",
56-
"mtime": "2023-10-12T06:38:49.314501Z",
57-
"path": "inserted_1_A.gpkg",
58-
"size": 98304
59-
},
60-
{
61-
"checksum": "763598af125e24c25db319d688d1b7275aae6d58",
62-
"mtime": "2023-10-12T06:38:49.314501Z",
63-
"path": "inserted_1_B.gpkg",
64-
"size": 98304
65-
},
66-
{
67-
"checksum": "aca1d870a2aca068ce360f51c2eb1fc0d08a23cc",
68-
"mtime": "2023-10-12T06:38:49.314502Z",
69-
"path": "test_dir/modified_1_geom.gpkg",
70-
"size": 98304
71-
},
72-
{
73-
"checksum": "dc0c460d742019ca818f1d74c2bc8fbc28d3ad68",
74-
"mtime": "2023-10-12T06:38:49.314502Z",
75-
"path": "test_dir/test2.txt",
76-
"size": 14
77-
}
78-
]
79-
}
3+
"version": "v0",
4+
"project_id": "effeca08-ef22-4fc1-b620-5261c6a081eb",
5+
"files": []
6+
}

0 commit comments

Comments
 (0)