thinking-sphinx 3.4.2 → 4.0.0

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 (333) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +20 -18
  3. data/Appraisals +28 -16
  4. data/CHANGELOG.markdown +538 -0
  5. data/Gemfile +9 -11
  6. data/README.textile +23 -31
  7. data/Rakefile +2 -0
  8. data/bin/console +2 -1
  9. data/bin/loadsphinx +29 -2
  10. data/lib/thinking-sphinx.rb +2 -0
  11. data/lib/thinking/sphinx.rb +2 -0
  12. data/lib/thinking_sphinx.rb +24 -13
  13. data/lib/thinking_sphinx/active_record.rb +10 -1
  14. data/lib/thinking_sphinx/active_record/association.rb +2 -0
  15. data/lib/thinking_sphinx/active_record/association_proxy.rb +2 -0
  16. data/lib/thinking_sphinx/active_record/association_proxy/attribute_finder.rb +2 -0
  17. data/lib/thinking_sphinx/active_record/association_proxy/attribute_matcher.rb +2 -0
  18. data/lib/thinking_sphinx/active_record/attribute.rb +2 -0
  19. data/lib/thinking_sphinx/active_record/attribute/sphinx_presenter.rb +2 -0
  20. data/lib/thinking_sphinx/active_record/attribute/type.rb +2 -0
  21. data/lib/thinking_sphinx/active_record/attribute/values.rb +2 -0
  22. data/lib/thinking_sphinx/active_record/base.rb +2 -0
  23. data/lib/thinking_sphinx/active_record/callbacks/delete_callbacks.rb +2 -0
  24. data/lib/thinking_sphinx/active_record/callbacks/delta_callbacks.rb +2 -0
  25. data/lib/thinking_sphinx/active_record/callbacks/update_callbacks.rb +2 -0
  26. data/lib/thinking_sphinx/active_record/column.rb +2 -0
  27. data/lib/thinking_sphinx/active_record/column_sql_presenter.rb +2 -0
  28. data/lib/thinking_sphinx/active_record/database_adapters.rb +2 -0
  29. data/lib/thinking_sphinx/active_record/database_adapters/abstract_adapter.rb +2 -0
  30. data/lib/thinking_sphinx/active_record/database_adapters/mysql_adapter.rb +2 -0
  31. data/lib/thinking_sphinx/active_record/database_adapters/postgresql_adapter.rb +2 -0
  32. data/lib/thinking_sphinx/active_record/depolymorph/association_reflection.rb +32 -0
  33. data/lib/thinking_sphinx/active_record/depolymorph/base_reflection.rb +32 -0
  34. data/lib/thinking_sphinx/active_record/depolymorph/conditions_reflection.rb +40 -0
  35. data/lib/thinking_sphinx/active_record/depolymorph/overridden_reflection.rb +35 -0
  36. data/lib/thinking_sphinx/active_record/depolymorph/scoped_reflection.rb +26 -0
  37. data/lib/thinking_sphinx/active_record/field.rb +2 -0
  38. data/lib/thinking_sphinx/active_record/filter_reflection.rb +13 -71
  39. data/lib/thinking_sphinx/active_record/index.rb +2 -0
  40. data/lib/thinking_sphinx/active_record/interpreter.rb +2 -0
  41. data/lib/thinking_sphinx/active_record/join_association.rb +2 -0
  42. data/lib/thinking_sphinx/active_record/log_subscriber.rb +2 -0
  43. data/lib/thinking_sphinx/active_record/polymorpher.rb +2 -0
  44. data/lib/thinking_sphinx/active_record/property.rb +2 -0
  45. data/lib/thinking_sphinx/active_record/property_query.rb +2 -0
  46. data/lib/thinking_sphinx/active_record/property_sql_presenter.rb +2 -0
  47. data/lib/thinking_sphinx/active_record/simple_many_query.rb +2 -0
  48. data/lib/thinking_sphinx/active_record/source_joins.rb +2 -0
  49. data/lib/thinking_sphinx/active_record/sql_builder.rb +2 -0
  50. data/lib/thinking_sphinx/active_record/sql_builder/clause_builder.rb +2 -0
  51. data/lib/thinking_sphinx/active_record/sql_builder/query.rb +2 -0
  52. data/lib/thinking_sphinx/active_record/sql_builder/statement.rb +2 -0
  53. data/lib/thinking_sphinx/active_record/sql_source.rb +15 -3
  54. data/lib/thinking_sphinx/active_record/sql_source/template.rb +2 -0
  55. data/lib/thinking_sphinx/attribute_types.rb +2 -0
  56. data/lib/thinking_sphinx/batched_search.rb +2 -0
  57. data/lib/thinking_sphinx/callbacks.rb +2 -0
  58. data/lib/thinking_sphinx/capistrano.rb +2 -0
  59. data/lib/thinking_sphinx/capistrano/v2.rb +2 -0
  60. data/lib/thinking_sphinx/capistrano/v3.rb +2 -0
  61. data/lib/thinking_sphinx/commander.rb +27 -0
  62. data/lib/thinking_sphinx/commands.rb +20 -0
  63. data/lib/thinking_sphinx/commands/base.rb +9 -1
  64. data/lib/thinking_sphinx/commands/clear_real_time.rb +22 -0
  65. data/lib/thinking_sphinx/commands/clear_sql.rb +18 -0
  66. data/lib/thinking_sphinx/commands/configure.rb +2 -0
  67. data/lib/thinking_sphinx/commands/index_real_time.rb +17 -0
  68. data/lib/thinking_sphinx/commands/index_sql.rb +25 -0
  69. data/lib/thinking_sphinx/commands/merge.rb +27 -0
  70. data/lib/thinking_sphinx/commands/merge_and_update.rb +57 -0
  71. data/lib/thinking_sphinx/commands/prepare.rb +13 -0
  72. data/lib/thinking_sphinx/commands/rotate.rb +13 -0
  73. data/lib/thinking_sphinx/commands/running.rb +13 -0
  74. data/lib/thinking_sphinx/commands/start_attached.rb +2 -0
  75. data/lib/thinking_sphinx/commands/start_detached.rb +3 -1
  76. data/lib/thinking_sphinx/commands/stop.rb +4 -2
  77. data/lib/thinking_sphinx/configuration.rb +28 -47
  78. data/lib/thinking_sphinx/configuration/consistent_ids.rb +2 -0
  79. data/lib/thinking_sphinx/configuration/defaults.rb +2 -0
  80. data/lib/thinking_sphinx/configuration/distributed_indices.rb +2 -0
  81. data/lib/thinking_sphinx/configuration/duplicate_names.rb +2 -0
  82. data/lib/thinking_sphinx/configuration/minimum_fields.rb +2 -0
  83. data/lib/thinking_sphinx/connection.rb +4 -5
  84. data/lib/thinking_sphinx/connection/client.rb +21 -0
  85. data/lib/thinking_sphinx/connection/jruby.rb +7 -2
  86. data/lib/thinking_sphinx/connection/mri.rb +2 -4
  87. data/lib/thinking_sphinx/core.rb +2 -0
  88. data/lib/thinking_sphinx/core/field.rb +2 -0
  89. data/lib/thinking_sphinx/core/index.rb +4 -1
  90. data/lib/thinking_sphinx/core/interpreter.rb +2 -0
  91. data/lib/thinking_sphinx/core/property.rb +2 -0
  92. data/lib/thinking_sphinx/core/settings.rb +2 -0
  93. data/lib/thinking_sphinx/deletion.rb +2 -0
  94. data/lib/thinking_sphinx/deltas.rb +2 -0
  95. data/lib/thinking_sphinx/deltas/default_delta.rb +2 -0
  96. data/lib/thinking_sphinx/deltas/delete_job.rb +2 -0
  97. data/lib/thinking_sphinx/deltas/index_job.rb +9 -1
  98. data/lib/thinking_sphinx/distributed.rb +2 -0
  99. data/lib/thinking_sphinx/distributed/index.rb +2 -0
  100. data/lib/thinking_sphinx/errors.rb +9 -0
  101. data/lib/thinking_sphinx/excerpter.rb +2 -0
  102. data/lib/thinking_sphinx/facet.rb +4 -3
  103. data/lib/thinking_sphinx/facet_search.rb +4 -2
  104. data/lib/thinking_sphinx/float_formatter.rb +2 -0
  105. data/lib/thinking_sphinx/frameworks.rb +2 -0
  106. data/lib/thinking_sphinx/frameworks/plain.rb +2 -0
  107. data/lib/thinking_sphinx/frameworks/rails.rb +2 -0
  108. data/lib/thinking_sphinx/guard.rb +3 -0
  109. data/lib/thinking_sphinx/guard/file.rb +2 -0
  110. data/lib/thinking_sphinx/guard/files.rb +2 -0
  111. data/lib/thinking_sphinx/guard/none.rb +7 -0
  112. data/lib/thinking_sphinx/hooks/guard_presence.rb +34 -0
  113. data/lib/thinking_sphinx/index.rb +2 -0
  114. data/lib/thinking_sphinx/index_set.rb +2 -0
  115. data/lib/thinking_sphinx/indexing_strategies/all_at_once.rb +2 -0
  116. data/lib/thinking_sphinx/indexing_strategies/one_at_a_time.rb +2 -0
  117. data/lib/thinking_sphinx/interfaces.rb +10 -0
  118. data/lib/thinking_sphinx/interfaces/base.rb +13 -0
  119. data/lib/thinking_sphinx/interfaces/daemon.rb +6 -11
  120. data/lib/thinking_sphinx/interfaces/real_time.rb +19 -14
  121. data/lib/thinking_sphinx/interfaces/sql.rb +22 -10
  122. data/lib/thinking_sphinx/logger.rb +2 -0
  123. data/lib/thinking_sphinx/masks.rb +2 -0
  124. data/lib/thinking_sphinx/masks/group_enumerators_mask.rb +6 -4
  125. data/lib/thinking_sphinx/masks/pagination_mask.rb +2 -0
  126. data/lib/thinking_sphinx/masks/scopes_mask.rb +2 -0
  127. data/lib/thinking_sphinx/masks/weight_enumerator_mask.rb +3 -1
  128. data/lib/thinking_sphinx/middlewares.rb +5 -3
  129. data/lib/thinking_sphinx/middlewares/active_record_translator.rb +2 -0
  130. data/lib/thinking_sphinx/middlewares/geographer.rb +2 -0
  131. data/lib/thinking_sphinx/middlewares/glazier.rb +2 -0
  132. data/lib/thinking_sphinx/middlewares/ids_only.rb +2 -0
  133. data/lib/thinking_sphinx/middlewares/inquirer.rb +2 -0
  134. data/lib/thinking_sphinx/middlewares/middleware.rb +2 -0
  135. data/lib/thinking_sphinx/middlewares/sphinxql.rb +4 -2
  136. data/lib/thinking_sphinx/middlewares/stale_id_checker.rb +2 -0
  137. data/lib/thinking_sphinx/middlewares/stale_id_filter.rb +2 -0
  138. data/lib/thinking_sphinx/middlewares/valid_options.rb +2 -0
  139. data/lib/thinking_sphinx/panes.rb +2 -0
  140. data/lib/thinking_sphinx/panes/attributes_pane.rb +2 -0
  141. data/lib/thinking_sphinx/panes/distance_pane.rb +2 -0
  142. data/lib/thinking_sphinx/panes/excerpts_pane.rb +2 -0
  143. data/lib/thinking_sphinx/panes/weight_pane.rb +3 -1
  144. data/lib/thinking_sphinx/query.rb +2 -0
  145. data/lib/thinking_sphinx/railtie.rb +2 -0
  146. data/lib/thinking_sphinx/rake_interface.rb +3 -1
  147. data/lib/thinking_sphinx/real_time.rb +3 -0
  148. data/lib/thinking_sphinx/real_time/attribute.rb +2 -0
  149. data/lib/thinking_sphinx/real_time/callbacks/real_time_callbacks.rb +2 -0
  150. data/lib/thinking_sphinx/real_time/field.rb +2 -0
  151. data/lib/thinking_sphinx/real_time/index.rb +2 -0
  152. data/lib/thinking_sphinx/real_time/index/template.rb +2 -0
  153. data/lib/thinking_sphinx/real_time/interpreter.rb +2 -0
  154. data/lib/thinking_sphinx/real_time/populator.rb +2 -1
  155. data/lib/thinking_sphinx/real_time/property.rb +2 -0
  156. data/lib/thinking_sphinx/real_time/transcribe_instance.rb +38 -0
  157. data/lib/thinking_sphinx/real_time/transcriber.rb +18 -27
  158. data/lib/thinking_sphinx/real_time/translator.rb +3 -1
  159. data/lib/thinking_sphinx/scopes.rb +2 -0
  160. data/lib/thinking_sphinx/search.rb +2 -0
  161. data/lib/thinking_sphinx/search/batch_inquirer.rb +2 -0
  162. data/lib/thinking_sphinx/search/context.rb +2 -0
  163. data/lib/thinking_sphinx/search/glaze.rb +2 -0
  164. data/lib/thinking_sphinx/search/merger.rb +2 -0
  165. data/lib/thinking_sphinx/search/query.rb +2 -0
  166. data/lib/thinking_sphinx/search/stale_ids_exception.rb +2 -0
  167. data/lib/thinking_sphinx/settings.rb +110 -0
  168. data/lib/thinking_sphinx/sinatra.rb +2 -0
  169. data/lib/thinking_sphinx/subscribers/populator_subscriber.rb +18 -0
  170. data/lib/thinking_sphinx/tasks.rb +13 -46
  171. data/lib/thinking_sphinx/test.rb +2 -0
  172. data/lib/thinking_sphinx/utf8.rb +2 -0
  173. data/lib/thinking_sphinx/wildcard.rb +2 -0
  174. data/lib/thinking_sphinx/with_output.rb +2 -0
  175. data/spec/acceptance/association_scoping_spec.rb +2 -0
  176. data/spec/acceptance/attribute_access_spec.rb +4 -4
  177. data/spec/acceptance/attribute_updates_spec.rb +2 -0
  178. data/spec/acceptance/batch_searching_spec.rb +2 -0
  179. data/spec/acceptance/big_integers_spec.rb +2 -0
  180. data/spec/acceptance/connection_spec.rb +2 -0
  181. data/spec/acceptance/excerpts_spec.rb +1 -0
  182. data/spec/acceptance/facets_spec.rb +2 -3
  183. data/spec/acceptance/geosearching_spec.rb +3 -1
  184. data/spec/acceptance/grouping_by_attributes_spec.rb +2 -0
  185. data/spec/acceptance/index_options_spec.rb +2 -0
  186. data/spec/acceptance/indexing_spec.rb +2 -0
  187. data/spec/acceptance/merging_spec.rb +90 -0
  188. data/spec/acceptance/paginating_search_results_spec.rb +2 -0
  189. data/spec/acceptance/real_time_updates_spec.rb +2 -0
  190. data/spec/acceptance/remove_deleted_records_spec.rb +2 -0
  191. data/spec/acceptance/search_counts_spec.rb +2 -0
  192. data/spec/acceptance/search_for_just_ids_spec.rb +2 -0
  193. data/spec/acceptance/searching_across_models_spec.rb +2 -0
  194. data/spec/acceptance/searching_across_schemas_spec.rb +2 -0
  195. data/spec/acceptance/searching_on_fields_spec.rb +2 -0
  196. data/spec/acceptance/searching_with_filters_spec.rb +2 -0
  197. data/spec/acceptance/searching_with_sti_spec.rb +2 -0
  198. data/spec/acceptance/searching_within_a_model_spec.rb +2 -0
  199. data/spec/acceptance/sorting_search_results_spec.rb +2 -0
  200. data/spec/acceptance/spec_helper.rb +2 -13
  201. data/spec/acceptance/specifying_sql_spec.rb +2 -0
  202. data/spec/acceptance/sphinx_scopes_spec.rb +2 -0
  203. data/spec/acceptance/sql_deltas_spec.rb +2 -0
  204. data/spec/acceptance/support/database_cleaner.rb +2 -0
  205. data/spec/acceptance/support/sphinx_controller.rb +16 -5
  206. data/spec/acceptance/support/sphinx_helpers.rb +11 -0
  207. data/spec/acceptance/suspended_deltas_spec.rb +2 -0
  208. data/spec/internal/app/indices/admin_person_index.rb +2 -0
  209. data/spec/internal/app/indices/album_index.rb +2 -0
  210. data/spec/internal/app/indices/animal_index.rb +2 -0
  211. data/spec/internal/app/indices/article_index.rb +2 -0
  212. data/spec/internal/app/indices/bird_index.rb +2 -0
  213. data/spec/internal/app/indices/book_index.rb +2 -0
  214. data/spec/internal/app/indices/car_index.rb +2 -0
  215. data/spec/internal/app/indices/city_index.rb +2 -0
  216. data/spec/internal/app/indices/product_index.rb +2 -0
  217. data/spec/internal/app/indices/tee_index.rb +2 -0
  218. data/spec/internal/app/indices/user_index.rb +2 -0
  219. data/spec/internal/app/models/admin/person.rb +2 -0
  220. data/spec/internal/app/models/album.rb +2 -0
  221. data/spec/internal/app/models/animal.rb +2 -0
  222. data/spec/internal/app/models/article.rb +2 -0
  223. data/spec/internal/app/models/bird.rb +2 -0
  224. data/spec/internal/app/models/book.rb +2 -0
  225. data/spec/internal/app/models/car.rb +2 -0
  226. data/spec/internal/app/models/categorisation.rb +2 -0
  227. data/spec/internal/app/models/category.rb +2 -0
  228. data/spec/internal/app/models/city.rb +2 -0
  229. data/spec/internal/app/models/colour.rb +2 -0
  230. data/spec/internal/app/models/event.rb +2 -0
  231. data/spec/internal/app/models/flightless_bird.rb +2 -0
  232. data/spec/internal/app/models/genre.rb +2 -0
  233. data/spec/internal/app/models/hardcover.rb +2 -0
  234. data/spec/internal/app/models/mammal.rb +2 -0
  235. data/spec/internal/app/models/manufacturer.rb +2 -0
  236. data/spec/internal/app/models/product.rb +2 -0
  237. data/spec/internal/app/models/tag.rb +2 -0
  238. data/spec/internal/app/models/tagging.rb +2 -0
  239. data/spec/internal/app/models/tee.rb +2 -0
  240. data/spec/internal/app/models/tweet.rb +2 -0
  241. data/spec/internal/app/models/user.rb +2 -0
  242. data/spec/internal/db/schema.rb +2 -0
  243. data/spec/spec_helper.rb +4 -1
  244. data/spec/support/json_column.rb +3 -5
  245. data/spec/support/multi_schema.rb +2 -0
  246. data/spec/support/mysql.rb +25 -0
  247. data/spec/support/sphinx_yaml_helpers.rb +2 -0
  248. data/spec/thinking_sphinx/active_record/association_spec.rb +2 -0
  249. data/spec/thinking_sphinx/active_record/attribute/type_spec.rb +2 -0
  250. data/spec/thinking_sphinx/active_record/base_spec.rb +2 -0
  251. data/spec/thinking_sphinx/active_record/callbacks/delete_callbacks_spec.rb +2 -0
  252. data/spec/thinking_sphinx/active_record/callbacks/delta_callbacks_spec.rb +2 -0
  253. data/spec/thinking_sphinx/active_record/callbacks/update_callbacks_spec.rb +2 -0
  254. data/spec/thinking_sphinx/active_record/column_spec.rb +2 -0
  255. data/spec/thinking_sphinx/active_record/column_sql_presenter_spec.rb +2 -0
  256. data/spec/thinking_sphinx/active_record/database_adapters/abstract_adapter_spec.rb +2 -0
  257. data/spec/thinking_sphinx/active_record/database_adapters/mysql_adapter_spec.rb +2 -0
  258. data/spec/thinking_sphinx/active_record/database_adapters/postgresql_adapter_spec.rb +2 -0
  259. data/spec/thinking_sphinx/active_record/database_adapters_spec.rb +2 -0
  260. data/spec/thinking_sphinx/active_record/field_spec.rb +2 -0
  261. data/spec/thinking_sphinx/active_record/filter_reflection_spec.rb +100 -79
  262. data/spec/thinking_sphinx/active_record/index_spec.rb +16 -1
  263. data/spec/thinking_sphinx/active_record/interpreter_spec.rb +2 -0
  264. data/spec/thinking_sphinx/active_record/polymorpher_spec.rb +2 -0
  265. data/spec/thinking_sphinx/active_record/property_sql_presenter_spec.rb +2 -0
  266. data/spec/thinking_sphinx/active_record/sql_builder_spec.rb +2 -0
  267. data/spec/thinking_sphinx/active_record/sql_source_spec.rb +2 -0
  268. data/spec/thinking_sphinx/attribute_types_spec.rb +2 -0
  269. data/spec/thinking_sphinx/commands/clear_real_time_spec.rb +46 -0
  270. data/spec/thinking_sphinx/commands/clear_sql_spec.rb +52 -0
  271. data/spec/thinking_sphinx/commands/configure_spec.rb +2 -0
  272. data/spec/thinking_sphinx/commands/index_real_time_spec.rb +33 -0
  273. data/spec/thinking_sphinx/commands/index_sql_spec.rb +86 -0
  274. data/spec/thinking_sphinx/commands/merge_and_update_spec.rb +106 -0
  275. data/spec/thinking_sphinx/commands/merge_spec.rb +48 -0
  276. data/spec/thinking_sphinx/commands/prepare_spec.rb +23 -0
  277. data/spec/thinking_sphinx/commands/start_detached_spec.rb +2 -0
  278. data/spec/thinking_sphinx/commands/stop_spec.rb +13 -4
  279. data/spec/thinking_sphinx/configuration/minimum_fields_spec.rb +2 -0
  280. data/spec/thinking_sphinx/configuration_spec.rb +132 -6
  281. data/spec/thinking_sphinx/connection_spec.rb +2 -0
  282. data/spec/thinking_sphinx/deletion_spec.rb +2 -0
  283. data/spec/thinking_sphinx/deltas/default_delta_spec.rb +8 -1
  284. data/spec/thinking_sphinx/deltas_spec.rb +2 -0
  285. data/spec/thinking_sphinx/errors_spec.rb +2 -0
  286. data/spec/thinking_sphinx/excerpter_spec.rb +2 -0
  287. data/spec/thinking_sphinx/facet_search_spec.rb +8 -6
  288. data/spec/thinking_sphinx/hooks/guard_presence_spec.rb +30 -0
  289. data/spec/thinking_sphinx/index_set_spec.rb +2 -0
  290. data/spec/thinking_sphinx/index_spec.rb +2 -0
  291. data/spec/thinking_sphinx/interfaces/daemon_spec.rb +19 -11
  292. data/spec/thinking_sphinx/interfaces/real_time_spec.rb +43 -43
  293. data/spec/thinking_sphinx/interfaces/sql_spec.rb +76 -52
  294. data/spec/thinking_sphinx/masks/pagination_mask_spec.rb +2 -0
  295. data/spec/thinking_sphinx/masks/scopes_mask_spec.rb +2 -0
  296. data/spec/thinking_sphinx/middlewares/active_record_translator_spec.rb +2 -0
  297. data/spec/thinking_sphinx/middlewares/geographer_spec.rb +2 -0
  298. data/spec/thinking_sphinx/middlewares/glazier_spec.rb +2 -0
  299. data/spec/thinking_sphinx/middlewares/inquirer_spec.rb +2 -0
  300. data/spec/thinking_sphinx/middlewares/sphinxql_spec.rb +2 -1
  301. data/spec/thinking_sphinx/middlewares/stale_id_checker_spec.rb +2 -0
  302. data/spec/thinking_sphinx/middlewares/stale_id_filter_spec.rb +2 -0
  303. data/spec/thinking_sphinx/middlewares/valid_options_spec.rb +2 -0
  304. data/spec/thinking_sphinx/panes/attributes_pane_spec.rb +2 -0
  305. data/spec/thinking_sphinx/panes/distance_pane_spec.rb +2 -0
  306. data/spec/thinking_sphinx/panes/excerpts_pane_spec.rb +2 -0
  307. data/spec/thinking_sphinx/panes/weight_pane_spec.rb +3 -1
  308. data/spec/thinking_sphinx/rake_interface_spec.rb +10 -8
  309. data/spec/thinking_sphinx/real_time/attribute_spec.rb +2 -0
  310. data/spec/thinking_sphinx/real_time/callbacks/real_time_callbacks_spec.rb +2 -0
  311. data/spec/thinking_sphinx/real_time/field_spec.rb +2 -0
  312. data/spec/thinking_sphinx/real_time/index_spec.rb +14 -0
  313. data/spec/thinking_sphinx/real_time/interpreter_spec.rb +2 -0
  314. data/spec/thinking_sphinx/real_time/transcribe_instance_spec.rb +35 -0
  315. data/spec/thinking_sphinx/real_time/transcriber_spec.rb +101 -0
  316. data/spec/thinking_sphinx/real_time/translator_spec.rb +17 -0
  317. data/spec/thinking_sphinx/scopes_spec.rb +2 -0
  318. data/spec/thinking_sphinx/search/glaze_spec.rb +2 -0
  319. data/spec/thinking_sphinx/search/query_spec.rb +2 -0
  320. data/spec/thinking_sphinx/search_spec.rb +2 -0
  321. data/spec/thinking_sphinx/wildcard_spec.rb +2 -0
  322. data/spec/thinking_sphinx_spec.rb +2 -0
  323. data/thinking-sphinx.gemspec +7 -5
  324. metadata +62 -25
  325. data/HISTORY +0 -326
  326. data/bin/literals +0 -9
  327. data/lib/thinking_sphinx/commands/index.rb +0 -11
  328. data/lib/thinking_sphinx/controller.rb +0 -12
  329. data/lib/thinking_sphinx/middlewares/attribute_typer.rb +0 -48
  330. data/lib/thinking_sphinx/middlewares/utf8.rb +0 -27
  331. data/lib/thinking_sphinx/sphinxql.rb +0 -23
  332. data/spec/thinking_sphinx/commands/index_spec.rb +0 -26
  333. data/spec/thinking_sphinx/middlewares/attribute_typer_spec.rb +0 -42
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe ThinkingSphinx::Commands::Prepare do
6
+ let(:command) { ThinkingSphinx::Commands::Prepare.new(
7
+ configuration, {}, stream
8
+ ) }
9
+ let(:configuration) { double 'configuration',
10
+ :indices_location => '/path/to/indices'
11
+ }
12
+ let(:stream) { double :puts => nil }
13
+
14
+ before :each do
15
+ allow(FileUtils).to receive_messages :mkdir_p => true
16
+ end
17
+
18
+ it "creates the directory for the index files" do
19
+ expect(FileUtils).to receive(:mkdir_p).with('/path/to/indices')
20
+
21
+ command.call
22
+ end
23
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Commands::StartDetached do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Commands::Stop do
@@ -7,13 +9,18 @@ RSpec.describe ThinkingSphinx::Commands::Stop do
7
9
  let(:configuration) { double 'configuration', :controller => controller }
8
10
  let(:controller) { double 'controller', :stop => true, :pid => 101 }
9
11
  let(:stream) { double :puts => nil }
12
+ let(:commander) { double :call => nil }
10
13
 
11
14
  before :each do
12
- allow(controller).to receive(:running?).and_return(true, true, false)
15
+ stub_const 'ThinkingSphinx::Commander', commander
16
+
17
+ allow(commander).to receive(:call).
18
+ with(:running, configuration, {}, stream).and_return(true, true, false)
13
19
  end
14
20
 
15
21
  it "prints a message if the daemon is not already running" do
16
- allow(controller).to receive_messages :running? => false
22
+ allow(commander).to receive(:call).
23
+ with(:running, configuration, {}, stream).and_return(false)
17
24
 
18
25
  expect(stream).to receive(:puts).with('searchd is not currently running.').
19
26
  and_return(nil)
@@ -24,7 +31,8 @@ RSpec.describe ThinkingSphinx::Commands::Stop do
24
31
  end
25
32
 
26
33
  it "does not try to stop the daemon if it's not running" do
27
- allow(controller).to receive_messages :running? => false
34
+ allow(commander).to receive(:call).
35
+ with(:running, configuration, {}, stream).and_return(false)
28
36
 
29
37
  expect(controller).to_not receive(:stop)
