resque-reports 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NzYyMTMxNzc4Y2RkZjQ1OWEwNzg0MTkxMTc2YmQ0MTA3NTBkZTQzNQ==
5
- data.tar.gz: !binary |-
6
- ZWIzNzQwOTcxY2RjOTYxZTk5ZjBlMTY4NjkwNmJjZTU0NjBlZmZlNg==
2
+ SHA1:
3
+ metadata.gz: 8dbaf30352c2e435726ec9cc9fe1d6364a850efd
4
+ data.tar.gz: 6d96fded79937853de430a3c332a56901c0e2ea0
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- M2Q3ZGQ3YzY5OWU1MjczMDVkNzY0YmM0OTcwMTBiZDAzYWQwZDc0OWJkZjVm
10
- NDg4NTgyMDgwMDczNTI4ZDkxNjJlY2JjZmMzMjQ3NTg2YWY2ODZiMzgyMmJh
11
- ZDc0ZmNmNGZkYzIyOGFhNWU1NDU3ZmVlNzAwMDAwMzE4ODliOGU=
12
- data.tar.gz: !binary |-
13
- Mzg2MmYyNDdkYjc5NDg1ZGJkZTVlNzlmYWFkZDQwOWIzYTgwYWMwNTFjZjhh
14
- YjBlNDJhOGYyODAyYjVkOTIzZGQ2MWUyMWU1NWVhMzM4MmYyMmQxMjFmZWVj
15
- YTg0MTQ4ZjUwMzBjYzA3OWE5N2IyZWU4NjVkM2NlN2JkYTE5Yzc=
6
+ metadata.gz: 50e199c9d2788226da04fc4e9ef9c6cad4e0c7313a4e7c40654afe18b7ffae7475aa4759e2b6ae7896fb190f48f438cc2104295d282ec5a778666777b8e8dd06
7
+ data.tar.gz: 1d1233ca179cc4686ce046a08aeefadadb0d49efd86f086b753f195eaf98b05332aa9c687b6b38cd8cfbb81b1ba607e1eba92c43f363aa132153ad54a269a591
@@ -76,17 +76,18 @@ module Resque
76
76
  protected
77
77
 
78
78
  attr_reader :create_block
79
- attr_accessor :file_extension,
80
- :file_encoding,
81
- :file_directory,
82
- :job_queue
83
-
84
- alias_method :super_extension, :file_extension
85
- alias_method :extension, :file_extension=
86
- alias_method :set_extension, :file_extension=
87
- alias_method :encoding, :file_encoding=
88
- alias_method :directory, :file_directory=
89
- alias_method :queue, :job_queue=
79
+ attr_accessor :_extension,
80
+ :_encoding,
81
+ :_directory,
82
+ :_queue,
83
+ :_output_filename
84
+
85
+ alias_method :super_extension, :_extension
86
+ alias_method :extension, :_extension=
87
+ alias_method :encoding, :_encoding=
88
+ alias_method :directory, :_directory=
89
+ alias_method :queue, :_queue=
90
+ alias_method :output_filename, :_output_filename=
90
91
 
91
92
  def set_instance(obj)
92
93
  @instance = obj
@@ -98,7 +99,7 @@ module Resque
98
99
 
99
100
  # override for Extenstions::TableBuilding, to use custom encoding
100
101
  def encoded_string(obj)
101
- obj.to_s.encode(file_encoding,
102
+ obj.to_s.encode(_encoding,
102
103
  invalid: :replace,
103
104
  undef: :replace)
104
105
  end
@@ -124,7 +125,6 @@ module Resque
124
125
  # Constants #
125
126
  #++
126
127
 
127
- DEFAULT_EXTENSION = 'txt'
128
128
  DEFAULT_QUEUE = :base
129
129
 
130
130
  #--
@@ -132,17 +132,29 @@ module Resque
132
132
  #++
133
133
 
134
134
  def_delegators Const::TO_EIGENCLASS,
135
- :file_directory,
136
- :file_extension,
137
- :file_encoding,
135
+ :_directory,
136
+ :_extension,
137
+ :_encoding,
138
+ :_queue,
138
139
  :create_block,
139
140
  :set_instance,
140
- :set_extension,
141
- :job_queue
141
+ :_extension=
142
142
 
143
143
  def_delegators :@cache_file, :filename, :exists?, :ready?
144
144
  def_delegator Const::TO_SUPER, :super_extension
145
145
 
146
+ attr_reader :job_id
147
+
148
+ def self.build(options = {})
149
+ in_background = options.delete(:background)
150
+ force = options.delete(:force)
151
+ report = new(options)
152
+
153
+ in_background ? report.bg_build(force) : report.build(force)
154
+
155
+ report
156
+ end
157
+
146
158
  #--
147
159
  # Public instance methods
148
160
  #++
@@ -156,9 +168,7 @@ module Resque
156
168
  create_dispatch(*args)
157
169
  else
158
170
  if args && (attrs_hash = args.first) && attrs_hash.is_a?(Hash)
159
- attrs_hash.each do |name, value|
160
- send("#{name}=", value)
161
- end
171
+ attrs_hash.each { |name, value| send("#{name}=", value) }
162
172
  end
163
173
  end
164
174
 
@@ -182,20 +192,20 @@ module Resque
182
192
  args_json = [*@args, force].to_json
183
193
 
184
194
  # Check report if it already in progress and tring return its job_id...
185
- job_id = ReportJob.enqueued?(report_class, args_json).try(:meta_id)
195
+ @job_id = ReportJob.enqueued?(report_class, args_json).try(:meta_id)
186
196
 
187
197
  # ...and start new job otherwise
188
- job_id || ReportJob.enqueue_to(job_queue || DEFAULT_QUEUE, report_class, args_json).try(:meta_id)
198
+ @job_id ||= ReportJob.enqueue_to(_queue || DEFAULT_QUEUE, report_class, args_json).try(:meta_id)
189
199
  end
190
200
 
191
201
  protected
192
202
 
193
203
  def init_cache_file
194
- set_extension super_extension || DEFAULT_EXTENSION
204
+ self._extension = super_extension || DEFAULT_EXTENSION
195
205
 
196
- @cache_file = CacheFile.new(file_directory,
197
- generate_filename(@args, file_extension),
198
- coding: file_encoding)
206
+ @cache_file = CacheFile.new(_directory,
207
+ generate_filename(@args, _extension),
208
+ coding: _encoding)
199
209
  end
200
210
 
201
211
  # Method specifies how to output report data
@@ -1,3 +1,4 @@
1
+ require 'tempfile'
1
2
  # coding: utf-8
2
3
  module Resque
3
4
  module Reports
@@ -33,17 +34,29 @@ module Resque
33
34
  def open(force = false)
34
35
  prepare_cache_dir
35
36
 
36
- force ? FileUtils.rm_f(@filename) : return if File.exists?(@filename)
37
+ (force ? clear : return) if File.exists?(@filename)
37
38
 
38
- remove_unfinished_on_error do
39
- File.open(@filename, "w:#{@coding}") do |file|
40
- yield file
41
- end
39
+ with_tempfile do |tempfile|
40
+ yield tempfile
41
+
42
+ tempfile.close
43
+ FileUtils.cp(tempfile.path, @filename)
42
44
  end
43
45
  end
44
46
 
47
+ def clear
48
+ FileUtils.rm_f(@filename)
49
+ end
50
+
45
51
  protected
46
52
 
53
+ def with_tempfile
54
+ yield(tempfile = Tempfile.new(Digest::MD5.hexdigest(@filename), :encoding => @coding))
55
+ ensure
56
+ tempfile.close unless tempfile.closed?
57
+ tempfile.try(:unlink)
58
+ end
59
+
47
60
  def prepare_cache_dir
48
61
  FileUtils.mkdir_p @dir # create folder if not exists
49
62
 
@@ -67,16 +80,6 @@ module Resque
67
80
  .map { |fname| File.join(@dir, fname) if File.extname(fname) == @ext }
68
81
  .compact
69
82
  end
70
-
71
- def remove_unfinished_on_error
72
- yield
73
- rescue => error
74
- # remove everything that was written due to it inconsistance
75
- FileUtils.rm_f @filename
76
-
77
- # don't suppress any errors here
78
- raise error
79
- end
80
83
  end
81
84
  end
82
85
  end
@@ -5,119 +5,125 @@ module Resque
5
5
  module BatchedReport
6
6
  extend ActiveSupport::Concern
7
7
 
8
- BATCH_SIZE = 10_000
9
-
10
- module InstanceMethods
11
- # Internal: Выполняет запрос отчета пачками и выполняет block для каждой пачки
12
- # Переопредленный метод из Resque::Reports
13
- #
14
- # Returns Nothing
15
- def data_each(force = false)
16
- 0.step(data_size, batch_size) do |batch_offset|
17
- ActiveRecord::Base.connection.execute(batched_query(batch_offset)).each do |element|
18
- yield element
19
- end
8
+ included do
9
+ BATCH_SIZE = 10_000
10
+ end
11
+
12
+ # Internal: Подключение используемое для выполнения запросов
13
+ #
14
+ # Returns connection adapter
15
+ def connection
16
+ ActiveRecord::Base.connection
17
+ end
18
+
19
+ # Internal: Выполняет запрос отчета пачками и выполняет block для каждой пачки
20
+ # Переопредленный метод из Resque::Reports
21
+ #
22
+ # Returns Nothing
23
+ def data_each(force = false)
24
+ 0.step(data_size, batch_size) do |batch_offset|
25
+ connection.execute(batched_query(batch_offset)).each do |element|
26
+ yield element
20
27
  end
21
28
  end
29
+ end
22
30
 
23
- # Internal: Возвращает общее кол-во строк в отчете
24
- # Переопредленный метод из Resque::Reports
25
- #
26
- # Returns Fixnum
27
- def data_size
28
- @data_size ||= ActiveRecord::Base.connection.execute(count_query)[0]['count'].to_i
29
- end
31
+ # Internal: Возвращает общее кол-во строк в отчете
32
+ # Переопредленный метод из Resque::Reports
33
+ #
34
+ # Returns Fixnum
35
+ def data_size
36
+ @data_size ||= connection.execute(count_query)[0]['count'].to_i
37
+ end
30
38
 
31
- protected
39
+ protected
32
40
 
33
- # Internal: Возвращает отфильтрованный запрос отчета
34
- #
35
- # Returns Arel::SelectManager
36
- def query
37
- filter base_query
38
- end
41
+ # Internal: Возвращает отфильтрованный запрос отчета
42
+ #
43
+ # Returns Arel::SelectManager
44
+ def query
45
+ filter base_query
46
+ end
39
47
 
40
- # Internal: Полезный метод для хранения Arel::Table объектов для запроса отчета
41
- #
42
- # Returns Hash, {:table_name => #<Arel::Table @name="table_name">, ...}
43
- def tables
44
- return @tables if defined? @tables
48
+ # Internal: Полезный метод для хранения Arel::Table объектов для запроса отчета
49
+ #
50
+ # Returns Hash, {:table_name => #<Arel::Table @name="table_name">, ...}
51
+ def tables
52
+ return @tables if defined? @tables
45
53
 
46
- tables = models.map(&:arel_table)
54
+ tables = models.map(&:arel_table)
47
55
 
48
- @tables = tables.inject({}) { |a, e| a.store(e.name, e) && a }.with_indifferent_access
49
- end
56
+ @tables = tables.reduce({}) { |a, e| a.store(e.name, e) && a }.with_indifferent_access
57
+ end
50
58
 
51
- # Internal: Полезный метод для join'а необходимых таблиц через Arel
52
- #
53
- # Returns Arel
54
- def join_tables(source_table, joins)
55
- joins.inject(source_table) do |query, joined|
56
- query.join(joined[:table]).on(joined[:on])
57
- end
58
- end
59
+ # Internal: Полезный метод для join'а необходимых таблиц через Arel
60
+ #
61
+ # Returns Arel
62
+ def join_tables(source_table, *joins)
63
+ joins.inject(source_table) { |query, joined| query.join(joined[:table]).on(joined[:on]) }
64
+ end
59
65
 
60
- # Internal: Размер пачки отчета
61
- #
62
- # Returns Fixnum
63
- def batch_size
64
- BATCH_SIZE
65
- end
66
+ # Internal: Размер пачки отчета
67
+ #
68
+ # Returns Fixnum
69
+ def batch_size
70
+ BATCH_SIZE
71
+ end
66
72
 
67
- # Internal: Модели используемые в отчете
68
- #
69
- # Returns Array of Arel::Table
70
- def models
71
- fail NotImplementedError
72
- end
73
+ # Internal: Модели используемые в отчете
74
+ #
75
+ # Returns Array of Arel::Table
76
+ def models
77
+ fail NotImplementedError
78
+ end
73
79
 
74
- # Internal: Основной запрос отчета (Arel)
75
- #
76
- # Returns Arel::SelectManager
77
- def base_query
78
- fail NotImplementedError
79
- end
80
+ # Internal: Основной запрос отчета (Arel)
81
+ #
82
+ # Returns Arel::SelectManager
83
+ def base_query
84
+ fail NotImplementedError
85
+ end
80
86
 
81
- # Internal: Поля запрашиваемые отчетом
82
- #
83
- # Returns String (SQL)
84
- def select
85
- fail NotImplementedError
86
- end
87
+ # Internal: Поля запрашиваемые отчетом
88
+ #
89
+ # Returns String (SQL)
90
+ def select
91
+ fail NotImplementedError
92
+ end
87
93
 
88
- # Internal: Порядок строк отчета
89
- #
90
- # Returns String (SQL)
91
- def order
92
- nil
93
- end
94
+ # Internal: Порядок строк отчета
95
+ #
96
+ # Returns String (SQL)
97
+ def order
98
+ nil
99
+ end
100
+ alias_method :order_by, :order
94
101
 
95
- # Internal: Фильтры отчета
96
- #
97
- # Returns Arel::SelectManager
98
- def filter(query)
99
- query
100
- end
102
+ # Internal: Фильтры отчета
103
+ #
104
+ # Returns Arel::SelectManager
105
+ def filter(query)
106
+ query
107
+ end
101
108
 
102
- # Internal: Запрос количества строк в отчете
103
- #
104
- # Returns String (SQL)
105
- def count_query
106
- query.project(Arel.sql('COUNT(*) as count')).to_sql
107
- end
109
+ # Internal: Запрос количества строк в отчете
110
+ #
111
+ # Returns String (SQL)
112
+ def count_query
113
+ query.project(Arel.sql('COUNT(*) as count')).to_sql
114
+ end
108
115
 
109
- # Internal: Запрос пачки строк отчета
110
- #
111
- # offset - Numeric, число строк на которое сдвигается запрос
112
- #
113
- # Returns String (SQL)
114
- def batched_query(offset)
115
- query.project(Arel.sql(select))
116
- .take(batch_size)
117
- .skip(offset)
118
- .order(order)
119
- .to_sql
120
- end
116
+ # Internal: Запрос пачки строк отчета
117
+ #
118
+ # offset - Numeric, число строк на которое сдвигается запрос
119
+ #
120
+ # Returns String (SQL)
121
+ def batched_query(offset)
122
+ query.project(Arel.sql(select))
123
+ .take(batch_size)
124
+ .skip(offset)
125
+ .order(order_by)
126
+ .to_sql
121
127
  end
122
128
  end
123
129
  end
@@ -14,10 +14,12 @@ module Resque
14
14
  # end
15
15
  module FilenameGen
16
16
 
17
+ DEFAULT_EXTENSION = 'txt'
18
+
17
19
  private
18
20
 
19
21
  def generate_filename(args, fextension)
20
- "#{ hash(self.class.to_s, *args) }.#{ fextension }"
22
+ "#{ hash(self.class.to_s, *args) }.#{ fextension || DEFAULT_EXTENSION }"
21
23
  end
22
24
 
23
25
  def hash(*args)
@@ -28,6 +28,13 @@ module Resque
28
28
  end
29
29
 
30
30
  def column(name, value, options = {})
31
+ if options[:skip_if].present?
32
+ if options[:skip_if].is_a?(Symbol)
33
+ return if @instance.send(options.delete(:skip_if))
34
+ elsif options[:skip_if].respond_to?(:call)
35
+ return if options.delete(:skip_if).call
36
+ end
37
+ end
31
38
  add_column_header(name) || add_column_cell(value, options)
32
39
  end
33
40
 
@@ -32,7 +32,7 @@ module Resque
32
32
  base.send :include, EventCallbacks # event callbacks and handlers
33
33
  base.send :include, EventTemplates # template events handling methods
34
34
  base.send :include, Encodings # encoding constants
35
- base.send :include, EnqueueToFix # encoding constants
35
+ base.send :include, EnqueueToFix # enqueue task to exact queue
36
36
  end
37
37
  end
38
38
  end
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
2
  module Resque
3
3
  module Reports
4
- VERSION = '0.3.5'
4
+ VERSION = '0.3.6'
5
5
  end
6
6
  end
7
7
 
@@ -18,12 +18,11 @@ Gem::Specification.new do |gem|
18
18
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
19
  gem.require_paths = ['lib']
20
20
 
21
- gem.add_dependency 'resque-integration', '>= 0.2.9'
21
+ gem.add_dependency 'resque-integration', '>= 0.4.4'
22
22
  gem.add_dependency 'activesupport' # избавиться от зависимости
23
23
 
24
- gem.add_development_dependency "bundler", "~> 1.3"
25
- gem.add_development_dependency "rake"
24
+ gem.add_development_dependency 'bundler', '~> 1.3'
25
+ gem.add_development_dependency 'rake'
26
26
  gem.add_development_dependency 'rspec', '>= 2.14.0'
27
- gem.add_development_dependency 'rspec-given', '~> 3.0'
28
27
  gem.add_development_dependency 'simplecov'
29
28
  end
@@ -2,8 +2,6 @@
2
2
  require 'spec_helper'
3
3
  require 'stringio'
4
4
 
5
- require 'resque-reports'
6
-
7
5
  class MyTypeReport < Resque::Reports::BaseReport
8
6
  extension :type
9
7
 
@@ -51,15 +49,15 @@ describe 'Resque::Reports::BaseReport successor' do
51
49
  let(:dummy) { Resque::Reports::Extensions::Dummy.new }
52
50
 
53
51
  describe '#extension' do
54
- before { File.stub(:exists? => true) }
52
+ before { allow(File).to receive(:exists?).and_return(true) }
55
53
 
56
- it { File.extname(my_report.filename).should eq '.type' }
54
+ it { expect(File.extname(my_report.filename)).to eq '.type' }
57
55
  end
58
56
 
59
57
  describe '#source' do
60
- before { my_report.stub(select_data: [dummy]) }
58
+ before { allow(my_report).to receive(:select_data).and_return([dummy]) }
61
59
 
62
- it { my_report.should_receive(:select_data) }
60
+ it { expect(my_report).to receive(:select_data) }
63
61
 
64
62
  after { my_report.build true }
65
63
  end
@@ -68,32 +66,32 @@ describe 'Resque::Reports::BaseReport successor' do
68
66
  subject { my_report.instance_variable_get(:@cache_file) }
69
67
  let(:tmpdir) { File.join(Dir.tmpdir, 'resque-reports') }
70
68
 
71
- it { subject.instance_variable_get(:@dir).should eq tmpdir }
69
+ it { expect(subject.instance_variable_get(:@dir)).to eq tmpdir }
72
70
  end
73
71
 
74
72
  describe '#create' do
75
- it { my_report.instance_variable_get(:@main_param).should eq 'test' }
73
+ it { expect(my_report.instance_variable_get(:@main_param)).to eq 'test' }
76
74
  end
77
75
 
78
76
  describe '#encoding' do
79
77
  subject { my_report.instance_variable_get(:@cache_file) }
80
78
  let(:utf_coding) { Resque::Reports::Extensions::Encodings::UTF8 }
81
79
 
82
- it { subject.instance_variable_get(:@coding).should eq utf_coding }
80
+ it { expect(subject.instance_variable_get(:@coding)).to eq utf_coding }
83
81
  end
84
82
 
85
83
  describe '#write' do
86
84
  subject { MyReport.new('#write test') }
87
85
 
88
86
  before do
89
- subject.stub(:data_each) { |&block| block.call(dummy) }
90
- subject.stub(build_table_row: ['row'])
91
- subject.stub(build_table_header: ['header'])
87
+ allow(subject).to receive(:data_each) { |&block| block.call(dummy) }
88
+ allow(subject).to receive(:build_table_row).and_return(['row'])
89
+ allow(subject).to receive(:build_table_header).and_return(['header'])
92
90
 
93
91
  subject.write(io)
94
92
  end
95
93
 
96
- it { io.string.should eq "header\r\nrow\r\n" }
94
+ it { expect(io.string).to eq "header\r\nrow\r\n" }
97
95
  end
98
96
 
99
97
  describe '#bg_build' do
@@ -102,13 +100,10 @@ describe 'Resque::Reports::BaseReport successor' do
102
100
  context 'when report is building twice' do
103
101
  subject { MyReport.new('#bg_build test') }
104
102
 
105
- before { job_class.stub(enqueue_to: 'job_id') }
103
+ before { allow(job_class).to receive(:enqueue_to).and_return('job_id') }
106
104
 
107
105
  it do
108
- job_class
109
- .should_receive(:enqueue_to).twice
110
- #.with(:my_type_reports, 'MyReport', '["#bg_build test",true]')
111
-
106
+ expect(job_class).to receive(:enqueue_to).twice
112
107
  end
113
108
 
114
109
  after do
@@ -119,44 +114,41 @@ describe 'Resque::Reports::BaseReport successor' do
119
114
  context 'when report is building' do
120
115
  subject { MyReport.new('#bg_build test') }
121
116
 
122
- before { job_class.stub(enqueue_to: 'job_id') }
117
+ before { allow(job_class).to receive(:enqueue_to).and_return('job_id') }
123
118
 
124
- it do
125
- job_class
126
- .should_receive(:enqueue_to)
127
- #.with(:my_type_reports, 'MyReport', '["#bg_build test",true]')
128
- end
119
+ it { expect(job_class).to receive(:enqueue_to) }
129
120
 
130
- after { subject.bg_build true }
121
+ after { subject.bg_build true }
131
122
  end
132
123
 
133
124
  context 'when report is not build yet' do
134
125
  subject { MyReport.new('#bg_build test') }
135
126
 
136
127
  before do
137
- job_class.stub(enqueued?: double('Meta', meta_id: 'enqueued_job_id'))
128
+ allow(job_class).to receive(:enqueued?).and_return(double('Meta', meta_id: 'enqueued_job_id'))
138
129
  end
139
130
 
140
- it { subject.bg_build(true).should eq 'enqueued_job_id' }
131
+ it { expect(subject.bg_build(true)).to eq 'enqueued_job_id' }
141
132
  end
142
133
  end
143
134
 
144
135
  describe '#build' do
145
- subject { MyReport.new('#build test') }
146
-
147
- it { subject.should_receive(:decorate_second).exactly(3).times }
136
+ context 'when report decorated' do
137
+ subject { MyReport.new('#build test') }
148
138
 
149
- after { subject.build true }
139
+ it { expect(subject).to receive(:decorate_second).exactly(3).times }
150
140
 
141
+ after { subject.build true }
142
+ end
151
143
  context 'when report was built' do
152
144
  subject { MyReport.new('was built test') }
153
145
 
154
146
  before { subject.build true }
155
147
 
156
- its(:exists?) { should be_true }
148
+ it { expect(subject).to be_exists }
157
149
  it do
158
- File.read(subject.filename)
159
- .should eq <<-REPORT.gsub(/^ {12}/, '')
150
+ expect(File.read(subject.filename))
151
+ .to eq <<-REPORT.gsub(/^ {12}/, '')
160
152
  First one|Second\r
161
153
  one|one - is second\r
162
154
  was built test|was built test - is second\r
@@ -168,7 +160,7 @@ describe 'Resque::Reports::BaseReport successor' do
168
160
  describe '#data_each' do
169
161
  subject { MyReport.new('#data_each test') }
170
162
 
171
- it { subject.should_receive(:data_each) }
163
+ it { expect(subject).to receive(:data_each) }
172
164
 
173
165
  after { subject.write(io) }
174
166
  end
@@ -176,7 +168,7 @@ describe 'Resque::Reports::BaseReport successor' do
176
168
  describe '#build_table_header' do
177
169
  subject { MyReport.new('#build_table_header test') }
178
170
 
179
- it { subject.should_receive(:build_table_header) }
171
+ it { expect(subject).to receive(:build_table_header) }
180
172
 
181
173
  after { subject.write(io) }
182
174
  end
@@ -184,7 +176,7 @@ describe 'Resque::Reports::BaseReport successor' do
184
176
  describe '#build_table_row' do
185
177
  subject { MyReport.new('#build_table_row test') }
186
178
 
187
- it { subject.should_receive(:build_table_row).twice }
179
+ it { expect(subject).to receive(:build_table_row).twice }
188
180
 
189
181
  after { subject.write(io) }
190
182
  end
@@ -57,7 +57,7 @@ describe 'Resque::Reports::CsvReport successor' do
57
57
  subject { MyCsvDefaultsReport.new }
58
58
 
59
59
  it 'sets csv_options defaults' do
60
- subject.options.should eq MyCsvReport::DEFAULT_CSV_OPTIONS
60
+ expect(subject.options).to eq MyCsvReport::DEFAULT_CSV_OPTIONS
61
61
  end
62
62
  end
63
63
 
@@ -69,7 +69,7 @@ describe 'Resque::Reports::CsvReport successor' do
69
69
  end
70
70
 
71
71
  it 'merges csv_options with defaults' do
72
- subject.options.should eq my_options
72
+ expect(subject.options).to eq my_options
73
73
  end
74
74
  end
75
75
  end
@@ -78,12 +78,12 @@ describe 'Resque::Reports::CsvReport successor' do
78
78
  context 'when report was built' do
79
79
  subject { MyCsvReport.new('was built test') }
80
80
 
81
- before { subject.build true }
81
+ after { subject.build true }
82
82
 
83
- its(:exists?) { should be_true }
83
+ it { expect(subject).to be_exists }
84
84
  it do
85
- File.read(subject.filename)
86
- .should eq <<-CSV.gsub(/^ {12}/, "")
85
+ expect(File.read(subject.filename))
86
+ .to eq <<-CSV.gsub(/^ {12}/, '')
87
87
  First one,Second,Third
88
88
  decorated: one,was built test - is second,3'rd row element is: 3
89
89
  CSV
@@ -32,10 +32,10 @@ describe Resque::Reports::ReportJob do
32
32
  end
33
33
 
34
34
  describe '.execute' do
35
- before { Reports::MyCsvReport.stub(new: my_report) }
35
+ before { allow(Reports::MyCsvReport).to receive(:new).and_return(my_report) }
36
36
 
37
37
  context 'when building report' do
38
- before { my_report.stub(build: nil) }
38
+ before { allow(my_report).to receive(:build).and_return(nil) }
39
39
 
40
40
  it do
41
41
  expect(Reports::MyCsvReport)
@@ -60,24 +60,24 @@ describe Resque::Reports::ReportJob do
60
60
 
61
61
  context 'when events are firing' do
62
62
  before do
63
- described_class.stub(get_meta: {})
64
- described_class.get_meta.stub(save: true)
63
+ allow(described_class).to receive(:get_meta).and_return({})
64
+ allow(described_class.get_meta).to receive(:save).and_return(true)
65
65
  end
66
66
 
67
67
  context 'when progress total is zero' do
68
68
  before do
69
- my_report.stub(select_data: [])
70
- my_report.stub(data_size: 0)
69
+ allow(my_report).to receive(:select_data).and_return([])
70
+ allow(my_report).to receive(:data_size).and_return(0)
71
71
  end
72
72
 
73
- it { described_class.should_not_receive(:at) }
73
+ it { expect(described_class).to_not receive(:at) }
74
74
 
75
75
  after { described_class.execute(*exec_params) }
76
76
  end
77
77
 
78
78
  context 'when works default handlers' do
79
79
  context 'when error occurs' do
80
- before { my_report.stub(:build_table_row) { fail 'Custom error' } }
80
+ before { allow(my_report).to receive(:build_table_row) { fail 'Custom error' } }
81
81
 
82
82
  it do
83
83
  expect { described_class.execute(*exec_params) }
@@ -86,7 +86,7 @@ describe Resque::Reports::ReportJob do
86
86
  end
87
87
 
88
88
  context 'when progress is changed' do
89
- it { described_class.should_receive(:at).with(2, 2, nil) }
89
+ it { expect(described_class).to receive(:at).with(2, 2, nil) }
90
90
 
91
91
  after { described_class.execute(*exec_params) }
92
92
  end
@@ -95,28 +95,21 @@ describe Resque::Reports::ReportJob do
95
95
  context 'when works custom handlers' do
96
96
  context 'when error occurs' do
97
97
  before do
98
- my_report.stub(:error_message) { |e| fail "Boom! #{e.message}" }
99
- my_report.stub(:build_table_row) { fail 'Custom error' }
98
+ allow(my_report).to receive(:error_message) { |e| fail "Boom! #{e.message}" }
99
+ allow(my_report).to receive(:build_table_row) { fail 'Custom error' }
100
100
  end
101
101
 
102
- it do
103
- expect { described_class.execute(*exec_params) }
104
- .to raise_error('Boom! Custom error')
105
- end
102
+ it { expect { described_class.execute(*exec_params) }.to raise_error('Boom! Custom error') }
106
103
  end
107
104
 
108
105
  context 'when progress is changed' do
109
106
  before do
110
- my_report.stub(:progress_message) do |progress, total|
107
+ allow(my_report).to receive(:progress_message) do |progress, total|
111
108
  "my progress: #{progress} / #{total}"
112
109
  end
113
110
  end
114
111
 
115
- it do
116
- described_class
117
- .should_receive(:at)
118
- .with(2, 2, 'my progress: 2 / 2')
119
- end
112
+ it { expect(described_class).to receive(:at).with(2, 2, 'my progress: 2 / 2') }
120
113
 
121
114
  after { described_class.execute(*exec_params) }
122
115
  end
@@ -125,14 +118,11 @@ describe Resque::Reports::ReportJob do
125
118
  context 'when task is performed by resque' do
126
119
  context 'when error occurs' do
127
120
  before do
128
- my_report.stub(:error_message) { |e| fail "Boom! #{e.message}" }
129
- my_report.stub(:build_table_row) { fail 'Custom error' }
121
+ allow(my_report).to receive(:error_message) { |e| fail "Boom! #{e.message}" }
122
+ allow(my_report).to receive(:build_table_row) { fail 'Custom error' }
130
123
  end
131
124
 
132
- it do
133
- expect { described_class.execute(*exec_params) }
134
- .to raise_error('Boom! Custom error')
135
- end
125
+ it { expect { described_class.execute(*exec_params) }.to raise_error('Boom! Custom error') }
136
126
  end
137
127
  end
138
128
  end
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,5 @@ SimpleCov.start
5
5
  require 'rubygems'
6
6
  require 'bundler/setup'
7
7
  require 'rspec'
8
- require 'rspec/given'
9
8
 
10
9
  require 'resque-reports'
metadata CHANGED
@@ -1,111 +1,97 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resque-reports
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sergey D.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-30 00:00:00.000000000 Z
11
+ date: 2014-11-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: resque-integration
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ! '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.9
19
+ version: 0.4.4
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ! '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.2.9
26
+ version: 0.4.4
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '1.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ! '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ! '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rspec
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ! '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: 2.14.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ! '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 2.14.0
83
- - !ruby/object:Gem::Dependency
84
- name: rspec-given
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ~>
88
- - !ruby/object:Gem::Version
89
- version: '3.0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ~>
95
- - !ruby/object:Gem::Version
96
- version: '3.0'
97
83
  - !ruby/object:Gem::Dependency
98
84
  name: simplecov
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - ! '>='
87
+ - - ">="
102
88
  - !ruby/object:Gem::Version
103
89
  version: '0'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - ! '>='
94
+ - - ">="
109
95
  - !ruby/object:Gem::Version
110
96
  version: '0'
111
97
  description: Make your custom reports to CSV in background using Resque with simple
@@ -116,9 +102,9 @@ executables: []
116
102
  extensions: []
117
103
  extra_rdoc_files: []
118
104
  files:
119
- - .gitignore
120
- - .rspec
121
- - .rubocop.yml
105
+ - ".gitignore"
106
+ - ".rspec"
107
+ - ".rubocop.yml"
122
108
  - Gemfile
123
109
  - MIT-LICENSE
124
110
  - README
@@ -155,12 +141,12 @@ require_paths:
155
141
  - lib
156
142
  required_ruby_version: !ruby/object:Gem::Requirement
157
143
  requirements:
158
- - - ! '>='
144
+ - - ">="
159
145
  - !ruby/object:Gem::Version
160
146
  version: '0'
161
147
  required_rubygems_version: !ruby/object:Gem::Requirement
162
148
  requirements:
163
- - - ! '>='
149
+ - - ">="
164
150
  - !ruby/object:Gem::Version
165
151
  version: '0'
166
152
  requirements: []