alephant 0.0.9.6-java → 0.0.9.7-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9081a10b24eecb25c76b65df99114ffcfffc3b4
4
- data.tar.gz: ce5f3bfafa0dc17a4bbfc0a8b5d8e65627179233
3
+ metadata.gz: 6ff0e13461b2cea58a931cebb4868520bbbc34df
4
+ data.tar.gz: 2b4b52fc0b91968f0276458a8862fe68d35c2407
5
5
  SHA512:
6
- metadata.gz: 38d5f80d00324e44f1606a1de350280c5d787da28afef35be7f35cb25c935ff22550a9a8d94fe6c00eb5fed12fe6542246d885c3b034d1fd6f90c7938747a612
7
- data.tar.gz: 991bbba8dfd5c6b53be18ee7a233b87b9319f3a2e39602a369bbd082865787bcab070305b773beb2f4cbe17da93bf08d1d09e79ea89218702fabb55b30d44ea6
6
+ metadata.gz: 437b33a9f5452daa6770c1463a2ea6928875c4cbfc533484e069554e9ad67bf29f3b21f753cf245242aa3bfb662dd4e2c567b16e94da34a26f3c88a143bc7848
7
+ data.tar.gz: 31930b9e797a79abda64fc91c376662c49aad4199e2fdcb82af4fb6b4576a2446d9b8eba2d993d8208f0cfddf2177d10b50e9f6ffd769f6c7924ccd7bdd5f15f
data/alephant.gemspec CHANGED
@@ -35,5 +35,6 @@ Gem::Specification.new do |s|
35
35
  s.add_runtime_dependency 'rake'
36
36
  s.add_runtime_dependency 'aws-sdk', '~> 1.0'
37
37
  s.add_runtime_dependency 'mustache', '>= 0.99.5'
38
+ s.add_runtime_dependency 'jsonpath'
38
39
  end
39
40
 
data/lib/alephant.rb CHANGED
@@ -24,9 +24,8 @@ module Alephant
24
24
  :table_name,
25
25
  :sqs_queue_id,
26
26
  :view_path,
27
- :sequential_proc,
28
- :set_last_seen_proc,
29
- :component_id
27
+ :component_id,
28
+ :sequence_id
30
29
  ]
31
30
 
32
31
  def initialize(opts = {}, logger = nil)
@@ -58,13 +57,11 @@ module Alephant
58
57
  end
59
58
 
60
59
  def receive(msg)
61
- data = @parser.parse msg.body
62
-
63
60
  @logger.info("Alephant.receive: with id #{msg.id} and body digest: #{msg.md5}")
64
61
 
65
- if @sequencer.sequential?(data, &@sequential_proc)
66
- write data
67
- @sequencer.set_last_seen(data, &@set_last_seen_proc)
62
+ if @sequencer.sequential?(msg, @sequence_id)
63
+ write @parser.parse msg.body
64
+ @sequencer.set_last_seen(msg, @sequence_id)
68
65
  else
69
66
  @logger.warn("Alephant.receive: out of sequence message received #{msg.id} (discarded)")
70
67
  end
@@ -1,4 +1,5 @@
1
1
  require 'aws-sdk'
2
+ require 'jsonpath'
2
3
 
3
4
  module Alephant
4
5
  class Sequencer
@@ -47,16 +48,12 @@ module Alephant
47
48
  @logger.info("Sequencer.initialize: end with id #{@id}")
48
49
  end
49
50
 
50
- def sequential?(data)
51
- if block_given?
52
- yield(get_last_seen, data)
53
- else
54
- get_last_seen < data["sequence_id"].to_i
55
- end
51
+ def sequential?(data, jsonpath = nil)
52
+ get_last_seen < get_sequence_id_from(data, jsonpath)
56
53
  end
57
54
 
58
- def set_last_seen(data)
59
- last_seen_id = block_given? ? yield(data) : data["sequence_id"]
55
+ def set_last_seen(data, jsonpath)
56
+ last_seen_id = get_sequence_id_from(data, jsonpath)
60
57
 
61
58
  batch = AWS::DynamoDB::BatchWrite.new
62
59
  batch.put(@table_name, [:key => @id,:value => last_seen_id])
@@ -64,6 +61,12 @@ module Alephant
64
61
  @logger.info("Sequencer.set_last_seen: id #{id} and last_seen_id #{last_seen_id}")
65
62
  end
66
63
 
64
+ def get_sequence_id_from(data, jsonpath)
65
+ jsonpath.nil? ?
66
+ data.body['sequence_id'].to_i :
67
+ JsonPath.on(data.body, jsonpath).first
68
+ end
69
+
67
70
  def get_last_seen
68
71
  begin
