ts-xml 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/LICENSE +20 -0
  2. data/README.textile +30 -0
  3. data/features/alternate_primary_key.feature +27 -0
  4. data/features/attribute_transformation.feature +22 -0
  5. data/features/attribute_updates.feature +39 -0
  6. data/features/deleting_instances.feature +67 -0
  7. data/features/direct_attributes.feature +11 -0
  8. data/features/excerpts.feature +13 -0
  9. data/features/extensible_delta_indexing.feature +9 -0
  10. data/features/facets.feature +82 -0
  11. data/features/facets_across_model.feature +29 -0
  12. data/features/handling_edits.feature +92 -0
  13. data/features/retry_stale_indexes.feature +24 -0
  14. data/features/searching_across_models.feature +20 -0
  15. data/features/searching_by_index.feature +40 -0
  16. data/features/searching_by_model.feature +175 -0
  17. data/features/searching_with_find_arguments.feature +56 -0
  18. data/features/sphinx_detection.feature +25 -0
  19. data/features/sphinx_scopes.feature +42 -0
  20. data/features/step_definitions/alpha_steps.rb +7 -0
  21. data/features/step_definitions/beta_steps.rb +7 -0
  22. data/features/step_definitions/common_steps.rb +188 -0
  23. data/features/step_definitions/extensible_delta_indexing_steps.rb +7 -0
  24. data/features/step_definitions/facet_steps.rb +96 -0
  25. data/features/step_definitions/find_arguments_steps.rb +36 -0
  26. data/features/step_definitions/gamma_steps.rb +15 -0
  27. data/features/step_definitions/scope_steps.rb +15 -0
  28. data/features/step_definitions/search_steps.rb +89 -0
  29. data/features/step_definitions/sphinx_steps.rb +35 -0
  30. data/features/sti_searching.feature +19 -0
  31. data/features/support/database.example.yml +3 -0
  32. data/features/support/db/fixtures/alphas.rb +10 -0
  33. data/features/support/db/fixtures/authors.rb +1 -0
  34. data/features/support/db/fixtures/betas.rb +10 -0
  35. data/features/support/db/fixtures/boxes.rb +9 -0
  36. data/features/support/db/fixtures/categories.rb +1 -0
  37. data/features/support/db/fixtures/cats.rb +3 -0
  38. data/features/support/db/fixtures/comments.rb +24 -0
  39. data/features/support/db/fixtures/developers.rb +29 -0
  40. data/features/support/db/fixtures/dogs.rb +3 -0
  41. data/features/support/db/fixtures/extensible_betas.rb +10 -0
  42. data/features/support/db/fixtures/foxes.rb +3 -0
  43. data/features/support/db/fixtures/gammas.rb +10 -0
  44. data/features/support/db/fixtures/people.rb +1001 -0
  45. data/features/support/db/fixtures/posts.rb +6 -0
  46. data/features/support/db/fixtures/robots.rb +14 -0
  47. data/features/support/db/fixtures/tags.rb +27 -0
  48. data/features/support/db/migrations/create_alphas.rb +7 -0
  49. data/features/support/db/migrations/create_animals.rb +5 -0
  50. data/features/support/db/migrations/create_authors.rb +3 -0
  51. data/features/support/db/migrations/create_authors_posts.rb +6 -0
  52. data/features/support/db/migrations/create_betas.rb +5 -0
  53. data/features/support/db/migrations/create_boxes.rb +5 -0
  54. data/features/support/db/migrations/create_categories.rb +3 -0
  55. data/features/support/db/migrations/create_comments.rb +10 -0
  56. data/features/support/db/migrations/create_developers.rb +9 -0
  57. data/features/support/db/migrations/create_extensible_betas.rb +5 -0
  58. data/features/support/db/migrations/create_gammas.rb +3 -0
  59. data/features/support/db/migrations/create_people.rb +13 -0
  60. data/features/support/db/migrations/create_posts.rb +5 -0
  61. data/features/support/db/migrations/create_robots.rb +4 -0
  62. data/features/support/db/migrations/create_taggings.rb +5 -0
  63. data/features/support/db/migrations/create_tags.rb +4 -0
  64. data/features/support/env.rb +21 -0
  65. data/features/support/lib/generic_delta_handler.rb +8 -0
  66. data/features/support/models/alpha.rb +21 -0
  67. data/features/support/models/animal.rb +5 -0
  68. data/features/support/models/author.rb +3 -0
  69. data/features/support/models/beta.rb +8 -0
  70. data/features/support/models/box.rb +8 -0
  71. data/features/support/models/cat.rb +3 -0
  72. data/features/support/models/category.rb +4 -0
  73. data/features/support/models/comment.rb +10 -0
  74. data/features/support/models/developer.rb +16 -0
  75. data/features/support/models/dog.rb +3 -0
  76. data/features/support/models/extensible_beta.rb +9 -0
  77. data/features/support/models/fox.rb +5 -0
  78. data/features/support/models/gamma.rb +5 -0
  79. data/features/support/models/person.rb +23 -0
  80. data/features/support/models/post.rb +21 -0
  81. data/features/support/models/robot.rb +12 -0
  82. data/features/support/models/tag.rb +3 -0
  83. data/features/support/models/tagging.rb +4 -0
  84. data/lib/thinking_sphinx/xml.rb +5 -0
  85. data/lib/thinking_sphinx/xml/adapters/abstract_adapter.rb +34 -0
  86. data/lib/thinking_sphinx/xml/adapters/oracle_adapter.rb +123 -0
  87. data/lib/thinking_sphinx/xml/adapters/sqlite3_adapter.rb +95 -0
  88. data/lib/thinking_sphinx/xml/source.rb +46 -0
  89. data/lib/thinking_sphinx/xml/tasks.rb +95 -0
  90. data/spec/cucumber_env.rb +22 -0
  91. metadata +183 -0
@@ -0,0 +1,123 @@
1
+ module ThinkingSphinx
2
+ class OracleAdapter < AbstractAdapter
3
+ def setup
4
+ create_group_concat_function
5
+ create_crc32_function
6
+ end
7
+
8
+ def sphinx_identifier
9
+ "odbc"
10
+ end
11
+
12
+ def concatenate(clause, separator = ' ')
13
+ clause.split(', ').collect { |field| field }.join(" || '#{separator}' || ")
14
+ end
15
+
16
+ def group_concatenate(clause, separator = ' ')
17
+ "TO_STRING(CAST(COLLECT(TO_CHAR(#{clause})) AS SYS.ODCIVARCHAR2LIST), '#{separator}')"
18
+ end
19
+
20
+ def cast_to_string(clause)
21
+ "TO_CHAR(#{clause})"
22
+ end
23
+
24
+ def cast_to_datetime(clause)
25
+ "(TO_DATE(TO_CHAR(#{clause}, 'YYYY-MON-DD HH24.MI.SS'), 'YYYY-MON-DD HH24.MI.SS') - TO_DATE('01-JAN-1970','DD-MON-YYYY')) * (86400)"
26
+ end
27
+
28
+ def cast_to_unsigned(clause)
29
+ "CAST(#{clause} AS NUMBER(10,0))"
30
+ end
31
+
32
+ def convert_nulls(clause, default = '')
33
+ return clause if default == ''
34
+ default = "'#{default}'" if default.is_a?(String)
35
+ "NVL(#{clause},#{default})"
36
+ end
37
+
38
+ def boolean(value)
39
+ value ? '1' : '0'
40
+ end
41
+
42
+ # TODO
43
+ def crc(clause, blank_to_null = false)
44
+ "CRC32(#{clause})"
45
+ end
46
+
47
+ def utf8_query_pre
48
+ nil
49
+ end
50
+
51
+ def time_difference(diff)
52
+ "SYSDATE - #{diff}/(86400)"
53
+ end
54
+
55
+ def select_each(query)
56
+ cursor = connection.raw_connection.exec(query)
57
+ col_names = cursor.get_col_names.collect(&:downcase)
58
+ while values = cursor.fetch
59
+ hash_values = Hash[*col_names.zip(values).flatten]
60
+ yield hash_values
61
+ end
62
+ ensure
63
+ cursor.close if cursor
64
+ end
65
+
66
+ private
67
+
68
+ # Requires Oracle 10g+
69
+ # Return only first 4000 bytes
70
+ def create_group_concat_function
71
+ connection.execute <<-SQL
72
+ CREATE OR REPLACE FUNCTION to_string (
73
+ nt_in IN SYS.ODCIVARCHAR2LIST,
74
+ delimiter_in IN VARCHAR2 DEFAULT ','
75
+ ) RETURN VARCHAR2 IS
76
+ v_idx PLS_INTEGER;
77
+ v_str VARCHAR2(4000);
78
+ v_dlm VARCHAR2(1);
79
+ BEGIN
80
+ v_idx := nt_in.FIRST;
81
+ WHILE v_idx IS NOT NULL LOOP
82
+ v_str := SUBSTRB(v_str || v_dlm || nt_in(v_idx), 1, 4000);
83
+ v_dlm := delimiter_in;
84
+ v_idx := nt_in.NEXT(v_idx);
85
+ END LOOP;
86
+ RETURN v_str;
87
+ END to_string;
88
+ SQL
89
+ end
90
+
91
+ # Requires Oracle 10g+
92
+ def create_crc32_function
93
+ connection.execute <<-SQL
94
+ CREATE OR REPLACE FUNCTION crc32(
95
+ word IN VARCHAR2
96
+ ) RETURN NUMBER IS
97
+ code NUMBER(4,0);
98
+ i NUMBER(10,0);
99
+ j NUMBER(1,0);
100
+ tmp NUMBER(10,0);
101
+ tmp_a NUMBER(10,0);
102
+ tmp_b NUMBER(10,0);
103
+ BEGIN
104
+ tmp := 4294967295;
105
+ i := 0;
106
+ WHILE i < length(word) LOOP
107
+ code := ascii(SUBSTR(word, i + 1, 1));
108
+ tmp := tmp - 2 * to_number(bitand(tmp, code)) + code;
109
+ j := 0;
110
+ WHILE j < 8 LOOP
111
+ tmp_a := floor(tmp / 2);
112
+ tmp_b := 3988292384 * to_number(bitand(tmp, 1));
113
+ tmp := tmp_a - 2 * to_number(bitand(tmp_a, tmp_b)) + tmp_b;
114
+ j := j + 1;
115
+ END LOOP;
116
+ i := i + 1;
117
+ END LOOP;
118
+ RETURN tmp - 2 * to_number(bitand(tmp, 4294967295)) + 4294967295;
119
+ END crc32;
120
+ SQL
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,95 @@
1
+ module ThinkingSphinx
2
+ class SQLite3Adapter < AbstractAdapter
3
+ def setup
4
+ create_group_concat_function
5
+ create_crc32_function
6
+ end
7
+
8
+ def sphinx_identifier
9
+ "sqlite3"
10
+ end
11
+
12
+ def concatenate(clause, separator = ' ')
13
+ clause.split(', ').collect { |field| field }.join(" || '#{separator}' || ")
14
+ end
15
+
16
+ def group_concatenate(clause, separator = ' ')
17
+ "GROUP_CONCAT(#{clause}, '#{separator}')"
18
+ end
19
+
20
+ def cast_to_string(clause)
21
+ "CAST(#{clause} AS TEXT)"
22
+ end
23
+
24
+ def cast_to_datetime(clause)
25
+ "STRFTIME('%s', #{clause})"
26
+ end
27
+
28
+ def cast_to_unsigned(clause)
29
+ "CAST(#{clause} AS INTEGER)"
30
+ end
31
+
32
+ def convert_nulls(clause, default = '')
33
+ default = "'#{default}'" if default.is_a?(String)
34
+ "IFNULL(#{clause},#{default})"
35
+ end
36
+
37
+ def boolean(value)
38
+ value ? "'t'" : "'f'"
39
+ end
40
+
41
+ def crc(clause, blank_to_null = false)
42
+ "CRC32(#{clause})"
43
+ end
44
+
45
+ def utf8_query_pre
46
+ nil
47
+ end
48
+
49
+ def time_difference(diff)
50
+ "STRFTIME('%s','now') - STRFTIME('%s', #{diff})"
51
+ end
52
+
53
+ private
54
+
55
+ def create_group_concat_function
56
+ connection.raw_connection.create_aggregate("group_concat", 2) do
57
+ step do |func, value, separator|
58
+ if !value.null? && !separator.null?
59
+ if func[:concat].nil?
60
+ func[:concat] = value.to_s
61
+ else
62
+ func[:concat] << separator.to_s
63
+ func[:concat] << value.to_s
64
+ end
65
+ end
66
+ end
67
+ finalize do |func|
68
+ func.result = func[:concat]
69
+ end
70
+ end
71
+ end
72
+
73
+ def create_crc32_function
74
+ connection.raw_connection.create_function("crc32", 1) do |func, value|
75
+ r = 0
76
+ if !value.null?
77
+ c = value.to_s
78
+ n = c.length
79
+ r = 0xFFFFFFFF
80
+ n.times do |i|
81
+ r ^= c[i]
82
+ 8.times do
83
+ if (r & 1) != 0
84
+ r = (r >> 1) ^ 0xEDB88320
85
+ else
86
+ r >>= 1
87
+ end
88
+ end
89
+ end
90
+ end
91
+ func.result = r ^ 0xFFFFFFFF
92
+ end
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,46 @@
1
+ module ThinkingSphinx
2
+ class Source
3
+ def to_riddle_for_core(offset, position)
4
+ source = Riddle::Configuration::XMLSource.new(
5
+ "#{index.core_name}_#{position}", "xmlpipe2"
6
+ )
7
+
8
+ set_source_xml_settings source, offset
9
+ set_source_attributes source, offset
10
+ set_source_settings source
11
+
12
+ source
13
+ end
14
+
15
+ def to_riddle_for_delta(offset, position)
16
+ source = Riddle::Configuration::XMLSource.new(
17
+ "#{index.delta_name}_#{position}", "xmlpipe2"
18
+ )
19
+ source.parent = "#{index.core_name}_#{position}"
20
+
21
+ set_source_xml_settings source, offset
22
+ set_source_attributes source, offset
23
+ set_source_settings source
24
+
25
+ source
26
+ end
27
+
28
+ private
29
+
30
+ def set_source_xml_settings(source, offset)
31
+ env = ThinkingSphinx::Configuration.instance.environment
32
+ database = ENV['DATABASE'] || 'mysql'
33
+ source.xmlpipe_command = "rake -s ts:xml NAME=#{source.name} OFFSET=#{offset} RAILS_ENV=#{env} MERB_ENV=#{env} DATABASE=#{database}"
34
+ @fields.each do |field|
35
+ source.xmlpipe_field << field.unique_name
36
+ end
37
+ end
38
+
39
+ def set_source_attributes(source, offset)
40
+ attributes.each do |attrib|
41
+ type = attrib.type_to_config.to_s.sub("sql_", "xmlpipe_")
42
+ source.send(type) << attrib.unique_name
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,95 @@
1
+ require 'thinking_sphinx'
2
+ require 'thinking_sphinx/xml'
3
+
4
+ namespace :thinking_sphinx do
5
+ # http://www.sphinxsearch.com/docs/current.html#xmlpipe2
6
+ desc "Streams XML data to STDOUT"
7
+ task :xml => :app_env do
8
+ # ThinkingSphinx::Configuration.instance.load_models
9
+ source_name = ENV["NAME"]
10
+ # STDERR.puts "Source name: #{source_name}"
11
+ source_name =~ /^(.+)_(delta|core)_(\d+)$/
12
+ sphinx_name = $1
13
+ delta = $2 == "delta"
14
+ index_name = "#{$1}_#{$2}"
15
+ offset = ENV["OFFSET"]
16
+ ThinkingSphinx.context.prepare
17
+ ThinkingSphinx.context.define_indexes
18
+ index = nil
19
+ model_klass = ThinkingSphinx.context.indexed_models.collect{ |m| m.constantize }.detect do |model|
20
+ index = model.sphinx_indexes.detect { |i| i.name == sphinx_name }
21
+ end
22
+ # STDERR.puts model_klass.name
23
+ # STDERR.puts index
24
+ model_klass.sphinx_database_adapter.setup
25
+
26
+ source = index.sources.first
27
+ sql_query_range = source.to_sql_query_range(:delta => delta)
28
+ sql_query = source.to_sql(:offset => offset, :delta => delta)
29
+
30
+ # get $start, $end
31
+ # STDERR.puts sql_query_range
32
+ range_start, range_end = model_klass.connection.select_rows(sql_query_range).first.collect(&:to_i)
33
+ sql_query = sql_query.gsub('$start', range_start.to_s).gsub('$end', range_end.to_s)
34
+
35
+ # fetch sql and generate xml
36
+ puts %{<?xml version="1.0" encoding="utf-8"?>}
37
+ puts %{<sphinx:docset>}
38
+
39
+ # results = model_klass.connection.select_all(query)
40
+ # STDERR.puts "fetching #{start_id}.. "
41
+ # STDERR.puts sql_query
42
+ model_klass.sphinx_database_adapter.select_each(sql_query) do |values|
43
+ pk_name = model_klass.primary_key_for_sphinx.to_s
44
+ id = values.delete(pk_name)
45
+ puts %{<sphinx:document id="#{id.to_i}">}
46
+ values.each do |k, v|
47
+ attribute = source.attributes.detect { |a| a.unique_name == k.to_sym }
48
+ # STDERR.puts attribute
49
+ case attribute && attribute.type
50
+ when :boolean
51
+ v = ['Y', 'T', '1', 1, true].include?(v) ? 1 : 0
52
+ when :integer, :datetime
53
+ v = v.to_i
54
+ when :float
55
+ v = v.to_f
56
+ else
57
+ v = v.to_s.to_xs
58
+ end
59
+ puts %{<#{k}>#{v}</#{k}>}
60
+ end
61
+ # Add MVA attributes (:ranged_query, :query)
62
+ internal_id = values["sphinx_internal_id"]
63
+ multi_attributes = source.attributes.select { |a| a.type == :multi && !a.include_as_association? }
64
+ multi_attributes.each do |attribute|
65
+ k = attribute.unique_name
66
+ mva_query = attribute.send(:query, offset)
67
+ mva_query_range = attribute.send(:range_query)
68
+ # STDERR.puts "MVA_ATTRS: #{params.inspect}"
69
+ # mva_definition, mva_query, mva_query_range = params.split(";")
70
+ if mva_query
71
+ mva_query = mva_query.gsub('$start', internal_id.to_s).gsub('$end', internal_id.to_s)
72
+ printf %{<#{k}>}
73
+ not_first = false
74
+ model_klass.sphinx_database_adapter.select_each(mva_query) do |values|
75
+ if not_first
76
+ printf ","
77
+ else
78
+ not_first = true
79
+ end
80
+ printf values.values.first.to_s.to_xs
81
+ end
82
+ puts %{</#{k}>}
83
+ end
84
+ end
85
+ puts %{</sphinx:document>}
86
+ end
87
+
88
+ puts %{</sphinx:docset>}
89
+ end
90
+ end
91
+
92
+ namespace :ts do
93
+ desc "Streams XML data to STDOUT"
94
+ task :xml => "thinking_sphinx:xml"
95
+ end
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'cucumber'
3
+ require 'spec'
4
+ require 'fileutils'
5
+ require 'ginger'
6
+ require 'will_paginate'
7
+ require 'active_record'
8
+
9
+ $:.unshift File.dirname(__FILE__) + '/../../lib'
10
+ Dir[File.join(File.dirname(__FILE__), '../../vendor/*/lib')].each do |path|
11
+ $:.unshift path
12
+ end
13
+
14
+ require 'cucumber/thinking_sphinx/internal_world'
15
+
16
+ world = Cucumber::ThinkingSphinx::InternalWorld.new
17
+ world.configure_database
18
+
19
+ require "thinking_sphinx"
20
+ require "thinking_sphinx/xml"
21
+
22
+ world.setup
metadata ADDED
@@ -0,0 +1,183 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ts-xml
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Edgars Beigarts
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-09 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: thinking-sphinx
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.3.8
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.2.9
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: yard
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: cucumber
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ description: Support for Oracle, SQLite3 using xmlpipe2 for Thinking Sphinx
56
+ email: 1@wb4.lv
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - LICENSE
63
+ - README.textile
64
+ files:
65
+ - LICENSE
66
+ - README.textile
67
+ - lib/thinking_sphinx/xml.rb
68
+ - lib/thinking_sphinx/xml/adapters/abstract_adapter.rb
69
+ - lib/thinking_sphinx/xml/adapters/oracle_adapter.rb
70
+ - lib/thinking_sphinx/xml/adapters/sqlite3_adapter.rb
71
+ - lib/thinking_sphinx/xml/source.rb
72
+ - lib/thinking_sphinx/xml/tasks.rb
73
+ has_rdoc: true
74
+ homepage: http://github.com/ebeigarts/ts-xml
75
+ licenses: []
76
+
77
+ post_install_message:
78
+ rdoc_options:
79
+ - --charset=UTF-8
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: "0"
87
+ version:
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: "0"
93
+ version:
94
+ requirements: []
95
+
96
+ rubyforge_project:
97
+ rubygems_version: 1.3.5
98
+ signing_key:
99
+ specification_version: 3
100
+ summary: Thinking Sphinx - XML
101
+ test_files:
102
+ - features/alternate_primary_key.feature
103
+ - features/attribute_transformation.feature
104
+ - features/attribute_updates.feature
105
+ - features/deleting_instances.feature
106
+ - features/direct_attributes.feature
107
+ - features/excerpts.feature
108
+ - features/extensible_delta_indexing.feature
109
+ - features/facets.feature
110
+ - features/facets_across_model.feature
111
+ - features/handling_edits.feature
112
+ - features/retry_stale_indexes.feature
113
+ - features/searching_across_models.feature
114
+ - features/searching_by_index.feature
115
+ - features/searching_by_model.feature
116
+ - features/searching_with_find_arguments.feature
117
+ - features/sphinx_detection.feature
118
+ - features/sphinx_scopes.feature
119
+ - features/step_definitions/alpha_steps.rb
120
+ - features/step_definitions/beta_steps.rb
121
+ - features/step_definitions/common_steps.rb
122
+ - features/step_definitions/extensible_delta_indexing_steps.rb
123
+ - features/step_definitions/facet_steps.rb
124
+ - features/step_definitions/find_arguments_steps.rb
125
+ - features/step_definitions/gamma_steps.rb
126
+ - features/step_definitions/scope_steps.rb
127
+ - features/step_definitions/search_steps.rb
128
+ - features/step_definitions/sphinx_steps.rb
129
+ - features/sti_searching.feature
130
+ - features/support/database.example.yml
131
+ - features/support/db/fixtures/alphas.rb
132
+ - features/support/db/fixtures/authors.rb
133
+ - features/support/db/fixtures/betas.rb
134
+ - features/support/db/fixtures/boxes.rb
135
+ - features/support/db/fixtures/categories.rb
136
+ - features/support/db/fixtures/cats.rb
137
+ - features/support/db/fixtures/comments.rb
138
+ - features/support/db/fixtures/developers.rb
139
+ - features/support/db/fixtures/dogs.rb
140
+ - features/support/db/fixtures/extensible_betas.rb
141
+ - features/support/db/fixtures/foxes.rb
142
+ - features/support/db/fixtures/gammas.rb
143
+ - features/support/db/fixtures/people.rb
144
+ - features/support/db/fixtures/posts.rb
145
+ - features/support/db/fixtures/robots.rb
146
+ - features/support/db/fixtures/tags.rb
147
+ - features/support/db/migrations/create_alphas.rb
148
+ - features/support/db/migrations/create_animals.rb
149
+ - features/support/db/migrations/create_authors.rb
150
+ - features/support/db/migrations/create_authors_posts.rb
151
+ - features/support/db/migrations/create_betas.rb
152
+ - features/support/db/migrations/create_boxes.rb
153
+ - features/support/db/migrations/create_categories.rb
154
+ - features/support/db/migrations/create_comments.rb
155
+ - features/support/db/migrations/create_developers.rb
156
+ - features/support/db/migrations/create_extensible_betas.rb
157
+ - features/support/db/migrations/create_gammas.rb
158
+ - features/support/db/migrations/create_people.rb
159
+ - features/support/db/migrations/create_posts.rb
160
+ - features/support/db/migrations/create_robots.rb
161
+ - features/support/db/migrations/create_taggings.rb
162
+ - features/support/db/migrations/create_tags.rb
163
+ - features/support/env.rb
164
+ - features/support/lib/generic_delta_handler.rb
165
+ - features/support/models/alpha.rb
166
+ - features/support/models/animal.rb
167
+ - features/support/models/author.rb
168
+ - features/support/models/beta.rb
169
+ - features/support/models/box.rb
170
+ - features/support/models/cat.rb
171
+ - features/support/models/category.rb
172
+ - features/support/models/comment.rb
173
+ - features/support/models/developer.rb
174
+ - features/support/models/dog.rb
175
+ - features/support/models/extensible_beta.rb
176
+ - features/support/models/fox.rb
177
+ - features/support/models/gamma.rb
178
+ - features/support/models/person.rb
179
+ - features/support/models/post.rb
180
+ - features/support/models/robot.rb
181
+ - features/support/models/tag.rb
182
+ - features/support/models/tagging.rb
183
+ - spec/cucumber_env.rb