sentry-devenv 1.14.5__tar.gz → 1.15.0__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.
Files changed (81) hide show
  1. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/PKG-INFO +2 -2
  2. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/checks/credsStore.py +2 -3
  3. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/venv.py +12 -7
  4. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/pyproject.toml +1 -1
  5. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/sentry_devenv.egg-info/PKG-INFO +2 -2
  6. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/sentry_devenv.egg-info/SOURCES.txt +2 -0
  7. sentry_devenv-1.15.0/tests/checks/test_credStore.py +50 -0
  8. sentry_devenv-1.15.0/tests/doctor/__init__.py +0 -0
  9. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_archive.py +5 -5
  10. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/README.md +0 -0
  11. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/ci/integration/repo/devenv/sync.py +0 -0
  12. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/__init__.py +0 -0
  13. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/__main__.py +0 -0
  14. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/bootstrap.py +0 -0
  15. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/checks/__init__.py +0 -0
  16. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/checks/test.py +0 -0
  17. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/colima.py +0 -0
  18. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/constants.py +0 -0
  19. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/doctor.py +0 -0
  20. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/fetch.py +0 -0
  21. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/__init__.py +0 -0
  22. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/archive.py +0 -0
  23. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/brew.py +0 -0
  24. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/colima.py +0 -0
  25. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/config.py +0 -0
  26. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/context.py +0 -0
  27. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/direnv.py +0 -0
  28. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/docker.py +0 -0
  29. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/fs.py +0 -0
  30. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/gcloud.py +0 -0
  31. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/github.py +0 -0
  32. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/limactl.py +0 -0
  33. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/modules.py +0 -0
  34. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/node.py +0 -0
  35. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/proc.py +0 -0
  36. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/repository.py +0 -0
  37. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/rosetta.py +0 -0
  38. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib/tenv.py +0 -0
  39. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib_check/__init__.py +0 -0
  40. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib_check/brew.py +0 -0
  41. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/lib_check/types.py +0 -0
  42. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/main.py +0 -0
  43. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/pin_gha.py +0 -0
  44. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/py.typed +0 -0
  45. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/pythons.py +0 -0
  46. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/sync.py +0 -0
  47. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/devenv/update.py +0 -0
  48. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/sentry_devenv.egg-info/dependency_links.txt +0 -0
  49. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/sentry_devenv.egg-info/entry_points.txt +0 -0
  50. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/sentry_devenv.egg-info/requires.txt +0 -0
  51. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/sentry_devenv.egg-info/top_level.txt +0 -0
  52. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/setup.cfg +0 -0
  53. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/__init__.py +0 -0
  54. {sentry_devenv-1.14.5/tests/doctor → sentry_devenv-1.15.0/tests/checks}/__init__.py +0 -0
  55. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/conftest.py +0 -0
  56. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/bad_check.py +0 -0
  57. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/bad_fix.py +0 -0
  58. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/broken_check.py +0 -0
  59. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/broken_fix.py +0 -0
  60. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/failing_check.py +0 -0
  61. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/failing_check_with_msg.py +0 -0
  62. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/no_check.py +0 -0
  63. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/no_name.py +0 -0
  64. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/no_tags.py +0 -0
  65. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/devenv/checks/passing_check.py +0 -0
  66. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/test_attempt_fix.py +0 -0
  67. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/test_filter_failing_checks.py +0 -0
  68. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/test_load_checks.py +0 -0
  69. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/test_prompt_for_fix.py +0 -0
  70. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/doctor/test_run_checks.py +0 -0
  71. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_brew.py +0 -0
  72. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_direnv.py +0 -0
  73. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_fs.py +0 -0
  74. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_github.py +0 -0
  75. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_proc.py +0 -0
  76. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_repository.py +0 -0
  77. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/lib/test_venv.py +0 -0
  78. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/test_main.py +0 -0
  79. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/test_pythons.py +0 -0
  80. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/test_sync.py +0 -0
  81. {sentry_devenv-1.14.5 → sentry_devenv-1.15.0}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: sentry_devenv
3
- Version: 1.14.5
3
+ Version: 1.15.0
4
4
  Summary: Utilities for setting up a Sentry development environment
5
5
  Author-email: Joshua Li <joshua.li@sentry.io>, Ian Woodard <ian.woodard@sentry.io>, Buck Evan <buck.evan@sentry.io>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -19,9 +19,8 @@ def check() -> tuple[bool, str]:
19
19
  with open(os.path.expanduser("~/.docker/config.json"), "rb") as f:
20
20
  config = json.load(f)
21
21
 
22
- if config.get("credsStore", "") == "desktop" and not shutil.which(
23
- "docker-credential-desktop"
24
- ):
22
+ store = config.get("credsStore", "")
23
+ if store and not shutil.which(f"docker-credential-{store}"):
25
24
  return False, "credsStore requires nonexistent binary"
26
25
 
27
26
  return True, ""
