local-deep-research 0.4.2__tar.gz → 0.4.3__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 (194) hide show
  1. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/PKG-INFO +1 -1
  2. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/pyproject.toml +1 -1
  3. local_deep_research-0.4.3/src/local_deep_research/__version__.py +1 -0
  4. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/services/settings_manager.py +4 -2
  5. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/search_engines_config.py +3 -11
  6. local_deep_research-0.4.3/tests/conftest.py +119 -0
  7. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/test_settings_manager.py +52 -0
  8. local_deep_research-0.4.2/src/local_deep_research/__version__.py +0 -1
  9. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/LICENSE +0 -0
  10. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/README.md +0 -0
  11. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/__init__.py +0 -0
  12. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/__init__.py +0 -0
  13. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/filters/__init__.py +0 -0
  14. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/filters/base_filter.py +0 -0
  15. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/filters/cross_engine_filter.py +0 -0
  16. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/filters/journal_reputation_filter.py +0 -0
  17. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/findings/base_findings.py +0 -0
  18. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/findings/repository.py +0 -0
  19. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/knowledge/__init__.py +0 -0
  20. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/knowledge/base_knowledge.py +0 -0
  21. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/knowledge/standard_knowledge.py +0 -0
  22. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/questions/__init__.py +0 -0
  23. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/questions/base_question.py +0 -0
  24. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/questions/decomposition_question.py +0 -0
  25. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/questions/standard_question.py +0 -0
  26. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/repositories/__init__.py +0 -0
  27. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/__init__.py +0 -0
  28. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/base_strategy.py +0 -0
  29. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/iterdrag_strategy.py +0 -0
  30. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/parallel_search_strategy.py +0 -0
  31. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/rapid_search_strategy.py +0 -0
  32. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/source_based_strategy.py +0 -0
  33. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/strategies/standard_strategy.py +0 -0
  34. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/tools/__init__.py +0 -0
  35. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/tools/base_tool.py +0 -0
  36. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/tools/knowledge_tools/__init__.py +0 -0
  37. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/tools/question_tools/__init__.py +0 -0
  38. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/advanced_search_system/tools/search_tools/__init__.py +0 -0
  39. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/api/__init__.py +0 -0
  40. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/api/benchmark_functions.py +0 -0
  41. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/api/research_functions.py +0 -0
  42. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/README.md +0 -0
  43. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/__init__.py +0 -0
  44. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/benchmark_functions.py +0 -0
  45. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/cli/__init__.py +0 -0
  46. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/cli/benchmark_commands.py +0 -0
  47. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/cli.py +0 -0
  48. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/comparison/__init__.py +0 -0
  49. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/comparison/evaluator.py +0 -0
  50. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets/__init__.py +0 -0
  51. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets/base.py +0 -0
  52. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets/browsecomp.py +0 -0
  53. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets/custom_dataset_template.py +0 -0
  54. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets/simpleqa.py +0 -0
  55. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets/utils.py +0 -0
  56. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/datasets.py +0 -0
  57. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/efficiency/__init__.py +0 -0
  58. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/efficiency/resource_monitor.py +0 -0
  59. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/efficiency/speed_profiler.py +0 -0
  60. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/evaluators/__init__.py +0 -0
  61. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/evaluators/base.py +0 -0
  62. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/evaluators/browsecomp.py +0 -0
  63. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/evaluators/composite.py +0 -0
  64. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/evaluators/simpleqa.py +0 -0
  65. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/graders.py +0 -0
  66. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/metrics/README.md +0 -0
  67. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/metrics/__init__.py +0 -0
  68. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/metrics/calculation.py +0 -0
  69. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/metrics/reporting.py +0 -0
  70. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/metrics/visualization.py +0 -0
  71. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/metrics.py +0 -0
  72. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/optimization/__init__.py +0 -0
  73. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/optimization/api.py +0 -0
  74. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/optimization/metrics.py +0 -0
  75. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/optimization/optuna_optimizer.py +0 -0
  76. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/runners.py +0 -0
  77. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/benchmarks/templates.py +0 -0
  78. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/citation_handler.py +0 -0
  79. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/config/__init__.py +0 -0
  80. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/config/llm_config.py +0 -0
  81. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/config/search_config.py +0 -0
  82. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/defaults/.env.template +0 -0
  83. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/defaults/__init__.py +0 -0
  84. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/defaults/default_settings.json +0 -0
  85. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/migrate_db.py +0 -0
  86. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/report_generator.py +0 -0
  87. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/search_system.py +0 -0
  88. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/setup_data_dir.py +0 -0
  89. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/test_migration.py +0 -0
  90. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/__init__.py +0 -0
  91. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/db_utils.py +0 -0
  92. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/enums.py +0 -0
  93. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/es_utils.py +0 -0
  94. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/llm_utils.py +0 -0
  95. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/log_utils.py +0 -0
  96. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/search_utilities.py +0 -0
  97. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/setup_utils.py +0 -0
  98. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/utilities/url_utils.py +0 -0
  99. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/__init__.py +0 -0
  100. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/app.py +0 -0
  101. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/app_factory.py +0 -0
  102. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/database/README.md +0 -0
  103. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/database/migrate_to_ldr_db.py +0 -0
  104. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/database/migrations.py +0 -0
  105. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/database/models.py +0 -0
  106. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/database/schema_upgrade.py +0 -0
  107. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/models/database.py +0 -0
  108. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/models/settings.py +0 -0
  109. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/routes/api_routes.py +0 -0
  110. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/routes/benchmark_routes.py +0 -0
  111. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/routes/history_routes.py +0 -0
  112. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/routes/research_routes.py +0 -0
  113. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/routes/settings_routes.py +0 -0
  114. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/services/research_service.py +0 -0
  115. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/services/resource_service.py +0 -0
  116. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/services/settings_service.py +0 -0
  117. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/services/socket_service.py +0 -0
  118. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/css/custom_dropdown.css +0 -0
  119. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/css/settings.css +0 -0
  120. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/css/styles.css +0 -0
  121. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/custom_dropdown.js +0 -0
  122. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/detail.js +0 -0
  123. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/fallback/formatting.js +0 -0
  124. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/fallback/ui.js +0 -0
  125. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/history.js +0 -0
  126. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/logpanel.js +0 -0
  127. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/progress.js +0 -0
  128. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/research.js +0 -0
  129. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/results.js +0 -0
  130. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/settings.js +0 -0
  131. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/components/settings_sync.js +0 -0
  132. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/main.js +0 -0
  133. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/research_form.js +0 -0
  134. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/services/api.js +0 -0
  135. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/services/audio.js +0 -0
  136. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/services/formatting.js +0 -0
  137. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/services/pdf.js +0 -0
  138. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/services/socket.js +0 -0
  139. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/js/services/ui.js +0 -0
  140. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/sounds/README.md +0 -0
  141. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/sounds/error.mp3 +0 -0
  142. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/static/sounds/success.mp3 +0 -0
  143. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/base.html +0 -0
  144. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/components/custom_dropdown.html +0 -0
  145. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/components/log_panel.html +0 -0
  146. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/components/mobile_nav.html +0 -0
  147. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/components/settings_form.html +0 -0
  148. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/components/sidebar.html +0 -0
  149. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/pages/details.html +0 -0
  150. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/pages/history.html +0 -0
  151. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/pages/progress.html +0 -0
  152. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/pages/research.html +0 -0
  153. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/pages/results.html +0 -0
  154. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/templates/settings_dashboard.html +0 -0
  155. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/utils/__init__.py +0 -0
  156. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/utils/formatters.py +0 -0
  157. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web/utils/templates.py +0 -0
  158. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/__init__.py +0 -0
  159. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/default_search_engines.py +0 -0
  160. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/__init__.py +0 -0
  161. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/full_search.py +0 -0
  162. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/meta_search_engine.py +0 -0
  163. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_arxiv.py +0 -0
  164. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_brave.py +0 -0
  165. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_ddg.py +0 -0
  166. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_elasticsearch.py +0 -0
  167. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_github.py +0 -0
  168. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_google_pse.py +0 -0
  169. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_guardian.py +0 -0
  170. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_local.py +0 -0
  171. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_local_all.py +0 -0
  172. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_pubmed.py +0 -0
  173. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_searxng.py +0 -0
  174. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_semantic_scholar.py +0 -0
  175. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_serpapi.py +0 -0
  176. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_wayback.py +0 -0
  177. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/engines/search_engine_wikipedia.py +0 -0
  178. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/search_engine_base.py +0 -0
  179. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/src/local_deep_research/web_search_engines/search_engine_factory.py +0 -0
  180. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/TESTING_PROPOSAL.md +0 -0
  181. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/__init__.py +0 -0
  182. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/download_stuff_for_local_test.py +0 -0
  183. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/feature_tests/IMPLEMENTATION_GUIDE_241.md +0 -0
  184. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/feature_tests/README.md +0 -0
  185. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/feature_tests/__init__.py +0 -0
  186. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/feature_tests/test_custom_context.py +0 -0
  187. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/fix_tests/README.md +0 -0
  188. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/fix_tests/test_duplicate_links_fix.py +0 -0
  189. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/searxng/test_searxng_instance.py +0 -0
  190. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/searxng/test_searxng_integration.py +0 -0
  191. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/test_google_pse.py +0 -0
  192. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/test_url_utils.py +0 -0
  193. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/test_url_utils_debug.py +0 -0
  194. {local_deep_research-0.4.2 → local_deep_research-0.4.3}/tests/test_url_utils_simple.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: local-deep-research