69
72
  @table.batch_get(
@@ -1,3 +1,3 @@
1
1
  module Alephant
2
- VERSION = "0.0.9.6"
2
+ VERSION = "0.0.9.7"
3
3
  end
@@ -18,14 +18,13 @@ describe Alephant::Alephant do
18
18
 
19
19
  it "sets specified options" do
20
20
  instance = subject.new({
21
- :s3_bucket_id => :s3_bucket_id,
22
- :s3_object_path => :s3_object_path,
23
- :s3_object_id => :s3_object_id,
24
- :table_name => :table_name,
25
- :sqs_queue_id => :sqs_queue_id,
26
- :sequential_proc => :sequential_proc,
27
- :set_last_seen_proc => :set_last_seen_proc,
28
- :component_id => :component_id
21
+ :s3_bucket_id => :s3_bucket_id,
22
+ :s3_object_path => :s3_object_path,
23
+ :s3_object_id => :s3_object_id,
24
+ :table_name => :table_name,
25
+ :sqs_queue_id => :sqs_queue_id,
26
+ :component_id => :component_id,
27
+ :sequence_id => :sequence_id
29
28
  })
30
29
 
31
30
  expect(instance.s3_bucket_id).to eq(:s3_bucket_id);
@@ -33,9 +32,8 @@ describe Alephant::Alephant do
33
32
  expect(instance.s3_object_id).to eq(:s3_object_id);
34
33
  expect(instance.table_name).to eq(:table_name);
35
34
  expect(instance.sqs_queue_id).to eq(:sqs_queue_id);
36
- expect(instance.sequential_proc).to eq(:sequential_proc);
37
- expect(instance.set_last_seen_proc).to eq(:set_last_seen_proc);
38
35
  expect(instance.component_id).to eq(:component_id);
36
+ expect(instance.sequence_id).to eq(:sequence_id);
39
37
  end
40
38
 
41
39
  it "sets unspecified options to nil" do
@@ -46,14 +44,14 @@ describe Alephant::Alephant do
46
44
  expect(instance.s3_object_id).to eq(nil);
47
45
  expect(instance.table_name).to eq(nil);
48
46
  expect(instance.sqs_queue_id).to eq(nil);
49
- expect(instance.sequential_proc).to eq(nil);
50
- expect(instance.set_last_seen_proc).to eq(nil);
51
47
  expect(instance.component_id).to eq(nil);
48
+ expect(instance.sequence_id).to eq(nil);
52
49
  end
53
50
 
54
51
  context "initializes @sequencer" do
55
52
  it "with Sequencer.new({ :table_name => :table_name }, @sqs_queue_id)" do
56
- Alephant::Sequencer.should_receive(:new)
53
+ Alephant::Sequencer
54
+ .should_receive(:new)
57
55
  .with({ :table_name => :table_name }, :sqs_queue_id)
58
56
 
59
57
  instance = subject.new({
@@ -65,7 +63,9 @@ describe Alephant::Alephant do
65
63
 
66
64
  context "initializes @queue" do
67
65
  it "with Queue.new(@sqs_queue_id)" do
68
- Alephant::Queue.should_receive(:new).with(:sqs_queue_id)
66
+ Alephant::Queue
67
+ .should_receive(:new)
68
+ .with(:sqs_queue_id)
69
69
 
70
70
  instance = subject.new({
71
71
  :sqs_queue_id => :sqs_queue_id
@@ -75,7 +75,9 @@ describe Alephant::Alephant do
75
75
 
76
76
  context "initializes @cache" do
77
77
  it "with Cache.new(@s3_bucket_id, @s3_object_path)" do
78
- Alephant::Cache.should_receive(:new).with(:s3_bucket_id, :s3_object_path)
78
+ Alephant::Cache
79
+ .should_receive(:new)
80
+ .with(:s3_bucket_id, :s3_object_path)
79
81
 
80
82
  instance = subject.new({
81
83
  :s3_bucket_id => :s3_bucket_id,
@@ -126,7 +128,9 @@ describe Alephant::Alephant do
126
128
 
127
129
  instance.should_receive(:receive).with(:msg)
128
130
 
129
- expect_any_instance_of(Alephant::Queue).to receive(:poll).and_yield(:msg)
131
+ expect_any_instance_of(Alephant::Queue)
132
+ .to receive(:poll)
133
+ .and_yield(:msg)
130
134
 
131
135
  t = instance.run!
132
136
  t.join
@@ -148,10 +152,12 @@ describe Alephant::Alephant do
148
152
 
149
153
  it "takes json as an argument" do
150
154
  instance = subject.new
155
+
151
156
  msg = double()
152
157
  msg.stub(:body).and_return('notjson')
153
158
 
154
- expect { instance.receive(msg) }.to raise_error(JSON::ParserError);
159
+ expect { JsonPath.on(msg.body, '$.foo') }
160
+ .to raise_error(MultiJson::LoadError);
155
161
  end
156
162
 
157
163
  it "writes data to cache if sequential order is true" do
@@ -164,10 +170,19 @@ describe Alephant::Alephant do
164
170
 
165
171
  instance = subject.new
166
172
 
167
- Alephant::Sequencer.any_instance.stub(:sequential?).and_return(true)
168
- Alephant::Sequencer.any_instance.stub(:set_last_seen)
173
+ Alephant::Sequencer
174
+ .any_instance
175
+ .stub(:sequential?)
176
+ .and_return(true)
177
+
178
+ Alephant::Sequencer
179
+ .any_instance
180
+ .stub(:set_last_seen)
181
+
182
+ instance
183
+ .should_receive(:write)
184
+ .with(JSON.parse(data, :symbolize_names => true))
169
185
 
170
- instance.should_receive(:write).with(JSON.parse(data, :symbolize_names => true))
171
186
  instance.receive(msg)
172
187
  end
173
188
  end
@@ -177,8 +192,15 @@ describe Alephant::Alephant do
177
192
  sequencer = double()
178
193
  queue = double()
179
194
 
180
- Alephant::Sequencer.any_instance.stub(:initialize).and_return(sequencer)
181
- Alephant::Queue.any_instance.stub(:initialize).and_return(queue)
195
+ Alephant::Sequencer
196
+ .any_instance
197
+ .stub(:initialize)
198
+ .and_return(sequencer)
199
+
200
+ Alephant::Queue
201
+ .any_instance
202
+ .stub(:initialize)
203
+ .and_return(queue)
182
204
  end
183
205
 
184
206
  it "puts rendered data into the S3 Cache" do
@@ -60,58 +60,61 @@ describe Alephant::Sequencer do
60
60
  end
61
61
  end
62
62
 
63
- describe "sequential?(data)" do
63
+ describe "sequential?(data, jsonpath = nil)" do
64
+ let(:jsonpath) { '$.sequence_id' }
65
+ let(:instance) { subject.new }
66
+ let(:id_value) { 0 }
67
+ let(:data) { double() }
68
+
64
69
  before(:each) do
65
70
  Alephant::Sequencer
66
71
  .any_instance.stub(:initialize)
67
72
  .and_return(double())
68
- end
69
-
70
- context "block_given? == true" do
71
- it "yields to block" do
72
- Alephant::Sequencer
73
- .any_instance
74
- .stub(:get_last_seen)
75
- .and_return(1)
76
-
77
- instance = subject.new
78
73
 
79
- in_sequence = instance.sequential?(:data) do |last_seen, data|
80
- :foo
81
- end
74
+ Alephant::Sequencer
75
+ .any_instance
76
+ .stub(:get_last_seen)
77
+ .and_return(1)
82
78
 
83
- expect(in_sequence).to eq(:foo)
84
- end
79
+ data.stub(:body).and_return('sequence_id' => id_value)
85
80
  end
86
81
 
87
- context "block_given? == false" do
88
- context "get_last_seen < data['sequence_id']" do
89
- it "returns true" do
90
- Alephant::Sequencer
91
- .any_instance
92
- .stub(:get_last_seen)
93
- .and_return(0)
82
+ context "jsonpath provided" do
83
+ context "in sequence" do
84
+ let(:id_value) { 2 }
94
85
 
95
- instance = subject.new
86
+ it "looks up data using jsonpath (returns true)" do
87
+ in_sequence = instance.sequential?(data, jsonpath)
88
+ expect(in_sequence).to eq(true)
89
+ end
90
+ end
96
91
 
97
- data = { "sequence_id" => "1" }
92
+ context "out of sequence" do
93
+ let(:id_value) { 0 }
98
94
 
99
- expect(instance.sequential? data).to be(true)
95
+ it "looks up data using jsonpath (returns false)" do
96
+ in_sequence = instance.sequential?(data, jsonpath)
97
+ expect(in_sequence).to eq(false)
100
98
  end
101
99
  end
100
+ end
102
101
 
103
- context "get_last_seen >= data['sequence_id']" do
104
- it "returns false" do
105
- Alephant::Sequencer
106
- .any_instance
107
- .stub(:get_last_seen)
108
- .and_return(1)
102
+ context "jsonpath NOT provided" do
103
+ context "in sequence" do
104
+ let(:id_value) { 2 }
109
105
 
110
- instance = subject.new
106
+ it "looks up data using a fallback key (returns true)" do
107
+ in_sequence = instance.sequential?(data)
108
+ expect(in_sequence).to eq(true)
109
+ end
110
+ end
111
111
 
112
- data = { "sequence_id" => "0" }
112
+ context "out of sequence" do
113
+ let(:id_value) { 0 }
113
114
 
114
- expect(instance.sequential? data).to be(false)
115
+ it "looks up data using a fallback key (returns false)" do
116
+ in_sequence = instance.sequential?(data)
117
+ expect(in_sequence).to eq(false)
115
118
  end
116
119
  end
117
120
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alephant
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9.6
4
+ version: 0.0.9.7
5
5
  platform: java
6
6
  authors:
7
7
  - Robert Kenny
@@ -192,6 +192,20 @@ dependencies:
192
192
  version: 0.99.5
193
193
  prerelease: false
194
194
  type: :runtime
195
+ - !ruby/object:Gem::Dependency
196
+ name: jsonpath
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - '>='
200
+ - !ruby/object:Gem::Version
201
+ version: '0'
202
+ requirement: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - '>='
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ prerelease: false
208
+ type: :runtime
195
209
  description: Static publishing to S3 based on SQS messages
196
210
  email: kenoir@gmail.com
197
211
  executables: