kleinkram 0.52.0.dev20251013121344__tar.gz → 0.52.0.dev20251015122123__tar.gz

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 kleinkram might be problematic. Click here for more details.

Files changed (57) hide show
  1. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/PKG-INFO +1 -1
  2. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/routes.py +18 -4
  3. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_mission.py +1 -1
  4. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_project.py +1 -1
  5. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/core.py +3 -1
  6. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/errors.py +3 -0
  7. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram.egg-info/PKG-INFO +1 -1
  8. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/setup.cfg +1 -1
  9. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/README.md +0 -0
  10. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/__init__.py +0 -0
  11. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/__main__.py +0 -0
  12. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/_version.py +0 -0
  13. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/__init__.py +0 -0
  14. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/client.py +0 -0
  15. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/deser.py +0 -0
  16. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/file_transfer.py +0 -0
  17. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/pagination.py +0 -0
  18. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/api/query.py +0 -0
  19. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/auth.py +0 -0
  20. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/__init__.py +0 -0
  21. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_download.py +0 -0
  22. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_endpoint.py +0 -0
  23. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_file.py +0 -0
  24. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_list.py +0 -0
  25. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_upload.py +0 -0
  26. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/_verify.py +0 -0
  27. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/app.py +0 -0
  28. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/cli/error_handling.py +0 -0
  29. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/config.py +0 -0
  30. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/main.py +0 -0
  31. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/models.py +0 -0
  32. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/printing.py +0 -0
  33. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/py.typed +0 -0
  34. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/types.py +0 -0
  35. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/utils.py +0 -0
  36. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram/wrappers.py +0 -0
  37. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram.egg-info/SOURCES.txt +0 -0
  38. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram.egg-info/dependency_links.txt +0 -0
  39. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram.egg-info/entry_points.txt +0 -0
  40. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram.egg-info/requires.txt +0 -0
  41. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/kleinkram.egg-info/top_level.txt +0 -0
  42. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/pyproject.toml +0 -0
  43. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/requirements.txt +0 -0
  44. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/setup.py +0 -0
  45. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/testing/__init__.py +0 -0
  46. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/testing/backend_fixtures.py +0 -0
  47. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/__init__.py +0 -0
  48. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/conftest.py +0 -0
  49. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_config.py +0 -0
  50. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_core.py +0 -0
  51. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_end_to_end.py +0 -0
  52. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_error_handling.py +0 -0
  53. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_fixtures.py +0 -0
  54. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_printing.py +0 -0
  55. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_query.py +0 -0
  56. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_utils.py +0 -0
  57. {kleinkram-0.52.0.dev20251013121344 → kleinkram-0.52.0.dev20251015122123}/tests/test_wrappers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kleinkram
3
- Version: 0.52.0.dev20251013121344
3
+ Version: 0.52.0.dev20251015122123
4
4
  Summary: give me your bags
5
5
  Author: Cyrill Püntener, Dominique Garmier, Johann Schwabe
6
6
  Author-email: pucyril@ethz.ch, dgarmier@ethz.ch, jschwab@ethz.ch
@@ -43,6 +43,7 @@ from kleinkram.errors import MissionNotFound
43
43
  from kleinkram.errors import MissionValidationError
44
44
  from kleinkram.errors import ProjectExists
45
45
  from kleinkram.errors import ProjectNotFound
46
+ from kleinkram.errors import ProjectValidationError
46
47
  from kleinkram.models import File
47
48
  from kleinkram.models import Mission
48
49
  from kleinkram.models import Project
@@ -256,7 +257,7 @@ def _validate_mission_name(
256
257
  def _project_name_is_available(client: AuthenticatedClient, project_name: str) -> bool:
257
258
  project_query = ProjectQuery(patterns=[project_name])
258
259
  try:
259
- _ = get_project(client, project_query)
260
+ _ = get_project(client, project_query, exact_match=True)
260
261
  except ProjectNotFound:
261
262
  return True
262
263
  return False
@@ -350,10 +351,8 @@ def _create_mission(
350
351
  def _create_project(
351
352
  client: AuthenticatedClient, project_name: str, description: str
352
353
  ) -> UUID:
353
- if not _project_name_is_available(client, project_name):
354
- raise ProjectExists(f"Project with name: `{project_name}` already exists")
355
354
 
356
- # TODO: check name and description are valid
355
+ _validate_project_name(client, project_name, description)
357
356
  payload = {"name": project_name, "description": description}
358
357
  resp = client.post(CREATE_PROJECT, json=payload)
359
358
  resp.raise_for_status()
@@ -361,6 +360,21 @@ def _create_project(
361
360
  return UUID(resp.json()["uuid"], version=4)
362
361
 
363
362
 
363
+ def _validate_project_name(
364
+ client: AuthenticatedClient, project_name: str, description: str
365
+ ) -> None:
366
+ if not _project_name_is_available(client, project_name):
367
+ raise ProjectExists(f"Project with name: `{project_name}` already exists")
368
+
369
+ if project_name.endswith(" "):
370
+ raise ProjectValidationError(
371
+ f"Project name must not end with a tailing whitespace: `{project_name}`"
372
+ )
373
+
374
+ if not description:
375
+ raise ProjectValidationError("Project description is required")
376
+
377
+
364
378
  def _validate_tag_value(tag_value, tag_datatype) -> None:
365
379
  if tag_datatype == "NUMBER":
366
380
  try:
@@ -46,7 +46,7 @@ def create(
46
46
  metadata_dct = load_metadata(Path(metadata)) if metadata else {} # noqa
47
47
 
48
48
  client = AuthenticatedClient()
49
- project = get_project(client, project_query)
49
+ project = get_project(client, project_query, exact_match=True)
50
50
  project_id = project.id
51
51
  project_required_tags = project.required_tags
52
52
  mission_id = kleinkram.api.routes._create_mission(
@@ -73,7 +73,7 @@ def update(
73
73
  project_query = ProjectQuery(ids=project_ids, patterns=project_patterns)
74
74
 
75
75
  client = AuthenticatedClient()
76
- project_id = get_project(client=client, query=project_query).id
76
+ project_id = get_project(client=client, query=project_query, exact_match=True).id
77
77
  kleinkram.core.update_project(
78
78
  client=client, project_id=project_id, description=description, new_name=new_name
79
79
  )
@@ -107,7 +107,9 @@ def upload(
107
107
 
108
108
  if create and mission is None:
109
109
  # check if project exists and get its id at the same time
110
- project = kleinkram.api.routes.get_project(client, query=query.project_query)
110
+ project = kleinkram.api.routes.get_project(
111
+ client, query=query.project_query, exact_match=True
112
+ )
111
113
  project_id = project.id
112
114
  project_required_tags = project.required_tags
113
115
  mission_name = check_mission_query_is_creatable(query)
@@ -52,6 +52,9 @@ class InvalidMissionMetadata(Exception): ...
52
52
  class MissionValidationError(Exception): ...
53
53
 
54
54
 
55
+ class ProjectValidationError(Exception): ...
56
+
57
+
55
58
  class NotAuthenticated(Exception):
56
59
  def __init__(self) -> None:
57
60
  super().__init__(LOGIN_MESSAGE)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kleinkram
3
- Version: 0.52.0.dev20251013121344
3
+ Version: 0.52.0.dev20251015122123
4
4
  Summary: give me your bags
5
5
  Author: Cyrill Püntener, Dominique Garmier, Johann Schwabe
6
6
  Author-email: pucyril@ethz.ch, dgarmier@ethz.ch, jschwab@ethz.ch
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = kleinkram
3
- version = 0.52.0-dev20251013121344
3
+ version = 0.52.0-dev20251015122123
4
4
  description = give me your bags
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown