asari 0.3.0 → 0.3.4
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/lib/asari.rb +14 -5
- data/lib/asari/active_record.rb +26 -16
- data/lib/asari/version.rb +1 -1
- data/spec/active_record_spec.rb +4 -4
- data/spec_helper.rb +5 -6
- metadata +5 -5
data/lib/asari.rb
CHANGED
@@ -8,9 +8,12 @@ require "json"
|
|
8
8
|
require "cgi"
|
9
9
|
|
10
10
|
class Asari
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def self.mode
|
12
|
+
@@mode
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.mode=(mode)
|
16
|
+
@@mode = mode
|
14
17
|
end
|
15
18
|
|
16
19
|
attr_writer :api_version
|
@@ -83,7 +86,11 @@ class Asari
|
|
83
86
|
#
|
84
87
|
def add_item(id, fields)
|
85
88
|
return nil if self.class.mode == :sandbox
|
86
|
-
query = { "type" => "add", "id" => id, "version" => 1, "lang" => "en" }
|
89
|
+
query = { "type" => "add", "id" => id.to_s, "version" => 1, "lang" => "en" }
|
90
|
+
fields.each do |k,v|
|
91
|
+
fields[k] = "" if v.nil?
|
92
|
+
end
|
93
|
+
|
87
94
|
query["fields"] = fields
|
88
95
|
doc_request(query)
|
89
96
|
end
|
@@ -123,7 +130,7 @@ class Asari
|
|
123
130
|
def remove_item(id)
|
124
131
|
return nil if self.class.mode == :sandbox
|
125
132
|
|
126
|
-
query = { "type" => "delete", "id" => id, "version" => 2 }
|
133
|
+
query = { "type" => "delete", "id" => id.to_s, "version" => 2 }
|
127
134
|
doc_request query
|
128
135
|
end
|
129
136
|
|
@@ -149,3 +156,5 @@ class Asari
|
|
149
156
|
nil
|
150
157
|
end
|
151
158
|
end
|
159
|
+
|
160
|
+
Asari.mode = :sandbox # default to sandbox
|
data/lib/asari/active_record.rb
CHANGED
@@ -2,7 +2,7 @@ class Asari
|
|
2
2
|
# Public: This module should be included in any class inheriting from
|
3
3
|
# ActiveRecord::Base that needs to be indexed. Every time this module is
|
4
4
|
# included, asari_index *must* be called (see below). Including this module
|
5
|
-
# will automatically create
|
5
|
+
# will automatically create before_destroy, after_create, and after_update AR
|
6
6
|
# callbacks to remove, add, and update items in the CloudSearch index
|
7
7
|
# (respectively).
|
8
8
|
#
|
@@ -10,9 +10,11 @@ class Asari
|
|
10
10
|
def self.included(base)
|
11
11
|
base.extend(ClassMethods)
|
12
12
|
|
13
|
-
base.
|
14
|
-
|
15
|
-
|
13
|
+
base.class_eval do
|
14
|
+
before_destroy :asari_remove_from_index
|
15
|
+
after_create :asari_add_to_index
|
16
|
+
after_update :asari_update_in_index
|
17
|
+
end
|
16
18
|
end
|
17
19
|
|
18
20
|
def asari_remove_from_index
|
@@ -46,40 +48,48 @@ class Asari
|
|
46
48
|
# asari_index("my-companies-users-asglkj4rsagkjlh34", [:name, :email])
|
47
49
|
#
|
48
50
|
def asari_index(search_domain, fields)
|
49
|
-
|
50
|
-
|
51
|
+
self.class_variable_set(:@@asari, Asari.new(search_domain))
|
52
|
+
self.class_variable_set(:@@fields, fields)
|
53
|
+
end
|
54
|
+
|
55
|
+
def asari_instance
|
56
|
+
self.class_variable_get(:@@asari)
|
57
|
+
end
|
58
|
+
|
59
|
+
def asari_fields
|
60
|
+
self.class_variable_get(:@@fields)
|
51
61
|
end
|
52
62
|
|
53
63
|
# Internal: method for adding a newly created item to the CloudSearch
|
54
64
|
# index. Should probably only be called from asari_add_to_index above.
|
55
65
|
def asari_add_item(obj)
|
56
66
|
data = {}
|
57
|
-
|
58
|
-
data[field] = obj.send(field)
|
67
|
+
self.asari_fields.each do |field|
|
68
|
+
data[field] = obj.send(field) || ""
|
59
69
|
end
|
60
|
-
|
70
|
+
self.asari_instance.add_item(obj.send(:id), data)
|
61
71
|
rescue Asari::DocumentUpdateException => e
|
62
|
-
asari_on_error(e)
|
72
|
+
self.asari_on_error(e)
|
63
73
|
end
|
64
74
|
|
65
75
|
# Internal: method for updating a freshly edited item to the CloudSearch
|
66
76
|
# index. Should probably only be called from asari_update_in_index above.
|
67
77
|
def asari_update_item(obj)
|
68
78
|
data = {}
|
69
|
-
|
79
|
+
self.asari_fields.each do |field|
|
70
80
|
data[field] = obj.send(field)
|
71
81
|
end
|
72
|
-
|
82
|
+
self.asari_instance.update_item(obj.send(:id), data)
|
73
83
|
rescue Asari::DocumentUpdateException => e
|
74
|
-
asari_on_error(e)
|
84
|
+
self.asari_on_error(e)
|
75
85
|
end
|
76
86
|
|
77
87
|
# Internal: method for removing a soon-to-be deleted item from the CloudSearch
|
78
88
|
# index. Should probably only be called from asari_remove_from_index above.
|
79
89
|
def asari_remove_item(obj)
|
80
|
-
|
90
|
+
self.asari_instance.remove_item(obj.send(:id))
|
81
91
|
rescue Asari::DocumentUpdateException => e
|
82
|
-
asari_on_error(e)
|
92
|
+
self.asari_on_error(e)
|
83
93
|
end
|
84
94
|
|
85
95
|
# Public: method for searching the index for the specified term and
|
@@ -91,7 +101,7 @@ class Asari
|
|
91
101
|
# Raises: an Asari::SearchException error if there are issues
|
92
102
|
# communicating with the CloudSearch server.
|
93
103
|
def asari_find(term)
|
94
|
-
ids =
|
104
|
+
ids = self.asari_instance.search(term).map { |id| id.to_i }
|
95
105
|
begin
|
96
106
|
self.find(*ids)
|
97
107
|
rescue ::ActiveRecord::RecordNotFound
|
data/lib/asari/version.rb
CHANGED
data/spec/active_record_spec.rb
CHANGED
@@ -5,11 +5,11 @@ describe Asari do
|
|
5
5
|
describe "when CloudSearch is responding without error" do
|
6
6
|
before :each do
|
7
7
|
@asari = double()
|
8
|
-
ActiveRecordFake.
|
8
|
+
ActiveRecordFake.class_variable_set(:@@asari, @asari)
|
9
9
|
end
|
10
10
|
|
11
|
-
it "correctly sets up a
|
12
|
-
expect(ActiveRecordFake.instance_variable_get(:@
|
11
|
+
it "correctly sets up a before_destroy listener" do
|
12
|
+
expect(ActiveRecordFake.instance_variable_get(:@before_destroy)).to eq(:asari_remove_from_index)
|
13
13
|
end
|
14
14
|
|
15
15
|
it "correctly sets up an after_create listener" do
|
@@ -60,7 +60,7 @@ describe Asari do
|
|
60
60
|
|
61
61
|
describe "When CloudSearch is being a problem" do
|
62
62
|
before :each do
|
63
|
-
ActiveRecordFake.
|
63
|
+
ActiveRecordFake.class_variable_set(:@@asari, Asari.new("test-domain"))
|
64
64
|
stub_const("HTTParty", double())
|
65
65
|
HTTParty.stub(:post).and_return(fake_error_response)
|
66
66
|
HTTParty.stub(:get).and_return(fake_error_response)
|
data/spec_helper.rb
CHANGED
@@ -2,6 +2,9 @@ require 'asari'
|
|
2
2
|
require 'asari/active_record'
|
3
3
|
require 'ostruct'
|
4
4
|
|
5
|
+
# Fake production mode to test.
|
6
|
+
Asari.mode = :production
|
7
|
+
|
5
8
|
RSpec.configuration.expect_with(:rspec) { |c| c.syntax = :expect }
|
6
9
|
|
7
10
|
def fake_response
|
@@ -29,8 +32,8 @@ end
|
|
29
32
|
|
30
33
|
class ActiveRecordFake
|
31
34
|
class << self
|
32
|
-
def
|
33
|
-
@
|
35
|
+
def before_destroy(sym)
|
36
|
+
@before_destroy = sym
|
34
37
|
end
|
35
38
|
|
36
39
|
def after_create(sym)
|
@@ -68,10 +71,6 @@ class ActiveRecordFake
|
|
68
71
|
end
|
69
72
|
|
70
73
|
class ActiveRecordFakeWithErrorOverride < ActiveRecordFake
|
71
|
-
include Asari::ActiveRecord
|
72
|
-
|
73
|
-
asari_index("test-domain", [:name, :email])
|
74
|
-
|
75
74
|
def self.asari_on_error(exception)
|
76
75
|
false
|
77
76
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: asari
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2012-07-11 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: httparty
|
16
|
-
requirement: &
|
16
|
+
requirement: &70351657843560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70351657843560
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70351657841900 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70351657841900
|
36
36
|
description: Asari s a Ruby interface for AWS CloudSearch
|
37
37
|
email:
|
38
38
|
- tommy@wellbredgrapefruit.com
|