api-client 2.0.0.rc2 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,6 +15,9 @@ module ApiClient
15
15
  extend ApiClient::ClassMethods
16
16
  include ApiClient::InstanceMethods
17
17
 
18
+ # @return [Integer] the id of the object.
19
+ attr_accessor :id
20
+
18
21
  # @return [Hash] the request response.
19
22
  attr_accessor :response
20
23
 
@@ -39,34 +42,34 @@ module ApiClient
39
42
  false
40
43
  end
41
44
 
42
- # Return the path of the object on the api url.
45
+ # Return the resource path of the object on the api url.
43
46
  #
44
- # @return [String] the api path for this object.
45
- def self.path
46
- return self.to_s.gsub('::', '/').downcase.pluralize unless @path
47
- @path
47
+ # @return [String] the resource path on the api for this object.
48
+ def self.resource_path
49
+ return self.to_s.gsub('::', '/').downcase.pluralize unless @resource_path
50
+ @resource_path
48
51
  end
49
52
 
50
- # Set the path of the object on the api url.
53
+ # Set the resource path of the object on the api.
51
54
  #
52
- # @param [String] path string.
53
- def self.path=(path)
54
- path = path[1, path.size - 1] if path[0, 1] == '/'
55
- @path = path
55
+ # @param [String] resource path string.
56
+ def self.resource_path=(resource_path)
57
+ resource_path = resource_path[1, resource_path.size - 1] if resource_path[0, 1] == '/'
58
+ @resource_path = resource_path
56
59
  end
57
60
 
58
- # Return the Remote Object Name.
61
+ # Return the Root node name for this Class.
59
62
  #
60
- # @return [String] a string with the remote object class name.
61
- def self.remote_object
62
- @remote_object.blank? ? self.to_s.split('::').last.downcase : @remote_object
63
+ # @return [String] a string with the root node name for this class.
64
+ def self.root_node
65
+ @root_node.blank? ? self.to_s.split('::').last.downcase : @root_node
63
66
  end
64
67
 
65
- # Set a custom remote object name instead of the virtual class name.
68
+ # Set a custom root node name instead of the Class name.
66
69
  #
67
- # @param [String] remote_object name.
68
- def self.remote_object=(remote_object)
69
- @remote_object = remote_object
70
+ # @param [String] root_node root node name.
71
+ def self.root_node=(root_node)
72
+ @root_node = root_node
70
73
  end
71
74
 
72
75
  # Set methods to initialize associated objects.
@@ -76,12 +79,7 @@ module ApiClient
76
79
  associations.each do |association, class_name|
77
80
  class_eval <<-EVAL
78
81
  def #{association.to_s}=(attributes = {})
79
- if attributes.instance_of?(Array)
80
- return @#{association.to_s} = attributes.map { |attr|
81
- attr = remove_root(attr)
82
- #{class_name.constantize}.new(attr)
83
- }
84
- end
82
+ return @#{association.to_s} = attributes.map { |attr| #{class_name.constantize}.new(attr) } if attributes.instance_of?(Array)
85
83
  @#{association.to_s} = #{class_name.constantize}.new(attributes)
86
84
  end
87
85
  def #{association.to_s}
@@ -126,7 +124,7 @@ module ApiClient
126
124
  # @param [String] url to get the collection.
127
125
  # @return [Collection] a collection of objects.
128
126
  def self.collection
129
- ApiClient::Collection.new(self, self.path).collection
127
+ ApiClient::Collection.new(self, self.resource_path).collection
130
128
  end
131
129
 
132
130
  # Set the hash of errors, making keys symbolic.
@@ -135,13 +133,5 @@ module ApiClient
135
133
  def errors=(errs = {})
136
134
  errors.add_errors(Hash[errs.map{|(key,value)| [key.to_sym,value]}])
137
135
  end
138
-
139
- protected
140
-
141
- def remove_root(attributes = {})
142
- attributes = attributes[self.class.remote_object.to_sym] if attributes.key?(self.class.remote_object.to_sym)
143
- attributes = attributes[self.class.remote_object.to_s] if attributes.key?(self.class.remote_object.to_s)
144
- attributes
145
- end
146
136
  end
147
- end
137
+ end
@@ -3,38 +3,80 @@ module ApiClient
3
3
  module ClassMethods
4
4
  # Initialize an object based on a hash of attributes.
5
5
  #
6
- # @param [Hash] params hash of attributes.
6
+ # @param [Hash] attributes hash of attributes.
7
7
  # @return [Base] the object initialized.
8
- def build(params)
9
- if params.key?(remote_object)
10
- new(params[remote_object].merge(:response => params))
11
- else
12
- new(params.merge(:response => params))
13
- end
8
+ def build(attributes)
9
+ hash = remove_root(attributes)
10
+ hash = hash.merge({ 'response' => attributes })
11
+ new(hash)
14
12
  end
15
13
 
16
- # Make the api call and pass the parsed response to build to create a new object.
14
+ # Make a get requisition and initialize an object with the response.
17
15
  #
18
- # @param [Symbol] method_name the name of the method.
19
- # @param [Integer] id the id of the object.
20
- # @param [Array] args an array of params.
16
+ # @param [Integer] id id of the object.
17
+ # @param [Hash] header hash with the header options.
21
18
  # @return [Base] the object initialized.
22
- def method_missing(method_name, id = nil, *args)
23
- url = "#{ApiClient.config.path}#{self.path}"
24
- "#{url}/#{id}" unless id.nil?
25
- response = ApiClient::Dispatcher.send(method_name.to_sym, url, *args)
19
+ def get(id, header = {})
20
+ url = "#{ApiClient.config.path}#{self.resource_path}/#{id}"
21
+ response = ApiClient::Dispatcher.get(url, header)
26
22
  params = ApiClient::Parser.response(response, url)
27
23
  build(params)
28
24
  end
29
25
 
30
- # Overwrite respond_to? default behavior
26
+ # Make a post requisition and initialize an object with the response.
31
27
  #
32
- # @param [Symbol] method_name the name of the method.
33
- # @param [Boolean] include_private if it does work to private methods as well.
34
- # @return [Boolean] if it responds to the method or not.
35
- def respond_to_missing?(method_name, include_private = false)
36
- return true if ApiClient::Dispatcher.respond_to?(method_name)
37
- super
28
+ # @param [Hash] attributes hash with the attributes to send.
29
+ # @param [Hash] header hash with the header options.
30
+ # @return [Base] the object initialized.
31
+ def post(attributes, header = {})
32
+ url = "#{ApiClient.config.path}#{self.resource_path}/"
33
+ response = ApiClient::Dispatcher.post(url, attributes, header)
34
+ params = ApiClient::Parser.response(response, url)
35
+ build(params)
36
+ end
37
+
38
+ # Make a put requisition and initialize an object with the response.
39
+ #
40
+ # @param [Integer] id id of the object.
41
+ # @param [Hash] attributes hash with the attributes to send.
42
+ # @param [Hash] header hash with the header options.
43
+ # @return [Base] the object initialized.
44
+ def put(id, attributes, header = {})
45
+ url = "#{ApiClient.config.path}#{self.resource_path}/#{id}"
46
+ response = ApiClient::Dispatcher.put(url, attributes, header)
47
+ params = ApiClient::Parser.response(response, url)
48
+ build(params)
49
+ end
50
+
51
+ # Make a patch requisition and initialize an object with the response.
52
+ #
53
+ # @param [Integer] id id of the object.
54
+ # @param [Hash] attributes hash with the attributes to send.
55
+ # @param [Hash] header hash with the header options.
56
+ # @return [Base] the object initialized.
57
+ def patch(id, attributes, header = {})
58
+ url = "#{ApiClient.config.path}#{self.resource_path}/#{id}"
59
+ response = ApiClient::Dispatcher.patch(url, attributes, header)
60
+ params = ApiClient::Parser.response(response, url)
61
+ build(params)
62
+ end
63
+
64
+ # Make a delete requisition and initialize an object with the response.
65
+ #
66
+ # @param [Integer] id id of the object.
67
+ # @param [Hash] header hash with the header options.
68
+ # @return [Base] the object initialized.
69
+ def delete(id, header = {})
70
+ url = "#{ApiClient.config.path}#{self.resource_path}/#{id}"
71
+ response = ApiClient::Dispatcher.delete(url, header)
72
+ params = ApiClient::Parser.response(response, url)
73
+ build(params)
74
+ end
75
+
76
+ def remove_root(attributes = {})
77
+ attributes = attributes[self.root_node.to_sym] if attributes.key?(self.root_node.to_sym)
78
+ attributes = attributes[self.root_node.to_s] if attributes.key?(self.root_node.to_s)
79
+ attributes
38
80
  end