@@ -25,15 +25,20 @@ def get(
25
25
 
26
26
  venv = cfg[f"venv.{name}"]
27
27
  venv_dir = venv.get("path", f"{reporoot}/.venv-{name}")
28
- editable_paths = venv.get("editable", None)
29
- if editable_paths is not None:
28
+ editable_paths_s = venv.get("editable", None)
29
+ if editable_paths_s is not None:
30
30
  editable_paths = tuple(
31
- f"{reporoot}/{path}" for path in editable_paths.strip().split("\n")
31
+ f"{reporoot}/{path}"
32
+ for path in editable_paths_s.strip().split("\n")
32
33
  )
33
-
34
- bins = venv.get("bins", None)
35
- if bins is not None:
36
- bins = tuple(bins.strip().split("\n"))
34
+ else:
35
+ editable_paths = None
36
+
37
+ bins_s = venv.get("bins", None)
38
+ if bins_s is not None:
39
+ bins = tuple(bins_s.strip().split("\n"))
40
+ else:
41
+ bins = None
37
42
 
38
43
  return (
39
44
  venv_dir,
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sentry_devenv"
7
- version = "1.14.5"
7
+ version = "1.15.0"
8
8
  authors = [
9
9
  { name="Joshua Li", email="joshua.li@sentry.io" },
10
10
  { name="Ian Woodard", email="ian.woodard@sentry.io" },
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: sentry_devenv
3
- Version: 1.14.5
3
+ Version: 1.15.0
4
4
  Summary: Utilities for setting up a Sentry development environment
5
5
  Author-email: Joshua Li <joshua.li@sentry.io>, Ian Woodard <ian.woodard@sentry.io>, Buck Evan <buck.evan@sentry.io>
6
6
  Classifier: Programming Language :: Python :: 3
@@ -52,6 +52,8 @@ tests/test_main.py
52
52
  tests/test_pythons.py
53
53
  tests/test_sync.py
54
54
  tests/utils.py
55
+ tests/checks/__init__.py
56
+ tests/checks/test_credStore.py
55
57
  tests/doctor/__init__.py
56
58
  tests/doctor/test_attempt_fix.py
57
59
  tests/doctor/test_filter_failing_checks.py
@@ -0,0 +1,50 @@
1
+ from __future__ import annotations
2
+
3
+ import os.path
4
+ import pathlib
5
+ import shutil
6
+ from collections.abc import Generator
7
+ from unittest import mock
8
+
9
+ import pytest
10
+
11
+ from devenv.checks import credsStore
12
+
13
+
14
+ @pytest.fixture
15
+ def fake_config(tmp_path: pathlib.Path) -> Generator[pathlib.Path]:
16
+ cfg = tmp_path.joinpath("config.json")
17
+
18
+ def new_expanduser(s: str) -> str:
19
+ assert s == "~/.docker/config.json"
20
+ return str(cfg)
21
+
22
+ with mock.patch.object(os.path, "expanduser", new_expanduser):
23
+ yield cfg
24
+
25
+
26
+ def test_no_credsStore_ok(fake_config: pathlib.Path) -> None:
27
+ fake_config.write_text("{}")
28
+ assert credsStore.check() == (True, "")
29
+
30
+
31
+ def test_binary_ok(fake_config: pathlib.Path) -> None:
32
+ fake_config.write_text('{"credsStore": "example"}')
33
+ with mock.patch.object(shutil, "which", return_value="/fake/exe"):
34
+ assert credsStore.check() == (True, "")
35
+
36
+
37
+ @pytest.mark.parametrize("name", ("desktop", "osxkeychain"))
38
+ def test_binary_missing(fake_config: pathlib.Path, name: str) -> None:
39
+ fake_config.write_text(f'{{"credsStore": "{name}"}}')
40
+ with mock.patch.object(shutil, "which", return_value=None):
41
+ assert credsStore.check() == (
42
+ False,
43
+ "credsStore requires nonexistent binary",
44
+ )
45
+
46
+
47
+ def test_fix(fake_config: pathlib.Path) -> None:
48
+ fake_config.write_text('{"credsStore": "bad"}')
49
+ assert credsStore.fix() == (True, "")
50
+ assert fake_config.read_text() == "{}"
File without changes
@@ -20,7 +20,7 @@ def tar(tmp_path: pathlib.Path) -> pathlib.Path:
20
20
  executable.write_text("hi")
21
21
 
22
22
  tar = tmp_path / "tar"
23
- with tarfile.open(tar, "w:tar") as tarf:
23
+ with tarfile.open(tar, "w:") as tarf:
24
24
  tarf.add(executable, arcname="executable")
25
25
 
26
26
  return tar
@@ -69,7 +69,7 @@ def tar2(tmp_path: pathlib.Path) -> pathlib.Path:
69
69
  foo_v1_baz.mkdir()
70
70
 
71
71
  tar = tmp_path / "tar"
72
- with tarfile.open(tar, "w:tar") as tarf:
72
+ with tarfile.open(tar, "w:") as tarf:
73
73
  tarf.add(foo, arcname="foo")
74
74
  # foo
75
75
  # foo/v1
@@ -95,7 +95,7 @@ def tar3(tmp_path: pathlib.Path) -> pathlib.Path:
95
95
  foo_v1_foo.write_text("")
96
96
 
97
97
  tar = tmp_path / "tar"
98
- with tarfile.open(tar, "w:tar") as tarf:
98
+ with tarfile.open(tar, "w:") as tarf:
99
99
  tarf.add(foo, arcname="foo")
100
100
  # foo
101
101
  # foo/bar
@@ -115,7 +115,7 @@ def tar4(tmp_path: pathlib.Path) -> pathlib.Path:
115
115
 
116
116
  tar = tmp_path / "tar"
117
117
 
118
- with tarfile.open(tar, "w:tar") as tarf:
118
+ with tarfile.open(tar, "w:") as tarf:
119
119
  # note: arcname /foo doesn't work, it gets added as foo
120
120
  tarf.add(foo, arcname="foo")
121
121
  # /foo
@@ -139,7 +139,7 @@ def tar5(tmp_path: pathlib.Path) -> pathlib.Path:
139
139
 
140
140
  tar = tmp_path / "tar"
141
141
 
142
- with tarfile.open(tar, "w:tar") as tarf:
142
+ with tarfile.open(tar, "w:") as tarf:
143
143
  tarf.add(foo, arcname="foo")
144
144
  # foo
145
145
  # foo/bar
File without changes
File without changes