helix 0.0.2.0.pre → 0.0.2.1.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/helix/base.rb +6 -3
- data/lib/helix/config.rb +9 -8
- data/lib/helix/durationed_media.rb +46 -10
- data/lib/helix/track.rb +0 -20
- data/lib/helix/video.rb +24 -13
- data/spec/base_spec.rb +4 -4
- data/spec/config_spec.rb +32 -32
- data/spec/durationed_media_spec.rb +92 -0
- data/spec/track_spec.rb +1 -82
- data/spec/video_spec.rb +63 -61
- metadata +3 -2
data/lib/helix/base.rb
CHANGED
@@ -53,14 +53,14 @@ module Helix
|
|
53
53
|
#
|
54
54
|
# @param [Hash] opts a hash of options for parameters passed into the HTTP GET
|
55
55
|
# @return [Array] The array of instance objects for a class.
|
56
|
-
def self.find_all(opts)
|
56
|
+
def self.find_all(opts={})
|
57
57
|
data_sets = get_data_sets(opts)
|
58
58
|
return [] if data_sets.nil?
|
59
59
|
data_sets.map { |attrs| self.new(attributes: attrs, config: config) }
|
60
60
|
end
|
61
61
|
|
62
62
|
def self.get_data_sets(opts)
|
63
|
-
url = config.build_url(format: opts[:format] || :json,
|
63
|
+
url = config.build_url(format: opts[:format] || :json,
|
64
64
|
media_type: self.plural_media_type)
|
65
65
|
# We allow opts[:sig_type] for internal negative testing only.
|
66
66
|
raw_response = config.get_response(url, {sig_type: :view}.merge(opts))
|
@@ -162,8 +162,11 @@ module Helix
|
|
162
162
|
# @param [Hash] opts a hash of attributes to update the instance with.
|
163
163
|
# @return [Base] Returns an instance of the class after update.
|
164
164
|
def update(opts={})
|
165
|
+
RestClient.log = 'helix.log' if opts.delete(:log)
|
165
166
|
memo_cfg = config
|
166
|
-
url = memo_cfg.build_url(
|
167
|
+
url = memo_cfg.build_url(content_type: :xml,
|
168
|
+
guid: guid,
|
169
|
+
media_type: plural_media_type)
|
167
170
|
params = {signature: memo_cfg.signature(:update)}.merge(media_type_sym => opts)
|
168
171
|
RestClient.put(url, params)
|
169
172
|
self
|
data/lib/helix/config.rb
CHANGED
@@ -46,11 +46,12 @@ module Helix
|
|
46
46
|
# @param [Hash] opts a hash of options for building URL additions
|
47
47
|
# @return [String] The full RESTful URL string object
|
48
48
|
def add_sub_urls(base_url, opts)
|
49
|
-
guid, action = [:guid, :action].map { |sub| opts[sub] }
|
49
|
+
guid, action, format = [:guid, :action, :formats].map { |sub| opts[sub] }
|
50
50
|
url = "#{base_url}/#{opts[:media_type]}"
|
51
|
-
url += "/#{guid}"
|
52
|
-
url += "/#{
|
53
|
-
"
|
51
|
+
url += "/#{guid}" if guid
|
52
|
+
url += "/formats/#{format}" if format
|
53
|
+
url += "/#{action}" if action
|
54
|
+
"#{url}.#{opts[:content_type]}"
|
54
55
|
end
|
55
56
|
|
56
57
|
# Creates a full RESTful URL to be used for HTTP requests.
|
@@ -58,10 +59,10 @@ module Helix
|
|
58
59
|
# @param [Hash] opts a hash of options for building URL
|
59
60
|
# @return [String] The full RESTful URL string object
|
60
61
|
def build_url(opts={})
|
61
|
-
opts[:
|
62
|
-
opts[:media_type]
|
63
|
-
base_url
|
64
|
-
url
|
62
|
+
opts[:content_type] ||= :json
|
63
|
+
opts[:media_type] ||= :videos
|
64
|
+
base_url = get_base_url(opts)
|
65
|
+
url = add_sub_urls(base_url, opts)
|
65
66
|
end
|
66
67
|
|
67
68
|
def clear_signatures!
|
@@ -4,14 +4,25 @@ module Helix
|
|
4
4
|
|
5
5
|
module ClassMethods
|
6
6
|
|
7
|
-
#
|
8
|
-
#
|
7
|
+
# Used to import tracks from a URL into the Twistage system.
|
8
|
+
# Doc reference: /doc/api/track/import
|
9
|
+
# Doc reference: /doc/api/video/import
|
9
10
|
#
|
10
|
-
# @
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
# @example
|
12
|
+
# track = Helix::Track.import(src: "www.google.com/track.mp4",
|
13
|
+
# title: "Some Title,
|
14
|
+
# description: "A random track.")
|
15
|
+
# new_track.track_id # => dd891b83ba39e
|
16
|
+
#
|
17
|
+
# video = Helix::Video.import(src: "www.google.com/video.mp4",
|
18
|
+
# title: "Some Title,
|
19
|
+
# description: "A random video.")
|
20
|
+
# new_video.video_id # => dd891b83ba39e
|
21
|
+
#
|
22
|
+
# @param [Hash] attrs The attributes for creating a track.
|
23
|
+
# @return [RestClient] The response object.
|
24
|
+
def import(attrs={})
|
25
|
+
rest_post(:create_many, attrs)
|
15
26
|
end
|
16
27
|
|
17
28
|
private
|
@@ -32,8 +43,9 @@ module Helix
|
|
32
43
|
# Gets the url used in the create_many import call.
|
33
44
|
#
|
34
45
|
# @return [String] Returns the valid url used for the API call.
|
35
|
-
def
|
36
|
-
|
46
|
+
def get_url_for(api_call, opts)
|
47
|
+
url_opts = url_opts_for(opts[:formats])[api_call].merge(opts)
|
48
|
+
Helix::Config.instance.build_url(url_opts)
|
37
49
|
end
|
38
50
|
|
39
51
|
# Method allows for :use_raw_xml to be passed into attributes.
|
@@ -45,9 +57,33 @@ module Helix
|
|
45
57
|
# @return [String] Returns xml either from a raw entry or generated from attributes.
|
46
58
|
def get_xml(attrs={})
|
47
59
|
return attrs[:use_raw_xml] if attrs[:use_raw_xml].present?
|
48
|
-
|
60
|
+
xml_opts = {root: :add }
|
61
|
+
{ list: { entry: attrs[:url_params] || {} } }.to_xml(xml_opts)
|
62
|
+
end
|
63
|
+
|
64
|
+
def rest_post(api_call, attrs)
|
65
|
+
RestClient.log = 'helix.log' if attrs.delete(:log)
|
66
|
+
content_type = url_opts_for[api_call][:content_type]
|
67
|
+
content_type_hash = { content_type: "text/#{content_type}" }
|
68
|
+
RestClient.post(get_url_for(api_call, attrs),
|
69
|
+
get_xml(attrs),
|
70
|
+
get_params(attrs).merge(content_type_hash))
|
49
71
|
end
|
50
72
|
|
73
|
+
# Standard hash values used to generate the create_many
|
74
|
+
# url.
|
75
|
+
#
|
76
|
+
# @return [Hash]
|
77
|
+
def url_opts_for(format=nil)
|
78
|
+
{ slice: { action: :slice,
|
79
|
+
media_type: plural_media_type,
|
80
|
+
content_type: :xml,
|
81
|
+
formats: format },
|
82
|
+
create_many: { action: :create_many,
|
83
|
+
media_type: plural_media_type,
|
84
|
+
content_type: :xml }
|
85
|
+
}
|
86
|
+
end
|
51
87
|
end
|
52
88
|
|
53
89
|
def self.included(klass); klass.extend(ClassMethods); end
|
data/lib/helix/track.rb
CHANGED
@@ -13,25 +13,5 @@ module Helix
|
|
13
13
|
#
|
14
14
|
# @return [Symbol] Name of the class.
|
15
15
|
def self.media_type_sym; :track; end
|
16
|
-
|
17
|
-
# Used to import tracks from a URL into the Twistage system.
|
18
|
-
# Doc reference: /doc/api/track/import
|
19
|
-
#
|
20
|
-
# @example
|
21
|
-
# track = Helix::Track.import(src: "www.google.com/track.mp4",
|
22
|
-
# title: "Some Title,
|
23
|
-
# description: "A random track.")
|
24
|
-
# new_track.track_id # => dd891b83ba39e
|
25
|
-
#
|
26
|
-
# @param [Hash] attrs The attributes for creating a track.
|
27
|
-
# @return [RestClient] The response object.
|
28
|
-
def self.import(attrs={})
|
29
|
-
#TODO: Pull shared logic (with video) into a shared lib file.
|
30
|
-
RestClient.post(get_url,
|
31
|
-
get_xml(attrs),
|
32
|
-
get_params(attrs))
|
33
|
-
end
|
34
|
-
|
35
16
|
end
|
36
|
-
|
37
17
|
end
|
data/lib/helix/video.rb
CHANGED
@@ -17,23 +17,34 @@ module Helix
|
|
17
17
|
# @return [Symbol] Name of the class.
|
18
18
|
def self.media_type_sym; :video; end
|
19
19
|
|
20
|
-
|
21
|
-
|
20
|
+
def self.slice(attrs={})
|
21
|
+
rest_post(:slice, attrs)
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
# Used to retrieve a stillframe for a video by using
|
26
|
+
# the video guid.
|
22
27
|
#
|
23
28
|
# @example
|
24
|
-
#
|
25
|
-
#
|
26
|
-
# description: "A random video.")
|
27
|
-
# new_video.video_id # => dd891b83ba39e
|
29
|
+
# sf_data = Helix::Video.get_stillframe("239c59483d346") #=> xDC\xF1?\xE9*?\xFF\xD9
|
30
|
+
# File.open("original.jpg", "w") { |f| f.puts sf_data }
|
28
31
|
#
|
29
|
-
# @param [
|
30
|
-
# @
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
32
|
+
# @param [String] guid is the string containing the guid for the video.
|
33
|
+
# @param [Hash] opts a hash of options for building URL
|
34
|
+
# @return [String] Stillframe jpg data, save it to a file with extension .jpg.
|
35
|
+
def self.get_stillframe(guid, opts={})
|
36
|
+
RestClient.log = 'helix.log' if opts.delete(:log)
|
37
|
+
server = opts[:server] || config.credentials[:server] || "service-staging"
|
38
|
+
width = opts[:width].to_s + "w" unless opts[:width].nil?
|
39
|
+
height = opts[:height].to_s + "h" unless opts[:height].nil?
|
40
|
+
width = "original" if opts[:width].nil? && opts[:height].nil?
|
41
|
+
url = "#{server}.twistage.com/videos/#{guid}/screenshots/"
|
42
|
+
url << "#{width.to_s}#{height.to_s}.jpg"
|
43
|
+
RestClient.get(url)
|
35
44
|
end
|
36
45
|
|
46
|
+
def stillframe(opts={})
|
47
|
+
self.class.get_stillframe(self.guid, opts)
|
48
|
+
end
|
37
49
|
end
|
38
|
-
|
39
50
|
end
|
data/spec/base_spec.rb
CHANGED
@@ -101,14 +101,14 @@ describe Helix::Base do
|
|
101
101
|
let(:meth) { :find_all }
|
102
102
|
let(:mock_config) { mock(Helix::Config, build_url: :built_url, get_response: {}) }
|
103
103
|
subject { klass.method(meth) }
|
104
|
-
its(:arity) { should eq(1) }
|
104
|
+
its(:arity) { should eq(-1) }
|
105
105
|
before(:each) do Helix::Config.stub(:instance) { mock_config } end
|
106
106
|
context "when given a config instances and an opts Hash" do
|
107
107
|
let(:opts) { {opts_key1: :opts_val1} }
|
108
108
|
let(:plural_media_type) { :videos }
|
109
109
|
before(:each) do klass.stub(:plural_media_type) { plural_media_type } end
|
110
110
|
it "should build a JSON URL -> the_url" do
|
111
|
-
mock_config.should_receive(:build_url).with(format: :json,
|
111
|
+
mock_config.should_receive(:build_url).with(format: :json,
|
112
112
|
media_type: plural_media_type)
|
113
113
|
klass.send(meth, opts)
|
114
114
|
end
|
@@ -319,8 +319,8 @@ describe Helix::Base do
|
|
319
319
|
mock_config.stub(:build_url) { :expected_url }
|
320
320
|
end
|
321
321
|
shared_examples_for "builds URL for update" do
|
322
|
-
it "should build_url(
|
323
|
-
mock_config.should_receive(:build_url).with(
|
322
|
+
it "should build_url(content_type: :xml, guid: guid, media_type: plural_media_type)" do
|
323
|
+
mock_config.should_receive(:build_url).with(content_type: :xml, guid: :the_guid, media_type: :the_media_type)
|
324
324
|
RestClient.stub(:put)
|
325
325
|
obj.send(meth)
|
326
326
|
end
|
data/spec/config_spec.rb
CHANGED
@@ -103,13 +103,13 @@ describe Helix::Config do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
-
def build_test_url(site, sub_url, guid, action, media_type,
|
106
|
+
def build_test_url(site, sub_url, guid, action, media_type, content_type)
|
107
107
|
expected_url = site
|
108
108
|
expected_url += sub_url unless guid || action == :create_many
|
109
109
|
expected_url += "/#{media_type}"
|
110
110
|
expected_url += "/the_guid" if guid
|
111
111
|
expected_url += "/#{action}" if action
|
112
|
-
expected_url += ".#{
|
112
|
+
expected_url += ".#{content_type}"
|
113
113
|
end
|
114
114
|
|
115
115
|
describe "#build_url" do
|
@@ -118,12 +118,12 @@ describe Helix::Config do
|
|
118
118
|
subject { obj.method(meth) }
|
119
119
|
its(:arity) { should be(-1) }
|
120
120
|
before(:each) do obj.credentials = { site: site } end
|
121
|
-
shared_examples_for "reads scope from credentials for build_url" do |media_type,
|
121
|
+
shared_examples_for "reads scope from credentials for build_url" do |media_type,content_type,more_opts|
|
122
122
|
let(:opts) { more_opts || {} }
|
123
|
-
let(:action) { opts[:action] }
|
124
|
-
let(:guid) { opts[:guid] }
|
125
|
-
let(:url_pieces) { [site, sub_url, guid, action, media_type,
|
126
|
-
let(:expected_url) { build_test_url(*url_pieces) }
|
123
|
+
let(:action) { opts[:action] }
|
124
|
+
let(:guid) { opts[:guid] }
|
125
|
+
let(:url_pieces) { [site, sub_url, guid, action, media_type, content_type] }
|
126
|
+
let(:expected_url) { build_test_url(*url_pieces) }
|
127
127
|
before(:each) do obj.credentials = {site: 'http://example.com'} end
|
128
128
|
context "and credentials has a key for :reseller" do
|
129
129
|
before(:each) do obj.credentials.merge!(reseller: 're_id') end
|
@@ -201,39 +201,39 @@ describe Helix::Config do
|
|
201
201
|
it_behaves_like "reads scope from credentials for build_url", media_type, :json, {guid: :the_guid, action: :the_action}
|
202
202
|
end
|
203
203
|
end
|
204
|
-
[ :json, :xml ].each do |
|
205
|
-
context "when given opts[:
|
206
|
-
subject { obj.send(meth,
|
207
|
-
it_behaves_like "reads scope from credentials for build_url", :videos,
|
204
|
+
[ :json, :xml ].each do |content_type|
|
205
|
+
context "when given opts[:content_type] of :#{content_type}" do
|
206
|
+
subject { obj.send(meth, content_type: content_type) }
|
207
|
+
it_behaves_like "reads scope from credentials for build_url", :videos, content_type
|
208
208
|
end
|
209
|
-
context "when given opts[:
|
210
|
-
subject { obj.send(meth,
|
211
|
-
it_behaves_like "reads scope from credentials for build_url", :videos,
|
209
|
+
context "when given opts[:content_type] of :#{content_type} and opts[:guid] of :the_guid" do
|
210
|
+
subject { obj.send(meth, content_type: content_type, guid: :the_guid) }
|
211
|
+
it_behaves_like "reads scope from credentials for build_url", :videos, content_type, {guid: :the_guid}
|
212
212
|
end
|
213
|
-
context "when given opts[:
|
214
|
-
subject { obj.send(meth,
|
215
|
-
it_behaves_like "reads scope from credentials for build_url", :videos,
|
213
|
+
context "when given opts[:content_type] of :#{content_type} and opts[:action] of :the_action" do
|
214
|
+
subject { obj.send(meth, content_type: content_type, action: :the_action) }
|
215
|
+
it_behaves_like "reads scope from credentials for build_url", :videos, content_type, {action: :the_action}
|
216
216
|
end
|
217
|
-
context "when given opts[:
|
218
|
-
subject { obj.send(meth,
|
219
|
-
it_behaves_like "reads scope from credentials for build_url", :videos,
|
217
|
+
context "when given opts[:content_type] of :#{content_type}, opts[:guid] of :the_guid, and opts[:action] of :the_action" do
|
218
|
+
subject { obj.send(meth, content_type: content_type, guid: :the_guid, action: :the_action) }
|
219
|
+
it_behaves_like "reads scope from credentials for build_url", :videos, content_type, {guid: :the_guid, action: :the_action}
|
220
220
|
end
|
221
221
|
[ :videos, :tracks ].each do |media_type|
|
222
|
-
context "when given opts[:
|
223
|
-
subject { obj.send(meth,
|
224
|
-
it_behaves_like "reads scope from credentials for build_url", media_type,
|
222
|
+
context "when given opts[:content_type] of :#{content_type} and opts[:media_type] of :#{media_type}" do
|
223
|
+
subject { obj.send(meth, content_type: content_type, media_type: media_type) }
|
224
|
+
it_behaves_like "reads scope from credentials for build_url", media_type, content_type
|
225
225
|
end
|
226
|
-
context "when given opts[:
|
227
|
-
subject { obj.send(meth,
|
228
|
-
it_behaves_like "reads scope from credentials for build_url", media_type,
|
226
|
+
context "when given opts[:content_type] of :#{content_type}, opts[:guid] of :the_guid, and opts[:media_type] of :#{media_type}" do
|
227
|
+
subject { obj.send(meth, content_type: content_type, guid: :the_guid, media_type: media_type) }
|
228
|
+
it_behaves_like "reads scope from credentials for build_url", media_type, content_type, {guid: :the_guid}
|
229
229
|
end
|
230
|
-
context "when given opts[:
|
231
|
-
subject { obj.send(meth,
|
232
|
-
it_behaves_like "reads scope from credentials for build_url", media_type,
|
230
|
+
context "when given opts[:content_type] of :#{content_type}, opts[:action] of :the_action, and opts[:media_type] of :#{media_type}" do
|
231
|
+
subject { obj.send(meth, content_type: content_type, action: :the_action, media_type: media_type) }
|
232
|
+
it_behaves_like "reads scope from credentials for build_url", media_type, content_type, {action: :the_action}
|
233
233
|
end
|
234
|
-
context "when given opts[:
|
235
|
-
subject { obj.send(meth,
|
236
|
-
it_behaves_like "reads scope from credentials for build_url", media_type,
|
234
|
+
context "when given opts[:content_type] of :#{content_type}, opts[:guid] of :the_guid, opts[:action] of :the_action, and opts[:media_type] of :#{media_type}" do
|
235
|
+
subject { obj.send(meth, content_type: content_type, guid: :the_guid, action: :the_action, media_type: media_type) }
|
236
|
+
it_behaves_like "reads scope from credentials for build_url", media_type, content_type, {guid: :the_guid, action: :the_action}
|
237
237
|
end
|
238
238
|
end
|
239
239
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'helix'
|
3
|
+
|
4
|
+
describe Helix::DurationedMedia do
|
5
|
+
|
6
|
+
def import_xml(values={})
|
7
|
+
{ list: { entry: values[:url_params] || {} } }.to_xml(root: :add)
|
8
|
+
end
|
9
|
+
|
10
|
+
klasses = [ Helix::Video, Helix::Track ]
|
11
|
+
klasses.each do |klass|
|
12
|
+
subject { klass }
|
13
|
+
its(:ancestors) { should include(Helix::Base) }
|
14
|
+
|
15
|
+
describe "Constants"
|
16
|
+
|
17
|
+
let(:sig_opts) { { contributor: :helix,
|
18
|
+
library_id: :development } }
|
19
|
+
url_opts = { action: :create_many,
|
20
|
+
media_type: klass.send(:plural_media_type),
|
21
|
+
content_type: :xml }
|
22
|
+
|
23
|
+
describe ".import" do
|
24
|
+
let(:meth) { :import }
|
25
|
+
let(:mock_config) { mock(Helix::Config) }
|
26
|
+
subject { klass.method(meth) }
|
27
|
+
its(:arity) { should eq(-1) }
|
28
|
+
let(:params) { { params: { signature: :some_sig },
|
29
|
+
content_type: "text/xml" } }
|
30
|
+
before { Helix::Config.stub(:instance) { mock_config } }
|
31
|
+
|
32
|
+
it "should get an ingest signature" do
|
33
|
+
mock_config.should_receive(:build_url).with(url_opts)
|
34
|
+
mock_config.should_receive(:signature).with(:ingest, sig_opts) { :some_sig }
|
35
|
+
RestClient.should_receive(:post).with(nil, import_xml, params)
|
36
|
+
klass.send(meth)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe ".get_xml" do
|
41
|
+
let(:meth) { :get_xml }
|
42
|
+
subject { klass.method(meth) }
|
43
|
+
its(:arity) { should eq(-1) }
|
44
|
+
context "when :use_raw_xml is present in attrs" do
|
45
|
+
let(:use_raw_xml) { { use_raw_xml: :xml } }
|
46
|
+
it "should return the value of attrs[:use_raw_xml]" do
|
47
|
+
expect(klass.send(meth, use_raw_xml)).to eq(:xml)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
context "when hash is passed without :use_raw_xml" do
|
51
|
+
let(:attrs) { { url_params: { attribute: :value } } }
|
52
|
+
it "should convert attrs into xml" do
|
53
|
+
expect(klass.send(meth, attrs)).to eq(import_xml(attrs))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
context "when nothing in passed in" do
|
57
|
+
it "should return valid xml" do
|
58
|
+
expect(klass.send(meth)).to eq(import_xml)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe ".url_opts_for" do
|
64
|
+
let(:meth) { :url_opts_for }
|
65
|
+
subject { klass.method(meth) }
|
66
|
+
its(:arity) { should eq(-1) }
|
67
|
+
it "should return a valid hash url options for Helix::Config#build_url" do
|
68
|
+
expect(klass.send(meth)[:create_many]).to eq(url_opts)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe ".get_url_for" do
|
73
|
+
let(:meth) { :get_url_for }
|
74
|
+
subject { klass.method(meth) }
|
75
|
+
its(:arity) { should eq(2) }
|
76
|
+
it "should call Helix::Config#build_url with url opts" do
|
77
|
+
Helix::Config.instance.should_receive(:build_url).with(klass.send(:url_opts_for)[:create_many])
|
78
|
+
klass.send(meth, :create_many, {})
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe ".get_params" do
|
83
|
+
let(:meth) { :get_params }
|
84
|
+
subject { klass.method(meth) }
|
85
|
+
its(:arity) { should eq(-1) }
|
86
|
+
it "should call Helix::Config#signature and return a hash of params" do
|
87
|
+
Helix::Config.instance.should_receive(:signature).with(:ingest, sig_opts) { :sig }
|
88
|
+
expect(klass.send(meth)).to eq({ params: { signature: :sig } })
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/spec/track_spec.rb
CHANGED
@@ -3,98 +3,17 @@ require 'helix'
|
|
3
3
|
|
4
4
|
describe Helix::Track do
|
5
5
|
|
6
|
-
|
7
|
-
{ list: { entry: values } }.to_xml(root: :add)
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:klass) { Helix::Track }
|
11
|
-
|
6
|
+
let(:klass) { Helix::Track }
|
12
7
|
subject { klass }
|
13
|
-
its(:ancestors) { should include(Helix::Base) }
|
14
8
|
its(:guid_name) { should eq('track_id') }
|
15
9
|
its(:media_type_sym) { should be(:track) }
|
16
10
|
its(:plural_media_type) { should eq('tracks') }
|
17
11
|
|
18
12
|
describe "Constants"
|
19
13
|
|
20
|
-
let(:sig_opts) { { contributor: :helix,
|
21
|
-
library_id: :development } }
|
22
|
-
let(:url_opts) { { action: :create_many,
|
23
|
-
media_type: "tracks",
|
24
|
-
format: :xml } }
|
25
|
-
|
26
14
|
describe "an instance" do
|
27
15
|
let(:obj) { klass.new({'track_id' => 'some_track_guid'}) }
|
28
16
|
subject { obj }
|
29
17
|
its(:media_type_sym) { should be(:track) }
|
30
18
|
end
|
31
|
-
|
32
|
-
describe ".import" do
|
33
|
-
let(:meth) { :import }
|
34
|
-
let(:mock_config) { mock(Helix::Config) }
|
35
|
-
subject { klass.method(meth) }
|
36
|
-
its(:arity) { should eq(-1) }
|
37
|
-
let(:params) { { params: { signature: :some_sig } } }
|
38
|
-
before { Helix::Config.stub(:instance) { mock_config } }
|
39
|
-
|
40
|
-
it "should get an ingest signature" do
|
41
|
-
mock_config.should_receive(:build_url).with(url_opts)
|
42
|
-
mock_config.should_receive(:signature).with(:ingest, sig_opts) { :some_sig }
|
43
|
-
RestClient.should_receive(:post).with(nil, import_xml, params)
|
44
|
-
klass.send(meth)
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
describe ".get_xml" do
|
49
|
-
let(:meth) { :get_xml }
|
50
|
-
subject { klass.method(meth) }
|
51
|
-
its(:arity) { should eq(-1) }
|
52
|
-
context "when :use_raw_xml is present in attrs" do
|
53
|
-
let(:use_raw_xml) { { use_raw_xml: :xml } }
|
54
|
-
it "should return the value of attrs[:use_raw_xml]" do
|
55
|
-
expect(klass.send(meth, use_raw_xml)).to eq(:xml)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
context "when hash is passed without :use_raw_xml" do
|
59
|
-
let(:attrs) { { attribute: :value } }
|
60
|
-
it "should convert attrs into xml" do
|
61
|
-
expect(klass.send(meth, attrs)).to eq(import_xml(attrs))
|
62
|
-
end
|
63
|
-
end
|
64
|
-
context "when nothing in passed in" do
|
65
|
-
it "should return valid xml" do
|
66
|
-
expect(klass.send(meth)).to eq(import_xml)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
describe ".get_url_opts" do
|
72
|
-
let(:meth) { :get_url_opts }
|
73
|
-
subject { klass.method(meth) }
|
74
|
-
its(:arity) { should eq(0) }
|
75
|
-
it "should return a valid hash url options for Helix::Config#build_url" do
|
76
|
-
expect(klass.send(meth)).to eq(url_opts)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe ".get_url" do
|
81
|
-
let(:meth) { :get_url }
|
82
|
-
subject { klass.method(meth) }
|
83
|
-
its(:arity) { should eq(0) }
|
84
|
-
it "should call Helix::Config#build_url with url opts" do
|
85
|
-
Helix::Config.instance.should_receive(:build_url).with(klass.send(:get_url_opts))
|
86
|
-
klass.send(meth)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe ".get_params" do
|
91
|
-
let(:meth) { :get_params }
|
92
|
-
subject { klass.method(meth) }
|
93
|
-
its(:arity) { should eq(-1) }
|
94
|
-
it "should call Helix::Config#signature and return a hash of params" do
|
95
|
-
Helix::Config.instance.should_receive(:signature).with(:ingest, sig_opts) { :sig }
|
96
|
-
expect(klass.send(meth)).to eq({ params: { signature: :sig } })
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
19
|
end
|
data/spec/video_spec.rb
CHANGED
@@ -4,96 +4,98 @@ require 'helix'
|
|
4
4
|
describe Helix::Video do
|
5
5
|
|
6
6
|
def import_xml(values={})
|
7
|
-
{ list: { entry: values } }.to_xml(root: :add)
|
7
|
+
{ list: { entry: values[:url_params] || {} } }.to_xml(root: :add)
|
8
8
|
end
|
9
9
|
|
10
|
-
let(:klass)
|
11
|
-
|
10
|
+
let(:klass) { Helix::Video }
|
12
11
|
subject { klass }
|
13
|
-
its(:ancestors) { should include(Helix::Base) }
|
14
12
|
its(:guid_name) { should eq('video_id') }
|
15
13
|
its(:media_type_sym) { should be(:video) }
|
16
14
|
its(:plural_media_type) { should eq('videos') }
|
17
15
|
|
18
16
|
describe "Constants"
|
19
17
|
|
20
|
-
|
21
|
-
library_id: :development } }
|
22
|
-
let(:url_opts) { { action: :create_many,
|
23
|
-
media_type: "videos",
|
24
|
-
format: :xml } }
|
18
|
+
### INSTANCE METHODS
|
25
19
|
|
26
20
|
describe "an instance" do
|
27
|
-
let(:obj)
|
28
|
-
subject
|
29
|
-
its(:media_type_sym)
|
21
|
+
let(:obj) { klass.new({video_id: 'some_video_guid'}) }
|
22
|
+
subject { obj }
|
23
|
+
its(:media_type_sym) { should be(:video) }
|
24
|
+
describe "#stillframe" do
|
25
|
+
let(:meth) { :stillframe }
|
26
|
+
let(:mock_config) { mock(Helix::Config) }
|
27
|
+
subject { obj.method(meth) }
|
28
|
+
its(:arity) { should eq(-1) }
|
29
|
+
it "should call self.class.get_stillframe" do
|
30
|
+
obj.stub!(:guid).and_return :some_guid
|
31
|
+
klass.should_receive(:get_stillframe)
|
32
|
+
obj.send(meth)
|
33
|
+
end
|
34
|
+
end
|
30
35
|
end
|
31
36
|
|
32
|
-
|
33
|
-
|
37
|
+
### CLASS METHODS
|
38
|
+
|
39
|
+
describe ".slice" do
|
40
|
+
let(:meth) { :slice }
|
34
41
|
let(:mock_config) { mock(Helix::Config) }
|
35
42
|
subject { klass.method(meth) }
|
36
43
|
its(:arity) { should eq(-1) }
|
37
|
-
let(:params) { { params:
|
38
|
-
|
44
|
+
let(:params) { { params: { signature: :some_sig },
|
45
|
+
content_type: "text/xml" } }
|
46
|
+
let(:url_opts) { { action: :slice,
|
47
|
+
media_type: "videos",
|
48
|
+
content_type: :xml,
|
49
|
+
formats: :some_format } }
|
50
|
+
let(:sig_opts) { { contributor: :helix,
|
51
|
+
library_id: :development,
|
52
|
+
formats: :some_format } }
|
53
|
+
before { Helix::Config.stub(:instance) { mock_config } }
|
39
54
|
|
40
55
|
it "should get an ingest signature" do
|
41
56
|
mock_config.should_receive(:build_url).with(url_opts)
|
42
57
|
mock_config.should_receive(:signature).with(:ingest, sig_opts) { :some_sig }
|
43
58
|
RestClient.should_receive(:post).with(nil, import_xml, params)
|
44
|
-
klass.send(meth)
|
59
|
+
klass.send(meth, {formats: :some_format})
|
45
60
|
end
|
46
61
|
end
|
47
62
|
|
48
|
-
describe ".
|
49
|
-
let(:meth)
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
63
|
+
describe ".get_stillframe" do
|
64
|
+
let(:meth) { :get_stillframe }
|
65
|
+
let(:mock_config) { mock(Helix::Config) }
|
66
|
+
subject { klass.method(meth) }
|
67
|
+
its(:arity) { should eq(-2) }
|
68
|
+
let(:image_data) { :some_image_data }
|
69
|
+
let(:guid) { :some_guid }
|
70
|
+
let(:server) { "service-staging" }
|
71
|
+
let(:base_url) { "#{server}.twistage.com/videos/#{guid}/screenshots/" }
|
72
|
+
context "when no height or width is passed in " do
|
73
|
+
let(:full_url) { "#{base_url}original.jpg" }
|
74
|
+
it "should build the correct url and return data" do
|
75
|
+
RestClient.should_receive(:get).with(full_url).and_return image_data
|
76
|
+
expect(klass.send(meth, guid)).to eq(image_data)
|
56
77
|
end
|
57
78
|
end
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
79
|
+
[:height, :width].each do |dimension|
|
80
|
+
context "when #{dimension} is passed in" do
|
81
|
+
url_tag = (dimension == :height ? "h" : "w")
|
82
|
+
let(:dim_val) { 100 }
|
83
|
+
let(:full_url) { "#{base_url}#{dim_val}#{url_tag}.jpg" }
|
84
|
+
let(:opts) { { dimension => dim_val } }
|
85
|
+
it "should build the correct url and return data" do
|
86
|
+
RestClient.should_receive(:get).with(full_url).and_return image_data
|
87
|
+
expect(klass.send(meth, guid, opts)).to eq(image_data)
|
88
|
+
end
|
62
89
|
end
|
63
90
|
end
|
64
|
-
context "when
|
65
|
-
|
66
|
-
|
91
|
+
context "when both height and width are passed in" do
|
92
|
+
let(:dim_val) { 100 }
|
93
|
+
let(:full_url) { "#{base_url}#{dim_val}w#{dim_val}h.jpg" }
|
94
|
+
let(:opts) { { height: dim_val, width: dim_val } }
|
95
|
+
it "should build the correct url and return data" do
|
96
|
+
RestClient.should_receive(:get).with(full_url).and_return image_data
|
97
|
+
expect(klass.send(meth, guid, opts)).to eq(image_data)
|
67
98
|
end
|
68
99
|
end
|
69
100
|
end
|
70
|
-
|
71
|
-
describe ".get_url_opts" do
|
72
|
-
let(:meth) { :get_url_opts }
|
73
|
-
subject { klass.method(meth) }
|
74
|
-
its(:arity) { should eq(0) }
|
75
|
-
it "should return a valid hash url options for Helix::Config#build_url" do
|
76
|
-
expect(klass.send(meth)).to eq(url_opts)
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
describe ".get_url" do
|
81
|
-
let(:meth) { :get_url }
|
82
|
-
subject { klass.method(meth) }
|
83
|
-
its(:arity) { should eq(0) }
|
84
|
-
it "should call Helix::Config#build_url with url opts" do
|
85
|
-
Helix::Config.instance.should_receive(:build_url).with(klass.send(:get_url_opts))
|
86
|
-
klass.send(meth)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe ".get_params" do
|
91
|
-
let(:meth) { :get_params }
|
92
|
-
subject { klass.method(meth) }
|
93
|
-
its(:arity) { should eq(-1) }
|
94
|
-
it "should call Helix::Config#signature and return a hash of params" do
|
95
|
-
Helix::Config.instance.should_receive(:signature).with(:ingest, sig_opts) { :sig }
|
96
|
-
expect(klass.send(meth)).to eq({ params: { signature: :sig } })
|
97
|
-
end
|
98
|
-
end
|
99
101
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: helix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.2.
|
4
|
+
version: 0.0.2.1.pre
|
5
5
|
prerelease: 8
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-01-
|
12
|
+
date: 2013-01-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- spec/album_spec.rb
|
83
83
|
- spec/track_spec.rb
|
84
84
|
- spec/base_spec.rb
|
85
|
+
- spec/durationed_media_spec.rb
|
85
86
|
- LICENSE
|
86
87
|
- README.md
|
87
88
|
homepage: https://github.com/Twistage/helix/
|