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 
     | 
    
         
            -
                     
     | 
| 
      
 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 
     | 
    
         
            -
              -  
     | 
| 
       9 
     | 
    
         
            -
              version: 0.0. 
     | 
| 
      
 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- 
     | 
| 
      
 18 
     | 
    
         
            +
            date: 2010-06-02 00:00:00 +01:00
         
     | 
| 
       19 
19 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       20 
20 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       21 
21 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     |