3
- Version: 0.4.2
3
+ Version: 0.4.3
4
4
  Summary: AI-powered research assistant with deep, iterative analysis using LLMs and web searches
5
5
  Author-Email: LearningCircuit <185559241+LearningCircuit@users.noreply.github.com>, HashedViking <6432677+HashedViking@users.noreply.github.com>
6
6
  License: MIT License
@@ -65,7 +65,7 @@ dependencies = [
65
65
  "plotly>=6.0.1",
66
66
  "kaleido==0.1.0",
67
67
  ]
68
- version = "0.4.2"
68
+ version = "0.4.3"
69
69
 
70
70
  [project.license]
71
71
  file = "LICENSE"
@@ -0,0 +1 @@
1
+ __version__ = "0.4.3"
@@ -4,7 +4,7 @@ import os
4
4
  from typing import Any, Dict, Optional, Type, Union
5
5
 
6
6
  from loguru import logger
7
- from sqlalchemy import func
7
+ from sqlalchemy import func, or_
8
8
  from sqlalchemy.exc import SQLAlchemyError
9
9
  from sqlalchemy.orm import Session
10
10
 
@@ -138,7 +138,9 @@ class SettingsManager:
138
138
  settings = (
139
139
  self.db_session.query(Setting)
140
140
  # This will find exact matches and any subkeys.
141
- .filter(Setting.key.startswith(key)).all()
141
+ .filter(
142
+ or_(Setting.key == key, Setting.key.startswith(f"{key}."))
143
+ ).all()
142
144
  )
143
145
  if len(settings) == 1:
144
146
  # This is a bottom-level key.
@@ -4,20 +4,12 @@ Loads search engine definitions from the user's configuration.
4
4
  """
5
5
 
6
6
  import json
7
-
8
- import logging
9
- from typing import Any, Dict, List
10
-
11
- from ..utilities.db_utils import get_db_setting
12
- from .default_search_engines import get_default_elasticsearch_config
13
-
14
- from functools import cache
15
7
  from typing import Any, Dict, List
16
8
 
17
9
  from loguru import logger
18
10
 
19
-
20
11
  from ..utilities.db_utils import get_db_setting
12
+ from .default_search_engines import get_default_elasticsearch_config
21
13
 
22
14
 
23
15
  def _extract_per_engine_config(raw_config: Dict[str, Any]) -> Dict[str, Dict[str, Any]]:
@@ -69,7 +61,7 @@ def search_config() -> Dict[str, Any]:
69
61
  # Add alias for 'auto' if it exists
70
62
  if "auto" in search_engines and "meta" not in search_engines:
71
63
  search_engines["meta"] = search_engines["auto"]
72
-
64
+
73
65
  # Add Elasticsearch search engine if not already present
74
66
  if "elasticsearch" not in search_engines:
75
67
  logger.info("Adding default Elasticsearch search engine configuration")
@@ -91,7 +83,7 @@ def search_config() -> Dict[str, Any]:
91
83
  config["paths"] = json.loads(config["paths"])
92
84
  except json.decoder.JSONDecodeError:
93
85
  logger.error(
94
- f"Invalid paths specified for local collection: "
86
+ f"Path for local collection '{collection}' is not a valid JSON array: "
95
87
  f"{config['paths']}"
96
88
  )
97
89
  config["paths"] = []
@@ -0,0 +1,119 @@
1
+ from typing import Any
2
+
3
+ import pytest
4
+ from sqlalchemy import create_engine
5
+ from sqlalchemy.exc import SQLAlchemyError
6
+ from sqlalchemy.orm import sessionmaker
7
+
8
+ import src.local_deep_research.utilities.db_utils as db_utils_module
9
+ from src.local_deep_research.web.database.models import Base
10
+ from src.local_deep_research.web.services.settings_manager import SettingsManager
11
+
12
+
13
+ @pytest.fixture(scope="session", autouse=True)
14
+ def setup_database_for_all_tests(
15
+ tmp_path_factory, session_mocker
16
+ ): # Directly use the session_mocker provided by pytest-mock
17
+ """
18
+ Provides a database setup for a temporary SQLite file database for the entire test session.
19
+ It patches db_utils.get_db_session and db_utils.get_settings_manager to use this test DB.
20
+ """
21
+
22
+ # Call cache_clear on the functions from db_utils_module.
23
+ # This ensures any pre-existing cached instances are gone.
24
+ # We must ensure db_utils_module is imported before this point.
25
+ try:
26
+ if hasattr(db_utils_module.get_db_session, "cache_clear"):
27
+ db_utils_module.get_db_session.cache_clear()
28
+ if hasattr(db_utils_module.get_settings_manager, "cache_clear"):
29
+ db_utils_module.get_settings_manager.cache_clear()
30
+ if hasattr(db_utils_module.get_db_setting, "cache_clear"):
31
+ db_utils_module.get_db_setting.cache_clear() # Clear get_db_setting's cache too
32
+
33
+ except Exception as e:
34
+ print(f"ERROR: Failed to clear db_utils caches aggressively: {e}")
35
+ # This shouldn't prevent test run, but indicates a problem with cache_clear
36
+
37
+ # Debug tmp_path_factory behavior
38
+ temp_dir = tmp_path_factory.mktemp("db_test_data")
39
+ db_file = temp_dir / "test_settings.db"
40
+ db_url = f"sqlite:///{db_file}"
41
+
42
+ engine = None
43
+ try:
44
+ engine = create_engine(db_url)
45
+ except Exception as e:
46
+ print(f"ERROR: Failed to create SQLAlchemy engine: {e}")
47
+ raise
48
+
49
+ try:
50
+ Base.metadata.create_all(engine)
51
+ except SQLAlchemyError as e:
52
+ print(f"ERROR: SQLAlchemyError during Base.metadata.create_all: {e}")
53
+ raise
54
+ except Exception as e:
55
+ print(f"ERROR: Unexpected error during Base.metadata.create_all: {e}")
56
+ raise
57
+
58
+ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
59
+ temp_session = SessionLocal()
60
+ temp_settings_manager = SettingsManager(db_session=temp_session)
61
+
62
+ try:
63
+ temp_settings_manager.load_from_defaults_file(commit=True)
64
+ except Exception as e:
65
+ print(f"ERROR: Failed to load default settings: {e}")
66
+ temp_session.rollback() # Rollback if default loading fails
67
+ raise # Re-raise to fail the test if default loading is critical
68
+ finally:
69
+ temp_session.close() # Close the temporary session used for loading defaults
70
+
71
+ # Clear caches and patch
72
+ db_utils_module.get_db_session.cache_clear()
73
+ db_utils_module.get_settings_manager.cache_clear()
74
+
75
+ mock_get_db_session = session_mocker.patch(
76
+ "src.local_deep_research.utilities.db_utils.get_db_session"
77
+ )
78
+ mock_get_db_session.side_effect = SessionLocal
79
+
80
+ mock_get_settings_manager = session_mocker.patch(
81
+ "src.local_deep_research.utilities.db_utils.get_settings_manager"
82
+ )
83
+ mock_get_settings_manager.side_effect = lambda: SettingsManager(
84
+ db_session=mock_get_db_session()
85
+ )
86
+
87
+ yield SessionLocal # Yield the SessionLocal class for individual tests to create sessions
88
+
89
+ if engine:
90
+ engine.dispose() # Dispose the engine to close all connections
91
+ # tmp_path_factory handles deleting the temporary directory and its contents
92
+
93
+
94
+ @pytest.fixture
95
+ def mock_db_session(mocker):
96
+ return mocker.MagicMock()
97
+
98
+
99
+ @pytest.fixture
100
+ def mock_logger(mocker):
101
+ mocked_logger = mocker.patch(
102
+ "src.local_deep_research.web.services.settings_manager.logger"
103
+ )
104
+
105
+ def _print_to_console(message: str, *args: Any) -> None:
106
+ # Handle loguru formatting.
107
+ message = message.format(*args)
108
+ print(f"LOG: {message}")
109
+ return mocker.DEFAULT
110
+
111
+ # Pass through logged messages to the console.
112
+ mocked_logger.debug = mocker.MagicMock(side_effect=_print_to_console)
113
+ mocked_logger.info = mocker.MagicMock(side_effect=_print_to_console)
114
+ mocked_logger.warning = mocker.MagicMock(side_effect=_print_to_console)
115
+ mocked_logger.error = mocker.MagicMock(side_effect=_print_to_console)
116
+ mocked_logger.critical = mocker.MagicMock(side_effect=_print_to_console)
117
+ mocked_logger.exception = mocker.MagicMock(side_effect=_print_to_console)
118
+
119
+ return mocked_logger
@@ -206,3 +206,55 @@ def test_set_setting_db_error(mocker):
206
206
  mock_db_session.commit.assert_not_called()
207
207
  mock_logger.error.assert_called_once()
208
208
  # mock_logger.error.assert_called_once_with("Error setting value for app.version: Simulated DB Error")
209
+
210
+
211
+ def test_get_setting_with_substring_keys(setup_database_for_all_tests):
212
+ """
213
+ Tests that we can get the correct value for a setting, even when its key
214
+ is a substring of the key for a different setting.
215
+
216
+ Args:
217
+ setup_database_for_all_tests: Fixture that sets up a real database
218
+ for testing. (This is necessary because the bug fix this is
219
+ testing depends on the actual behavior of the SQLAlchemy `filter()`
220
+ function.)
221
+
222
+ """
223
+ # Arrange.
224
+ session_local_class = setup_database_for_all_tests
225
+ session = session_local_class()
226
+
227
+ with session:
228
+ # Add two settings with overlapping keys but different full keys
229
+ setting1 = Setting(
230
+ key="test.hello",
231
+ value="world",
232
+ ui_element="text",
233
+ type="APP",
234
+ name="Test Setting 1",
235
+ visible=True,
236
+ editable=True,
237
+ )
238
+ setting2 = Setting(
239
+ key="test.hello_world",
240
+ value="universe",
241
+ ui_element="text",
242
+ type="APP",
243
+ name="Test Setting 2",
244
+ visible=True,
245
+ editable=True,
246
+ )
247
+ session.add(setting1)
248
+ session.add(setting2)
249
+ session.commit()
250
+
251
+ settings_manager = SettingsManager(db_session=session)
252
+
253
+ # Act and assert.
254
+ # Test getting the "test.hello" setting
255
+ result1 = settings_manager.get_setting("test.hello")
256
+ assert result1 == "world"
257
+
258
+ # Test getting the "test.hello_world" setting.
259
+ result2 = settings_manager.get_setting("test.hello_world")
260
+ assert result2 == "universe"
@@ -1 +0,0 @@
1
- __version__ = "0.4.2"