active_encode 0.1.1 → 0.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/.gitignore +1 -0
- data/.travis.yml +3 -2
- data/Gemfile +35 -0
- data/README.md +15 -14
- data/Rakefile +5 -10
- data/active_encode.gemspec +8 -5
- data/app/jobs/active_encode/polling_job.rb +20 -0
- data/app/models/active_encode/encode_record.rb +5 -0
- data/db/migrate/20180822021048_create_active_encode_encode_records.rb +13 -0
- data/lib/active_encode.rb +1 -0
- data/lib/active_encode/base.rb +6 -2
- data/lib/active_encode/callbacks.rb +18 -35
- data/lib/active_encode/core.rb +64 -20
- data/lib/active_encode/engine.rb +7 -0
- data/lib/active_encode/engine_adapter.rb +2 -2
- data/lib/active_encode/engine_adapters/active_job_adapter.rb +7 -3
- data/lib/active_encode/engine_adapters/elastic_transcoder_adapter.rb +15 -15
- data/lib/active_encode/engine_adapters/inline_adapter.rb +6 -1
- data/lib/active_encode/engine_adapters/matterhorn_adapter.rb +18 -18
- data/lib/active_encode/engine_adapters/shingoncoder_adapter.rb +13 -9
- data/lib/active_encode/engine_adapters/test_adapter.rb +19 -12
- data/lib/active_encode/engine_adapters/zencoder_adapter.rb +10 -10
- data/lib/active_encode/global_id.rb +16 -0
- data/lib/active_encode/input.rb +9 -0
- data/lib/active_encode/output.rb +9 -0
- data/lib/active_encode/persistence.rb +45 -0
- data/lib/active_encode/polling.rb +24 -0
- data/lib/active_encode/status.rb +2 -6
- data/lib/active_encode/technical_metadata.rb +16 -1
- data/lib/active_encode/version.rb +1 -1
- data/spec/fixtures/elastic_transcoder/job_canceled.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_completed.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_created.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_failed.json +1 -1
- data/spec/fixtures/elastic_transcoder/job_progressing.json +1 -1
- data/spec/integration/elastic_transcoder_adapter_spec.rb +87 -167
- data/spec/integration/matterhorn_adapter_spec.rb +34 -79
- data/spec/integration/shingoncoder_adapter_spec.rb +1 -1
- data/spec/integration/zencoder_adapter_spec.rb +1 -1
- data/spec/rails_helper.rb +22 -0
- data/spec/shared_specs/engine_adapter_specs.rb +124 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +15 -0
- data/spec/units/callbacks_spec.rb +16 -17
- data/spec/units/core_spec.rb +121 -2
- data/spec/units/engine_adapter_spec.rb +0 -12
- data/spec/units/global_id_spec.rb +49 -0
- data/spec/units/input_spec.rb +12 -0
- data/spec/units/output_spec.rb +12 -0
- data/spec/units/persistence_spec.rb +57 -0
- data/spec/units/polling_job_spec.rb +86 -0
- data/spec/units/polling_spec.rb +22 -0
- data/spec/units/status_spec.rb +21 -2
- metadata +89 -20
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveEncode::Input do
|
4
|
+
subject { described_class.new }
|
5
|
+
|
6
|
+
describe 'attributes' do
|
7
|
+
it { is_expected.to respond_to(:id, :url) }
|
8
|
+
it { is_expected.to respond_to(:state, :errors, :created_at, :updated_at) }
|
9
|
+
it { is_expected.to respond_to(:width, :height, :frame_rate, :checksum,
|
10
|
+
:audio_codec, :video_codec, :audio_bitrate, :video_bitrate) }
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveEncode::Output do
|
4
|
+
subject { described_class.new }
|
5
|
+
|
6
|
+
describe 'attributes' do
|
7
|
+
it { is_expected.to respond_to(:id, :url) }
|
8
|
+
it { is_expected.to respond_to(:state, :errors, :created_at, :updated_at) }
|
9
|
+
it { is_expected.to respond_to(:width, :height, :frame_rate, :checksum,
|
10
|
+
:audio_codec, :video_codec, :audio_bitrate, :video_bitrate) }
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe ActiveEncode::Persistence, db_clean: true do
|
4
|
+
before do
|
5
|
+
class CustomEncode < ActiveEncode::Base
|
6
|
+
include ActiveEncode::Persistence
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
Object.send(:remove_const, :CustomEncode)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'find' do
|
15
|
+
let(:encode) { CustomEncode.create(nil) }
|
16
|
+
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
17
|
+
|
18
|
+
it 'persists changes on find' do
|
19
|
+
expect { CustomEncode.find(encode.id) }.to change { subject.reload.updated_at }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe 'create' do
|
24
|
+
let(:encode) { CustomEncode.create(nil) }
|
25
|
+
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
26
|
+
|
27
|
+
it 'creates a record' do
|
28
|
+
expect { encode }.to change { ActiveEncode::EncodeRecord.count }.by(1)
|
29
|
+
end
|
30
|
+
|
31
|
+
its(:global_id) { is_expected.to eq encode.to_global_id.to_s }
|
32
|
+
its(:state) { is_expected.to eq encode.state.to_s }
|
33
|
+
its(:adapter) { is_expected.to eq encode.class.engine_adapter.class.name }
|
34
|
+
its(:title) { is_expected.to eq encode.input.url.to_s }
|
35
|
+
its(:raw_object) { is_expected.to eq encode.to_json }
|
36
|
+
its(:created_at) { is_expected.to be_within(1.second).of encode.created_at }
|
37
|
+
its(:updated_at) { is_expected.to be_within(1.second).of encode.updated_at }
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'cancel' do
|
41
|
+
let(:encode) { CustomEncode.create(nil) }
|
42
|
+
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
43
|
+
|
44
|
+
it 'persists changes on cancel' do
|
45
|
+
expect { encode.cancel! }.to change { subject.reload.state }.from("running").to("cancelled")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe 'reload' do
|
50
|
+
let(:encode) { CustomEncode.create(nil) }
|
51
|
+
subject { ActiveEncode::EncodeRecord.find_by(global_id: encode.to_global_id.to_s) }
|
52
|
+
|
53
|
+
it 'persists changes on reload' do
|
54
|
+
expect { encode.reload }.to change { subject.reload.updated_at }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe ActiveEncode::PollingJob do
|
4
|
+
include ActiveJob::TestHelper
|
5
|
+
|
6
|
+
before do
|
7
|
+
class PollingEncode < ActiveEncode::Base
|
8
|
+
include ActiveEncode::Polling
|
9
|
+
after_status_update ->(encode) { encode.history << "PollingEncode ran after_status_update" }
|
10
|
+
after_error ->(encode) { encode.history << "PollingEncode ran after_error" }
|
11
|
+
after_cancelled ->(encode) { encode.history << "PollingEncode ran after_cancelled" }
|
12
|
+
after_complete ->(encode) { encode.history << "PollingEncode ran after_complete" }
|
13
|
+
|
14
|
+
def history
|
15
|
+
@history ||= []
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
Object.send(:remove_const, :PollingEncode)
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#perform' do
|
25
|
+
let(:encode) { PollingEncode.create("sample.mp4").tap { |encode| encode.state = state } }
|
26
|
+
let(:poll) { ActiveEncode::PollingJob.new }
|
27
|
+
subject { encode.history }
|
28
|
+
|
29
|
+
before do
|
30
|
+
encode
|
31
|
+
clear_enqueued_jobs
|
32
|
+
poll.perform(encode)
|
33
|
+
end
|
34
|
+
|
35
|
+
context "with job in error" do
|
36
|
+
let(:state) { :error }
|
37
|
+
|
38
|
+
it "runs after_error" do
|
39
|
+
is_expected.to include("PollingEncode ran after_status_update")
|
40
|
+
is_expected.to include("PollingEncode ran after_error")
|
41
|
+
end
|
42
|
+
|
43
|
+
it "does not re-enqueue itself" do
|
44
|
+
expect(ActiveEncode::PollingJob).not_to have_been_enqueued
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "with job cancelled" do
|
49
|
+
let(:state) { :cancelled }
|
50
|
+
|
51
|
+
it "runs after_cancelled" do
|
52
|
+
is_expected.to include("PollingEncode ran after_status_update")
|
53
|
+
is_expected.to include("PollingEncode ran after_cancelled")
|
54
|
+
end
|
55
|
+
|
56
|
+
it "does not re-enqueue itself" do
|
57
|
+
expect(ActiveEncode::PollingJob).not_to have_been_enqueued
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with job complete" do
|
62
|
+
let(:state) { :complete }
|
63
|
+
|
64
|
+
it "runs after_complete" do
|
65
|
+
is_expected.to include("PollingEncode ran after_status_update")
|
66
|
+
is_expected.to include("PollingEncode ran after_complete")
|
67
|
+
end
|
68
|
+
|
69
|
+
it "does not re-enqueue itself" do
|
70
|
+
expect(ActiveEncode::PollingJob).not_to have_been_enqueued
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "with job running" do
|
75
|
+
let(:state) { :running }
|
76
|
+
|
77
|
+
it "runs after_status_update" do
|
78
|
+
is_expected.to include("PollingEncode ran after_status_update")
|
79
|
+
end
|
80
|
+
|
81
|
+
it "re-enqueues itself" do
|
82
|
+
expect(ActiveEncode::PollingJob).to have_been_enqueued.with(encode)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'rails_helper'
|
2
|
+
|
3
|
+
describe ActiveEncode::Polling do
|
4
|
+
before do
|
5
|
+
class PollingEncode < ActiveEncode::Base
|
6
|
+
include ActiveEncode::Polling
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
after do
|
11
|
+
Object.send(:remove_const, :PollingEncode)
|
12
|
+
end
|
13
|
+
|
14
|
+
describe 'after_create' do
|
15
|
+
subject { PollingEncode.create("sample.mp4") }
|
16
|
+
|
17
|
+
it "enqueues a PollingJob" do
|
18
|
+
subject
|
19
|
+
expect(ActiveEncode::PollingJob).to have_been_enqueued.with(subject)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/spec/units/status_spec.rb
CHANGED
@@ -1,10 +1,29 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveEncode::Status do
|
4
|
-
|
4
|
+
before do
|
5
|
+
class CustomEncode < ActiveEncode::Base
|
6
|
+
end
|
7
|
+
end
|
8
|
+
after do
|
9
|
+
Object.send(:remove_const, :CustomEncode)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:encode_class) { ActiveEncode::Base }
|
13
|
+
|
14
|
+
subject { encode_class.new(nil) }
|
15
|
+
|
16
|
+
describe 'attributes' do
|
17
|
+
it { is_expected.to respond_to(:state, :errors, :created_at, :updated_at) }
|
18
|
+
|
19
|
+
context 'with an ActiveEncode::Base subclass' do
|
20
|
+
let(:encode_class) { CustomEncode }
|
21
|
+
|
22
|
+
it { is_expected.to respond_to(:state, :errors, :created_at, :updated_at) }
|
23
|
+
end
|
24
|
+
end
|
5
25
|
|
6
26
|
context 'new object' do
|
7
|
-
subject { ActiveEncode::Base.new(nil) }
|
8
27
|
it { is_expected.not_to be_created }
|
9
28
|
it { is_expected.not_to be_running }
|
10
29
|
it { is_expected.not_to be_cancelled }
|
metadata
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_encode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.2'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Klein, Chris Colvard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-09-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -28,16 +28,16 @@ dependencies:
|
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: coveralls
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,48 +52,90 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: database_cleaner
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: engine_cart
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rake
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
|
-
- - "
|
87
|
+
- - ">="
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
89
|
+
version: '0'
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
|
-
- - "
|
94
|
+
- - ">="
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rspec
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
|
-
- - "
|
101
|
+
- - ">="
|
74
102
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
103
|
+
version: '0'
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- - "
|
108
|
+
- - ">="
|
81
109
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
110
|
+
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rspec-its
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- - "
|
115
|
+
- - ">="
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: '
|
117
|
+
version: '0'
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- - "
|
122
|
+
- - ">="
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: '
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rspec-rails
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
97
139
|
description: This gem serves as the basis for the interface between a Ruby (Rails)
|
98
140
|
application and a provider of transcoding services such as Opencast Matterhorn,
|
99
141
|
Zencoder, and Amazon Elastic Transcoder.
|
@@ -113,10 +155,14 @@ files:
|
|
113
155
|
- README.md
|
114
156
|
- Rakefile
|
115
157
|
- active_encode.gemspec
|
158
|
+
- app/jobs/active_encode/polling_job.rb
|
159
|
+
- app/models/active_encode/encode_record.rb
|
160
|
+
- db/migrate/20180822021048_create_active_encode_encode_records.rb
|
116
161
|
- lib/active_encode.rb
|
117
162
|
- lib/active_encode/base.rb
|
118
163
|
- lib/active_encode/callbacks.rb
|
119
164
|
- lib/active_encode/core.rb
|
165
|
+
- lib/active_encode/engine.rb
|
120
166
|
- lib/active_encode/engine_adapter.rb
|
121
167
|
- lib/active_encode/engine_adapters.rb
|
122
168
|
- lib/active_encode/engine_adapters/active_job_adapter.rb
|
@@ -126,6 +172,11 @@ files:
|
|
126
172
|
- lib/active_encode/engine_adapters/shingoncoder_adapter.rb
|
127
173
|
- lib/active_encode/engine_adapters/test_adapter.rb
|
128
174
|
- lib/active_encode/engine_adapters/zencoder_adapter.rb
|
175
|
+
- lib/active_encode/global_id.rb
|
176
|
+
- lib/active_encode/input.rb
|
177
|
+
- lib/active_encode/output.rb
|
178
|
+
- lib/active_encode/persistence.rb
|
179
|
+
- lib/active_encode/polling.rb
|
129
180
|
- lib/active_encode/status.rb
|
130
181
|
- lib/active_encode/technical_metadata.rb
|
131
182
|
- lib/active_encode/version.rb
|
@@ -167,10 +218,19 @@ files:
|
|
167
218
|
- spec/integration/matterhorn_adapter_spec.rb
|
168
219
|
- spec/integration/shingoncoder_adapter_spec.rb
|
169
220
|
- spec/integration/zencoder_adapter_spec.rb
|
221
|
+
- spec/rails_helper.rb
|
222
|
+
- spec/shared_specs/engine_adapter_specs.rb
|
170
223
|
- spec/spec_helper.rb
|
224
|
+
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
171
225
|
- spec/units/callbacks_spec.rb
|
172
226
|
- spec/units/core_spec.rb
|
173
227
|
- spec/units/engine_adapter_spec.rb
|
228
|
+
- spec/units/global_id_spec.rb
|
229
|
+
- spec/units/input_spec.rb
|
230
|
+
- spec/units/output_spec.rb
|
231
|
+
- spec/units/persistence_spec.rb
|
232
|
+
- spec/units/polling_job_spec.rb
|
233
|
+
- spec/units/polling_spec.rb
|
174
234
|
- spec/units/status_spec.rb
|
175
235
|
homepage: ''
|
176
236
|
licenses:
|
@@ -192,7 +252,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
192
252
|
version: '0'
|
193
253
|
requirements: []
|
194
254
|
rubyforge_project:
|
195
|
-
rubygems_version: 2.
|
255
|
+
rubygems_version: 2.6.14
|
196
256
|
signing_key:
|
197
257
|
specification_version: 4
|
198
258
|
summary: Declare encode job classes that can be run by a variety of encoding services
|
@@ -235,8 +295,17 @@ test_files:
|
|
235
295
|
- spec/integration/matterhorn_adapter_spec.rb
|
236
296
|
- spec/integration/shingoncoder_adapter_spec.rb
|
237
297
|
- spec/integration/zencoder_adapter_spec.rb
|
298
|
+
- spec/rails_helper.rb
|
299
|
+
- spec/shared_specs/engine_adapter_specs.rb
|
238
300
|
- spec/spec_helper.rb
|
301
|
+
- spec/test_app_templates/lib/generators/test_app_generator.rb
|
239
302
|
- spec/units/callbacks_spec.rb
|
240
303
|
- spec/units/core_spec.rb
|
241
304
|
- spec/units/engine_adapter_spec.rb
|
305
|
+
- spec/units/global_id_spec.rb
|
306
|
+
- spec/units/input_spec.rb
|
307
|
+
- spec/units/output_spec.rb
|
308
|
+
- spec/units/persistence_spec.rb
|
309
|
+
- spec/units/polling_job_spec.rb
|
310
|
+
- spec/units/polling_spec.rb
|
242
311
|
- spec/units/status_spec.rb
|