helix 0.0.2.3.pre → 0.0.2.4.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/helix.rb +1 -0
- data/lib/helix/album.rb +2 -2
- data/lib/helix/base.rb +52 -65
- data/lib/helix/config.rb +15 -0
- data/lib/helix/exceptions.rb +4 -0
- data/lib/helix/image.rb +2 -2
- data/lib/helix/media.rb +68 -0
- data/lib/helix/tag.rb +18 -0
- data/lib/helix/track.rb +3 -1
- data/lib/helix/video.rb +2 -2
- data/spec/album_spec.rb +6 -0
- data/spec/base_spec.rb +98 -137
- data/spec/config_spec.rb +25 -2
- data/spec/image_spec.rb +6 -0
- data/spec/media_spec.rb +145 -0
- data/spec/tag_spec.rb +24 -0
- data/spec/track_spec.rb +6 -0
- data/spec/video_spec.rb +6 -0
- metadata +7 -2
data/lib/helix.rb
CHANGED
data/lib/helix/album.rb
CHANGED
data/lib/helix/base.rb
CHANGED
@@ -2,6 +2,7 @@ require 'rest-client'
|
|
2
2
|
require 'json'
|
3
3
|
require 'yaml'
|
4
4
|
require 'nori'
|
5
|
+
require 'time'
|
5
6
|
|
6
7
|
module Helix
|
7
8
|
class Base
|
@@ -13,38 +14,6 @@ module Helix
|
|
13
14
|
attr_accessor :attributes
|
14
15
|
attr_writer :config
|
15
16
|
|
16
|
-
# Creates a new record via API and then returns an instance of that record.
|
17
|
-
#
|
18
|
-
# Example is using Video class since Video inherits from Base. This won't
|
19
|
-
# normally be called as Helix::Base.create
|
20
|
-
#
|
21
|
-
# @example
|
22
|
-
# Helix::Album.create({title: "My new album"})
|
23
|
-
#
|
24
|
-
# @param [Hash] attributes a hash containing the attributes used in the create
|
25
|
-
# @return [Base] An instance of Helix::Base
|
26
|
-
def self.create(attributes={})
|
27
|
-
url = config.build_url(media_type: plural_media_type,
|
28
|
-
content_type: :xml)
|
29
|
-
response = RestClient.post(url, attributes.merge(signature: config.signature(:update)))
|
30
|
-
attrs = Hash.from_xml(response)
|
31
|
-
self.new(attributes: attrs[media_type_sym.to_s], config: config)
|
32
|
-
end
|
33
|
-
|
34
|
-
# Finds and returns a record in instance form for a class, through
|
35
|
-
# guid lookup.
|
36
|
-
#
|
37
|
-
# @example
|
38
|
-
# video_guid = "8e0701c142ab1"
|
39
|
-
# video = Helix::Video.find(video_guid)
|
40
|
-
#
|
41
|
-
# @param [String] guid an id in guid form.
|
42
|
-
# @return [Base] An instance of Helix::Base
|
43
|
-
def self.find(guid)
|
44
|
-
item = self.new(attributes: { guid_name => guid }, config: config)
|
45
|
-
item.load
|
46
|
-
end
|
47
|
-
|
48
17
|
# Fetches all accessible records, places them into instances, and returns
|
49
18
|
# them as an array.
|
50
19
|
#
|
@@ -56,9 +25,27 @@ module Helix
|
|
56
25
|
def self.find_all(opts={})
|
57
26
|
data_sets = get_data_sets(opts)
|
58
27
|
return [] if data_sets.nil?
|
59
|
-
data_sets.map { |attrs| self.new(attributes: attrs,
|
28
|
+
data_sets.map { |attrs| self.new( attributes: massage_attrs(attrs),
|
29
|
+
config: config) }
|
60
30
|
end
|
61
31
|
|
32
|
+
# (see .find_all)
|
33
|
+
def self.where(opts={})
|
34
|
+
find_all(opts)
|
35
|
+
end
|
36
|
+
|
37
|
+
# (see .find_all)
|
38
|
+
# @note this method takes no query options, unlike find_all
|
39
|
+
def self.all
|
40
|
+
find_all
|
41
|
+
end
|
42
|
+
|
43
|
+
# Does a GET call to the api and defaults to content_type xml and
|
44
|
+
# signature_type view.
|
45
|
+
#
|
46
|
+
#
|
47
|
+
# @param [Hash] opts a hash of options for parameters passed into the HTTP GET
|
48
|
+
# @return [Array] The array of attributes (for a model) in hash form.
|
62
49
|
def self.get_data_sets(opts)
|
63
50
|
url = config.build_url(content_type: opts[:content_type] || :xml,
|
64
51
|
media_type: self.plural_media_type)
|
@@ -96,27 +83,16 @@ module Helix
|
|
96
83
|
@config = opts[:config]
|
97
84
|
end
|
98
85
|
|
86
|
+
# Returns the singleton instance of the Helix::Config.
|
99
87
|
def self.config
|
100
88
|
Helix::Config.instance
|
101
89
|
end
|
102
90
|
|
91
|
+
# (see .config)
|
103
92
|
def config
|
104
93
|
@config ||= Helix::Config.instance
|
105
94
|
end
|
106
95
|
|
107
|
-
# Deletes the record of the Helix::Base instance.
|
108
|
-
#
|
109
|
-
# @example
|
110
|
-
# video = Helix::Video.create({title: "Some Title"})
|
111
|
-
# video.destroy
|
112
|
-
#
|
113
|
-
# @return [String] The response from the HTTP DELETE call.
|
114
|
-
def destroy
|
115
|
-
RestClient.log = 'helix.log'
|
116
|
-
url = config.build_url(content_type: :xml, guid: guid, media_type: plural_media_type)
|
117
|
-
RestClient.delete(url, params: {signature: config.signature(:update)})
|
118
|
-
end
|
119
|
-
|
120
96
|
# Creates a string that associates to the class id.
|
121
97
|
#
|
122
98
|
# @example
|
@@ -154,25 +130,6 @@ module Helix
|
|
154
130
|
end
|
155
131
|
end
|
156
132
|
|
157
|
-
# Updates instance and record with attributes passed in.
|
158
|
-
#
|
159
|
-
# @example
|
160
|
-
# video = Helix::Video.find(video_guid)
|
161
|
-
# video.update({title: "My new title"})
|
162
|
-
#
|
163
|
-
# @param [Hash] opts a hash of attributes to update the instance with.
|
164
|
-
# @return [Base] Returns an instance of the class after update.
|
165
|
-
def update(opts={})
|
166
|
-
RestClient.log = 'helix.log' if opts.delete(:log)
|
167
|
-
memo_cfg = config
|
168
|
-
url = memo_cfg.build_url(content_type: :xml,
|
169
|
-
guid: guid,
|
170
|
-
media_type: plural_media_type)
|
171
|
-
params = {signature: memo_cfg.signature(:update)}.merge(media_type_sym => opts)
|
172
|
-
RestClient.put(url, params)
|
173
|
-
self
|
174
|
-
end
|
175
|
-
|
176
133
|
private
|
177
134
|
|
178
135
|
def massage_raw_attrs(raw_attrs)
|
@@ -181,5 +138,35 @@ module Helix
|
|
181
138
|
proper_hash ? raw_attrs : raw_attrs.first
|
182
139
|
end
|
183
140
|
|
141
|
+
def self.massage_attrs(attrs)
|
142
|
+
return attrs unless attrs.is_a?(Hash)
|
143
|
+
Hash[massage_custom_field_attrs(massage_time_attrs(attrs)).sort]
|
144
|
+
end
|
145
|
+
|
146
|
+
def self.massage_time_attrs(attrs)
|
147
|
+
return attrs unless attrs.is_a?(Hash)
|
148
|
+
attrs.each do |key, val|
|
149
|
+
begin
|
150
|
+
if val.is_a?(String) && val =~ /(\d{4}-\d{2}-\d{2})/
|
151
|
+
attrs[key] = Time.parse(val)
|
152
|
+
end
|
153
|
+
rescue ArgumentError,RangeError;end
|
154
|
+
massage_time_attrs(val)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def self.massage_custom_field_attrs(attrs)
|
159
|
+
return attrs unless attrs.is_a?(Hash)
|
160
|
+
return attrs unless attrs["custom_fields"].is_a?(Hash)
|
161
|
+
attrs["custom_fields"].delete_if { |key, val| key.to_s =~ /^@/ }
|
162
|
+
cfs = []
|
163
|
+
attrs["custom_fields"].each do |key, val|
|
164
|
+
val.each do |val_val|
|
165
|
+
cfs << { "name" => key, "value" => val_val.to_s }
|
166
|
+
end
|
167
|
+
end
|
168
|
+
attrs.merge({'custom_fields' => cfs})
|
169
|
+
end
|
170
|
+
|
184
171
|
end
|
185
172
|
end
|
data/lib/helix/config.rb
CHANGED
@@ -36,6 +36,7 @@ module Helix
|
|
36
36
|
config.instance_variable_set(:@filename, yaml_file_location)
|
37
37
|
creds = YAML.load(File.open(yaml_file_location)).symbolize_keys
|
38
38
|
config.instance_variable_set(:@credentials, creds)
|
39
|
+
RestClient.proxy = config.proxy
|
39
40
|
config
|
40
41
|
end
|
41
42
|
|
@@ -117,6 +118,20 @@ module Helix
|
|
117
118
|
@signature_for[lk][sig_type] = RestClient.get(url_for(sig_type, opts))
|
118
119
|
end
|
119
120
|
|
121
|
+
def proxy
|
122
|
+
if @credentials[:proxy_uri]
|
123
|
+
protocol, uri = @credentials[:proxy_uri].split "://"
|
124
|
+
user, pass = @credentials[:proxy_username], @credentials[:proxy_password]
|
125
|
+
proxy_str = "#{protocol}://"
|
126
|
+
proxy_str += "#{user}:" if user
|
127
|
+
proxy_str += "#{pass}" if user && pass
|
128
|
+
proxy_str += '@' if user
|
129
|
+
proxy_str += "#{uri}"
|
130
|
+
elsif @credentials[:proxy_used] == true
|
131
|
+
ENV['http_proxy']
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
120
135
|
private
|
121
136
|
|
122
137
|
def error_message_for(sig_type)
|
data/lib/helix/image.rb
CHANGED
data/lib/helix/media.rb
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'helix/base'
|
2
|
+
|
3
|
+
module Helix
|
4
|
+
class Media < Base
|
5
|
+
# Creates a new record via API and then returns an instance of that record.
|
6
|
+
#
|
7
|
+
# Example is using Video class since Video inherits from Base. This won't
|
8
|
+
# normally be called as Helix::Base.create
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# Helix::Album.create({title: "My new album"})
|
12
|
+
#
|
13
|
+
# @param [Hash] attributes a hash containing the attributes used in the create
|
14
|
+
# @return [Base] An instance of Helix::Base
|
15
|
+
def self.create(attributes={})
|
16
|
+
url = config.build_url(media_type: plural_media_type,
|
17
|
+
content_type: :xml)
|
18
|
+
response = RestClient.post(url, attributes.merge(signature: config.signature(:update)))
|
19
|
+
attrs = Hash.from_xml(response)
|
20
|
+
self.new(attributes: attrs[media_type_sym.to_s], config: config)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Finds and returns a record in instance form for a class, through
|
24
|
+
# guid lookup.
|
25
|
+
#
|
26
|
+
# @example
|
27
|
+
# video_guid = "8e0701c142ab1"
|
28
|
+
# video = Helix::Video.find(video_guid)
|
29
|
+
#
|
30
|
+
# @param [String] guid an id in guid form.
|
31
|
+
# @return [Base] An instance of Helix::Base
|
32
|
+
def self.find(guid)
|
33
|
+
item = self.new(attributes: { guid_name => guid }, config: config)
|
34
|
+
item.load
|
35
|
+
end
|
36
|
+
|
37
|
+
# Deletes the record of the Helix::Base instance.
|
38
|
+
#
|
39
|
+
# @example
|
40
|
+
# video = Helix::Video.create({title: "Some Title"})
|
41
|
+
# video.destroy
|
42
|
+
#
|
43
|
+
# @return [String] The response from the HTTP DELETE call.
|
44
|
+
def destroy
|
45
|
+
url = config.build_url(content_type: :xml, guid: guid, media_type: plural_media_type)
|
46
|
+
RestClient.delete(url, params: {signature: config.signature(:update)})
|
47
|
+
end
|
48
|
+
|
49
|
+
# Updates instance and record with attributes passed in.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# video = Helix::Video.find(video_guid)
|
53
|
+
# video.update({title: "My new title"})
|
54
|
+
#
|
55
|
+
# @param [Hash] opts a hash of attributes to update the instance with.
|
56
|
+
# @return [Base] Returns an instance of the class after update.
|
57
|
+
def update(opts={})
|
58
|
+
RestClient.log = 'helix.log' if opts.delete(:log)
|
59
|
+
memo_cfg = config
|
60
|
+
url = memo_cfg.build_url(content_type: :xml,
|
61
|
+
guid: guid,
|
62
|
+
media_type: plural_media_type)
|
63
|
+
params = {signature: memo_cfg.signature(:update)}.merge(media_type_sym => opts)
|
64
|
+
RestClient.put(url, params)
|
65
|
+
self
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/lib/helix/tag.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'json'
|
3
|
+
require 'yaml'
|
4
|
+
require 'nori'
|
5
|
+
|
6
|
+
module Helix
|
7
|
+
class Tag < Base
|
8
|
+
# The class name, to be used by supporting classes. Such as Config which uses
|
9
|
+
# this method as a way to build URLs.
|
10
|
+
#
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# Helix::Tag.media_type_sym #=> :tag
|
14
|
+
#
|
15
|
+
# @return [Symbol] Name of the class.
|
16
|
+
def self.media_type_sym; :tag; end
|
17
|
+
end
|
18
|
+
end
|
data/lib/helix/track.rb
CHANGED
data/lib/helix/video.rb
CHANGED
data/spec/album_spec.rb
CHANGED
@@ -9,6 +9,9 @@ describe Helix::Album do
|
|
9
9
|
its(:guid_name) { should eq('album_id') }
|
10
10
|
its(:media_type_sym) { should be(:album) }
|
11
11
|
its(:plural_media_type) { should eq('albums') }
|
12
|
+
[:find, :create, :all, :find_all, :where].each do |crud_call|
|
13
|
+
it { should respond_to(crud_call) }
|
14
|
+
end
|
12
15
|
|
13
16
|
describe "Constants"
|
14
17
|
|
@@ -22,6 +25,9 @@ describe Helix::Album do
|
|
22
25
|
expect(lambda { obj.send(meth) }).to raise_error("Albums Update is not currently supported.")
|
23
26
|
end
|
24
27
|
end
|
28
|
+
[:destroy, :update].each do |crud_call|
|
29
|
+
it { should respond_to(crud_call) }
|
30
|
+
end
|
25
31
|
end
|
26
32
|
|
27
33
|
end
|
data/spec/base_spec.rb
CHANGED
@@ -34,80 +34,16 @@ describe Helix::Base do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
|
38
|
-
let(:
|
39
|
-
let(:mock_config) { mock(Helix::Config) }
|
37
|
+
shared_examples_for "a search all with opts" do
|
38
|
+
let(:mock_config) { mock(Helix::Config, build_url: :built_url, get_response: {}) }
|
40
39
|
subject { klass.method(meth) }
|
41
40
|
its(:arity) { should eq(-1) }
|
42
|
-
let(:klass_sym) { :klass }
|
43
|
-
let(:resp_value) { { klass_sym.to_s => { attribute: :value } } }
|
44
|
-
let(:resp_json) { "JSON" }
|
45
|
-
let(:params) { { signature: "some_sig" } }
|
46
|
-
let(:expected) { { attributes: { attribute: :value }, config: mock_config } }
|
47
|
-
before(:each) do
|
48
|
-
klass.stub(:plural_media_type) { :klasses }
|
49
|
-
klass.stub(:media_type_sym) { klass_sym }
|
50
|
-
mock_config.stub(:build_url).with(action: :create_many, media_type: :klasses) { :url }
|
51
|
-
mock_config.stub(:signature).with(:update) { "some_sig" }
|
52
|
-
Helix::Config.stub(:instance) { mock_config }
|
53
|
-
end
|
54
|
-
it "should get an ingest signature" do
|
55
|
-
mock_config.should_receive(:build_url).with(media_type: :klasses,
|
56
|
-
content_type: :xml)
|
57
|
-
RestClient.stub(:post).with(:url, params) { resp_json }
|
58
|
-
Hash.should_receive(:from_xml).with(resp_json) { resp_value }
|
59
|
-
klass.stub(:new).with(expected)
|
60
|
-
mock_config.should_receive(:signature).with(:update) { "some_sig" }
|
61
|
-
klass.send(meth)
|
62
|
-
end
|
63
|
-
it "should do an HTTP post call, parse response and call new" do
|
64
|
-
mock_config.should_receive(:build_url).with(media_type: :klasses,
|
65
|
-
content_type: :xml)
|
66
|
-
RestClient.should_receive(:post).with(:url, params) { resp_json }
|
67
|
-
Hash.should_receive(:from_xml).with(resp_json) { resp_value }
|
68
|
-
klass.should_receive(:new).with(expected)
|
69
|
-
klass.send(meth)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
describe ".find" do
|
74
|
-
let(:meth) { :find }
|
75
|
-
let(:mock_config) { mock(Helix::Config) }
|
76
|
-
let(:mock_obj) { mock(klass, :load => :output_of_load) }
|
77
|
-
subject { klass.method(meth) }
|
78
|
-
its(:arity) { should eq(1) }
|
79
|
-
before(:each) do Helix::Config.stub(:instance) { mock_config } end
|
80
|
-
context "when given a Helix::Config instance and a guid" do
|
81
|
-
let(:guid) { :a_guid }
|
82
|
-
let(:guid_name) { :the_guid_name }
|
83
|
-
let(:mock_attrs) { mock(Object, :[]= => :output_of_setting_val) }
|
84
|
-
before(:each) do
|
85
|
-
klass.stub(:attributes) { mock_attrs }
|
86
|
-
klass.stub(:guid_name) { guid_name }
|
87
|
-
klass.stub(:new) { mock_obj }
|
88
|
-
end
|
89
|
-
it "should instantiate with {attributes: guid_name => the_guid, config: config}" do
|
90
|
-
klass.should_receive(:new).with({attributes: {guid_name => guid}, config: mock_config})
|
91
|
-
klass.send(meth, guid)
|
92
|
-
end
|
93
|
-
it "should load" do
|
94
|
-
mock_obj.should_receive(:load)
|
95
|
-
klass.send(meth, guid)
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
describe ".find_all" do
|
101
|
-
let(:meth) { :find_all }
|
102
|
-
let(:mock_config) { mock(Helix::Config, build_url: :built_url, get_response: {}) }
|
103
|
-
subject { klass.method(meth) }
|
104
|
-
its(:arity) { should eq(-1) }
|
105
41
|
before(:each) do Helix::Config.stub(:instance) { mock_config } end
|
106
42
|
context "when given a config instances and an opts Hash" do
|
107
43
|
let(:opts) { {opts_key1: :opts_val1} }
|
108
44
|
let(:plural_media_type) { :videos }
|
109
45
|
before(:each) do klass.stub(:plural_media_type) { plural_media_type } end
|
110
|
-
it "should build a
|
46
|
+
it "should build a XML URL -> the_url" do
|
111
47
|
mock_config.should_receive(:build_url).with(content_type: :xml,
|
112
48
|
media_type: plural_media_type)
|
113
49
|
klass.send(meth, opts)
|
@@ -138,6 +74,101 @@ describe Helix::Base do
|
|
138
74
|
end
|
139
75
|
end
|
140
76
|
|
77
|
+
shared_examples_for "a search all without opts" do
|
78
|
+
let(:mock_config) { mock(Helix::Config, build_url: :built_url, get_response: {}) }
|
79
|
+
subject { klass.method(meth) }
|
80
|
+
before(:each) do Helix::Config.stub(:instance) { mock_config } end
|
81
|
+
context "when given a config instances and NO opts Hash" do
|
82
|
+
let(:plural_media_type) { :videos }
|
83
|
+
before(:each) do klass.stub(:plural_media_type) { plural_media_type } end
|
84
|
+
it "should build a XML URL -> the_url" do
|
85
|
+
mock_config.should_receive(:build_url).with(content_type: :xml,
|
86
|
+
media_type: plural_media_type)
|
87
|
+
klass.send(meth)
|
88
|
+
end
|
89
|
+
it "should get_response(the_url, {sig_type: :view} -> raw_response" do
|
90
|
+
mock_config.should_receive(:get_response).with(:built_url, {sig_type: :view})
|
91
|
+
klass.send(meth)
|
92
|
+
end
|
93
|
+
it "should read raw_response[plural_media_type] -> data_sets" do
|
94
|
+
mock_raw_response = mock(Object)
|
95
|
+
mock_config.stub(:get_response) { mock_raw_response }
|
96
|
+
mock_raw_response.should_receive(:[]).with(plural_media_type)
|
97
|
+
klass.send(meth)
|
98
|
+
end
|
99
|
+
context "when data_sets is nil" do
|
100
|
+
it "should return []" do expect(klass.send(meth)).to eq([]) end
|
101
|
+
end
|
102
|
+
context "when data_sets is NOT nil" do
|
103
|
+
let(:data_set) { (0..2).to_a }
|
104
|
+
before(:each) do mock_config.stub(:get_response) { {plural_media_type => data_set } } end
|
105
|
+
it "should map instantiation with attributes: each data set element" do
|
106
|
+
klass.should_receive(:new).with(attributes: data_set[0], config: mock_config) { :a }
|
107
|
+
klass.should_receive(:new).with(attributes: data_set[1], config: mock_config) { :b }
|
108
|
+
klass.should_receive(:new).with(attributes: data_set[2], config: mock_config) { :c }
|
109
|
+
expect(klass.send(meth)).to eq([:a, :b, :c])
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe ".find_all" do
|
116
|
+
let(:meth) { :find_all }
|
117
|
+
it_behaves_like "a search all with opts"
|
118
|
+
it_behaves_like "a search all without opts"
|
119
|
+
end
|
120
|
+
|
121
|
+
describe ".all" do
|
122
|
+
let(:meth) { :all }
|
123
|
+
subject { klass.method(meth) }
|
124
|
+
its(:arity) { should eq(0) }
|
125
|
+
it_behaves_like "a search all without opts"
|
126
|
+
end
|
127
|
+
|
128
|
+
describe ".where" do
|
129
|
+
let(:meth) { :where }
|
130
|
+
it_behaves_like "a search all with opts"
|
131
|
+
it_behaves_like "a search all without opts"
|
132
|
+
end
|
133
|
+
|
134
|
+
describe ".massage_attrs" do
|
135
|
+
let(:meth) { :massage_attrs }
|
136
|
+
subject { klass.method(meth) }
|
137
|
+
its(:arity) { should eq(1) }
|
138
|
+
let(:attrs) { Hash.new }
|
139
|
+
it "should call massage_custom_field_attrs and massage_time_attrs" do
|
140
|
+
klass.should_receive(:massage_time_attrs).and_return attrs
|
141
|
+
klass.should_receive(:massage_custom_field_attrs).and_return attrs
|
142
|
+
klass.send(meth, attrs)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe ".massage_time_attrs" do
|
147
|
+
let(:meth) { :massage_time_attrs }
|
148
|
+
subject { klass.method(meth) }
|
149
|
+
its(:arity) { should eq(1) }
|
150
|
+
let(:time) { Time.new(2013) }
|
151
|
+
let(:attrs) { { key_one: time.to_s, key_two: { key_three: time, key_four: { key_five: time.to_s } } } }
|
152
|
+
let(:expected) { { key_one: time, key_two: { key_three: time, key_four: { key_five: time } } } }
|
153
|
+
it "should turn stringified time values into time objects" do
|
154
|
+
expect(klass.send(meth, attrs)).to eq(expected)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe ".massage_custom_field_attrs" do
|
159
|
+
let(:meth) { :massage_custom_field_attrs }
|
160
|
+
subject { klass.method(meth) }
|
161
|
+
its(:arity) { should eq(1) }
|
162
|
+
let(:custom_hash) { { "custom_fields" => {"boole"=>[nil, nil], "@type"=>"hash"} } }
|
163
|
+
let(:expected) { { "custom_fields" => [{"name"=>"boole", "value"=>""}, {"name"=>"boole", "value"=>""}] } }
|
164
|
+
it "should turn custom_hash into expected" do
|
165
|
+
expect(klass.send(meth, custom_hash)).to eq(expected)
|
166
|
+
end
|
167
|
+
it "should return the custom_hash in its form" do
|
168
|
+
expect(klass.send(meth, expected)).to eq(expected)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
141
172
|
describe "an instance" do
|
142
173
|
let(:obj) { klass.new({}) }
|
143
174
|
|
@@ -160,33 +191,6 @@ describe Helix::Base do
|
|
160
191
|
end
|
161
192
|
end
|
162
193
|
|
163
|
-
describe "#destroy" do
|
164
|
-
let(:meth) { :destroy }
|
165
|
-
let(:mock_config) { mock(Helix::Config, build_url: :the_built_url, signature: :some_sig) }
|
166
|
-
subject { obj.method(meth) }
|
167
|
-
let(:params) { { params: {signature: :some_sig } } }
|
168
|
-
before do
|
169
|
-
obj.stub(:config) { mock_config }
|
170
|
-
obj.stub(:guid) { :some_guid }
|
171
|
-
obj.stub(:plural_media_type) { :media_type }
|
172
|
-
end
|
173
|
-
it "should get an update signature" do
|
174
|
-
url = mock_config.build_url(media_type: :media_type,
|
175
|
-
guid: :some_guid,
|
176
|
-
content_type: :xml)
|
177
|
-
RestClient.stub(:delete).with(url, params)
|
178
|
-
mock_config.should_receive(:signature).with(:update) { :some_sig }
|
179
|
-
obj.send(meth)
|
180
|
-
end
|
181
|
-
it "should call for an HTTP delete and return nil" do
|
182
|
-
url = mock_config.build_url(media_type: :media_type,
|
183
|
-
guid: :some_guid,
|
184
|
-
content_type: :xml)
|
185
|
-
RestClient.should_receive(:delete).with(url, params)
|
186
|
-
expect(obj.send(meth)).to be_nil
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
194
|
describe "#guid" do
|
191
195
|
let(:meth) { :guid }
|
192
196
|
it "should return @attributes[guid_name]" do
|
@@ -305,49 +309,6 @@ describe Helix::Base do
|
|
305
309
|
end
|
306
310
|
end
|
307
311
|
|
308
|
-
describe "#update" do
|
309
|
-
let(:meth) { :update }
|
310
|
-
let(:mock_config) { mock(Helix::Config) }
|
311
|
-
subject { obj.method(meth) }
|
312
|
-
its(:arity) { should eq(-1) }
|
313
|
-
before(:each) do
|
314
|
-
obj.stub(:config) { mock_config }
|
315
|
-
obj.stub(:guid) { :the_guid }
|
316
|
-
obj.stub(:media_type_sym) { :video }
|
317
|
-
obj.stub(:plural_media_type) { :the_media_type }
|
318
|
-
mock_config.stub(:signature).with(:update) { 'some_sig' }
|
319
|
-
mock_config.stub(:build_url) { :expected_url }
|
320
|
-
end
|
321
|
-
shared_examples_for "builds URL for update" do
|
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
|
-
RestClient.stub(:put)
|
325
|
-
obj.send(meth)
|
326
|
-
end
|
327
|
-
it "should get an update signature" do
|
328
|
-
mock_config.stub(:build_url)
|
329
|
-
RestClient.stub(:put)
|
330
|
-
mock_config.should_receive(:signature).with(:update) { 'some_sig' }
|
331
|
-
obj.send(meth)
|
332
|
-
end
|
333
|
-
end
|
334
|
-
context "when given no argument" do
|
335
|
-
it_behaves_like "builds URL for update"
|
336
|
-
it "should call RestClient.put(output_of_build_url, {signature: the_sig, video: {}}) and return instance of klass" do
|
337
|
-
RestClient.should_receive(:put).with(:expected_url, {signature: 'some_sig', video: {}})
|
338
|
-
expect(obj.send(meth)).to be_an_instance_of(klass)
|
339
|
-
end
|
340
|
-
end
|
341
|
-
context "when given an opts argument of {key1: :value1}" do
|
342
|
-
let(:opts) { {key1: :value1} }
|
343
|
-
it_behaves_like "builds URL for update"
|
344
|
-
it "should call RestClient.put(output_of_build_url, {signature: the_sig, video: opts}) and return instance of klass" do
|
345
|
-
RestClient.should_receive(:put).with(:expected_url, {signature: 'some_sig', video: opts})
|
346
|
-
expect(obj.send(meth, opts)).to be_an_instance_of(klass)
|
347
|
-
end
|
348
|
-
end
|
349
|
-
end
|
350
|
-
|
351
312
|
end
|
352
313
|
|
353
314
|
end
|
data/spec/config_spec.rb
CHANGED
@@ -34,8 +34,8 @@ describe Helix::Config do
|
|
34
34
|
end
|
35
35
|
|
36
36
|
describe ".load" do
|
37
|
-
let(:meth)
|
38
|
-
let(:mock_obj) { mock(klass) }
|
37
|
+
let(:meth) { :load }
|
38
|
+
let(:mock_obj) { mock(klass, proxy: :stubbed_proxy) }
|
39
39
|
let(:mock_file) { mock(File) }
|
40
40
|
let(:mock_cred) { mock(Hash, symbolize_keys: :symbolized_creds) }
|
41
41
|
before(:each) do
|
@@ -68,6 +68,10 @@ describe Helix::Config do
|
|
68
68
|
mock_obj.should_receive(:instance_variable_set).with(:@credentials, mock_cred.symbolize_keys)
|
69
69
|
klass.send(meth)
|
70
70
|
end
|
71
|
+
it "should set the proxy" do
|
72
|
+
mock_obj.should_receive(:proxy) { :mock_proxy }
|
73
|
+
klass.send(meth)
|
74
|
+
end
|
71
75
|
it "should return the instance" do
|
72
76
|
expect(klass.send(meth)).to be(mock_obj)
|
73
77
|
end
|
@@ -359,6 +363,25 @@ describe Helix::Config do
|
|
359
363
|
end
|
360
364
|
end
|
361
365
|
|
366
|
+
describe "#proxy" do
|
367
|
+
let(:meth) { :proxy }
|
368
|
+
subject { obj.method(meth) }
|
369
|
+
its(:arity) { should eq(0) }
|
370
|
+
it "should return the system proxy" do
|
371
|
+
ENV['http_proxy'] = 'http://test.proxy'
|
372
|
+
obj.credentials[:proxy_used] = true
|
373
|
+
expect(obj.send(meth)).to eq(ENV['http_proxy'])
|
374
|
+
end
|
375
|
+
it "should return the proxy specified in the config" do
|
376
|
+
obj.credentials[:proxy_uri] = 'http://test.proxy'
|
377
|
+
expect(obj.send(meth)).to eq 'http://test.proxy'
|
378
|
+
end
|
379
|
+
it "should return just proxy uri if only pass exists" do
|
380
|
+
obj.credentials[:proxy_password] = 'fake_pass'
|
381
|
+
expect(obj.send(meth)).to eq 'http://test.proxy'
|
382
|
+
end
|
383
|
+
end
|
384
|
+
|
362
385
|
describe "#signature" do
|
363
386
|
let(:meth) { :signature }
|
364
387
|
|
data/spec/image_spec.rb
CHANGED
@@ -9,6 +9,9 @@ describe Helix::Image do
|
|
9
9
|
its(:guid_name) { should eq('image_id') }
|
10
10
|
its(:media_type_sym) { should be(:image) }
|
11
11
|
its(:plural_media_type) { should eq('images') }
|
12
|
+
[:find, :create, :all, :find_all, :where].each do |crud_call|
|
13
|
+
it { should respond_to(crud_call) }
|
14
|
+
end
|
12
15
|
|
13
16
|
describe "Constants"
|
14
17
|
|
@@ -16,6 +19,9 @@ describe Helix::Image do
|
|
16
19
|
let(:obj) { klass.new({'image_id' => 'some_image_guid'}) }
|
17
20
|
subject { obj }
|
18
21
|
its(:media_type_sym) { should be(:image) }
|
22
|
+
[:destroy, :update].each do |crud_call|
|
23
|
+
it { should respond_to(crud_call) }
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
end
|
data/spec/media_spec.rb
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'helix'
|
3
|
+
|
4
|
+
describe Helix::Media do
|
5
|
+
|
6
|
+
let(:klass) { Helix::Media }
|
7
|
+
|
8
|
+
subject { klass }
|
9
|
+
|
10
|
+
describe ".create" do
|
11
|
+
let(:meth) { :create }
|
12
|
+
let(:mock_config) { mock(Helix::Config) }
|
13
|
+
subject { klass.method(meth) }
|
14
|
+
its(:arity) { should eq(-1) }
|
15
|
+
let(:klass_sym) { :klass }
|
16
|
+
let(:resp_value) { { klass_sym.to_s => { attribute: :value } } }
|
17
|
+
let(:resp_json) { "JSON" }
|
18
|
+
let(:params) { { signature: "some_sig" } }
|
19
|
+
let(:expected) { { attributes: { attribute: :value }, config: mock_config } }
|
20
|
+
before(:each) do
|
21
|
+
klass.stub(:plural_media_type) { :klasses }
|
22
|
+
klass.stub(:media_type_sym) { klass_sym }
|
23
|
+
mock_config.stub(:build_url).with(action: :create_many, media_type: :klasses) { :url }
|
24
|
+
mock_config.stub(:signature).with(:update) { "some_sig" }
|
25
|
+
Helix::Config.stub(:instance) { mock_config }
|
26
|
+
end
|
27
|
+
it "should get an ingest signature" do
|
28
|
+
mock_config.should_receive(:build_url).with(media_type: :klasses,
|
29
|
+
content_type: :xml)
|
30
|
+
RestClient.stub(:post).with(:url, params) { resp_json }
|
31
|
+
Hash.should_receive(:from_xml).with(resp_json) { resp_value }
|
32
|
+
klass.stub(:new).with(expected)
|
33
|
+
mock_config.should_receive(:signature).with(:update) { "some_sig" }
|
34
|
+
klass.send(meth)
|
35
|
+
end
|
36
|
+
it "should do an HTTP post call, parse response and call new" do
|
37
|
+
mock_config.should_receive(:build_url).with(media_type: :klasses,
|
38
|
+
content_type: :xml)
|
39
|
+
RestClient.should_receive(:post).with(:url, params) { resp_json }
|
40
|
+
Hash.should_receive(:from_xml).with(resp_json) { resp_value }
|
41
|
+
klass.should_receive(:new).with(expected)
|
42
|
+
klass.send(meth)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe ".find" do
|
47
|
+
let(:meth) { :find }
|
48
|
+
let(:mock_config) { mock(Helix::Config) }
|
49
|
+
let(:mock_obj) { mock(klass, :load => :output_of_load) }
|
50
|
+
subject { klass.method(meth) }
|
51
|
+
its(:arity) { should eq(1) }
|
52
|
+
before(:each) do Helix::Config.stub(:instance) { mock_config } end
|
53
|
+
context "when given a Helix::Config instance and a guid" do
|
54
|
+
let(:guid) { :a_guid }
|
55
|
+
let(:guid_name) { :the_guid_name }
|
56
|
+
let(:mock_attrs) { mock(Object, :[]= => :output_of_setting_val) }
|
57
|
+
before(:each) do
|
58
|
+
klass.stub(:attributes) { mock_attrs }
|
59
|
+
klass.stub(:guid_name) { guid_name }
|
60
|
+
klass.stub(:new) { mock_obj }
|
61
|
+
end
|
62
|
+
it "should instantiate with {attributes: guid_name => the_guid, config: config}" do
|
63
|
+
klass.should_receive(:new).with({attributes: {guid_name => guid}, config: mock_config})
|
64
|
+
klass.send(meth, guid)
|
65
|
+
end
|
66
|
+
it "should load" do
|
67
|
+
mock_obj.should_receive(:load)
|
68
|
+
klass.send(meth, guid)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "an instance" do
|
74
|
+
let(:obj) { klass.new({}) }
|
75
|
+
|
76
|
+
describe "#destroy" do
|
77
|
+
let(:meth) { :destroy }
|
78
|
+
let(:mock_config) { mock(Helix::Config, build_url: :the_built_url, signature: :some_sig) }
|
79
|
+
subject { obj.method(meth) }
|
80
|
+
let(:params) { { params: {signature: :some_sig } } }
|
81
|
+
before do
|
82
|
+
obj.stub(:config) { mock_config }
|
83
|
+
obj.stub(:guid) { :some_guid }
|
84
|
+
obj.stub(:plural_media_type) { :media_type }
|
85
|
+
end
|
86
|
+
it "should get an update signature" do
|
87
|
+
url = mock_config.build_url(media_type: :media_type,
|
88
|
+
guid: :some_guid,
|
89
|
+
content_type: :xml)
|
90
|
+
RestClient.stub(:delete).with(url, params)
|
91
|
+
mock_config.should_receive(:signature).with(:update) { :some_sig }
|
92
|
+
obj.send(meth)
|
93
|
+
end
|
94
|
+
it "should call for an HTTP delete and return nil" do
|
95
|
+
url = mock_config.build_url(media_type: :media_type,
|
96
|
+
guid: :some_guid,
|
97
|
+
content_type: :xml)
|
98
|
+
RestClient.should_receive(:delete).with(url, params)
|
99
|
+
expect(obj.send(meth)).to be_nil
|
100
|
+
end
|
101
|
+
end
|
102
|
+
describe "#update" do
|
103
|
+
let(:meth) { :update }
|
104
|
+
let(:mock_config) { mock(Helix::Config) }
|
105
|
+
subject { obj.method(meth) }
|
106
|
+
its(:arity) { should eq(-1) }
|
107
|
+
before(:each) do
|
108
|
+
obj.stub(:config) { mock_config }
|
109
|
+
obj.stub(:guid) { :the_guid }
|
110
|
+
obj.stub(:media_type_sym) { :video }
|
111
|
+
obj.stub(:plural_media_type) { :the_media_type }
|
112
|
+
mock_config.stub(:signature).with(:update) { 'some_sig' }
|
113
|
+
mock_config.stub(:build_url) { :expected_url }
|
114
|
+
end
|
115
|
+
shared_examples_for "builds URL for update" do
|
116
|
+
it "should build_url(content_type: :xml, guid: guid, media_type: plural_media_type)" do
|
117
|
+
mock_config.should_receive(:build_url).with(content_type: :xml, guid: :the_guid, media_type: :the_media_type)
|
118
|
+
RestClient.stub(:put)
|
119
|
+
obj.send(meth)
|
120
|
+
end
|
121
|
+
it "should get an update signature" do
|
122
|
+
mock_config.stub(:build_url)
|
123
|
+
RestClient.stub(:put)
|
124
|
+
mock_config.should_receive(:signature).with(:update) { 'some_sig' }
|
125
|
+
obj.send(meth)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
context "when given no argument" do
|
129
|
+
it_behaves_like "builds URL for update"
|
130
|
+
it "should call RestClient.put(output_of_build_url, {signature: the_sig, video: {}}) and return instance of klass" do
|
131
|
+
RestClient.should_receive(:put).with(:expected_url, {signature: 'some_sig', video: {}})
|
132
|
+
expect(obj.send(meth)).to be_an_instance_of(klass)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
context "when given an opts argument of {key1: :value1}" do
|
136
|
+
let(:opts) { {key1: :value1} }
|
137
|
+
it_behaves_like "builds URL for update"
|
138
|
+
it "should call RestClient.put(output_of_build_url, {signature: the_sig, video: opts}) and return instance of klass" do
|
139
|
+
RestClient.should_receive(:put).with(:expected_url, {signature: 'some_sig', video: opts})
|
140
|
+
expect(obj.send(meth, opts)).to be_an_instance_of(klass)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
data/spec/tag_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../spec_helper', __FILE__)
|
2
|
+
require 'helix'
|
3
|
+
|
4
|
+
describe Helix::Tag do
|
5
|
+
|
6
|
+
let(:klass) { Helix::Tag }
|
7
|
+
subject { klass }
|
8
|
+
its(:media_type_sym) { should be(:tag) }
|
9
|
+
its(:plural_media_type) { should eq('tags') }
|
10
|
+
it { should_not respond_to(:find) }
|
11
|
+
it { should_not respond_to(:create) }
|
12
|
+
it { should respond_to(:all)}
|
13
|
+
it { should respond_to(:find_all)}
|
14
|
+
|
15
|
+
describe "Constants"
|
16
|
+
|
17
|
+
describe "an instance" do
|
18
|
+
let(:obj) { klass.new({}) }
|
19
|
+
subject { obj }
|
20
|
+
its(:media_type_sym) { should be(:tag) }
|
21
|
+
it { should_not respond_to(:destroy) }
|
22
|
+
it { should_not respond_to(:update) }
|
23
|
+
end
|
24
|
+
end
|
data/spec/track_spec.rb
CHANGED
@@ -8,6 +8,9 @@ describe Helix::Track do
|
|
8
8
|
its(:guid_name) { should eq('track_id') }
|
9
9
|
its(:media_type_sym) { should be(:track) }
|
10
10
|
its(:plural_media_type) { should eq('tracks') }
|
11
|
+
[:find, :create, :all, :find_all, :where].each do |crud_call|
|
12
|
+
it { should respond_to(crud_call) }
|
13
|
+
end
|
11
14
|
|
12
15
|
describe "Constants"
|
13
16
|
|
@@ -15,5 +18,8 @@ describe Helix::Track do
|
|
15
18
|
let(:obj) { klass.new({'track_id' => 'some_track_guid'}) }
|
16
19
|
subject { obj }
|
17
20
|
its(:media_type_sym) { should be(:track) }
|
21
|
+
[:destroy, :update].each do |crud_call|
|
22
|
+
it { should respond_to(crud_call) }
|
23
|
+
end
|
18
24
|
end
|
19
25
|
end
|
data/spec/video_spec.rb
CHANGED
@@ -12,6 +12,9 @@ describe Helix::Video do
|
|
12
12
|
its(:guid_name) { should eq('video_id') }
|
13
13
|
its(:media_type_sym) { should be(:video) }
|
14
14
|
its(:plural_media_type) { should eq('videos') }
|
15
|
+
[:find, :create, :all, :find_all, :where].each do |crud_call|
|
16
|
+
it { should respond_to(crud_call) }
|
17
|
+
end
|
15
18
|
|
16
19
|
describe "Constants"
|
17
20
|
|
@@ -32,6 +35,9 @@ describe Helix::Video do
|
|
32
35
|
obj.send(meth)
|
33
36
|
end
|
34
37
|
end
|
38
|
+
[:destroy, :update].each do |crud_call|
|
39
|
+
it { should respond_to(crud_call) }
|
40
|
+
end
|
35
41
|
end
|
36
42
|
|
37
43
|
### CLASS METHODS
|
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.4.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-
|
12
|
+
date: 2013-02-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: json
|
@@ -69,8 +69,11 @@ files:
|
|
69
69
|
- lib/helix/album.rb
|
70
70
|
- lib/helix/base.rb
|
71
71
|
- lib/helix/image.rb
|
72
|
+
- lib/helix/media.rb
|
72
73
|
- lib/helix/durationed_media.rb
|
74
|
+
- lib/helix/exceptions.rb
|
73
75
|
- lib/helix/config.rb
|
76
|
+
- lib/helix/tag.rb
|
74
77
|
- lib/helix/video.rb
|
75
78
|
- lib/helix/track.rb
|
76
79
|
- lib/helix/statistics.rb
|
@@ -78,11 +81,13 @@ files:
|
|
78
81
|
- spec/spec_helper.rb
|
79
82
|
- spec/statistics_spec.rb
|
80
83
|
- spec/config_spec.rb
|
84
|
+
- spec/media_spec.rb
|
81
85
|
- spec/image_spec.rb
|
82
86
|
- spec/album_spec.rb
|
83
87
|
- spec/track_spec.rb
|
84
88
|
- spec/base_spec.rb
|
85
89
|
- spec/durationed_media_spec.rb
|
90
|
+
- spec/tag_spec.rb
|
86
91
|
- LICENSE
|
87
92
|
- README.md
|
88
93
|
homepage: https://github.com/Twistage/helix/
|