quantalogic 0.50.5__tar.gz → 0.50.6__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 (147) hide show
  1. {quantalogic-0.50.5 → quantalogic-0.50.6}/PKG-INFO +1 -1
  2. {quantalogic-0.50.5 → quantalogic-0.50.6}/pyproject.toml +1 -1
  3. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/__init__.py +3 -3
  4. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/database/sql_query_tool_advanced.py +20 -3
  5. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/sql_query_tool.py +25 -8
  6. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/utils/create_sample_database.py +64 -7
  7. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/utils/generate_database_report.py +38 -5
  8. {quantalogic-0.50.5 → quantalogic-0.50.6}/LICENSE +0 -0
  9. {quantalogic-0.50.5 → quantalogic-0.50.6}/README.md +0 -0
  10. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/__init__.py +0 -0
  11. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/agent.py +0 -0
  12. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/agent_config.py +0 -0
  13. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/agent_factory.py +0 -0
  14. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/coding_agent.py +0 -0
  15. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/config.py +0 -0
  16. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/console_print_events.py +0 -0
  17. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/console_print_token.py +0 -0
  18. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/docs_cli.py +0 -0
  19. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/event_emitter.py +0 -0
  20. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/__init__.py +0 -0
  21. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/flow.py +0 -0
  22. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/flow_extractor.py +0 -0
  23. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/flow_generator.py +0 -0
  24. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/flow_manager.py +0 -0
  25. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/flow_manager_schema.py +0 -0
  26. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/flow/flow_yaml.md +0 -0
  27. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/generative_model.py +0 -0
  28. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/get_model_info.py +0 -0
  29. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/interactive_text_editor.py +0 -0
  30. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/main.py +0 -0
  31. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/memory.py +0 -0
  32. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/model_info.py +0 -0
  33. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/model_info_list.py +0 -0
  34. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/model_info_litellm.py +0 -0
  35. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/model_names.py +0 -0
  36. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/prompts.py +0 -0
  37. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/quantlitellm.py +0 -0
  38. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/search_agent.py +0 -0
  39. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/__init__.py +0 -0
  40. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/agent_server.py +0 -0
  41. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/models.py +0 -0
  42. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/routes.py +0 -0
  43. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/state.py +0 -0
  44. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/static/js/event_visualizer.js +0 -0
  45. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/static/js/quantalogic.js +0 -0
  46. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/server/templates/index.html +0 -0
  47. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/task_file_reader.py +0 -0
  48. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/task_runner.py +0 -0
  49. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tool_manager.py +0 -0
  50. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/agent_tool.py +0 -0
  51. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/composio/composio.py +0 -0
  52. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/database/generate_database_report_tool.py +0 -0
  53. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_docx_tool.py +0 -0
  54. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_epub_tool.py +0 -0
  55. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_html_tool.py +0 -0
  56. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_ipynb_tool.py +0 -0
  57. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_latex_tool.py +0 -0
  58. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_pdf_tool.py +0 -0
  59. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/document_tools/markdown_to_pptx_tool.py +0 -0
  60. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/download_http_file_tool.py +0 -0
  61. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/duckduckgo_search_tool.py +0 -0
  62. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/edit_whole_content_tool.py +0 -0
  63. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/elixir_tool.py +0 -0
  64. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/execute_bash_command_tool.py +0 -0
  65. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/alpha_vantage_tool.py +0 -0
  66. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/ccxt_tool.py +0 -0
  67. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/finance_llm_tool.py +0 -0
  68. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/google_finance.py +0 -0
  69. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/market_intelligence_tool.py +0 -0
  70. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/technical_analysis_tool.py +0 -0
  71. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/tradingview_tool.py +0 -0
  72. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/finance/yahoo_finance.py +0 -0
  73. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/git/bitbucket_clone_repo_tool.py +0 -0
  74. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/git/bitbucket_operations_tool.py +0 -0
  75. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/git/clone_repo_tool.py +0 -0
  76. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/git/git_operations_tool.py +0 -0
  77. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/google_packages/google_news_tool.py +0 -0
  78. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/grep_app_tool.py +0 -0
  79. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/image_generation/dalle_e.py +0 -0
  80. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/input_question_tool.py +0 -0
  81. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/jinja_tool.py +0 -0
  82. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/__init__.py +0 -0
  83. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/c_handler.py +0 -0
  84. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/cpp_handler.py +0 -0
  85. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/go_handler.py +0 -0
  86. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/java_handler.py +0 -0
  87. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/javascript_handler.py +0 -0
  88. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/python_handler.py +0 -0
  89. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/rust_handler.py +0 -0
  90. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/scala_handler.py +0 -0
  91. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/language_handlers/typescript_handler.py +0 -0
  92. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/list_directory_tool.py +0 -0
  93. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/llm_tool.py +0 -0
  94. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/llm_vision_tool.py +0 -0
  95. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/markitdown_tool.py +0 -0
  96. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/nasa_packages/models.py +0 -0
  97. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/nasa_packages/nasa_apod_tool.py +0 -0
  98. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/nasa_packages/nasa_neows_tool.py +0 -0
  99. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/nasa_packages/services.py +0 -0
  100. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/nodejs_tool.py +0 -0
  101. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/presentation_tools/presentation_llm_tool.py +0 -0
  102. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/product_hunt/product_hunt_tool.py +0 -0
  103. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/product_hunt/services.py +0 -0
  104. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/python_tool.py +0 -0
  105. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/rag_tool/__init__.py +0 -0
  106. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/rag_tool/document_metadata.py +0 -0
  107. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/rag_tool/query_response.py +0 -0
  108. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/rag_tool/rag_tool.py +0 -0
  109. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/rag_tool/rag_tool_beta.py +0 -0
  110. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/read_file_block_tool.py +0 -0
  111. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/read_file_tool.py +0 -0
  112. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/read_html_tool.py +0 -0
  113. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/replace_in_file_tool.py +0 -0
  114. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/ripgrep_tool.py +0 -0
  115. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/safe_python_interpreter_tool.py +0 -0
  116. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/search_definition_names.py +0 -0
  117. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/sequence_tool.py +0 -0
  118. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/serpapi_search_tool.py +0 -0
  119. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/task_complete_tool.py +0 -0
  120. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/tool.py +0 -0
  121. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/unified_diff_tool.py +0 -0
  122. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/utilities/csv_processor_tool.py +0 -0
  123. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/utilities/download_file_tool.py +0 -0
  124. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/utilities/mermaid_validator_tool.py +0 -0
  125. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/utils/__init__.py +0 -0
  126. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/wikipedia_search_tool.py +0 -0
  127. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/tools/write_file_tool.py +0 -0
  128. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/__init__.py +0 -0
  129. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/ask_user_validation.py +0 -0
  130. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/async_utils.py +0 -0
  131. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/check_version.py +0 -0
  132. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/download_http_file.py +0 -0
  133. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/get_all_models.py +0 -0
  134. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/get_coding_environment.py +0 -0
  135. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/get_environment.py +0 -0
  136. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/get_quantalogic_rules_content.py +0 -0
  137. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/git_ls.py +0 -0
  138. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/lm_studio_model_info.py +0 -0
  139. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/python_interpreter.py +0 -0
  140. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/read_file.py +0 -0
  141. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/read_http_text_content.py +0 -0
  142. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/utils/xml_utility.py +0 -0
  143. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/version.py +0 -0
  144. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/version_check.py +0 -0
  145. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/welcome_message.py +0 -0
  146. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/xml_parser.py +0 -0
  147. {quantalogic-0.50.5 → quantalogic-0.50.6}/quantalogic/xml_tool_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantalogic
3
- Version: 0.50.5
3
+ Version: 0.50.6
4
4
  Summary: QuantaLogic ReAct Agents
5
5
  Author: Raphaël MANSUY
6
6
  Author-email: raphael.mansuy@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "quantalogic"
3
- version = "0.50.5"
3
+ version = "0.50.6"
4
4
  description = "QuantaLogic ReAct Agents"
5
5
  authors = ["Raphaël MANSUY <raphael.mansuy@gmail.com>"]
6
6
  readme = "README.md"
@@ -33,8 +33,8 @@ class LazyLoader:
33
33
  _TOOL_IMPORTS = {
34
34
  "AgentTool": (".agent_tool", False),
35
35
  "ComposioTool": (".composio.composio", True),
36
- "GenerateDatabaseReportTool": (".database.generate_database_report_tool", False),
37
- "SQLQueryToolAdvanced": (".database.sql_query_tool_advanced", False),
36
+ "GenerateDatabaseReportTool": (".database.generate_database_report_tool", True),
37
+ "SQLQueryToolAdvanced": (".database.sql_query_tool_advanced", True),
38
38
  "MarkdownToDocxTool": (".document_tools.markdown_to_docx_tool", True),
39
39
  "MarkdownToEpubTool": (".document_tools.markdown_to_epub_tool", True),
40
40
  "MarkdownToHtmlTool": (".document_tools.markdown_to_html_tool", True),
@@ -76,7 +76,7 @@ _TOOL_IMPORTS = {
76
76
  "SearchDefinitionNames": (".search_definition_names", False),
77
77
  "SequenceTool": (".sequence_tool", False),
78
78
  "SerpApiSearchTool": (".serpapi_search_tool", False),
79
- "SQLQueryTool": (".sql_query_tool", False),
79
+ "SQLQueryTool": (".sql_query_tool", True),
80
80
  "TaskCompleteTool": (".task_complete_tool", False),
81
81
  "Tool": (".tool", False),
82
82
  "ToolArgument": (".tool", False),
@@ -1,13 +1,27 @@
1
1
  """Tool for executing SQL queries and performing database operations with safety checks."""
2
2
 
3
+ import importlib.util
3
4
  import json
4
5
  from enum import Enum
5
- from typing import Any, Dict, List, Optional
6
+ from typing import Any, Dict, List, Optional, TYPE_CHECKING
6
7
 
7
8
  from loguru import logger
8
9
  from pydantic import Field
9
- from sqlalchemy import create_engine, inspect, text
10
- from sqlalchemy.engine import Engine
10
+
11
+ # Check if sqlalchemy is available
12
+ SQLALCHEMY_AVAILABLE = False
13
+ try:
14
+ spec = importlib.util.find_spec("sqlalchemy")
15
+ SQLALCHEMY_AVAILABLE = spec is not None
16
+ if SQLALCHEMY_AVAILABLE:
17
+ from sqlalchemy import create_engine, inspect, text
18
+ from sqlalchemy.engine import Engine
19
+ except ImportError:
20
+ pass
21
+
22
+ # Type checking imports
23
+ if TYPE_CHECKING:
24
+ from sqlalchemy.engine import Engine
11
25
 
12
26
  from quantalogic.tools.tool import Tool, ToolArgument
13
27
 
@@ -72,6 +86,9 @@ class SQLQueryToolAdvanced(Tool):
72
86
 
73
87
  def __init__(self, **data):
74
88
  super().__init__(**data)
89
+ if not SQLALCHEMY_AVAILABLE:
90
+ raise ImportError("The 'sqlalchemy' package is required to use SQLQueryToolAdvanced. "
91
+ "Install it with 'pip install sqlalchemy' or include it in your dependencies.")
75
92
  self._engine = create_engine(self.connection_string)
76
93
  logger.info(f"Initialized SQL tool with engine for {self.connection_string}")
77
94
 
@@ -1,10 +1,20 @@
1
1
  """Tool for executing SQL queries and returning paginated results in markdown format."""
2
2
 
3
- from typing import Any, Dict, List
3
+ import importlib.util
4
+ from typing import Any, Dict, List, TYPE_CHECKING
4
5
 
5
6
  from pydantic import Field, ValidationError
6
- from sqlalchemy import create_engine, text
7
- from sqlalchemy.exc import SQLAlchemyError
7
+
8
+ # Check if sqlalchemy is available
9
+ SQLALCHEMY_AVAILABLE = False
10
+ try:
11
+ spec = importlib.util.find_spec("sqlalchemy")
12
+ SQLALCHEMY_AVAILABLE = spec is not None
13
+ if SQLALCHEMY_AVAILABLE:
14
+ from sqlalchemy import create_engine, text
15
+ from sqlalchemy.exc import SQLAlchemyError
16
+ except ImportError:
17
+ pass
8
18
 
9
19
  from quantalogic.tools.tool import Tool, ToolArgument
10
20
 
@@ -63,7 +73,13 @@ class SQLQueryTool(Tool):
63
73
  Raises:
64
74
  ValueError: For invalid parameters or query errors
65
75
  RuntimeError: For database connection issues
76
+ ImportError: When sqlalchemy is not available
66
77
  """
78
+ # Check if required dependencies are available
79
+ if not SQLALCHEMY_AVAILABLE:
80
+ raise ImportError("The 'sqlalchemy' package is required to use SQLQueryTool. "
81
+ "Install it with 'pip install sqlalchemy' or include it in your dependencies.")
82
+
67
83
  try:
68
84
  # Convert and validate row numbers
69
85
  start = self._convert_row_number(start_row, "start_row")
@@ -105,12 +121,13 @@ class SQLQueryTool(Tool):
105
121
 
106
122
  return "\n".join(markdown)
107
123
 
108
- except SQLAlchemyError as e:
109
- raise ValueError(f"SQL Error: {str(e)}") from e
110
- except ValidationError as e:
111
- raise ValueError(f"Validation Error: {str(e)}") from e
112
124
  except Exception as e:
113
- raise RuntimeError(f"Database Error: {str(e)}") from e
125
+ if SQLALCHEMY_AVAILABLE and isinstance(e, SQLAlchemyError):
126
+ raise ValueError(f"SQL Error: {str(e)}") from e
127
+ elif isinstance(e, ValidationError):
128
+ raise ValueError(f"Validation Error: {str(e)}") from e
129
+ else:
130
+ raise RuntimeError(f"Database Error: {str(e)}") from e
114
131
 
115
132
  def _convert_row_number(self, value: Any, field_name: str) -> int:
116
133
  """Convert and validate row number input."""
@@ -1,12 +1,62 @@
1
+ import importlib.util
1
2
  import random
2
3
  from datetime import datetime, timedelta
3
-
4
- from faker import Faker
5
- from sqlalchemy import Column, Date, Float, ForeignKey, Integer, String, create_engine
6
- from sqlalchemy.orm import declarative_base, relationship, sessionmaker
7
-
8
- Base = declarative_base()
9
- fake = Faker()
4
+ from typing import Optional
5
+
6
+ # Check if faker is available
7
+ FAKER_AVAILABLE = False
8
+ try:
9
+ spec = importlib.util.find_spec("faker")
10
+ FAKER_AVAILABLE = spec is not None
11
+ except ImportError:
12
+ pass
13
+
14
+ # Check if sqlalchemy is available
15
+ SQLALCHEMY_AVAILABLE = False
16
+ try:
17
+ spec = importlib.util.find_spec("sqlalchemy")
18
+ SQLALCHEMY_AVAILABLE = spec is not None
19
+ except ImportError:
20
+ pass
21
+
22
+ # Only import if available
23
+ if FAKER_AVAILABLE:
24
+ from faker import Faker
25
+ else:
26
+ # Create a dummy Faker class
27
+ class Faker:
28
+ def __init__(self):
29
+ pass
30
+
31
+ def name(self) -> str:
32
+ return "Sample Name"
33
+
34
+ def email(self) -> str:
35
+ return "sample@example.com"
36
+
37
+ def street_address(self) -> str:
38
+ return "123 Sample St"
39
+
40
+ def city(self) -> str:
41
+ return "Sample City"
42
+
43
+ def word(self) -> str:
44
+ return "sample"
45
+
46
+ def date_between(self, start_date: datetime) -> datetime:
47
+ return start_date + timedelta(days=random.randint(1, 365))
48
+
49
+ if SQLALCHEMY_AVAILABLE:
50
+ from sqlalchemy import Column, Date, Float, ForeignKey, Integer, String, create_engine
51
+ from sqlalchemy.orm import declarative_base, relationship, sessionmaker
52
+
53
+ # Initialize these only if the required modules are available
54
+ Base = None
55
+ fake = None
56
+ if SQLALCHEMY_AVAILABLE:
57
+ Base = declarative_base()
58
+ if FAKER_AVAILABLE:
59
+ fake = Faker()
10
60
 
11
61
 
12
62
  def create_sample_database(db_path: str) -> None:
@@ -16,6 +66,13 @@ def create_sample_database(db_path: str) -> None:
16
66
  Args:
17
67
  db_path: Path to the SQLite database file (e.g., 'sample.db')
18
68
  """
69
+ # Check if required dependencies are available
70
+ if not SQLALCHEMY_AVAILABLE:
71
+ raise ImportError("The 'sqlalchemy' package is required to use create_sample_database. "
72
+ "Install it with 'pip install sqlalchemy' or include it in your dependencies.")
73
+ if not FAKER_AVAILABLE:
74
+ raise ImportError("The 'faker' package is required to use create_sample_database. "
75
+ "Install it with 'pip install faker' or include it in your dependencies.")
19
76
 
20
77
  # Define database schema
21
78
  class Customer(Base):
@@ -1,9 +1,34 @@
1
+ import importlib.util
1
2
  from datetime import UTC, datetime
2
- from typing import Dict, List
3
-
4
- import networkx as nx
5
- from sqlalchemy import create_engine, inspect, text
6
- from sqlalchemy.engine import Inspector
3
+ from typing import Any, Dict, List, Optional, TYPE_CHECKING
4
+
5
+ # Check if networkx is available
6
+ NETWORKX_AVAILABLE = False
7
+ try:
8
+ spec = importlib.util.find_spec("networkx")
9
+ NETWORKX_AVAILABLE = spec is not None
10
+ except ImportError:
11
+ pass
12
+
13
+ # Check if sqlalchemy is available
14
+ SQLALCHEMY_AVAILABLE = False
15
+ try:
16
+ spec = importlib.util.find_spec("sqlalchemy")
17
+ SQLALCHEMY_AVAILABLE = spec is not None
18
+ except ImportError:
19
+ pass
20
+
21
+ # Only import if available
22
+ if NETWORKX_AVAILABLE:
23
+ import networkx as nx
24
+ if SQLALCHEMY_AVAILABLE:
25
+ from sqlalchemy import create_engine, inspect, text
26
+ from sqlalchemy.engine import Inspector
27
+
28
+ # Type checking imports
29
+ if TYPE_CHECKING:
30
+ import networkx as nx
31
+ from sqlalchemy.engine import Inspector
7
32
 
8
33
 
9
34
  def generate_database_report(connection_string: str) -> str:
@@ -16,6 +41,14 @@ def generate_database_report(connection_string: str) -> str:
16
41
  Returns:
17
42
  Markdown-formatted report as a string
18
43
  """
44
+ # Check if required dependencies are available
45
+ if not SQLALCHEMY_AVAILABLE:
46
+ raise ImportError("The 'sqlalchemy' package is required to use generate_database_report. "
47
+ "Install it with 'pip install sqlalchemy' or include it in your dependencies.")
48
+ if not NETWORKX_AVAILABLE:
49
+ raise ImportError("The 'networkx' package is required to use generate_database_report. "
50
+ "Install it with 'pip install networkx' or include it in your dependencies.")
51
+
19
52
  # Setup database connection and inspection
20
53
  engine = create_engine(connection_string)
21
54
  inspector = inspect(engine)
File without changes
File without changes