sqlsaber 0.30.0__tar.gz → 0.30.2__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 sqlsaber might be problematic. Click here for more details.

Files changed (122) hide show
  1. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/PKG-INFO +2 -1
  2. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/changelog.md +12 -2
  3. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/pyproject.toml +4 -3
  4. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/api_keys.py +1 -1
  5. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/oauth_tokens.py +2 -2
  6. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/settings.py +1 -0
  7. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/uv.lock +966 -852
  8. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.github/workflows/claude-code-review.yml +0 -0
  9. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.github/workflows/claude.yml +0 -0
  10. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.github/workflows/deploy-docs.yml +0 -0
  11. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.github/workflows/publish.yml +0 -0
  12. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.github/workflows/test.yml +0 -0
  13. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.gitignore +0 -0
  14. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/.python-version +0 -0
  15. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/AGENT.md +0 -0
  16. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/CLAUDE.md +0 -0
  17. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/LICENSE +0 -0
  18. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/README.md +0 -0
  19. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/.gitignore +0 -0
  20. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/.vscode/extensions.json +0 -0
  21. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/.vscode/launch.json +0 -0
  22. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/CLAUDE.md +0 -0
  23. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/astro.config.mjs +0 -0
  24. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/package-lock.json +0 -0
  25. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/package.json +0 -0
  26. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/public/CNAME +0 -0
  27. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/public/favicon.svg +0 -0
  28. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/assets/sqlsaber.gif +0 -0
  29. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/authentication.mdx +0 -0
  30. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/database-setup.mdx +0 -0
  31. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/getting-started.mdx +0 -0
  32. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/memory.mdx +0 -0
  33. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/models.mdx +0 -0
  34. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/queries.mdx +0 -0
  35. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/guides/threads.md +0 -0
  36. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/index.mdx +0 -0
  37. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/installation.mdx +0 -0
  38. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content/docs/reference/commands.md +0 -0
  39. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/content.config.ts +0 -0
  40. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/src/styles/global.css +0 -0
  41. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/docs/tsconfig.json +0 -0
  42. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/legislators.db +0 -0
  43. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/pytest.ini +0 -0
  44. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/sqlsaber.gif +0 -0
  45. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/sqlsaber.svg +0 -0
  46. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/__init__.py +0 -0
  47. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/__main__.py +0 -0
  48. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/agents/__init__.py +0 -0
  49. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/agents/base.py +0 -0
  50. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/agents/pydantic_ai_agent.py +0 -0
  51. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/application/__init__.py +0 -0
  52. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/application/auth_setup.py +0 -0
  53. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/application/db_setup.py +0 -0
  54. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/application/model_selection.py +0 -0
  55. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/application/prompts.py +0 -0
  56. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/__init__.py +0 -0
  57. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/auth.py +0 -0
  58. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/commands.py +0 -0
  59. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/completers.py +0 -0
  60. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/database.py +0 -0
  61. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/display.py +0 -0
  62. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/interactive.py +0 -0
  63. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/memory.py +0 -0
  64. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/models.py +0 -0
  65. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/onboarding.py +0 -0
  66. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/streaming.py +0 -0
  67. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/theme.py +0 -0
  68. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/cli/threads.py +0 -0
  69. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/__init__.py +0 -0
  70. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/auth.py +0 -0
  71. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/database.py +0 -0
  72. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/oauth_flow.py +0 -0
  73. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/config/providers.py +0 -0
  74. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/__init__.py +0 -0
  75. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/base.py +0 -0
  76. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/csv.py +0 -0
  77. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/duckdb.py +0 -0
  78. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/mysql.py +0 -0
  79. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/postgresql.py +0 -0
  80. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/resolver.py +0 -0
  81. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/schema.py +0 -0
  82. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/database/sqlite.py +0 -0
  83. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/memory/__init__.py +0 -0
  84. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/memory/manager.py +0 -0
  85. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/memory/storage.py +0 -0
  86. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/theme/__init__.py +0 -0
  87. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/theme/manager.py +0 -0
  88. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/threads/__init__.py +0 -0
  89. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/threads/storage.py +0 -0
  90. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/tools/__init__.py +0 -0
  91. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/tools/base.py +0 -0
  92. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/tools/registry.py +0 -0
  93. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/tools/sql_guard.py +0 -0
  94. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/src/sqlsaber/tools/sql_tools.py +0 -0
  95. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/__init__.py +0 -0
  96. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/conftest.py +0 -0
  97. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_cli/__init__.py +0 -0
  98. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_cli/test_auth_reset.py +0 -0
  99. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_cli/test_commands.py +0 -0
  100. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_cli/test_threads.py +0 -0
  101. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_config/__init__.py +0 -0
  102. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_config/test_database.py +0 -0
  103. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_config/test_oauth.py +0 -0
  104. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_config/test_providers.py +0 -0
  105. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_config/test_settings.py +0 -0
  106. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/__init__.py +0 -0
  107. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_connection.py +0 -0
  108. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_csv_connection.py +0 -0
  109. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_csv_module.py +0 -0
  110. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_duckdb_module.py +0 -0
  111. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_schema.py +0 -0
  112. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_schema_display.py +0 -0
  113. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_sqlite_module.py +0 -0
  114. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database/test_timeout.py +0 -0
  115. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_database_resolver.py +0 -0
  116. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_theme/test_manager.py +0 -0
  117. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_threads_storage.py +0 -0
  118. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_tools/__init__.py +0 -0
  119. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_tools/test_base.py +0 -0
  120. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_tools/test_registry.py +0 -0
  121. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_tools/test_sql_guard.py +0 -0
  122. {sqlsaber-0.30.0 → sqlsaber-0.30.2}/tests/test_tools/test_sql_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sqlsaber
3
- Version: 0.30.0
3
+ Version: 0.30.2
4
4
  Summary: SQLsaber - Open-source agentic SQL assistant
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.12
@@ -11,6 +11,7 @@ Requires-Dist: cyclopts>=3.22.1
11
11
  Requires-Dist: duckdb>=0.9.2
12
12
  Requires-Dist: httpx>=0.28.1
13
13
  Requires-Dist: keyring>=25.6.0
14
+ Requires-Dist: keyrings-cryptfile; sys_platform == 'linux'
14
15
  Requires-Dist: platformdirs>=4.0.0
15
16
  Requires-Dist: prompt-toolkit>3.0.51
16
17
  Requires-Dist: pydantic-ai
@@ -7,8 +7,20 @@ All notable changes to SQLsaber will be documented here.
7
7
 
8
8
  ### Unreleased
9
9
 
10
+ ### v0.30.2
11
+
12
+ #### Changed
13
+
14
+ - Added `keyrings.cryptfile` as Linux-only dependency for better keyring support on Linux systems
15
+
10
16
  ---
11
17
 
18
+ ### v0.30.1 - 2025-10-07
19
+
20
+ #### Fixed
21
+
22
+ - Minor styling fixes
23
+
12
24
  ### v0.30.0 - 2025-10-07
13
25
 
14
26
  #### Removed
@@ -19,8 +31,6 @@ All notable changes to SQLsaber will be documented here.
19
31
  >
20
32
  > Just *ask* the coding agent to invoke `sqlsaber` cli with your question.
21
33
 
22
-
23
-
24
34
  ### v0.29.1 - 2025-10-05
25
35
 
26
36
  #### Fixed
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "sqlsaber"
3
- version = "0.30.0"
3
+ version = "0.30.2"
4
4
  description = "SQLsaber - Open-source agentic SQL assistant"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
@@ -9,6 +9,7 @@ dependencies = [
9
9
  "rich>=13.7.0",
10
10
  "pydantic-ai",
11
11
  "keyring>=25.6.0",
12
+ "keyrings.cryptfile; sys_platform == 'linux'",
12
13
  "platformdirs>=4.0.0",
13
14
  "questionary>=2.1.0",
14
15
  "httpx>=0.28.1",
@@ -20,8 +21,8 @@ dependencies = [
20
21
  "sqlglot[rs]>=27.20.0",
21
22
  ]
22
23
 
23
- [tool.uv]
24
- dev-dependencies = ["ruff>=0.12.0", "pytest>=8.0.0", "pytest-asyncio>=1.0.0"]
24
+ [dependency-groups]
25
+ dev = ["ruff>=0.12.0", "pytest>=8.0.0", "pytest-asyncio>=1.0.0"]
25
26
 
26
27
  [build-system]
27
28
  requires = ["hatchling"]
@@ -36,7 +36,7 @@ class APIKeyManager:
36
36
  return api_key
37
37
  except Exception as e:
38
38
  # Keyring access failed, continue to prompt
39
- console.print(f"Keyring access failed: {e}", style="muted warning")
39
+ console.print(f"Keyring access failed: {e}", style="warning")
40
40
 
41
41
  # 3. Prompt user for API key
42
42
  return self._prompt_and_store_key(provider, env_var_name, service_name)
@@ -97,14 +97,14 @@ class OAuthTokenManager:
97
97
  if token.is_expired():
98
98
  console.print(
99
99
  f"OAuth token for {provider} has expired and needs refresh",
100
- style="muted warning",
100
+ style="muted",
101
101
  )
102
102
  return token # Return anyway for refresh attempt
103
103
 
104
104
  if token.expires_soon():
105
105
  console.print(
106
106
  f"OAuth token for {provider} expires soon, consider refreshing",
107
- style="muted warning",
107
+ style="muted",
108
108
  )
109
109
 
110
110
  return token
@@ -103,6 +103,7 @@ class Config:
103
103
  def __init__(self):
104
104
  self.model_config_manager = ModelConfigManager()
105
105
  self.model_name = self.model_config_manager.get_model()
106
+ self.api_key = None
106
107
  self.api_key_manager = APIKeyManager()
107
108
  self.auth_config_manager = AuthConfigManager()
108
109