upperkut 1.0.0.rc → 1.0.2

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
  SHA256:
3
- metadata.gz: 497852c1c7edee902a15cb3978f2efaab5ffdd8fe5be6fa2ab3fc62e9de2b661
4
- data.tar.gz: 39ed05ba320a38368c83a018216ab9db5ab26e760369f5b944e8ecacd24c1acc
3
+ metadata.gz: edf84d6612f4c9577cfe53e578e16983e3936863379c7d4c1041e9c92637f867
4
+ data.tar.gz: ce0ad624fe65306bb8fe818b8018acfe519326cbb744ef9af0519b26fd25faed
5
5
  SHA512:
6
- metadata.gz: 7cccacbc6c943ca5ee5bab8bea75c67d0ba6bb039c732723f16ffb78cd98c85ee5873b04cfc485b8e3fa879a35bfe59f0aedb53ede87a620666aebbe40ef9b77
7
- data.tar.gz: 3031919f600731f5fb2989ebe02055a1032bb3565ce471b74f6b29025b9f2417fc98a1302cc39ad6d0a05b1c4d641636cbff8d965bbd7194b5ae94f34a1096e4
6
+ metadata.gz: 3f6325ce299c9af7c50c9891acee2e771131d002c27b27fe6e245227d73ce177afd65451116daf7a5af5fc5e546b8b52b796ea82abf05bb8eae88966a16efa46
7
+ data.tar.gz: 482e700d0cd87b0f6de61c528ef42d7c57bbc96afce8d5d6b1593420a4fa9308f6be668cc8c183fc98b9347a6a33800be9df5bebc3da98ac7a673f2204440cc2
@@ -6,7 +6,7 @@ version: 2
6
6
  jobs:
7
7
  build:
8
8
  docker:
9
- - image: circleci/ruby:2.4.4
9
+ - image: circleci/ruby:2.7.2
10
10
  environment:
11
11
  CC_TEST_REPORTER_ID: 03ab83a772148a577d29d4acf438d7ebdc95c632224122d0ba8dbb291eedebe6
12
12
  COVERAGE: true
@@ -1,4 +1,11 @@
1
1
  # Upperkut changes
2
+
3
+ 1.0.x
4
+ -------
5
+ - Add docker
6
+ - Fix to_underscore bug for ruby 2.7.2 #83 @andrehjr;
7
+
8
+
2
9
  0.8.x
3
10
  --------
4
11
  - Added exponential backoff when push_items #57
@@ -0,0 +1,7 @@
1
+ FROM ruby:2.7.2
2
+
3
+ WORKDIR /code
4
+ COPY . .
5
+
6
+ RUN gem install bundler
7
+ RUN bundle install
data/Gemfile CHANGED
@@ -8,4 +8,4 @@ gemspec
8
8
  gem 'fivemat'
9
9
  gem 'pry'
10
10
  gem 'rspec_junit_formatter'
11
- gem 'simplecov', require: false
11
+ gem 'simplecov', '< 0.18', require: false
@@ -1,38 +1,38 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- upperkut (1.0.0.rc)
4
+ upperkut (1.0.2)
5
5
  connection_pool (~> 2.2, >= 2.2.2)
6
6
  redis (>= 4.1.0, < 5.0.0)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- coderay (1.1.2)
11
+ coderay (1.1.3)
12
12
  connection_pool (2.2.3)
13
- diff-lcs (1.3)
13
+ diff-lcs (1.4.4)
14
14
  docile (1.3.2)
15
15
  fivemat (1.3.7)
16
- json (2.3.0)
16
+ json (2.3.1)
17
17
  method_source (1.0.0)
18
18
  pry (0.13.1)
19
19
  coderay (~> 1.1)
20
20
  method_source (~> 1.0)
21
21
  rake (13.0.1)
22
- redis (4.2.1)
23
- rspec (3.9.0)
24
- rspec-core (~> 3.9.0)
25
- rspec-expectations (~> 3.9.0)
26
- rspec-mocks (~> 3.9.0)
27
- rspec-core (3.9.0)
28
- rspec-support (~> 3.9.0)
29
- rspec-expectations (3.9.0)
22
+ redis (4.2.5)
23
+ rspec (3.10.0)
24
+ rspec-core (~> 3.10.0)
25
+ rspec-expectations (~> 3.10.0)
26
+ rspec-mocks (~> 3.10.0)
27
+ rspec-core (3.10.0)
28
+ rspec-support (~> 3.10.0)
29
+ rspec-expectations (3.10.0)
30
30
  diff-lcs (>= 1.2.0, < 2.0)
31
- rspec-support (~> 3.9.0)
32
- rspec-mocks (3.9.0)
31
+ rspec-support (~> 3.10.0)
32
+ rspec-mocks (3.10.0)
33
33
  diff-lcs (>= 1.2.0, < 2.0)
