Skip to content

Commit 443b14e

Browse files
committed
Merge remote-tracking branch 'origin/master' into dependabot/github_actions/dot-github/workflows/actions/download-artifact-4.1.7
2 parents 32e8b30 + 8e05f38 commit 443b14e

File tree

4 files changed

+53
-30
lines changed

4 files changed

+53
-30
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ Commands:
7171
download Download last version of Mergin Maps project
7272
download-file Download project file at specified version.
7373
list-projects List projects on the server
74+
list-files List files in a project
7475
login Login to the service and see how to set the token...
7576
pull Fetch changes from Mergin Maps repository
7677
push Upload local changes into Mergin Maps repository

mergin/cli.py

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
pip puts these tools).
88
"""
99

10-
from datetime import datetime, timezone
10+
from datetime import datetime, timezone, date
1111
import click
1212
import json
1313
import os
@@ -143,7 +143,7 @@ def _print_unhandled_exception():
143143

144144

145145
@click.group(
146-
epilog=f"Copyright (C) 2019-2021 Lutra Consulting\n\n(mergin-py-client v{__version__} / pygeodiff v{GeoDiff().version()})"
146+
epilog=f"Copyright (C) 2019-{date.today().year} Lutra Consulting\n\n(mergin-py-client v{__version__} / pygeodiff v{GeoDiff().version()})"
147147
)
148148
@click.option(
149149
"--url",
@@ -481,9 +481,9 @@ def show_version(ctx, version):
481481
return
482482
directory = os.getcwd()
483483
mp = MerginProject(directory)
484-
project_path = mp.project_full_name()
484+
project_id = mp.project_id()
485485
# TODO: handle exception when version not found
486-
version_info_dict = mc.project_version_info(project_path, version)[0]
486+
version_info_dict = mc.project_version_info(project_id, version)
487487
click.secho("Project: " + version_info_dict["namespace"] + "/" + version_info_dict["project_name"])
488488
click.secho("Version: " + version_info_dict["name"] + " by " + version_info_dict["author"])
489489
click.secho("Time: " + version_info_dict["created"])
@@ -661,6 +661,27 @@ def reset(ctx):
661661
except Exception as e:
662662
_print_unhandled_exception()
663663

664+
@cli.command()
665+
@click.argument("project")
666+
@click.option("--json", is_flag=True, default=False, help="Output in JSON format")
667+
@click.pass_context
668+
def list_files(ctx, project, json):
669+
"""List files in a project."""
670+
671+
mc = ctx.obj["client"]
672+
if mc is None:
673+
return
674+
675+
project_info = mc.project_info(project)
676+
project_files = project_info["files"]
677+
678+
if json:
679+
print(project_files)
680+
else:
681+
click.echo("Fetched {} files .".format(len(project_files)))
682+
for file in project_files:
683+
click.echo(" {:40}\t{:6.1f} MB".format(file['path'], file["size"] / (1024 * 1024)))
684+
664685

665686
if __name__ == "__main__":
666687
cli()

mergin/client.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -984,13 +984,10 @@ def project_status(self, directory):
984984

985985
return pull_changes, push_changes, push_changes_summary
986986

987-
def project_version_info(self, project_path, version):
987+
def project_version_info(self, project_id, version):
988988
"""Returns JSON with detailed information about a single project version"""
989-
params = {"version_id": version}
990-
params = {"page": version, "per_page": 1, "descending": False}
991-
resp = self.get(f"/v1/project/versions/paginated/{project_path}", params)
992-
j = json.load(resp)
993-
return j["versions"]
989+
resp = self.get(f"/v1/project/version/{project_id}/{version}")
990+
return json.load(resp)
994991

995992
def project_file_history_info(self, project_path, file_path):
996993
"""Returns JSON with full history of a single file within a project"""

mergin/test/test_client.py

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,9 @@ def test_create_remote_project_from_local(mc):
225225
assert project_info["namespace"] == API_USER
226226
assert project_info["id"] == source_mp.project_id()
227227

228-
versions = mc.project_versions(project)
229-
assert len(versions) == 1
230-
assert versions[0]["name"] == "v1"
231-
assert any(f for f in versions[0]["changes"]["added"] if f["path"] == "test.qgs")
228+
version = mc.project_version_info(project_info.get("id"), "v1")
229+
assert version["name"] == "v1"
230+
assert any(f for f in version["changes"]["added"] if f["path"] == "test.qgs")
232231

233232
# check we can fully download remote project
234233
mc.download_project(project, download_dir)
@@ -306,13 +305,9 @@ def test_push_pull_changes(mc):
306305
assert generate_checksum(os.path.join(project_dir, f_updated)) == f_remote_checksum
307306
assert project_info["id"] == mp.project_id()
308307
assert len(project_info["files"]) == len(mp.inspect_files())
309-
project_versions = mc.project_versions(project)
310-
assert len(project_versions) == 2
311-
f_change = next(
312-
(f for f in project_versions[-1]["changes"]["updated"] if f["path"] == f_updated),
313-
None,
314-
)
315-
assert "origin_checksum" not in f_change # internal client info
308+
project_version = mc.project_version_info(project_info["id"], "v2")
309+
updated_file = [f for f in project_version["changes"]["updated"] if f["path"] == f_updated][0]
310+
assert "origin_checksum" not in updated_file # internal client info
316311

317312
# test parallel changes
318313
with open(os.path.join(project_dir_2, f_updated), "w") as f:
@@ -2019,7 +2014,7 @@ def test_report(mc):
20192014
]
20202015
)
20212016
assert headers in content
2022-
assert "base.gpkg,simple,test_plugin" in content
2017+
assert f"base.gpkg,simple,{API_USER}" in content
20232018
assert "v3,update,,,2" in content
20242019
# files not edited are not in reports
20252020
assert "inserted_1_A.gpkg" not in content
@@ -2164,7 +2159,7 @@ def test_version_info(mc):
21642159
project = API_USER + "/" + test_project
21652160
project_dir = os.path.join(TMP_DIR, test_project) # primary project dir
21662161
test_gpkg = "test.gpkg"
2167-
file_path = os.path.join(project_dir, "test.gpkg")
2162+
file_path = os.path.join(project_dir, test_gpkg)
21682163

21692164
cleanup(mc, project, [project_dir])
21702165

@@ -2177,8 +2172,8 @@ def test_version_info(mc):
21772172

21782173
shutil.copy(os.path.join(TEST_DATA_DIR, "inserted_1_A_mod.gpkg"), file_path)
21792174
mc.push_project(project_dir)
2180-
2181-
info = mc.project_version_info(project, 2)[0]
2175+
project_info = mc.project_info(project)
2176+
info = mc.project_version_info(project_info.get("id"), "v2")
21822177
assert info["namespace"] == API_USER
21832178
assert info["project_name"] == test_project
21842179
assert info["name"] == "v2"
@@ -2345,9 +2340,14 @@ def test_project_metadata(mc):
23452340

23462341
# copy metadata in old format
23472342
os.makedirs(os.path.join(project_dir, ".mergin"), exist_ok=True)
2348-
project_metadata = os.path.join(project_dir, ".mergin", "mergin.json")
23492343
metadata_file = os.path.join(project_dir, "old_metadata.json")
2350-
shutil.copyfile(metadata_file, project_metadata)
2344+
# rewrite metadata nemespace to prevent failing tests with other user than test_plugin
2345+
with open(metadata_file, "r") as f:
2346+
metadata = json.load(f)
2347+
metadata["name"] = f"{API_USER}/{test_project}"
2348+
project_metadata_file = os.path.join(project_dir, ".mergin", "mergin.json")
2349+
with open(project_metadata_file, "w") as f:
2350+
json.dump(metadata, f, indent=2)
23512351

23522352
# verify we have correct metadata
23532353
mp = MerginProject(project_dir)
@@ -2358,7 +2358,12 @@ def test_project_metadata(mc):
23582358

23592359
# copy metadata in new format
23602360
metadata_file = os.path.join(project_dir, "new_metadata.json")
2361-
shutil.copyfile(metadata_file, project_metadata)
2361+
# rewrite metadata nemespace to prevent failing tests with other user than test_plugin
2362+
with open(metadata_file, "r") as f:
2363+
metadata = json.load(f)
2364+
metadata["namespace"] = API_USER
2365+
with open(project_metadata_file, "w") as f:
2366+
json.dump(metadata, f, indent=2)
23622367

23632368
# verify we have correct metadata
23642369
mp = MerginProject(project_dir)
@@ -2634,15 +2639,14 @@ def test_editor_push(mc: MerginClient, mc2: MerginClient):
26342639

26352640
def test_error_push_already_named_project(mc: MerginClient):
26362641
test_project = "test_push_already_existing"
2637-
project = API_USER + "/" + test_project
26382642
project_dir = os.path.join(TMP_DIR, test_project)
26392643

26402644
with pytest.raises(ClientError) as e:
26412645
mc.create_project_and_push(test_project, project_dir)
26422646
assert e.value.detail == "Project with the same name already exists"
26432647
assert e.value.http_error == 409
26442648
assert e.value.http_method == "POST"
2645-
assert e.value.url == f"{mc.url}v1/project/test_plugin"
2649+
assert e.value.url == f"{mc.url}v1/project/{API_USER}"
26462650

26472651

26482652
def test_error_projects_limit_hit(mcStorage: MerginClient):

0 commit comments

Comments
 (0)