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.
@@ -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
+