rocketjob 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c742a1c093d122fbb2d6d9b194607d1ebd6743f3
4
- data.tar.gz: 2998a334bf98a4624ac3c42b69c70c1a4a4dcaf8
3
+ metadata.gz: 201f922d37f2533e56109c053e3c9f4bdef30108
4
+ data.tar.gz: 00598e8fb3039d7ce629f629bf270d3cc06f2e87
5
5
  SHA512:
6
- metadata.gz: b032a72a38db2aeb1f121cd65e5835fce438d77c1f6248560c40086fe4fb47f69815c83b8ac491188819ad0b4fea2a93e661015d7e38e0ccb1474e9b3e6c9505
7
- data.tar.gz: f152e0cbd1af97f02674a5b47e8f9854f7cfac1c5fc509489b5ab30cd3c464ba11fc6ba41809687720a2caa18fd8dc2b7eaebc5a33fac2c6df7f411777089960
6
+ metadata.gz: 447f63cf687c4e7ac10189aff59730874ea25f3e57b7d6ca301fd4a34178e91d68d4428f5be095c2a6a4a5426d603262c3d82c78e9f3988a9ed35d76bf75bddf
7
+ data.tar.gz: e6a54a1b72cb2c7192894140eea4e49e42dc29049a85a77338de773e539c23a5e1ed09a5691a0a5c238a881e99398cb07b99eddf5abdda8e044971cf433766f3
@@ -213,30 +213,38 @@ module RocketJob
213
213
  @@default_archive_directory = '_archive'.freeze
214
214
 
215
215
  # Returns [Pathname] the archive_directory if set, otherwise the default_archive_directory
216
- def archive_pathname
217
- Pathname.new(archive_directory || self.class.default_archive_directory)
216
+ # Creates the archive directory if one is set
217
+ def archive_pathname(file_pathname)
218
+ if archive_directory
219
+ path = Pathname.new(archive_directory)
220
+ path.mkpath unless path.exist?
221
+ path.realpath
222
+ else
223
+ file_pathname.dirname.join(self.class.default_archive_directory).realdirpath
224
+ end
218
225
  end
219
226
 
220
227
  # Passes each filename [Pathname] found that matches the pattern into the supplied block
221
228
  def each(&block)
222
229
  logger.tagged("DirmonEntry:#{id}") do
223
- Pathname.glob(pattern).each do |pathname|
230
+ # Case insensitive filename matching
231
+ Pathname.glob(pattern, File::FNM_CASEFOLD).each do |pathname|
224
232
  next if pathname.directory?
225
233
  pathname = pathname.realpath
226
234
  file_name = pathname.to_s
227
235
 
228
236
  # Skip archive directories
229
- next if file_name.start_with?(archive_pathname.realpath.to_s)
237
+ next if file_name.include?(self.class.default_archive_directory)
230
238
 
231
239
  # Security check?
232
- if (@@whitelist_paths.size > 0) && @@whitelist_paths.none? { |whitepath| file_name.start_with?(whitepath) }
233
- logger.warn "Ignoring file: #{file_name} since it is not in any of the whitelisted paths: #{whitelist_paths.join(', ')}"
240
+ if (whitelist_paths.size > 0) && whitelist_paths.none? { |whitepath| file_name.start_with?(whitepath) }
241
+ logger.error "Skipping file: #{file_name} since it is not in any of the whitelisted paths: #{whitelist_paths.join(', ')}"
234
242
  next
235
243
  end
236
244
 
237
245
  # File must be writable so it can be removed after processing
238
246
  unless pathname.writable?
239
- logger.warn "Ignoring file: #{file_name} since it is not writable by the current user. Must be able to delete/move the file after queueing the job"
247
+ logger.error "Skipping file: #{file_name} since it is not writable by the current user. Must be able to delete/move the file after queueing the job"
240
248
  next
241
249
  end
242
250
  block.call(pathname)
@@ -283,6 +291,11 @@ module RocketJob
283
291
 
284
292
  protected
285
293
 
294
+ # Instance method to return whitelist paths
295
+ def whitelist_paths
296
+ @@whitelist_paths
297
+ end
298
+
286
299
  # Upload the file to the job
287
300
  def upload_file(job, pathname)
288
301
  if job.respond_to?(:file_store_upload)
