cloudsearchable 0.0.2 → 0.0.3

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.
data/README.md CHANGED
@@ -14,12 +14,6 @@ class Customer
14
14
 
15
15
  # This is the default index. You probably only need one.
16
16
  index_in_cloudsearch do |idx|
17
- literal :id, :searchable => true
18
- end
19
-
20
- # A named index.
21
- index_in_cloudsearch :test_index do |idx|
22
-
23
17
  # Fetch the customer_id field from customer
24
18
  literal :customer_id, :returnable => true, :searchable => true, :source => Proc.new { customer }
25
19
 
@@ -29,6 +23,11 @@ class Customer
29
23
  # uint fields can be used in result ranking functions
30
24
  uint :helpfulness, :returnable => true, :searchable => false do; 1234 end
31
25
  end
26
+
27
+ # A named index.
28
+ index_in_cloudsearch :test_index do |idx|
29
+ literal :id, :searchable => true
30
+ end
32
31
  end
33
32
  ```
34
33
  ### 2. Index some objects
@@ -82,6 +81,24 @@ Supported Options
82
81
  * config.fatal_warnings - raises WarningInQueryResult exception on warning. Defaults to false.
83
82
  * config.logger - a custom logger, defaults to Rails if defined.
84
83
 
84
+ ### ActiveSupport Notifications
85
+
86
+ Requests to AWS cloudsearch are instrumented using [ActiveSupport Notifications](http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html). To consume these instrumented events register a subscriber in your Application. For example, to register for getting notifications for search requests:
87
+
88
+ ```ruby
89
+ ActiveSupport::Notifications.subscribe('cloudsearchable.execute_query') do |*args|
90
+ event = ActiveSupport::Notifications::Event.new(*args)
91
+ # Your code here ...
92
+ end
93
+ ```
94
+
95
+ #### Instrumented events:
96
+
97
+ 1. cloudsearchable.execute_query - Instruments search requests
98
+ 2. cloudsearchable.post_record - Instruments record addition
99
+ 3. cloudsearchable.delete_record - Instruments record deletion
100
+ 4. cloudsearchable.describe_domains - Instruments request for getting domains information
101
+
85
102
  ### Other Features
86
103
 
87
104
  Cloudsearchable provides access the underlying AWS client objects, such as '''CloudSearch.client''' and '''class.cloudsearch_domains'''. For example here is how to drop domains associated with Customer class:
@@ -97,9 +114,6 @@ Cloudsearchable provides access the underlying AWS client objects, such as '''Cl
97
114
 
98
115
  See spec tests and source code for more information.
99
116
 
100
- ## TODO:
101
- - use ActiveSupport instrumentation: http://edgeguides.rubyonrails.org/active_support_instrumentation.html#creating-custom-events
102
-
103
117
  ## Credits
104
118
 
105
119
  * [Logan Bowers](https://github.com/loganb)
@@ -116,4 +130,4 @@ MIT License
116
130
  3. Run the tests (`rake spec`)
117
131
  4. Commit your changes (`git commit -am 'Add some feature'`)
118
132
  5. Push to the branch (`git push origin my-new-feature`)
119
- 6. Create new Pull Request
133
+ 6. Create new Pull Request
@@ -46,6 +46,7 @@ Gem::Specification.new do |spec|
46
46
 
47
47
  spec.add_development_dependency "bundler", "~> 1.3"
48
48
  spec.add_development_dependency "rake"
49
+ spec.add_development_dependency "yard"
49
50
  spec.add_dependency 'aws-sdk'
50
51
 
51
52
  # testing dependencies
@@ -8,6 +8,7 @@ require 'cloudsearchable/config'
8
8
 
9
9
  require 'active_support/inflector'
10
10
  require 'active_support/core_ext/string'
11
+ require 'active_support/notifications'
11
12
 
12
13
  module Cloudsearchable
13
14
  def self.configure
@@ -76,19 +76,25 @@ module Cloudsearchable
76
76
 
77
77
  # Add or replace the CloudSearch document for a particular version of a record
78
78
  def post_record record, record_id, version
79
- CloudSearch.post_sdf doc_endpoint, addition_sdf(record, record_id, version)
79
+ ActiveSupport::Notifications.instrument('cloudsearchable.post_record') do
80
+ CloudSearch.post_sdf doc_endpoint, addition_sdf(record, record_id, version)
81
+ end
80
82
  end
81
83
 
82
84
  # Delete the CloudSearch document for a particular record (version must be greater than the last version pushed)
83
85
  def delete_record record_id, version
84
- CloudSearch.post_sdf doc_endpoint, deletion_sdf(record_id, version)
86
+ ActiveSupport::Notifications.instrument('cloudsearchable.delete_record') do
87
+ CloudSearch.post_sdf doc_endpoint, deletion_sdf(record_id, version)
88
+ end
85
89
  end
86
90
 
87
91
  def execute_query(params)
88
92
  uri = URI("http://#{search_endpoint}/#{CloudSearch::API_VERSION}/search")
89
93
  uri.query = URI.encode_www_form(params)
90
94
  Cloudsearchable.logger.info "CloudSearch execute: #{uri.to_s}"
91
- res = Net::HTTP.get_response(uri).body
95
+ res = ActiveSupport::Notifications.instrument('cloudsearchable.execute_query') do
96
+ Net::HTTP.get_response(uri).body
97
+ end
92
98
  JSON.parse(res)
93
99
  end
94
100
 
@@ -124,7 +130,9 @@ module Cloudsearchable
124
130
  #
125
131
  def cloudsearch_domain(force_reload = false)
126
132
  if(force_reload || !@domain)
127
- @domain = CloudSearch.client.describe_domains(:domain_names => [name])
133
+ @domain = ActiveSupport::Notifications.instrument('cloudsearchable.describe_domains') do
134
+ CloudSearch.client.describe_domains(:domain_names => [name])
135
+ end
128
136
  else
129
137
  @domain
130
138
  end
@@ -36,6 +36,9 @@ module Cloudsearchable
36
36
  #
37
37
  # Collection.search.where(:customer_id, :==, 12345)
38
38
  #
39
+ # The value you provide must be of the same type as the field. For text and literal
40
+ # values, provide a string value. For uint fields, provide a numeric value.
41
+ #
39
42
  # To search for any of several possible values for a field, use the :any operator:
40
43
  #
41
44
  # Collection.search.where(:product_group, :any, %w{gl_kitchen gl_grocery})
@@ -52,26 +55,10 @@ module Cloudsearchable
52
55
  where(k, :==, v)
53
56
  end
54
57
  elsif field_or_hash.is_a? Symbol
55
- field = field_or_hash
56
- @clauses << if op == :within_range
57
- "#{field}:#{value.to_s}"
58
- elsif op == :== || op == :eq
59
- "#{field}:'#{value.to_s}'"
60
- elsif op == :any
61
- '(or ' + value.map { |v| "#{field}:'#{v.to_s}'" }.join(' ') + ')'
62
- elsif op == :!=
63
- "(not #{field}:'#{value.to_s}')"
64
- elsif op == :> && value.is_a?(Integer)
65
- "#{field}:#{value+1}.."
66
- elsif op == :< && value.is_a?(Integer)
67
- "#{field}:..#{value-1}"
68
- elsif op == :>= && value.is_a?(Integer)
69
- "#{field}:#{value}.."
70
- elsif op == :<= && value.is_a?(Integer)
71
- "#{field}:..#{value}"
72
- else
73
- raise "op #{op} is unrecognized"
74
- end
58
+ if (field = domain.fields[field_or_hash.to_sym]).nil?
59
+ raise "cannot query on field '#{field_or_hash}' because it is not a member of this index"
60
+ end
61
+ @clauses << clause_for(field_or_hash, field.type, op, value)
75
62
  else
76
63
  raise "field_or_hash must be a Hash or Symbol, not a #{field_or_hash.class}"
77
64
  end
@@ -204,7 +191,7 @@ module Cloudsearchable
204
191
  def to_q
205
192
  raise NoClausesError, "no search terms were specified" if (@clauses.nil? || @clauses.empty?) && (@q.nil? || @q.empty?)
206
193
 
207
- bq = (@clauses.count > 0) ? "(and #{@clauses.join(' ')})" : @clauses.first
194
+ bq = (@clauses.count > 1) ? "(and #{@clauses.join(' ')})" : @clauses.first
208
195
  {
209
196
  q: @q,
210
197
  bq: bq,
@@ -214,5 +201,55 @@ module Cloudsearchable
214
201
  :'return-fields' => @fields.reduce("") { |s,f| s << f.to_s }
215
202
  }
216
203
  end
204
+
205
+ private
206
+
207
+ def clause_for(field, type, op, value)
208
+ # Operations for which 'value' is not a scalar
209
+ if op == :any
210
+ '(or ' + value.map { |v| "#{field}:#{query_clause_value(type, v)}" }.join(' ') + ')'
211
+ elsif op == :within_range && type == :uint
212
+ "#{field}:#{value.to_s}"
213
+ else
214
+ value = query_clause_value(type, value)
215
+
216
+ # Some operations are applicable to all types.
217
+ case op
218
+ when :==, :eq
219
+ "#{field}:#{value}"
220
+ when :!=
221
+ "(not #{field}:#{value})"
222
+ else
223
+ # Operation-specific, type-specific operations on scalars
224
+ case type
225
+ when :uint
226
+ case op
227
+ when :>
228
+ "#{field}:#{value+1}.."
229
+ when :<
230
+ "#{field}:..#{value-1}"
231
+ when :>=
232
+ "#{field}:#{value}.."
233
+ when :<=
234
+ "#{field}:..#{value}"
235
+ else
236
+ raise "op #{op} is unrecognized for value #{value} of type #{type}"
237
+ end
238
+ else
239
+ raise "op #{op} is unrecognized for value #{value} of type #{type}"
240
+ end
241
+ end
242
+ end
243
+ end
244
+
245
+ def query_clause_value(type, value)
246
+ if type == :uint
247
+ Integer(value)
248
+ elsif !value.nil?
249
+ "'#{value.to_s}'"
250
+ else
251
+ raise "Value #{value} cannot be converted to query string on type #{type}"
252
+ end
253
+ end
217
254
  end
218
255
  end
@@ -1,3 +1,3 @@
1
1
  module Cloudsearchable
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -5,7 +5,7 @@ describe Cloudsearchable do
5
5
  let(:clazz){ CloudSearchableSampleClassFactory.call }
6
6
 
7
7
  it 'can describe an index that returns ids for the class type' do
8
- test_index = clazz.cloudsearch_index(:test_index)
8
+ test_index = clazz.cloudsearch_index
9
9
  test_index.should be_kind_of(Cloudsearchable::Domain)
10
10
  test_index.fields.should have(4).items #3 explicit + 1 for the id of the object
11
11
  end
@@ -33,7 +33,7 @@ describe Cloudsearchable do
33
33
  end
34
34
 
35
35
  it 'supplies the right values to the fields' do
36
- test_index = clazz.cloudsearch_index(:test_index)
36
+ test_index = clazz.cloudsearch_index
37
37
  test_index.fields[:test_class_id].value_for(inst).should be(inst.id)
38
38
  test_index.fields[:customer_id].value_for(inst).should be(inst.customer)
39
39
  test_index.fields[:test_name].value_for(inst).should be(inst.name)
@@ -47,7 +47,7 @@ describe Cloudsearchable do
47
47
  end
48
48
 
49
49
  it 'generates a sensible addition sdf document' do
50
- sdf = clazz.cloudsearch_index(:test_index).send :addition_sdf, inst, inst.id, inst.lock_version
50
+ sdf = clazz.cloudsearch_index.send :addition_sdf, inst, inst.id, inst.lock_version
51
51
  sdf[:fields][:helpfulness].should be(1234)
52
52
  end
53
53
  end
@@ -4,26 +4,6 @@ require 'test_classes/cloud_searchable_test_class'
4
4
  describe Cloudsearchable::Query do
5
5
  let(:clazz){ CloudSearchableSampleClassFactory.call }
6
6
 
7
- it 'can build a simple search query' do
8
- clazz.search.where(:customer_id, :eq, 12345).query.to_q[:bq].should =~ /customer_id:'12345'/
9
- end
10
-
11
- it 'chains' do
12
- query = clazz.search.where(customer_id: 12345).where(helpfulness: 42).query.to_q[:bq]
13
- query.should =~ /customer_id:'12345'/
14
- query.should =~ /helpfulness:'42'/
15
- end
16
-
17
- it 'can build a query with "not equal to" condition' do
18
- query = clazz.search.where(:customer_id, :!=, 1234).query.to_q[:bq].should =~ /\(not customer_id:'1234'\)/
19
- end
20
-
21
- it 'can build a query from a hash' do
22
- query = clazz.search.where(customer_id: 12345, helpfulness: 42).query.to_q[:bq]
23
- query.should =~ /customer_id:'12345'/
24
- query.should =~ /helpfulness:'42'/
25
- end
26
-
27
7
  it "doesn't build queries without a query term" do
28
8
  expect do
29
9
  query = clazz.search.limit(10).query.to_q
@@ -31,40 +11,100 @@ describe Cloudsearchable::Query do
31
11
  end
32
12
 
33
13
  describe '#where' do
34
- describe 'uint data type' do
35
- describe 'within_range' do
36
- it 'supports range query with uint fields' do
37
- clazz.search.where(:helpfulness, :within_range, "0..#{123}").query.to_q[:bq].should =~ /helpfulness:0..123/
38
- end
14
+ it 'can build a simple search query' do
15
+ clazz.search.where(:customer_id, :eq, 'A1234').query.to_q[:bq].should =~ /customer_id:'A1234'/
16
+ end
39
17
 
40
- it 'supports range query with uint fields using a ruby range' do
41
- clazz.search.where(:helpfulness, :within_range, 0..123).query.to_q[:bq].should =~ /helpfulness:0..123/
42
- end
18
+ it 'rejects field names that were not defined in the index' do
19
+ expect { clazz.search.where(:mispeled_field, :eq, 12345) }.to raise_exception
20
+ end
21
+
22
+ it 'chains' do
23
+ query = clazz.search.where(customer_id: 'A1234').where(helpfulness: 42).query.to_q[:bq]
24
+ query.should =~ /customer_id:'A1234'/
25
+ query.should =~ /helpfulness:42/
26
+ end
27
+
28
+ it 'can build a query with "not equal to" condition' do
29
+ query = clazz.search.where(:customer_id, :!=, 'A1234').query.to_q[:bq].should =~ /\(not customer_id:'A1234'\)/
30
+ end
31
+
32
+ it 'can build a query from a hash' do
33
+ query = clazz.search.where(customer_id: 'A1234', helpfulness: 42).query.to_q[:bq]
34
+ query.should =~ /customer_id:'A1234'/
35
+ query.should =~ /helpfulness:42/
36
+ end
37
+
38
+ context 'literal data type' do
39
+ it 'supports equality' do
40
+ clazz.search.where(:customer_id, :==, 'ABC').query.to_q[:bq].should eq "customer_id:'ABC'"
43
41
  end
44
42
 
45
- describe 'inequalities' do
46
- it 'supports greater-than with uint fields' do
47
- clazz.search.where(:helpfulness, :>, 123).query.to_q[:bq].should =~ /helpfulness:124../
48
- end
43
+ it 'supports :any' do
44
+ clazz.search.where(:customer_id, :any, ['ABC', 'DEF']).query.to_q[:bq].should eq "(or customer_id:'ABC' customer_id:'DEF')"
45
+ end
49
46
 
50
- it 'supports greater-than-or-equal-to with uint fields' do
51
- clazz.search.where(:helpfulness, :>=, 123).query.to_q[:bq].should =~ /helpfulness:123../
52
- end
47
+ it 'accepts a value as an integer' do
48
+ clazz.search.where(customer_id: 123).query.to_q[:bq].should =~ /customer_id:'123'/
49
+ end
53
50
 
54
- it 'supports less-than with uint fields' do
55
- clazz.search.where(:helpfulness, :<, 123).query.to_q[:bq].should =~ /helpfulness:..122/
56
- end
51
+ it 'rejects nil value' do
52
+ expect { clazz.search.where(customer_id: nil) }.to raise_exception
53
+ end
54
+ end
55
+
56
+ context 'uint data type' do
57
+ it 'supports range query' do
58
+ clazz.search.where(:helpfulness, :within_range, "0..#{123}").query.to_q[:bq].should =~ /helpfulness:0..123/
59
+ end
60
+
61
+ it 'supports range query using a ruby range' do
62
+ clazz.search.where(:helpfulness, :within_range, 0..123).query.to_q[:bq].should =~ /helpfulness:0..123/
63
+ end
64
+
65
+ it 'supports equality' do
66
+ clazz.search.where(:helpfulness, :==, 123).query.to_q[:bq].should eq 'helpfulness:123'
67
+ end
68
+
69
+ it 'supports not-equality' do
70
+ clazz.search.where(:helpfulness, :!=, 123).query.to_q[:bq].should eq '(not helpfulness:123)'
71
+ end
72
+
73
+ it 'supports greater-than' do
74
+ clazz.search.where(:helpfulness, :>, 123).query.to_q[:bq].should =~ /helpfulness:124../
75
+ end
57
76
 
58
- it 'supports less-than-or-equal-to with uint fields' do
59
- clazz.search.where(:helpfulness, :<=, 123).query.to_q[:bq].should =~ /helpfulness:..123/
77
+ it 'supports greater-than-or-equal-to' do
78
+ clazz.search.where(:helpfulness, :>=, 123).query.to_q[:bq].should =~ /helpfulness:123../
79
+ end
80
+
81
+ it 'supports less-than' do
82
+ clazz.search.where(:helpfulness, :<, 123).query.to_q[:bq].should =~ /helpfulness:..122/
83
+ end
84
+
85
+ it 'supports less-than-or-equal-to' do
86
+ clazz.search.where(:helpfulness, :<=, 123).query.to_q[:bq].should =~ /helpfulness:..123/
87
+ end
88
+
89
+ it 'supports :any' do
90
+ clazz.search.where(:helpfulness, :any, [123, 456]).query.to_q[:bq].should eq '(or helpfulness:123 helpfulness:456)'
91
+ end
92
+
93
+ it 'accepts a value as a string' do
94
+ clazz.search.where(helpfulness: '123').query.to_q[:bq].should =~ /helpfulness:123/
95
+ end
96
+
97
+ [Object.new, nil, '123a'].each do |v|
98
+ it "rejects value #{v} of type #{v.class}" do
99
+ expect { clazz.search.where(helpfulness: v) }.to raise_exception
60
100
  end
101
+ end
102
+ end
61
103
 
62
- it 'does not permit inequality operators with non-integer fields' do
63
- [:>, :>=, :<, :<=].each do |op|
64
- ['123', nil, 12.0].each do |value|
65
- expect { clazz.search.where(:helpfulness, op, value).query.to_q[:bq] }.to raise_error
66
- end
67
- end
104
+ [:>, :>=, :<, :<=].each do |op|
105
+ [Object.new, nil, '123a'].each do |v|
106
+ it "does not permit op #{op} on value #{v} of type #{v.class}" do
107
+ expect { clazz.search.where(:helpfulness, op, v).query.to_q[:bq] }.to raise_error
68
108
  end
69
109
  end
70
110
  end
@@ -72,7 +112,7 @@ describe Cloudsearchable::Query do
72
112
 
73
113
 
74
114
  it 'supports querying for any of several values of a field' do
75
- clazz.search.where(:category, :any, %w{big small}).query.to_q[:bq].should include("(or category:'big' category:'small')")
115
+ clazz.search.where(:test_name, :any, %w{big small}).query.to_q[:bq].should include("(or test_name:'big' test_name:'small')")
76
116
  end
77
117
 
78
118
  it 'supports text method' do
@@ -81,9 +121,9 @@ describe Cloudsearchable::Query do
81
121
  end
82
122
 
83
123
  it 'supports chaining text and where clauses together' do
84
- query = clazz.search.text('test').where(:featured, :==, 'f').query
124
+ query = clazz.search.text('test').where(:helpfulness, :==, 123).query
85
125
  query.to_q[:q].should =~ /test/
86
- query.to_q[:bq].should =~ /featured:'f'/
126
+ query.to_q[:bq].should =~ /helpfulness:123/
87
127
  end
88
128
 
89
129
  it 'supports ordering with a rank expression' do
@@ -123,16 +163,16 @@ describe Cloudsearchable::Query do
123
163
  "found" => 285,
124
164
  "start" => 0,
125
165
  "hit" => [
126
- {"id" => "40bdd5072b6dbae6245fe4ee837d22e3","data" => {"collection_item_id" => ["PCxSz65GIcZTtc0UpRdT-i--w-1365550370"]}},
127
- {"id" => "00af8f5f96aa1db7aff77be5651b3bb1","data" => {"collection_item_id" => ["PCxhksJTLRYnoGXvwZik82Fkw-1365020313"]}},
128
- {"id" => "00b6ac84e3ae402e7698959bf692a53e","data" => {"collection_item_id" => ["PCxs-fIVZnBcTzZ4MtfDguS1A-1365020274"]}},
129
- {"id" => "018fdee653bff74abd12ac30152a2837","data" => {"collection_item_id" => ["PCxmAGHFtAgyqUrgI3HgM_P6Q-1365548349"]}},
130
- {"id" => "01d062d24c389906eea2d16b8193eb56","data" => {"collection_item_id" => ["PCxqjaTmwydKM82NqymbryNfg-1365470479"]}},
131
- {"id" => "01e3ee5d848a30385a4e90eb851b094d","data" => {"collection_item_id" => ["PCxSz65GIcZTtc0UpRdT-i--w-1365550369"]}},
132
- {"id" => "01fca44cc596adb295ca6ee9f9f36499","data" => {"collection_item_id" => ["PCx7XKbKwOVf1VvEWvTl5c1Eg-1365020176"]}},
133
- {"id" => "02b85c9835b5045065ee389954a60c5f","data" => {"collection_item_id" => ["PCxp_xid_WeTfTmb5MySEfxhQ-1365115565"]}},
134
- {"id" => "040c01be434552a1d9e99eef9db87bdd","data" => {"collection_item_id" => ["PCxLOYzA4bCt7-bP6wsZnl-ow-1365020297"]}},
135
- {"id" => "048567c755e30d6d64d757508f1feaa0","data" => {"collection_item_id" => ["PCxJhhnpYkeSKrOxteQo5Jckw-1365115667"]}}
166
+ {"id" => "40bdd5072b6dbae6245fe4ee837d22e3","data" => {"test_class_id" => ["PCxSz65GIcZTtc0UpRdT-i--w-1365550370"]}},
167
+ {"id" => "00af8f5f96aa1db7aff77be5651b3bb1","data" => {"test_class_id" => ["PCxhksJTLRYnoGXvwZik82Fkw-1365020313"]}},
168
+ {"id" => "00b6ac84e3ae402e7698959bf692a53e","data" => {"test_class_id" => ["PCxs-fIVZnBcTzZ4MtfDguS1A-1365020274"]}},
169
+ {"id" => "018fdee653bff74abd12ac30152a2837","data" => {"test_class_id" => ["PCxmAGHFtAgyqUrgI3HgM_P6Q-1365548349"]}},
170
+ {"id" => "01d062d24c389906eea2d16b8193eb56","data" => {"test_class_id" => ["PCxqjaTmwydKM82NqymbryNfg-1365470479"]}},
171
+ {"id" => "01e3ee5d848a30385a4e90eb851b094d","data" => {"test_class_id" => ["PCxSz65GIcZTtc0UpRdT-i--w-1365550369"]}},
172
+ {"id" => "01fca44cc596adb295ca6ee9f9f36499","data" => {"test_class_id" => ["PCx7XKbKwOVf1VvEWvTl5c1Eg-1365020176"]}},
173
+ {"id" => "02b85c9835b5045065ee389954a60c5f","data" => {"test_class_id" => ["PCxp_xid_WeTfTmb5MySEfxhQ-1365115565"]}},
174
+ {"id" => "040c01be434552a1d9e99eef9db87bdd","data" => {"test_class_id" => ["PCxLOYzA4bCt7-bP6wsZnl-ow-1365020297"]}},
175
+ {"id" => "048567c755e30d6d64d757508f1feaa0","data" => {"test_class_id" => ["PCxJhhnpYkeSKrOxteQo5Jckw-1365115667"]}}
136
176
  ]
137
177
  },
138
178
  "info" => {
@@ -161,7 +201,7 @@ describe Cloudsearchable::Query do
161
201
 
162
202
  q = query
163
203
  q.query.instance_variable_set(:@fatal_warnings, false)
164
- lambda{ q.to_a }.should_not raise_error(Cloudsearchable::WarningInQueryResult)
204
+ lambda{ q.to_a }.should_not raise_error
165
205
  end
166
206
  end
167
207
 
@@ -24,11 +24,6 @@ CloudSearchableSampleClassFactory = Proc.new do
24
24
 
25
25
  # This is the default index. You probably only need one.
26
26
  index_in_cloudsearch do |idx|
27
- literal :id, :searchable => true
28
- end
29
-
30
- # A named index.
31
- index_in_cloudsearch :test_index do |idx|
32
27
  # Fetch the customer_id field from customer
33
28
  literal :customer_id, :returnable => true, :searchable => true, :source => Proc.new { customer }
34
29
 
@@ -38,5 +33,10 @@ CloudSearchableSampleClassFactory = Proc.new do
38
33
  # uint fields can be used in result ranking functions
39
34
  uint :helpfulness, :returnable => true, :searchable => false do; 1234 end
40
35
  end
36
+
37
+ # A named index.
38
+ index_in_cloudsearch :test_index do |idx|
39
+ literal :id, :searchable => true
40
+ end
41
41
  end
42
42
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudsearchable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-11 00:00:00.000000000 Z
12
+ date: 2013-10-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: yard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: aws-sdk
48
64
  requirement: !ruby/object:Gem::Requirement