rabbitek 0.2.0 → 0.3.0

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
- SHA1:
3
- metadata.gz: abffed1ec6fb3e1837dc3f75bd819742e1350935
4
- data.tar.gz: 72f165622c0f6346dfacb2666db46e2a0cc787b1
2
+ SHA256:
3
+ metadata.gz: 61812d7a27d392ac1fd654f0a181972b716be920d0e8d0579537f685d1d16d42
4
+ data.tar.gz: 800b02c54302fcd9c380ebb3effb63e38f28f85f4bfeb6e4731eb11385a92bbc
5
5
  SHA512:
6
- metadata.gz: a228c331c23fe8e80d9ace1a4c7847521b79a562cc14f01f413ea419337afb08e979f1673508b247dabb2e0565571f6e2b2ae0113d6fc60e51f50fa1cd29c00f
7
- data.tar.gz: ce5ad374f81f11b23345f6105261af2204ad4c19421d97c6345e35ba8f4d3ccb169697212e02ef866c057865a64aa3d2f42950ffea6f198cef54337e7569a72a
6
+ metadata.gz: 736fd9459b74ab310078f10be4835b600acdec3c8e04093c6d5fa5c90a364a5f1de0f17f6ae4de56cdea56237e63fd0012773732b3a6501970aa55539d826727
7
+ data.tar.gz: 6c5d6d0a9b429cc88b0c844c78c3de40e0aacad2d98464c4897cfbecbba2b6b745d4823e2739b2fc995953c9273a32b1434052b0ce63d8929cbe4d767448d1b3
data/.travis.yml CHANGED
@@ -1,7 +1,6 @@
1
1
  sudo: false
2
2
  language: ruby
3
+ cache: bundler
3
4
  rvm:
4
- - 2.3.0
5
- - 2.4.0
6
- - 2.5.1
5
+ - 2.6.1
7
6
  before_install: gem install bundler -N
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## v0.3.0
2
+
3
+ Improvements:
4
+ * Handle AR connections correctly (hook in Rails < 5, reloader implementation in Rails >= 5)
5
+ * Allow to specify Rails app folder to require
6
+
7
+ New features:
8
+ * Add sentry integration
9
+
1
10
  ## v0.2.0
2
11
 
3
12
  ### Breaking changes
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rabbitek (0.1.2)
4
+ rabbitek (0.3.0)
5
5
  activesupport (> 3.0)
6
6
  bunny (~> 2.11.0)
7
7
  oj (~> 3.6)
@@ -11,27 +11,114 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
+ actioncable (5.2.2)
15
+ actionpack (= 5.2.2)
16
+ nio4r (~> 2.0)
17
+ websocket-driver (>= 0.6.1)
18
+ actionmailer (5.2.2)
19
+ actionpack (= 5.2.2)
20
+ actionview (= 5.2.2)
21
+ activejob (= 5.2.2)
22
+ mail (~> 2.5, >= 2.5.4)
23
+ rails-dom-testing (~> 2.0)
24
+ actionpack (5.2.2)
25
+ actionview (= 5.2.2)
26
+ activesupport (= 5.2.2)
27
+ rack (~> 2.0)
28
+ rack-test (>= 0.6.3)
29
+ rails-dom-testing (~> 2.0)
30
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
31
+ actionview (5.2.2)
32
+ activesupport (= 5.2.2)
33
+ builder (~> 3.1)
34
+ erubi (~> 1.4)
35
+ rails-dom-testing (~> 2.0)
36
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
37
+ activejob (5.2.2)
38
+ activesupport (= 5.2.2)
39
+ globalid (>= 0.3.6)
40
+ activemodel (5.2.2)
41
+ activesupport (= 5.2.2)
42
+ activerecord (5.2.2)
43
+ activemodel (= 5.2.2)
44
+ activesupport (= 5.2.2)
45
+ arel (>= 9.0)
46
+ activestorage (5.2.2)
47
+ actionpack (= 5.2.2)
48
+ activerecord (= 5.2.2)
49
+ marcel (~> 0.3.1)
14
50
  activesupport (5.2.2)
15
51
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
52
  i18n (>= 0.7, < 2)
17
53
  minitest (~> 5.1)
18
54
  tzinfo (~> 1.1)
19
55
  amq-protocol (2.3.0)
56
+ arel (9.0.0)
20
57
  ast (2.4.0)
58
+ builder (3.2.3)
21
59
  bunny (2.11.0)
22
60
  amq-protocol (~> 2.3.0)
23
- concurrent-ruby (1.1.3)
61
+ coderay (1.1.2)
62
+ concurrent-ruby (1.1.4)
63
+ crass (1.0.4)
24
64
  diff-lcs (1.3)
25
- i18n (1.1.1)
65
+ erubi (1.8.0)
66
+ globalid (0.4.2)
67
+ activesupport (>= 4.2.0)
68
+ i18n (1.5.2)
26
69
  concurrent-ruby (~> 1.0)
27
70
  jaro_winkler (1.5.1)
71
+ loofah (2.2.3)
72
+ crass (~> 1.0.2)
73
+ nokogiri (>= 1.5.9)
74
+ mail (2.7.1)
75
+ mini_mime (>= 0.1.1)
76
+ marcel (0.3.3)
77
+ mimemagic (~> 0.3.2)
78
+ method_source (0.9.2)
79
+ mimemagic (0.3.3)
80
+ mini_mime (1.0.2)
81
+ mini_portile2 (2.4.0)
28
82
  minitest (5.11.3)
29
- oj (3.7.4)
30
- opentracing (0.4.3)
83
+ nio4r (2.4.0)
84
+ nokogiri (1.10.3)
85
+ mini_portile2 (~> 2.4.0)
86
+ oj (3.8.1)
87
+ opentracing (0.5.0)
31
88
  parallel (1.12.1)
32
89
  parser (2.5.1.2)
33
90
  ast (~> 2.4.0)
34
91
  powerpack (0.1.2)
92
+ pry (0.12.2)
93
+ coderay (~> 1.1.0)
94
+ method_source (~> 0.9.0)
95
+ rack (2.0.7)
96
+ rack-test (1.1.0)
97
+ rack (>= 1.0, < 3)
98
+ rails (5.2.2)
99
+ actioncable (= 5.2.2)
100
+ actionmailer (= 5.2.2)
101
+ actionpack (= 5.2.2)
102
+ actionview (= 5.2.2)
103
+ activejob (= 5.2.2)
104
+ activemodel (= 5.2.2)
105
+ activerecord (= 5.2.2)
106
+ activestorage (= 5.2.2)
107
+ activesupport (= 5.2.2)
108
+ bundler (>= 1.3.0)
109
+ railties (= 5.2.2)
110
+ sprockets-rails (>= 2.0.0)
111
+ rails-dom-testing (2.0.3)
112
+ activesupport (>= 4.2.0)
113
+ nokogiri (>= 1.6)
114
+ rails-html-sanitizer (1.0.4)
115
+ loofah (~> 2.2, >= 2.2.2)
116
+ railties (5.2.2)
117
+ actionpack (= 5.2.2)
118
+ activesupport (= 5.2.2)
119
+ method_source
120
+ rake (>= 0.8.7)
121
+ thor (>= 0.19.0, < 2.0)
35
122
  rainbow (3.0.0)
36
123
  rake (10.5.0)
37
124
  rspec (3.7.0)
@@ -56,21 +143,34 @@ GEM
56
143
  ruby-progressbar (~> 1.7)
57
144
  unicode-display_width (~> 1.0, >= 1.0.1)
58
145
  ruby-progressbar (1.10.0)
59
- slop (4.6.2)
146
+ slop (4.7.0)
147
+ sprockets (3.7.2)
148
+ concurrent-ruby (~> 1.0)
149
+ rack (> 1, < 3)
150
+ sprockets-rails (3.2.1)
151
+ actionpack (>= 4.0)
152
+ activesupport (>= 4.0)
153
+ sprockets (>= 3.0.0)
154
+ thor (0.20.3)
60
155
  thread_safe (0.3.6)
61
156
  tzinfo (1.2.5)
62
157
  thread_safe (~> 0.1)
63
158
  unicode-display_width (1.4.0)
159
+ websocket-driver (0.7.1)
160
+ websocket-extensions (>= 0.1.0)
161
+ websocket-extensions (0.1.4)
64
162
 
65
163
  PLATFORMS
66
164
  ruby
67
165
 
68
166
  DEPENDENCIES
69
- bundler (~> 1.16)
167
+ bundler (~> 2.0)
168
+ pry
70
169
  rabbitek!
170
+ rails (~> 5)
71
171
  rake (~> 10.0)
72
172
  rspec (~> 3.0)
73
173
  rubocop (~> 0.58.0)
74
174
 
75
175
  BUNDLED WITH
76
- 1.17.1
176
+ 2.0.1
data/README.md CHANGED
@@ -10,6 +10,7 @@ High performance, easy to use background job processing library for Ruby using R
10
10
  * Client & Server hooks
11
11
  * OpenTracing (http://opentracing.io/) instrumentation
12
12
  * NewRelic instrumentation for sending errors
13
+ * Sentry instrumentation for sending errors
13
14
 
14
15
  ## Installation
15
16
 
data/Rakefile CHANGED
@@ -1,4 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/gem_tasks'
4
+
5
+ require 'rspec/core/rake_task'
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
8
+ t.rspec_opts = '--format documentation'
9
+ end
10
+
4
11
  task default: :spec
data/lib/rabbitek.rb CHANGED
@@ -14,8 +14,14 @@ require 'active_support/core_ext/string/inflections'
14
14
 
15
15
  current_dir = File.dirname(__FILE__)
16
16
 
17
- Dir.glob("#{current_dir}/rabbitek/*.rb").each { |file| require file }
18
- Dir.glob("#{current_dir}/rabbitek/**/*.rb").each { |file| require file }
17
+ require 'rabbitek/bunny_connection'
18
+ require 'rabbitek/cli'
19
+ require 'rabbitek/config'
20
+ require 'rabbitek/loggable'
21
+ Dir.glob("#{current_dir}/rabbitek/cli/**/*.rb").each { |file| require file }
22
+ Dir.glob("#{current_dir}/rabbitek/client/**/*.rb").each { |file| require file }
23
+ Dir.glob("#{current_dir}/rabbitek/server/**/*.rb").each { |file| require file }
24
+ Dir.glob("#{current_dir}/rabbitek/utils/**/*.rb").each { |file| require file }
19
25
 
20
26
  ##
21
27
  # High performance background job processing using RabbitMQ
@@ -28,6 +34,10 @@ module Rabbitek
28
34
  yield(config)
29
35
  end
30
36
 
37
+ def self.reloader
38
+ config.reloader
39
+ end
40
+
31
41
  def self.logger
32
42
  @config.logger
33
43
  end
data/lib/rabbitek/cli.rb CHANGED
@@ -46,8 +46,8 @@ module Rabbitek
46
46
  def opts
47
47
  @opts ||= Slop.parse do |o|
48
48
  o.string '-c', '--config', 'config file path. Default: "config/rabbitek.yaml"', default: 'config/rabbitek.yml'
49
- o.string '-r', '--require', 'file to require while booting. Default: "config/environment.rb"',
50
- default: 'config/environment.rb'
49
+ o.string '-r', '--require', 'rails app location or file to require while booting. Default: "."',
50
+ default: '.'
51
51
  o.on '--version', 'print the version' do
52
52
  puts VERSION
53
53
  exit
@@ -64,7 +64,12 @@ module Rabbitek
64
64
  end
65
65
 
66
66
  def require_application
67
- require File.expand_path(opts[:require])
67
+ require File.expand_path(opts[:require]) unless File.directory?(opts[:require])
68
+
69
+ # Rails application provided
70
+ require 'rails'
71
+ require 'rabbitek/rails'
72
+ require File.expand_path("#{opts[:require]}/config/environment.rb")
68
73
  end
69
74
 
70
75
  def map_consumer_workers!
@@ -8,7 +8,9 @@ module Rabbitek
8
8
  bunny_configuration: { hosts: 'localhost:5672', vhost: '/' },
9
9
  log_format: 'json',
10
10
  enable_newrelic: true,
11
- logger: Logger.new(STDOUT)
11
+ enable_sentry: true,
12
+ logger: Logger.new(STDOUT),
13
+ reloader: proc { |&block| block.call }
12
14
  }.freeze
13
15
 
14
16
  attr_accessor(*DEFAULTS.keys)
@@ -20,12 +22,12 @@ module Rabbitek
20
22
  @server_hooks_config = []
21
23
  end
22
24
 
23
- def add_client_hook(hook_object)
24
- @client_hooks_config << hook_object
25
+ def add_client_hook(hook_object, position = @client_hooks_config.size)
26
+ @client_hooks_config.insert(position, hook_object)
25
27
  end
26
28
 
27
- def add_server_hook(hook_object)
28
- @server_hooks_config << hook_object
29
+ def add_server_hook(hook_object, position = @server_hooks_config.size)
30
+ @server_hooks_config.insert(position, hook_object)
29
31
  end
30
32
 
31
33
  def client_hooks
@@ -15,6 +15,7 @@ module Rabbitek
15
15
  def error(msg)
16
16
  log_msg(:error, msg)
17
17
  NewRelic::Agent.notice_error(msg) if Rabbitek.config.enable_newrelic && Object.const_defined?('NewRelic')
18
+ Raven.capture_exception(msg) if Rabbitek.config.enable_sentry && Object.const_defined?('Raven')
18
19
  true
19
20
  end
20
21
 
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rabbitek
4
+ ##
5
+ # Rails extensions
6
+ class Rails < ::Rails::Engine
7
+ include Loggable
8
+
9
+ config.before_configuration do
10
+ if ::Rails::VERSION::MAJOR < 5 && defined?(::ActiveRecord)
11
+ info 'Adding Rabbitek::Server::Hooks::ActiveRecordConnectionReset hook'
12
+
13
+ Rabbitek.configure do |c|
14
+ c.add_server_hook(Rabbitek::Server::Hooks::ActiveRecordConnectionReset.new, 0)
15
+ end
16
+ end
17
+ end
18
+
19
+ config.after_initialize do
20
+ if ::Rails::VERSION::MAJOR >= 5
21
+ info 'Using Rails code reloader'
22
+
23
+ Rabbitek.configure { |c| c.reloader = RailsReloader.new }
24
+ end
25
+ end
26
+
27
+ ##
28
+ # Implementation of reloader for Rails
29
+ class RailsReloader
30
+ def initialize
31
+ @app = ::Rails.application
32
+ end
33
+
34
+ def call
35
+ @app.reloader.wrap { yield }
36
+ end
37
+
38
+ def inspect
39
+ "#<Rabbitek::Rails::RailsReloader @app=#{@app.class.name}>"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../server_hook'
4
+
5
+ module Rabbitek
6
+ module Server
7
+ module Hooks
8
+ ##
9
+ # Active record connection reset to maintain correct connection state
10
+ # Used only in Rails < 5
11
+ class ActiveRecordConnectionReset < Rabbitek::ServerHook
12
+ def initialize
13
+ raise ArgumentError, 'Use AR connection reset only in Rails < 5!' unless should_allow_hook?
14
+ end
15
+
16
+ def call(consumer, message)
17
+ ::ActiveRecord::Base.establish_connection unless ::ActiveRecord::Base.connection.active?
18
+
19
+ super
20
+ ensure
21
+ ::ActiveRecord::Base.clear_active_connections!
22
+ end
23
+
24
+ private
25
+
26
+ def should_allow_hook?
27
+ defined?(::Rails) && ::Rails::VERSION::MAJOR < 5
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -18,7 +18,7 @@ module Rabbitek
18
18
 
19
19
  work_queue.subscribe(manual_ack: true) do |delivery_info, properties, payload|
20
20
  message = Message.new(delivery_info: delivery_info, properties: properties, payload: payload)
21
- on_message_received(message)
21
+ Rabbitek.reloader.call { on_message_received(message) }
22
22
  end
23
23
  end
24
24
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rabbitek
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.0'
5
5
  end
data/rabbitek.gemspec CHANGED
@@ -29,7 +29,9 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency 'opentracing', '~> 0.4'
30
30
  spec.add_dependency 'slop', '~> 4.0'
31
31
 
32
- spec.add_development_dependency 'bundler', '~> 1.16'
32
+ spec.add_development_dependency 'bundler', '~> 2.0'
33
+ spec.add_development_dependency 'pry'
34
+ spec.add_development_dependency 'rails', '~> 5'
33
35
  spec.add_development_dependency 'rake', '~> 10.0'
34
36
  spec.add_development_dependency 'rspec', '~> 3.0'
35
37
  spec.add_development_dependency 'rubocop', '~> 0.58.0'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabbitek
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boostcom
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-01-16 00:00:00.000000000 Z
11
+ date: 2019-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -86,14 +86,42 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.16'
89
+ version: '2.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.16'
96
+ version: '2.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rails
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '5'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '5'
97
125
  - !ruby/object:Gem::Dependency
98
126
  name: rake
99
127
  requirement: !ruby/object:Gem::Requirement
@@ -168,8 +196,10 @@ files:
168
196
  - lib/rabbitek/client/publisher.rb
169
197
  - lib/rabbitek/config.rb
170
198
  - lib/rabbitek/loggable.rb
199
+ - lib/rabbitek/rails.rb
171
200
  - lib/rabbitek/server/batcher.rb
172
201
  - lib/rabbitek/server/consumer.rb
202
+ - lib/rabbitek/server/hooks/active_record_connection_reset.rb
173
203
  - lib/rabbitek/server/hooks/opentracing.rb
174
204
  - lib/rabbitek/server/hooks/retry.rb
175
205
  - lib/rabbitek/server/hooks/time_tracker.rb
@@ -202,8 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
202
232
  - !ruby/object:Gem::Version
203
233
  version: '0'
204
234
  requirements: []
205
- rubyforge_project:
206
- rubygems_version: 2.5.1
235
+ rubygems_version: 3.0.3
207
236
  signing_key:
208
237
  specification_version: 4
209
238
  summary: High performance background job processing