helix 0.0.3.7.pre → 0.0.3.9.pre
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/lib/helix.rb +2 -1
- data/lib/helix/base.rb +3 -2
- data/lib/helix/config.rb +15 -2
- data/lib/helix/{durationed_media.rb → durationed.rb} +1 -1
- data/lib/helix/exceptions.rb +1 -0
- data/lib/helix/playlist.rb +15 -2
- data/lib/helix/restful.rb +2 -2
- data/lib/helix/track.rb +1 -1
- data/lib/helix/video.rb +1 -1
- data/spec/_integration_spec.rb +111 -0
- data/spec/base_spec.rb +1 -1
- data/spec/config_spec.rb +37 -12
- data/spec/{durationed_media_spec.rb → durationed_spec.rb} +2 -2
- data/spec/media_spec.rb +14 -2
- data/spec/playlist_spec.rb +34 -0
- data/spec/track_spec.rb +1 -1
- data/spec/video_spec.rb +1 -1
- metadata +72 -79
data/lib/helix.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'helix/restful'
|
2
2
|
require 'helix/uploadable'
|
3
|
-
require 'helix/
|
3
|
+
require 'helix/durationed'
|
4
4
|
require 'helix/video'
|
5
5
|
require 'helix/track'
|
6
6
|
require 'helix/tag'
|
@@ -11,6 +11,7 @@ require 'helix/config'
|
|
11
11
|
require 'helix/statistics'
|
12
12
|
require 'helix/library'
|
13
13
|
require 'helix/user'
|
14
|
+
require 'helix/playlist'
|
14
15
|
|
15
16
|
# Pulled from active_support
|
16
17
|
# This solves the active_support collision discussed in issue 19 on GitHub.
|
data/lib/helix/base.rb
CHANGED
@@ -133,8 +133,9 @@ module Helix
|
|
133
133
|
# @param [Hash] opts a hash of attributes to update the instance with.
|
134
134
|
# @return [Base] Returns an instance of the class.
|
135
135
|
def load(opts={})
|
136
|
-
memo_cfg
|
137
|
-
|
136
|
+
memo_cfg = config
|
137
|
+
base_url_opts = {content_type: (opts[:content_type] || :json)}
|
138
|
+
url = memo_cfg.build_url(base_url_opts.merge(guid: self.guid, resource_label: plural_resource_label))
|
138
139
|
# We allow opts[:sig_type] for internal negative testing only.
|
139
140
|
raw_attrs = memo_cfg.get_response(url, {sig_type: :view}.merge(opts))
|
140
141
|
@attributes = massage_raw_attrs(raw_attrs)
|
data/lib/helix/config.rb
CHANGED
@@ -117,10 +117,14 @@ module Helix
|
|
117
117
|
# @param [Hash] original_opts a hash of options for building URL additions
|
118
118
|
# @return [String] The full RESTful URL string object
|
119
119
|
def get_response(url, original_opts={})
|
120
|
-
opts = original_opts
|
120
|
+
opts = massage_custom_fields_in(original_opts)
|
121
121
|
sig_type = opts.delete(:sig_type)
|
122
122
|
params = opts.merge(signature: signature(sig_type, opts))
|
123
|
-
|
123
|
+
begin
|
124
|
+
@response = RestClient.get(url, params: params)
|
125
|
+
rescue RestClient::InternalServerError => e
|
126
|
+
raise NetworkError, "Unable to access url #{url} with params #{params}"
|
127
|
+
end
|
124
128
|
parse_response_by_url_format(@response, url)
|
125
129
|
end
|
126
130
|
|
@@ -182,6 +186,15 @@ module Helix
|
|
182
186
|
@credentials[:license_key]
|
183
187
|
end
|
184
188
|
|
189
|
+
def massage_custom_fields_in(opts)
|
190
|
+
return opts.clone unless opts.has_key?(:custom_fields)
|
191
|
+
cf_opts = opts.delete(:custom_fields)
|
192
|
+
cf_opts.inject(opts.clone) do |memo,pair|
|
193
|
+
k,v = pair
|
194
|
+
memo.merge("custom_fields[#{k}]" => v)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
185
198
|
def parse_response_by_url_format(response, url)
|
186
199
|
### FIXME: This is ugly. Clean it up.
|
187
200
|
if url =~ /json/
|
data/lib/helix/exceptions.rb
CHANGED
data/lib/helix/playlist.rb
CHANGED
@@ -2,7 +2,20 @@ require 'helix/media'
|
|
2
2
|
|
3
3
|
module Helix
|
4
4
|
|
5
|
-
class Playlist
|
5
|
+
class Playlist < Base
|
6
|
+
|
7
|
+
include RESTful
|
8
|
+
|
9
|
+
# The class name, to be used by supporting classes. Such as Config which uses
|
10
|
+
# this method as a way to build URLs.
|
11
|
+
#
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
# Helix::Playlist.resource_label_sym #=> :playlist
|
15
|
+
#
|
16
|
+
# @return [Symbol] Name of the class.
|
17
|
+
def self.resource_label_sym; :playlist; end
|
18
|
+
|
6
19
|
end
|
7
20
|
|
8
|
-
end
|
21
|
+
end
|
data/lib/helix/restful.rb
CHANGED
@@ -74,11 +74,11 @@ module Helix
|
|
74
74
|
#
|
75
75
|
# @param [String] guid an id in guid form.
|
76
76
|
# @return [Base] An instance of Helix::Base
|
77
|
-
def find(guid)
|
77
|
+
def find(guid, opts={})
|
78
78
|
raise ArgumentError.new("find requires a non-nil guid argument - received a nil argument.") if guid.nil?
|
79
79
|
raise Helix::NoConfigurationLoaded.new if config.nil?
|
80
80
|
item = self.new(attributes: { guid_name => guid }, config: config)
|
81
|
-
item.load
|
81
|
+
item.load(opts)
|
82
82
|
end
|
83
83
|
|
84
84
|
def build_url_opts
|
data/lib/helix/track.rb
CHANGED
data/lib/helix/video.rb
CHANGED
@@ -0,0 +1,111 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'helix'
|
3
|
+
|
4
|
+
config_filename = File.expand_path('../../config/staging.yml', __FILE__)
|
5
|
+
config = File.exists?(config_filename) ? Helix::Config.load(config_filename) : nil
|
6
|
+
|
7
|
+
if config.nil?
|
8
|
+
puts "No config, skipping integration specs"
|
9
|
+
elsif %w(1 t true).include?(ENV['SKIP_INTEGRATION'])
|
10
|
+
puts "Skipping integration specs due to user request"
|
11
|
+
else
|
12
|
+
|
13
|
+
media_by_id = {
|
14
|
+
album_id: Helix::Album,
|
15
|
+
document_id: Helix::Document,
|
16
|
+
image_id: Helix::Image,
|
17
|
+
playlist_id: Helix::Playlist,
|
18
|
+
track_id: Helix::Track,
|
19
|
+
video_id: Helix::Video
|
20
|
+
}
|
21
|
+
|
22
|
+
media_by_id.each do |guid_key,klass|
|
23
|
+
|
24
|
+
describe "Integration Specs for #{klass.to_s}" do
|
25
|
+
|
26
|
+
describe ".all" do
|
27
|
+
subject { klass.all }
|
28
|
+
it { should_not be_empty }
|
29
|
+
end
|
30
|
+
|
31
|
+
describe ".where(query: 'rest-client')" do
|
32
|
+
it "should not raise an exception" do
|
33
|
+
lambda { klass.where(query: 'rest-client') }.should_not raise_error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
unless guid_key == :album_id
|
38
|
+
describe ".where({custom_fields: {boole: 'true'}})" do
|
39
|
+
it "should not raise an exception" do
|
40
|
+
lambda { klass.where({custom_fields: {boole: 'true'}}) }.should_not raise_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
media_id = config.credentials[guid_key]
|
46
|
+
next if media_id.nil?
|
47
|
+
|
48
|
+
describe ".where(query: #{media_id}" do
|
49
|
+
subject { klass.where(query: media_id) }
|
50
|
+
it { should_not be_empty }
|
51
|
+
end
|
52
|
+
|
53
|
+
shared_examples_for "found #{klass}" do
|
54
|
+
it { should_not be_empty }
|
55
|
+
if klass == Helix::Playlist
|
56
|
+
# Playlist Metadata is just a wrapper for an Array of media items: no guid
|
57
|
+
its(guid_key) { should eq(nil) }
|
58
|
+
else
|
59
|
+
its(guid_key) { should eq(media_id) }
|
60
|
+
end
|
61
|
+
if guid_key == :video_id
|
62
|
+
describe "screenshots" do
|
63
|
+
expected_ss = {
|
64
|
+
"frame" => 141.4,
|
65
|
+
"content_type" => "image/jpeg",
|
66
|
+
"width" => 1280,
|
67
|
+
"height" => 720,
|
68
|
+
"size" => 260548,
|
69
|
+
"url" => "http://edited-yet-again-staging.twistage.com:80/videos/ece0d3fd03bf0/screenshots/original.jpg"
|
70
|
+
}
|
71
|
+
subject { item.screenshots.first }
|
72
|
+
it { should eq(expected_ss) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe ".find(media_id)" do
|
78
|
+
let(:item) { klass.find(media_id) }
|
79
|
+
subject { item }
|
80
|
+
it_behaves_like "found #{klass}"
|
81
|
+
end
|
82
|
+
[ :json, :xml ].each do |content_type|
|
83
|
+
describe ".find(media_id, content_type: #{content_type})" do
|
84
|
+
let(:item) { klass.find(media_id, content_type: content_type) }
|
85
|
+
subject { item }
|
86
|
+
it_behaves_like "found #{klass}"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
unless guid_key == :document_id # no Document stats yet
|
91
|
+
describe "Stats" do
|
92
|
+
media_type = guid_key.to_s.split(/_/).first
|
93
|
+
helix_stats = Helix::Statistics
|
94
|
+
%w(delivery ingest storage).each do |stats_type|
|
95
|
+
next if [:album_id, :image_id].include?(guid_key) and stats_type == 'ingest'
|
96
|
+
next if [:image_id].include?(guid_key) and stats_type == 'delivery'
|
97
|
+
it "should call stats" do
|
98
|
+
stats = helix_stats.send("#{media_type}_#{stats_type}")
|
99
|
+
puts "#{klass.to_s} #{stats_type} stats = #{stats.inspect}"
|
100
|
+
item_stats = helix_stats.send("#{media_type}_#{stats_type}", guid_key => media_id)
|
101
|
+
puts "#{klass.to_s} #{media_id} #{stats_type} stats = #{item_stats.inspect}"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
data/spec/base_spec.rb
CHANGED
@@ -167,7 +167,7 @@ describe Helix::Base do
|
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
|
-
klasses = [ Helix::Album, Helix::Image, Helix::Track, Helix::Video ]
|
170
|
+
klasses = [ Helix::Album, Helix::Image, Helix::Playlist, Helix::Track, Helix::Video ]
|
171
171
|
klasses.each do |klass|
|
172
172
|
|
173
173
|
describe "an instance of class #{klass.to_s}" do
|
data/spec/config_spec.rb
CHANGED
@@ -351,6 +351,26 @@ describe Helix::Config do
|
|
351
351
|
let(:meth) { :get_response }
|
352
352
|
subject { obj.method(meth) }
|
353
353
|
its(:arity) { should eq(-2) }
|
354
|
+
shared_examples_for "raises NetworkError" do
|
355
|
+
context "and RestClient.get raises a RestClient::InternalServerError exception" do
|
356
|
+
it "should raise a NetworkError" do
|
357
|
+
RestClient.should_receive(:get).and_raise(RestClient::InternalServerError)
|
358
|
+
expect(
|
359
|
+
lambda { obj.send(meth, url, opts) }
|
360
|
+
).to raise_error(Helix::NetworkError, %r[Unable to access url #{url} with params {])
|
361
|
+
end
|
362
|
+
end
|
363
|
+
end
|
364
|
+
shared_examples_for "clones and massages opts" do
|
365
|
+
it "should clone the options arg" do
|
366
|
+
opts.should_receive(:clone) { opts }
|
367
|
+
obj.send(meth, url, opts)
|
368
|
+
end
|
369
|
+
it "should massage_custom_fields_in(opts)" do
|
370
|
+
obj.should_receive(:massage_custom_fields_in).with(opts) { opts }
|
371
|
+
obj.send(meth, url, opts)
|
372
|
+
end
|
373
|
+
end
|
354
374
|
context "when given a url and options" do
|
355
375
|
let(:opts) { {sig_type: :the_sig_type, some_key: :some_value} }
|
356
376
|
let(:params) { { params: { signature: 'mock_sig', some_key: :some_value } } }
|
@@ -365,38 +385,32 @@ describe Helix::Config do
|
|
365
385
|
context "and the URL matches /json/" do
|
366
386
|
let(:url) { 'blah.json' }
|
367
387
|
before(:each) do RestClient.stub(:get).with(url, params) { returned_json } end
|
368
|
-
|
369
|
-
opts.should_receive(:clone) { opts }
|
370
|
-
obj.send(meth, url, opts)
|
371
|
-
end
|
388
|
+
it_behaves_like "clones and massages opts"
|
372
389
|
it "should call RestClient.get and return a hash from parsed JSON" do
|
373
390
|
RestClient.should_receive(:get).with(url, params) { returned_json }
|
374
391
|
expect(obj.send(meth, url, opts)).to eq(json_parsed)
|
375
392
|
end
|
393
|
+
it_behaves_like "raises NetworkError"
|
376
394
|
end
|
377
395
|
context "and the URL matches /xml/" do
|
378
396
|
let(:url) { 'blah.xml' }
|
379
397
|
before(:each) do RestClient.stub(:get).with(url, params) { returned_xml } end
|
380
|
-
|
381
|
-
opts.should_receive(:clone) { opts }
|
382
|
-
obj.send(meth, url, opts)
|
383
|
-
end
|
398
|
+
it_behaves_like "clones and massages opts"
|
384
399
|
it "should call RestClient.get and return a hash from parsed XML" do
|
385
400
|
RestClient.should_receive(:get).with(url, params) { returned_xml }
|
386
401
|
expect(obj.send(meth, url, opts)).to eq(xml_parsed)
|
387
402
|
end
|
403
|
+
it_behaves_like "raises NetworkError"
|
388
404
|
end
|
389
405
|
context "and the URL matches /csv/" do
|
390
406
|
let(:url) { 'blah.csv' }
|
391
407
|
before(:each) do RestClient.stub(:get).with(url, params) { returned_csv } end
|
392
|
-
|
393
|
-
opts.should_receive(:clone) { opts }
|
394
|
-
obj.send(meth, url, opts)
|
395
|
-
end
|
408
|
+
it_behaves_like "clones and massages opts"
|
396
409
|
it "should call RestClient.get and return the raw CSV response" do
|
397
410
|
RestClient.should_receive(:get).with(url, params) { returned_csv }
|
398
411
|
expect(obj.send(meth, url, opts)).to eq(returned_csv)
|
399
412
|
end
|
413
|
+
it_behaves_like "raises NetworkError"
|
400
414
|
end
|
401
415
|
context "and the URL matches none of /json/, /xml/, or /csv/" do
|
402
416
|
let(:url) { 'blah.yml' }
|
@@ -455,6 +469,17 @@ describe Helix::Config do
|
|
455
469
|
end
|
456
470
|
end
|
457
471
|
|
472
|
+
describe "#massage_custom_fields_in" do
|
473
|
+
let(:meth) { :massage_custom_fields_in }
|
474
|
+
subject { obj.method(meth) }
|
475
|
+
its(:arity) { should eq(1) }
|
476
|
+
opts = { k1: :v1, k2: :v2, custom_fields: {cfk1: :cfv1, cfk2: :cfv2} }
|
477
|
+
context "when given #{opts}" do
|
478
|
+
subject { obj.send(meth, opts) }
|
479
|
+
it { should eq({k1: :v1, k2: :v2, "custom_fields[cfk1]" => :cfv1, "custom_fields[cfk2]" => :cfv2}) }
|
480
|
+
end
|
481
|
+
end
|
482
|
+
|
458
483
|
describe "#prepare_signature_memoization" do
|
459
484
|
let(:meth) { :prepare_signature_memoization }
|
460
485
|
subject { obj.method(meth) }
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.expand_path('../spec_helper', __FILE__)
|
2
2
|
require 'helix'
|
3
3
|
|
4
|
-
describe Helix::
|
4
|
+
describe Helix::Durationed do
|
5
5
|
|
6
6
|
def import_xml(values={})
|
7
7
|
{ list: { entry: values[:url_params] || {} } }.to_xml(root: :add)
|
@@ -10,7 +10,7 @@ describe Helix::DurationedMedia do
|
|
10
10
|
klasses = [ Helix::Video, Helix::Track ]
|
11
11
|
klasses.each do |klass|
|
12
12
|
subject { klass }
|
13
|
-
mods = [ Helix::Base, Helix::
|
13
|
+
mods = [ Helix::Base, Helix::Durationed, Helix::Media ]
|
14
14
|
mods.each { |mod| its(:ancestors) { should include(mod) } }
|
15
15
|
|
16
16
|
describe "Constants"
|
data/spec/media_spec.rb
CHANGED
@@ -111,7 +111,7 @@ describe Helix::Media do
|
|
111
111
|
let(:mock_config) { mock(Helix::Config) }
|
112
112
|
let(:mock_obj) { mock(klass, :load => :output_of_load) }
|
113
113
|
subject { klass.method(meth) }
|
114
|
-
its(:arity) { should eq(
|
114
|
+
its(:arity) { should eq(-2) }
|
115
115
|
context "when a Helix:Config instance is absent" do
|
116
116
|
before(:each) do Helix::Config.stub(:instance) { nil } end
|
117
117
|
context "and given a guid" do
|
@@ -120,7 +120,7 @@ describe Helix::Media do
|
|
120
120
|
before(:each) do
|
121
121
|
klass.stub(:attributes) { mock_attrs }
|
122
122
|
klass.stub(:guid_name) { guid_name }
|
123
|
-
klass.stub(:new) { mock_obj
|
123
|
+
klass.stub(:new) { mock_obj }
|
124
124
|
end
|
125
125
|
context "and the guid is nil" do
|
126
126
|
it "should raise an ArgumentError complaining about a nil guid" do
|
@@ -162,6 +162,18 @@ describe Helix::Media do
|
|
162
162
|
mock_obj.should_receive(:load)
|
163
163
|
klass.send(meth, guid)
|
164
164
|
end
|
165
|
+
[ :json, :xml ].each do |content_type|
|
166
|
+
context "and also given an optional content_type of :#{content_type}" do
|
167
|
+
it "should instantiate with {attributes: guid_name => the_guid, config: config}" do
|
168
|
+
klass.should_receive(:new).with({attributes: {guid_name => guid}, config: mock_config})
|
169
|
+
klass.send(meth, guid, content_type: content_type)
|
170
|
+
end
|
171
|
+
it "should load(content_type: #{content_type}" do
|
172
|
+
mock_obj.should_receive(:load).with(content_type: content_type)
|
173
|
+
klass.send(meth, guid, content_type: content_type)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
165
177
|
end
|
166
178
|
end
|
167
179
|
end
|
data/spec/playlist_spec.rb
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'helix'
|
3
|
+
|
4
|
+
describe Helix::Playlist do
|
5
|
+
|
6
|
+
let(:klass) { Helix::Playlist }
|
7
|
+
subject { klass }
|
8
|
+
mods = [ Helix::Base, Helix::RESTful ]
|
9
|
+
mods.each { |mod| its(:ancestors) { should include(mod) } }
|
10
|
+
its(:guid_name) { should eq('playlist_id') }
|
11
|
+
its(:resource_label_sym) { should be(:playlist) }
|
12
|
+
its(:plural_resource_label) { should eq('playlists') }
|
13
|
+
[:find, :create, :all, :find_all, :where].each do |crud_call|
|
14
|
+
it { should respond_to(crud_call) }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "Constants"
|
18
|
+
|
19
|
+
### INSTANCE METHODS
|
20
|
+
|
21
|
+
describe "an instance" do
|
22
|
+
let(:obj) { klass.new({playlist_id: 'some_playlist_guid'}) }
|
23
|
+
subject { obj }
|
24
|
+
its(:resource_label_sym) { should be(:playlist) }
|
25
|
+
|
26
|
+
[:destroy, :update].each do |crud_call|
|
27
|
+
it { should respond_to(crud_call) }
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
### CLASS METHODS
|
33
|
+
|
34
|
+
end
|
data/spec/track_spec.rb
CHANGED
@@ -5,7 +5,7 @@ describe Helix::Track do
|
|
5
5
|
|
6
6
|
let(:klass) { Helix::Track }
|
7
7
|
subject { klass }
|
8
|
-
mods = [ Helix::Base, Helix::
|
8
|
+
mods = [ Helix::Base, Helix::Durationed, Helix::Media ]
|
9
9
|
mods.each { |mod| its(:ancestors) { should include(mod) } }
|
10
10
|
its(:guid_name) { should eq('track_id') }
|
11
11
|
its(:resource_label_sym) { should be(:track) }
|
data/spec/video_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe Helix::Video do
|
|
9
9
|
|
10
10
|
let(:klass) { Helix::Video }
|
11
11
|
subject { klass }
|
12
|
-
mods = [ Helix::Base, Helix::
|
12
|
+
mods = [ Helix::Base, Helix::Durationed, Helix::Media ]
|
13
13
|
mods.each { |mod| its(:ancestors) { should include(mod) } }
|
14
14
|
its(:guid_name) { should eq('video_id') }
|
15
15
|
its(:resource_label_sym) { should be(:video) }
|
metadata
CHANGED
@@ -1,135 +1,128 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: helix
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.3.7.pre
|
3
|
+
version: !ruby/object:Gem::Version
|
5
4
|
prerelease: 8
|
5
|
+
version: 0.0.3.9.pre
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Twistage, Inc
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
|
13
|
+
date: 2013-07-03 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
15
16
|
name: json
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 1.5.4
|
22
|
-
type: :runtime
|
23
17
|
prerelease: false
|
24
|
-
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
19
|
none: false
|
26
|
-
requirements:
|
27
|
-
- -
|
28
|
-
- !ruby/object:Gem::Version
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
29
23
|
version: 1.5.4
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: rest-client
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - '='
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 1.6.7
|
38
24
|
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rest-client
|
39
28
|
prerelease: false
|
40
|
-
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
30
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
31
|
+
requirements:
|
32
|
+
- - "="
|
33
|
+
- !ruby/object:Gem::Version
|
45
34
|
version: 1.6.7
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: nori
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - '='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.1.3
|
54
35
|
type: :runtime
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: nori
|
55
39
|
prerelease: false
|
56
|
-
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
41
|
none: false
|
58
|
-
requirements:
|
59
|
-
- -
|
60
|
-
- !ruby/object:Gem::Version
|
42
|
+
requirements:
|
43
|
+
- - "="
|
44
|
+
- !ruby/object:Gem::Version
|
61
45
|
version: 1.1.3
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id003
|
62
48
|
description: Provides helper libraries for Ruby access to the Twistage API
|
63
49
|
email: kevin.baird@perceptivesoftware.com, michael.wood@perceptivesoftware.com
|
64
50
|
executables: []
|
51
|
+
|
65
52
|
extensions: []
|
53
|
+
|
66
54
|
extra_rdoc_files: []
|
67
|
-
|
55
|
+
|
56
|
+
files:
|
68
57
|
- lib/helix.rb
|
69
|
-
- lib/helix/
|
70
|
-
- lib/helix/audio_playlist.rb
|
71
|
-
- lib/helix/base.rb
|
72
|
-
- lib/helix/config.rb
|
58
|
+
- lib/helix/user.rb
|
73
59
|
- lib/helix/document.rb
|
74
|
-
- lib/helix/
|
75
|
-
- lib/helix/exceptions.rb
|
76
|
-
- lib/helix/hash_ext.rb
|
77
|
-
- lib/helix/image.rb
|
78
|
-
- lib/helix/library.rb
|
60
|
+
- lib/helix/tag.rb
|
79
61
|
- lib/helix/media.rb
|
62
|
+
- lib/helix/statistics.rb
|
80
63
|
- lib/helix/object_ext.rb
|
64
|
+
- lib/helix/library.rb
|
65
|
+
- lib/helix/audio_playlist.rb
|
66
|
+
- lib/helix/uploadable.rb
|
67
|
+
- lib/helix/durationed.rb
|
81
68
|
- lib/helix/playlist.rb
|
82
69
|
- lib/helix/restful.rb
|
83
|
-
- lib/helix/statistics.rb
|
84
|
-
- lib/helix/tag.rb
|
85
|
-
- lib/helix/track.rb
|
86
|
-
- lib/helix/uploadable.rb
|
87
|
-
- lib/helix/user.rb
|
88
|
-
- lib/helix/video.rb
|
89
70
|
- lib/helix/video_playlist.rb
|
90
|
-
-
|
71
|
+
- lib/helix/config.rb
|
72
|
+
- lib/helix/video.rb
|
73
|
+
- lib/helix/track.rb
|
74
|
+
- lib/helix/base.rb
|
75
|
+
- lib/helix/image.rb
|
76
|
+
- lib/helix/album.rb
|
77
|
+
- lib/helix/exceptions.rb
|
78
|
+
- lib/helix/hash_ext.rb
|
79
|
+
- spec/spec_helper.rb
|
91
80
|
- spec/audio_playlist_spec.rb
|
92
|
-
- spec/base_spec.rb
|
93
81
|
- spec/config_spec.rb
|
94
|
-
- spec/document_spec.rb
|
95
|
-
- spec/durationed_media_spec.rb
|
96
|
-
- spec/helix_spec.rb
|
97
82
|
- spec/image_spec.rb
|
98
|
-
- spec/library_spec.rb
|
99
83
|
- spec/media_spec.rb
|
100
|
-
- spec/
|
101
|
-
- spec/
|
84
|
+
- spec/durationed_spec.rb
|
85
|
+
- spec/helix_spec.rb
|
86
|
+
- spec/document_spec.rb
|
87
|
+
- spec/album_spec.rb
|
102
88
|
- spec/statistics_spec.rb
|
89
|
+
- spec/_integration_spec.rb
|
103
90
|
- spec/tag_spec.rb
|
91
|
+
- spec/video_playlist_spec.rb
|
104
92
|
- spec/track_spec.rb
|
105
93
|
- spec/user_spec.rb
|
106
|
-
- spec/video_playlist_spec.rb
|
107
94
|
- spec/video_spec.rb
|
95
|
+
- spec/playlist_spec.rb
|
96
|
+
- spec/library_spec.rb
|
97
|
+
- spec/base_spec.rb
|
108
98
|
- LICENSE
|
109
99
|
- README.md
|
110
100
|
homepage: https://github.com/Twistage/helix/
|
111
|
-
licenses:
|
101
|
+
licenses:
|
112
102
|
- 3-Clause BSD
|
113
103
|
post_install_message:
|
114
104
|
rdoc_options: []
|
115
|
-
|
105
|
+
|
106
|
+
require_paths:
|
116
107
|
- lib
|
117
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
118
109
|
none: false
|
119
|
-
requirements:
|
120
|
-
- -
|
121
|
-
- !ruby/object:Gem::Version
|
122
|
-
version:
|
123
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
110
|
+
requirements:
|
111
|
+
- - ">="
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
version: "0"
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
115
|
none: false
|
125
|
-
requirements:
|
126
|
-
- -
|
127
|
-
- !ruby/object:Gem::Version
|
116
|
+
requirements:
|
117
|
+
- - ">"
|
118
|
+
- !ruby/object:Gem::Version
|
128
119
|
version: 1.3.1
|
129
120
|
requirements: []
|
121
|
+
|
130
122
|
rubyforge_project:
|
131
|
-
rubygems_version: 1.8.
|
123
|
+
rubygems_version: 1.8.11
|
132
124
|
signing_key:
|
133
125
|
specification_version: 3
|
134
126
|
summary: Wrapper library for the video API
|
135
127
|
test_files: []
|
128
|
+
|