jeckle 0.2.1 → 0.3.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.
- checksums.yaml +4 -4
- data/History.markdown +11 -0
- data/README.md +1 -1
- data/examples/dribbble.rb +1 -1
- data/lib/jeckle/http.rb +79 -0
- data/lib/jeckle/request.rb +4 -4
- data/lib/jeckle/resource.rb +3 -42
- data/lib/jeckle/rest_actions.rb +23 -0
- data/lib/jeckle/version.rb +1 -1
- data/lib/jeckle.rb +1 -1
- data/spec/fixtures/jeckle_config.rb +27 -25
- data/spec/fixtures/resources/fake_resource.rb +1 -1
- data/spec/jeckle/http_spec.rb +63 -0
- data/spec/jeckle/resource_spec.rb +4 -126
- data/spec/jeckle/rest_actions_spec.rb +73 -0
- metadata +9 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0fedf58b9859236e613f70bb3cfaf8f34fcba6cd
         | 
| 4 | 
            +
              data.tar.gz: f5671e5ec06652de45455208795669c487decaa8
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: d052c4ef86214fcd06f9f84c9f959e02c5c83c2d3560652f8d0fb5206f3a090f8b09d8662cd500bb125206f20cd3d7f44d2dcf33a464bfdbac66b7f99ef6d0a1
         | 
| 7 | 
            +
              data.tar.gz: 58f383cc88ac992dbef23a98e2c5af620d0c14fdf774373f8a8aa9f07a0b0f722ee496caa03769fd4324c6e7b3e060c0f65bb12f0e424e8ddb56b18da4a86ffc
         | 
    
        data/History.markdown
    ADDED
    
    
    
        data/README.md
    CHANGED
    
    
    
        data/examples/dribbble.rb
    CHANGED
    
    
    
        data/lib/jeckle/http.rb
    ADDED
    
    | @@ -0,0 +1,79 @@ | |
| 1 | 
            +
            module Jeckle
         | 
| 2 | 
            +
              module HTTP
         | 
| 3 | 
            +
                def self.included(base)
         | 
| 4 | 
            +
                  base.extend Jeckle::HTTP::APIMapping
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                module APIMapping
         | 
| 8 | 
            +
                  def inherited(base)
         | 
| 9 | 
            +
                    base.class_eval do
         | 
| 10 | 
            +
                      @api_mapping = superclass.api_mapping.dup
         | 
| 11 | 
            +
                    end
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  # The name of the resource that Jeckle uses to make the request
         | 
| 15 | 
            +
                  #
         | 
| 16 | 
            +
                  # @example
         | 
| 17 | 
            +
                  #
         | 
| 18 | 
            +
                  #   module Dribble
         | 
| 19 | 
            +
                  #     class Shot
         | 
| 20 | 
            +
                  #       include Jeckle::Resource
         | 
| 21 | 
            +
                  #     end
         | 
| 22 | 
            +
                  #   end
         | 
| 23 | 
            +
                  #
         | 
| 24 | 
            +
                  #   Shot.resource_name # => Will request for '/shots' resource
         | 
| 25 | 
            +
                  #
         | 
| 26 | 
            +
                  # To overwrite this behaviour, rewrite the resource name method in the class:
         | 
| 27 | 
            +
                  #
         | 
| 28 | 
            +
                  #   module OtherApi
         | 
| 29 | 
            +
                  #     class Project
         | 
| 30 | 
            +
                  #       include Jeckle::Resource
         | 
| 31 | 
            +
                  #
         | 
| 32 | 
            +
                  #       def self.resource_name
         | 
| 33 | 
            +
                  #         '/project'
         | 
| 34 | 
            +
                  #       end
         | 
| 35 | 
            +
                  #     end
         | 
| 36 | 
            +
                  #   end
         | 
| 37 | 
            +
                  #
         | 
| 38 | 
            +
                  def resource_name
         | 
