sentry-devenv 1.17.0__tar.gz → 1.19.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 (83) hide show
  1. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/PKG-INFO +1 -1
  2. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/checks/credsStore.py +1 -1
  3. sentry_devenv-1.19.0/devenv/checks/dockerDesktop.py +47 -0
  4. sentry_devenv-1.19.0/devenv/checks/limaDns.py +85 -0
  5. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/colima.py +3 -0
  6. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/doctor.py +9 -9
  7. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/colima.py +11 -0
  8. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/pyproject.toml +1 -1
  9. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/sentry_devenv.egg-info/PKG-INFO +1 -1
  10. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/sentry_devenv.egg-info/SOURCES.txt +2 -0
  11. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/test_run_checks.py +1 -1
  12. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/README.md +0 -0
  13. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/ci/integration/repo/devenv/sync.py +0 -0
  14. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/__init__.py +0 -0
  15. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/__main__.py +0 -0
  16. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/bootstrap.py +0 -0
  17. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/checks/__init__.py +0 -0
  18. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/checks/test.py +0 -0
  19. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/constants.py +0 -0
  20. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/fetch.py +0 -0
  21. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/__init__.py +0 -0
  22. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/archive.py +0 -0
  23. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/brew.py +0 -0
  24. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/config.py +0 -0
  25. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/context.py +0 -0
  26. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/direnv.py +0 -0
  27. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/docker.py +0 -0
  28. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/fs.py +0 -0
  29. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/gcloud.py +0 -0
  30. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/github.py +0 -0
  31. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/limactl.py +0 -0
  32. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/modules.py +0 -0
  33. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/node.py +0 -0
  34. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/proc.py +0 -0
  35. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/repository.py +0 -0
  36. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/rosetta.py +0 -0
  37. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/tenv.py +0 -0
  38. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib/venv.py +0 -0
  39. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib_check/__init__.py +0 -0
  40. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib_check/brew.py +0 -0
  41. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/lib_check/types.py +0 -0
  42. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/main.py +0 -0
  43. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/pin_gha.py +0 -0
  44. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/py.typed +0 -0
  45. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/pythons.py +0 -0
  46. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/sync.py +0 -0
  47. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/devenv/update.py +0 -0
  48. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/sentry_devenv.egg-info/dependency_links.txt +0 -0
  49. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/sentry_devenv.egg-info/entry_points.txt +0 -0
  50. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/sentry_devenv.egg-info/requires.txt +0 -0
  51. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/sentry_devenv.egg-info/top_level.txt +0 -0
  52. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/setup.cfg +0 -0
  53. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/__init__.py +0 -0
  54. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/checks/__init__.py +0 -0
  55. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/checks/test_credStore.py +0 -0
  56. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/conftest.py +0 -0
  57. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/__init__.py +0 -0
  58. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/bad_check.py +0 -0
  59. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/bad_fix.py +0 -0
  60. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/broken_check.py +0 -0
  61. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/broken_fix.py +0 -0
  62. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/failing_check.py +0 -0
  63. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/failing_check_with_msg.py +0 -0
  64. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/no_check.py +0 -0
  65. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/no_name.py +0 -0
  66. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/no_tags.py +0 -0
  67. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/devenv/checks/passing_check.py +0 -0
  68. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/test_attempt_fix.py +0 -0
  69. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/test_filter_failing_checks.py +0 -0
  70. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/test_load_checks.py +0 -0
  71. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/doctor/test_prompt_for_fix.py +0 -0
  72. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_archive.py +0 -0
  73. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_brew.py +0 -0
  74. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_direnv.py +0 -0
  75. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_fs.py +0 -0
  76. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_github.py +0 -0
  77. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_proc.py +0 -0
  78. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_repository.py +0 -0
  79. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/lib/test_venv.py +0 -0
  80. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/test_main.py +0 -0
  81. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/test_pythons.py +0 -0
  82. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/test_sync.py +0 -0
  83. {sentry_devenv-1.17.0 → sentry_devenv-1.19.0}/tests/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sentry_devenv
3
- Version: 1.17.0
3
+ Version: 1.19.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
@@ -8,7 +8,7 @@ from devenv.lib_check.types import checker
8
8
  from devenv.lib_check.types import fixer
9
9
 
10
10
  tags: set[str] = {"builtin"}
11
- name = "credsStore"
11
+ name = "credsStore fix"
12
12
 
13
13
 
14
14
  @checker