@@ -316,7 +329,7 @@ module RocketJob
316
329
  # Note:
317
330
  # - Works across partitions when the file and the archive are on different partitions
318
331
  def archive_file(job, pathname)
319
- target_path = archive_pathname
332
+ target_path = archive_pathname(pathname)
320
333
  target_path.mkpath
321
334
  target_file_name = target_path.join("#{job.id}_#{pathname.basename}")
322
335
  # In case the file is being moved across partitions
@@ -1,4 +1,4 @@
1
1
  # encoding: UTF-8
2
2
  module RocketJob #:nodoc
3
- VERSION = '1.2.0'
3
+ VERSION = '1.2.1'
4
4
  end
@@ -63,7 +63,7 @@ class DirmonEntryTest < Minitest::Test
63
63
 
64
64
  describe '#fail_with_exception!' do
65
65
  before do
66
- @dirmon_entry = RocketJob::DirmonEntry.new(job_class_name: 'Jobs::TestJob', pattern: '/abc/**', arguments: [1])
66
+ @dirmon_entry = RocketJob::DirmonEntry.new(job_class_name: 'Jobs::TestJob', pattern: 'test/files/**', arguments: [1])
67
67
  @dirmon_entry.enable!
68
68
  end
69
69
  after do
@@ -111,7 +111,7 @@ class DirmonEntryTest < Minitest::Test
111
111
 
112
112
  describe 'job_class_name' do
113
113
  it 'ensure presence' do
114
- assert entry = RocketJob::DirmonEntry.new(pattern: '/abc/**')
114
+ assert entry = RocketJob::DirmonEntry.new(pattern: 'test/files/**')
115
115
  assert_equal false, entry.valid?
116
116
  assert_equal ["can't be blank", 'job_class_name must be defined and must be derived from RocketJob::Job'], entry.errors[:job_class_name], entry.errors.inspect
117
117
  end
@@ -121,7 +121,7 @@ class DirmonEntryTest < Minitest::Test
121
121
  it 'allow no arguments' do
122
122
  assert entry = RocketJob::DirmonEntry.new(
123
123
  job_class_name: 'Jobs::TestJob',
124
- pattern: '/abc/**',
124
+ pattern: 'test/files/**',
125
125
  perform_method: :result
126
126
  )
127
127
  assert_equal true, entry.valid?, entry.errors.inspect
@@ -131,7 +131,7 @@ class DirmonEntryTest < Minitest::Test
131
131
  it 'ensure correct number of arguments' do
132
132
  assert entry = RocketJob::DirmonEntry.new(
133
133
  job_class_name: 'Jobs::TestJob',
134
- pattern: '/abc/**'
134
+ pattern: 'test/files/**'
135
135
  )
136
136
  assert_equal false, entry.valid?
137
137
  assert_equal ['There must be 1 argument(s)'], entry.errors[:arguments], entry.errors.inspect
@@ -140,7 +140,7 @@ class DirmonEntryTest < Minitest::Test
140
140
  it 'return false if the job name is bad' do
141
141
  assert entry = RocketJob::DirmonEntry.new(
142
142
  job_class_name: 'Jobs::Tests::Names::Things',
143
- pattern: '/abc/**'
143
+ pattern: 'test/files/**'
144
144
  )
145
145
  assert_equal false, entry.valid?
146
146
  assert_equal [], entry.errors[:arguments], entry.errors.inspect
@@ -150,7 +150,7 @@ class DirmonEntryTest < Minitest::Test
150
150
  it 'arguments with perform_method' do
151
151
  assert entry = RocketJob::DirmonEntry.new(
152
152
  job_class_name: 'Jobs::TestJob',
153
- pattern: '/abc/**',
153
+ pattern: 'test/files/**',
154
154
  perform_method: :sum
155
155
  )
156
156
  assert_equal false, entry.valid?
@@ -160,7 +160,7 @@ class DirmonEntryTest < Minitest::Test
160
160
  it 'valid' do
161
161
  assert entry = RocketJob::DirmonEntry.new(
162
162
  job_class_name: 'Jobs::TestJob',
163
- pattern: '/abc/**',
163
+ pattern: 'test/files/**',
164
164
  arguments: [1]
165
165
  )
166
166
  assert entry.valid?, entry.errors.inspect
@@ -169,7 +169,7 @@ class DirmonEntryTest < Minitest::Test
169
169
  it 'valid with perform_method' do
170
170
  assert entry = RocketJob::DirmonEntry.new(
171
171
  job_class_name: 'Jobs::TestJob',
172
- pattern: '/abc/**',
172
+ pattern: 'test/files/**',
173
173
  perform_method: :sum,
174
174
  arguments: [1, 2]
175
175
  )
@@ -180,20 +180,23 @@ class DirmonEntryTest < Minitest::Test
180
180
  describe 'with valid entry' do
181
181
  before do
182
182
  @archive_directory = '/tmp/archive_directory'
183
- @entry = RocketJob::DirmonEntry.new(
184
- pattern: 'abc/*',
183
+ @archive_path = Pathname.new(@archive_directory)
184
+ @archive_path.mkpath
185
+ @archive_path = @archive_path.realdirpath
186
+ @entry = RocketJob::DirmonEntry.new(
187
+ pattern: 'test/files/**/*',
185
188
  job_class_name: 'Jobs::TestJob',
186
189
  arguments: [{input: 'yes'}],
187
190
  properties: {priority: 23, perform_method: :event},
188
191
  archive_directory: @archive_directory
189
192
  )
190
- @job = Jobs::TestJob.new
191
- @file = Tempfile.new('archive')
192
- @file_name = @file.path
193
- @pathname = Pathname.new(@file_name)
193
+ @job = Jobs::TestJob.new
194
+ @file = Tempfile.new('archive')
195
+ @file_name = @file.path
196
+ @pathname = Pathname.new(@file_name)
194
197
  File.open(@file_name, 'w') { |file| file.write('Hello World') }
195
198
  assert File.exists?(@file_name)
196
- @archive_file_name = File.join(@archive_directory, "#{@job.id}_#{File.basename(@file_name)}")
199
+ @archive_real_name = @archive_path.join("#{@job.id}_#{File.basename(@file_name)}").to_s
197
200
  end
198
201
 
199
202
  after do
@@ -202,26 +205,26 @@ class DirmonEntryTest < Minitest::Test
202
205
 
203
206
  describe '#archive_pathname' do
204
207
  it 'with archive directory' do
205
- assert_equal @archive_directory.to_s, @entry.archive_pathname.to_s
208
+ assert_equal File.dirname(@archive_real_name), @entry.archive_pathname(@pathname).to_s
206
209
  end
207
210
 
208
211
  it 'without archive directory' do
209
212
  @entry.archive_directory = nil
210
- assert_equal '_archive', @entry.archive_pathname.to_s
213
+ assert @entry.archive_pathname(@pathname).to_s.end_with?('_archive')
211
214
  end
212
215
  end
213
216
 
214
217
  describe '#archive_file' do
215
218
  it 'archive file' do
216
- assert_equal @archive_file_name, @entry.send(:archive_file, @job, Pathname.new(@file_name))
217
- assert File.exists?(@archive_file_name), @archive_file_name
219
+ assert_equal @archive_real_name, @entry.send(:archive_file, @job, Pathname.new(@file_name))
220
+ assert File.exists?(@archive_real_name)
218
221
  end
219
222
  end
220
223
 
221
224
  describe '#upload_default' do
222
225
  it 'upload' do
223
226
  @entry.send(:upload_default, @job, @pathname)
224
- assert_equal File.absolute_path(@archive_file_name), @job.arguments.first[:full_file_name], @job.arguments
227
+ assert_equal @archive_real_name, @job.arguments.first[:full_file_name], @job.arguments
225
228
  end
226
229
  end
227
230
 
@@ -248,10 +251,67 @@ class DirmonEntryTest < Minitest::Test
248
251
  @entry.arguments = [{}]
249
252
  @entry.perform_method = :event
250
253
  job = @entry.later(@pathname)
251
- assert_equal File.join(@archive_directory, "#{job.id}_#{File.basename(@file_name)}"), job.arguments.first[:full_file_name]
254
+ assert_equal Pathname.new(@archive_directory).join("#{job.id}_#{File.basename(@file_name)}").realdirpath.to_s, job.arguments.first[:full_file_name]
252
255
  assert job.queued?
253
256
  end
254
257
  end
258
+
259
+ describe '#each' do
260
+ it 'without archive path' do
261
+ @entry.archive_directory = nil
262
+ files = []
263
+ @entry.each do |file_name|
264
+ files << file_name
265
+ end
266
+ assert_equal nil, @entry.archive_directory
267
+ assert_equal 1, files.count
268
+ assert_equal Pathname.new('test/files/text.txt').realpath, files.first
269
+ end
270
+
271
+ it 'with archive path' do
272
+ files = []
273
+ @entry.each do |file_name|
274
+ files << file_name
275
+ end
276
+ assert_equal 1, files.count
277
+ assert_equal Pathname.new('test/files/text.txt').realpath, files.first
278
+ end
279
+
280
+ it 'with case-insensitive pattern' do
281
+ @entry.pattern = 'test/files/**/*.TxT'
282
+ files = []
283
+ @entry.each do |file_name|
284
+ files << file_name
285
+ end
286
+ assert_equal 1, files.count
287
+ assert_equal Pathname.new('test/files/text.txt').realpath, files.first
288
+ end
289
+
290
+ it 'reads paths inside of the whitelist' do
291
+ @entry.archive_directory = nil
292
+ files = []
293
+ @entry.stub(:whitelist_paths, [Pathname.new('test/files').realpath.to_s]) do
294
+ @entry.each do |file_name|
295
+ files << file_name
296
+ end
297
+ end
298
+ assert_equal nil, @entry.archive_directory
299
+ assert_equal 1, files.count
300
+ assert_equal Pathname.new('test/files/text.txt').realpath, files.first
301
+ end
302
+
303
+ it 'skips paths outside of the whitelist' do
304
+ @entry.archive_directory = nil
305
+ files = []
306
+ @entry.stub(:whitelist_paths, [Pathname.new('test/config').realpath.to_s]) do
307
+ @entry.each do |file_name|
308
+ files << file_name
309
+ end
310
+ end
311
+ assert_equal nil, @entry.archive_directory
312
+ assert_equal 0, files.count
313
+ end
314
+ end
255
315
  end
256
316
 
257
317
  end
@@ -118,11 +118,12 @@ class DirmonJobTest < Minitest::Test
118
118
  it 'skip files in archive directory' do
119
119
  @entry.archive_directory = nil
120
120
  @entry.pattern = "#{@directory}/abc/**/*"
121
+ file_pathname = Pathname.new("#{@directory}/abc/file1")
121
122
 
122
- create_file("#{@directory}/abc/file1", 5)
123
+ create_file(file_pathname.to_s, 5)
123
124
  create_file("#{@directory}/abc/file2", 10)
124
- FileUtils.makedirs("#{@directory}/abc/#{@entry.archive_pathname}")
125
- create_file("#{@directory}/abc/#{@entry.archive_pathname}/file3", 10)
125
+ FileUtils.makedirs(@entry.archive_pathname(file_pathname))
126
+ create_file("#{@entry.archive_pathname(file_pathname)}/file3", 10)
126
127
 
127
128
  result = @dirmon_job.send(:check_directories, {})
128
129
 
@@ -0,0 +1,3 @@
1
+ Hello World
2
+ Line2
3
+ Line3
@@ -0,0 +1,3 @@
1
+ Hello World
2
+ Line2
3
+ Line3
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rocketjob
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-10 00:00:00.000000000 Z
11
+ date: 2015-09-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aasm
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '4.1'
19
+ version: 4.2.0
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: '4.1'
26
+ version: 4.2.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: semantic_logger
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -135,6 +135,8 @@ files:
135
135
  - test/config/mongo.yml
136
136
  - test/dirmon_entry_test.rb
137
137
  - test/dirmon_job_test.rb
138
+ - test/files/_archive/archived.txt
139
+ - test/files/text.txt
138
140
  - test/job_test.rb
139
141
  - test/job_worker_test.rb
140
142
  - test/jobs/test_job.rb
@@ -168,6 +170,8 @@ test_files:
168
170
  - test/config/mongo.yml
169
171
  - test/dirmon_entry_test.rb
170
172
  - test/dirmon_job_test.rb
173
+ - test/files/_archive/archived.txt
174
+ - test/files/text.txt
171
175
  - test/job_test.rb
172
176
  - test/job_worker_test.rb
173
177
  - test/jobs/test_job.rb