helix 0.0.2.3.pre → 0.0.2.4.pre
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/helix.rb +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/
|