kiwi-code 0.0.507__tar.gz → 0.0.509__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 (143) hide show
  1. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/PKG-INFO +1 -1
  2. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/pyproject.toml +1 -1
  3. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/autoupdate.py +24 -10
  4. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/main.py +4 -1
  5. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_autoupdate.py +37 -1
  6. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/uv.lock +1 -1
  7. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/.github/workflows/publish.yml +0 -0
  8. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/.github/workflows/test.yml +0 -0
  9. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/.gitignore +0 -0
  10. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/.python-version +0 -0
  11. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/Makefile +0 -0
  12. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/README.md +0 -0
  13. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/docs/runtime_audit.html +0 -0
  14. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/docs/social_login_e2e.md +0 -0
  15. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/scripts/set_edition.py +0 -0
  16. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/scripts/ws_auth_check.py +0 -0
  17. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/common/__init__.py +0 -0
  18. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/common/banner.py +0 -0
  19. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/__init__.py +0 -0
  20. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/_edition.py +0 -0
  21. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/auth.py +0 -0
  22. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/autocode.py +0 -0
  23. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/checkpoints.py +0 -0
  24. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/cli.py +0 -0
  25. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/client.py +0 -0
  26. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/commands.py +0 -0
  27. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/edition.py +0 -0
  28. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/human_questions.py +0 -0
  29. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/io_threads.py +0 -0
  30. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/logger.py +0 -0
  31. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/models.py +0 -0
  32. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/oauth.py +0 -0
  33. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/run_activity.py +0 -0
  34. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/runtime_manager.py +0 -0
  35. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/server.py +0 -0
  36. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/subagents.py +0 -0
  37. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_cli/terminal_mode.py +0 -0
  38. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/__init__.py +0 -0
  39. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/__main__.py +0 -0
  40. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/auth.py +0 -0
  41. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/checkpoints.py +0 -0
  42. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/cli.py +0 -0
  43. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/commands.py +0 -0
  44. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/constants.py +0 -0
  45. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/__init__.py +0 -0
  46. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/batch.py +0 -0
  47. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/codelens.py +0 -0
  48. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/context.py +0 -0
  49. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/edits.py +0 -0
  50. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/handler.py +0 -0
  51. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/paths.py +0 -0
  52. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/read.py +0 -0
  53. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/search.py +0 -0
  54. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/text.py +0 -0
  55. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/upload.py +0 -0
  56. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/fs/write.py +0 -0
  57. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/handlers.py +0 -0
  58. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/link.py +0 -0
  59. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/main.py +0 -0
  60. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/restricted.py +0 -0
  61. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/sessions.py +0 -0
  62. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/state.py +0 -0
  63. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/tui_bridge.py +0 -0
  64. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/ui.py +0 -0
  65. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_runtime/uploads.py +0 -0
  66. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/__init__.py +0 -0
  67. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/attention.py +0 -0
  68. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/inline_file_picker.py +0 -0
  69. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/latex_unicode.py +0 -0
  70. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/random_words.py +0 -0
  71. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/role_mode.py +0 -0
  72. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/runtime_agent.py +0 -0
  73. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/__init__.py +0 -0
  74. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/attach_content.py +0 -0
  75. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/command_result.py +0 -0
  76. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/detach_files.py +0 -0
  77. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/file_browser.py +0 -0
  78. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/help.py +0 -0
  79. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/id_picker.py +0 -0
  80. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/login.py +0 -0
  81. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/runtime_cleanup.py +0 -0
  82. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/runtime_logs.py +0 -0
  83. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/slash_picker.py +0 -0
  84. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_activity_view.py +0 -0
  85. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_dashboard.py +0 -0
  86. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_dashboard_css.py +0 -0
  87. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_dashboard_helpers.py +0 -0
  88. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_dashboard_widgets.py +0 -0
  89. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_question_widgets.py +0 -0
  90. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_status_line.py +0 -0
  91. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/screens/term_subagent_widgets.py +0 -0
  92. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/slash_commands.py +0 -0
  93. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/status_words.py +0 -0
  94. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/term_app.py +0 -0
  95. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/terminal_theme.py +0 -0
  96. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/ui_settings.py +0 -0
  97. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/widgets.py +0 -0
  98. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/src/kiwi_tui/worktrees.py +0 -0
  99. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/test_hello.py +0 -0
  100. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/__init__.py +0 -0
  101. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/conftest.py +0 -0
  102. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_account_server.py +0 -0
  103. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_attention.py +0 -0
  104. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_autocode_actions.py +0 -0
  105. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_batch_fs_tool.py +0 -0
  106. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_checkpoints.py +0 -0
  107. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_cli_help.py +0 -0
  108. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_command_tips.py +0 -0
  109. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_copy_path_fs_tool.py +0 -0
  110. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_fs_edit_fidelity.py +0 -0
  111. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_human_questions.py +0 -0
  112. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_imports.py +0 -0
  113. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_io_threads.py +0 -0
  114. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_login_social.py +0 -0
  115. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_math_and_tables.py +0 -0
  116. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_oauth.py +0 -0
  117. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_read_file_streaming.py +0 -0
  118. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_reexec_kiwi.py +0 -0
  119. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_reply_selection.py +0 -0
  120. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_role_mode_injection.py +0 -0
  121. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_run_activity.py +0 -0
  122. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_run_steering.py +0 -0
  123. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_cleanup_per_account.py +0 -0
  124. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_connection.py +0 -0
  125. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_edit_diffs.py +0 -0
  126. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_fixes.py +0 -0
  127. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_imports_on_windows.py +0 -0
  128. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_log_trimming.py +0 -0
  129. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_runtime_social_login.py +0 -0
  130. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_search_in_files_fs_tool.py +0 -0
  131. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_slash_commands.py +0 -0
  132. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_stats_command.py +0 -0
  133. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_status_line.py +0 -0
  134. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_subagents.py +0 -0
  135. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_term_dashboard_ui.py +0 -0
  136. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_terminal_mode.py +0 -0
  137. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_terminal_theme.py +0 -0
  138. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_toasts.py +0 -0
  139. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_tokens.py +0 -0
  140. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_tui_interactive_runtime.py +0 -0
  141. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_tui_palette.py +0 -0
  142. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_unified_diff.py +0 -0
  143. {kiwi_code-0.0.507 → kiwi_code-0.0.509}/tests/test_worktrees.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: kiwi-code