| 39 | 
            +
                    @resource_name ||= model_name.element.pluralize
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                  # The API name that Jeckle uses to find all the api settings like domain, headers, etc.
         | 
| 43 | 
            +
                  #
         | 
| 44 | 
            +
                  # @example
         | 
| 45 | 
            +
                  #
         | 
| 46 | 
            +
                  #   Jeckle.configure do |config|
         | 
| 47 | 
            +
                  #     config.register :dribbble do |api|
         | 
| 48 | 
            +
                  #       api.base_uri = 'http://api.dribbble.com'
         | 
| 49 | 
            +
                  #     end
         | 
| 50 | 
            +
                  #   end
         | 
| 51 | 
            +
                  #
         | 
| 52 | 
            +
                  #   class Shot
         | 
| 53 | 
            +
                  #     include Jeckle::Resource
         | 
| 54 | 
            +
                  #     api :dribbble
         | 
| 55 | 
            +
                  #   end
         | 
| 56 | 
            +
                  #
         | 
| 57 | 
            +
                  def api(registered_api_name)
         | 
| 58 | 
            +
                    api_mapping[:default_api] = Jeckle::Setup.registered_apis.fetch(registered_api_name)
         | 
| 59 | 
            +
                  rescue KeyError => e
         | 
| 60 | 
            +
                    raise Jeckle::NoSuchAPIError, registered_api_name
         | 
| 61 | 
            +
                  end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                  # @deprecated Please use {#api} instead
         | 
| 64 | 
            +
                  #
         | 
| 65 | 
            +
                  def default_api(registered_api_name)
         | 
| 66 | 
            +
                    warn "[DEPRECATION] `default_api` is deprecated.  Please use `api` instead."
         | 
| 67 | 
            +
                    api(registered_api_name)
         | 
| 68 | 
            +
                  end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                  def api_mapping
         | 
| 71 | 
            +
                    @api_mapping ||= {}
         | 
| 72 | 
            +
                  end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                  def run_request(endpoint, options = {})
         | 
| 75 | 
            +
                    Jeckle::Request.run api_mapping[:default_api], endpoint, options
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
    
        data/lib/jeckle/request.rb
    CHANGED
    
    | @@ -5,8 +5,8 @@ module Jeckle | |
| 5 5 | 
             
                def initialize(api, endpoint, options = {})
         | 
| 6 6 | 
             
                  @api = api
         | 
| 7 7 |  | 
| 8 | 
            -
                  @method | 
| 9 | 
            -
                  @body | 
| 8 | 
            +
                  @method  = options.delete(:method) || :get
         | 
| 9 | 
            +
                  @body    = options.delete(:body) if %w(post put).include?(method.to_s)
         | 
| 10 10 | 
             
                  @headers = options.delete(:headers)
         | 
| 11 11 |  | 
| 12 12 | 
             
                  @endpoint = endpoint
         | 
| @@ -24,8 +24,8 @@ module Jeckle | |
| 24 24 | 
             
                def perform_api_request
         | 
| 25 25 | 
             
                  api.connection.public_send method do |api_request|
         | 
| 26 26 | 
             
                    api_request.url endpoint
         | 
| 27 | 
            -
                    api_request.params | 
| 28 | 
            -
                    api_request.body | 
| 27 | 
            +
                    api_request.params  = params
         | 
| 28 | 
            +
                    api_request.body    = body
         | 
| 29 29 | 
             
                    api_request.headers = api_request.headers.merge(headers) if headers
         | 
| 30 30 | 
             
                  end
         | 
| 31 31 | 
             
                end
         | 
    
        data/lib/jeckle/resource.rb
    CHANGED
    
    | @@ -1,50 +1,11 @@ | |
| 1 1 | 
             
            module Jeckle
         | 
| 2 2 | 
             
              module Resource
         | 
| 3 3 | 
             
                def self.included(base)
         | 
| 4 | 
            -
                  base.send :include, Jeckle::Model
         | 
