active_encode 1.2.0 → 1.2.2
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 +4 -4
- data/.circleci/config.yml +1 -0
- data/active_encode.gemspec +1 -2
- data/lib/active_encode/engine_adapters/pass_through_adapter.rb +28 -7
- data/lib/active_encode/version.rb +1 -1
- metadata +4 -274
- data/spec/controllers/encode_record_controller_spec.rb +0 -53
- data/spec/fixtures//"file_with_double_quote/".low.mp4 +0 -0
- data/spec/fixtures//"file_with_double_quote/".mp4 +0 -0
- data/spec/fixtures/'file_with_single_quote'.low.mp4 +0 -0
- data/spec/fixtures/'file_with_single_quote'.mp4 +0 -0
- data/spec/fixtures/@/341/213/210/341/213/263/341/214/205/341/210/205 /341/210/233/341/210/255 /341/211/242. /341/210/206/341/212/225 /341/214/250/341/210/255/341/210/265. /341/210/205 /341/212/240/341/211/265/341/210/213/341/210/260!@#$^^&$%&.low.mov +0 -0
- data/spec/fixtures/@/341/213/210/341/213/263/341/214/205/341/210/205 /341/210/233/341/210/255 /341/211/242. /341/210/206/341/212/225 /341/214/250/341/210/255/341/210/265. /341/210/205 /341/212/240/341/211/265/341/210/213/341/210/260!@#$^^&$%&.mov +0 -0
- data/spec/fixtures/Bars_512kb.mp4 +0 -0
- data/spec/fixtures/elastic_transcoder/input_completed.json +0 -1
- data/spec/fixtures/elastic_transcoder/input_generic.json +0 -1
- data/spec/fixtures/elastic_transcoder/input_progressing.json +0 -1
- data/spec/fixtures/elastic_transcoder/job_canceled.json +0 -1
- data/spec/fixtures/elastic_transcoder/job_completed.json +0 -1
- data/spec/fixtures/elastic_transcoder/job_created.json +0 -1
- data/spec/fixtures/elastic_transcoder/job_failed.json +0 -1
- data/spec/fixtures/elastic_transcoder/job_progressing.json +0 -1
- data/spec/fixtures/elastic_transcoder/output_canceled.json +0 -1
- data/spec/fixtures/elastic_transcoder/output_completed.json +0 -1
- data/spec/fixtures/elastic_transcoder/output_failed.json +0 -1
- data/spec/fixtures/elastic_transcoder/output_progressing.json +0 -1
- data/spec/fixtures/elastic_transcoder/output_submitted.json +0 -1
- data/spec/fixtures/ffmpeg/cancelled-id/cancelled +0 -0
- data/spec/fixtures/ffmpeg/cancelled-id/error.log +0 -0
- data/spec/fixtures/ffmpeg/cancelled-id/exit_status.code +0 -1
- data/spec/fixtures/ffmpeg/cancelled-id/input_metadata +0 -90
- data/spec/fixtures/ffmpeg/cancelled-id/pid +0 -1
- data/spec/fixtures/ffmpeg/cancelled-id/progress +0 -11
- data/spec/fixtures/ffmpeg/completed-id/error.log +0 -0
- data/spec/fixtures/ffmpeg/completed-id/exit_status.code +0 -1
- data/spec/fixtures/ffmpeg/completed-id/input_metadata +0 -102
- data/spec/fixtures/ffmpeg/completed-id/output_metadata-high +0 -90
- data/spec/fixtures/ffmpeg/completed-id/output_metadata-low +0 -90
- data/spec/fixtures/ffmpeg/completed-id/pid +0 -1
- data/spec/fixtures/ffmpeg/completed-id/progress +0 -11
- data/spec/fixtures/ffmpeg/completed-id/video-high.mp4 +0 -0
- data/spec/fixtures/ffmpeg/completed-id/video-low.mp4 +0 -0
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/error.log +0 -3
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/exit_status.code +0 -1
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/input_metadata +0 -102
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/output_metadata-high +0 -90
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/output_metadata-low +0 -90
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/pid +0 -1
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/progress +0 -11
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/video-high.mp4 +0 -0
- data/spec/fixtures/ffmpeg/completed-with-warnings-id/video-low.mp4 +0 -0
- data/spec/fixtures/ffmpeg/failed-id/error.log +0 -1
- data/spec/fixtures/ffmpeg/failed-id/exit_status.code +0 -1
- data/spec/fixtures/ffmpeg/failed-id/input_metadata +0 -90
- data/spec/fixtures/ffmpeg/failed-id/pid +0 -1
- data/spec/fixtures/ffmpeg/failed-id/progress +0 -11
- data/spec/fixtures/ffmpeg/incomplete-id/error.log +0 -0
- data/spec/fixtures/ffmpeg/incomplete-id/exit_status.code +0 -1
- data/spec/fixtures/ffmpeg/incomplete-id/input_metadata +0 -102
- data/spec/fixtures/ffmpeg/incomplete-id/output_metadata-high +0 -90
- data/spec/fixtures/ffmpeg/incomplete-id/output_metadata-low +0 -90
- data/spec/fixtures/ffmpeg/incomplete-id/pid +0 -1
- data/spec/fixtures/ffmpeg/incomplete-id/progress +0 -11
- data/spec/fixtures/ffmpeg/incomplete-id/video-high.mp4 +0 -0
- data/spec/fixtures/ffmpeg/incomplete-id/video-low.mp4 +0 -0
- data/spec/fixtures/ffmpeg/running-id/error.log +0 -0
- data/spec/fixtures/ffmpeg/running-id/input_metadata +0 -90
- data/spec/fixtures/ffmpeg/running-id/pid +0 -1
- data/spec/fixtures/ffmpeg/running-id/progress +0 -11
- data/spec/fixtures/file with space.low.mp4 +0 -0
- data/spec/fixtures/file with space.mp4 +0 -0
- data/spec/fixtures/file.with :=+%sp3c!l-ch4cts().mp4 +0 -0
- data/spec/fixtures/file.with...periods.mp4 +0 -0
- data/spec/fixtures/file_without_metadata.low.webm +0 -0
- data/spec/fixtures/file_without_metadata.mp4 +0 -0
- data/spec/fixtures/file_without_metadata.webm +0 -0
- data/spec/fixtures/fireworks.low.mp4 +0 -0
- data/spec/fixtures/fireworks.mp4 +0 -0
- data/spec/fixtures/matterhorn/cancelled_response.xml +0 -323
- data/spec/fixtures/matterhorn/completed_response.xml +0 -4
- data/spec/fixtures/matterhorn/create_response.xml +0 -300
- data/spec/fixtures/matterhorn/delete_track_response.xml +0 -2
- data/spec/fixtures/matterhorn/failed_response.xml +0 -4
- data/spec/fixtures/matterhorn/purged_response.xml +0 -342
- data/spec/fixtures/matterhorn/running_response.xml +0 -1
- data/spec/fixtures/matterhorn/stop_completed_response.xml +0 -228
- data/spec/fixtures/matterhorn/stop_running_response.xml +0 -339
- data/spec/fixtures/media_convert/endpoints.json +0 -1
- data/spec/fixtures/media_convert/job_canceled.json +0 -412
- data/spec/fixtures/media_convert/job_canceling.json +0 -1
- data/spec/fixtures/media_convert/job_completed.json +0 -359
- data/spec/fixtures/media_convert/job_completed_detail.json +0 -1
- data/spec/fixtures/media_convert/job_completed_detail_query.json +0 -1
- data/spec/fixtures/media_convert/job_completed_empty_detail.json +0 -1
- data/spec/fixtures/media_convert/job_created.json +0 -408
- data/spec/fixtures/media_convert/job_failed.json +0 -406
- data/spec/fixtures/media_convert/job_progressing.json +0 -414
- data/spec/fixtures/pass_through/cancelled-id/cancelled +0 -0
- data/spec/fixtures/pass_through/cancelled-id/input_metadata +0 -90
- data/spec/fixtures/pass_through/completed-id/completed +0 -0
- data/spec/fixtures/pass_through/completed-id/input_metadata +0 -102
- data/spec/fixtures/pass_through/completed-id/output_metadata-high +0 -90
- data/spec/fixtures/pass_through/completed-id/output_metadata-low +0 -90
- data/spec/fixtures/pass_through/completed-id/video-high.mp4 +0 -0
- data/spec/fixtures/pass_through/completed-id/video-low.mp4 +0 -0
- data/spec/fixtures/pass_through/failed-id/error.log +0 -1
- data/spec/fixtures/pass_through/failed-id/input_metadata +0 -90
- data/spec/fixtures/pass_through/running-id/input_metadata +0 -90
- data/spec/fixtures/zencoder/job_create.json +0 -1
- data/spec/fixtures/zencoder/job_details_cancelled.json +0 -1
- data/spec/fixtures/zencoder/job_details_completed.json +0 -1
- data/spec/fixtures/zencoder/job_details_create.json +0 -1
- data/spec/fixtures/zencoder/job_details_failed.json +0 -73
- data/spec/fixtures/zencoder/job_details_running.json +0 -1
- data/spec/fixtures/zencoder/job_progress_cancelled.json +0 -13
- data/spec/fixtures/zencoder/job_progress_completed.json +0 -13
- data/spec/fixtures/zencoder/job_progress_create.json +0 -1
- data/spec/fixtures/zencoder/job_progress_failed.json +0 -13
- data/spec/fixtures/zencoder/job_progress_running.json +0 -1
- data/spec/integration/elastic_transcoder_adapter_spec.rb +0 -218
- data/spec/integration/ffmpeg_adapter_spec.rb +0 -535
- data/spec/integration/matterhorn_adapter_spec.rb +0 -130
- data/spec/integration/media_convert_adapter_spec.rb +0 -321
- data/spec/integration/pass_through_adapter_spec.rb +0 -293
- data/spec/integration/zencoder_adapter_spec.rb +0 -391
- data/spec/rails_helper.rb +0 -25
- data/spec/routing/encode_record_controller_routing_spec.rb +0 -10
- data/spec/spec_helper.rb +0 -20
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +0 -16
- data/spec/units/callbacks_spec.rb +0 -66
- data/spec/units/core_spec.rb +0 -160
- data/spec/units/engine_adapter_spec.rb +0 -67
- data/spec/units/file_locator_spec.rb +0 -129
- data/spec/units/filename_sanitizer_spec.rb +0 -20
- data/spec/units/global_id_spec.rb +0 -50
- data/spec/units/input_spec.rb +0 -40
- data/spec/units/output_spec.rb +0 -42
- data/spec/units/persistence_spec.rb +0 -61
- data/spec/units/polling_job_spec.rb +0 -87
- data/spec/units/polling_spec.rb +0 -23
- data/spec/units/status_spec.rb +0 -81
data/spec/units/core_spec.rb
DELETED
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::Core do
|
|
5
|
-
before do
|
|
6
|
-
class CustomEncode < ActiveEncode::Base
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
after do
|
|
10
|
-
Object.send(:remove_const, :CustomEncode)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
let(:encode_class) { ActiveEncode::Base }
|
|
14
|
-
|
|
15
|
-
describe 'attributes' do
|
|
16
|
-
subject { encode_class.new(nil) }
|
|
17
|
-
|
|
18
|
-
it { is_expected.to respond_to(:id, :input, :output, :options, :percent_complete, :current_operations) }
|
|
19
|
-
|
|
20
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
21
|
-
let(:encode_class) { CustomEncode }
|
|
22
|
-
|
|
23
|
-
it { is_expected.to respond_to(:id, :input, :output, :options, :percent_complete, :current_operations) }
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
describe 'find' do
|
|
28
|
-
subject { encode_class.find(id) }
|
|
29
|
-
let(:id) { encode_class.create(nil).id }
|
|
30
|
-
|
|
31
|
-
it { is_expected.to be_a encode_class }
|
|
32
|
-
it { expect(subject.id).to eq id }
|
|
33
|
-
|
|
34
|
-
context 'with no id' do
|
|
35
|
-
let(:id) { nil }
|
|
36
|
-
|
|
37
|
-
it 'raises an error' do
|
|
38
|
-
expect { subject }.to raise_error(ArgumentError)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
43
|
-
let(:encode_class) { CustomEncode }
|
|
44
|
-
|
|
45
|
-
it { is_expected.to be_a encode_class }
|
|
46
|
-
it { expect(subject.id).to eq id }
|
|
47
|
-
|
|
48
|
-
context 'casting' do
|
|
49
|
-
let(:id) { ActiveEncode::Base.create(nil).id }
|
|
50
|
-
|
|
51
|
-
it { is_expected.to be_a encode_class }
|
|
52
|
-
it { expect(subject.id).to eq id }
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
describe 'create' do
|
|
58
|
-
subject { encode_class.create(nil) }
|
|
59
|
-
|
|
60
|
-
it { is_expected.to be_a encode_class }
|
|
61
|
-
it { expect(subject.id).not_to be nil }
|
|
62
|
-
it { expect(subject.state).not_to be nil }
|
|
63
|
-
|
|
64
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
65
|
-
let(:encode_class) { CustomEncode }
|
|
66
|
-
|
|
67
|
-
it { is_expected.to be_a encode_class }
|
|
68
|
-
it { expect(subject.id).not_to be nil }
|
|
69
|
-
it { expect(subject.state).not_to be nil }
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
describe '#create!' do
|
|
74
|
-
subject { encode.create! }
|
|
75
|
-
let(:encode) { encode_class.new(nil) }
|
|
76
|
-
|
|
77
|
-
it { is_expected.to equal encode }
|
|
78
|
-
it { is_expected.to be_a encode_class }
|
|
79
|
-
it { expect(subject.id).not_to be nil }
|
|
80
|
-
it { expect(subject.state).not_to be nil }
|
|
81
|
-
|
|
82
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
83
|
-
let(:encode_class) { CustomEncode }
|
|
84
|
-
|
|
85
|
-
it { is_expected.to equal encode }
|
|
86
|
-
it { is_expected.to be_a encode_class }
|
|
87
|
-
it { expect(subject.id).not_to be nil }
|
|
88
|
-
it { expect(subject.state).not_to be nil }
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
describe '#cancel!' do
|
|
93
|
-
subject { encode.cancel! }
|
|
94
|
-
let(:encode) { encode_class.create(nil) }
|
|
95
|
-
|
|
96
|
-
it { is_expected.to equal encode }
|
|
97
|
-
it { is_expected.to be_a encode_class }
|
|
98
|
-
it { expect(subject.id).not_to be nil }
|
|
99
|
-
it { is_expected.to be_cancelled }
|
|
100
|
-
|
|
101
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
102
|
-
let(:encode_class) { CustomEncode }
|
|
103
|
-
|
|
104
|
-
it { is_expected.to equal encode }
|
|
105
|
-
it { is_expected.to be_a encode_class }
|
|
106
|
-
it { expect(subject.id).not_to be nil }
|
|
107
|
-
it { is_expected.to be_cancelled }
|
|
108
|
-
end
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
describe '#reload' do
|
|
112
|
-
subject { encode.reload }
|
|
113
|
-
let(:encode) { encode_class.create(nil) }
|
|
114
|
-
|
|
115
|
-
it { is_expected.to equal encode }
|
|
116
|
-
it { is_expected.to be_a encode_class }
|
|
117
|
-
it { expect(subject.id).not_to be nil }
|
|
118
|
-
it { expect(subject.state).not_to be nil }
|
|
119
|
-
|
|
120
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
121
|
-
let(:encode_class) { CustomEncode }
|
|
122
|
-
|
|
123
|
-
it { is_expected.to equal encode }
|
|
124
|
-
it { is_expected.to be_a encode_class }
|
|
125
|
-
it { expect(subject.id).not_to be nil }
|
|
126
|
-
it { expect(subject.state).not_to be nil }
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
|
|
130
|
-
describe '#new' do
|
|
131
|
-
subject { encode.options }
|
|
132
|
-
before do
|
|
133
|
-
class DefaultOptionsEncode < ActiveEncode::Base
|
|
134
|
-
def self.default_options(_input_url)
|
|
135
|
-
{ preset: 'video' }
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
after do
|
|
140
|
-
Object.send(:remove_const, :DefaultOptionsEncode)
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
let(:encode_class) { DefaultOptionsEncode }
|
|
144
|
-
let(:default_options) { { preset: 'video' } }
|
|
145
|
-
let(:options) { { output: [{ label: 'high', ffmpeg_opt: "640x480" }] } }
|
|
146
|
-
let(:encode) { encode_class.new(nil, options) }
|
|
147
|
-
|
|
148
|
-
it 'merges default options and options parameter' do
|
|
149
|
-
expect(subject).to include default_options
|
|
150
|
-
expect(subject).to include options
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
context 'with collisions' do
|
|
154
|
-
let(:options) { { preset: 'avalon' } }
|
|
155
|
-
it 'prefers options parameter' do
|
|
156
|
-
expect(subject[:preset]).to eq 'avalon'
|
|
157
|
-
end
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
end
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::EngineAdapter do
|
|
5
|
-
before do
|
|
6
|
-
module ActiveEncode
|
|
7
|
-
module EngineAdapters
|
|
8
|
-
class StubOneAdapter
|
|
9
|
-
def create(_); end
|
|
10
|
-
|
|
11
|
-
def find(_, _ = {}); end
|
|
12
|
-
|
|
13
|
-
def cancel(_encode); end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
class StubTwoAdapter
|
|
17
|
-
def create(_encode); end
|
|
18
|
-
|
|
19
|
-
def find(_id, _opts = {}); end
|
|
20
|
-
|
|
21
|
-
def cancel(_encode); end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
after do
|
|
28
|
-
ActiveEncode::EngineAdapters.send(:remove_const, :StubOneAdapter)
|
|
29
|
-
ActiveEncode::EngineAdapters.send(:remove_const, :StubTwoAdapter)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it 'does not allow classes as arguments' do
|
|
33
|
-
expect { ActiveEncode::Base.engine_adapter = ActiveEncode::EngineAdapters::StubOneAdapter }.to raise_error(ArgumentError)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
it 'does not allow arguments that are not engine adapters' do
|
|
37
|
-
expect { ActiveEncode::Base.engine_adapter = Mutex.new }.to raise_error(ArgumentError)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
context 'overriding' do
|
|
41
|
-
let(:base_engine_adapter) { ActiveEncode::Base.engine_adapter }
|
|
42
|
-
|
|
43
|
-
it 'does not affect the parent' do
|
|
44
|
-
child_encode_one = Class.new(ActiveEncode::Base)
|
|
45
|
-
child_encode_one.engine_adapter = :stub_one
|
|
46
|
-
|
|
47
|
-
expect(child_encode_one.engine_adapter).not_to eq base_engine_adapter
|
|
48
|
-
expect(child_encode_one.engine_adapter).to be_kind_of ActiveEncode::EngineAdapters::StubOneAdapter
|
|
49
|
-
expect(ActiveEncode::Base.engine_adapter).to eq base_engine_adapter
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'does not affect its sibling' do
|
|
53
|
-
child_encode_one = Class.new(ActiveEncode::Base)
|
|
54
|
-
child_encode_one.engine_adapter = :stub_one
|
|
55
|
-
child_encode_two = Class.new(ActiveEncode::Base)
|
|
56
|
-
child_encode_two.engine_adapter = :stub_two
|
|
57
|
-
|
|
58
|
-
expect(child_encode_two.engine_adapter).not_to eq base_engine_adapter
|
|
59
|
-
expect(child_encode_two.engine_adapter).to be_kind_of ActiveEncode::EngineAdapters::StubTwoAdapter
|
|
60
|
-
# child_encode_one's engine adapter should remain unchanged
|
|
61
|
-
expect(child_encode_one.engine_adapter).to be_kind_of ActiveEncode::EngineAdapters::StubOneAdapter
|
|
62
|
-
expect(ActiveEncode::Base.engine_adapter).to eq base_engine_adapter
|
|
63
|
-
# new encodes should not be affected
|
|
64
|
-
expect(Class.new(ActiveEncode::Base).engine_adapter).to eq base_engine_adapter
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
# Copyright 2011-2018, The Trustees of Indiana University and Northwestern
|
|
3
|
-
# University. Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
#
|
|
6
|
-
# You may obtain a copy of the License at
|
|
7
|
-
#
|
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
#
|
|
10
|
-
# Unless required by applicable law or agreed to in writing, software distributed
|
|
11
|
-
# under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
12
|
-
# CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
|
13
|
-
# specific language governing permissions and limitations under the License.
|
|
14
|
-
# --- END LICENSE_HEADER BLOCK ---
|
|
15
|
-
require 'aws-sdk-s3'
|
|
16
|
-
require 'rails_helper'
|
|
17
|
-
|
|
18
|
-
describe FileLocator, type: :service do
|
|
19
|
-
before do
|
|
20
|
-
Aws.config[:stub_responses] = true
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
describe 'S3File Class' do
|
|
24
|
-
let(:bucket) { "mybucket" }
|
|
25
|
-
let(:key) { "mykey.mp4" }
|
|
26
|
-
let(:s3file) { FileLocator::S3File.new("s3://#{bucket}/#{key}") }
|
|
27
|
-
|
|
28
|
-
it "is able to initialize from an S3 URI" do
|
|
29
|
-
expect(s3file.bucket).to eq bucket
|
|
30
|
-
expect(s3file.key).to eq key
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it "returns an S3 Object" do
|
|
34
|
-
s3_object = s3file.object
|
|
35
|
-
expect(s3_object).to be_an Aws::S3::Object
|
|
36
|
-
expect(s3_object.bucket_name).to eq bucket
|
|
37
|
-
expect(s3_object.key).to eq key
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
describe "Local file" do
|
|
42
|
-
let(:path) { "/path/to/file.mp4" }
|
|
43
|
-
let(:source) { "file://#{path}" }
|
|
44
|
-
let(:locator) { described_class.new(source) }
|
|
45
|
-
|
|
46
|
-
it "returns the correct uri" do
|
|
47
|
-
expect(locator.uri).to eq Addressable::URI.parse(source)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
it "returns the correct location" do
|
|
51
|
-
expect(locator.location).to eq path
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
it "tells if file exists" do
|
|
55
|
-
allow(File).to receive(:exist?).with(path) { true }
|
|
56
|
-
expect(locator.exist?).to be_truthy
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
context "return file" do
|
|
60
|
-
let(:file) { double(File) }
|
|
61
|
-
before do
|
|
62
|
-
allow(File).to receive(:open).and_return file
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
it "returns reader" do
|
|
66
|
-
expect(locator.reader).to eq file
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
it "returns attachment" do
|
|
70
|
-
expect(locator.attachment).to eq file
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
describe "s3 file" do
|
|
76
|
-
let(:bucket) { "mybucket" }
|
|
77
|
-
let(:key) { "mykey.mp4" }
|
|
78
|
-
let(:source) { "s3://#{bucket}/#{key}" }
|
|
79
|
-
let(:locator) { described_class.new(source) }
|
|
80
|
-
|
|
81
|
-
it "returns the correct uri" do
|
|
82
|
-
expect(locator.uri).to eq Addressable::URI.parse(source)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
it "returns the correct location" do
|
|
86
|
-
expect(locator.location).to start_with "https://#{bucket}.s3.us-stubbed-1.amazonaws.com/#{key}"
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
it "tells if file exists" do
|
|
90
|
-
expect(locator.exist?).to be_truthy
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
it "returns reader" do
|
|
94
|
-
expect(locator.reader).to be_a StringIO
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
it "returns attachment" do
|
|
98
|
-
expect(locator.attachment).to eq Addressable::URI.parse(source)
|
|
99
|
-
end
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
describe "Other file" do
|
|
103
|
-
let(:path) { "/path/to/file.mp4" }
|
|
104
|
-
let(:source) { "bogus://#{path}" }
|
|
105
|
-
let(:locator) { described_class.new(source) }
|
|
106
|
-
|
|
107
|
-
it "returns the correct uri" do
|
|
108
|
-
expect(locator.uri).to eq Addressable::URI.parse(source)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
it "returns the correct location" do
|
|
112
|
-
expect(locator.location).to eq source
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
it "tells if file exists" do
|
|
116
|
-
expect(locator.exist?).to be_falsy
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it "returns reader" do
|
|
120
|
-
io = double(IO)
|
|
121
|
-
allow(Kernel).to receive(:open).and_return io
|
|
122
|
-
expect(locator.reader).to eq io
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
it "returns attachment" do
|
|
126
|
-
expect(locator.attachment).to eq locator.location
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
require 'addressable'
|
|
4
|
-
|
|
5
|
-
describe ActiveEncode::FilenameSanitizer do
|
|
6
|
-
describe '#sanitize_uri' do
|
|
7
|
-
it 'removes file scheme' do
|
|
8
|
-
uri = "file:///path/to/file"
|
|
9
|
-
expect(ActiveEncode.sanitize_uri(uri)).to eq "/path/to/file"
|
|
10
|
-
end
|
|
11
|
-
it 'relativizes s3 uris' do
|
|
12
|
-
uri = "s3://mybucket/guitar.mp4"
|
|
13
|
-
expect(ActiveEncode.sanitize_uri(uri)).to eq "/guitar.mp4"
|
|
14
|
-
end
|
|
15
|
-
it 'does nothing for http(s) uris' do
|
|
16
|
-
uri = "https://www.googleapis.com/drive/v3/files/1WkWJ12WecI9hX-PmEbuKDGLPK_mN3kYP?alt=media"
|
|
17
|
-
expect(ActiveEncode.sanitize_uri(uri)).to eq uri
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::GlobalID do
|
|
5
|
-
before do
|
|
6
|
-
class CustomEncode < ActiveEncode::Base
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
after do
|
|
11
|
-
Object.send(:remove_const, :CustomEncode)
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
describe '#to_global_id' do
|
|
15
|
-
subject { encode.to_global_id }
|
|
16
|
-
let(:encode_class) { ActiveEncode::Base }
|
|
17
|
-
let(:encode) { encode_class.create(nil) }
|
|
18
|
-
|
|
19
|
-
it { is_expected.to be_a GlobalID }
|
|
20
|
-
it { expect(subject.model_class).to eq encode_class }
|
|
21
|
-
it { expect(subject.model_id).to eq encode.id }
|
|
22
|
-
it { expect(subject.app).to eq 'ActiveEncode' }
|
|
23
|
-
|
|
24
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
25
|
-
let(:encode_class) { CustomEncode }
|
|
26
|
-
|
|
27
|
-
it { is_expected.to be_a GlobalID }
|
|
28
|
-
it { expect(subject.model_class).to eq encode_class }
|
|
29
|
-
it { expect(subject.model_id).to eq encode.id }
|
|
30
|
-
it { expect(subject.app).to eq 'ActiveEncode' }
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
describe 'GlobalID::Locator#locate' do
|
|
35
|
-
subject { GlobalID::Locator.locate(global_id) }
|
|
36
|
-
let(:encode_class) { ActiveEncode::Base }
|
|
37
|
-
let(:encode) { encode_class.create(nil) }
|
|
38
|
-
let(:global_id) { encode.to_global_id }
|
|
39
|
-
|
|
40
|
-
it { is_expected.to be_a encode_class }
|
|
41
|
-
it { expect(subject.id).to eq encode.id }
|
|
42
|
-
|
|
43
|
-
context 'with an ActiveEncode::Base subclass' do
|
|
44
|
-
let(:encode_class) { CustomEncode }
|
|
45
|
-
|
|
46
|
-
it { is_expected.to be_a encode_class }
|
|
47
|
-
it { expect(subject.id).to eq encode.id }
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
end
|
data/spec/units/input_spec.rb
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::Input do
|
|
5
|
-
subject { described_class.new }
|
|
6
|
-
|
|
7
|
-
describe 'attributes' do
|
|
8
|
-
it { is_expected.to respond_to(:id, :url) }
|
|
9
|
-
it { is_expected.to respond_to(:state, :errors, :created_at, :updated_at) }
|
|
10
|
-
it {
|
|
11
|
-
is_expected.to respond_to(:width, :height, :frame_rate, :checksum,
|
|
12
|
-
:audio_codec, :video_codec, :audio_bitrate, :video_bitrate)
|
|
13
|
-
}
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
describe '#valid?' do
|
|
17
|
-
let(:valid_input) do
|
|
18
|
-
described_class.new.tap do |obj|
|
|
19
|
-
obj.id = "1"
|
|
20
|
-
obj.url = "file:///tmp/video.mp4"
|
|
21
|
-
obj.created_at = Time.now.utc
|
|
22
|
-
obj.updated_at = Time.now.utc
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
it 'returns true when conditions met' do
|
|
27
|
-
expect(valid_input).to be_valid
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
it 'returns false when conditions not met' do
|
|
31
|
-
expect(valid_input.tap { |obj| obj.id = nil }).not_to be_valid
|
|
32
|
-
expect(valid_input.tap { |obj| obj.url = nil }).not_to be_valid
|
|
33
|
-
expect(valid_input.tap { |obj| obj.created_at = nil }).not_to be_valid
|
|
34
|
-
expect(valid_input.tap { |obj| obj.created_at = "today" }).not_to be_valid
|
|
35
|
-
expect(valid_input.tap { |obj| obj.updated_at = nil }).not_to be_valid
|
|
36
|
-
expect(valid_input.tap { |obj| obj.updated_at = "today" }).not_to be_valid
|
|
37
|
-
expect(valid_input.tap { |obj| obj.created_at = Time.now.utc }).not_to be_valid
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
data/spec/units/output_spec.rb
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'spec_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::Output do
|
|
5
|
-
subject { described_class.new }
|
|
6
|
-
|
|
7
|
-
describe 'attributes' do
|
|
8
|
-
it { is_expected.to respond_to(:id, :url, :label) }
|
|
9
|
-
it { is_expected.to respond_to(:state, :errors, :created_at, :updated_at) }
|
|
10
|
-
it {
|
|
11
|
-
is_expected.to respond_to(:width, :height, :frame_rate, :checksum,
|
|
12
|
-
:audio_codec, :video_codec, :audio_bitrate, :video_bitrate)
|
|
13
|
-
}
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
describe '#valid?' do
|
|
17
|
-
let(:valid_output) do
|
|
18
|
-
described_class.new.tap do |obj|
|
|
19
|
-
obj.id = "1"
|
|
20
|
-
obj.url = "file:///tmp/video.mp4"
|
|
21
|
-
obj.label = "HD"
|
|
22
|
-
obj.created_at = Time.now.utc
|
|
23
|
-
obj.updated_at = Time.now.utc
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
it 'returns true when conditions met' do
|
|
28
|
-
expect(valid_output).to be_valid
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
it 'returns false when conditions not met' do
|
|
32
|
-
expect(valid_output.tap { |obj| obj.id = nil }).not_to be_valid
|
|
33
|
-
expect(valid_output.tap { |obj| obj.url = nil }).not_to be_valid
|
|
34
|
-
expect(valid_output.tap { |obj| obj.label = nil }).not_to be_valid
|
|
35
|
-
expect(valid_output.tap { |obj| obj.created_at = nil }).not_to be_valid
|
|
36
|
-
expect(valid_output.tap { |obj| obj.created_at = "today" }).not_to be_valid
|
|
37
|
-
expect(valid_output.tap { |obj| obj.updated_at = nil }).not_to be_valid
|
|
38
|
-
expect(valid_output.tap { |obj| obj.updated_at = "today" }).not_to be_valid
|
|
39
|
-
expect(valid_output.tap { |obj| obj.created_at = Time.now.utc }).not_to be_valid
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'rails_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::Persistence, db_clean: true do
|
|
5
|
-
before do
|
|
6
|
-
class CustomEncode < ActiveEncode::Base
|
|
7
|
-
include ActiveEncode::Persistence
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
after do
|
|
12
|
-
Object.send(:remove_const, :CustomEncode)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
describe 'find' do
|
|
16
|
-
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
|
17
|
-
let(:encode) { CustomEncode.create(nil) }
|
|
18
|
-
|
|
19
|
-
it 'persists changes on find' do
|
|
20
|
-
expect { CustomEncode.find(encode.id) }.to change { subject.reload.updated_at }
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
describe 'create' do
|
|
25
|
-
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
|
26
|
-
let(:create_options) { { option: 'value' } }
|
|
27
|
-
let(:encode) { CustomEncode.create(nil, create_options) }
|
|
28
|
-
|
|
29
|
-
it 'creates a record' do
|
|
30
|
-
expect { encode }.to change { ActiveEncode::EncodeRecord.count }.by(1)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
it { expect(subject.global_id).to eq encode.to_global_id.to_s }
|
|
34
|
-
it { expect(subject.state).to eq encode.state.to_s }
|
|
35
|
-
it { expect(subject.adapter).to eq encode.class.engine_adapter.class.name }
|
|
36
|
-
it { expect(subject.title).to eq encode.input.url.to_s }
|
|
37
|
-
it { expect(subject.raw_object).to eq encode.to_json }
|
|
38
|
-
it { expect(subject.created_at).to be_within(1.second).of encode.created_at }
|
|
39
|
-
it { expect(subject.updated_at).to be_within(1.second).of encode.updated_at }
|
|
40
|
-
it { expect(subject.create_options).to eq create_options.to_json }
|
|
41
|
-
it { expect(subject.progress).to eq encode.percent_complete }
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
describe 'cancel' do
|
|
45
|
-
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
|
46
|
-
let(:encode) { CustomEncode.create(nil) }
|
|
47
|
-
|
|
48
|
-
it 'persists changes on cancel' do
|
|
49
|
-
expect { encode.cancel! }.to change { subject.reload.state }.from("running").to("cancelled")
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
describe 'reload' do
|
|
54
|
-
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
|
55
|
-
let(:encode) { CustomEncode.create(nil) }
|
|
56
|
-
|
|
57
|
-
it 'persists changes on reload' do
|
|
58
|
-
expect { encode.reload }.to change { subject.reload.updated_at }
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'rails_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::PollingJob do
|
|
5
|
-
include ActiveJob::TestHelper
|
|
6
|
-
|
|
7
|
-
before do
|
|
8
|
-
class PollingEncode < ActiveEncode::Base
|
|
9
|
-
include ActiveEncode::Polling
|
|
10
|
-
after_status_update ->(encode) { encode.history << "PollingEncode ran after_status_update" }
|
|
11
|
-
after_failed ->(encode) { encode.history << "PollingEncode ran after_failed" }
|
|
12
|
-
after_cancelled ->(encode) { encode.history << "PollingEncode ran after_cancelled" }
|
|
13
|
-
after_completed ->(encode) { encode.history << "PollingEncode ran after_completed" }
|
|
14
|
-
|
|
15
|
-
def history
|
|
16
|
-
@history ||= []
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
after do
|
|
22
|
-
Object.send(:remove_const, :PollingEncode)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
describe '#perform' do
|
|
26
|
-
subject { encode.history }
|
|
27
|
-
let(:encode) { PollingEncode.create("sample.mp4").tap { |encode| encode.state = state } }
|
|
28
|
-
let(:poll) { described_class.new }
|
|
29
|
-
|
|
30
|
-
before do
|
|
31
|
-
encode
|
|
32
|
-
clear_enqueued_jobs
|
|
33
|
-
poll.perform(encode)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
context "with job failed" do
|
|
37
|
-
let(:state) { :failed }
|
|
38
|
-
|
|
39
|
-
it "runs after_failed" do
|
|
40
|
-
is_expected.to include("PollingEncode ran after_status_update")
|
|
41
|
-
is_expected.to include("PollingEncode ran after_failed")
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it "does not re-enqueue itself" do
|
|
45
|
-
expect(described_class).not_to have_been_enqueued
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
context "with job cancelled" do
|
|
50
|
-
let(:state) { :cancelled }
|
|
51
|
-
|
|
52
|
-
it "runs after_cancelled" do
|
|
53
|
-
is_expected.to include("PollingEncode ran after_status_update")
|
|
54
|
-
is_expected.to include("PollingEncode ran after_cancelled")
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
it "does not re-enqueue itself" do
|
|
58
|
-
expect(described_class).not_to have_been_enqueued
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
context "with job completed" do
|
|
63
|
-
let(:state) { :completed }
|
|
64
|
-
|
|
65
|
-
it "runs after_completed" do
|
|
66
|
-
is_expected.to include("PollingEncode ran after_status_update")
|
|
67
|
-
is_expected.to include("PollingEncode ran after_completed")
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
it "does not re-enqueue itself" do
|
|
71
|
-
expect(described_class).not_to have_been_enqueued
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
context "with job running" do
|
|
76
|
-
let(:state) { :running }
|
|
77
|
-
|
|
78
|
-
it "runs after_status_update" do
|
|
79
|
-
is_expected.to include("PollingEncode ran after_status_update")
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
it "re-enqueues itself" do
|
|
83
|
-
expect(described_class).to have_been_enqueued.with(encode)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
end
|
data/spec/units/polling_spec.rb
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
require 'rails_helper'
|
|
3
|
-
|
|
4
|
-
describe ActiveEncode::Polling do
|
|
5
|
-
before do
|
|
6
|
-
class PollingEncode < ActiveEncode::Base
|
|
7
|
-
include ActiveEncode::Polling
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
after do
|
|
12
|
-
Object.send(:remove_const, :PollingEncode)
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
describe 'after_create' do
|
|
16
|
-
subject { PollingEncode.create("sample.mp4") }
|
|
17
|
-
|
|
18
|
-
it "enqueues a PollingJob" do
|
|
19
|
-
subject
|
|
20
|
-
expect(ActiveEncode::PollingJob).to have_been_enqueued.with(subject)
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|