helix 0.0.3.7.pre → 0.0.3.9.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|