kleinkram 0.40.0.dev20250225150133__tar.gz → 0.40.0.dev20250228081255__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.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/PKG-INFO +1 -1
  2. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/client.py +3 -1
  3. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/config.py +20 -4
  4. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/utils.py +1 -4
  5. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram.egg-info/PKG-INFO +1 -1
  6. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/setup.cfg +1 -1
  7. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_config.py +19 -1
  8. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/README.md +0 -0
  9. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/__init__.py +0 -0
  10. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/__main__.py +0 -0
  11. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/_version.py +0 -0
  12. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/__init__.py +0 -0
  13. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/deser.py +0 -0
  14. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/file_transfer.py +0 -0
  15. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/pagination.py +0 -0
  16. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/query.py +0 -0
  17. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/api/routes.py +0 -0
  18. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/auth.py +0 -0
  19. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/__init__.py +0 -0
  20. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_download.py +0 -0
  21. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_endpoint.py +0 -0
  22. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_file.py +0 -0
  23. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_list.py +0 -0
  24. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_mission.py +0 -0
  25. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_project.py +0 -0
  26. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_upload.py +0 -0
  27. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/_verify.py +0 -0
  28. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/app.py +0 -0
  29. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/cli/error_handling.py +0 -0
  30. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/core.py +0 -0
  31. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/errors.py +0 -0
  32. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/main.py +0 -0
  33. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/models.py +0 -0
  34. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/printing.py +0 -0
  35. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/py.typed +0 -0
  36. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/types.py +0 -0
  37. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram/wrappers.py +0 -0
  38. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram.egg-info/SOURCES.txt +0 -0
  39. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram.egg-info/dependency_links.txt +0 -0
  40. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram.egg-info/entry_points.txt +0 -0
  41. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram.egg-info/requires.txt +0 -0
  42. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/kleinkram.egg-info/top_level.txt +0 -0
  43. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/pyproject.toml +0 -0
  44. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/requirements.txt +0 -0
  45. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/setup.py +0 -0
  46. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/testing/__init__.py +0 -0
  47. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/testing/backend_fixtures.py +0 -0
  48. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/__init__.py +0 -0
  49. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/conftest.py +0 -0
  50. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_core.py +0 -0
  51. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_end_to_end.py +0 -0
  52. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_error_handling.py +0 -0
  53. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_fixtures.py +0 -0
  54. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_printing.py +0 -0
  55. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_query.py +0 -0
  56. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_utils.py +0 -0
  57. {kleinkram-0.40.0.dev20250225150133 → kleinkram-0.40.0.dev20250228081255}/tests/test_wrappers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: kleinkram
3
- Version: 0.40.0.dev20250225150133
3
+ Version: 0.40.0.dev20250228081255
4
4
  Summary: give me your bags
5
5
  Author: Cyrill Püntener, Dominique Garmier, Johann Schwabe
6
6
  Classifier: Programming Language :: Python :: 3
@@ -148,7 +148,9 @@ class AuthenticatedClient(httpx.Client):
148
148
  raise NotAuthenticated
149
149
 
150
150
  logger.info(f"retrying request {method} {full_url}")
151
- resp = super().request(method, full_url, *args, **kwargs)
151
+ resp = super().request(
152
+ method, full_url, params=httpx_params, *args, **kwargs
153
+ )
152
154
  logger.info(f"got response {resp}")
153
155
  return resp
154
156
  else:
@@ -24,6 +24,7 @@ from rich.text import Text
24
24
 
25
25
  from kleinkram._version import __local__
26
26
  from kleinkram._version import __version__
27
+ from kleinkram.utils import format_traceback
27
28
 
28
29
  logger = logging.getLogger(__name__)
29
30
 
@@ -75,8 +76,8 @@ def get_env() -> Environment:
75
76
 
76
77
 
77
78
  ACTION_API_KEY = "KLEINKRAM_API_KEY"
78
- ACTION_API = "KLEINKRAM_API"
79
- ACTION_S3 = "KLEINKRAM_S3"
79
+ ACTION_API = "KLEINKRAM_API_ENDPOINT"
80
+ ACTION_S3 = "KLEINKRAM_S3_ENDPOINT"
80
81
 
81
82
 
82
83
  def _get_endpoint_from_action_env_vars() -> Optional[Endpoint]:
@@ -167,13 +168,28 @@ def _config_from_dict(dct: Dict[str, Any]) -> Config:
167
168
  )
168
169
 
169
170
 
170
- def save_config(config: Config, path: Path = CONFIG_PATH) -> None:
171
- fd, temp_path = tempfile.mkstemp()
171
+ def _safe_config_write(
172
+ config: Config, path: Path, tmp_dir: Optional[Path] = None
173
+ ) -> None:
174
+ fd, temp_path = tempfile.mkstemp(dir=tmp_dir)
172
175
  with os.fdopen(fd, "w") as f:
173
176
  json.dump(_config_to_dict(config), f)
174
177
  os.replace(temp_path, path)
175
178
 
176
179
 
180
+ def _unsafe_config_write(config: Config, path: Path) -> None:
181
+ with open(path, "w") as f:
182
+ json.dump(_config_to_dict(config), f)
183
+
184
+
185
+ def save_config(config: Config, path: Path = CONFIG_PATH) -> None:
186
+ try:
187
+ _safe_config_write(config, path)
188
+ except Exception as e:
189
+ logger.warning(f"failed to safe write config {format_traceback(e)}")
190
+ _unsafe_config_write(config, path)
191
+
192
+
177
193
  def _load_config_if_compatible(path: Path) -> Optional[Config]:
178
194
  if not path.exists():
179
195
  return None
@@ -40,10 +40,7 @@ def file_paths_from_files(
40
40
  determines the destinations for a sequence of `File` objects,
41
41
  possibly nested by project and mission
42
42
  """
43
- if (
44
- len(set([(file.project_id, file.mission_id) for file in files])) > 1
45
- and not allow_nested
46
- ):
43
+ if len(set([file.mission_id for file in files])) > 1 and not allow_nested:
47
44
  raise ValueError("files from multiple missions were selected")
48
45
  elif not allow_nested:
49
46
  return {dest / file.name: file for file in files}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: kleinkram
3
- Version: 0.40.0.dev20250225150133
3
+ Version: 0.40.0.dev20250228081255
4
4
  Summary: give me your bags
5
5
  Author: Cyrill Püntener, Dominique Garmier, Johann Schwabe
6
6
  Classifier: Programming Language :: Python :: 3
@@ -1,6 +1,6 @@
1
1
  [metadata]
2
2
  name = kleinkram
3
- version = 0.40.0-dev20250225150133
3
+ version = 0.40.0-dev20250228081255
4
4
  description = give me your bags
5
5
  long_description = file: README.md
6
6
  long_description_content_type = text/markdown
@@ -7,6 +7,7 @@ from unittest import mock
7
7
 
8
8
  import pytest
9
9
 
10
+ import kleinkram.config
10
11
  from kleinkram.config import ACTION_API
11
12
  from kleinkram.config import ACTION_API_KEY
12
13
  from kleinkram.config import ACTION_S3
@@ -102,9 +103,26 @@ def test_save_and_load_config(config_path):
102
103
  config = Config(version="foo")
103
104
 
104
105
  assert not config_path.exists()
105
- save_config(config, path=config_path)
106
+ with mock.patch.object(kleinkram.config.logger, "warning") as mock_warning:
107
+ save_config(config, path=config_path)
108
+ mock_warning.assert_not_called()
109
+
106
110
  assert config_path.exists()
111
+ loaded_config = _load_config(path=config_path)
112
+ assert loaded_config == config
113
+
107
114
 
115
+ def test_save_and_load_config_when_tmpfile_fails(config_path):
116
+ config = Config(version="foo")
117
+
118
+ assert not config_path.exists()
119
+ with mock.patch("tempfile.mkstemp", side_effect=Exception), mock.patch.object(
120
+ kleinkram.config.logger, "warning"
121
+ ) as mock_warning:
122
+ save_config(config, path=config_path)
123
+ mock_warning.assert_called_once()
124
+
125
+ assert config_path.exists()
108
126
  loaded_config = _load_config(path=config_path)
109
127
  assert loaded_config == config
110
128