evo-cli 0.31.0__tar.gz → 0.31.1__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 (154) hide show
  1. {evo_cli-0.31.0 → evo_cli-0.31.1}/PKG-INFO +1 -1
  2. evo_cli-0.31.1/evo_cli/VERSION +1 -0
  3. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/openvpn.py +12 -2
  4. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/openvpn.py +5 -0
  5. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/PKG-INFO +1 -1
  6. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_openvpn.py +44 -0
  7. evo_cli-0.31.0/evo_cli/VERSION +0 -1
  8. {evo_cli-0.31.0 → evo_cli-0.31.1}/Containerfile +0 -0
  9. {evo_cli-0.31.0 → evo_cli-0.31.1}/HISTORY.md +0 -0
  10. {evo_cli-0.31.0 → evo_cli-0.31.1}/LICENSE +0 -0
  11. {evo_cli-0.31.0 → evo_cli-0.31.1}/MANIFEST.in +0 -0
  12. {evo_cli-0.31.0 → evo_cli-0.31.1}/README.md +0 -0
  13. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/__init__.py +0 -0
  14. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/__main__.py +0 -0
  15. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/base.py +0 -0
  16. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/cli.py +0 -0
  17. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/__init__.py +0 -0
  18. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/agent_toy.py +0 -0
  19. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/claude_code.py +0 -0
  20. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/cloudflare.py +0 -0
  21. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/cred.py +0 -0
  22. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/download.py +0 -0
  23. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/fix_claude.py +0 -0
  24. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/gdrive.py +0 -0
  25. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/gh.py +0 -0
  26. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/__init__.py +0 -0
  27. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_dag.py +0 -0
  28. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_git.py +0 -0
  29. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_hub.py +0 -0
  30. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_mirror.py +0 -0
  31. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_model.py +0 -0
  32. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_mutate.py +0 -0
  33. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_paths.py +0 -0
  34. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_render.py +0 -0
  35. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/_server.py +0 -0
  36. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/check.py +0 -0
  37. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/clone.py +0 -0
  38. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/edit.py +0 -0
  39. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/pull.py +0 -0
  40. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/serve.py +0 -0
  41. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/show.py +0 -0
  42. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/views.py +0 -0
  43. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/index-Cs7hXRPJ.css +0 -0
  44. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/index-CuNOlaH7.js +0 -0
  45. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  46. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  47. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  48. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  49. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  50. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  51. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  52. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  53. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  54. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  55. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  56. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  57. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/harness/web/index.html +0 -0
  58. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/hwid.py +0 -0
  59. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/hwid_reset.py +0 -0
  60. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/image.py +0 -0
  61. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/localproxy.py +0 -0
  62. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/mcp.py +0 -0
  63. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/miniconda.py +0 -0
  64. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/netcheck.py +0 -0
  65. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/ngrok.py +0 -0
  66. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/opencode.py +0 -0
  67. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/plantuml.py +0 -0
  68. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/__init__.py +0 -0
  69. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_dns.py +0 -0
  70. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_dpi.py +0 -0
  71. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_hosts.py +0 -0
  72. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/_probe.py +0 -0
  73. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/check.py +0 -0
  74. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/fix.py +0 -0
  75. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/probe.py +0 -0
  76. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/route/status.py +0 -0
  77. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/serp.py +0 -0
  78. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/site2s.py +0 -0
  79. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/ssh.py +0 -0
  80. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/storage.py +0 -0
  81. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/sysmon.py +0 -0
  82. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/tts.py +0 -0
  83. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/update.py +0 -0
  84. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/commands/wifi.py +0 -0
  85. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/console.py +0 -0
  86. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/__init__.py +0 -0
  87. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/doctor.py +0 -0
  88. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/google_oauth.py +0 -0
  89. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/migrate.py +0 -0
  90. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/oauth_flow.py +0 -0
  91. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/registry.py +0 -0
  92. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/store.py +0 -0
  93. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/credentials/sync.py +0 -0
  94. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/__init__.py +0 -0
  95. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/align.py +0 -0
  96. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/core.py +0 -0
  97. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/creds.py +0 -0
  98. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/errors.py +0 -0
  99. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/gemini.py +0 -0
  100. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/imaging/ncnn.py +0 -0
  101. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/mcp_registry.py +0 -0
  102. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/__init__.py +0 -0
  103. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/client.py +0 -0
  104. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/creds.py +0 -0
  105. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/errors.py +0 -0
  106. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/install.py +0 -0
  107. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/serp/render.py +0 -0
  108. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/__init__.py +0 -0
  109. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/chunking.py +0 -0
  110. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/core.py +0 -0
  111. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/creds.py +0 -0
  112. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/errors.py +0 -0
  113. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/gemini.py +0 -0
  114. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/http.py +0 -0
  115. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/openai.py +0 -0
  116. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/player.py +0 -0
  117. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli/tts/vbee.py +0 -0
  118. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/SOURCES.txt +0 -0
  119. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/dependency_links.txt +0 -0
  120. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/entry_points.txt +0 -0
  121. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/requires.txt +0 -0
  122. {evo_cli-0.31.0 → evo_cli-0.31.1}/evo_cli.egg-info/top_level.txt +0 -0
  123. {evo_cli-0.31.0 → evo_cli-0.31.1}/pyproject.toml +0 -0
  124. {evo_cli-0.31.0 → evo_cli-0.31.1}/setup.cfg +0 -0
  125. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/__init__.py +0 -0
  126. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/fake_evo_agents.py +0 -0
  127. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/fixtures/hub/contract-0.2.0.json +0 -0
  128. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/fixtures/hub/mirror-demo.yaml +0 -0
  129. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_agent_toy.py +0 -0
  130. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_claude_code.py +0 -0
  131. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_cli.py +0 -0
  132. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_console.py +0 -0
  133. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_cred.py +0 -0
  134. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_download.py +0 -0
  135. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_fix_claude.py +0 -0
  136. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_gdrive.py +0 -0
  137. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_gh.py +0 -0
  138. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness.py +0 -0
  139. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_clone.py +0 -0
  140. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_dag.py +0 -0
  141. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_hub.py +0 -0
  142. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_harness_show.py +0 -0
  143. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_image.py +0 -0
  144. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_mcp.py +0 -0
  145. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_ngrok.py +0 -0
  146. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_opencode.py +0 -0
  147. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_plantuml.py +0 -0
  148. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_route.py +0 -0
  149. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_serp.py +0 -0
  150. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_storage.py +0 -0
  151. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_sysmon.py +0 -0
  152. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_tts.py +0 -0
  153. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_update.py +0 -0
  154. {evo_cli-0.31.0 → evo_cli-0.31.1}/tests/test_wifi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.31.0
3
+ Version: 0.31.1
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -0,0 +1 @@
1
+ 0.31.1
@@ -42,12 +42,22 @@ def _table(rows):
42
42
  _state_text(state["state"]),
43
43
  state.get("vpn_ip", ""),
44
44
  (profile.get("remotes") or [""])[0],
45
- "yes" if profile.get("password") else "no",
45
+ _creds(profile),
46
46
  "yes" if profile.get("totp") else "no",
47
47
  )
48
48
  return table
49
49
 
50
50
 
51
+ def _creds(profile):
52
+ """CREDS column: a certificate-only profile shows "cert", as it needs no username or password."""
53
+ if profile.get("password"):
54
+ return "yes"
55
+ try:
56
+ return "no" if vpn.uses_credentials(profile.get("config", "")) else "cert"
57
+ except vpn.CredentialError:
58
+ return "no"
59
+
60
+
51
61
  def _rows():
52
62
  profiles = _guard(vpn.profiles)
53
63
  return [(name, profiles[name], _guard(vpn.request, name)) for name in sorted(profiles)]
@@ -322,7 +332,7 @@ def connect(name, timeout, sudo_password_stdin, watch):
322
332
  _guard(vpn.validate_config, profile["config"])
323
333
  if not shutil.which("openvpn"):
324
334
  raise click.ClickException("Install OpenVPN first (macOS: brew install openvpn; Linux: your package manager).")
325
- if not profile.get("username") or not profile.get("password"):
335
+ if _guard(vpn.uses_credentials, profile["config"]) and not (profile.get("username") and profile.get("password")):
326
336
  raise click.ClickException("Missing credentials; run evo openvpn credentials PROFILE.")
327
337
  if _guard(vpn.request, name)["state"] != "STOPPED":
328
338
  raise click.ClickException("This profile already has a worker; use status or disconnect first.")
@@ -178,6 +178,11 @@ def validate_config(text):
178
178
  return remotes
179
179
 
180
180
 
181
+ def uses_credentials(text):
182
+ """Whether OpenVPN will ask for a username and password; a certificate-only profile never does."""
183
+ return any(words[0].removeprefix("--") == "auth-user-pass" for _, words in _directives(text))
184
+
185
+
181
186
  def takes_default_route(text):
182
187
  """Whether a profile may take the default route. Only split-tunnel profiles can run beside another VPN.
183
188
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evo_cli
3
- Version: 0.31.0
3
+ Version: 0.31.1
4
4
  Summary: Evolution CLI - a developer toolbox for setting up dev machines
5
5
  Author: maycuatroi
6
6
  Project-URL: Homepage, https://github.com/maycuatroi/evo-cli
@@ -126,6 +126,21 @@ def test_split_tunnel_is_only_what_provably_keeps_the_default_route(extra, full)
126
126
  assert vpn.takes_default_route(CONFIG + extra) is full
127
127
 
128
128
 
129
+ CERT_ONLY = CONFIG.replace("auth-user-pass\n", "")
130
+
131
+
132
+ @pytest.mark.parametrize(
133
+ "config,expected",
134
+ [
135
+ (CONFIG, True),
136
+ (CERT_ONLY, False),
137
+ (CERT_ONLY + "<key>\nauth-user-pass\n</key>\n", False),
138
+ ],
139
+ )
140
+ def test_only_auth_user_pass_asks_for_credentials(config, expected):
141
+ assert vpn.uses_credentials(config) is expected
142
+
143
+
129
144
  @pytest.mark.parametrize(
130
145
  "platform,output,gateway",
131
146
  [
@@ -450,6 +465,35 @@ def test_connect_stacks_a_split_tunnel_beside_a_full_one_only(store, monkeypatch
450
465
  assert "default route" not in result.output and started, result.output
451
466
 
452
467
 
468
+ def test_cert_only_profile_connects_and_lists_without_credentials(store, monkeypatch):
469
+ vpn.save_profile("cert", {"config": CERT_ONLY})
470
+ vpn.save_profile("login", {"config": CONFIG})
471
+ monkeypatch.setattr(vpn, "request", lambda name, command="status": {"state": "STOPPED"})
472
+ monkeypatch.setattr("evo_cli.commands.openvpn.shutil.which", lambda _: "/fake/openvpn")
473
+ monkeypatch.setattr("evo_cli.commands.openvpn.os.geteuid", lambda: 0)
474
+ started = []
475
+
476
+ class Exited:
477
+ def __init__(self):
478
+ self.stdin = io.BytesIO()
479
+
480
+ def poll(self):
481
+ return 1
482
+
483
+ monkeypatch.setattr(
484
+ "evo_cli.commands.openvpn.subprocess.Popen", lambda command, **_: started.append(command) or Exited()
485
+ )
486
+ runner = CliRunner()
487
+ result = runner.invoke(cli, ["openvpn", "connect", "login", "--no-watch"])
488
+ assert result.exit_code != 0 and "Missing credentials" in result.output and not started
489
+ result = runner.invoke(cli, ["openvpn", "connect", "cert", "--no-watch"])
490
+ assert "Missing credentials" not in result.output and started, result.output
491
+ rows = {
492
+ line.split()[1]: line.split()[-2] for line in runner.invoke(cli, ["openvpn", "list"]).output.splitlines()[1:3]
493
+ }
494
+ assert rows == {"cert": "cert", "login": "no"}
495
+
496
+
453
497
  def test_pick_profile_by_number_single_or_prompt(store, monkeypatch):
454
498
  runner = CliRunner()
455
499
  totp = vpn.parse_totp(SECRET)
@@ -1 +0,0 @@
1
- 0.31.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes