vtools 0.0.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.
- data/INSTALL +0 -0
- data/LICENSE +20 -0
- data/README.md +131 -0
- data/Rakefile +29 -0
- data/bin/vtools +22 -0
- data/doc/CONFIG.md +36 -0
- data/doc/HOOKS.md +37 -0
- data/doc/LIB_EXAMPLE.md +109 -0
- data/extconf.rb +7 -0
- data/lib/vtools.rb +79 -0
- data/lib/vtools/config.rb +91 -0
- data/lib/vtools/convert_options.rb +155 -0
- data/lib/vtools/converter.rb +98 -0
- data/lib/vtools/errors.rb +21 -0
- data/lib/vtools/handler.rb +43 -0
- data/lib/vtools/harvester.rb +71 -0
- data/lib/vtools/job.rb +48 -0
- data/lib/vtools/options.rb +101 -0
- data/lib/vtools/shared_methods.rb +131 -0
- data/lib/vtools/storage.rb +67 -0
- data/lib/vtools/thumbnailer.rb +93 -0
- data/lib/vtools/thumbs_options.rb +80 -0
- data/lib/vtools/version.rb +6 -0
- data/lib/vtools/version.rb~ +4 -0
- data/lib/vtools/video.rb +158 -0
- data/setup.rb +1585 -0
- data/spec/config_spec.rb +142 -0
- data/spec/convert_options_spec.rb +284 -0
- data/spec/converter_spec.rb +167 -0
- data/spec/errors_spec.rb +39 -0
- data/spec/fixtures/outputs/file_with_iso-8859-1.txt +35 -0
- data/spec/fixtures/outputs/file_with_no_audio.txt +18 -0
- data/spec/fixtures/outputs/file_with_non_supported_audio.txt +29 -0
- data/spec/fixtures/outputs/file_with_start_value.txt +19 -0
- data/spec/fixtures/outputs/file_with_surround_sound.txt +19 -0
- data/spec/handler_spec.rb +81 -0
- data/spec/harvester_spec.rb +189 -0
- data/spec/job_spec.rb +130 -0
- data/spec/options_spec.rb +52 -0
- data/spec/shared_methods_spec.rb +351 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/storage_spec.rb +106 -0
- data/spec/thumbnailer_spec.rb +178 -0
- data/spec/thumbs_options_spec.rb +159 -0
- data/spec/video_spec.rb +274 -0
- data/vtools.gemspec +29 -0
- metadata +177 -0
data/spec/errors_spec.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "errors"
|
3
|
+
|
4
|
+
#ConfigError
|
5
|
+
#FileError
|
6
|
+
#FormatError
|
7
|
+
#ProcessError
|
8
|
+
|
9
|
+
describe VTools do
|
10
|
+
|
11
|
+
# specs
|
12
|
+
context "#ConfigError" do
|
13
|
+
|
14
|
+
it "valid exception tree" do
|
15
|
+
expect { raise VTools::ConfigError }.to raise_error ArgumentError
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "#FileError" do
|
20
|
+
|
21
|
+
it "valid exception tree" do
|
22
|
+
expect { raise VTools::FileError }.to raise_error Errno::ENOENT
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "#FormatError" do
|
27
|
+
|
28
|
+
it "valid exception tree" do
|
29
|
+
expect { raise VTools::FormatError }.to raise_error IOError
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "#ProcessError" do
|
34
|
+
|
35
|
+
it "valid exception tree" do
|
36
|
+
expect { raise VTools::ProcessError }.to raise_error IOError
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers
|
2
|
+
built on Nov 18 2010 13:51:50 with gcc 4.2.1 (Apple Inc. build 5664)
|
3
|
+
configuration: --disable-debug --prefix=/usr/local/Cellar/ffmpeg/0.6.1 --enable-shared --enable-pthreads --enable-nonfree --enable-gpl --disable-indev=jack --enable-libx264 --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid
|
4
|
+
libavutil 50.15. 1 / 50.15. 1
|
5
|
+
libavcodec 52.72. 2 / 52.72. 2
|
6
|
+
libavformat 52.64. 2 / 52.64. 2
|
7
|
+
libavdevice 52. 2. 0 / 52. 2. 0
|
8
|
+
libswscale 0.11. 0 / 0.11. 0
|
9
|
+
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10180b000]multiple edit list entries, a/v desync might occur, patch welcome
|
10
|
+
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10180b000]max_analyze_duration reached
|
11
|
+
|
12
|
+
Seems stream 0 codec frame rate differs from container frame rate: 5000.00 (5000/1) -> 25.00 (25/1)
|
13
|
+
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'spec/fixtures/movies/rails3upgrade.mov':
|
14
|
+
Metadata:
|
15
|
+
major_brand : qt
|
16
|
+
minor_version : 537199360
|
17
|
+
compatible_brands: qt
|
18
|
+
Duration: 00:24:42.61, start: 0.000000, bitrate: 546 kb/s
|
19
|
+
Chapter #0.0: start 142.240000, end 532.679600
|
20
|
+
Metadata:
|
21
|
+
title : ��R
|
22
|
+
Chapter #0.1: start 532.679600, end 788.119600
|
23
|
+
Metadata:
|
24
|
+
title : ��r
|
25
|
+
Chapter #0.2: start 788.119600, end 1160.159600
|
26
|
+
Metadata:
|
27
|
+
title : ��b
|
28
|
+
Chapter #0.3: start 1160.159600, end 1340.359200
|
29
|
+
Metadata:
|
30
|
+
title : ��A
|
31
|
+
Stream #0.0(eng): Video: h264, yuv420p, 1000x600, 480 kb/s, 25 fps, 25 tbr, 2500 tbn, 5k tbc
|
32
|
+
Stream #0.1(eng): Data: tmcd / 0x64636D74
|
33
|
+
Stream #0.2(eng): Audio: aac, 44100 Hz, mono, s16, 64 kb/s
|
34
|
+
Stream #0.3(eng): Subtitle: text / 0x74786574, 0 kb/s
|
35
|
+
At least one output file must be specified
|
@@ -0,0 +1,18 @@
|
|
1
|
+
FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers
|
2
|
+
built on Nov 18 2010 13:51:50 with gcc 4.2.1 (Apple Inc. build 5664)
|
3
|
+
configuration: --disable-debug --prefix=/usr/local/Cellar/ffmpeg/0.6.1 --enable-shared --enable-pthreads --enable-nonfree --enable-gpl --disable-indev=jack --enable-libx264 --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid
|
4
|
+
libavutil 50.15. 1 / 50.15. 1
|
5
|
+
libavcodec 52.72. 2 / 52.72. 2
|
6
|
+
libavformat 52.64. 2 / 52.64. 2
|
7
|
+
libavdevice 52. 2. 0 / 52. 2. 0
|
8
|
+
libswscale 0.11. 0 / 0.11. 0
|
9
|
+
|
10
|
+
Seems stream 0 codec frame rate differs from container frame rate: 2500.00 (2500/1) -> 25.00 (25/1)
|
11
|
+
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'broken.mov':
|
12
|
+
Metadata:
|
13
|
+
major_brand : qt
|
14
|
+
minor_version : 537199360
|
15
|
+
compatible_brands: qt
|
16
|
+
Duration: 00:00:23.12, start: 0.000000, bitrate: 28033 kb/s
|
17
|
+
Stream #0.0(eng): Video: Apple ProRes 422, 410x620, 28029 kb/s, 25 fps, 25 tbr, 2500 tbn, 2500 tbc
|
18
|
+
At least one output file must be specified
|
@@ -0,0 +1,29 @@
|
|
1
|
+
ffmpeg version 0.8, Copyright (c) 2000-2011 the FFmpeg developers
|
2
|
+
built on Jul 20 2011 10:41:26 with gcc 4.2.1 (Apple Inc. build 5664)
|
3
|
+
configuration: --prefix=/usr/local/Cellar/ffmpeg/0.8 --enable-gpl --enable-version3 --enable-nonfree --enable-hardcoded-tables --enable-libx264 --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid
|
4
|
+
libavutil 51. 9. 1 / 51. 9. 1
|
5
|
+
libavcodec 53. 7. 0 / 53. 7. 0
|
6
|
+
libavformat 53. 4. 0 / 53. 4. 0
|
7
|
+
libavdevice 53. 1. 1 / 53. 1. 1
|
8
|
+
libavfilter 2. 23. 0 / 2. 23. 0
|
9
|
+
libswscale 2. 0. 0 / 2. 0. 0
|
10
|
+
libpostproc 51. 2. 0 / 51. 2. 0
|
11
|
+
[aac @ 0x101820400] Audio object type 23 is not supported.
|
12
|
+
Last message repeated 471 times
|
13
|
+
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x101807c00] max_analyze_duration 5000000 reached at 5002667
|
14
|
+
|
15
|
+
Seems stream 1 codec frame rate differs from container frame rate: 96000.00 (96000/1) -> 48000.00 (96000/2)
|
16
|
+
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'no_audio_channel_info.mov':
|
17
|
+
Metadata:
|
18
|
+
major_brand : qt
|
19
|
+
minor_version : 537199360
|
20
|
+
compatible_brands: qt
|
21
|
+
creation_time : 2009-05-26 14:36:22
|
22
|
+
Duration: 00:13:15.81, start: 0.000000, bitrate: 4825 kb/s
|
23
|
+
Stream #0.0(eng): Audio: aac, stereo, 182 kb/s
|
24
|
+
Metadata:
|
25
|
+
creation_time : 2009-05-26 14:36:22
|
26
|
+
Stream #0.1(eng): Video: h264 (Main), yuv420p, 768x434, 4636 kb/s, 25 fps, 48k tbr, 48k tbn, 96k tbc
|
27
|
+
Metadata:
|
28
|
+
creation_time : 2009-05-26 14:36:22
|
29
|
+
At least one output file must be specified
|
@@ -0,0 +1,19 @@
|
|
1
|
+
FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers
|
2
|
+
built on Nov 18 2010 13:51:50 with gcc 4.2.1 (Apple Inc. build 5664)
|
3
|
+
configuration: --disable-debug --prefix=/usr/local/Cellar/ffmpeg/0.6.1 --enable-shared --enable-pthreads --enable-nonfree --enable-gpl --disable-indev=jack --enable-libx264 --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid
|
4
|
+
libavutil 50.15. 1 / 50.15. 1
|
5
|
+
libavcodec 52.72. 2 / 52.72. 2
|
6
|
+
libavformat 52.64. 2 / 52.64. 2
|
7
|
+
libavdevice 52. 2. 0 / 52. 2. 0
|
8
|
+
libswscale 0.11. 0 / 0.11. 0
|
9
|
+
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x10180b000]max_analyze_duration reached
|
10
|
+
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/druiden/Movies/clips/4cebb32fb35ea857d9000039_4cfe13671ee3ba063400002c.f4v':
|
11
|
+
Metadata:
|
12
|
+
major_brand : f4v
|
13
|
+
minor_version : 0
|
14
|
+
compatible_brands: isommp42m4v
|
15
|
+
Duration: 00:00:28.11, start: 13.038000, bitrate: 411 kb/s
|
16
|
+
Stream #0.0(eng): Video: h264, yuv420p, 320x214 [PAR 1:1 DAR 160:107], 25 tbr, 1k tbn, 50 tbc
|
17
|
+
Stream #0.1(eng): Audio: mp3, 44100 Hz, 2 channels, s16, 96 kb/s
|
18
|
+
Stream #0.2(eng): Data: amf0 / 0x30666D61
|
19
|
+
At least one output file must be specified
|
@@ -0,0 +1,19 @@
|
|
1
|
+
FFmpeg version 0.6.1, Copyright (c) 2000-2010 the FFmpeg developers
|
2
|
+
built on Nov 18 2010 13:51:50 with gcc 4.2.1 (Apple Inc. build 5664)
|
3
|
+
configuration: --disable-debug --prefix=/usr/local/Cellar/ffmpeg/0.6.1 --enable-shared --enable-pthreads --enable-nonfree --enable-gpl --disable-indev=jack --enable-libx264 --enable-libfaac --enable-libfaad --enable-libmp3lame --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libxvid
|
4
|
+
libavutil 50.15. 1 / 50.15. 1
|
5
|
+
libavcodec 52.72. 2 / 52.72. 2
|
6
|
+
libavformat 52.64. 2 / 52.64. 2
|
7
|
+
libavdevice 52. 2. 0 / 52. 2. 0
|
8
|
+
libswscale 0.11. 0 / 0.11. 0
|
9
|
+
|
10
|
+
Seems stream 0 codec frame rate differs from container frame rate: 1200.00 (1200/1) -> 25.00 (25/1)
|
11
|
+
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'bigbucksbunny_trailer_720p.mov':
|
12
|
+
Metadata:
|
13
|
+
major_brand : qt
|
14
|
+
minor_version : 537199360
|
15
|
+
compatible_brands: qt
|
16
|
+
Duration: 00:00:33.00, start: 0.000000, bitrate: 4317 kb/s
|
17
|
+
Stream #0.0(eng): Video: h264, yuv420p, 1280x720, 3945 kb/s, 25 fps, 25 tbr, 600 tbn, 1200 tbc
|
18
|
+
Stream #0.1(eng): Audio: aac, 48000 Hz, 5.1, s16, 428 kb/s
|
19
|
+
At least one output file must be specified
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "handler"
|
3
|
+
|
4
|
+
describe VTools::Handler do
|
5
|
+
|
6
|
+
# hooks
|
7
|
+
before do
|
8
|
+
@handler = VTools::Handler.dup
|
9
|
+
@handler.instance_variable_set(:@callbacks, {})
|
10
|
+
end
|
11
|
+
|
12
|
+
# specs
|
13
|
+
context "#set" do
|
14
|
+
|
15
|
+
it "sets valid action" do
|
16
|
+
@handler.instance_variable_get(:@callbacks).should == {}
|
17
|
+
|
18
|
+
block = lambda { |*args| nil }
|
19
|
+
other_block = lambda { |*args| false }
|
20
|
+
|
21
|
+
@handler.set :action_one, &block
|
22
|
+
@handler.set "action_two", &other_block
|
23
|
+
|
24
|
+
@handler.instance_variable_get(:@callbacks).should == {
|
25
|
+
:action_one => [ block ], :action_two => [ other_block ]
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
it "skips set when no block given" do
|
30
|
+
@handler.set :action_one
|
31
|
+
@handler.set :action_one
|
32
|
+
@handler.set :action_two
|
33
|
+
|
34
|
+
@handler.instance_variable_get(:@callbacks).should == {:action_one => [], :action_two => []}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "#exec" do
|
39
|
+
|
40
|
+
it "executes valid callbacks" do
|
41
|
+
# prepare data
|
42
|
+
block_one = lambda { |*args| nil }
|
43
|
+
block_two = lambda { |*args| nil }
|
44
|
+
block_three = lambda { |*args| nil }
|
45
|
+
@handler.instance_variable_set( :@callbacks, {:action_one => [block_one], :action_two => [block_two, block_three]} )
|
46
|
+
|
47
|
+
block_one.should_receive(:call).with("one").once
|
48
|
+
block_two.should_receive(:call).with("two", "and", "three").once
|
49
|
+
block_three.should_receive(:call).with("two", "and", "three").once
|
50
|
+
|
51
|
+
@handler.exec :action_one, "one"
|
52
|
+
@handler.exec :action_two, "two", "and", "three"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "skips empty or invalid callbacks" do
|
56
|
+
@handler.instance_variable_set(:@callbacks, {:action_one => [], :action_two => "test"} )
|
57
|
+
|
58
|
+
callbacks = @handler.instance_variable_get(:@callbacks)
|
59
|
+
callbacks[:action_one].should_receive :each
|
60
|
+
callbacks[:action_two].should_not_receive :each
|
61
|
+
|
62
|
+
# nil can't be called so we just must ensure, that error is not raised
|
63
|
+
expect { @handler.exec :action_one, "one" }.to_not raise_error
|
64
|
+
expect { @handler.exec :action_two, "two", "and", "three" }.to_not raise_error
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
context "#collection" do
|
69
|
+
|
70
|
+
it "executes valid scope" do
|
71
|
+
VTools::Handler.should_receive(:instance_eval).once
|
72
|
+
|
73
|
+
VTools::Handler.collection do
|
74
|
+
self.should be_a_kind_of(VTools::Handler)
|
75
|
+
self.should respond_to(:set)
|
76
|
+
self.should respond_to(:get)
|
77
|
+
self.should respond_to(:collection)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,189 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "harvester"
|
3
|
+
|
4
|
+
describe VTools::Harvester do
|
5
|
+
|
6
|
+
# hooks
|
7
|
+
before do
|
8
|
+
@harvester = VTools::Harvester.dup
|
9
|
+
end
|
10
|
+
|
11
|
+
context "#add_job" do
|
12
|
+
|
13
|
+
def stub_methods
|
14
|
+
|
15
|
+
Thread.stub!(:new) do |*args, block|
|
16
|
+
block.call(*args)
|
17
|
+
end
|
18
|
+
|
19
|
+
job_mock = double(nil)
|
20
|
+
job_mock.stub(:id).and_return 10
|
21
|
+
job_mock.stub(:execute).and_return "test.executed"
|
22
|
+
|
23
|
+
VTools::Job.stub!(:new).and_return { job_mock }
|
24
|
+
|
25
|
+
@harvester.stub!(:finish).and_return nil
|
26
|
+
@harvester.stub!(:with_error_handle).and_return { |blk| blk.call }
|
27
|
+
job_mock
|
28
|
+
end
|
29
|
+
|
30
|
+
it "accepts valid config" do
|
31
|
+
|
32
|
+
config = OpenStruct.new(:action => "test.action")
|
33
|
+
job = stub_methods
|
34
|
+
|
35
|
+
VTools::Storage.stub!(:send).and_return do |hsh|
|
36
|
+
hsh.should include :data => "test.executed", :action => "test.action"
|
37
|
+
end
|
38
|
+
|
39
|
+
@harvester.should_receive(:finish).with(job).twice
|
40
|
+
VTools::Storage.should_receive(:send).twice
|
41
|
+
VTools::Job.should_receive(:new).with(config).twice
|
42
|
+
|
43
|
+
@harvester.add_job config
|
44
|
+
@harvester.add_job config
|
45
|
+
|
46
|
+
@harvester.instance_variable_get(:@jobs).should include 10 => job, 10 => job
|
47
|
+
@harvester.instance_variable_get(:@run_jobs).should == 2
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context "#finish" do
|
52
|
+
|
53
|
+
def make_stubs ret = true
|
54
|
+
VTools::Job.stub!(:id).and_return 10
|
55
|
+
VTools::Job.stub!(:is_a?).and_return ret
|
56
|
+
end
|
57
|
+
|
58
|
+
it "accepts data" do
|
59
|
+
make_stubs
|
60
|
+
|
61
|
+
job = VTools::Job
|
62
|
+
|
63
|
+
# place job
|
64
|
+
@harvester.instance_variable_set :@jobs, 10 => true
|
65
|
+
@harvester.instance_variable_set :@run_jobs, 2
|
66
|
+
|
67
|
+
@harvester.method(:finish).call(job)
|
68
|
+
|
69
|
+
@harvester.instance_variable_get(:@jobs).should_not include 10 => true
|
70
|
+
@harvester.instance_variable_get(:@run_jobs).should == 1
|
71
|
+
end
|
72
|
+
|
73
|
+
it "denies data" do
|
74
|
+
make_stubs
|
75
|
+
|
76
|
+
job = VTools::Job
|
77
|
+
|
78
|
+
# place job
|
79
|
+
@harvester.instance_variable_set :@jobs, 1 => true
|
80
|
+
@harvester.instance_variable_set :@run_jobs, 2
|
81
|
+
|
82
|
+
jobs = @harvester.instance_variable_get(:@jobs)
|
83
|
+
jobs.should_not_receive(:delete)
|
84
|
+
|
85
|
+
@harvester.method(:finish).call(job)
|
86
|
+
|
87
|
+
jobs.should include 1 => true
|
88
|
+
@harvester.instance_variable_get(:@run_jobs).should == 2
|
89
|
+
end
|
90
|
+
|
91
|
+
it "non Job passed" do
|
92
|
+
make_stubs false
|
93
|
+
|
94
|
+
job = VTools::Job
|
95
|
+
|
96
|
+
jobs = @harvester.instance_variable_get(:@jobs)
|
97
|
+
jobs.should_not_receive(:delete)
|
98
|
+
|
99
|
+
@harvester.method(:finish).call(job)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context "#with_error_handle" do
|
104
|
+
|
105
|
+
def handle_error type, message_rx
|
106
|
+
@harvester.stub(:log).and_return do |e_level, mess|
|
107
|
+
e_level.should == type
|
108
|
+
mess.should =~ message_rx
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it "passes data with no exception" do
|
113
|
+
expect { @harvester.method(:with_error_handle).call }.to_not raise_error
|
114
|
+
expect { @harvester.method(:with_error_handle).call {a = "some block"} }.to_not raise_error
|
115
|
+
end
|
116
|
+
|
117
|
+
it "raises known exception" do
|
118
|
+
handle_error :error, /test\.error/
|
119
|
+
|
120
|
+
[VTools::ConfigError, VTools::FileError, VTools::FormatError, VTools::ProcessError].each do |execpt|
|
121
|
+
@harvester.should_receive(:log)
|
122
|
+
|
123
|
+
expect do
|
124
|
+
@harvester.method(:with_error_handle).call { raise execpt, "test.error" }
|
125
|
+
end.to_not raise_error
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
it "raises unknown exception" do
|
130
|
+
handle_error :fatal, /test\.fatal/
|
131
|
+
@harvester.should_receive(:log).with(:fatal, "test.fatal")
|
132
|
+
|
133
|
+
expect do
|
134
|
+
@harvester.method(:with_error_handle).call { raise "test.fatal" }
|
135
|
+
end.to raise_error
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# specs
|
140
|
+
context "#daemonize!" do
|
141
|
+
|
142
|
+
def stub_methods
|
143
|
+
@harvester.stub!(:loop).and_return{ |block| block.yield }
|
144
|
+
@harvester.stub!(:sleep)
|
145
|
+
|
146
|
+
VTools::Storage.stub!(:connect).and_return nil
|
147
|
+
VTools::Storage.stub!(:recv).and_return "recvd"
|
148
|
+
@harvester.stub!(:with_error_handle).and_return {|blk| blk.call}
|
149
|
+
end
|
150
|
+
|
151
|
+
# CONFIG[:max_jobs] > @run_jobs, should[_not]_receive [__messages__]
|
152
|
+
it "loops trough jobs" do
|
153
|
+
stub_methods
|
154
|
+
|
155
|
+
config = OpenStruct.new( :config => 'tested' )
|
156
|
+
@harvester.stub!(:json_to_obj).and_return { config }
|
157
|
+
|
158
|
+
VTools::CONFIG[:harvester_timer] = 0
|
159
|
+
VTools::CONFIG[:max_jobs] = 2
|
160
|
+
@harvester.instance_variable_set :@run_jobs, 1
|
161
|
+
|
162
|
+
@harvester.should_receive(:sleep).with(0).once
|
163
|
+
VTools::Storage.should_receive(:connect).once
|
164
|
+
VTools::Storage.should_receive(:recv).once
|
165
|
+
@harvester.should_receive(:json_to_obj).with("recvd").once
|
166
|
+
@harvester.should_receive(:add_job).with(config).once
|
167
|
+
@harvester.should_receive(:with_error_handle).once
|
168
|
+
|
169
|
+
@harvester.daemonize!
|
170
|
+
end
|
171
|
+
|
172
|
+
it "does not takes job (queue if full)" do
|
173
|
+
stub_methods
|
174
|
+
|
175
|
+
VTools::CONFIG[:harvester_timer] = 1
|
176
|
+
VTools::CONFIG[:max_jobs] = 2
|
177
|
+
@harvester.instance_variable_set :@run_jobs, 2
|
178
|
+
|
179
|
+
@harvester.should_receive(:sleep).with(1).once
|
180
|
+
VTools::Storage.should_receive(:connect).once
|
181
|
+
VTools::Storage.should_not_receive(:recv)
|
182
|
+
@harvester.should_not_receive(:json_to_obj)
|
183
|
+
@harvester.should_not_receive(:add_job)
|
184
|
+
@harvester.should_not_receive(:with_error_handle)
|
185
|
+
|
186
|
+
@harvester.daemonize!
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
data/spec/job_spec.rb
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "job"
|
3
|
+
|
4
|
+
describe VTools::Job do
|
5
|
+
|
6
|
+
let (:config) { OpenStruct.new :action => "info", :file => "test/file"}
|
7
|
+
let (:video) { @video }
|
8
|
+
|
9
|
+
# hooks
|
10
|
+
before do
|
11
|
+
@video = double nil
|
12
|
+
VTools::Video.stub!(:new).and_return video
|
13
|
+
@job = VTools::Job.new config
|
14
|
+
end
|
15
|
+
|
16
|
+
# specs
|
17
|
+
context "#execute" do
|
18
|
+
|
19
|
+
def stub_methods
|
20
|
+
VTools::Handler.stub!(:exec).and_return nil
|
21
|
+
|
22
|
+
@video.stub(:get_info).and_return {"info.result"}
|
23
|
+
@video.stub(:convert).and_return {"encoded.result"}
|
24
|
+
@video.stub(:create_thumbs).and_return {"thumbs.result"}
|
25
|
+
end
|
26
|
+
|
27
|
+
def set_action action
|
28
|
+
options = @job.instance_variable_get :@config
|
29
|
+
options.action = action
|
30
|
+
@job.instance_variable_set :@config, options
|
31
|
+
end
|
32
|
+
|
33
|
+
it "receives video info" do
|
34
|
+
stub_methods
|
35
|
+
set_action "info"
|
36
|
+
|
37
|
+
VTools::Handler.should_receive(:exec).with(:job_started, @video, "info")
|
38
|
+
VTools::Handler.should_receive(:exec).with(:job_finished, "info.result", @video, "info")
|
39
|
+
@video.should_receive(:get_info)
|
40
|
+
|
41
|
+
@job.execute.should == "info.result"
|
42
|
+
end
|
43
|
+
|
44
|
+
it "starts video encoding" do
|
45
|
+
stub_methods
|
46
|
+
set_action "convert"
|
47
|
+
|
48
|
+
VTools::Handler.should_receive(:exec).with(:job_started, @video, "convert")
|
49
|
+
VTools::Handler.should_receive(:exec).with(:job_finished, "encoded.result", @video, "convert")
|
50
|
+
@video.should_receive(:convert)
|
51
|
+
|
52
|
+
@job.execute.should == "encoded.result"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "creates thumbnails" do
|
56
|
+
stub_methods
|
57
|
+
set_action "thumbs"
|
58
|
+
|
59
|
+
VTools::Handler.should_receive(:exec).with(:job_started, @video, "thumbs")
|
60
|
+
VTools::Handler.should_receive(:exec).with(:job_finished, "thumbs.result", @video, "thumbs")
|
61
|
+
@video.should_receive(:create_thumbs)
|
62
|
+
|
63
|
+
@job.execute.should == "thumbs.result"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# specs
|
68
|
+
context "#validate" do
|
69
|
+
|
70
|
+
it "accepts options" do
|
71
|
+
|
72
|
+
["convert", "thumbs", "info"].each do |action|
|
73
|
+
conf = config.dup
|
74
|
+
conf.action = action
|
75
|
+
conf.setup = "setup.test" unless action == "info"
|
76
|
+
|
77
|
+
expect { @job.validate(conf).should == conf }.to_not raise_error
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
it "rases exception with invalid config" do
|
82
|
+
|
83
|
+
def validate_exception conf, message_rx
|
84
|
+
expect { @job.validate(conf) }.to raise_error VTools::ConfigError, message_rx
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
["convert", "thumbs", "info"].each do |action|
|
89
|
+
# empty config
|
90
|
+
conf = OpenStruct.new({})
|
91
|
+
validate_exception conf, /Invalid action \(config: /
|
92
|
+
|
93
|
+
# +action -file
|
94
|
+
conf.action = action
|
95
|
+
validate_exception conf, /Invalid action \(config: /
|
96
|
+
|
97
|
+
# empty file
|
98
|
+
conf.file = ""
|
99
|
+
validate_exception conf, /Invalid action \(config: /
|
100
|
+
|
101
|
+
# +file -config
|
102
|
+
conf.file = "test/file"
|
103
|
+
validate_exception conf, "Configuration is empty" unless action == "info"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# specs
|
109
|
+
context "#initialize" do
|
110
|
+
|
111
|
+
it "passes valid params" do
|
112
|
+
|
113
|
+
VTools::Job.any_instance.stub(:validate).and_return { |obj| obj }
|
114
|
+
|
115
|
+
job = nil
|
116
|
+
expect { job = VTools::Job.new config }.to_not raise_error
|
117
|
+
|
118
|
+
job.id.should == job.object_id
|
119
|
+
job.instance_variable_get(:@config).should == config
|
120
|
+
job.instance_variable_get(:@video).should == video
|
121
|
+
end
|
122
|
+
|
123
|
+
it "raises error on invalid config (validate)" do
|
124
|
+
VTools::Job.any_instance.stub(:validate).and_return { raise "test.exception" }
|
125
|
+
|
126
|
+
expect { job = VTools::Job.new config }.to raise_error "test.exception"
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|