34
- rspec-support (~> 3.9.0)
35
- rspec-support (3.9.0)
34
+ rspec-support (~> 3.10.0)
35
+ rspec-support (3.10.0)
36
36
  rspec_junit_formatter (0.4.1)
37
37
  rspec-core (>= 2, < 4, != 2.12.0)
38
38
  simplecov (0.17.1)
@@ -51,7 +51,7 @@ DEPENDENCIES
51
51
  rake (~> 13.0)
52
52
  rspec (~> 3.0)
53
53
  rspec_junit_formatter
54
- simplecov
54
+ simplecov (< 0.18)
55
55
  upperkut!
56
56
 
57
57
  BUNDLED WITH
@@ -0,0 +1,4 @@
1
+ bash:
2
+ docker-compose run gem bash
3
+ specs:
4
+ docker-compose run gem bundle exec rspec
@@ -0,0 +1,18 @@
1
+ services:
2
+ gem:
3
+ build: .
4
+ volumes:
5
+ - .:/code
6
+ environment:
7
+ - REDIS_URL=redis://redis:6379
8
+ depends_on:
9
+ - redis
10
+ redis:
11
+ image: redis:5.0.4-alpine
12
+ command: redis-server --save "" --appendonly yes --appendfsync everysec
13
+ ports:
14
+ - 6379:6379
15
+ volumes:
16
+ - redis-data:/data
17
+ volumes:
18
+ redis-data:
@@ -58,7 +58,7 @@ module Upperkut
58
58
 
59
59
  def self.default
60
60
  new.tap do |config|
61
- config.polling_interval = Integer(ENV['UPPERKUT_POLLING_INTERVAL'] || 5)
61
+ config.polling_interval = Float(ENV['UPPERKUT_POLLING_INTERVAL'] || 5)
62
62
  end
63
63
  end
64
64
 
@@ -4,27 +4,13 @@ module Upperkut
4
4
  class Item
5
5
  attr_reader :id, :body, :enqueued_at
6
6
 
7
- def initialize(body:, id: nil, enqueued_at: nil)
8
- raise ArgumentError, 'Body should be a Hash' unless body.is_a?(Hash)
9
-
7
+ def initialize(id:, body:, enqueued_at: nil)
8
+ @id = id
10
9
  @body = body
11
- @id = id || SecureRandom.uuid
12
10
  @enqueued_at = enqueued_at || Time.now.utc.to_i
13
11
  @nacked = false
14
12
  end
15
13
 
16
- def [](key)
17
- @body[key]
18
- end
19
-
20
- def []=(key, value)
21
- @body[key] = value
22
- end
23
-
24
- def key?(key)
25
- @body.key?(key)
26
- end
27
-
28
14
  def nack
29
15
  @nacked = true
30
16
  end
@@ -32,19 +18,5 @@ module Upperkut
32
18
  def nacked?
33
19
  @nacked
34
20
  end
35
-
36
- def to_json
37
- JSON.generate(
38
- 'id' => @id,
39
- 'body' => @body,
40
- 'enqueued_at' => @enqueued_at
41
- )
42
- end
43
-
44
- def self.from_json(item_json)
45
- hash = JSON.parse(item_json)
46
- id, body, enqueued_at = hash.values_at('id', 'body', 'enqueued_at')
47
- new(id: id, body: body, enqueued_at: enqueued_at)
48
- end
49
21
  end
50
22
  end
@@ -11,6 +11,7 @@ module Upperkut
11
11
 
12
12
  def process
13
13
  items = @worker.fetch_items.freeze
14
+ return unless items.any?
14
15
 
15
16
  @worker.server_middlewares.invoke(@worker, items) do
16
17
  @worker_instance.perform(items)
@@ -83,7 +83,7 @@ module Upperkut
83
83
  return false if items.empty?
84
84
 
85
85
  redis do |conn|
86
- conn.rpush(key, items.map(&:to_json))
86
+ conn.rpush(key, encode_json_items(items))
87
87
  end
88
88
 
89
89
  true
@@ -111,7 +111,7 @@ module Upperkut
111
111
  redis do |conn|
112
112
  conn.eval(ACK_ITEMS,
113
113
  keys: [processing_key],
114
- argv: items.map(&:to_json))
114
+ argv: encode_json_items(items))
115
115
  end
116
116
  end
117
117
 
@@ -121,7 +121,7 @@ module Upperkut
121
121
  redis do |conn|
122
122
  conn.eval(NACK_ITEMS,
123
123
  keys: [key, processing_key],
124
- argv: items.map(&:to_json))
124
+ argv: encode_json_items(items))
125
125
  end
126
126
  end
127
127
 
@@ -112,7 +112,7 @@ module Upperkut
112
112
 
113
113
  conn.eval(ENQUEUE_ITEM,
114
114
  keys: keys,
115
- argv: [item.to_json])
115
+ argv: [encode_json_items(item)])
116
116
  end
117
117
  end
118
118
 
@@ -43,8 +43,9 @@ module Upperkut
43
43
 
44
44
  redis do |conn|
45
45
  items.each do |item|
46
- ensure_timestamp_attr(item)
47
- conn.zadd(key, item['timestamp'], item.to_json)
46
+ schedule_item = ensure_timestamp_attr(item)
47
+ timestamp = schedule_item.body['timestamp']
48
+ conn.zadd(key, timestamp, encode_json_items(schedule_item))
48
49
  end
49
50
  end
50
51
 
@@ -97,7 +98,13 @@ module Upperkut
97
98
  end
98
99
 
99
100
  def ensure_timestamp_attr(item)
100
- item['timestamp'] = Time.now.utc.to_i unless item.key?('timestamp')
101
+ return item if item.body.key?('timestamp')
102
+
103
+ Item.new(
104
+ id: item.id,
105
+ body: item.body.merge('timestamp' => Time.now.utc.to_i),
106
+ enqueued_at: item.enqueued_at
107
+ )
101
108
  end
102
109
 
103
110
  def pop_values(redis_client, args)
@@ -119,17 +126,16 @@ module Upperkut
119
126
 
120
127
  def latency
121
128
  now = Time.now.utc
122
- now_timestamp = now.to_f
123
- job = nil
129
+ timestamp = now.to_f
124
130
 
125
- redis do |conn|
126
- job = conn.zrangebyscore(key, '-inf'.freeze, now_timestamp.to_s, limit: [0, 1]).first
127
- job = decode_json_items([job]).first
131
+ item = redis do |conn|
132
+ item = conn.zrangebyscore(key, '-inf', timestamp.to_s, limit: [0, 1]).first
133
+ decode_json_items([item]).first
128
134
  end
129
135
 
130
- return 0 unless job
136
+ return timestamp - item.body['timestamp'].to_f if item
131
137
 
132
- now_timestamp - job['timestamp'].to_f
138
+ 0
133
139
  end
134
140
 
135
141
  def redis
@@ -4,7 +4,7 @@ require 'upperkut/item'
4
4
  module Upperkut
5
5
  module Util
6
6
  def to_underscore(object)
7
- klass_name = object
7
+ klass_name = object.dup
8
8
  klass_name.gsub!(/::/, '_')
9
9
  klass_name.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
10
10
  klass_name.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
@@ -27,13 +27,29 @@ module Upperkut
27
27
  items.map do |item|
28
28
  next item if item.is_a?(Item)
29
29
 
30
- Item.new(body: item)
30
+ Item.new(id: SecureRandom.uuid, body: item)
31
+ end
32
+ end
33
+
34
+ def encode_json_items(items)
35
+ items = [items] unless items.is_a?(Array)
36
+
37
+ items.map do |item|
38
+ JSON.generate(
39
+ 'id' => item.id,
40
+ 'body' => item.body,
41
+ 'enqueued_at' => item.enqueued_at
42
+ )
31
43
  end
32
44
  end
33
45
 
34
46
  def decode_json_items(items)
35
- items.each_with_object([]) do |item, memo|
36
- memo << Item.from_json(item) if item
47
+ items.each_with_object([]) do |item_json, memo|
48
+ next unless item_json
49
+
50
+ hash = JSON.parse(item_json)
51
+ id, body, enqueued_at = hash.values_at('id', 'body', 'enqueued_at')
52
+ memo << Item.new(id: id, body: body, enqueued_at: enqueued_at)
37
53
  end
38
54
  end
39
55
 
@@ -1,3 +1,3 @@
1
1
  module Upperkut
2
- VERSION = '1.0.0.rc'.freeze
2
+ VERSION = '1.0.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: upperkut
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Sousa
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-31 00:00:00.000000000 Z
11
+ date: 2021-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -106,12 +106,15 @@ files:
106
106
  - ".rspec"
107
107
  - CHANGELOG.md
108
108
  - CODE_OF_CONDUCT.md
109
+ - Dockerfile
109
110
  - Gemfile
110
111
  - Gemfile.lock
111
112
  - LICENSE.txt
113
+ - Makefile
112
114
  - README.md
113
115
  - Rakefile
114
116
  - bin/upperkut
117
+ - docker-compose.yml
115
118
  - examples/basic.rb
116
119
  - examples/priority_worker.rb
117
120
  - examples/scheduled_worker.rb
@@ -152,11 +155,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
155
  version: 2.2.2
153
156
  required_rubygems_version: !ruby/object:Gem::Requirement
154
157
  requirements:
155
- - - ">"
158
+ - - ">="
156
159
  - !ruby/object:Gem::Version
157
- version: 1.3.1
160
+ version: '0'
158
161
  requirements: []
159
- rubygems_version: 3.1.2
162
+ rubygems_version: 3.1.4
160
163
  signing_key:
161
164
  specification_version: 4
162
165
  summary: Batch background processing tool