3
- Version: 0.0.507
3
+ Version: 0.0.509
4
4
  Summary: A textual-based terminal user interface application
5
5
  Project-URL: Homepage, https://kiwicode.ai
6
6
  Author-email: Anurag <anurag@meetkiwi.co>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kiwi-code"
3
- version = "0.0.507"
3
+ version = "0.0.509"
4
4
  description = "A textual-based terminal user interface application"
5
5
  readme = {file = "README.md", content-type = "text/markdown"}
6
6
  requires-python = ">=3.11,<4.0"
@@ -14,8 +14,10 @@ cannot be replaced), a start that is not interactive, or when turned off with
14
14
  """
15
15
  from __future__ import annotations
16
16
 
17
+ import importlib.util
17
18
  import json
18
19
  import os
20
+ import shutil
19
21
  import subprocess
20
22
  import sys
21
23
  import time
@@ -87,13 +89,17 @@ def record_latest(version: str) -> None:
87
89
  _write_state(latest=str(version), checked_at=time.time())
88
90
 
89
91
 
90
- def newer(latest: str, current: str) -> bool:
91
- try:
92
- from packaging.version import Version
92
+ def _release(version: str) -> tuple[int, ...] | None:
93
+ """A release version as numbers: kiwi's are always "1.2.3" (scripts/set_edition.py)."""
94
+ parts = str(version or "").strip().split(".")
95
+ return tuple(int(p) for p in parts) if all(p.isdigit() for p in parts) else None
93
96
 
94
- return Version(latest) > Version(current)
95
- except Exception:
96
- return False
97
+
98
+ def newer(latest: str, current: str) -> bool:
99
+ """Whether `latest` is a later release than `current`. Compared here rather than with
100
+ `packaging`, which kiwi does not depend on: an install from PyPI does not have it."""
101
+ a, b = _release(latest), _release(current)
102
+ return a is not None and b is not None and a > b
97
103
 
98
104
 
99
105
  def pending(current: str, *, now: float | None = None) -> str | None:
@@ -150,10 +156,18 @@ def installer(package: str, *, prefix: str | None = None, base_prefix: str | Non
150
156
  return Installer("uv", ("uv", "tool", "upgrade", package), f"uv tool upgrade {package}")
151
157
  if (env / "pipx_metadata.json").exists() or ("pipx" in parts and "venvs" in parts):
152
158
  return Installer("pipx", ("pipx", "upgrade", package), f"pipx upgrade {package}")
153
- return Installer(
154
- "pip", (sys.executable, "-m", "pip", "install", "--upgrade", "--quiet", package),
155
- f"pip install --upgrade {package}",
156
- )
159
+ # A plain virtual environment: with its own pip, or (made by `uv venv`) without one.
160
+ if importlib.util.find_spec("pip") is not None:
161
+ return Installer(
162
+ "pip", (sys.executable, "-m", "pip", "install", "--upgrade", "--quiet", package),
163
+ f"pip install --upgrade {package}",
164
+ )
165
+ if shutil.which("uv"):
166
+ return Installer(
167
+ "uv pip", ("uv", "pip", "install", "--upgrade", "--quiet", "--python", sys.executable, package),
168
+ f"uv pip install --upgrade {package}",
169
+ )
170
+ return None
157
171
 
158
172
 
159
173
  def manual_command(package: str) -> str:
@@ -1206,7 +1206,10 @@ def main() -> int:
1206
1206
  argv = sys.argv[1:]
1207
1207
 
1208
1208
  if "--version" in argv:
1209
- print(f"kiwi {KIWI_CODE_VERSION}")
1209
+ # The package as well: kiwi-ai and kiwi-code are both `kiwi`.
1210
+ from kiwi_cli.edition import BUILD_EDITION
1211
+
1212
+ print(f"{BUILD_EDITION} {KIWI_CODE_VERSION}")
1210
1213
  return 0
1211
1214
 
1212
1215
  if argv and argv[0] in {"alt", "term"}:
@@ -3,6 +3,7 @@ next start, with the tool kiwi was installed with, and the new version is starte
3
3
  from __future__ import annotations
4
4
 
5
5
  import subprocess
6
+ import sys
6
7
  import time
7
8
  import types
8
9
 
@@ -27,15 +28,26 @@ def home(isolated_home, monkeypatch):
27
28
  return isolated_home
28
29
 
29
30
 
30
- def test_each_install_is_updated_with_its_own_tool(home) -> None:
31
+ def test_each_install_is_updated_with_its_own_tool(home, monkeypatch) -> None:
31
32
  uv = autoupdate.installer("kiwi-code", prefix=UV_TOOL, base_prefix="/usr", platform="linux")
32
33
  assert uv.command == ("uv", "tool", "upgrade", "kiwi-code")
33
34
  pipx = autoupdate.installer("kiwi-code", prefix=PIPX, base_prefix="/usr", platform="darwin")
34
35
  assert pipx.command == ("pipx", "upgrade", "kiwi-code")
36
+ monkeypatch.setattr(autoupdate.importlib.util, "find_spec", lambda name: object()) # has pip
35
37
  venv = autoupdate.installer("kiwi-code", prefix="/proj/.venv", base_prefix="/usr", platform="linux")
36
38
  assert venv.name == "pip" and venv.command[-1] == "kiwi-code" and "--upgrade" in venv.command
37
39
 
38
40
 
41
+ def test_a_virtual_environment_without_pip_is_updated_with_uv_or_not_at_all(home, monkeypatch) -> None:
42
+ monkeypatch.setattr(autoupdate.importlib.util, "find_spec", lambda name: None)
43
+ monkeypatch.setattr(autoupdate.shutil, "which", lambda name: "/usr/bin/uv")
44
+ venv = autoupdate.installer("kiwi-code", prefix="/proj/.venv", base_prefix="/usr", platform="linux")
45
+ assert venv.command[:3] == ("uv", "pip", "install") and venv.command[-1] == "kiwi-code"
46
+ assert ("--python", autoupdate.sys.executable) == venv.command[-3:-1]
47
+ monkeypatch.setattr(autoupdate.shutil, "which", lambda name: None)
48
+ assert autoupdate.installer("kiwi-code", prefix="/proj/.venv", base_prefix="/usr", platform="linux") is None
49
+
50
+
39
51
  def test_a_tool_folder_kept_elsewhere_is_known_by_the_file_the_tool_leaves(home, tmp_path) -> None:
40
52
  uv, pipx = tmp_path / "tools" / "kiwi-code", tmp_path / "apps" / "kiwi-code"
41
53
  uv.mkdir(parents=True)
@@ -221,3 +233,27 @@ async def test_pypi_is_asked_about_the_installed_package(home, monkeypatch) -> N
221
233
  assert asked == ["https://pypi.org/pypi/kiwi-code/json"]
222
234
  assert autoupdate._read_all() == {"kiwi-code": {"latest": "99.0.0", "checked_at": pytest.approx(time.time(), abs=60)}}
223
235
  assert "v99.0.0" in screen._upgrade_tip
236
+
237
+
238
+ def test_the_version_names_the_package(monkeypatch, capsys) -> None:
239
+ from kiwi_cli import edition
240
+ from kiwi_tui import main
241
+
242
+ monkeypatch.setattr(edition, "BUILD_EDITION", "kiwi-code")
243
+ monkeypatch.setattr(main, "KIWI_CODE_VERSION", "0.0.508")
244
+ monkeypatch.setattr(main, "_reexec_as_kiwi", lambda: None)
245
+ monkeypatch.setattr(main.sys, "argv", ["kiwi", "--version"])
246
+ assert main.main() == 0
247
+ assert capsys.readouterr().out == "kiwi-code 0.0.508\n"
248
+
249
+
250
+ def test_versions_are_compared_without_packaging(monkeypatch) -> None:
251
+ # An install from PyPI does not have `packaging` (kiwi does not depend on it).
252
+ monkeypatch.setitem(sys.modules, "packaging", None)
253
+ monkeypatch.setitem(sys.modules, "packaging.version", None)
254
+ assert autoupdate.newer("0.0.508", "0.0.507")
255
+ assert autoupdate.newer("0.0.10", "0.0.9") # by number, not as text
256
+ assert autoupdate.newer("0.1.0", "0.0.999")
257
+ assert not autoupdate.newer("0.0.507", "0.0.507")
258
+ assert not autoupdate.newer("0.0.506", "0.0.507")
259
+ assert not autoupdate.newer("0.0.508rc1", "0.0.507") and not autoupdate.newer("", "0.0.507")
@@ -412,7 +412,7 @@ wheels = [
412
412
 
413
413
  [[package]]
414
414
  name = "kiwi-code"
415
- version = "0.0.507"
415
+ version = "0.0.509"
416
416
  source = { editable = "." }
417
417
  dependencies = [
418
418
  { name = "codeglass" },
File without changes
File without changes
File without changes
File without changes
File without changes