jsonapi-object-mapper 0.5.0 → 0.6.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/Gemfile.lock +1 -1
- data/README.md +25 -7
- data/lib/jsonapi-object-mapper.rb +2 -1
- data/lib/jsonapi-object-mapper/{deserializer → deserialize}/collection.rb +3 -3
- data/lib/jsonapi-object-mapper/{deserializer → deserialize}/dsl.rb +1 -1
- data/lib/jsonapi-object-mapper/{deserializer → deserialize}/resource.rb +4 -4
- data/lib/jsonapi-object-mapper/exceptions.rb +9 -0
- data/lib/jsonapi-object-mapper/version.rb +1 -1
- data/spec/deserialize/collection_spec.rb +85 -0
- data/spec/{deserializer → deserialize}/resource_spec.rb +1 -1
- metadata +10 -7
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: cc15e84ef11d68ce266929e2a420eefb0526b05eabd8a63065747721fef0c3a3
         | 
| 4 | 
            +
              data.tar.gz: a3a9a57a7d7492124f505cad9c05e509cd5deb5a33f1afec59c7c01295153a5e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7b18f64a3c70061e4860862fd8d8b766bbc5a78de8bf728f52b34b04eeadfc3a1ed9ac0a6e598d1bc8b083e7f82ffb9d85ab3c1a1bd00a62b536c02c2fe72f19
         | 
| 7 | 
            +
              data.tar.gz: 43ba9a81a83f4824ed4aedddc6e947cd7812cd1775efc4d925c6e14a5a41d3ed7a86ce3317516429da17a90c42427ce29742f6168fb557fd08678565473b0c8c
         | 
    
        data/Gemfile.lock
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -1,8 +1,6 @@ | |
| 1 1 | 
             
            # JsonapiObjectMapper
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
            TODO: Delete this and the text above, and describe your gem
         | 
| 3 | 
            +
            Deserialize's raw or pre-hashed JsonAPI objects into plan ruby objects as well as embeds any included relational resources.
         | 
| 6 4 |  | 
| 7 5 | 
             
            ## Installation
         | 
| 8 6 |  | 
| @@ -23,13 +21,13 @@ Or install it yourself as: | |
| 23 21 | 
             
            ## Usage
         | 
| 24 22 |  | 
| 25 23 | 
             
            ```ruby
         | 
| 26 | 
            -
            require " | 
| 24 | 
            +
            require "jsonapi-object-mapper"
         | 
| 27 25 |  | 
| 28 | 
            -
            class Photo < JsonAPIObjectMapper:: | 
| 26 | 
            +
            class Photo < JsonAPIObjectMapper::Deserialize::Resource
         | 
| 29 27 | 
             
              attribute :image
         | 
| 30 28 | 
             
            end
         | 
| 31 29 |  | 
| 32 | 
            -
            class User < JsonAPIObjectMapper:: | 
| 30 | 
            +
            class User < JsonAPIObjectMapper::Deserialize::Resource
         | 
| 33 31 | 
             
              # Embedding with another Resource class, will deserialize the `included` resource with the given class
         | 
| 34 32 | 
             
              has_one :photo, embed_with: Photo
         | 
| 35 33 |  | 
| @@ -51,12 +49,32 @@ class User < JsonAPIObjectMapper::Deserializer::Resource | |
| 51 49 | 
             
            end
         | 
| 52 50 |  | 
| 53 51 |  | 
| 54 | 
            -
            User.call_collection(json_payload) #=> [<#User:123>, <#User:432>]
         | 
| 55 52 | 
             
            user = User.call(json_payload) #=> <#User:123>
         | 
| 56 53 |  | 
| 57 54 | 
             
            user.first_name #=> "FOOER"
         | 
| 58 55 | 
             
            user.last_name  #=> "Bar"
         | 
| 59 56 |  | 
| 57 | 
            +
            # If json API Payload is a collection of data points
         | 
| 58 | 
            +
            users = User.call(json_payload) #=> <# JsonAPIObjectMapper::Deserialize::Collection #>
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            users.each do |user|
         | 
| 61 | 
            +
              user.first_name
         | 
| 62 | 
            +
              user.last_name
         | 
| 63 | 
            +
            end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            ```
         | 
| 66 | 
            +
             | 
| 67 | 
            +
            ### Errors
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            ```ruby
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            user = User.call(json_payload)
         | 
| 72 | 
            +
             | 
| 73 | 
            +
            # Aliases: document_valid?
         | 
| 74 | 
            +
            # Inverses: errors?, invalid?, document_invalid? 
         | 
| 75 | 
            +
            user.valid?  #=> false
         | 
| 76 | 
            +
            user.errors  #=> [<# OpenStruct title:..., detail: ..., source: {...}, ...>, ...]
         | 
| 77 | 
            +
             | 
| 60 78 | 
             
            ```
         | 
| 61 79 |  | 
| 62 80 | 
             
            ## Development
         | 
| @@ -1,8 +1,9 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 3 | 
             
            require "oj"
         | 
| 4 | 
            +
            require "jsonapi-object-mapper/exceptions"
         | 
| 4 5 | 
             
            require "jsonapi-object-mapper/parser/document"
         | 