| 5 4 | 
             
                  base.send :include, ActiveModel::Naming
         | 
| 6 5 |  | 
| 7 | 
            -
                  base.send : | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 10 | 
            -
                module ClassMethods
         | 
| 11 | 
            -
                  def inherited(base)
         | 
| 12 | 
            -
                    base.class_eval do
         | 
| 13 | 
            -
                      @api_mapping = superclass.api_mapping.dup
         | 
| 14 | 
            -
                    end
         | 
| 15 | 
            -
                  end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                  def resource_name
         | 
| 18 | 
            -
                    model_name.element.pluralize
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                  def default_api(registered_api_name)
         | 
| 22 | 
            -
                    api_mapping[:default_api] = Jeckle::Setup.registered_apis.fetch(registered_api_name)
         | 
| 23 | 
            -
                  rescue KeyError => e
         | 
| 24 | 
            -
                    raise Jeckle::NoSuchAPIError, registered_api_name
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  def api_mapping
         | 
| 28 | 
            -
                    @api_mapping ||= {}
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
                  def find(id)
         | 
| 32 | 
            -
                    endpoint = "#{resource_name}/#{id}"
         | 
| 33 | 
            -
                    attributes = run_request(endpoint).response.body
         | 
| 34 | 
            -
             | 
| 35 | 
            -
                    new attributes
         | 
| 36 | 
            -
                  end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
                  def search(params = {})
         | 
| 39 | 
            -
                    response   = run_request(resource_name, params).response.body || []
         | 
| 40 | 
            -
                    collection = response.kind_of?(Array) ? response : response[resource_name]
         | 
| 41 | 
            -
             | 
| 42 | 
            -
                    Array(collection).collect { |attrs| new attrs }
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  def run_request(endpoint, options = {})
         | 
| 46 | 
            -
                    Jeckle::Request.run api_mapping[:default_api], endpoint, options
         | 
| 47 | 
            -
                  end
         | 
| 6 | 
            +
                  base.send :include, Jeckle::Model
         | 
| 7 | 
            +
                  base.send :include, Jeckle::HTTP
         | 
| 8 | 
            +
                  base.send :include, Jeckle::RESTActions
         | 
| 48 9 | 
             
                end
         | 
| 49 10 | 
             
              end
         | 
| 50 11 | 
             
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module Jeckle
         | 
| 2 | 
            +
              module RESTActions
         | 
| 3 | 
            +
                def self.included(base)
         | 
| 4 | 
            +
                  base.send :extend, Jeckle::RESTActions::Collection
         | 
| 5 | 
            +
                end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                module Collection
         | 
| 8 | 
            +
                  def find(id)
         | 
| 9 | 
            +
                    endpoint = "#{resource_name}/#{id}"
         | 
| 10 | 
            +
                    attributes = run_request(endpoint).response.body
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                    new attributes
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  def search(params = {})
         | 
| 16 | 
            +
                    response   = run_request(resource_name, params).response.body || []
         | 
| 17 | 
            +
                    collection = response.kind_of?(Array) ? response : response[resource_name]
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    Array(collection).collect { |attrs| new attrs }
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
    
        data/lib/jeckle/version.rb
    CHANGED
    
    
    
        data/lib/jeckle.rb
    CHANGED
    
    
| @@ -1,31 +1,33 @@ | |
| 1 | 
            -
            Jeckle | 
| 2 | 
            -
               | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
             | 
| 1 | 
            +
            Jeckle.configure do |config|
         | 
| 2 | 
            +
              config.register :my_super_api do |api|
         | 
| 3 | 
            +
                api.base_uri = 'http://my-super-api.com.br'
         | 
| 4 | 
            +
                api.headers = { 'Content-Type' => 'application/json' }
         | 
| 5 | 
            +
                api.logger = Logger.new(STDOUT)
         | 
| 6 | 
            +
                api.basic_auth = { username: 'steven_seagal', password: 'youAlwaysLose' }
         | 
| 7 | 
            +
                api.namespaces = { prefix: 'api', version: 'v1' }
         | 
| 8 | 
            +
                api.params = { hello: 'world' }
         | 
| 9 | 
            +
                api.open_timeout = 2
         | 
| 10 | 
            +
                api.read_timeout = 5
         | 
| 10 11 |  | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 12 | 
            +
                api.middlewares do
         | 
| 13 | 
            +
                  request :json
         | 
| 14 | 
            +
                  response :json
         | 
| 15 | 
            +
                  response :raise_error
         | 
| 16 | 
            +
                end
         | 
| 15 17 | 
             
              end
         | 
| 16 | 
            -
            end
         | 
| 17 18 |  | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 19 | 
            +
              config.register :another_api do |api|
         | 
| 20 | 
            +
                api.base_uri = 'http://another-api.com.br'
         | 
| 21 | 
            +
                api.headers = { 'Content-Type' => 'application/json' }
         | 
| 22 | 
            +
                api.logger = Logger.new(STDOUT)
         | 
| 23 | 
            +
                api.basic_auth = { username: 'heisenberg', password: 'metaAfetaAMina' }
         | 
| 24 | 
            +
                api.namespaces = { prefix: 'api', version: 'v5' }
         | 
| 25 | 
            +
                api.params = { hi: 'there' }
         | 
| 25 26 |  | 
| 26 | 
            -
             | 
| 27 | 
            -
             | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 27 | 
            +
                api.middlewares do
         | 
| 28 | 
            +
                  request :json
         | 
| 29 | 
            +
                  response :json
         | 
| 30 | 
            +
                  response :raise_error
         | 
| 31 | 
            +
                end
         | 
| 30 32 | 
             
              end
         | 
| 31 33 | 
             
            end
         | 
| @@ -0,0 +1,63 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RSpec.describe Jeckle::HTTP do
         | 
| 4 | 
            +
              describe '.resource_name' do
         | 
| 5 | 
            +
                it 'returns resource name based on class name' do
         | 
| 6 | 
            +
                  expect(FakeResource.resource_name).to eq 'fake_resources'
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                context 'when resource class is namespaced' do
         | 
| 10 | 
            +
                  before do
         | 
| 11 | 
            +
                    MySuperApi = Module.new
         | 
| 12 | 
            +
                    MySuperApi::FakeResource = Class.new(::FakeResource)
         | 
| 13 | 
            +
                  end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                  it 'ignores namespace' do
         | 
| 16 | 
            +
                    expect(MySuperApi::FakeResource.resource_name).to eq 'fake_resources'
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              describe '.api_mapping' do
         | 
| 22 | 
            +
                it 'returns a hash containing default api' do
         | 
| 23 | 
            +
                  expect(FakeResource.api_mapping).to match(
         | 
| 24 | 
            +
                    default_api: an_instance_of(Jeckle::API)
         | 
| 25 | 
            +
                  )
         | 
| 26 | 
            +
                end
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                context 'when resource is inherited' do
         | 
| 29 | 
            +
                  let(:inherited_class) { Class.new(FakeResource) }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  it "contains the parent's api_mapping" do
         | 
| 32 | 
            +
                    expect(inherited_class.api_mapping).to eq FakeResource.api_mapping
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  context 'when api_mapping is changed' do
         | 
| 36 | 
            +
                    it "does not affect the parent" do
         | 
| 37 | 
            +
                      inherited_class.api :another_api
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                      expect(FakeResource.api_mapping).not_to eq inherited_class.api_mapping
         | 
| 40 | 
            +
                      expect(FakeResource.api_mapping[:default_api]).to eq Jeckle::Setup.registered_apis[:my_super_api]
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              describe '.default_api' do
         | 
| 47 | 
            +
                context 'when defining a registered API via Jeckle::Setup' do
         | 
| 48 | 
            +
                  it 'returns the assigned API' do
         | 
| 49 | 
            +
                    expect(FakeResource.api :my_super_api).to be_kind_of Jeckle::API
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  it 'assigns API do api_mapping' do
         | 
| 53 | 
            +
                    expect(FakeResource.api_mapping).to have_key :default_api
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                context 'when defining an inexistent API' do
         | 
| 58 | 
            +
                  it 'raises NoSuchAPIError' do
         | 
| 59 | 
            +
                    expect { FakeResource.api :unknown_api }.to raise_error Jeckle::NoSuchAPIError
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
            end
         | 
| @@ -3,8 +3,6 @@ require 'spec_helper' | |
| 3 3 | 
             
            RSpec.describe Jeckle::Resource do
         | 
| 4 4 | 
             
              subject(:fake_resource) { FakeResource.new }
         | 
| 5 5 |  | 
| 6 | 
            -
              let(:api) { FakeResource.api_mapping[:default_api] }
         | 
| 7 | 
            -
             | 
| 8 6 | 
             
              it 'includes jeckle/model' do
         | 
| 9 7 | 
             
                expect(FakeResource.ancestors).to include Jeckle::Model
         | 
| 10 8 | 
             
              end
         | 
| @@ -13,131 +11,11 @@ RSpec.describe Jeckle::Resource do | |
| 13 11 | 
             
                expect(FakeResource.ancestors).to include ActiveModel::Naming
         | 
| 14 12 | 
             
              end
         | 
| 15 13 |  | 
| 16 | 
            -
               | 
| 17 | 
            -
                 | 
| 18 | 
            -
                  expect(FakeResource.resource_name).to eq 'fake_resources'
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
             | 
| 21 | 
            -
                context 'when resource class is namespaced' do
         | 
| 22 | 
            -
                  before do
         | 
| 23 | 
            -
                    MySuperApi = Module.new
         | 
| 24 | 
            -
                    MySuperApi::FakeResource = Class.new(::FakeResource)
         | 
| 25 | 
            -
                  end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                  it 'ignores namespace' do
         | 
| 28 | 
            -
                    expect(MySuperApi::FakeResource.resource_name).to eq 'fake_resources'
         | 
| 29 | 
            -
                  end
         | 
| 30 | 
            -
                end
         | 
| 31 | 
            -
              end
         | 
| 32 | 
            -
             | 
| 33 | 
            -
              describe '.api_mapping' do
         | 
| 34 | 
            -
                it 'returns a hash containing default api' do
         | 
| 35 | 
            -
                  expect(FakeResource.api_mapping).to match(
         | 
| 36 | 
            -
                    default_api: an_instance_of(Jeckle::API)
         | 
| 37 | 
            -
                  )
         | 
| 38 | 
            -
                end
         | 
| 39 | 
            -
             | 
| 40 | 
            -
                context 'when resource is inherited' do
         | 
| 41 | 
            -
                  let(:inherited_class) { Class.new(FakeResource) }
         | 
| 42 | 
            -
             | 
| 43 | 
            -
                  it "contains the parent's api_mapping" do
         | 
| 44 | 
            -
                    expect(inherited_class.api_mapping).to eq FakeResource.api_mapping
         | 
| 45 | 
            -
                  end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                  context 'when api_mapping is changed' do
         | 
| 48 | 
            -
                    it "does not affect the parent" do
         | 
| 49 | 
            -
                      inherited_class.default_api :another_api
         | 
| 50 | 
            -
             | 
| 51 | 
            -
                      expect(FakeResource.api_mapping).not_to eq inherited_class.api_mapping
         | 
| 52 | 
            -
                      expect(FakeResource.api_mapping[:default_api]).to eq Jeckle::Setup.registered_apis[:my_super_api]
         | 
| 53 | 
            -
                    end
         | 
| 54 | 
            -
                  end
         | 
