party_resource 0.0.2 → 0.0.3

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.
@@ -11,7 +11,9 @@ module PartyResource
11
11
  end
12
12
 
13
13
  def fetch(request)
14
- response = HTTParty.send(request.verb, request.path, request.http_data(options))
14
+ params = request.http_data(options)
15
+ log "** PartyResource #{request.verb.to_s.upcase} call to #{request.path} with #{params.inspect}"
16
+ response = HTTParty.send(request.verb, request.path, params)
15
17
  unless (200..399).include? response.code
16
18
  raise PartyResource::Exceptions::ConnectionError.build(response)
17
19
  end
@@ -20,6 +22,16 @@ module PartyResource
20
22
 
21
23
  private
22
24
 
25
+ def log(message)
26
+ unless PartyResource.logger.nil?
27
+ if PartyResource.logger.is_a? Proc
28
+ PartyResource.logger.call message
29
+ else
30
+ PartyResource.logger.debug message
31
+ end
32
+ end
33
+ end
34
+
23
35
  def options=(options)
24
36
  @options = {}
25
37
  @options[:base_uri] = HTTParty.normalize_base_uri(options[:base_uri]) if options.has_key?(:base_uri)
@@ -12,6 +12,17 @@ module PartyResource
12
12
  end
13
13
 
14
14
  # Add a new named connector
15
+ # @param [Symbol] name Name for new connector
16
+ # @param [Hash] options
17
+ # @option options [String] :base_uri ('') URI to append to all routes using this connector
18
+ # @option options [String] :username HTTP basic auth username
19
+ # @option options [String] :password HTTP basic auth password
20
+ # @option options [Boolean] :default (false) Set this connector as the default
21
+ # @example
22
+ # PartyResource::Connector.add(:other_connector, {:base_uri => 'http://otherserver/'})
23
+ # @example
24
+ # PartyResource::Connector.add(:my_connector, {:base_uri => 'http://myserver/path', :username => 'fred', :password => 'pass', :default => true})
25
+
15
26
  def add(name, options)
16
27
  repository.new_connector(name, options)
17
28
  end
@@ -3,11 +3,60 @@ Hash.send(:include, ActiveSupport::CoreExtensions::Hash::IndifferentAccess) unle
3
3
 
4
4
  module PartyResource
5
5
 
6
+ # Set logger to use
7
+ # @param logger One of:
8
+ #
9
+ # nil - no logging
10
+ #
11
+ # Proc - log using logger.call(message)
12
+ #
13
+ # Object - log using logger.debug(message)
14
+ def self.logger=(logger)
15
+ @logger = logger
16
+ end
17
+
18
+ # @private
19
+ def self.logger
20
+ @logger
21
+ end
22
+
6
23
  module ClassMethods
7
24
  include MethodDefine
8
25
 
9
26
  # Connect a method call to a restful uri
27
+ # @param [Symbol] name for method
28
+ # @param [Hash] options the options to use to create the route
29
+ # @option options [String] :get/:put/:post/:delete URI to attach to (key provides the HTTP verb)
30
+ # @option options :as (:self) How to build data returned by the route
31
+ #
32
+ # :raw - raw data
33
+ #
34
+ # :self - self.new(data)
35
+ #
36
+ # class - class.new(data)
37
+ #
38
+ # Array(class, method_name) - class.method_name(data)
39
+ #
40
+ # lambda - lambda.call(data)
41
+ # @option options [Array/Symbol] :with ([]) List of parameter names
42
+ # @option options :on (:class) Where to attach the method (:class/:instance)
43
+ # @option options [Hash<Symbol, Symbol>] :including ({}) Hash of extra values to pass into object creation
44
+ # @option options [Hash<String, Object>] :rescue ({}) Hash of {Exceptions Exception} names to catch and the value to return
10
45
  # @return [nil]
46
+ # @example
47
+ # connect :find, :get => '/find/:id.ext', :with => :id, :on => :class
48
+ # @example
49
+ # connect :update, :put => '/update/:var.ext', :on => :instance, :as => OtherClass
50
+ # @example
51
+ # connect :save, :post => '/save/file', :with => :data, :as => :raw
52
+ # @example
53
+ # connect :destroy, :delete => '/delete', :as => [OtherClass, :make_boolean]
54
+ # @example
55
+ # connect :foo, :get => '/foo', :with => :value, :as => lambda {|data| "New #{data} Improved" }
56
+ # @example
57
+ # connect :fetch_json, :get => '/big_data', :as => [:self, :from_json], :rescue => {'ResourceNotFound' => nil}
58
+ # @example
59
+ # connect :include, :get => '/include', :on => :instance, :as => OtherClass, :including => {:thing => :value2}
11
60
  def connect(name, options={})
12
61
  level = options.delete(:on)
13
62
  options = {:as => :self, :connector => @party_connector}.merge(options)
@@ -44,6 +93,18 @@ module PartyResource
44
93
  # symbol - name
45
94
  #
46
95
  # array - list of nested hash keys
96
+ # @example
97
+ # property :value, :from => :input_name
98
+ # @example
99
+ # property :value2, :value3
100
+ # @example
101
+ # property :nested_value, :from => [:block, :var]
102
+ # @example
103
+ # property :other, :as => OtherClass
104
+ # @example
105
+ # property :processed, :as => lambda { |data| "Processed: #{data}" }, :to => :output_name
106
+ # @example
107
+ # property :child, :as => OtherPartyClass
47
108
  # @return [nil]
48
109
  def property(*names)
49
110
  options = names.pop if names.last.is_a?(Hash)
@@ -59,6 +120,9 @@ module PartyResource
59
120
  end
60
121
 
61
122
  # Set the name of the connector to use for this class
123
+ # @param [Symbol] name Name of connector
124
+ # @example
125
+ # party_connector :my_shiny_connector
62
126
  # @return [nil]
63
127
  def party_connector(name)
64
128
  @party_connector = name
@@ -76,7 +140,9 @@ module PartyResource
76
140
  end
77
141
  end
78
142
 
143
+ @private
79
144
  module ParameterValues
145
+ @private
80
146
  def parameter_values(list)
81
147
  list.inject({}) do |out, var|
82
148
  begin
@@ -7,6 +7,10 @@ describe TestClass do
7
7
 
8
8
  let(:object) {TestClass.new(:foo)}
9
9
 
10
+ after do
11
+ PartyResource.logger = nil
12
+ end
13
+
10
14
  describe 'class level call' do
11
15
  it 'raises an argument error when called with the wrong number of arguments' do
12
16
  lambda { TestClass.find }.should raise_error(ArgumentError)
@@ -170,4 +174,40 @@ describe TestClass do
170
174
  obj.to_properties_hash.should == {:input_name => 'v1', :value2 => 'v2', :block => {:var => 'nv'}, :output_name => 'Processed: Milk', :child => {:thing => 'Happiness'}}
171
175
  end
172
176
  end
177
+
178
+ describe 'logging' do
179
+ context 'with no logger' do
180
+ it 'does not fail' do
181
+ stub_request(:get, "http://fred:pass@myserver/path/find/99.ext").to_return(:body => 'some data')
182
+ TestClass.find(99)
183
+ end
184
+ end
185
+
186
+ context 'with a logger object' do
187
+ before do
188
+ @logger = mock(:logger)
189
+ PartyResource.logger = @logger
190
+ end
191
+
192
+ it 'logs all api calls to debug' do
193
+ stub_request(:get, "http://fred:pass@myserver/path/find/99.ext").to_return(:body => 'some data')
194
+ @logger.should_receive(:debug).with('** PartyResource GET call to /find/99.ext with {:basic_auth=>{:username=>"fred", :password=>"pass"}, :base_uri=>"http://myserver/path"}')
195
+ TestClass.find(99)
196
+ end
197
+ end
198
+
199
+ context 'with a logger lambda' do
200
+ before do
201
+ @logger = mock(:logger)
202
+ PartyResource.logger = lambda {|message| @logger.log(message) }
203
+ end
204
+
205
+ it 'logs all api calls to debug' do
206
+ stub_request(:get, "http://fred:pass@myserver/path/find/99.ext").to_return(:body => 'some data')
207
+ @logger.should_receive(:log).with('** PartyResource GET call to /find/99.ext with {:basic_auth=>{:username=>"fred", :password=>"pass"}, :base_uri=>"http://myserver/path"}')
208
+ TestClass.find(99)
209
+ end
210
+ end
211
+
212
+ end
173
213
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Tristan Harris
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-05-26 00:00:00 +01:00
18
+ date: 2010-06-02 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency