relax 0.0.7 → 0.1.0
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/LICENSE +1 -1
 - data/README +137 -114
 - data/Rakefile +54 -0
 - data/VERSION.yml +4 -0
 - data/lib/relax/action.rb +39 -0
 - data/lib/relax/context.rb +40 -0
 - data/lib/relax/contextable.rb +15 -0
 - data/lib/relax/endpoint.rb +21 -0
 - data/lib/relax/instance.rb +23 -0
 - data/lib/relax/parameter.rb +19 -0
 - data/lib/relax/performer.rb +32 -0
 - data/lib/relax/service.rb +19 -88
 - data/lib/relax.rb +15 -10
 - data/spec/relax/endpoint_spec.rb +69 -0
 - data/spec/relax/integration_spec.rb +63 -0
 - data/spec/relax/service_spec.rb +21 -0
 - data/spec/services/flickr.rb +78 -0
 - data/spec/spec_helper.rb +12 -0
 - metadata +71 -30
 - data/lib/relax/parsers/base.rb +0 -30
 - data/lib/relax/parsers/factory.rb +0 -29
 - data/lib/relax/parsers/hpricot.rb +0 -133
 - data/lib/relax/parsers/rexml.rb +0 -147
 - data/lib/relax/parsers.rb +0 -13
 - data/lib/relax/query.rb +0 -46
 - data/lib/relax/request.rb +0 -107
 - data/lib/relax/response.rb +0 -82
 - data/lib/relax/symbolic_hash.rb +0 -79
 - data/spec/parsers/factory_spec.rb +0 -29
 - data/spec/parsers/hpricot_spec.rb +0 -31
 - data/spec/parsers/rexml_spec.rb +0 -36
 - data/spec/query_spec.rb +0 -60
 - data/spec/request_spec.rb +0 -114
 - data/spec/response_spec.rb +0 -98
 - data/spec/symbolic_hash_spec.rb +0 -67
 
    
        data/lib/relax/service.rb
    CHANGED
    
    | 
         @@ -1,101 +1,32 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require 'openssl'
         
     | 
| 
       2 
     | 
    
         
            -
            require 'net/https'
         
     | 
| 
       3 
     | 
    
         
            -
            require 'uri'
         
     | 
| 
       4 
     | 
    
         
            -
            require 'date'
         
     | 
| 
       5 
     | 
    
         
            -
            require 'base64'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'erb'
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
       8 
1 
     | 
    
         
             
            module Relax
         
     | 
| 
       9 
     | 
    
         
            -
              # Service is the starting point for any REST consumer written with Relax. It
         
     | 
| 
       10 
     | 
    
         
            -
              # is responsible for setting up the endpoint for the service, and issuing the
         
     | 
| 
       11 
     | 
    
         
            -
              # HTTP requests for each call made.
         
     | 
| 
       12 
     | 
    
         
            -
              #
         
     | 
| 
       13 
     | 
    
         
            -
              # == Extending Service
         
     | 
| 
       14 
     | 
    
         
            -
              #
         
     | 
| 
       15 
     | 
    
         
            -
              # When writing consumers, you should start by extending Service by inheriting
         
     | 
| 
       16 
     | 
    
         
            -
              # from it and calling its constructor with the endpoint for the service.
         
     | 
| 
       17 
     | 
    
         
            -
              #
         
     | 
| 
       18 
     | 
    
         
            -
              # === Example
         
     | 
| 
       19 
     | 
    
         
            -
              #
         
     | 
| 
       20 
     | 
    
         
            -
              #   class Service < Relax::Service
         
     | 
| 
       21 
     | 
    
         
            -
              #     ENDPOINT = 'http://example.com/services/rest/'
         
     | 
| 
       22 
     | 
    
         
            -
              #
         
     | 
| 
       23 
     | 
    
         
            -
              #     def initialize
         
     | 
| 
       24 
     | 
    
         
            -
              #       super(ENDPOINT)
         
     | 
| 
       25 
     | 
    
         
            -
              #     end
         
     | 
| 
       26 
     | 
    
         
            -
              #   end
         
     | 
| 
       27 
     | 
    
         
            -
              #
         
     | 
| 
       28 
     | 
    
         
            -
              # == Calling a Service
         
     | 
| 
       29 
     | 
    
         
            -
              #
         
     | 
| 
       30 
     | 
    
         
            -
              # Each call made to the service goes through the #call method of Service,
         
     | 
| 
       31 
     | 
    
         
            -
              # which takes in a Request object and a Response class. The Request object is
         
     | 
| 
       32 
     | 
    
         
            -
              # used to generate the query string that will be passed to the endpoint. The
         
     | 
| 
       33 
     | 
    
         
            -
              # Reponse class is instantiated with the body of the response from the HTTP
         
     | 
| 
       34 
     | 
    
         
            -
              # request.
         
     | 
| 
       35 
     | 
    
         
            -
              #
         
     | 
| 
       36 
     | 
    
         
            -
              # === Example
         
     | 
| 
       37 
     | 
    
         
            -
              #
         
     | 
| 
       38 
     | 
    
         
            -
              # This example show how to create a barebones call. This module can be then
         
     | 
| 
       39 
     | 
    
         
            -
              # included into your Service class.
         
     | 
| 
       40 
     | 
    
         
            -
              #
         
     | 
| 
       41 
     | 
    
         
            -
              #   module Search
         
     | 
| 
       42 
     | 
    
         
            -
              #     class SearchRequest < Relax::Request
         
     | 
| 
       43 
     | 
    
         
            -
              #     end
         
     | 
| 
       44 
     | 
    
         
            -
              #
         
     | 
| 
       45 
     | 
    
         
            -
              #     class SearchResponse < Relax::Response
         
     | 
| 
       46 
     | 
    
         
            -
              #     end
         
     | 
| 
       47 
     | 
    
         
            -
              #
         
     | 
| 
       48 
     | 
    
         
            -
              #     def search(options = {})
         
     | 
| 
       49 
     | 
    
         
            -
              #       call(SearchRequest.new(options), SearchResponse)
         
     | 
| 
       50 
     | 
    
         
            -
              #     end
         
     | 
| 
       51 
     | 
    
         
            -
              #   end
         
     | 
| 
       52 
     | 
    
         
            -
              #
         
     | 
| 
       53 
2 
     | 
    
         
             
              class Service
         
     | 
| 
       54 
     | 
    
         
            -
                 
     | 
| 
       55 
     | 
    
         
            -
             
     | 
| 
       56 
     | 
    
         
            -
                # This constructor should be called from your Service with the endpoint URL
         
     | 
| 
       57 
     | 
    
         
            -
                # for the REST service.
         
     | 
| 
       58 
     | 
    
         
            -
                def initialize(endpoint)
         
     | 
| 
       59 
     | 
    
         
            -
                  @endpoint = URI::parse(endpoint)
         
     | 
| 
      
 3 
     | 
    
         
            +
                def initialize(values={})
         
     | 
| 
      
 4 
     | 
    
         
            +
                  @values = values
         
     | 
| 
       60 
5 
     | 
    
         
             
                end
         
     | 
| 
       61 
6 
     | 
    
         | 
| 
       62 
     | 
    
         
            -
                 
     | 
| 
       63 
     | 
    
         
            -
             
     | 
| 
       64 
     | 
    
         
            -
                # Calls the service using a query built from the Request object passed in
         
     | 
| 
       65 
     | 
    
         
            -
                # as its first parameter. Once the response comes back from the service,
         
     | 
| 
       66 
     | 
    
         
            -
                # the body of the response is used to instantiate the response class, and
         
     | 
| 
       67 
     | 
    
         
            -
                # this response object is returned.
         
     | 
| 
       68 
     | 
    
         
            -
                def call(request, response_class)
         
     | 
| 
       69 
     | 
    
         
            -
                  request.valid?
         
     | 
| 
       70 
     | 
    
         
            -
                  uri = @endpoint.clone
         
     | 
| 
       71 
     | 
    
         
            -
                  uri.query = query(request).to_s
         
     | 
| 
       72 
     | 
    
         
            -
                  response = request(uri)
         
     | 
| 
       73 
     | 
    
         
            -
                  puts "Response:\n#{response.body}\n\n" if $DEBUG
         
     | 
| 
       74 
     | 
    
         
            -
                  response_class.new(response.body)
         
     | 
| 
      
 7 
     | 
    
         
            +
                def authenticate(*args)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @credentials = args
         
     | 
| 
       75 
9 
     | 
    
         
             
                end
         
     | 
| 
       76 
10 
     | 
    
         | 
| 
       77 
     | 
    
         
            -
                 
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                def default_query
         
     | 
| 
       80 
     | 
    
         
            -
                  Query.new
         
     | 
| 
       81 
     | 
    
         
            -
                end
         
     | 
| 
      
 11 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 12 
     | 
    
         
            +
                  include Contextable
         
     | 
| 
       82 
13 
     | 
    
         | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def endpoint(url, options={}, &block)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    Endpoint.new(self, url, options, &block)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  end
         
     | 
| 
       86 
17 
     | 
    
         | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
                  http = Net::HTTP.new(uri.host, uri.port)
         
     | 
| 
      
 18 
     | 
    
         
            +
                  def register_action(action) # :nodoc:
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @actions ||= {}
         
     | 
| 
       90 
20 
     | 
    
         | 
| 
       91 
     | 
    
         
            -
             
     | 
| 
       92 
     | 
    
         
            -
             
     | 
| 
       93 
     | 
    
         
            -
                    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
         
     | 
| 
       94 
     | 
    
         
            -
                  end
         
     | 
| 
      
 21 
     | 
    
         
            +
                    unless @actions[action.name]
         
     | 
| 
      
 22 
     | 
    
         
            +
                      @actions[action.name] = action.name
         
     | 
| 
       95 
23 
     | 
    
         | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
       97 
     | 
    
         
            -
             
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
      
 24 
     | 
    
         
            +
                      define_method(action.name) do |*args|
         
     | 
| 
      
 25 
     | 
    
         
            +
                        action.execute(@values, @credentials, *args)
         
     | 
| 
      
 26 
     | 
    
         
            +
                      end
         
     | 
| 
      
 27 
     | 
    
         
            +
                    else
         
     | 
| 
      
 28 
     | 
    
         
            +
                      raise ArgumentError.new("Duplicate action '#{action.name}'.") 
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
       99 
30 
     | 
    
         
             
                  end
         
     | 
| 
       100 
31 
     | 
    
         
             
                end
         
     | 
| 
       101 
32 
     | 
    
         
             
              end
         
     | 
    
        data/lib/relax.rb
    CHANGED
    
    | 
         @@ -1,13 +1,18 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
      
 1 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
       2 
2 
     | 
    
         | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
            require ' 
     | 
| 
       5 
     | 
    
         
            -
            require 'relax/request'
         
     | 
| 
       6 
     | 
    
         
            -
            require 'relax/response'
         
     | 
| 
       7 
     | 
    
         
            -
            require 'relax/service'
         
     | 
| 
       8 
     | 
    
         
            -
            require 'relax/symbolic_hash'
         
     | 
| 
      
 3 
     | 
    
         
            +
            gem 'relief', '~> 0.0.2'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require 'relief'
         
     | 
| 
       9 
5 
     | 
    
         | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
             
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 6 
     | 
    
         
            +
            gem 'rest-client', '~> 0.9.2'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require 'restclient'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module Relax # :nodoc:
         
     | 
| 
      
 10 
     | 
    
         
            +
              autoload :Action, 'relax/action'
         
     | 
| 
      
 11 
     | 
    
         
            +
              autoload :Context, 'relax/context'
         
     | 
| 
      
 12 
     | 
    
         
            +
              autoload :Contextable, 'relax/contextable'
         
     | 
| 
      
 13 
     | 
    
         
            +
              autoload :Endpoint, 'relax/endpoint'
         
     | 
| 
      
 14 
     | 
    
         
            +
              autoload :Instance, 'relax/instance'
         
     | 
| 
      
 15 
     | 
    
         
            +
              autoload :Parameter, 'relax/parameter'
         
     | 
| 
      
 16 
     | 
    
         
            +
              autoload :Performer, 'relax/performer'
         
     | 
| 
      
 17 
     | 
    
         
            +
              autoload :Service, 'relax/service'
         
     | 
| 
       13 
18 
     | 
    
         
             
            end
         
     | 
| 
         @@ -0,0 +1,69 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.join(File.dirname(__FILE__), '..', 'spec_helper')
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Relax::Endpoint do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "provides access to the URL" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                service = Class.new(Relax::Service)
         
     | 
| 
      
 6 
     | 
    
         
            +
                endpoint = service.endpoint("http://api.example.com/") { }
         
     | 
| 
      
 7 
     | 
    
         
            +
                endpoint.url.should == "http://api.example.com/"
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              it "allows contextual defaults to be set" do
         
     | 
| 
      
 11 
     | 
    
         
            +
                service = Class.new(Relax::Service)
         
     | 
| 
      
 12 
     | 
    
         
            +
                endpoint = service.endpoint("http://api.example.com/") { }
         
     | 
| 
      
 13 
     | 
    
         
            +
                endpoint.should respond_to(:defaults)
         
     | 
| 
      
 14 
     | 
    
         
            +
              end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
              describe "actions" do
         
     | 
| 
      
 17 
     | 
    
         
            +
                it "actions should check for required values for service defaults" do
         
     | 
| 
      
 18 
     | 
    
         
            +
                  service = Class.new(Relax::Service) do
         
     | 
| 
      
 19 
     | 
    
         
            +
                    defaults { parameter :api_key, :required => true }
         
     | 
| 
      
 20 
     | 
    
         
            +
                    endpoint("http://api.example.com/") { action(:fetch) { } }
         
     | 
| 
      
 21 
     | 
    
         
            +
                  end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                  proc {
         
     | 
| 
      
 24 
     | 
    
         
            +
                    service.new.fetch
         
     | 
| 
      
 25 
     | 
    
         
            +
                  }.should raise_error(ArgumentError, /missing.*api_key/i)
         
     | 
| 
      
 26 
     | 
    
         
            +
                end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                it "actions should check for required values for endpoint defaults" do
         
     | 
| 
      
 29 
     | 
    
         
            +
                  service = Class.new(Relax::Service) do
         
     | 
| 
      
 30 
     | 
    
         
            +
                    endpoint("http://api.example.com/") do
         
     | 
| 
      
 31 
     | 
    
         
            +
                      defaults { parameter :operation, :required => true }
         
     | 
| 
      
 32 
     | 
    
         
            +
                      action(:fetch) { }
         
     | 
| 
      
 33 
     | 
    
         
            +
                    end
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  proc {
         
     | 
| 
      
 37 
     | 
    
         
            +
                    service.new.fetch
         
     | 
| 
      
 38 
     | 
    
         
            +
                  }.should raise_error(ArgumentError, /missing.*operation/i)
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                it "actions should check for required values for action parameters" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  service = Class.new(Relax::Service) do
         
     | 
| 
      
 43 
     | 
    
         
            +
                    endpoint("http://api.example.com/") do
         
     | 
| 
      
 44 
     | 
    
         
            +
                      action(:fetch) { parameter :id, :required => true }
         
     | 
| 
      
 45 
     | 
    
         
            +
                    end
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  proc {
         
     | 
| 
      
 49 
     | 
    
         
            +
                    service.new.fetch
         
     | 
| 
      
 50 
     | 
    
         
            +
                  }.should raise_error(ArgumentError, /missing.*id/i)
         
     | 
| 
      
 51 
     | 
    
         
            +
                end
         
     | 
| 
      
 52 
     | 
    
         
            +
              end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
              describe ".action" do
         
     | 
| 
      
 55 
     | 
    
         
            +
                it "is callable from within an Endpoint" do
         
     | 
| 
      
 56 
     | 
    
         
            +
                  service = Class.new(Relax::Service)
         
     | 
| 
      
 57 
     | 
    
         
            +
                  endpoint = service.endpoint("http://api.example.com/") { }
         
     | 
| 
      
 58 
     | 
    
         
            +
                  endpoint.should respond_to(:action)
         
     | 
| 
      
 59 
     | 
    
         
            +
                end
         
     | 
| 
      
 60 
     | 
    
         
            +
             
     | 
| 
      
 61 
     | 
    
         
            +
                it "defines an instance method by the same name on the Service" do
         
     | 
| 
      
 62 
     | 
    
         
            +
                  service = Class.new(Relax::Service)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  service.new.should_not respond_to(:fetch)
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  service.endpoint("http://api.example.com/") { action :fetch }
         
     | 
| 
      
 66 
     | 
    
         
            +
                  service.new.should respond_to(:fetch)
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,63 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.join(File.dirname(__FILE__), '..', 'spec_helper')
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe "an example service's" do
         
     | 
| 
      
 4 
     | 
    
         
            +
              describe "get_photos action" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                it "includes :get_photos" do
         
     | 
| 
      
 6 
     | 
    
         
            +
                  Flickr.new.should respond_to(:get_photos)
         
     | 
| 
      
 7 
     | 
    
         
            +
                end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
                it "requires an API key" do
         
     | 
| 
      
 10 
     | 
    
         
            +
                  proc {
         
     | 
| 
      
 11 
     | 
    
         
            +
                    Flickr.new.get_photos
         
     | 
| 
      
 12 
     | 
    
         
            +
                  }.should raise_error(ArgumentError, /missing.*api_key/i)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                it "requires a user ID" do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  proc {
         
     | 
| 
      
 17 
     | 
    
         
            +
                    Flickr.new(:api_key => 'secret').get_photos
         
     | 
| 
      
 18 
     | 
    
         
            +
                  }.should raise_error(ArgumentError, /missing.*user_id/i)
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                it "parses the response" do
         
     | 
| 
      
 22 
     | 
    
         
            +
                  flickr = Flickr.new(:api_key => 'secret')
         
     | 
| 
      
 23 
     | 
    
         
            +
                  flickr.get_photos(:user_id => '59532755@N00', :per_page => 3).should == {
         
     | 
| 
      
 24 
     | 
    
         
            +
                    :status => 'ok',
         
     | 
| 
      
 25 
     | 
    
         
            +
                    :photos => {
         
     | 
| 
      
 26 
     | 
    
         
            +
                      :total => '7830',
         
     | 
| 
      
 27 
     | 
    
         
            +
                      :photo => [
         
     | 
| 
      
 28 
     | 
    
         
            +
                        { :ispublic => '1', :isfriend => '0', :owner => '59532755@N00', :isfamily => '0', :secret => '2ebe0307e3', :server => '3562', :farm => '4', :id => '3508500178', :title => 'Rich Kilmer'},
         
     | 
| 
      
 29 
     | 
    
         
            +
                        {:ispublic => '1', :isfriend => '0', :owner => '59532755@N00', :isfamily => '0', :secret => '10b217377b', :server => '3593', :farm => '4', :id => '3508500140', :title => 'Women In Rails'},
         
     | 
| 
      
 30 
     | 
    
         
            +
                        {:ispublic => '1', :isfriend => '0', :owner => '59532755@N00', :isfamily => '0', :secret => '83bc8fbf71', :server => '3620', :farm => '4', :id => '3507688713', :title => 'Obie Fernandez'}
         
     | 
| 
      
 31 
     | 
    
         
            +
                      ],
         
     | 
| 
      
 32 
     | 
    
         
            +
                      :per_page => '3',
         
     | 
| 
      
 33 
     | 
    
         
            +
                      :pages => '2610',
         
     | 
| 
      
 34 
     | 
    
         
            +
                      :page => '1'
         
     | 
| 
      
 35 
     | 
    
         
            +
                    }
         
     | 
| 
      
 36 
     | 
    
         
            +
                  }
         
     | 
| 
      
 37 
     | 
    
         
            +
                end
         
     | 
| 
      
 38 
     | 
    
         
            +
              end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              describe "get_user_by_username action" do
         
     | 
| 
      
 41 
     | 
    
         
            +
                it "includes :get_user_by_username" do
         
     | 
| 
      
 42 
     | 
    
         
            +
                  Flickr.new.should respond_to(:get_user_by_username)
         
     | 
| 
      
 43 
     | 
    
         
            +
                end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                it "requires an API key" do
         
     | 
| 
      
 46 
     | 
    
         
            +
                  proc {
         
     | 
| 
      
 47 
     | 
    
         
            +
                    Flickr.new.get_user_by_username
         
     | 
| 
      
 48 
     | 
    
         
            +
                  }.should raise_error(ArgumentError, /missing.*api_key/i)
         
     | 
| 
      
 49 
     | 
    
         
            +
                end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                it "parses the response" do
         
     | 
| 
      
 52 
     | 
    
         
            +
                  flickr = Flickr.new(:api_key => 'secret')
         
     | 
| 
      
 53 
     | 
    
         
            +
                  flickr.get_user_by_username(:username => 'duncandavidson').should == {
         
     | 
| 
      
 54 
     | 
    
         
            +
                    :user => {
         
     | 
| 
      
 55 
     | 
    
         
            +
                      :username => 'duncandavidson',
         
     | 
| 
      
 56 
     | 
    
         
            +
                      :nsid => '59532755@N00',
         
     | 
| 
      
 57 
     | 
    
         
            +
                      :id => '59532755@N00'
         
     | 
| 
      
 58 
     | 
    
         
            +
                    },
         
     | 
| 
      
 59 
     | 
    
         
            +
                    :status => 'ok'
         
     | 
| 
      
 60 
     | 
    
         
            +
                  }
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
              end
         
     | 
| 
      
 63 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,21 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require File.join(File.dirname(__FILE__), '..', 'spec_helper')
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            describe Relax::Service do
         
     | 
| 
      
 4 
     | 
    
         
            +
              it "allows contextual defaults to be set" do
         
     | 
| 
      
 5 
     | 
    
         
            +
                Relax::Service.should respond_to(:defaults)
         
     | 
| 
      
 6 
     | 
    
         
            +
              end
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
              describe ".endpoint" do
         
     | 
| 
      
 9 
     | 
    
         
            +
                it "is callable from within a Service" do
         
     | 
| 
      
 10 
     | 
    
         
            +
                  Relax::Service.should respond_to(:endpoint)
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                it "creates a new Endpoint" do
         
     | 
| 
      
 14 
     | 
    
         
            +
                  Relax::Endpoint.should_receive(:new)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  class Service < Relax::Service
         
     | 
| 
      
 17 
     | 
    
         
            +
                    endpoint "http://api.example.com/"
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
              end
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,78 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class Flickr < Relax::Service
         
     | 
| 
      
 2 
     | 
    
         
            +
              defaults do
         
     | 
| 
      
 3 
     | 
    
         
            +
                parameter :api_key, :required => true
         
     | 
| 
      
 4 
     | 
    
         
            +
              end
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              endpoint "http://api.flickr.com/services/rest" do
         
     | 
| 
      
 7 
     | 
    
         
            +
                defaults do
         
     | 
| 
      
 8 
     | 
    
         
            +
                  parameter :method, :required => true
         
     | 
| 
      
 9 
     | 
    
         
            +
                end
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                action :get_photos do
         
     | 
| 
      
 12 
     | 
    
         
            +
                  set :method, "flickr.people.getPublicPhotos"
         
     | 
| 
      
 13 
     | 
    
         
            +
                  parameter :user_id, :required => true
         
     | 
| 
      
 14 
     | 
    
         
            +
                  parameter :safe_search
         
     | 
| 
      
 15 
     | 
    
         
            +
                  parameter :extras
         
     | 
| 
      
 16 
     | 
    
         
            +
                  parameter :per_page
         
     | 
| 
      
 17 
     | 
    
         
            +
                  parameter :page
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  parser :rsp do
         
     | 
| 
      
 20 
     | 
    
         
            +
                    element :status, :attribute => :stat
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    element :photos do
         
     | 
| 
      
 23 
     | 
    
         
            +
                      element :page, :attribute => true
         
     | 
| 
      
 24 
     | 
    
         
            +
                      element :pages, :attribute => true
         
     | 
| 
      
 25 
     | 
    
         
            +
                      element :per_page, :attribute => :perpage
         
     | 
| 
      
 26 
     | 
    
         
            +
                      element :total, :attribute => true
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                      elements :photo do
         
     | 
| 
      
 29 
     | 
    
         
            +
                        element :id, :attribute => true
         
     | 
| 
      
 30 
     | 
    
         
            +
                        element :owner, :attribute => true
         
     | 
| 
      
 31 
     | 
    
         
            +
                        element :secret, :attribute => true
         
     | 
| 
      
 32 
     | 
    
         
            +
                        element :server, :attribute => true
         
     | 
| 
      
 33 
     | 
    
         
            +
                        element :farm, :attribute => true
         
     | 
| 
      
 34 
     | 
    
         
            +
                        element :title, :attribute => true
         
     | 
| 
      
 35 
     | 
    
         
            +
                        element :ispublic, :attribute => true
         
     | 
| 
      
 36 
     | 
    
         
            +
                        element :isfriend, :attribute => true
         
     | 
| 
      
 37 
     | 
    
         
            +
                        element :isfamily, :attribute => true
         
     | 
| 
      
 38 
     | 
    
         
            +
                      end
         
     | 
| 
      
 39 
     | 
    
         
            +
                    end
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
                end
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                action :get_user_by_username do
         
     | 
| 
      
 44 
     | 
    
         
            +
                  set :method, "flickr.people.findByUsername"
         
     | 
| 
      
 45 
     | 
    
         
            +
                  parameter :username, :required => true
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  parser :rsp do
         
     | 
| 
      
 48 
     | 
    
         
            +
                    element :status, :attribute => :stat
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                    element :user do
         
     | 
| 
      
 51 
     | 
    
         
            +
                      element :id, :attribute => true
         
     | 
| 
      
 52 
     | 
    
         
            +
                      element :nsid, :attribute => true
         
     | 
| 
      
 53 
     | 
    
         
            +
                      element :username
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
            end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            FakeWeb.register_uri(:get, 'http://api.flickr.com/services/rest?api_key=secret&method=flickr.people.findByUsername&username=duncandavidson', :string => <<-RESPONSE)
         
     | 
| 
      
 61 
     | 
    
         
            +
              <?xml version="1.0" encoding="utf-8" ?>
         
     | 
| 
      
 62 
     | 
    
         
            +
              <rsp stat="ok">
         
     | 
| 
      
 63 
     | 
    
         
            +
                <user id="59532755@N00" nsid="59532755@N00">
         
     | 
| 
      
 64 
     | 
    
         
            +
                  <username>duncandavidson</username>
         
     | 
| 
      
 65 
     | 
    
         
            +
                </user>
         
     | 
| 
      
 66 
     | 
    
         
            +
              </rsp>
         
     | 
| 
      
 67 
     | 
    
         
            +
            RESPONSE
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
            FakeWeb.register_uri(:get, 'http://api.flickr.com/services/rest?user_id=59532755@N00&per_page=3&method=flickr.people.getPublicPhotos&api_key=secret', :string => <<-RESPONSE)
         
     | 
| 
      
 70 
     | 
    
         
            +
            <?xml version="1.0" encoding="utf-8" ?>
         
     | 
| 
      
 71 
     | 
    
         
            +
            <rsp stat="ok">
         
     | 
| 
      
 72 
     | 
    
         
            +
              <photos page="1" pages="2610" perpage="3" total="7830">
         
     | 
| 
      
 73 
     | 
    
         
            +
                <photo id="3508500178" owner="59532755@N00" secret="2ebe0307e3" server="3562" farm="4" title="Rich Kilmer" ispublic="1" isfriend="0" isfamily="0" />
         
     | 
| 
      
 74 
     | 
    
         
            +
                <photo id="3508500140" owner="59532755@N00" secret="10b217377b" server="3593" farm="4" title="Women In Rails" ispublic="1" isfriend="0" isfamily="0" />
         
     | 
| 
      
 75 
     | 
    
         
            +
                <photo id="3507688713" owner="59532755@N00" secret="83bc8fbf71" server="3620" farm="4" title="Obie Fernandez" ispublic="1" isfriend="0" isfamily="0" />
         
     | 
| 
      
 76 
     | 
    
         
            +
              </photos>
         
     | 
| 
      
 77 
     | 
    
         
            +
            </rsp>
         
     | 
| 
      
 78 
     | 
    
         
            +
            RESPONSE
         
     | 
    
        data/spec/spec_helper.rb
    ADDED
    
    | 
         @@ -0,0 +1,12 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            $:.push File.join(File.dirname(__FILE__), '..', 'lib')
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rubygems'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            gem 'rspec', '~> 1.2.2'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require 'spec'
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            gem 'fakeweb', '~> 1.2.2'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'fakeweb'
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            require File.join(File.dirname(__FILE__), '..', 'lib', 'relax')
         
     | 
| 
      
 12 
     | 
    
         
            +
            require File.join(File.dirname(__FILE__), 'services', 'flickr')
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification 
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: relax
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version 
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.0 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.0
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors: 
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Tyler Hunt
         
     | 
| 
         @@ -9,18 +9,58 @@ autorequire: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
            date: 2009- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2009-05-07 00:00:00 -07:00
         
     | 
| 
       13 
13 
     | 
    
         
             
            default_executable: 
         
     | 
| 
       14 
14 
     | 
    
         
             
            dependencies: 
         
     | 
| 
       15 
15 
     | 
    
         
             
            - !ruby/object:Gem::Dependency 
         
     | 
| 
       16 
     | 
    
         
            -
              name:  
     | 
| 
      
 16 
     | 
    
         
            +
              name: rest-client
         
     | 
| 
       17 
17 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       18 
18 
     | 
    
         
             
              version_requirement: 
         
     | 
| 
       19 
19 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement 
         
     | 
| 
       20 
20 
     | 
    
         
             
                requirements: 
         
     | 
| 
       21 
     | 
    
         
            -
                - -  
     | 
| 
      
 21 
     | 
    
         
            +
                - - ~>
         
     | 
| 
       22 
22 
     | 
    
         
             
                  - !ruby/object:Gem::Version 
         
     | 
| 
       23 
     | 
    
         
            -
                    version:  
     | 
| 
      
 23 
     | 
    
         
            +
                    version: 0.9.2
         
     | 
| 
      
 24 
     | 
    
         
            +
                version: 
         
     | 
| 
      
 25 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency 
         
     | 
| 
      
 26 
     | 
    
         
            +
              name: nokogiri
         
     | 
| 
      
 27 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 28 
     | 
    
         
            +
              version_requirement: 
         
     | 
| 
      
 29 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 30 
     | 
    
         
            +
                requirements: 
         
     | 
| 
      
 31 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 32 
     | 
    
         
            +
                  - !ruby/object:Gem::Version 
         
     | 
| 
      
 33 
     | 
    
         
            +
                    version: 1.2.3
         
     | 
| 
      
 34 
     | 
    
         
            +
                version: 
         
     | 
| 
      
 35 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency 
         
     | 
| 
      
 36 
     | 
    
         
            +
              name: relief
         
     | 
| 
      
 37 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 38 
     | 
    
         
            +
              version_requirement: 
         
     | 
| 
      
 39 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 40 
     | 
    
         
            +
                requirements: 
         
     | 
| 
      
 41 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 42 
     | 
    
         
            +
                  - !ruby/object:Gem::Version 
         
     | 
| 
      
 43 
     | 
    
         
            +
                    version: 0.0.3
         
     | 
| 
      
 44 
     | 
    
         
            +
                version: 
         
     | 
| 
      
 45 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency 
         
     | 
| 
      
 46 
     | 
    
         
            +
              name: jeweler
         
     | 
| 
      
 47 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 48 
     | 
    
         
            +
              version_requirement: 
         
     | 
| 
      
 49 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 50 
     | 
    
         
            +
                requirements: 
         
     | 
| 
      
 51 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 52 
     | 
    
         
            +
                  - !ruby/object:Gem::Version 
         
     | 
| 
      
 53 
     | 
    
         
            +
                    version: 0.11.0
         
     | 
| 
      
 54 
     | 
    
         
            +
                version: 
         
     | 
| 
      
 55 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency 
         
     | 
| 
      
 56 
     | 
    
         
            +
              name: rspec
         
     | 
| 
      
 57 
     | 
    
         
            +
              type: :development
         
     | 
| 
      
 58 
     | 
    
         
            +
              version_requirement: 
         
     | 
| 
      
 59 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement 
         
     | 
| 
      
 60 
     | 
    
         
            +
                requirements: 
         
     | 
| 
      
 61 
     | 
    
         
            +
                - - ~>
         
     | 
| 
      
 62 
     | 
    
         
            +
                  - !ruby/object:Gem::Version 
         
     | 
| 
      
 63 
     | 
    
         
            +
                    version: 1.2.2
         
     | 
| 
       24 
64 
     | 
    
         
             
                version: 
         
     | 
| 
       25 
65 
     | 
    
         
             
            description: 
         
     | 
| 
       26 
66 
     | 
    
         
             
            email: tyler@tylerhunt.com
         
     | 
| 
         @@ -29,29 +69,32 @@ executables: [] 
     | 
|
| 
       29 
69 
     | 
    
         
             
            extensions: []
         
     | 
| 
       30 
70 
     | 
    
         | 
| 
       31 
71 
     | 
    
         
             
            extra_rdoc_files: 
         
     | 
| 
       32 
     | 
    
         
            -
            - README
         
     | 
| 
       33 
72 
     | 
    
         
             
            - LICENSE
         
     | 
| 
      
 73 
     | 
    
         
            +
            - README
         
     | 
| 
       34 
74 
     | 
    
         
             
            files: 
         
     | 
| 
       35 
     | 
    
         
            -
            -  
     | 
| 
       36 
     | 
    
         
            -
            -  
     | 
| 
       37 
     | 
    
         
            -
            -  
     | 
| 
       38 
     | 
    
         
            -
            - lib/relax/parsers/factory.rb
         
     | 
| 
       39 
     | 
    
         
            -
            - lib/relax/parsers/hpricot.rb
         
     | 
| 
       40 
     | 
    
         
            -
            - lib/relax/parsers/rexml.rb
         
     | 
| 
       41 
     | 
    
         
            -
            - lib/relax/parsers.rb
         
     | 
| 
       42 
     | 
    
         
            -
            - lib/relax/query.rb
         
     | 
| 
       43 
     | 
    
         
            -
            - lib/relax/request.rb
         
     | 
| 
       44 
     | 
    
         
            -
            - lib/relax/response.rb
         
     | 
| 
       45 
     | 
    
         
            -
            - lib/relax/service.rb
         
     | 
| 
       46 
     | 
    
         
            -
            - lib/relax/symbolic_hash.rb
         
     | 
| 
      
 75 
     | 
    
         
            +
            - LICENSE
         
     | 
| 
      
 76 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 77 
     | 
    
         
            +
            - VERSION.yml
         
     | 
| 
       47 
78 
     | 
    
         
             
            - lib/relax.rb
         
     | 
| 
      
 79 
     | 
    
         
            +
            - lib/relax/action.rb
         
     | 
| 
      
 80 
     | 
    
         
            +
            - lib/relax/context.rb
         
     | 
| 
      
 81 
     | 
    
         
            +
            - lib/relax/contextable.rb
         
     | 
| 
      
 82 
     | 
    
         
            +
            - lib/relax/endpoint.rb
         
     | 
| 
      
 83 
     | 
    
         
            +
            - lib/relax/instance.rb
         
     | 
| 
      
 84 
     | 
    
         
            +
            - lib/relax/parameter.rb
         
     | 
| 
      
 85 
     | 
    
         
            +
            - lib/relax/performer.rb
         
     | 
| 
      
 86 
     | 
    
         
            +
            - lib/relax/service.rb
         
     | 
| 
      
 87 
     | 
    
         
            +
            - spec/relax/endpoint_spec.rb
         
     | 
| 
      
 88 
     | 
    
         
            +
            - spec/relax/integration_spec.rb
         
     | 
| 
      
 89 
     | 
    
         
            +
            - spec/relax/service_spec.rb
         
     | 
| 
      
 90 
     | 
    
         
            +
            - spec/services/flickr.rb
         
     | 
| 
      
 91 
     | 
    
         
            +
            - spec/spec_helper.rb
         
     | 
| 
       48 
92 
     | 
    
         
             
            - README
         
     | 
| 
       49 
     | 
    
         
            -
            - LICENSE
         
     | 
| 
       50 
93 
     | 
    
         
             
            has_rdoc: true
         
     | 
| 
       51 
     | 
    
         
            -
            homepage: http:// 
     | 
| 
      
 94 
     | 
    
         
            +
            homepage: http://github.com/tylerhunt/relax
         
     | 
| 
       52 
95 
     | 
    
         
             
            post_install_message: 
         
     | 
| 
       53 
     | 
    
         
            -
            rdoc_options:  
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
      
 96 
     | 
    
         
            +
            rdoc_options: 
         
     | 
| 
      
 97 
     | 
    
         
            +
            - --charset=UTF-8
         
     | 
| 
       55 
98 
     | 
    
         
             
            require_paths: 
         
     | 
| 
       56 
99 
     | 
    
         
             
            - lib
         
     | 
| 
       57 
100 
     | 
    
         
             
            required_ruby_version: !ruby/object:Gem::Requirement 
         
     | 
| 
         @@ -72,12 +115,10 @@ rubyforge_project: relax 
     | 
|
| 
       72 
115 
     | 
    
         
             
            rubygems_version: 1.3.1
         
     | 
| 
       73 
116 
     | 
    
         
             
            signing_key: 
         
     | 
| 
       74 
117 
     | 
    
         
             
            specification_version: 2
         
     | 
| 
       75 
     | 
    
         
            -
            summary: A  
     | 
| 
      
 118 
     | 
    
         
            +
            summary: A flexible library for creating web service consumers.
         
     | 
| 
       76 
119 
     | 
    
         
             
            test_files: 
         
     | 
| 
       77 
     | 
    
         
            -
            - spec/ 
     | 
| 
       78 
     | 
    
         
            -
            - spec/ 
     | 
| 
       79 
     | 
    
         
            -
            - spec/ 
     | 
| 
       80 
     | 
    
         
            -
            - spec/ 
     | 
| 
       81 
     | 
    
         
            -
            - spec/ 
     | 
| 
       82 
     | 
    
         
            -
            - spec/response_spec.rb
         
     | 
| 
       83 
     | 
    
         
            -
            - spec/symbolic_hash_spec.rb
         
     | 
| 
      
 120 
     | 
    
         
            +
            - spec/relax/endpoint_spec.rb
         
     | 
| 
      
 121 
     | 
    
         
            +
            - spec/relax/integration_spec.rb
         
     | 
| 
      
 122 
     | 
    
         
            +
            - spec/relax/service_spec.rb
         
     | 
| 
      
 123 
     | 
    
         
            +
            - spec/services/flickr.rb
         
     | 
| 
      
 124 
     | 
    
         
            +
            - spec/spec_helper.rb
         
     | 
    
        data/lib/relax/parsers/base.rb
    DELETED
    
    | 
         @@ -1,30 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Relax
         
     | 
| 
       2 
     | 
    
         
            -
              module Parsers
         
     | 
| 
       3 
     | 
    
         
            -
                class Base
         
     | 
| 
       4 
     | 
    
         
            -
                  attr_reader :parent
         
     | 
| 
       5 
     | 
    
         
            -
                  attr_reader :parameters
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
                  def initialize(raw, parent)
         
     | 
| 
       8 
     | 
    
         
            -
                    @parent = parent
         
     | 
| 
       9 
     | 
    
         
            -
                    @parameters = parent.class.instance_variable_get('@parameters')
         
     | 
| 
       10 
     | 
    
         
            -
                    parse!
         
     | 
| 
       11 
     | 
    
         
            -
                  end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                  def parse!; end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                  def root; end
         
     | 
| 
       16 
     | 
    
         
            -
                  def is?(name); end
         
     | 
| 
       17 
     | 
    
         
            -
                  def has?(name); end
         
     | 
| 
       18 
     | 
    
         
            -
                  def element(name); end
         
     | 
| 
       19 
     | 
    
         
            -
                  def elements(name); end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                  def attribute(element, name); end
         
     | 
| 
       22 
     | 
    
         
            -
                  def value(value); end
         
     | 
| 
       23 
     | 
    
         
            -
                  def text_value(value); end
         
     | 
| 
       24 
     | 
    
         
            -
                  def integer_value(value); end
         
     | 
| 
       25 
     | 
    
         
            -
                  def float_value(value); end
         
     | 
| 
       26 
     | 
    
         
            -
                  def date_value(value); end
         
     | 
| 
       27 
     | 
    
         
            -
                  def time_value(value); end
         
     | 
| 
       28 
     | 
    
         
            -
                end
         
     | 
| 
       29 
     | 
    
         
            -
              end
         
     | 
| 
       30 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,29 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module Relax
         
     | 
| 
       2 
     | 
    
         
            -
              module Parsers
         
     | 
| 
       3 
     | 
    
         
            -
                # Manages the Relax::Parsers in the library.
         
     | 
| 
       4 
     | 
    
         
            -
                module Factory
         
     | 
| 
       5 
     | 
    
         
            -
                  class << self
         
     | 
| 
       6 
     | 
    
         
            -
                    # Returns the parser class which has been registered for the given
         
     | 
| 
       7 
     | 
    
         
            -
                    # +name+.
         
     | 
| 
       8 
     | 
    
         
            -
                    def get(name)
         
     | 
| 
       9 
     | 
    
         
            -
                      @@parsers ||= {}
         
     | 
| 
       10 
     | 
    
         
            -
                      @@parsers[name] || raise(UnrecognizedParser, "Given parser name not recognized: #{name.inspect}. Expected one of: #{@@parsers.keys.inspect}")
         
     | 
| 
       11 
     | 
    
         
            -
                    end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                    # Registers a new parser with the factory. The +name+ should be unique,
         
     | 
| 
       14 
     | 
    
         
            -
                    # but if not, it will override the previously defined parser for the
         
     | 
| 
       15 
     | 
    
         
            -
                    # given +name+.
         
     | 
| 
       16 
     | 
    
         
            -
                    def register(name, klass)
         
     | 
| 
       17 
     | 
    
         
            -
                      @@parsers ||= {}
         
     | 
| 
       18 
     | 
    
         
            -
                      @@parsers[:default] = klass if @@parsers.empty?
         
     | 
| 
       19 
     | 
    
         
            -
                      @@parsers[name] = klass
         
     | 
| 
       20 
     | 
    
         
            -
                    end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                    # Removes all registered parsers from the factory.
         
     | 
| 
       23 
     | 
    
         
            -
                    def clear!
         
     | 
| 
       24 
     | 
    
         
            -
                      @@parsers = {}
         
     | 
| 
       25 
     | 
    
         
            -
                    end
         
     | 
| 
       26 
     | 
    
         
            -
                  end
         
     | 
| 
       27 
     | 
    
         
            -
                end
         
     | 
| 
       28 
     | 
    
         
            -
              end
         
     | 
| 
       29 
     | 
    
         
            -
            end
         
     |