30
38
 
@@ -44,7 +52,8 @@ RSpec.describe ThinkingSphinx::Commands::Stop do
44
52
  end
45
53
 
46
54
  it "should retry stopping the daemon until it stops" do
47
- allow(controller).to receive(:running?).
55
+ allow(commander).to receive(:call).
56
+ with(:running, configuration, {}, stream).
48
57
  and_return(true, true, true, false)
49
58
 
50
59
  expect(controller).to receive(:stop).twice
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Configuration::MinimumFields do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Configuration do
@@ -112,6 +114,53 @@ describe ThinkingSphinx::Configuration do
112
114
 
113
115
  expect(config.indices_location).to eq('/my/index/files')
114
116
  end
117
+
118
+ it "respects relative paths" do
119
+ write_configuration 'indices_location' => 'my/index/files'
120
+
121
+ expect(config.indices_location).to eq('my/index/files')
122
+ end
123
+
124
+ it "translates relative paths to absolute if config requests it" do
125
+ write_configuration(
126
+ 'indices_location' => 'my/index/files',
127
+ 'absolute_paths' => true
128
+ )
129
+
130
+ expect(config.indices_location).to eq(
131
+ File.join(config.framework.root, 'my/index/files')
132
+ )
133
+ end
134
+
135
+ it "respects paths that are already absolute" do
136
+ write_configuration(
137
+ 'indices_location' => '/my/index/files',
138
+ 'absolute_paths' => true
139
+ )
140
+
141
+ expect(config.indices_location).to eq('/my/index/files')
142
+ end
143
+
144
+ it "translates linked directories" do
145
+ write_configuration(
146
+ 'indices_location' => 'mine/index/files',
147
+ 'absolute_paths' => true
148
+ )
149
+
150
+ framework = ThinkingSphinx::Frameworks.current
151
+ local_path = File.join framework.root, "mine"
152
+ linked_path = File.join framework.root, "my"
153
+
154
+ FileUtils.mkdir_p linked_path
155
+ `ln -s #{linked_path} #{local_path}`
156
+
157
+ expect(config.indices_location).to eq(
158
+ File.join(config.framework.root, "my/index/files")
159
+ )
160
+
161
+ FileUtils.rm local_path
162
+ FileUtils.rmdir linked_path
163
+ end
115
164
  end
116
165
 
117
166
  describe '#initialize' do
@@ -342,6 +391,33 @@ describe ThinkingSphinx::Configuration do
342
391
  end
343
392
  end
344
393
 
394
+ describe '#log' do
395
+ it "defaults to an environment-specific file" do
396
+ expect(config.searchd.log).to eq(
397
+ File.join(config.framework.root, "log/test.searchd.log")
398
+ )
399
+ end
400
+
401
+ it "translates linked directories" do
402
+ framework = ThinkingSphinx::Frameworks.current
403
+ log_path = File.join framework.root, "log"
404
+ linked_path = File.join framework.root, "logging"
405
+ log_exists = File.exist? log_path
406
+
407
+ FileUtils.mv log_path, "#{log_path}-tmp" if log_exists
408
+ FileUtils.mkdir_p linked_path
409
+ `ln -s #{linked_path} #{log_path}`
410
+
411
+ expect(config.searchd.log).to eq(
412
+ File.join(config.framework.root, "logging/test.searchd.log")
413
+ )
414
+
415
+ FileUtils.rm log_path
416
+ FileUtils.rmdir linked_path
417
+ FileUtils.mv "#{log_path}-tmp", log_path if log_exists
418
+ end unless RUBY_PLATFORM == "java"
419
+ end
420
+
345
421
  describe '#mysql41' do
346
422
  it "defaults to 9306" do
347
423
  expect(config.searchd.mysql41).to eq(9306)
@@ -359,6 +435,56 @@ describe ThinkingSphinx::Configuration do
359
435
  expect(config.searchd.mysql41).to eq(9307)
360
436
  end
361
437
  end
438
+
439
+ describe "#socket" do
440
+ it "does not set anything by default" do
441
+ expect(config.searchd.socket).to be_nil
442
+ end
443
+
444
+ it "ignores unspecified address and port when socket is set" do
445
+ write_configuration("socket" => "/my/socket")
446
+
447
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
448
+ expect(config.searchd.address).to be_nil
449
+ expect(config.searchd.mysql41).to be_nil
450
+ end
451
+
452
+ it "allows address and socket settings" do
453
+ write_configuration("socket" => "/my/socket", "address" => "1.1.1.1")
454
+
455
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
456
+ expect(config.searchd.address).to eq("1.1.1.1")
457
+ expect(config.searchd.mysql41).to eq(9306)
458
+ end
459
+
460
+ it "allows mysql41 and socket settings" do
461
+ write_configuration("socket" => "/my/socket", "mysql41" => 9307)
462
+
463
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
464
+ expect(config.searchd.address).to eq("127.0.0.1")
465
+ expect(config.searchd.mysql41).to eq(9307)
466
+ end
467
+
468
+ it "allows port and socket settings" do
469
+ write_configuration("socket" => "/my/socket", "port" => 9307)
470
+
471
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
472
+ expect(config.searchd.address).to eq("127.0.0.1")
473
+ expect(config.searchd.mysql41).to eq(9307)
474
+ end
475
+
476
+ it "allows address, mysql41 and socket settings" do
477
+ write_configuration(
478
+ "socket" => "/my/socket",
479
+ "address" => "1.2.3.4",
480
+ "mysql41" => 9307
481
+ )
482
+
483
+ expect(config.searchd.socket).to eq("/my/socket:mysql41")
484
+ expect(config.searchd.address).to eq("1.2.3.4")
485
+ expect(config.searchd.mysql41).to eq(9307)
486
+ end
487
+ end
362
488
  end
