bellbro 0.0.4 → 0.0.5

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: 120efff8ea0e78fb3d66c956710c992b334f7b2c
4
- data.tar.gz: 4b60e315848cac0223753b75cdf272cea8faaa73
3
+ metadata.gz: 68c58a1bb724a51d658a0d973c83c361360c8d86
4
+ data.tar.gz: 45a769183a5357bd3bcfcbf63bcb0c8ae16c33b6
5
5
  SHA512:
6
- metadata.gz: 85942bd6428e156b6dc0491817a04a2a14f01d52c756679eefdea32595b399123c893f0e46b30cfb5ba2d7f91411ff83b1f1ffdbee91eaade4f1994503674caa
7
- data.tar.gz: bbbac39c8e0006e740bd495c70d1147a07a37ee1a72b0263df63eccdf9d85d9a0c5b18bcf05934d9b3670e8edf41175b6512e7513d7f813353d73f339416b8c8
6
+ metadata.gz: 2bfaa5bd73233a5a3a6324cad5f9f8683e05164ee71789e90a0a63ae30130ac5ae5d84423d3369ca8d9caac4580b5c0a17b3eedbace79b903a99d8aa93fd70f7
7
+ data.tar.gz: 51bd64416a5555b91974b44698273304073401e1eb4379e621ee7749c74d0f2ee135f4b5dfbef4b23b929ee56f28efcb5ffd7ae8367326d14655335fc7348e5b
data/.gitignore CHANGED
@@ -11,6 +11,7 @@
11
11
  *.so
12
12
  *.o
13
13
  *.a
14
- mkmf.log
14
+ *.log
15
15
  *.gem
16
16
  /.idea/
17
+ .rspec
data/bellbro.gemspec CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency "activesupport"
20
21
  spec.add_dependency "sidekiq"
21
22
  spec.add_dependency "redis"
22
23
  spec.add_dependency "airbrake"
@@ -24,4 +25,6 @@ Gem::Specification.new do |spec|
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.7"
26
27
  spec.add_development_dependency "rake", "~> 10.0"
28
+ spec.add_development_dependency "rspec"
29
+ spec.add_development_dependency "yell"
27
30
  end
data/lib/bellbro/bell.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Bellbro
2
2
  class Bell
3
3
  include Bellbro::Retryable
4
- include Bellbro::Ringer
4
+ include Bellbro::Ringable
5
5
  end
6
6
  end
7
7
 
@@ -1,5 +1,5 @@
1
1
  module Bellbro
2
- module Ringer
2
+ module Ringable
3
3
  def self.included(klass)
4
4
  klass.extend(self)
5
5
  end
@@ -5,7 +5,7 @@ module Bellbro
5
5
  include Bellbro::SidekiqUtils
6
6
  include Bellbro::Trackable
7
7
 
8
- SLEEP_INTERVAL = Rails.env.test? ? 1 : 3600
8
+ SLEEP_INTERVAL = defined?(Rails) && Rails.env.test? ? 1 : 3600
9
9
  LOG_RECORD_SCHEMA = { jobs_started: Integer }
10
10
 
11
11
  attr_reader :thread, :thread_error, :jid
@@ -1,12 +1,27 @@
1
1
  module Bellbro
2
2
  module Trackable
3
3
  include Bellbro::Retryable
4
+
4
5
  attr_reader :record
5
6
 
7
+ def self.included(klass)
8
+ class << klass
9
+ def track_with_schema(hash)
10
+ self.class_eval do
11
+ @log_record_schema = hash
12
+ end
13
+ end
14
+
15
+ def log_record_schema
16
+ @log_record_schema
17
+ end
18
+ end
19
+ end
20
+
6
21
  def track(opts={})
7
22
  return if @log_record_schema # Ignore repeated calls to #track, as in RefreshLinksWorker
8
23
  opts.symbolize_keys!
9
- @log_record_schema = self.class::LOG_RECORD_SCHEMA
24
+ @log_record_schema = self.class.log_record_schema
10
25
  @write_interval = opts[:write_interval] || 500
11
26
  @count = 0
12
27
  @tracking = true
@@ -16,7 +31,11 @@ module Bellbro
16
31
 
17
32
  def status_update(force = false)
18
33
  return unless force || ((@count += 1) % @write_interval) == 0
19
- retryable { $log.info(@record.to_json) }
34
+ retryable { write_log(@record.to_json) }
35
+ end
36
+
37
+ def write_log(line)
38
+ Bellbro.logger.info line
20
39
  end
21
40
 
22
41
  def record_set(attr, value)
@@ -50,7 +69,7 @@ module Bellbro
50
69
  agent: {
51
70
  name: "#{self.class.name}",
52
71
  thread: "#{Thread.current.object_id}",
53
- jid: self.jid,
72
+ jid: jid,
54
73
  },
55
74
  domain: @site.try(:domain) || @domain,
56
75
  complete: false,
@@ -58,7 +77,7 @@ module Bellbro
58
77
  data: {}
59
78
  }
60
79
 
61
- self.class::LOG_RECORD_SCHEMA.each do |k, v|
80
+ @log_record_schema.each do |k, v|
62
81
  if v == Integer
63
82
  @record[:data][k] = 0
64
83
  else
@@ -74,7 +93,7 @@ module Bellbro
74
93
  def validate(attrs)
75
94
  attrs.each do |attr, value|
76
95
  raise "Invalid attribute #{attr}" unless log_record_attributes.include?(attr)
77
- raise "Invalid type for #{attr}" unless [value.class, value.class.superclass].include?(self.class::LOG_RECORD_SCHEMA[attr])
96
+ raise "Invalid type for #{attr}" unless [value.class, value.class.superclass].include?(@log_record_schema[attr])
78
97
  end
79
98
  end
80
99
 
@@ -1,3 +1,3 @@
1
1
  module Bellbro
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -1,6 +1,7 @@
1
1
  module Bellbro
2
2
  class Worker < Bellbro::Bell
3
3
  include Sidekiq::Worker
4
+ include Bellbro::Trackable
4
5
  extend Bellbro::SidekiqUtils
5
6
 
6
7
  attr_reader :domain
data/lib/bellbro.rb CHANGED
@@ -1,7 +1,28 @@
1
1
  require "bellbro/version"
2
+ require 'connection_pool'
3
+ require 'active_support/all'
4
+ require 'redis'
5
+ require 'yaml'
6
+ require 'digest'
7
+ require 'sidekiq'
8
+ require 'airbrake'
2
9
 
3
10
  module Bellbro
4
11
  def self.logger
5
12
  Bellbro::Settings.logger
6
13
  end
7
14
  end
15
+
16
+ %w(
17
+ bellbro/settings.rb
18
+ bellbro/retryable.rb
19
+ bellbro/ringable.rb
20
+ bellbro/trackable.rb
21
+ bellbro/redis_pool.rb
22
+ bellbro/sidekiq_utils.rb
23
+ bellbro/bell.rb
24
+ bellbro/service.rb
25
+ bellbro/worker.rb
26
+ ).each do |path|
27
+ require File.join(File.dirname(__FILE__),path)
28
+ end
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'active_support'
4
+ require 'bellbro'
5
+ require 'rspec'
6
+ require 'yell'
7
+
8
+ Dir[File.join(File.dirname(__FILE__),'../spec/support/**/*.rb')].each { |f| require f }
9
+ #Dir[File.join(File.dirname(__FILE__),'../spec/factories/**/*.rb')].each { |f| require f }
10
+
11
+ RSpec.configure do |config|
12
+ config.order = 'random'
13
+ #config.include FactoryGirl::Syntax::Methods
14
+ end
@@ -0,0 +1,7 @@
1
+ logger = Yell.new do |l|
2
+ l.level = [:debug, :info, :warn, :error]
3
+ end
4
+
5
+ Bellbro::Settings.configure do |config|
6
+ config.logger = logger
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'sidekiq/api'
2
+ def clear_sidekiq
3
+ Sidekiq::Worker.clear_all
4
+ %w(db_fast_high db_fast_low db_slow_high db_slow_low crawls crawl_images stretched).each do |q|
5
+ Sidekiq::Queue.new(q).clear
6
+ end
7
+ end
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+ require 'sidekiq/testing'
3
+ Sidekiq::Testing.fake!
4
+
5
+ class TrackWorker < Bellbro::Worker
6
+ track_with_schema(
7
+ links_created: Integer,
8
+ listings_updated: Integer,
9
+ errors: Array,
10
+ status: String
11
+ )
12
+
13
+ def initialize(domain)
14
+ @domain = domain
15
+ end
16
+
17
+ def jid
18
+ "abc123"
19
+ end
20
+ end
21
+
22
+ describe Bellbro::Trackable do
23
+ before :each do
24
+ @worker = TrackWorker.new('www.retailer.com')
25
+ Sidekiq::Worker.clear_all
26
+ end
27
+
28
+ describe "#track" do
29
+ it "should properly initialize the log record" do
30
+ @worker.track
31
+ expect(@worker.record[:host]).to eq(Socket.gethostname)
32
+ expect(@worker.record[:agent][:name]).to eq('TrackWorker')
33
+ expect(@worker.record[:agent][:jid]).to eq('abc123')
34
+ expect(@worker.record[:data][:links_created]).to eq(0)
35
+ expect(@worker.record[:data][:listings_updated]).to eq(0)
36
+ expect(@worker.record[:data][:errors]).to be_empty
37
+ end
38
+ end
39
+
40
+ describe "#record_set" do
41
+ it "sets a record" do
42
+ @worker.track
43
+ @worker.record_set(:status, "Update")
44
+ expect(@worker.record[:data][:status]).to eq("Update")
45
+ end
46
+ end
47
+
48
+ describe "#record_incr" do
49
+ it "increments an integer record" do
50
+ @worker.track
51
+ 5.times { @worker.record_incr(:links_created) }
52
+ expect(@worker.record[:data][:links_created]).to eq(5)
53
+ end
54
+ end
55
+
56
+ describe "#status_update" do
57
+ it "writes to the standard logger to update status" do
58
+ @worker.track(write_interval: 1)
59
+ @worker.record_incr(:links_created)
60
+ expect(@worker).to receive(:write_log)
61
+ @worker.status_update
62
+ end
63
+
64
+ it "does not reset the record data after each status update" do
65
+ @worker.track(write_interval: 1)
66
+ 5.times { @worker.record_incr(:links_created) }
67
+ expect(@worker.record[:data][:links_created]).to eq(5)
68
+ 2.times { @worker.status_update }
69
+ expect(@worker.record[:data][:links_created]).to eq(5)
70
+ expect(@worker.record.to_param).to include('links_created%5D=5')
71
+ end
72
+ end
73
+
74
+ describe "#validate" do
75
+ it "raises an error if an attribute is invalid" do
76
+ @worker.track
77
+ expect {
78
+ @worker.send(:validate, {foo: "bar"})
79
+ }.to raise_error(RuntimeError)
80
+ end
81
+
82
+ it "raises an error if a value is invalid" do
83
+ @worker.track
84
+ expect {
85
+ @worker.send(:validate, {links_created: "bar"})
86
+ }.to raise_error(RuntimeError)
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+ require 'sidekiq/testing'
3
+
4
+ describe Bellbro::Worker do
5
+ before :each do
6
+ Sidekiq::Testing.disable!
7
+ clear_sidekiq
8
+ end
9
+
10
+ after :each do
11
+ clear_sidekiq
12
+ Sidekiq::Testing.fake!
13
+ end
14
+
15
+ describe "#jobs_in_flight_with_domain" do
16
+ it "counts the number of enqueued jobs and active workers for a domain" do
17
+ domain = "www.retailer.com"
18
+ 5.times { Bellbro::Worker.perform_async(domain: domain) }
19
+ expect(Bellbro::Worker.jobs_in_flight_with_domain(domain).count).to eq(5)
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bellbro
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Stokes
@@ -10,6 +10,20 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2015-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - '>='
17
+ - !ruby/object:Gem::Version
18
+ version: '0'
19
+ name: activesupport
20
+ prerelease: false
21
+ type: :runtime
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  requirement: !ruby/object:Gem::Requirement
15
29
  requirements:
@@ -80,6 +94,34 @@ dependencies:
80
94
  - - ~>
81
95
  - !ruby/object:Gem::Version
82
96
  version: '10.0'
97
+ - !ruby/object:Gem::Dependency
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ name: rspec
104
+ prerelease: false
105
+ type: :development
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ name: yell
118
+ prerelease: false
119
+ type: :development
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
83
125
  description:
84
126
  email:
85
127
  - jon@jonstokes.com
@@ -97,13 +139,18 @@ files:
97
139
  - lib/bellbro/bell.rb
98
140
  - lib/bellbro/redis_pool.rb
99
141
  - lib/bellbro/retryable.rb
100
- - lib/bellbro/ringer.rb
142
+ - lib/bellbro/ringable.rb
101
143
  - lib/bellbro/service.rb
102
144
  - lib/bellbro/settings.rb
103
145
  - lib/bellbro/sidekiq_utils.rb
104
146
  - lib/bellbro/trackable.rb
105
147
  - lib/bellbro/version.rb
106
148
  - lib/bellbro/worker.rb
149
+ - spec/spec_helper.rb
150
+ - spec/support/bellbro.rb
151
+ - spec/support/sidekiq.rb
152
+ - spec/trackable_spec.rb
153
+ - spec/worker_spec.rb
107
154
  homepage: ''
108
155
  licenses:
109
156
  - MIT
@@ -128,4 +175,9 @@ rubygems_version: 2.4.5
128
175
  signing_key:
129
176
  specification_version: 4
130
177
  summary: Helps with sidekiq.
131
- test_files: []
178
+ test_files:
179
+ - spec/spec_helper.rb
180
+ - spec/support/bellbro.rb
181
+ - spec/support/sidekiq.rb
182
+ - spec/trackable_spec.rb
183
+ - spec/worker_spec.rb