json_api_client 0.9.6 → 1.0.0.beta
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/README.md +274 -84
 - data/lib/json_api_client.rb +9 -4
 - data/lib/json_api_client/connection.rb +5 -5
 - data/lib/json_api_client/error_collector.rb +29 -0
 - data/lib/json_api_client/errors.rb +7 -5
 - data/lib/json_api_client/helpers.rb +3 -0
 - data/lib/json_api_client/helpers/associable.rb +4 -3
 - data/lib/json_api_client/helpers/attributable.rb +15 -46
 - data/lib/json_api_client/helpers/custom_endpoints.rb +3 -10
 - data/lib/json_api_client/helpers/dynamic_attributes.rb +61 -0
 - data/lib/json_api_client/helpers/linkable.rb +28 -18
 - data/lib/json_api_client/helpers/paginatable.rb +13 -0
 - data/lib/json_api_client/helpers/parsable.rb +1 -1
 - data/lib/json_api_client/helpers/queryable.rb +4 -3
 - data/lib/json_api_client/helpers/requestable.rb +60 -0
 - data/lib/json_api_client/linking.rb +7 -0
 - data/lib/json_api_client/linking/included_data.rb +40 -0
 - data/lib/json_api_client/linking/links.rb +29 -0
 - data/lib/json_api_client/linking/top_level_links.rb +30 -0
 - data/lib/json_api_client/meta_data.rb +10 -0
 - data/lib/json_api_client/middleware/json_request.rb +3 -4
 - data/lib/json_api_client/middleware/status.rb +10 -1
 - data/lib/json_api_client/paginating.rb +5 -0
 - data/lib/json_api_client/paginating/paginator.rb +80 -0
 - data/lib/json_api_client/parsers.rb +5 -0
 - data/lib/json_api_client/parsers/parser.rb +55 -0
 - data/lib/json_api_client/query.rb +2 -7
 - data/lib/json_api_client/query/builder.rb +126 -0
 - data/lib/json_api_client/query/requestor.rb +77 -0
 - data/lib/json_api_client/resource.rb +3 -59
 - data/lib/json_api_client/result_set.rb +11 -29
 - data/lib/json_api_client/schema.rb +15 -30
 - data/lib/json_api_client/version.rb +1 -1
 - metadata +36 -19
 - data/lib/json_api_client/link.rb +0 -11
 - data/lib/json_api_client/link_definition.rb +0 -27
 - data/lib/json_api_client/linked_data.rb +0 -75
 - data/lib/json_api_client/parser.rb +0 -63
 - data/lib/json_api_client/query/base.rb +0 -38
 - data/lib/json_api_client/query/create.rb +0 -17
 - data/lib/json_api_client/query/custom.rb +0 -22
 - data/lib/json_api_client/query/destroy.rb +0 -12
 - data/lib/json_api_client/query/find.rb +0 -19
 - data/lib/json_api_client/query/linked.rb +0 -24
 - data/lib/json_api_client/query/update.rb +0 -13
 - data/lib/json_api_client/scope.rb +0 -48
 
| 
         @@ -1,63 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              class Parser
         
     | 
| 
       3 
     | 
    
         
            -
             
     | 
| 
       4 
     | 
    
         
            -
                class << self
         
     | 
| 
       5 
     | 
    
         
            -
                  def parse(klass, response)
         
     | 
| 
       6 
     | 
    
         
            -
                    data = response.body
         
     | 
| 
       7 
     | 
    
         
            -
                    ResultSet.build(klass, data) do |result_set|
         
     | 
| 
       8 
     | 
    
         
            -
                      handle_meta(result_set, data)
         
     | 
| 
       9 
     | 
    
         
            -
                      handle_pagination(result_set, data)
         
     | 
| 
       10 
     | 
    
         
            -
                      handle_links(result_set, data)
         
     | 
| 
       11 
     | 
    
         
            -
                      handle_errors(result_set, data)
         
     | 
| 
       12 
     | 
    
         
            -
                    end
         
     | 
| 
       13 
     | 
    
         
            -
                  end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                  private
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                  def handle_meta(result_set, data)
         
     | 
| 
       18 
     | 
    
         
            -
                    result_set.meta = HashWithIndifferentAccess.new(data.fetch("meta", nil))
         
     | 
| 
       19 
     | 
    
         
            -
                  end
         
     | 
| 
       20 
     | 
    
         
            -
             
     | 
| 
       21 
     | 
    
         
            -
                  def handle_pagination(result_set, data)
         
     | 
| 
       22 
     | 
    
         
            -
                    result_set.per_page = result_set.meta.fetch("per_page") do
         
     | 
| 
       23 
     | 
    
         
            -
                      result_set.length
         
     | 
| 
       24 
     | 
    
         
            -
                    end
         
     | 
| 
       25 
     | 
    
         
            -
                    result_set.total_entries = result_set.meta.fetch("total_entries") do
         
     | 
| 
       26 
     | 
    
         
            -
                      result_set.length
         
     | 
| 
       27 
     | 
    
         
            -
                    end
         
     | 
| 
       28 
     | 
    
         
            -
                    result_set.current_page = result_set.meta.fetch("current_page") do
         
     | 
| 
       29 
     | 
    
         
            -
                      result_set.meta.fetch("page", 1)
         
     | 
| 
       30 
     | 
    
         
            -
                    end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                    # can fall back to calculating via total entries and per_page
         
     | 
| 
       33 
     | 
    
         
            -
                    result_set.total_pages = result_set.meta.fetch("total_pages") do
         
     | 
| 
       34 
     | 
    
         
            -
                      (1.0 * result_set.total_entries / result_set.per_page).ceil rescue 1
         
     | 
| 
       35 
     | 
    
         
            -
                    end
         
     | 
| 
       36 
     | 
    
         
            -
             
     | 
| 
       37 
     | 
    
         
            -
                    # can fall back to calculating via per_page and current_page
         
     | 
| 
       38 
     | 
    
         
            -
                    result_set.offset = result_set.meta.fetch("offset") do
         
     | 
| 
       39 
     | 
    
         
            -
                      result_set.per_page * (result_set.current_page - 1)
         
     | 
| 
       40 
     | 
    
         
            -
                    end
         
     | 
| 
       41 
     | 
    
         
            -
                  end
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                  def handle_links(result_set, data)
         
     | 
| 
       44 
     | 
    
         
            -
                    return if result_set.empty?
         
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
       46 
     | 
    
         
            -
                    linked_data = LinkedData.new(
         
     | 
| 
       47 
     | 
    
         
            -
                                    data.fetch("linked", {}),
         
     | 
| 
       48 
     | 
    
         
            -
                                    LinkDefinition.new(data.fetch("links", {})),
         
     | 
| 
       49 
     | 
    
         
            -
                                    result_set.record_class
         
     | 
| 
       50 
     | 
    
         
            -
                                  )
         
     | 
| 
       51 
     | 
    
         
            -
             
     | 
| 
       52 
     | 
    
         
            -
                    result_set.each do |resource|
         
     | 
| 
       53 
     | 
    
         
            -
                      resource.linked_data = linked_data
         
     | 
| 
       54 
     | 
    
         
            -
                    end
         
     | 
| 
       55 
     | 
    
         
            -
                  end
         
     | 
| 
       56 
     | 
    
         
            -
             
     | 
| 
       57 
     | 
    
         
            -
                  def handle_errors(result_set, data)
         
     | 
| 
       58 
     | 
    
         
            -
                    result_set.errors = result_set.meta.fetch("errors", [])
         
     | 
| 
       59 
     | 
    
         
            -
                  end
         
     | 
| 
       60 
     | 
    
         
            -
                end
         
     | 
| 
       61 
     | 
    
         
            -
             
     | 
| 
       62 
     | 
    
         
            -
              end
         
     | 
| 
       63 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,38 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            require "addressable/uri"
         
     | 
| 
       2 
     | 
    
         
            -
             
     | 
| 
       3 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       4 
     | 
    
         
            -
              module Query
         
     | 
| 
       5 
     | 
    
         
            -
                class Base
         
     | 
| 
       6 
     | 
    
         
            -
                  class_attribute :request_method
         
     | 
| 
       7 
     | 
    
         
            -
                  attr_reader :klass, :headers, :path, :params
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                  def initialize(klass, args)
         
     | 
| 
       10 
     | 
    
         
            -
                    @klass = klass
         
     | 
| 
       11 
     | 
    
         
            -
                    build_params(args)
         
     | 
| 
       12 
     | 
    
         
            -
                    @headers = klass.default_headers.dup
         
     | 
| 
       13 
     | 
    
         
            -
                    build_path(@params)
         
     | 
| 
       14 
     | 
    
         
            -
                  end
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                  def build_path(parameters)
         
     | 
| 
       17 
     | 
    
         
            -
                    @path = begin
         
     | 
| 
       18 
     | 
    
         
            -
                      p = klass.path(parameters)
         
     | 
| 
       19 
     | 
    
         
            -
                      if parameters.has_key?(klass.primary_key) && !parameters[klass.primary_key].is_a?(Array)
         
     | 
| 
       20 
     | 
    
         
            -
                        resource_id = parameters.delete(klass.primary_key).to_s
         
     | 
| 
       21 
     | 
    
         
            -
                        encoded_resource_id = Addressable::URI.encode_component(resource_id, Addressable::URI::CharacterClasses::UNRESERVED)
         
     | 
| 
       22 
     | 
    
         
            -
                        p = File.join(p, encoded_resource_id)
         
     | 
| 
       23 
     | 
    
         
            -
                      end
         
     | 
| 
       24 
     | 
    
         
            -
                      p
         
     | 
| 
       25 
     | 
    
         
            -
                    end
         
     | 
| 
       26 
     | 
    
         
            -
                  end
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
       28 
     | 
    
         
            -
                  def build_params(args)
         
     | 
| 
       29 
     | 
    
         
            -
                    @params = args.dup
         
     | 
| 
       30 
     | 
    
         
            -
                  end
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
       32 
     | 
    
         
            -
                  def inspect
         
     | 
| 
       33 
     | 
    
         
            -
                    "#{self.class.name}: method: #{request_method}; path: #{path}; params: #{params}, headers: #{headers}"
         
     | 
| 
       34 
     | 
    
         
            -
                  end
         
     | 
| 
       35 
     | 
    
         
            -
             
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
       37 
     | 
    
         
            -
              end
         
     | 
| 
       38 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,17 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              module Query
         
     | 
| 
       3 
     | 
    
         
            -
                class Create < Base
         
     | 
| 
       4 
     | 
    
         
            -
                  self.request_method = :post
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
                  def build_params(args)
         
     | 
| 
       7 
     | 
    
         
            -
                    @params = {klass.resource_name => args.except(klass.primary_key)}
         
     | 
| 
       8 
     | 
    
         
            -
                  end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                  # we've nested the parameters, so un-nest them
         
     | 
| 
       11 
     | 
    
         
            -
                  def build_path(parameters)
         
     | 
| 
       12 
     | 
    
         
            -
                    super(parameters[klass.resource_name])
         
     | 
| 
       13 
     | 
    
         
            -
                  end
         
     | 
| 
       14 
     | 
    
         
            -
             
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
              end
         
     | 
| 
       17 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,22 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              module Query
         
     | 
| 
       3 
     | 
    
         
            -
                class Custom < Base
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                  def request_method
         
     | 
| 
       6 
     | 
    
         
            -
                    @request_method
         
     | 
| 
       7 
     | 
    
         
            -
                  end
         
     | 
| 
       8 
     | 
    
         
            -
             
     | 
| 
       9 
     | 
    
         
            -
                  def path
         
     | 
| 
       10 
     | 
    
         
            -
                    [@path, @options[:name]].join("/")
         
     | 
| 
       11 
     | 
    
         
            -
                  end
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
       13 
     | 
    
         
            -
                  def build_params(params)
         
     | 
| 
       14 
     | 
    
         
            -
                    opts = params.dup
         
     | 
| 
       15 
     | 
    
         
            -
                    @request_method = opts.delete(:request_method) || :get
         
     | 
| 
       16 
     | 
    
         
            -
                    @params = opts.delete(:params) || {}
         
     | 
| 
       17 
     | 
    
         
            -
                    @options = opts
         
     | 
| 
       18 
     | 
    
         
            -
                  end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                end
         
     | 
| 
       21 
     | 
    
         
            -
              end
         
     | 
| 
       22 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,19 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              module Query
         
     | 
| 
       3 
     | 
    
         
            -
                class Find < Base
         
     | 
| 
       4 
     | 
    
         
            -
                  self.request_method = :get
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
                  def build_params(args)
         
     | 
| 
       7 
     | 
    
         
            -
                    @params = case args
         
     | 
| 
       8 
     | 
    
         
            -
                    when Hash
         
     | 
| 
       9 
     | 
    
         
            -
                      args
         
     | 
| 
       10 
     | 
    
         
            -
                    when Array
         
     | 
| 
       11 
     | 
    
         
            -
                      {klass.primary_key.to_s.pluralize.to_sym => args.join(",")}
         
     | 
| 
       12 
     | 
    
         
            -
                    else
         
     | 
| 
       13 
     | 
    
         
            -
                      {klass.primary_key => args}
         
     | 
| 
       14 
     | 
    
         
            -
                    end
         
     | 
| 
       15 
     | 
    
         
            -
                  end
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
                end
         
     | 
| 
       18 
     | 
    
         
            -
              end
         
     | 
| 
       19 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,24 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              module Query
         
     | 
| 
       3 
     | 
    
         
            -
                class Linked
         
     | 
| 
       4 
     | 
    
         
            -
                  attr_accessor :path
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
                  def initialize(path)
         
     | 
| 
       7 
     | 
    
         
            -
                    @path = path
         
     | 
| 
       8 
     | 
    
         
            -
                  end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                  def request_method
         
     | 
| 
       11 
     | 
    
         
            -
                    :get
         
     | 
| 
       12 
     | 
    
         
            -
                  end
         
     | 
| 
       13 
     | 
    
         
            -
             
     | 
| 
       14 
     | 
    
         
            -
                  def headers
         
     | 
| 
       15 
     | 
    
         
            -
                    {}
         
     | 
| 
       16 
     | 
    
         
            -
                  end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                  def params
         
     | 
| 
       19 
     | 
    
         
            -
                    {}
         
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                end
         
     | 
| 
       23 
     | 
    
         
            -
              end
         
     | 
| 
       24 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,13 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              module Query
         
     | 
| 
       3 
     | 
    
         
            -
                class Update < Base
         
     | 
| 
       4 
     | 
    
         
            -
                  self.request_method = :put
         
     | 
| 
       5 
     | 
    
         
            -
             
     | 
| 
       6 
     | 
    
         
            -
                  def build_params(args)
         
     | 
| 
       7 
     | 
    
         
            -
                    args = args.dup
         
     | 
| 
       8 
     | 
    
         
            -
                    @params = {klass.primary_key => args.delete(klass.primary_key), klass.resource_name => args}
         
     | 
| 
       9 
     | 
    
         
            -
                  end
         
     | 
| 
       10 
     | 
    
         
            -
             
     | 
| 
       11 
     | 
    
         
            -
                end
         
     | 
| 
       12 
     | 
    
         
            -
              end
         
     | 
| 
       13 
     | 
    
         
            -
            end
         
     | 
| 
         @@ -1,48 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module JsonApiClient
         
     | 
| 
       2 
     | 
    
         
            -
              class Scope
         
     | 
| 
       3 
     | 
    
         
            -
                attr_reader :klass, :params
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
                def initialize(klass)
         
     | 
| 
       6 
     | 
    
         
            -
                  @klass = klass
         
     | 
| 
       7 
     | 
    
         
            -
                  @params = {}
         
     | 
| 
       8 
     | 
    
         
            -
                end
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                def where(conditions = {})
         
     | 
| 
       11 
     | 
    
         
            -
                  @params.merge!(conditions)
         
     | 
| 
       12 
     | 
    
         
            -
                  self
         
     | 
| 
       13 
     | 
    
         
            -
                end
         
     | 
| 
       14 
     | 
    
         
            -
                alias paginate where
         
     | 
| 
       15 
     | 
    
         
            -
             
     | 
| 
       16 
     | 
    
         
            -
                def order(conditions)
         
     | 
| 
       17 
     | 
    
         
            -
                  where(order: conditions)
         
     | 
| 
       18 
     | 
    
         
            -
                end
         
     | 
| 
       19 
     | 
    
         
            -
             
     | 
| 
       20 
     | 
    
         
            -
                def includes(*tables)
         
     | 
| 
       21 
     | 
    
         
            -
                  @params[:includes] ||= []
         
     | 
| 
       22 
     | 
    
         
            -
                  @params[:includes] += tables.flatten
         
     | 
| 
       23 
     | 
    
         
            -
                  self
         
     | 
| 
       24 
     | 
    
         
            -
                end
         
     | 
| 
       25 
     | 
    
         
            -
             
     | 
| 
       26 
     | 
    
         
            -
                def page(number)
         
     | 
| 
       27 
     | 
    
         
            -
                  where(page: number)
         
     | 
| 
       28 
     | 
    
         
            -
                end
         
     | 
| 
       29 
     | 
    
         
            -
             
     | 
| 
       30 
     | 
    
         
            -
                def first
         
     | 
| 
       31 
     | 
    
         
            -
                  paginate(page: 1, per_page: 1).to_a.first
         
     | 
| 
       32 
     | 
    
         
            -
                end
         
     | 
| 
       33 
     | 
    
         
            -
             
     | 
| 
       34 
     | 
    
         
            -
                def build
         
     | 
| 
       35 
     | 
    
         
            -
                  klass.new(params)
         
     | 
| 
       36 
     | 
    
         
            -
                end
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
     | 
    
         
            -
                def to_a
         
     | 
| 
       39 
     | 
    
         
            -
                  @to_a ||= klass.find(params)
         
     | 
| 
       40 
     | 
    
         
            -
                end
         
     | 
| 
       41 
     | 
    
         
            -
                alias all to_a
         
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
       43 
     | 
    
         
            -
                def method_missing(method_name, *args, &block)
         
     | 
| 
       44 
     | 
    
         
            -
                  to_a.send(method_name, *args, &block)
         
     | 
| 
       45 
     | 
    
         
            -
                end
         
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
       47 
     | 
    
         
            -
              end
         
     | 
| 
       48 
     | 
    
         
            -
            end
         
     |