|
14 | 14 | import ssl |
15 | 15 | from enum import Enum, auto |
16 | 16 | import re |
| 17 | +import warnings |
17 | 18 |
|
18 | 19 | from .common import ClientError, LoginError, InvalidProject |
19 | 20 | from .merginproject import MerginProject |
@@ -434,44 +435,94 @@ def create_project(self, project_name, is_public=False, namespace=None): |
434 | 435 | Create new project repository in user namespace on Mergin Maps server. |
435 | 436 | Optionally initialized from given local directory. |
436 | 437 |
|
437 | | - :param project_name: Project name |
| 438 | + :param project_name: Project's full name (<namespace>/<name>) |
438 | 439 | :type project_name: String |
439 | 440 |
|
440 | 441 | :param is_public: Flag for public/private project, defaults to False |
441 | 442 | :type is_public: Boolean |
442 | 443 |
|
443 | | - :param namespace: Optional namespace for a new project. If empty username is used. |
| 444 | + :param namespace: Deprecated. project_name should be full project name. Optional namespace for a new project. If empty username is used. |
444 | 445 | :type namespace: String |
445 | 446 | """ |
446 | 447 | if not self._user_info: |
447 | 448 | raise Exception("Authentication required") |
448 | 449 |
|
| 450 | + if namespace and "/" not in project_name: |
| 451 | + warnings.warn( |
| 452 | + "The usage of `namespace` parameter in `create_project()` is deprecated." |
| 453 | + "Specify `project_name` as full name (<namespace>/<name>) instead.", |
| 454 | + category=DeprecationWarning, |
| 455 | + ) |
| 456 | + |
| 457 | + if "/" in project_name: |
| 458 | + if namespace: |
| 459 | + warnings.warn( |
| 460 | + "Parameter `namespace` specified with full project name (<namespace>/<name>)." |
| 461 | + "The parameter will be ignored." |
| 462 | + ) |
| 463 | + |
| 464 | + namespace, project_name = project_name.split("/") |
| 465 | + |
| 466 | + elif namespace is None: |
| 467 | + warnings.warn( |
| 468 | + "The use of only project name in `create_project()` is deprecated." |
| 469 | + "The `project_name` should be full name (<namespace>/<name>).", |
| 470 | + category=DeprecationWarning, |
| 471 | + ) |
| 472 | + |
449 | 473 | params = {"name": project_name, "public": is_public} |
450 | 474 | if namespace is None: |
451 | 475 | namespace = self.username() |
452 | 476 | try: |
453 | | - self.post("/v1/project/%s" % namespace, params, {"Content-Type": "application/json"}) |
| 477 | + self.post(f"/v1/project/{namespace}", params, {"Content-Type": "application/json"}) |
454 | 478 | except Exception as e: |
455 | 479 | detail = f"Namespace: {namespace}, project name: {project_name}" |
456 | 480 | raise ClientError(str(e), detail) |
457 | 481 |
|
458 | 482 | def create_project_and_push(self, project_name, directory, is_public=False, namespace=None): |
459 | 483 | """ |
460 | 484 | Convenience method to create project and push the initial version right after that. |
| 485 | +
|
| 486 | + :param project_name: Project's full name (<namespace>/<name>) |
| 487 | + :type project_name: String |
| 488 | +
|
| 489 | + :param namespace: Deprecated. project_name should be full project name. Optional namespace for a new project. If empty username is used. |
| 490 | + :type namespace: String |
461 | 491 | """ |
462 | 492 | if os.path.exists(os.path.join(directory, ".mergin")): |
463 | 493 | raise ClientError("Directory is already assigned to a Mergin Maps project (contains .mergin sub-dir)") |
464 | 494 |
|
465 | | - if namespace is None: |
| 495 | + if namespace and "/" not in project_name: |
| 496 | + warnings.warn( |
| 497 | + "The usage of `namespace` parameter in `create_project_and_push()` is deprecated." |
| 498 | + "Specify `project_name` as full name (<namespace>/<name>) instead.", |
| 499 | + category=DeprecationWarning, |
| 500 | + ) |
| 501 | + project_name = f"{namespace}/{project_name}" |
| 502 | + |
| 503 | + if "/" in project_name: |
| 504 | + if namespace: |
| 505 | + warnings.warn( |
| 506 | + "Parameter `namespace` specified with full project name (<namespace>/<name>)." |
| 507 | + "The parameter will be ignored." |
| 508 | + ) |
| 509 | + |
| 510 | + elif namespace is None: |
| 511 | + warnings.warn( |
| 512 | + "The use of only project name in `create_project()` is deprecated." |
| 513 | + "The `project_name` should be full name (<namespace>/<name>).", |
| 514 | + category=DeprecationWarning, |
| 515 | + ) |
466 | 516 | namespace = self.username() |
467 | | - self.create_project(project_name, is_public, namespace) |
| 517 | + project_name = f"{namespace}/{project_name}" |
| 518 | + |
| 519 | + self.create_project(project_name, is_public) |
468 | 520 | if directory: |
469 | | - full_project_name = "{}/{}".format(namespace, project_name) |
470 | | - project_info = self.project_info(full_project_name) |
| 521 | + project_info = self.project_info(project_name) |
471 | 522 | MerginProject.write_metadata( |
472 | 523 | directory, |
473 | 524 | { |
474 | | - "name": full_project_name, |
| 525 | + "name": project_name, |
475 | 526 | "version": "v0", |
476 | 527 | "files": [], |
477 | 528 | "project_id": project_info["id"], |
@@ -816,20 +867,43 @@ def clone_project(self, source_project_path, cloned_project_name, cloned_project |
816 | 867 | Clone project on server. |
817 | 868 | :param source_project_path: Project's full name (<namespace>/<name>) |
818 | 869 | :type source_project_path: String |
819 | | - :param cloned_project_name: Cloned project's name |
| 870 | + :param cloned_project_name: Cloned project's full name (<namespace>/<name>) |
820 | 871 | :type cloned_project_name: String |
821 | | - :param cloned_project_namespace: Cloned project's namespace, username is used if not defined |
| 872 | + :param cloned_project_namespace: Deprecated. cloned_project_name should be full project name. Cloned project's namespace, username is used if not defined |
822 | 873 | :type cloned_project_namespace: String |
823 | 874 |
|
824 | 875 | """ |
825 | | - path = "/v1/project/clone/%s" % source_project_path |
| 876 | + |
| 877 | + if cloned_project_namespace and "/" not in cloned_project_name: |
| 878 | + warnings.warn( |
| 879 | + "The usage of `cloned_project_namespace` parameter in `clone_project()` is deprecated." |
| 880 | + "Specify `cloned_project_name` as full name (<namespace>/<name>) instead.", |
| 881 | + category=DeprecationWarning, |
| 882 | + ) |
| 883 | + |
| 884 | + if "/" in cloned_project_name: |
| 885 | + if cloned_project_namespace: |
| 886 | + warnings.warn( |
| 887 | + "Parameter `cloned_project_namespace` specified with full cloned project name (<namespace>/<name>)." |
| 888 | + "The parameter will be ignored." |
| 889 | + ) |
| 890 | + |
| 891 | + cloned_project_namespace, cloned_project_name = cloned_project_name.split("/") |
| 892 | + |
| 893 | + elif cloned_project_namespace is None: |
| 894 | + warnings.warn( |
| 895 | + "The use of only project name as `cloned_project_name` in `clone_project()` is deprecated." |
| 896 | + "The `cloned_project_name` should be full name (<namespace>/<name>).", |
| 897 | + category=DeprecationWarning, |
| 898 | + ) |
| 899 | + |
| 900 | + path = f"/v1/project/clone/{source_project_path}" |
826 | 901 | url = urllib.parse.urljoin(self.url, urllib.parse.quote(path)) |
827 | 902 | json_headers = {"Content-Type": "application/json", "Accept": "application/json"} |
828 | 903 | data = { |
829 | 904 | "namespace": cloned_project_namespace if cloned_project_namespace else self.username(), |
830 | 905 | "project": cloned_project_name, |
831 | 906 | } |
832 | | - |
833 | 907 | request = urllib.request.Request(url, data=json.dumps(data).encode(), headers=json_headers, method="POST") |
834 | 908 | self._do_request(request) |
835 | 909 |
|
|
0 commit comments