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.
@@ -1,6 +1,6 @@
1
1
  require 'helix/restful'
2
2
  require 'helix/uploadable'
3
- require 'helix/durationed_media'
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.
@@ -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 = config
137
- url = memo_cfg.build_url(content_type: :json, guid: self.guid, resource_label: plural_resource_label)
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)
@@ -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.clone
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
- @response = RestClient.get(url, params: params)
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/
@@ -1,6 +1,6 @@
1
1
  module Helix
2
2
 
3
- module DurationedMedia
3
+ module Durationed
4
4
 
5
5
  module ClassMethods
6
6
 
@@ -1,4 +1,5 @@
1
1
  require 'helix/base'
2
2
  module Helix
3
3
  class NoConfigurationLoaded < StandardError ; end
4
+ class NetworkError < StandardError ; end
4
5
  end
@@ -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
@@ -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
@@ -4,7 +4,7 @@ module Helix
4
4
 
5
5
  class Track < Media
6
6
 
7
- include DurationedMedia
7
+ include Durationed
8
8
 
9
9
  # The class name, to be used by supporting classes. Such as Config which uses
10
10
  # this method as a way to build URLs.
@@ -4,7 +4,7 @@ module Helix
4
4
 
5
5
  class Video < Media
6
6
 
7
- include DurationedMedia
7
+ include Durationed
8
8
 
9
9
  # The class name, to be used by supporting classes. Such as Config which uses
10
10
  # this method as a way to build URLs.
@@ -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
@@ -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
@@ -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
- it "should clone the options arg" do
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
- it "should clone the options arg" do
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
- it "should clone the options arg" do
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::DurationedMedia do
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::DurationedMedia, Helix::Media ]
13
+ mods = [ Helix::Base, Helix::Durationed, Helix::Media ]
14
14
  mods.each { |mod| its(:ancestors) { should include(mod) } }
15
15
 
16
16
  describe "Constants"
@@ -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(1) }
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
@@ -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
@@ -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::DurationedMedia, Helix::Media ]
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) }
@@ -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::DurationedMedia, Helix::Media ]
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
- date: 2013-06-18 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
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
- version_requirements: !ruby/object:Gem::Requirement
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
- version_requirements: !ruby/object:Gem::Requirement
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
- version_requirements: !ruby/object:Gem::Requirement
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
- files:
55
+
56
+ files:
68
57
  - lib/helix.rb
69
- - lib/helix/album.rb
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/durationed_media.rb
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
- - spec/album_spec.rb
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/playlist_spec.rb
101
- - spec/spec_helper.rb
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
- require_paths:
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: '0'
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.25
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
+