| 5 | 
            -
            require "jsonapi-object-mapper/ | 
| 6 | 
            +
            require "jsonapi-object-mapper/deserialize/resource"
         | 
| 6 7 | 
             
            require "jsonapi-object-mapper/version"
         | 
| 7 8 |  | 
| 8 9 | 
             
            module JsonAPIObjectMapper
         | 
| @@ -3,7 +3,7 @@ | |
| 3 3 | 
             
            require "jsonapi-object-mapper/parser/errors"
         | 
| 4 4 |  | 
| 5 5 | 
             
            module JsonAPIObjectMapper
         | 
| 6 | 
            -
              module  | 
| 6 | 
            +
              module Deserialize
         | 
| 7 7 | 
             
                class Collection
         | 
| 8 8 | 
             
                  include Enumerable
         | 
| 9 9 | 
             
                  include JsonAPIObjectMapper::Parser::Errors
         | 
| @@ -11,8 +11,8 @@ module JsonAPIObjectMapper | |
| 11 11 | 
             
                  attr_accessor :collection_data
         | 
| 12 12 |  | 
| 13 13 | 
             
                  def initialize(parser, klass:)
         | 
| 14 | 
            -
                    raise  | 
| 15 | 
            -
                    raise  | 
| 14 | 
            +
                    raise InvalidResource, "Must provide a valid resource klass" unless klass.is_a?(Class)
         | 
| 15 | 
            +
                    raise InvalidParser, "Must provide a parsed document" unless parser.is_a?(JsonAPIObjectMapper::Parser::Document)
         | 
| 16 16 | 
             
                    @errors            = parser.errors
         | 
| 17 17 | 
             
                    @collection_data   =
         | 
| 18 18 | 
             
                      if document_invalid?
         | 
| @@ -1,11 +1,11 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            -
            require "jsonapi-object-mapper/ | 
| 4 | 
            -
            require "jsonapi-object-mapper/ | 
| 3 | 
            +
            require "jsonapi-object-mapper/deserialize/dsl"
         | 
| 4 | 
            +
            require "jsonapi-object-mapper/deserialize/collection"
         | 
| 5 5 | 
             
            require "jsonapi-object-mapper/parser/errors"
         | 
| 6 6 |  | 
| 7 7 | 
             
            module JsonAPIObjectMapper
         | 
| 8 | 
            -
              module  | 
| 8 | 
            +
              module Deserialize
         | 
| 9 9 | 
             
                class Resource
         | 
| 10 10 | 
             
                  include JsonAPIObjectMapper::Parser::Errors
         | 
| 11 11 | 
             
                  extend DSL
         | 
| @@ -42,7 +42,7 @@ module JsonAPIObjectMapper | |
| 42 42 |  | 
| 43 43 | 
             
                  def initialize(parser, document: nil)
         | 
| 44 44 | 
             
                    super()
         | 
| 45 | 
            -
                    raise  | 
| 45 | 
            +
                    raise InvalidParser, "Must provide a parsed document" unless parser.is_a?(JsonAPIObjectMapper::Parser::Document)
         | 
| 46 46 | 
             
                    @errors = parser.errors
         | 
| 47 47 |  | 
| 48 48 | 
             
                    if document_valid?
         | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require "spec_helper"
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module JsonAPIObjectMapper
         | 
| 6 | 
            +
              module Deserialize
         | 
| 7 | 
            +
                RSpec.describe Collection do
         | 
| 8 | 
            +
                  let(:parser) { JsonAPIObjectMapper::Parser::Document.new(payload) }
         | 
| 9 | 
            +
                  let(:payload) { {} }
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  describe ".new" do
         | 
| 12 | 
            +
                    context "Rising Exceptions" do
         | 
| 13 | 
            +
                      it "is expected to raise an error if the resource isn't a class object" do
         | 
| 14 | 
            +
                        expect { described_class.new(nil, klass: "Class") }.to raise_error(InvalidResource)
         | 
| 15 | 
            +
                      end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                      it "is expected to raise an error if the parser isn't a parsed json document" do
         | 
| 18 | 
            +
                        expect { described_class.new({}, { klass: Class }) }.to raise_error(InvalidParser)
         | 
| 19 | 
            +
                      end
         | 
| 20 | 
            +
                    end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    context "Creating a collection of resources" do
         | 
| 23 | 
            +
                      let(:payload) do
         | 
| 24 | 
            +
                        {
         | 
| 25 | 
            +
                          "data" => [
         | 
| 26 | 
            +
                            {
         | 
| 27 | 
            +
                              "id" => "1",
         | 
| 28 | 
            +
                              "type" => "foobar",
         | 
| 29 | 
            +
                              "attributes" => {
         | 
| 30 | 
            +
                                "name" => "Bert",
         | 
| 31 | 
            +
                              },
         | 
| 32 | 
            +
                            },
         | 
| 33 | 
            +
                            {
         | 
| 34 | 
            +
                              "id" => "2",
         | 
| 35 | 
            +
                              "type" => "foobar",
         | 
| 36 | 
            +
                              "attributes" => {
         | 
| 37 | 
            +
                                "name" => "Johnson",
         | 
| 38 | 
            +
                              },
         | 
| 39 | 
            +
                            },
         | 
| 40 | 
            +
                          ],
         | 
| 41 | 
            +
                        }
         | 
| 42 | 
            +
                      end
         | 
| 43 | 
            +
                      it "Should collect all resources into a enumerable resource" do
         | 
| 44 | 
            +
                        foobar_klass = Class.new(JsonAPIObjectMapper::Deserialize::Resource) do
         | 
| 45 | 
            +
                          attribute :name
         | 
| 46 | 
            +
                        end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                        result = described_class.new(parser, klass: foobar_klass)
         | 
| 49 | 
            +
                        expect(result.valid?).to be_truthy
         | 
| 50 | 
            +
                        expect(result.count).to eq(2)
         | 
| 51 | 
            +
                        expect(result.map(&:name)).to eq(%w[Bert Johnson])
         | 
| 52 | 
            +
                      end
         | 
| 53 | 
            +
                    end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    context "Results containing errors" do
         | 
| 56 | 
            +
                      let(:payload) do
         | 
| 57 | 
            +
                        {
         | 
| 58 | 
            +
                          "errors" => [
         | 
| 59 | 
            +
                            {
         | 
| 60 | 
            +
                              "title" => "Invalid name",
         | 
| 61 | 
            +
                              "detail" => "Look like foobar to me",
         | 
| 62 | 
            +
                              "source" => {
         | 
| 63 | 
            +
                                "pointer" => "name",
         | 
| 64 | 
            +
                              },
         | 
| 65 | 
            +
                            },
         | 
| 66 | 
            +
                          ],
         | 
| 67 | 
            +
                        }
         | 
| 68 | 
            +
                      end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                      it "Should return as an invalid or error document" do
         | 
| 71 | 
            +
                        result = described_class.new(parser, klass: Class.new)
         | 
| 72 | 
            +
                        expect(result).to be_invalid
         | 
| 73 | 
            +
                      end
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                      it "Should contain all error responses the in #errors field" do
         | 
| 76 | 
            +
                        result = described_class.new(parser, klass: Class.new).errors.first
         | 
| 77 | 
            +
                        expect(result.title).to eq("Invalid name")
         | 
| 78 | 
            +
                        expect(result.detail).to eq("Look like foobar to me")
         | 
| 79 | 
            +
                        expect(result.source).to include("pointer" => "name")
         | 
| 80 | 
            +
                      end
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
                end
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: jsonapi-object-mapper
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.6.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - George Protacio-Karaszi
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018-07- | 
| 11 | 
            +
            date: 2018-07-08 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: oj
         | 
| @@ -91,14 +91,16 @@ files: | |
| 91 91 | 
             
            - bin/setup
         | 
| 92 92 | 
             
            - jsonapi-object-mapper.gemspec
         | 
| 93 93 | 
             
            - lib/jsonapi-object-mapper.rb
         | 
| 94 | 
            -
            - lib/jsonapi-object-mapper/ | 
| 95 | 
            -
            - lib/jsonapi-object-mapper/ | 
| 96 | 
            -
            - lib/jsonapi-object-mapper/ | 
| 94 | 
            +
            - lib/jsonapi-object-mapper/deserialize/collection.rb
         | 
| 95 | 
            +
            - lib/jsonapi-object-mapper/deserialize/dsl.rb
         | 
| 96 | 
            +
            - lib/jsonapi-object-mapper/deserialize/resource.rb
         | 
| 97 | 
            +
            - lib/jsonapi-object-mapper/exceptions.rb
         | 
| 97 98 | 
             
            - lib/jsonapi-object-mapper/parser/document.rb
         | 
| 98 99 | 
             
            - lib/jsonapi-object-mapper/parser/errors.rb
         | 
| 99 100 | 
             
            - lib/jsonapi-object-mapper/parser/included_resources.rb
         | 
| 100 101 | 
             
            - lib/jsonapi-object-mapper/version.rb
         | 
| 101 | 
            -
            - spec/ | 
| 102 | 
            +
            - spec/deserialize/collection_spec.rb
         | 
| 103 | 
            +
            - spec/deserialize/resource_spec.rb
         | 
| 102 104 | 
             
            - spec/jsonapi_object_mapper_spec.rb
         | 
| 103 105 | 
             
            - spec/spec_helper.rb
         | 
| 104 106 | 
             
            homepage: https://github.com/GeorgeKaraszi/jsonapi-object-mapper
         | 
| @@ -126,6 +128,7 @@ signing_key: | |
| 126 128 | 
             
            specification_version: 4
         | 
| 127 129 | 
             
            summary: Digests JSON-API responses to plain old ruby objects
         | 
| 128 130 | 
             
            test_files:
         | 
| 129 | 
            -
            - spec/ | 
| 131 | 
            +
            - spec/deserialize/collection_spec.rb
         | 
| 132 | 
            +
            - spec/deserialize/resource_spec.rb
         | 
| 130 133 | 
             
            - spec/jsonapi_object_mapper_spec.rb
         | 
| 131 134 | 
             
            - spec/spec_helper.rb
         |