363
489
 
364
490
  describe '#settings' do
@@ -390,11 +516,11 @@ describe ThinkingSphinx::Configuration do
390
516
  config.settings
391
517
  end
392
518
 
393
- it "returns an empty hash when no settings for the environment exist" do
519
+ it "returns the default hash when no settings for the environment exist" do
394
520
  allow(File).to receive_messages :read => {'test' => {'foo' => 'bar'}}.to_yaml
395
521
  allow(Rails).to receive_messages :env => 'staging'
396
522
 
397
- expect(config.settings).to eq({})
523
+ expect(config.settings.class).to eq(Hash)
398
524
  end
399
525
  end
400
526
 
@@ -409,15 +535,15 @@ describe ThinkingSphinx::Configuration do
409
535
  config.settings
410
536
  end
411
537
 
412
- it "returns an empty hash" do
413
- expect(config.settings).to eq({})
538
+ it "returns a hash" do
539
+ expect(config.settings.class).to eq(Hash)
414
540
  end
415
541
  end
416
542
  end
417
543
 
418
544
  describe '#version' do
419
- it "defaults to 2.1.4" do
420
- expect(config.version).to eq('2.1.4')
545
+ it "defaults to 2.2.11" do
546
+ expect(config.version).to eq('2.2.11')
421
547
  end
422
548
 
423
549
  it "respects supplied YAML versions" do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Connection do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Deletion do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Deltas::DefaultDelta do
@@ -68,13 +70,18 @@ describe ThinkingSphinx::Deltas::DefaultDelta do
68
70
  let(:config) { double('config', :controller => controller,
69
71
  :settings => {}) }
70
72
  let(:controller) { double('controller') }
73
+ let(:commander) { double('commander', :call => true) }
71
74
 
72
75
  before :each do
76
+ stub_const 'ThinkingSphinx::Commander', commander
77
+
73
78
  allow(ThinkingSphinx::Configuration).to receive_messages :instance => config
74
79
  end
75
80
 
76
81
  it "indexes the given index" do
77
- expect(controller).to receive(:index).with('foo_delta', :verbose => false)
82
+ expect(commander).to receive(:call).with(
83
+ :index_sql, config, :indices => ['foo_delta'], :verbose => false
84
+ )
78
85
 
79
86
  delta.index double('index', :name => 'foo_delta')
80
87
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Deltas do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::SphinxError do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Excerpter do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::FacetSearch do
@@ -25,12 +27,12 @@ describe ThinkingSphinx::FacetSearch do
25
27
  DumbSearch = ::Struct.new(:query, :options) do
26
28
  def raw
27
29
  [{
28
- 'sphinx_internal_class' => 'Foo',
29
- 'price_bracket' => 3,
30
- 'tag_ids' => '1,2',
31
- 'category_id' => 11,
32
- ThinkingSphinx::SphinxQL.count[:column] => 5,
33
- ThinkingSphinx::SphinxQL.group_by[:column] => 2
30
+ 'sphinx_internal_class' => 'Foo',
31
+ 'price_bracket' => 3,
32
+ 'tag_ids' => '1,2',
33
+ 'category_id' => 11,
34
+ "sphinx_internal_count" => 5,
35
+ "sphinx_internal_group" => 2
34
36
  }]
35
37
  end
36
38
  end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
4
+
5
+ RSpec.describe ThinkingSphinx::Hooks::GuardPresence do
6
+ let(:subject) do
7
+ ThinkingSphinx::Hooks::GuardPresence.new configuration, stream
8
+ end
9
+ let(:configuration) { double "configuration", :indices_location => "/path" }
10
+ let(:stream) { double "stream", :puts => nil }
11
+
12
+ describe "#call" do
13
+ it "outputs nothing if no guard files exist" do
14
+ allow(Dir).to receive(:[]).with('/path/ts-*.tmp').and_return([])
15
+
16
+ expect(stream).not_to receive(:puts)
17
+
18
+ subject.call
19
+ end
20
+
21
+ it "outputs a warning if a guard file exists" do
22
+ allow(Dir).to receive(:[]).with('/path/ts-*.tmp').
23
+ and_return(['/path/ts-foo.tmp'])
24
+
25
+ expect(stream).to receive(:puts)
26
+
27
+ subject.call
28
+ end
29
+ end
30
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ThinkingSphinx; end
2
4
 
3
5
  require 'active_support/core_ext/string/inflections'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe ThinkingSphinx::Index do
@@ -1,28 +1,34 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  RSpec.describe ThinkingSphinx::Interfaces::Daemon do
4
- let(:configuration) { double 'configuration', :controller => controller }
5
- let(:controller) { double 'controller', :running? => false }
6
+ let(:configuration) { double 'configuration' }
6
7
  let(:stream) { double 'stream', :puts => true }
8
+ let(:commander) { double :call => nil }
7
9
  let(:interface) {
8
10
  ThinkingSphinx::Interfaces::Daemon.new(configuration, {}, stream)
9
11
  }
10
12
 
11
- describe '#start' do
12
- let(:command) { double 'command', :call => true }
13
+ before :each do
14
+ stub_const 'ThinkingSphinx::Commander', commander
13
15
 
14
- before :each do
15
- stub_const 'ThinkingSphinx::Commands::StartDetached', command
16
- end
16
+ allow(commander).to receive(:call).
17
+ with(:running, configuration, {}, stream).and_return(false)
18
+ end
17
19
 
20
+ describe '#start' do
18
21
  it "starts the daemon" do
19
- expect(command).to receive(:call)
22
+ expect(commander).to receive(:call).with(
23
+ :start_detached, configuration, {}, stream
24
+ )
20
25
 
21
26
  interface.start
22
27
  end
23
28
 
24
29
  it "raises an error if the daemon is already running" do
25
- allow(controller).to receive_messages :running? => true
30
+ allow(commander).to receive(:call).
31
+ with(:running, configuration, {}, stream).and_return(true)
26
32
 
27
33
  expect {
28
34
  interface.start
@@ -32,7 +38,8 @@ RSpec.describe ThinkingSphinx::Interfaces::Daemon do
32
38
 
33
39
  describe '#status' do
34
40
  it "reports when the daemon is running" do
35
- allow(controller).to receive_messages :running? => true
41
+ allow(commander).to receive(:call).
42
+ with(:running, configuration, {}, stream).and_return(true)
36
43
 
37
44
  expect(stream).to receive(:puts).
38
45
  with('The Sphinx daemon searchd is currently running.')
@@ -41,7 +48,8 @@ RSpec.describe ThinkingSphinx::Interfaces::Daemon do
41
48
  end
42
49
 
43
50
  it "reports when the daemon is not running" do
44
- allow(controller).to receive_messages :running? => false
51
+ allow(commander).to receive(:call).
52
+ with(:running, configuration, {}, stream).and_return(false)
45
53
 
46
54
  expect(stream).to receive(:puts).
47
55
  with('The Sphinx daemon searchd is not currently running.')