@@ -0,0 +1,47 @@
1
+ from __future__ import annotations
2
+
3
+ import time
4
+
5
+ from devenv.lib import proc
6
+ from devenv.lib_check.types import checker
7
+ from devenv.lib_check.types import fixer
8
+
9
+ tags: set[str] = {"builtin"}
10
+ name = "docker desktop shouldn't be running"
11
+
12
+
13
+ def docker_desktop_is_running() -> bool:
14
+ procs = proc.run(("/bin/ps", "-Ac", "-o", "comm"), stdout=True)
15
+ return "Docker Desktop" in procs.split("\n")
16
+
17
+
18
+ @checker
19
+ def check() -> tuple[bool, str]:
20
+ if docker_desktop_is_running():
21
+ return (
22
+ False,
23
+ "Docker Desktop is running. We don't support it, and it conflicts with colima.",
24
+ )
25
+
26
+ return True, ""
27
+
28
+
29
+ @fixer
30
+ def fix() -> tuple[bool, str]:
31
+ # regular pkill won't stop the Docker Desktop UI,
32
+ # it'll just spin. the proper way to terminate it
33
+ # without SIGKILL is to use osascript.
34
+ print("Attempting to stop Docker Desktop.")
35
+ try:
36
+ proc.run(("osascript", "-e", 'quit app "Docker Desktop"'))
37
+ except RuntimeError as e:
38
+ return False, f"failed to quit Docker Desktop:\n{e}\n"
39
+
40
+ # osascript doesn't wait to make sure it finishes quitting
41
+ # so let's block for up to 5 secs
42
+ for _ in range(10):
43
+ time.sleep(0.5)
44
+ if not docker_desktop_is_running():
45
+ return True, ""
46
+
47
+ return False, "Docker Desktop is taking too long to quit... try again?"
@@ -0,0 +1,85 @@
1
+ from __future__ import annotations
2
+
3
+ import sys
4
+
5
+ from devenv.lib import colima
6
+ from devenv.lib import proc
7
+ from devenv.lib_check.types import checker
8
+ from devenv.lib_check.types import fixer
9
+
10
+ tags: set[str] = {"builtin"}
11
+ name = "colima's DNS isn't working"
12
+
13
+
14
+ @checker
15
+ def check() -> tuple[bool, str]:
16
+ # dns resolution can... stop working if colima's running
17
+ # and wifi changes to some other network that gives macos some
18
+ # weird nameservers
19
+
20
+ status = colima.check()
21
+ if status != colima.ColimaStatus.UP:
22
+ return False, "Colima isn't running."
23
+
24
+ try:
25
+ proc.run(
26
+ (
27
+ "colima",
28
+ "exec",
29
+ "--",
30
+ "python3",
31
+ "-Su",
32
+ "-c",
33
+ """
34
+ import socket
35
+
36
+ try:
37
+ socket.getaddrinfo("ghcr.io", None)
38
+ except socket.gaierror as e:
39
+ raise SystemExit(f"failed to resolve ghcr.io: {e}")
40
+ """,
41
+ ),
42
+ stdout=True,
43
+ )
44
+ except RuntimeError as e:
45
+ return False, f"{e}"
46
+
47
+ return True, ""
48
+
49
+
50
+ @fixer
51
+ def fix() -> tuple[bool, str]:
52
+ status = colima.start()
53
+ if status == colima.ColimaStatus.UNHEALTHY:
54
+ return False, "colima started, but it's unhealthy"
55
+
56
+ try:
57
+ proc.run(
58
+ (
59
+ "colima",
60
+ "exec",
61
+ "--",
62
+ "sudo",
63
+ "systemctl",
64
+ "restart",
65
+ "systemd-resolved.service",
66
+ ),
67
+ stdout=True,
68
+ )
69
+ except RuntimeError as e:
70
+ print(
71
+ f"""
72
+ failed to restart the vm's resolved:
73
+ {e}
74
+
75
+ we're going to try restarting colima
76
+ """
77
+ )
78
+ try:
79
+ proc.run(
80
+ (sys.executable, "-P", "-m", "devenv", "colima", "restart")
81
+ )
82
+ except RuntimeError as e:
83
+ return False, f"{e}"
84
+
85
+ return True, ""
@@ -18,6 +18,9 @@ def main(context: Context, argv: Sequence[str] | None = None) -> int:
18
18
 
19
19
  args = parser.parse_args(argv)
20
20
 
21
+ # TODO: in addition to returning 1 we should print colima logs
22
+ # (and/or send to sentry)
23
+
21
24
  if args.command == "start":
22
25
  status = colima.start()
23
26
  if status == colima.ColimaStatus.UNHEALTHY:
@@ -143,7 +143,7 @@ def run_checks(
143
143
  results: dict[Check, tuple[bool, str]] = {}
144
144
  for check in checks:
145
145
  if check in skip:
146
- print(f"\t⏭️ Skipped {check.name}".expandtabs(4))
146
+ print(f" ⏭️ Skipped {check.name}")
147
147
  continue
148
148
  futures[check] = executor.submit(check.check)
149
149
  for check, future in futures.items():
@@ -162,9 +162,9 @@ def filter_failing_checks(
162
162
  for check, result in results.items():
163
163
  ok, msg = result
164
164
  if ok:
165
- print(f"\t✅ check: {check.name}".expandtabs(4))
165
+ print(f" ✅ check: {check.name}")
166
166
  continue
167
- print(f"\t❌ check: {check.name}{msg}".expandtabs(4))
167
+ print(f" ❌ check: {check.name}\n {msg}")
168
168
  failing_checks.append(check)
169
169
  return failing_checks
170
170
 
@@ -172,7 +172,7 @@ def filter_failing_checks(
172
172
  def prompt_for_fix(check: Check) -> bool:
173
173
  """Prompt the user to attempt a fix."""
174
174
  return input(
175
- f"\t\tDo you want to attempt to fix {check.name}? (Y/n): ".expandtabs(4)
175
+ f" Do you want to attempt to fix {check.name}? (Y/n): "
176
176
  ).lower() in {"y", "yes", ""}
177
177
 
178
178
 
@@ -229,19 +229,19 @@ def main(context: Context, argv: Sequence[str] | None = None) -> int:
229
229
  if args.check_only:
230
230
  return 1
231
231
 
232
- print("\nThe following problems have been identified:")
233
232
  skip: list[Check] = []
233
+ print("\nLet's go through the failures one by one.")
234
234
  for check in failing_checks:
235
- print(f"\t❌ {check.name}".expandtabs(4))
235
+ print(f"❌ {check.name}")
236
236
  # Prompt for fixes one by one, so the user can decide to skip a fix.
237
237
  if prompt_for_fix(check):
238
238
  ok, msg = attempt_fix(check, executor)
239
239
  if ok:
240
- print(f"\t\t✅ fix: {check.name}".expandtabs(4))
240
+ print(f"✅ fix: {check.name}")
241
241
  else:
242
- print(f"\t\t❌ fix: {check.name}{msg}".expandtabs(4))
242
+ print(f"❌ fix: {check.name}{msg}")
243
243
  else:
244
- print(f"\t\t⏭️ Skipping {check.name}".expandtabs(4))
244
+ print(f" ⏭️ Skipping {check.name}")
245
245
  skip.append(check)
246
246
 
247
247
  print("\nChecking that fixes worked as expected...")
@@ -180,6 +180,17 @@ def start(restart: bool = False) -> ColimaStatus:
180
180
  "colima",
181
181
  "start",
182
182
  "--verbose",
183
+ # this effectively makes the vm's resolvectl status use:
184
+ # DNS Servers: 8.8.8.8 1.1.1.1 192.168.5.2
185
+ # https://lima-vm.io/docs/config/network/user/
186
+ # 192.168.5.2 is the host, accessible from the vm
187
+ # sometimes using only the host will result in dns breaking
188
+ # for any number of reasons (public wifi that gives you some weird dns server,
189
+ # tethering, vpn, what have you)
190
+ "--dns",
191
+ "8.8.8.8",
192
+ "--dns",
193
+ "1.1.1.1",
183
194
  # ideally we keep ~ ro, but currently the "default" vm
184
195
  # is shared across repositories, so for ease of use we'll let home rw
185
196
  f"--mount=/var/folders:w,/private/tmp/colima:w,{home}:w",
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "sentry_devenv"
7
- version = "1.17.0"
7
+ version = "1.19.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
1
  Metadata-Version: 2.4
2
2
  Name: sentry_devenv
3
- Version: 1.17.0
3
+ Version: 1.19.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
@@ -17,6 +17,8 @@ devenv/sync.py
17
17
  devenv/update.py
18
18
  devenv/checks/__init__.py
19
19
  devenv/checks/credsStore.py
20
+ devenv/checks/dockerDesktop.py
21
+ devenv/checks/limaDns.py
20
22
  devenv/checks/test.py
21
23
  devenv/lib/__init__.py
22
24
  devenv/lib/archive.py
@@ -51,7 +51,7 @@ def test_run_checks_skip(capsys: pytest.CaptureFixture[str]) -> None:
51
51
  [first_check, second_check], ThreadPoolExecutor(), skip=[second_check]
52
52
  ) == {first_check: (True, "")}
53
53
  captured = capsys.readouterr()
54
- assert captured.out == " ⏭️ Skipped failing check\n"
54
+ assert captured.out == " ⏭️ Skipped failing check\n"
55
55
 
56
56
 
57
57
  def test_run_checks_multiple_failing_checks() -> None:
File without changes
File without changes