rocketjob 1.2.0 → 1.2.1

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: 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