| 55 | 
            -
                end
         | 
| 56 | 
            -
              end
         | 
| 57 | 
            -
             | 
| 58 | 
            -
              describe '.default_api' do
         | 
| 59 | 
            -
                context 'when defining a registered API via Jeckle::Setup' do
         | 
| 60 | 
            -
                  it 'returns the assigned API' do
         | 
| 61 | 
            -
                    expect(FakeResource.default_api :my_super_api).to be_kind_of Jeckle::API
         | 
| 62 | 
            -
                  end
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                  it 'assigns API do api_mapping' do
         | 
| 65 | 
            -
                    expect(FakeResource.api_mapping).to have_key :default_api
         | 
| 66 | 
            -
                  end
         | 
| 67 | 
            -
                end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
                context 'when defining an inexistent API' do
         | 
| 70 | 
            -
                  it 'raises NoSuchAPIError' do
         | 
| 71 | 
            -
                    expect { FakeResource.default_api :unknown_api }.to raise_error Jeckle::NoSuchAPIError
         | 
| 72 | 
            -
                  end
         | 
| 73 | 
            -
                end
         | 
| 14 | 
            +
              it 'includes jeckle http' do
         | 
| 15 | 
            +
                expect(FakeResource.ancestors).to include Jeckle::HTTP
         | 
| 74 16 | 
             
              end
         | 
| 75 17 |  | 
| 76 | 
            -
               | 
| 77 | 
            -
                 | 
| 78 | 
            -
             | 
| 79 | 
            -
                it 'calls default API connection with GET' do
         | 
| 80 | 
            -
                  expect(Jeckle::Request).to receive(:run)
         | 
| 81 | 
            -
                    .with(api, 'fake_resources/1001', {}).and_return(fake_request)
         | 
| 82 | 
            -
             | 
| 83 | 
            -
                  FakeResource.find 1001
         | 
| 84 | 
            -
                end
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                it 'returns an instance of resource' do
         | 
| 87 | 
            -
                  allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 88 | 
            -
             | 
| 89 | 
            -
                  expect(FakeResource.find 1001).to be_an_instance_of(FakeResource)
         | 
| 90 | 
            -
                end
         | 
| 91 | 
            -
              end
         | 
| 92 | 
            -
             | 
| 93 | 
            -
              describe '.search' do
         | 
| 94 | 
            -
                let(:fake_request) { OpenStruct.new response: OpenStruct.new(body: body) }
         | 
| 95 | 
            -
             | 
| 96 | 
            -
                let(:query) { { name: 'cocada' } }
         | 
| 97 | 
            -
             | 
| 98 | 
            -
                context 'when there are results WITHOUT root node' do
         | 
| 99 | 
            -
                  let(:body) { [{ id: 1001 }, { id: 1002 }] }
         | 
| 100 | 
            -
             | 
| 101 | 
            -
                  it 'calls default API connection with GET and search params' do
         | 
| 102 | 
            -
                    expect(Jeckle::Request).to receive(:run)
         | 
| 103 | 
            -
                      .with(api, 'fake_resources', query).and_return(fake_request)
         | 
| 104 | 
            -
             | 
| 105 | 
            -
                    FakeResource.search query
         | 
| 106 | 
            -
                  end
         | 
| 107 | 
            -
             | 
| 108 | 
            -
                  it 'returns an Array of resources' do
         | 
| 109 | 
            -
                    allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 110 | 
            -
             | 
| 111 | 
            -
                    expect(FakeResource.search query).to match [
         | 
| 112 | 
            -
                      an_instance_of(FakeResource),
         | 
| 113 | 
            -
                      an_instance_of(FakeResource)
         | 
| 114 | 
            -
                    ]
         | 
| 115 | 
            -
                  end
         | 
| 116 | 
            -
                end
         | 
| 117 | 
            -
             | 
| 118 | 
            -
                context 'when there are results WITH root node' do
         | 
| 119 | 
            -
                  let(:body) do
         | 
| 120 | 
            -
                    { 'fake_resources' => [{ id: 1001 }, { id: 1002 } ] }
         | 
| 121 | 
            -
                  end
         | 
| 122 | 
            -
             | 
| 123 | 
            -
                  it 'returns an Array of resources' do
         | 
| 124 | 
            -
                    allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 125 | 
            -
             | 
| 126 | 
            -
                    expect(FakeResource.search query).to match [
         | 
| 127 | 
            -
                      an_instance_of(FakeResource),
         | 
| 128 | 
            -
                      an_instance_of(FakeResource)
         | 
| 129 | 
            -
                    ]
         | 
| 130 | 
            -
                  end
         | 
| 131 | 
            -
                end
         | 
| 132 | 
            -
             | 
| 133 | 
            -
                context 'when there are no results' do
         | 
| 134 | 
            -
                  let(:fake_request) { OpenStruct.new response: OpenStruct.new(body: nil) }
         | 
| 135 | 
            -
             | 
| 136 | 
            -
                  it 'returns an empty Array' do
         | 
| 137 | 
            -
                    allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 138 | 
            -
             | 
| 139 | 
            -
                    expect(FakeResource.search query).to match []
         | 
| 140 | 
            -
                  end
         | 
| 141 | 
            -
                end
         | 
| 18 | 
            +
              it 'includes jeckle rest actions' do
         | 
| 19 | 
            +
                expect(FakeResource.ancestors).to include Jeckle::RESTActions
         | 
| 142 20 | 
             
              end
         | 
| 143 21 | 
             
            end
         | 
| @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            RSpec.describe Jeckle::RESTActions do
         | 
| 4 | 
            +
              let(:api) { FakeResource.api_mapping[:default_api] }
         | 
| 5 | 
            +
             | 
| 6 | 
            +
              describe '.find' do
         | 
| 7 | 
            +
                let(:fake_request) { OpenStruct.new response: OpenStruct.new(body: { id: 1001 }) }
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                it 'calls default API connection with GET' do
         | 
| 10 | 
            +
                  expect(Jeckle::Request).to receive(:run)
         | 
| 11 | 
            +
                    .with(api, 'fake_resources/1001', {}).and_return(fake_request)
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  FakeResource.find 1001
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it 'returns an instance of resource' do
         | 
| 17 | 
            +
                  allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  expect(FakeResource.find 1001).to be_an_instance_of(FakeResource)
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              describe '.search' do
         | 
| 24 | 
            +
                let(:fake_request) { OpenStruct.new response: OpenStruct.new(body: body) }
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                let(:query) { { name: 'cocada' } }
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                context 'when there are results WITHOUT root node' do
         | 
| 29 | 
            +
                  let(:body) { [{ id: 1001 }, { id: 1002 }] }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  it 'calls default API connection with GET and search params' do
         | 
| 32 | 
            +
                    expect(Jeckle::Request).to receive(:run)
         | 
| 33 | 
            +
                      .with(api, 'fake_resources', query).and_return(fake_request)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    FakeResource.search query
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  it 'returns an Array of resources' do
         | 
| 39 | 
            +
                    allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    expect(FakeResource.search query).to match [
         | 
| 42 | 
            +
                      an_instance_of(FakeResource),
         | 
| 43 | 
            +
                      an_instance_of(FakeResource)
         | 
| 44 | 
            +
                    ]
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
                end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                context 'when there are results WITH root node' do
         | 
| 49 | 
            +
                  let(:body) do
         | 
| 50 | 
            +
                    { 'fake_resources' => [{ id: 1001 }, { id: 1002 } ] }
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                  it 'returns an Array of resources' do
         | 
| 54 | 
            +
                    allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    expect(FakeResource.search query).to match [
         | 
| 57 | 
            +
                      an_instance_of(FakeResource),
         | 
| 58 | 
            +
                      an_instance_of(FakeResource)
         | 
| 59 | 
            +
                    ]
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                context 'when there are no results' do
         | 
| 64 | 
            +
                  let(:fake_request) { OpenStruct.new response: OpenStruct.new(body: nil) }
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  it 'returns an empty Array' do
         | 
| 67 | 
            +
                    allow(Jeckle::Request).to receive(:run).and_return(fake_request)
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    expect(FakeResource.search query).to match []
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
              end
         | 
| 73 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: jeckle
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.3.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Tomas D'Stefano
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2014-10- | 
| 12 | 
            +
            date: 2014-10-22 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: activemodel
         | 
| @@ -135,6 +135,7 @@ files: | |
| 135 135 | 
             
            - .rspec
         | 
| 136 136 | 
             
            - .travis.yml
         | 
| 137 137 | 
             
            - Gemfile
         | 
| 138 | 
            +
            - History.markdown
         | 
| 138 139 | 
             
            - LICENSE.txt
         | 
| 139 140 | 
             
            - README.md
         | 
| 140 141 | 
             
            - Rakefile
         | 
| @@ -143,18 +144,22 @@ files: | |
| 143 144 | 
             
            - lib/jeckle.rb
         | 
| 144 145 | 
             
            - lib/jeckle/api.rb
         | 
| 145 146 | 
             
            - lib/jeckle/errors.rb
         | 
| 147 | 
            +
            - lib/jeckle/http.rb
         | 
| 146 148 | 
             
            - lib/jeckle/model.rb
         | 
| 147 149 | 
             
            - lib/jeckle/request.rb
         | 
| 148 150 | 
             
            - lib/jeckle/resource.rb
         | 
| 151 | 
            +
            - lib/jeckle/rest_actions.rb
         | 
| 149 152 | 
             
            - lib/jeckle/setup.rb
         | 
| 150 153 | 
             
            - lib/jeckle/version.rb
         | 
| 151 154 | 
             
            - spec/fixtures/jeckle_config.rb
         | 
| 152 155 | 
             
            - spec/fixtures/models/fake_model.rb
         | 
| 153 156 | 
             
            - spec/fixtures/resources/fake_resource.rb
         | 
| 154 157 | 
             
            - spec/jeckle/api_spec.rb
         | 
| 158 | 
            +
            - spec/jeckle/http_spec.rb
         | 
| 155 159 | 
             
            - spec/jeckle/model_spec.rb
         | 
| 156 160 | 
             
            - spec/jeckle/request_spec.rb
         | 
| 157 161 | 
             
            - spec/jeckle/resource_spec.rb
         | 
| 162 | 
            +
            - spec/jeckle/rest_actions_spec.rb
         | 
| 158 163 | 
             
            - spec/jeckle/setup_spec.rb
         | 
| 159 164 | 
             
            - spec/spec_helper.rb
         | 
| 160 165 | 
             
            - spec/support/shared_examples.rb
         | 
| @@ -187,9 +192,11 @@ test_files: | |
| 187 192 | 
             
            - spec/fixtures/models/fake_model.rb
         | 
| 188 193 | 
             
            - spec/fixtures/resources/fake_resource.rb
         | 
| 189 194 | 
             
            - spec/jeckle/api_spec.rb
         | 
| 195 | 
            +
            - spec/jeckle/http_spec.rb
         | 
| 190 196 | 
             
            - spec/jeckle/model_spec.rb
         | 
| 191 197 | 
             
            - spec/jeckle/request_spec.rb
         | 
| 192 198 | 
             
            - spec/jeckle/resource_spec.rb
         | 
| 199 | 
            +
            - spec/jeckle/rest_actions_spec.rb
         | 
| 193 200 | 
             
            - spec/jeckle/setup_spec.rb
         | 
| 194 201 | 
             
            - spec/spec_helper.rb
         | 
| 195 202 | 
             
            - spec/support/shared_examples.rb
         |