39
81
  end
40
82
  end
@@ -16,5 +16,20 @@ module ApiClient
16
16
  path = "#{path}/" unless path[path.size - 1, 1] == '/'
17
17
  @path = path
18
18
  end
19
+
20
+ # Return the default header for requisitions.
21
+ #
22
+ # @return [Hash] the default header.
23
+ def header
24
+ return { 'Content-Type' => 'application/json' } unless @header
25
+ @header
26
+ end
27
+
28
+ # Set the default header for requisitions.
29
+ #
30
+ # @param [Hash] header the default header for requitions.
31
+ def header=(header = {})
32
+ @header = { 'Content-Type' => 'application/json' }.merge(header)
33
+ end
19
34
  end
20
35
  end
@@ -3,12 +3,13 @@ module ApiClient::Dispatcher
3
3
  autoload :Typhoeus, 'api-client/dispatcher/typhoeus'
4
4
  autoload :NetHttp, 'api-client/dispatcher/net-http'
5
5
 
6
- def self.method_missing(method, *args)
6
+ def self.method_missing(method_name, *args)
7
7
  if defined?(::Typhoeus)
8
- Typhoeus.send(method, *args)
8
+ return Typhoeus.send(method_name, *args) if Typhoeus.respond_to?(method_name)
9
9
  else
10
- NetHttp.send(method, *args)
10
+ return NetHttp.send(method_name, *args) if NetHttp.respond_to?(method_name)
11
11
  end
12
+ super
12
13
  end
13
14
 
14
15
  # Overwrite respond_to? default behavior
@@ -16,8 +17,10 @@ module ApiClient::Dispatcher
16
17
  # @param [Symbol] method_name the name of the method.
17
18
  # @param [Boolean] include_private if it does work to private methods as well.
18
19
  # @return [Boolean] if it responds to the method or not.
19
- def respond_to_missing?(method_name, include_private = false)
20
- return true if Typhoeus.respond_to?(method_name)
20
+ def self.respond_to_missing?(method_name, include_private = false)
21
+ if defined?(::Typhoeus)
22
+ return true if Typhoeus.respond_to?(method_name)
23
+ end
21
24
  return true if NetHttp.respond_to?(method_name)
22
25
  super
23
26
  end
@@ -10,7 +10,7 @@ module ApiClient::Dispatcher::NetHttp
10
10
  # @return [HTTP] the response object.
11
11
  def self.get(url, header = {})
12
12
  initialize_connection(url)
13
- call { @http.get(@uri.request_uri, { 'Content-Type' => 'application/json' }.merge(header)) }
13
+ call { @http.get(@uri.request_uri, ApiClient.config.header.merge(header)) }
14
14
  end
15
15
 
16
16
  # Make a post request and returns it.
@@ -21,7 +21,7 @@ module ApiClient::Dispatcher::NetHttp
21
21
  # @return [HTTP] the response object.
22
22
  def self.post(url, args, header = {})
23
23
  initialize_connection(url)
24
- call { @http.post(@uri.request_uri, args.to_json, { 'Content-Type' => 'application/json' }.merge(header)) }
24
+ call { @http.post(@uri.request_uri, args.to_json, ApiClient.config.header.merge(header)) }
25
25
  end
26
26
 
27
27
  # Make a put request and returns it.
@@ -32,7 +32,7 @@ module ApiClient::Dispatcher::NetHttp
32
32
  # @return [HTTP] the response object.
