alephant-lookup 0.0.3 → 0.0.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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/alephant-lookup.gemspec +2 -0
- data/lib/alephant/lookup.rb +2 -2
- data/lib/alephant/lookup/location_read.rb +71 -0
- data/lib/alephant/lookup/location_write.rb +50 -0
- data/lib/alephant/lookup/lookup_helper.rb +46 -0
- data/lib/alephant/lookup/lookup_location.rb +23 -0
- data/lib/alephant/lookup/lookup_query.rb +30 -0
- data/lib/alephant/lookup/lookup_table.rb +0 -44
- data/lib/alephant/lookup/version.rb +1 -1
- data/spec/lookup_spec.rb +36 -16
- metadata +21 -3
- data/lib/alephant/lookup/lookup.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee8710b1105981b02407c5f9cde7eb768add6f7a
|
4
|
+
data.tar.gz: 7b5e984fcc9df4abd22a6381efedff235ddecd4e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15bb96737efdd8f21ae30527f200007d542fa9d19771efaf51622498d7bb8319d572b3ce8ed7fd317778dd50839aade495b48ff74a5c5262edba23097e812132
|
7
|
+
data.tar.gz: 0fa7a64f459bae0ee17cc94a7b2ffd354892b548d3b70ae9db6cc0685c4f9528b66165743038c4b8aeceddc3300c25219fa0809e9d8f12f2b6e503abbaffee62
|
data/README.md
CHANGED
data/alephant-lookup.gemspec
CHANGED
data/lib/alephant/lookup.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
require "alephant/lookup/version"
|
2
|
-
require "alephant/lookup/
|
2
|
+
require "alephant/lookup/lookup_helper"
|
3
3
|
require "alephant/lookup/lookup_table"
|
4
4
|
|
5
5
|
module Alephant
|
@@ -8,7 +8,7 @@ module Alephant
|
|
8
8
|
|
9
9
|
def self.create(table_name, component_id)
|
10
10
|
@@lookup_tables[table_name] ||= LookupTable.new(table_name)
|
11
|
-
|
11
|
+
LookupHelper.new(@@lookup_tables[table_name], component_id)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
require 'alephant/lookup/lookup_location'
|
3
|
+
require 'alephant/lookup/lookup_query'
|
4
|
+
require 'alephant/logger'
|
5
|
+
|
6
|
+
module Alephant
|
7
|
+
module Lookup
|
8
|
+
class LocationRead
|
9
|
+
include ::Alephant::Logger
|
10
|
+
|
11
|
+
attr_reader :table_name
|
12
|
+
|
13
|
+
def initialize(lookup_table)
|
14
|
+
@client = AWS::DynamoDB::Client::V20120810.new
|
15
|
+
@table_name = lookup_table.table_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def read(lookup)
|
19
|
+
logger.info("LocationRead#read: looking up #{lookup.to_h}")
|
20
|
+
raise TypeError unless lookup.is_a? LookupQuery
|
21
|
+
|
22
|
+
location = LookupLocation.new(
|
23
|
+
lookup.component_id,
|
24
|
+
lookup.opts_hash,
|
25
|
+
s3_location_from(
|
26
|
+
run_query(
|
27
|
+
lookup.component_id,
|
28
|
+
lookup.opts_hash
|
29
|
+
)
|
30
|
+
)
|
31
|
+
)
|
32
|
+
logger.info("LocationRead#read: got location #{location.to_h}")
|
33
|
+
|
34
|
+
location
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def s3_location_from(result)
|
40
|
+
result[:count] == 1 ? result[:member].first[LookupLocation::S3_LOCATION_FIELD][:s] : nil
|
41
|
+
end
|
42
|
+
|
43
|
+
def run_query(component_id, opts_hash)
|
44
|
+
@client.query(query(component_id, opts_hash))
|
45
|
+
end
|
46
|
+
|
47
|
+
def query(component_id, opts_hash)
|
48
|
+
{
|
49
|
+
:table_name => table_name,
|
50
|
+
:consistent_read => true,
|
51
|
+
:select => 'SPECIFIC_ATTRIBUTES',
|
52
|
+
:attributes_to_get => [LookupLocation::S3_LOCATION_FIELD],
|
53
|
+
:key_conditions => {
|
54
|
+
'component_id' => {
|
55
|
+
:comparison_operator => 'EQ',
|
56
|
+
:attribute_value_list => [
|
57
|
+
{ 's' => component_id.to_s }
|
58
|
+
],
|
59
|
+
},
|
60
|
+
'opts_hash' => {
|
61
|
+
:comparison_operator => 'EQ',
|
62
|
+
:attribute_value_list => [
|
63
|
+
{ 's' => opts_hash }
|
64
|
+
]
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
require 'alephant/lookup/lookup_query'
|
3
|
+
require 'alephant/logger'
|
4
|
+
|
5
|
+
module Alephant
|
6
|
+
module Lookup
|
7
|
+
class LocationWrite
|
8
|
+
include ::Alephant::Logger
|
9
|
+
|
10
|
+
attr_reader :table_name
|
11
|
+
attr_reader :lookups
|
12
|
+
|
13
|
+
def initialize(lookup_table)
|
14
|
+
@table_name = lookup_table.table_name
|
15
|
+
@batch = AWS::DynamoDB::BatchWrite.new
|
16
|
+
@lookups = []
|
17
|
+
@processed = false
|
18
|
+
end
|
19
|
+
|
20
|
+
def <<(lookup)
|
21
|
+
raise TypeError unless lookup.is_a? LookupQuery
|
22
|
+
|
23
|
+
@lookups << lookup
|
24
|
+
end
|
25
|
+
|
26
|
+
def processed?
|
27
|
+
@processed
|
28
|
+
end
|
29
|
+
|
30
|
+
def process!
|
31
|
+
logger.info("LocationWrite#process! #{processed? ? "is" : "not"} running batch put on #{table_name}")
|
32
|
+
processed? ? false : process_batch_put
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def process_batch_put
|
38
|
+
logger.info("LocationWrite#process_batch_put to #{table_name} for #{@lookups.map { |lookup| lookup.to_h }}")
|
39
|
+
|
40
|
+
@batch.put(
|
41
|
+
table_name,
|
42
|
+
@lookups.map { |lookup| lookup.to_h }
|
43
|
+
)
|
44
|
+
@batch.process!
|
45
|
+
|
46
|
+
processed = true
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'alephant/lookup/lookup_table'
|
2
|
+
require 'alephant/lookup/lookup_query'
|
3
|
+
require 'alephant/lookup/location_read'
|
4
|
+
require 'alephant/lookup/location_write'
|
5
|
+
|
6
|
+
module Alephant
|
7
|
+
module Lookup
|
8
|
+
class LookupHelper
|
9
|
+
attr_reader :component_id
|
10
|
+
|
11
|
+
def initialize(lookup_table, component_id)
|
12
|
+
@lookup_table = lookup_table
|
13
|
+
@component_id = component_id
|
14
|
+
create_lookup_table
|
15
|
+
end
|
16
|
+
|
17
|
+
def read(opts)
|
18
|
+
reader = LocationRead.new(@lookup_table)
|
19
|
+
reader.read(LookupQuery.new(@component_id, opts)).location
|
20
|
+
end
|
21
|
+
|
22
|
+
def write(opts, location)
|
23
|
+
writer = LocationWrite.new(@lookup_table)
|
24
|
+
writer << LookupQuery.new(@component_id, opts, location)
|
25
|
+
writer.process!
|
26
|
+
end
|
27
|
+
|
28
|
+
def batch_write(opts, location)
|
29
|
+
@batch_write ||= LocationWrite.new(@lookup_table)
|
30
|
+
@batch_write << LookupQuery.new(@component_id, opts, location)
|
31
|
+
end
|
32
|
+
|
33
|
+
def batch_process
|
34
|
+
@batch_write.process!
|
35
|
+
@batch_write = nil
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def create_lookup_table
|
41
|
+
@lookup_table.create
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Alephant
|
2
|
+
module Lookup
|
3
|
+
class LookupLocation
|
4
|
+
S3_LOCATION_FIELD = 'location'
|
5
|
+
|
6
|
+
attr_reader :component_id, :opts, :location
|
7
|
+
|
8
|
+
def initialize(component_id, opts, location)
|
9
|
+
@component_id = component_id
|
10
|
+
@opts = opts
|
11
|
+
@location = location
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_h
|
15
|
+
{
|
16
|
+
:component_id => @component_id,
|
17
|
+
:opts => opts,
|
18
|
+
S3_LOCATION_FIELD => @location
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'crimp'
|
2
|
+
require 'alephant/lookup/lookup_location'
|
3
|
+
|
4
|
+
module Alephant
|
5
|
+
module Lookup
|
6
|
+
class LookupQuery < LookupLocation
|
7
|
+
attr_reader :opts_hash
|
8
|
+
attr_writer :location
|
9
|
+
|
10
|
+
def initialize(component_id, opts, location = nil)
|
11
|
+
super(component_id, opts, location)
|
12
|
+
@opts_hash = hash_for(opts)
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_h
|
16
|
+
{
|
17
|
+
:component_id => @component_id,
|
18
|
+
:opts_hash => @opts_hash,
|
19
|
+
S3_LOCATION_FIELD => @location
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def hash_for(opts)
|
26
|
+
Crimp.signature opts
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'aws-sdk'
|
2
2
|
require 'thread'
|
3
3
|
require 'timeout'
|
4
|
-
require 'crimp'
|
5
4
|
|
6
5
|
module Alephant
|
7
6
|
module Lookup
|
@@ -22,12 +21,9 @@ module Alephant
|
|
22
21
|
}
|
23
22
|
}
|
24
23
|
|
25
|
-
S3_LOCATION_FIELD = 's3_location'
|
26
|
-
|
27
24
|
def initialize(table_name, config = DEFAULT_CONFIG)
|
28
25
|
@mutex = Mutex.new
|
29
26
|
@dynamo_db = AWS::DynamoDB.new
|
30
|
-
@client = AWS::DynamoDB::Client::V20120810.new
|
31
27
|
@table_name = table_name
|
32
28
|
@config = config
|
33
29
|
end
|
@@ -43,48 +39,8 @@ module Alephant
|
|
43
39
|
@table ||= @dynamo_db.tables[@table_name]
|
44
40
|
end
|
45
41
|
|
46
|
-
|
47
|
-
def location_for(component_id, opts)
|
48
|
-
result = @client.query({
|
49
|
-
:table_name => @table_name,
|
50
|
-
:consistent_read => true,
|
51
|
-
:select => 'SPECIFIC_ATTRIBUTES',
|
52
|
-
:attributes_to_get => [S3_LOCATION_FIELD],
|
53
|
-
:key_conditions => {
|
54
|
-
'component_id' => {
|
55
|
-
:comparison_operator => 'EQ',
|
56
|
-
:attribute_value_list => [
|
57
|
-
{ 's' => component_id.to_s }
|
58
|
-
],
|
59
|
-
},
|
60
|
-
'opts_hash' => {
|
61
|
-
:comparison_operator => 'EQ',
|
62
|
-
:attribute_value_list => [
|
63
|
-
{ 's' => hash_for(opts) }
|
64
|
-
]
|
65
|
-
}
|
66
|
-
}
|
67
|
-
})
|
68
|
-
result[:count] == 1 ? result[:member].first[S3_LOCATION_FIELD][:s] : nil
|
69
|
-
end
|
70
|
-
|
71
|
-
def write_location_for(component_id, opts, location)
|
72
|
-
|
73
|
-
@table.batch_put([
|
74
|
-
{
|
75
|
-
:component_id => component_id,
|
76
|
-
:opts_hash => hash_for(opts),
|
77
|
-
:s3_location => location
|
78
|
-
}
|
79
|
-
])
|
80
|
-
end
|
81
|
-
|
82
42
|
private
|
83
43
|
|
84
|
-
def hash_for(opts)
|
85
|
-
Crimp.signature opts
|
86
|
-
end
|
87
|
-
|
88
44
|
def ensure_table_exists
|
89
45
|
create_dynamodb_table unless table.exists?
|
90
46
|
end
|
data/spec/lookup_spec.rb
CHANGED
@@ -3,17 +3,17 @@ require 'spec_helper'
|
|
3
3
|
describe Alephant::Lookup do
|
4
4
|
describe '.create(table_name, component_id)' do
|
5
5
|
it 'returns a lookup' do
|
6
|
-
Alephant::Lookup::
|
6
|
+
Alephant::Lookup::LookupHelper
|
7
7
|
.any_instance
|
8
8
|
.stub(:initialize)
|
9
9
|
.and_return(double())
|
10
10
|
|
11
|
-
expect(subject.create(:table_name, :component_id)).to be_a Alephant::Lookup::
|
11
|
+
expect(subject.create(:table_name, :component_id)).to be_a Alephant::Lookup::LookupHelper
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
describe Alephant::Lookup::
|
16
|
-
subject { Alephant::Lookup::
|
15
|
+
describe Alephant::Lookup::LookupHelper do
|
16
|
+
subject { Alephant::Lookup::LookupHelper }
|
17
17
|
|
18
18
|
describe '#initialize(table_name)' do
|
19
19
|
it 'calls create on lookup_table' do
|
@@ -26,8 +26,9 @@ describe Alephant::Lookup do
|
|
26
26
|
describe '#read(opts)' do
|
27
27
|
let (:lookup_table) { Alephant::Lookup::LookupTable }
|
28
28
|
let (:s3_location) { '/s3-render-example/test/html/england_council_election_results/responsive' }
|
29
|
+
let (:location_read){ Alephant::Lookup::LocationRead }
|
29
30
|
|
30
|
-
it 'returns
|
31
|
+
it 'returns correct S3 Location' do
|
31
32
|
subject
|
32
33
|
.any_instance
|
33
34
|
.stub(:create_lookup_table)
|
@@ -36,10 +37,12 @@ describe Alephant::Lookup do
|
|
36
37
|
.any_instance
|
37
38
|
.stub(:initialize)
|
38
39
|
|
39
|
-
|
40
|
+
location = Alephant::Lookup::LookupLocation.new(:component_id,:opts_hash, s3_location)
|
41
|
+
|
42
|
+
location_read
|
40
43
|
.any_instance
|
41
|
-
.stub(:
|
42
|
-
.and_return(
|
44
|
+
.stub(:read)
|
45
|
+
.and_return(location)
|
43
46
|
|
44
47
|
pal_opts = {
|
45
48
|
:id => :england_council_election_results,
|
@@ -56,8 +59,9 @@ describe Alephant::Lookup do
|
|
56
59
|
|
57
60
|
describe '#write(opts, location)' do
|
58
61
|
|
59
|
-
let (:lookup_table)
|
60
|
-
let (:s3_location)
|
62
|
+
let (:lookup_table) { Alephant::Lookup::LookupTable }
|
63
|
+
let (:s3_location) { '/s3-render-example/test/html/england_council_election_results/responsive' }
|
64
|
+
let (:location_write){ Alephant::Lookup::LocationWrite }
|
61
65
|
|
62
66
|
it 'returns lookup_table.update_location_for(component_id, opts_hash, data)' do
|
63
67
|
|
@@ -69,23 +73,39 @@ describe Alephant::Lookup do
|
|
69
73
|
.any_instance
|
70
74
|
.stub(:initialize)
|
71
75
|
|
76
|
+
lookup_table
|
77
|
+
.any_instance
|
78
|
+
.stub(:table_name)
|
79
|
+
.and_return('table_name')
|
80
|
+
|
72
81
|
pal_opts = {
|
73
82
|
:id => :england_council_election_results,
|
74
83
|
:env => :test,
|
75
84
|
:type => :responsive
|
76
85
|
}
|
77
86
|
|
78
|
-
|
87
|
+
AWS::DynamoDB::BatchWrite
|
79
88
|
.any_instance
|
80
|
-
.
|
81
|
-
.with(
|
82
|
-
|
89
|
+
.should_receive(:put)
|
90
|
+
.with(
|
91
|
+
'table_name',
|
92
|
+
[
|
93
|
+
{
|
94
|
+
:component_id=> :england_council_election_results,
|
95
|
+
:opts_hash=>"52a25baaaa8c4527ddc869feaa285c3a",
|
96
|
+
"location"=>:s3_location
|
97
|
+
}
|
98
|
+
]
|
99
|
+
)
|
100
|
+
|
101
|
+
AWS::DynamoDB::BatchWrite
|
102
|
+
.any_instance
|
103
|
+
.should_receive(:process!)
|
83
104
|
|
84
105
|
instance = subject.new(lookup_table.new, pal_opts[:id])
|
85
106
|
write_return = instance.write(pal_opts, :s3_location)
|
86
107
|
|
87
|
-
expect(write_return).to eq(
|
88
|
-
|
108
|
+
expect(write_return).to eq(true)
|
89
109
|
end
|
90
110
|
end
|
91
111
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: alephant-lookup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Kenny
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-02-
|
11
|
+
date: 2014-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -150,6 +150,20 @@ dependencies:
|
|
150
150
|
version: '1.0'
|
151
151
|
prerelease: false
|
152
152
|
type: :runtime
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: alephant-logger
|
155
|
+
version_requirements: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
requirements:
|
162
|
+
- - '>='
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
version: '0'
|
165
|
+
prerelease: false
|
166
|
+
type: :runtime
|
153
167
|
- !ruby/object:Gem::Dependency
|
154
168
|
name: crimp
|
155
169
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -181,7 +195,11 @@ files:
|
|
181
195
|
- Rakefile
|
182
196
|
- alephant-lookup.gemspec
|
183
197
|
- lib/alephant/lookup.rb
|
184
|
-
- lib/alephant/lookup/
|
198
|
+
- lib/alephant/lookup/location_read.rb
|
199
|
+
- lib/alephant/lookup/location_write.rb
|
200
|
+
- lib/alephant/lookup/lookup_helper.rb
|
201
|
+
- lib/alephant/lookup/lookup_location.rb
|
202
|
+
- lib/alephant/lookup/lookup_query.rb
|
185
203
|
- lib/alephant/lookup/lookup_table.rb
|
186
204
|
- lib/alephant/lookup/version.rb
|
187
205
|
- spec/lookup_spec.rb
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module Alephant
|
2
|
-
module Lookup
|
3
|
-
class Lookup
|
4
|
-
attr_reader :component_id
|
5
|
-
|
6
|
-
def initialize(lookup_table, component_id)
|
7
|
-
@lookup_table = lookup_table
|
8
|
-
@component_id = component_id
|
9
|
-
create_lookup_table
|
10
|
-
end
|
11
|
-
|
12
|
-
def read(opts)
|
13
|
-
@lookup_table.location_for(@component_id, opts)
|
14
|
-
end
|
15
|
-
|
16
|
-
def write(opts, location)
|
17
|
-
@lookup_table.write_location_for(@component_id, opts, location)
|
18
|
-
end
|
19
|
-
|
20
|
-
private
|
21
|
-
|
22
|
-
def create_lookup_table
|
23
|
-
@lookup_table.create
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|