33
33
  def self.put(url, args, header = {})
34
34
  initialize_connection(url)
35
- call { @http.put(@uri.request_uri, args.to_json, { 'Content-Type' => 'application/json' }.merge(header)) }
35
+ call { @http.put(@uri.request_uri, args.to_json, ApiClient.config.header.merge(header)) }
36
36
  end
37
37
 
38
38
  # Make a patch request and returns it.
@@ -43,7 +43,7 @@ module ApiClient::Dispatcher::NetHttp
43
43
  # @return [HTTP] the response object.
44
44
  def self.patch(url, args, header = {})
45
45
  initialize_connection(url)
46
- call { @http.patch(@uri.request_uri, args.to_json, { 'Content-Type' => 'application/json' }.merge(header)) }
46
+ call { @http.patch(@uri.request_uri, args.to_json, ApiClient.config.header.merge(header)) }
47
47
  end
48
48
 
49
49
  # Make a delete request and returns it.
@@ -8,7 +8,7 @@ module ApiClient::Dispatcher::Typhoeus
8
8
  # @param [Hash] header attributes of the request.
9
9
  # @return [Typhoeus::Request] the response object.
10
10
  def self.get(url, header = {})
11
- ::Typhoeus::Request.get(url, :headers => header)
11
+ ::Typhoeus::Request.get(url, :headers => ApiClient.config.header.merge(header))
12
12
  end
13
13
 
14
14
  # Make a post request and returns it.
@@ -18,7 +18,7 @@ module ApiClient::Dispatcher::Typhoeus
18
18
  # @param [Hash] header attributes of the request.
19
19
  # @return [Typhoeus::Request] the response object.
20
20
  def self.post(url, args, header = {})
21
- ::Typhoeus::Request.post(url, :params => args, :headers => header)
21
+ ::Typhoeus::Request.post(url, :body => args, :headers => ApiClient.config.header.merge(header))
22
22
  end
23
23
 
24
24
  # Make a put request and returns it.
@@ -28,7 +28,7 @@ module ApiClient::Dispatcher::Typhoeus
28
28
  # @param [Hash] header attributes of the request.
29
29
  # @return [Typhoeus::Request] the response object.
30
30
  def self.put(url, args, header = {})
31
- ::Typhoeus::Request.put(url, :params => args, :headers => header)
31
+ ::Typhoeus::Request.put(url, :body => args, :headers => ApiClient.config.header.merge(header))
32
32
  end
33
33
 
34
34
  # Make a patch request and returns it.
@@ -38,7 +38,7 @@ module ApiClient::Dispatcher::Typhoeus
38
38
  # @param [Hash] header attributes of the request.
39
39
  # @return [Typhoeus::Request] the response object.
40
40
  def self.patch(url, args, header = {})
41
- ::Typhoeus::Request.patch(url, :params => args, :headers => header)
41
+ ::Typhoeus::Request.patch(url, :body => args, :headers => ApiClient.config.header.merge(header))
42
42
  end
43
43
 
44
44
  # Make a delete request and returns it.
@@ -47,6 +47,6 @@ module ApiClient::Dispatcher::Typhoeus
47
47
  # @param [Hash] header attributes of the request.
48
48
  # @return [Typhoeus::Request] the response object.
49
49
  def self.delete(url, header = {})
50
- ::Typhoeus::Request.delete(url, :headers => header)
50
+ ::Typhoeus::Request.delete(url, :headers => ApiClient.config.header.merge(header))
51
51
  end
52
52
  end
@@ -1,47 +1,58 @@
1
1
  module ApiClient
2
- # This module handles the logic to make an api call and update the current object with the response.
2
+ # This module handles the logic to make an api call and update_attributes the current object with the response.
3
3
  module InstanceMethods
4
4
  # Update an object based on a hash of attributes.
5
5
  #
6
6
  # @param [Hash] params hash of attributes.
7
- # @return [Base] the updated object.
8
- def update(params)
9
- if params.key?(self.class.remote_object)
10
- params[self.class.remote_object].each do |key, value|
11
- instance_variable_set(key.to_sym, value)
12
- end
13
- instance_variable_set(response.to_sym, params[self.class.remote_object])
14
- else
15
- params.each do |key, value|
16
- instance_variable_set("@#{key}", value)
17
- end
18
- instance_variable_set("@response", params)
7
+ # @return [Base] the update_attributes object.
8
+ def update_attributes(attributes)
9
+ hash = remove_root(attributes)
10
+ hash = hash.merge({ 'response' => attributes })
11
+ hash.each do |key, value|
12
+ send("#{key}=", value)
19
13
  end
20
14
  self
21
15
  end
22
16
 
23
- # Make the api call and pass the parsed response to update the current object.
24
- #
25
- # @param [Symbol] method_name the name of the method.
26
- # @param [Integer] id the id of the current object.
27
- # @param [Array] args an array of params.
28
- # @return [Base] the object updated.
29
- def method_missing(method_name, id = nil, *args)
30
- url = "#{ApiClient.config.path}#{self.class.path}"
31
- "#{url}/#{id}" unless id.nil?
32
- response = ApiClient::Dispatcher.send(method_name.to_sym, url, *args)
33
- params = ApiClient::Parser.response(response, url)
34
- update(params)
17
+ def get(header = {})
18
+ url = "#{ApiClient.config.path}#{self.class.resource_path}/#{id}"
19
+ response = ApiClient::Dispatcher.get(url, header)
20
+ attributes = ApiClient::Parser.response(response, url)
21
+ update_attributes(attributes)
35
22
  end
36
23
 
37
- # Overwrite respond_to? default behavior
38
- #
39
- # @param [Symbol] method_name the name of the method.
40
- # @param [Boolean] include_private if it does work to private methods as well.
41
- # @return [Boolean] if it responds to the method or not.
42
- def respond_to_missing?(method_name, include_private = false)
43
- return true if ApiClient::Dispatcher.respond_to?(method_name)
44
- super
24
+ def post(header = {})
25
+ url = "#{ApiClient.config.path}#{self.class.resource_path}/"
26
+ response = ApiClient::Dispatcher.post(url, self.attributes, header)
27
+ attributes = ApiClient::Parser.response(response, url)
28
+ update_attributes(attributes)
29
+ end
30
+
31
+ def put(header = {})
32
+ url = "#{ApiClient.config.path}#{self.class.resource_path}/#{id}"
33
+ response = ApiClient::Dispatcher.put(url, self.attributes, header)
34
+ attributes = ApiClient::Parser.response(response, url)
35
+ update_attributes(attributes)
36
+ end
37
+
38
+ def patch(header = {})
39
+ url = "#{ApiClient.config.path}#{self.class.resource_path}/#{id}"
40
+ response = ApiClient::Dispatcher.post(url, self.attributes, header)
41
+ attributes = ApiClient::Parser.response(response, url)
42
+ update_attributes(attributes)
43
+ end
44
+
45
+ def delete(header = {})
46
+ url = "#{ApiClient.config.path}#{self.class.resource_path}/#{id}"
47
+ response = ApiClient::Dispatcher.post(url, header)
48
+ attributes = ApiClient::Parser.response(response, url)
49
+ update_attributes(attributes)
50
+ end
51
+
52
+ def remove_root(attributes = {})
53
+ attributes = attributes[self.class.root_node.to_sym] if attributes.key?(self.class.root_node.to_sym)
54
+ attributes = attributes[self.class.root_node.to_s] if attributes.key?(self.class.root_node.to_s)
55
+ attributes
45
56
  end
46
57
  end
47
58
  end
@@ -1,5 +1,5 @@
1
1
  # High Level Namespace of the library ApiClient.
2
2
  module ApiClient
3
3
  # Version of the library.
4
- VERSION = '2.0.0.rc2'
4
+ VERSION = '2.0.0'
5
5
  end
@@ -44,63 +44,63 @@ describe ApiClient::Base do
44
44
  end
45
45
  end
46
46
 
47
- describe '.path' do
47
+ describe '.resource_path' do
48
48
  describe 'when not configured' do
49
49
  it 'should return a name based on the class name' do
50
- User.path.should == 'users'
50
+ User.resource_path.should == 'users'
51
51
  end
52
52
  end
53
53
 
54
54
  describe 'when properly configured' do
55
55
  before :each do
56
- User.path = 'admins'
56
+ User.resource_path = 'admins'
57
57
  end
58
58
 
59
- it 'should return the path value' do
60
- User.path.should == 'admins'
59
+ it 'should return the resource_path value' do
60
+ User.resource_path.should == 'admins'
61
61
  end
62
62
  end
63
63
  end
64
64
 
65
- describe '.path=' do
65
+ describe '.resource_path=' do
66
66
  describe "with a string without '/'" do
67
67
  before :each do
68
- User.path = 'users'
68
+ User.resource_path = 'users'
69
69
  end
70
70
 
71
71
  it 'should set it as passed' do
72
- User.path.should == 'users'
72
+ User.resource_path.should == 'users'
73
73
  end
74
74
  end
75
75
 
76
76
  describe "with a string with '/'" do
77
77
  before :each do
78
- User.path = '/users'
78
+ User.resource_path = '/users'
79
79
  end
80
80
 
81
81
  it "should set it without the '/'" do
82
- User.path.should == 'users'
82
+ User.resource_path.should == 'users'
83
83
  end
84
84
  end
85
85
  end
86
86
 
87
- describe '.remote_object' do
87
+ describe '.root_node' do
88
88
  context 'on a class without remote object specification' do
89
89
  it 'should return the class name' do
90
- User.remote_object.should == 'user'
90
+ User.root_node.should == 'user'
91
91
  end
92
92
  end
93
93
 
94
94
  context 'on a class with remote object specification' do
95
95
  it 'should return the class name' do
96
- Admin.remote_object.should == 'user'
96
+ Admin.root_node.should == 'user'
97
97
  end
98
98
  end
99
99
  end
100
100
 
101
- describe '.remote_object=' do
101
+ describe '.root_node=' do
102
102
  it 'should set the remote object name' do
103
- Admin.remote_object.should == 'user'
103
+ Admin.root_node.should == 'user'
104
104
  end
105
105
  end
106
106
 
@@ -160,35 +160,4 @@ describe ApiClient::Base do
160
160
  @user.errors.messages.should == { :a => %w(message), :b => %w(message) }
161
161
  end
162
162
  end
163
-
164
- describe 'requests' do
165
- context 'on the class' do
166
- before :each do
167
- stub_request(:any, 'http://api.example.com/users').to_return(:body => {'a' => 'b'}.to_json)
168
- end
169
-
170
- it 'should return a new instance' do
171
- User.get.should be_an_instance_of(User)
172
- end
173
-
174
- it 'should set the response on the instance' do
175
- User.get.response.should == { 'a' => 'b' }
176
- end
177
- end
178
-
179
- context 'on an object' do
180
- before :each do
181
- stub_request(:any, 'http://api.example.com/users').to_return(:body => {'a' => 'b'}.to_json)
182
- @user = User.new
183
- end
184
-
185
- it 'should return a new instance' do
186
- @user.get.should be_an_instance_of(User)
187
- end
188
-
189
- it 'should set the response on the instance' do
190
- @user.get.response.should == {'a' => 'b'}
191
- end
192
- end
193
- end
194
- end
163
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe ApiClient::ClassMethods do
4
+ before :each do
5
+ stub_request(:any, 'http://api.example.com/users/').to_return(:body => {'a' => 'b'}.to_json)
6
+ stub_request(:any, 'http://api.example.com/users/1').to_return(:body => {'a' => 'b'}.to_json)
7
+ end
8
+
9
+ context '.build' do
10
+ context 'with a root node' do
11
+ it 'should return a new object' do
12
+ User.build('user' => { 'a' => 'b'}).should be_an_instance_of(User)
13
+ end
14
+
15
+ it 'should set the response' do
16
+ User.build('user' => { 'a' => 'b'}).response.should == { 'user' => { 'a' => 'b' } }
17
+ end
18
+ end
19
+
20
+ context 'without a root node' do
21
+ it 'should return a new object' do
22
+ User.build('a' => 'b').should be_an_instance_of(User)
23
+ end
24
+
25
+ it 'should set the response' do
26
+ User.build('a' => 'b').response.should == { 'a' => 'b' }
27
+ end
28
+ end
29
+ end
30
+
31
+ context '.get' do
32
+ it 'should return a new object' do
33
+ User.get(1).should be_an_instance_of(User)
34
+ end
35
+ end
36
+
37
+ context '.post' do
38
+ it 'should return a new object' do
39
+ User.post({}).should be_an_instance_of(User)
40
+ end
41
+ end
42
+
43
+ context '.put' do
44
+ it 'should return a new object' do
45
+ User.put(1, {}).should be_an_instance_of(User)
46
+ end
47
+ end
48
+
49
+ context '.patch' do
50
+ it 'should return a new object' do
51
+ User.patch(1, {}).should be_an_instance_of(User)
52
+ end
53
+ end
54
+
55
+ context '.delete' do
56
+ it 'should return a new object' do
57
+ User.delete(1).should be_an_instance_of(User)
58
+ end
59
+ end
60
+ end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe ApiClient::Configuration do
4
4
  describe '#path' do
5
- describe 'when not configured' do
5
+ context 'when not configured' do
6
6
  before :each do
7
7
  ApiClient.configure do |config|
8
8
  config.path = ''
@@ -14,7 +14,7 @@ describe ApiClient::Configuration do
14
14
  end
15
15
  end
16
16
 
17
- describe 'when properly configured' do
17
+ context 'when properly configured' do
18
18
  before :each do
19
19
  ApiClient.configure do |config|
20
20
  config.path = 'http://api.example.com'
@@ -28,7 +28,7 @@ describe ApiClient::Configuration do
28
28
  end
29
29
 
30
30
  describe '#path=' do
31
- describe "with a string without '/'" do
31
+ context "with a string without '/'" do
32
32
  before :each do
33
33
  ApiClient.config.path = 'http://api.example.com'
34
34
  end
@@ -38,7 +38,7 @@ describe ApiClient::Configuration do
38
38
  end
39
39
  end
40
40
 
41
- describe "with a string with '/'" do
41
+ context "with a string with '/'" do
42
42
  before :each do
43
43
  ApiClient.config.path = 'http://api.example.com/'
44
44
  end
@@ -48,4 +48,34 @@ describe ApiClient::Configuration do
48
48
  end
49
49
  end
50
50
  end
51
+
52
+ describe '#header' do
53
+ context 'when not configured' do
54
+ it 'should return a hash with configs for content_type only' do
55
+ ApiClient.config.header.should == { 'Content-Type' => 'application/json' }
56
+ end
57
+ end
58
+
59
+ context 'when configured' do
60
+ before :each do
61
+ ApiClient.config.instance_variable_set('@header', { 'key' => 'value' })
62
+ end
63
+
64
+ it 'should return a hash with the configured header' do
65
+ ApiClient.config.header.should == { 'key' => 'value' }
66
+ end
67
+ end
68
+ end
69
+
70
+ describe '#header=' do
71
+ before :each do
72
+ ApiClient.configure do |config|
73
+ config.header = { 'Content-Type' => 'application/xml' }
74
+ end
75
+ end
76
+
77
+ it 'should merge content_type json with the given hash' do
78
+ ApiClient.config.header.should == { 'Content-Type' => 'application/xml' }
79
+ end
80
+ end
51
81
  end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe ApiClient::InstanceMethods do
4
+ let(:user) { User.new(:id => 1) }
5
+
6
+ before :each do
7
+ stub_request(:any, 'http://api.example.com/users/').to_return(:body => {'a' => 'b'}.to_json)
8
+ stub_request(:any, 'http://api.example.com/users/1').to_return(:body => {'a' => 'b'}.to_json)
9
+ end
10
+
11
+ context '.update_attributes' do
12
+ context 'with a root node' do
13
+ it 'should update the object' do
14
+ user.update_attributes('user' => { 'a' => 'b'}).should be_an_instance_of(User)
15
+ end
16
+
17
+ it 'should set the response' do
18
+ user.update_attributes('user' => { 'a' => 'b'}).response.should == { 'user' => { 'a' => 'b' } }
19
+ end
20
+ end
21
+
22
+ context 'without a root node' do
23
+ it 'should update the object' do
24
+ user.update_attributes('a' => 'b').should be_an_instance_of(User)
25
+ end
26
+
27
+ it 'should set the response' do
28
+ user.update_attributes('a' => 'b').response.should == { 'a' => 'b' }
29
+ end
30
+ end
31
+ end
32
+
33
+ context '.get' do
34
+ it 'should return a new object' do
35
+ user.get.should be_an_instance_of(User)
36
+ end
37
+ end
38
+
39
+ context '.post' do
40
+ it 'should return a new object' do
41
+ user.post.should be_an_instance_of(User)
42
+ end
43
+ end
44
+
45
+ context '.put' do
46
+ it 'should return a new object' do
47
+ user.put.should be_an_instance_of(User)
48
+ end
49
+ end
50
+
51
+ context '.patch' do
52
+ it 'should return a new object' do
53
+ user.patch.should be_an_instance_of(User)
54
+ end
55
+ end
56
+
57
+ context '.delete' do
58
+ it 'should return a new object' do
59
+ user.delete.should be_an_instance_of(User)
60
+ end
61
+ end
62
+ end
data/spec/spec_helper.rb CHANGED
@@ -15,7 +15,7 @@ class User < ApiClient::Base
15
15
  end
16
16
 
17
17
  class Admin < ApiClient::Base
18
- self.remote_object = 'user'
18
+ self.root_node = 'user'
19
19
 
20
20
  attr_accessor :a, :b
21
21
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc2
5
- prerelease: 6
4
+ version: 2.0.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Paulo Henrique Lopes Ribeiro
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-09 00:00:00.000000000 Z
12
+ date: 2013-06-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
@@ -172,10 +172,12 @@ files:
172
172
  - lib/api-client/parser.rb
173
173
  - lib/api-client/version.rb
174
174
  - spec/api-client/base_spec.rb
175
+ - spec/api-client/class_methods_spec.rb
175
176
  - spec/api-client/collection_spec.rb
176
177
  - spec/api-client/configuration_spec.rb
177
178
  - spec/api-client/dispatcher_spec.rb
178
179
  - spec/api-client/errors_spec.rb
180
+ - spec/api-client/instance_methods_spec.rb
179
181
  - spec/api-client/parser_spec.rb
180
182
  - spec/spec_helper.rb
181
183
  homepage:
@@ -192,13 +194,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
192
194
  version: '0'
193
195
  segments:
194
196
  - 0
195
- hash: -2780574729308827888
197
+ hash: 4249835467579718948
196
198
  required_rubygems_version: !ruby/object:Gem::Requirement
197
199
  none: false
198
200
  requirements:
199
- - - ! '>'
201
+ - - ! '>='
200
202
  - !ruby/object:Gem::Version
201
- version: 1.3.1
203
+ version: '0'
204
+ segments:
205
+ - 0
206
+ hash: 4249835467579718948
202
207
  requirements: []
203
208
  rubyforge_project:
204
209
  rubygems_version: 1.8.25
@@ -215,10 +220,12 @@ test_files:
215
220
  - gemfiles/Gemfile.net_http
216
221
  - gemfiles/Gemfile.typhoeus
217
222
  - spec/api-client/base_spec.rb
223
+ - spec/api-client/class_methods_spec.rb
218
224
  - spec/api-client/collection_spec.rb
219
225
  - spec/api-client/configuration_spec.rb
220
226
  - spec/api-client/dispatcher_spec.rb
221
227
  - spec/api-client/errors_spec.rb
228
+ - spec/api-client/instance_methods_spec.rb
222
229
  - spec/api-client/parser_spec.rb
223
230
  - spec/spec_helper.rb
224
231
  has_rdoc: