collection_json_serializer 0.3.6 → 0.4.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/README.md +22 -18
- data/lib/collection_json_serializer/items.rb +5 -0
- data/lib/collection_json_serializer/objects/query.rb +3 -3
- data/lib/collection_json_serializer/serializer.rb +36 -23
- data/lib/collection_json_serializer/version.rb +1 -1
- data/test/builder/builder_test.rb +18 -0
- data/test/extensions/open_attrs_test.rb +4 -4
- data/test/fixtures/serializers/invalid_serializer.rb +1 -1
- data/test/fixtures/serializers/user_serializer.rb +5 -3
- data/test/fixtures/serializers/valid_serializer.rb +1 -1
- data/test/minitest_helper.rb +5 -5
- data/test/objects/item_test.rb +16 -4
- data/test/serializer/dsl_test.rb +2 -1
- data/test/serializer/href_test.rb +3 -3
- data/test/serializer/items/attributes_test.rb +4 -2
- data/test/serializer/links_test.rb +1 -1
- data/test/serializer/queries_test.rb +13 -11
- data/test/serializer/spec_test.rb +3 -3
- data/test/validator/invalid_test.rb +9 -9
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: a3261f2fef5892978bcfe9c28b592538995524b2
         | 
| 4 | 
            +
              data.tar.gz: 006a703ad51bc4914e2bbc3c6d6199c9c5d0789a
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c72dd15101792c1773f136d6ec5f954b2b42b28d9aaec2b7e269885dd8a2c4bd53635dc5af1193552f7e910da4c0dd748d2257a0d90c70c943803ee7b0143710
         | 
| 7 | 
            +
              data.tar.gz: dc76bbc18ec5c33fd613624553cb9927d300a0ff8285ea5d872d769821c71296fbfad6873538da0b7e94c70661b0bb669cec9bd636dc0f6c63543160cfa5b043
         | 
    
        data/README.md
    CHANGED
    
    | @@ -4,11 +4,16 @@ | |
| 4 4 |  | 
| 5 5 | 
             
            | :warning: This is _not finished_ yet, so use it at your own risk. |
         | 
| 6 6 | 
             
            --------------------------------------------------------------------
         | 
| 7 | 
            +
            | :warning: Until version 1.X breaking changes might happen |
         | 
| 8 | 
            +
            -------------------------------------------------------------
         | 
| 7 9 |  | 
| 8 10 | 
             
            CollectionJson::Serializer serializes Ruby objects to Collection+JSON, the hypermedia type by Mike Amudsen.
         | 
| 9 11 |  | 
| 10 12 | 
             
            Please note that CollectionJson::Serializer _only serializes data_. You still need to set the proper Headers or media-types in your app.
         | 
| 11 13 |  | 
| 14 | 
            +
            If you're working on a Rails app, you might want to use [Collection+JSON
         | 
| 15 | 
            +
            Rails](https://github.com/carlesjove/collection_json_rails) instead.
         | 
| 16 | 
            +
             | 
| 12 17 | 
             
            ## Installation
         | 
| 13 18 |  | 
| 14 19 | 
             
            Add this line to your application's Gemfile:
         | 
| @@ -32,16 +37,14 @@ class UserSerializer < CollectionJson::Serializer | |
| 32 37 |  | 
| 33 38 | 
             
              template :name
         | 
| 34 39 | 
             
              template email: { prompt: "My email" }
         | 
| 35 | 
            -
              # This could be written in a single line, too, wrapping the hash:
         | 
| 36 | 
            -
              # template :name, { email: { ... } }
         | 
| 37 40 |  | 
| 38 | 
            -
               | 
| 39 | 
            -
              links dashboard: { href: "http://example.com/my-dashboard" }
         | 
| 41 | 
            +
              link dashboard: { href: "http://example.com/my-dashboard" }
         | 
| 40 42 |  | 
| 41 | 
            -
               | 
| 43 | 
            +
              query search: {
         | 
| 42 44 | 
             
                href: "http://example.com/search",
         | 
| 43 45 | 
             
                name: false # Don't automatically include the name attribute
         | 
| 44 | 
            -
              } | 
| 46 | 
            +
              }
         | 
| 47 | 
            +
              query pagination: {
         | 
| 45 48 | 
             
                rel: "page",
         | 
| 46 49 | 
             
                href: "http://example.com/page",
         | 
| 47 50 | 
             
                prompt: "Select a page number",
         | 
| @@ -50,9 +53,13 @@ class UserSerializer < CollectionJson::Serializer | |
| 50 53 | 
             
                ]
         | 
| 51 54 | 
             
              }
         | 
| 52 55 |  | 
| 53 | 
            -
               | 
| 54 | 
            -
                 | 
| 56 | 
            +
              items do
         | 
| 57 | 
            +
                attribute :id
         | 
| 58 | 
            +
                attribute name: { prompt: "Your full name" }}
         | 
| 59 | 
            +
                attribute :email
         | 
| 60 | 
            +
             | 
| 55 61 | 
             
                href "http://example.com/users/{id}"
         | 
| 62 | 
            +
             | 
| 56 63 | 
             
                link avatar: { href: "http://assets.example.com/avatar.jpg", render: "image" }
         | 
| 57 64 | 
             
              end
         | 
| 58 65 | 
             
            end
         | 
| @@ -67,7 +74,7 @@ Then, you pass your objects to the serializer: | |
| 67 74 | 
             
            user_serializer = UserSerializer.new(@user)
         | 
| 68 75 |  | 
| 69 76 | 
             
            # You can also pass an array of objects
         | 
| 70 | 
            -
            # user_serializer = UserSerializer.new([@user1, @user2 | 
| 77 | 
            +
            # user_serializer = UserSerializer.new([@user1, @user2])
         | 
| 71 78 |  | 
| 72 79 | 
             
            # Pass the serializer to the builder
         | 
| 73 80 | 
             
            collection = CollectionJson::Serializer::Builder.new(user_serializer)
         | 
| @@ -139,10 +146,10 @@ All placeholders will be called, so you can use more than one if necessary, but | |
| 139 146 | 
             
            ```ruby
         | 
| 140 147 | 
             
            class UserSerializer < CollectionJson::Serializer
         | 
| 141 148 | 
             
              items do
         | 
| 142 | 
            -
                # This  | 
| 149 | 
            +
                # This will work
         | 
| 143 150 | 
             
                href "http://example.com/users/{id}/{username}"
         | 
| 144 151 |  | 
| 145 | 
            -
                # This  | 
| 152 | 
            +
                # This won't work
         | 
| 146 153 | 
             
                href "http://example.com/users/{id}-{username}"
         | 
| 147 154 | 
             
              end
         | 
| 148 155 | 
             
            end
         | 
| @@ -163,19 +170,16 @@ class UserSerializer < CollectionJson::Serializer | |
| 163 170 |  | 
| 164 171 | 
             
              # Now you can use your crazy properties everywhere
         | 
| 165 172 | 
             
              items do
         | 
| 166 | 
            -
                 | 
| 173 | 
            +
                attribute name: { css_class: "people" }
         | 
| 167 174 | 
             
              end
         | 
| 168 175 |  | 
| 169 176 | 
             
              template name: { regex: "/\A[a-zA-Z0-9_]*\z/" }
         | 
| 170 177 |  | 
| 171 | 
            -
               | 
| 178 | 
            +
              link profile: { on_click: "reboot_universe" }
         | 
| 172 179 | 
             
            end
         | 
| 173 180 | 
             
            ```
         | 
| 174 181 |  | 
| 175 182 | 
             
            ## Contributing
         | 
| 176 183 |  | 
| 177 | 
            -
             | 
| 178 | 
            -
             | 
| 179 | 
            -
            3. Commit your changes (`git commit -am 'Add some feature'`)
         | 
| 180 | 
            -
            4. Push to the branch (`git push origin my-new-feature`)
         | 
| 181 | 
            -
            5. Create a new Pull Request
         | 
| 184 | 
            +
            Please, all Pull Request should point to the `dev` branch. `master` is for the
         | 
| 185 | 
            +
            latest release only.
         | 
| @@ -18,6 +18,11 @@ module CollectionJson | |
| 18 18 | 
             
                    @attributes ||= args
         | 
| 19 19 | 
             
                  end
         | 
| 20 20 |  | 
| 21 | 
            +
                  def attribute(args)
         | 
| 22 | 
            +
                    @attributes = Array.new unless @attributes.is_a?(Array)
         | 
| 23 | 
            +
                    @attributes << args
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 21 26 | 
             
                  def link(args)
         | 
| 22 27 | 
             
                    @links = Array.new unless @links.is_a?(Array)
         | 
| 23 28 | 
             
                    @links << args
         | 
| @@ -4,9 +4,9 @@ module CollectionJson | |
| 4 4 | 
             
                  class Query
         | 
| 5 5 | 
             
                    def initialize(serializer, item: 0)
         | 
| 6 6 | 
             
                      @serializer = serializer
         | 
| 7 | 
            -
                       | 
| 8 | 
            -
                      @key = @serializer.queries | 
| 9 | 
            -
                      @resource = @serializer.queries. | 
| 7 | 
            +
                      index = item >= 0 ? item : 0
         | 
| 8 | 
            +
                      @key = @serializer.queries[index].keys.first
         | 
| 9 | 
            +
                      @resource = @serializer.queries[index].fetch(@key)
         | 
| 10 10 | 
             
                      @query = Hash.new
         | 
| 11 11 | 
             
                    end
         | 
| 12 12 |  | 
| @@ -1,40 +1,53 @@ | |
| 1 1 | 
             
            module CollectionJson
         | 
| 2 2 | 
             
              class Serializer
         | 
| 3 3 | 
             
                class << self
         | 
| 4 | 
            -
                  attr_accessor : | 
| 5 | 
            -
                  attr_accessor : | 
| 6 | 
            -
                  attr_accessor : | 
| 7 | 
            -
                  attr_accessor : | 
| 8 | 
            -
                  attr_accessor : | 
| 4 | 
            +
                  attr_accessor :_extensions
         | 
| 5 | 
            +
                  attr_accessor :_href
         | 
| 6 | 
            +
                  attr_accessor :_template
         | 
| 7 | 
            +
                  attr_accessor :_links
         | 
| 8 | 
            +
                  attr_accessor :_queries
         | 
| 9 9 | 
             
                  attr_accessor :_items
         | 
| 10 10 | 
             
                end
         | 
| 11 11 |  | 
| 12 12 | 
             
                def self.inherited(base)
         | 
| 13 | 
            -
                  base. | 
| 14 | 
            -
                  base. | 
| 15 | 
            -
                  base. | 
| 16 | 
            -
                  base. | 
| 17 | 
            -
                  base. | 
| 13 | 
            +
                  base._extensions = []
         | 
| 14 | 
            +
                  base._href = []
         | 
| 15 | 
            +
                  base._template = []
         | 
| 16 | 
            +
                  base._links = []
         | 
| 17 | 
            +
                  base._queries = []
         | 
| 18 18 | 
             
                end
         | 
| 19 19 |  | 
| 20 20 | 
             
                def self.extensions(*attrs)
         | 
| 21 | 
            -
                  @ | 
| 21 | 
            +
                  @_extensions.concat attrs
         | 
| 22 22 | 
             
                end
         | 
| 23 23 |  | 
| 24 24 | 
             
                def self.href(*attrs)
         | 
| 25 | 
            -
                  @ | 
| 25 | 
            +
                  @_href.concat attrs
         | 
| 26 26 | 
             
                end
         | 
| 27 27 |  | 
| 28 28 | 
             
                def self.template(*attrs)
         | 
| 29 | 
            -
                  @ | 
| 29 | 
            +
                  @_template.concat attrs
         | 
| 30 30 | 
             
                end
         | 
| 31 31 |  | 
| 32 | 
            +
                def self.link(*attrs)
         | 
| 33 | 
            +
                  @_links.concat attrs
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                # DEPRECATED
         | 
| 32 37 | 
             
                def self.links(*attrs)
         | 
| 33 | 
            -
                   | 
| 38 | 
            +
                  warn "links has been deprecated and will be removed soon. " <<
         | 
| 39 | 
            +
                       "Please, use `link` instead"
         | 
| 40 | 
            +
                  @_links.concat attrs
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                def self.query(*attrs)
         | 
| 44 | 
            +
                  @_queries.concat attrs
         | 
| 34 45 | 
             
                end
         | 
| 35 46 |  | 
| 36 47 | 
             
                def self.queries(*attrs)
         | 
| 37 | 
            -
                   | 
| 48 | 
            +
                  warn "`queries` has been deprecated and will be removed soon. " <<
         | 
| 49 | 
            +
                       "Please, use `query` instead"
         | 
| 50 | 
            +
                  @_queries.concat attrs
         | 
| 38 51 | 
             
                end
         | 
| 39 52 |  | 
| 40 53 | 
             
                def self.items(&block)
         | 
| @@ -53,35 +66,35 @@ module CollectionJson | |
| 53 66 | 
             
                end
         | 
| 54 67 |  | 
| 55 68 | 
             
                def extensions
         | 
| 56 | 
            -
                  self.class. | 
| 69 | 
            +
                  self.class._extensions
         | 
| 57 70 | 
             
                end
         | 
| 58 71 |  | 
| 59 72 | 
             
                def href
         | 
| 60 | 
            -
                  self.class. | 
| 73 | 
            +
                  self.class._href.first
         | 
| 61 74 | 
             
                end
         | 
| 62 75 |  | 
| 63 76 | 
             
                def template
         | 
| 64 | 
            -
                  self.class. | 
| 77 | 
            +
                  self.class._template
         | 
| 65 78 | 
             
                end
         | 
| 66 79 |  | 
| 67 80 | 
             
                def template?
         | 
| 68 | 
            -
                  self.class. | 
| 81 | 
            +
                  self.class._template.present?
         | 
| 69 82 | 
             
                end
         | 
| 70 83 |  | 
| 71 84 | 
             
                def links
         | 
| 72 | 
            -
                  self.class. | 
| 85 | 
            +
                  self.class._links
         | 
| 73 86 | 
             
                end
         | 
| 74 87 |  | 
| 75 88 | 
             
                def links?
         | 
| 76 | 
            -
                  self.class. | 
| 89 | 
            +
                  self.class._links.present?
         | 
| 77 90 | 
             
                end
         | 
| 78 91 |  | 
| 79 92 | 
             
                def queries
         | 
| 80 | 
            -
                  self.class. | 
| 93 | 
            +
                  self.class._queries
         | 
| 81 94 | 
             
                end
         | 
| 82 95 |  | 
| 83 96 | 
             
                def queries?
         | 
| 84 | 
            -
                  self.class. | 
| 97 | 
            +
                  self.class._queries.present?
         | 
| 85 98 | 
             
                end
         | 
| 86 99 |  | 
| 87 100 | 
             
                def items
         | 
| @@ -73,6 +73,15 @@ module CollectionJson | |
| 73 73 | 
             
                            {
         | 
| 74 74 | 
             
                              rel: "search",
         | 
| 75 75 | 
             
                              href: "http://example.com/search"
         | 
| 76 | 
            +
                            },
         | 
| 77 | 
            +
                            {
         | 
| 78 | 
            +
                              rel: "page",
         | 
| 79 | 
            +
                              href: "http://example.com/page",
         | 
| 80 | 
            +
                              name: "pagination",
         | 
| 81 | 
            +
                              prompt: "Select a page number",
         | 
| 82 | 
            +
                              data: [
         | 
| 83 | 
            +
                                { name: "page", value: "" }
         | 
| 84 | 
            +
                              ]
         | 
| 76 85 | 
             
                            }
         | 
| 77 86 | 
             
                          ]
         | 
| 78 87 | 
             
                        }
         | 
| @@ -168,6 +177,15 @@ module CollectionJson | |
| 168 177 | 
             
                            {
         | 
| 169 178 | 
             
                              rel: "search",
         | 
| 170 179 | 
             
                              href: "http://example.com/search"
         | 
| 180 | 
            +
                            },
         | 
| 181 | 
            +
                            {
         | 
| 182 | 
            +
                              rel: "page",
         | 
| 183 | 
            +
                              href: "http://example.com/page",
         | 
| 184 | 
            +
                              name: "pagination",
         | 
| 185 | 
            +
                              prompt: "Select a page number",
         | 
| 186 | 
            +
                              data: [
         | 
| 187 | 
            +
                                { name: "page", value: "" }
         | 
| 188 | 
            +
                              ]
         | 
| 171 189 | 
             
                            }
         | 
| 172 190 | 
             
                          ]
         | 
| 173 191 | 
             
                        }
         | 
| @@ -8,8 +8,8 @@ module CollectionJson | |
| 8 8 | 
             
                  def setup
         | 
| 9 9 | 
             
                    @user = User.new(name: "Carles Jove", email: "hola@carlus.cat")
         | 
| 10 10 | 
             
                    @serializer = empty_serializer_for(@user)
         | 
| 11 | 
            -
                    @serializer.class. | 
| 12 | 
            -
                    @serializer.class. | 
| 11 | 
            +
                    @serializer.class._extensions = [:open_attrs]
         | 
| 12 | 
            +
                    @serializer.class._template = [
         | 
| 13 13 | 
             
                      email: {
         | 
| 14 14 | 
             
                        prompt: "My email",
         | 
| 15 15 | 
             
                        anything: "at all"
         | 
| @@ -27,13 +27,13 @@ module CollectionJson | |
| 27 27 | 
             
                        anything: "at all"
         | 
| 28 28 | 
             
                      }
         | 
| 29 29 | 
             
                    ]
         | 
| 30 | 
            -
                    @serializer.class. | 
| 30 | 
            +
                    @serializer.class._links = [
         | 
| 31 31 | 
             
                      dashboard: {
         | 
| 32 32 | 
             
                        href: "http://example.com/my-dashboard",
         | 
| 33 33 | 
             
                        anything: "at all"
         | 
| 34 34 | 
             
                      }
         | 
| 35 35 | 
             
                    ]
         | 
| 36 | 
            -
                    @serializer.class. | 
| 36 | 
            +
                    @serializer.class._queries = [
         | 
| 37 37 | 
             
                      search: {
         | 
| 38 38 | 
             
                        href: "http://example.com/search",
         | 
| 39 39 | 
             
                        rel: "search",
         | 
| @@ -5,12 +5,13 @@ class UserSerializer < CollectionJson::Serializer | |
| 5 5 | 
             
              template email: { prompt: "My email" }
         | 
| 6 6 | 
             
              template :password
         | 
| 7 7 |  | 
| 8 | 
            -
               | 
| 8 | 
            +
              link dashboard: { href: "http://example.com/my-dashboard" }
         | 
| 9 9 |  | 
| 10 | 
            -
               | 
| 10 | 
            +
              query search: {
         | 
| 11 11 | 
             
                href: "http://example.com/search",
         | 
| 12 12 | 
             
                name: false
         | 
| 13 | 
            -
              } | 
| 13 | 
            +
              }
         | 
| 14 | 
            +
              query pagination: {
         | 
| 14 15 | 
             
                rel: "page",
         | 
| 15 16 | 
             
                href: "http://example.com/page",
         | 
| 16 17 | 
             
                prompt: "Select a page number",
         | 
| @@ -22,6 +23,7 @@ class UserSerializer < CollectionJson::Serializer | |
| 22 23 | 
             
              items do
         | 
| 23 24 | 
             
                href "http://example.com/users/{id}"
         | 
| 24 25 | 
             
                attributes :name, :email
         | 
| 26 | 
            +
                attribute date_created: { prompt: "Member since" }
         | 
| 25 27 | 
             
                link avatar: { href: "http://assets.example.com/avatar.jpg" }
         | 
| 26 28 | 
             
                link bio: { href: "http://example.com/bio" }
         | 
| 27 29 | 
             
              end
         | 
    
        data/test/minitest_helper.rb
    CHANGED
    
    | @@ -10,11 +10,11 @@ Dir.glob(File.dirname(__FILE__) + "/fixtures/serializers/**/*.rb") { |file| requ | |
| 10 10 | 
             
            module TestHelper
         | 
| 11 11 | 
             
              def empty_serializer_for(object)
         | 
| 12 12 | 
             
                serializer = CollectionJson::Serializer.new(object)
         | 
| 13 | 
            -
                serializer.class. | 
| 14 | 
            -
                serializer.class. | 
| 15 | 
            -
                serializer.class. | 
| 16 | 
            -
                serializer.class. | 
| 17 | 
            -
                serializer.class. | 
| 13 | 
            +
                serializer.class._extensions = []
         | 
| 14 | 
            +
                serializer.class._href = []
         | 
| 15 | 
            +
                serializer.class._links = []
         | 
| 16 | 
            +
                serializer.class._template = []
         | 
| 17 | 
            +
                serializer.class._queries = []
         | 
| 18 18 | 
             
                serializer.class.items {}
         | 
| 19 19 | 
             
                serializer.items.attributes = []
         | 
| 20 20 | 
             
                serializer
         | 
    
        data/test/objects/item_test.rb
    CHANGED
    
    | @@ -8,8 +8,10 @@ module CollectionJson | |
| 8 8 | 
             
                      include TestHelper
         | 
| 9 9 |  | 
| 10 10 | 
             
                      def setup
         | 
| 11 | 
            -
                        @user1 = User.new(name: "Carles Jove", email: "hola@carlus.cat" | 
| 12 | 
            -
             | 
| 11 | 
            +
                        @user1 = User.new(name: "Carles Jove", email: "hola@carlus.cat",
         | 
| 12 | 
            +
                                          date_created: "2015-02-01")
         | 
| 13 | 
            +
                        @user2 = User.new(name: "Aina Jove", email: "hola@example.com",
         | 
| 14 | 
            +
                                          date_created: "2015-02-02")
         | 
| 13 15 | 
             
                        @user_serializer = UserSerializer.new(@user1)
         | 
| 14 16 | 
             
                        @item = Item.new(@user_serializer)
         | 
| 15 17 | 
             
                      end
         | 
| @@ -19,7 +21,12 @@ module CollectionJson | |
| 19 21 | 
             
                          href: "http://example.com/users/#{@user1.id}",
         | 
| 20 22 | 
             
                          data: [
         | 
| 21 23 | 
             
                            { name: "name", value: "Carles Jove" },
         | 
| 22 | 
            -
                            { name: "email", value: "hola@carlus.cat" }
         | 
| 24 | 
            +
                            { name: "email", value: "hola@carlus.cat" },
         | 
| 25 | 
            +
                            {
         | 
| 26 | 
            +
                              name: "date_created",
         | 
| 27 | 
            +
                              value: "2015-02-01",
         | 
| 28 | 
            +
                              prompt: "Member since"
         | 
| 29 | 
            +
                            }
         | 
| 23 30 | 
             
                          ],
         | 
| 24 31 | 
             
                          links: [
         | 
| 25 32 | 
             
                            {
         | 
| @@ -46,7 +53,12 @@ module CollectionJson | |
| 46 53 | 
             
                          href: "http://example.com/users/#{@user2.id}",
         | 
| 47 54 | 
             
                          data: [
         | 
| 48 55 | 
             
                            { name: "name", value: "Aina Jove" },
         | 
| 49 | 
            -
                            { name: "email", value: "hola@example.com" }
         | 
| 56 | 
            +
                            { name: "email", value: "hola@example.com" },
         | 
| 57 | 
            +
                            {
         | 
| 58 | 
            +
                              name: "date_created",
         | 
| 59 | 
            +
                              value: "2015-02-02",
         | 
| 60 | 
            +
                              prompt: "Member since"
         | 
| 61 | 
            +
                            }
         | 
| 50 62 | 
             
                          ],
         | 
| 51 63 | 
             
                          links: [
         | 
| 52 64 | 
             
                            {
         | 
    
        data/test/serializer/dsl_test.rb
    CHANGED
    
    | @@ -4,7 +4,8 @@ module CollectionJson | |
| 4 4 | 
             
              class Serializer
         | 
| 5 5 | 
             
                class TestDSL < Minitest::Test
         | 
| 6 6 | 
             
                  def setup
         | 
| 7 | 
            -
                    @user = User.new(name: "Carles Jove", email: "hola@carlus.cat" | 
| 7 | 
            +
                    @user = User.new(name: "Carles Jove", email: "hola@carlus.cat",
         | 
| 8 | 
            +
                                     date_created: "2015-02-01")
         | 
| 8 9 | 
             
                    @serializer = Serializer.new(@user)
         | 
| 9 10 | 
             
                  end
         | 
| 10 11 |  | 
| @@ -11,14 +11,14 @@ module CollectionJson | |
| 11 11 | 
             
                  end
         | 
| 12 12 |  | 
| 13 13 | 
             
                  def test_href_object
         | 
| 14 | 
            -
                    assert_equal ["http://example.com/users"], @user_serializer.class. | 
| 14 | 
            +
                    assert_equal ["http://example.com/users"], @user_serializer.class._href
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 17 | 
             
                  def test_that_only_one_href_value_is_passed_to_builder
         | 
| 18 18 | 
             
                    serializer = empty_serializer_for(@user)
         | 
| 19 | 
            -
                    serializer.class. | 
| 19 | 
            +
                    serializer.class._href = %w(/a /b /c)
         | 
| 20 20 |  | 
| 21 | 
            -
                    assert_equal %w(/a /b /c), serializer.class. | 
| 21 | 
            +
                    assert_equal %w(/a /b /c), serializer.class._href
         | 
| 22 22 | 
             
                    assert_equal "/a", serializer.href
         | 
| 23 23 | 
             
                  end
         | 
| 24 24 | 
             
                end
         | 
| @@ -4,12 +4,14 @@ module CollectionJson | |
| 4 4 | 
             
              class Serializer
         | 
| 5 5 | 
             
                class TestAttributes < Minitest::Test
         | 
| 6 6 | 
             
                  def setup
         | 
| 7 | 
            -
                    @user = User.new(name: "Carles Jove", email: "hola@carlus.cat" | 
| 7 | 
            +
                    @user = User.new(name: "Carles Jove", email: "hola@carlus.cat",
         | 
| 8 | 
            +
                                     date_created: "2015-02-01")
         | 
| 8 9 | 
             
                    @user_serializer = UserSerializer.new(@user)
         | 
| 9 10 | 
             
                  end
         | 
| 10 11 |  | 
| 11 12 | 
             
                  def test_attributes_properties
         | 
| 12 | 
            -
                     | 
| 13 | 
            +
                    expected_attributes = [:name, :email, { date_created: { prompt: "Member since" } }]
         | 
| 14 | 
            +
                    assert_equal expected_attributes, @user_serializer.items.attributes
         | 
| 13 15 | 
             
                  end
         | 
| 14 16 | 
             
                end
         | 
| 15 17 | 
             
              end
         | 
| @@ -12,7 +12,7 @@ module CollectionJson | |
| 12 12 |  | 
| 13 13 | 
             
                  def test_item_links_attributes
         | 
| 14 14 | 
             
                    expected = [dashboard: { href: "http://example.com/my-dashboard" }]
         | 
| 15 | 
            -
                    assert_equal expected, @user_serializer.class. | 
| 15 | 
            +
                    assert_equal expected, @user_serializer.class._links
         | 
| 16 16 | 
             
                  end
         | 
| 17 17 | 
             
                end
         | 
| 18 18 | 
             
              end
         | 
| @@ -10,21 +10,23 @@ module CollectionJson | |
| 10 10 |  | 
| 11 11 | 
             
                  def test_template_attributes
         | 
| 12 12 | 
             
                    expected = [
         | 
| 13 | 
            -
                      search: {
         | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 13 | 
            +
                      { search: {
         | 
| 14 | 
            +
                          href: "http://example.com/search",
         | 
| 15 | 
            +
                          name: false
         | 
| 16 | 
            +
                        }
         | 
| 16 17 | 
             
                      },
         | 
| 17 | 
            -
                      pagination: {
         | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 18 | 
            +
                      { pagination: {
         | 
| 19 | 
            +
                          rel: "page",
         | 
| 20 | 
            +
                          href: "http://example.com/page",
         | 
| 21 | 
            +
                          prompt: "Select a page number",
         | 
| 22 | 
            +
                          data: [
         | 
| 23 | 
            +
                            { name: "page" }
         | 
| 24 | 
            +
                          ]
         | 
| 25 | 
            +
                        }
         | 
| 24 26 | 
             
                      }
         | 
| 25 27 | 
             
                    ]
         | 
| 26 28 |  | 
| 27 | 
            -
                    assert_equal expected, @user_serializer.class. | 
| 29 | 
            +
                    assert_equal expected, @user_serializer.class._queries
         | 
| 28 30 | 
             
                  end
         | 
| 29 31 | 
             
                end
         | 
| 30 32 | 
             
              end
         | 
| @@ -10,16 +10,16 @@ module CollectionJson | |
| 10 10 | 
             
                    serializer.items.attributes = [
         | 
| 11 11 | 
             
                      name: { unknown: "this should not be valid" }
         | 
| 12 12 | 
             
                    ]
         | 
| 13 | 
            -
                    serializer.items.links = serializer.class. | 
| 13 | 
            +
                    serializer.items.links = serializer.class._links = [
         | 
| 14 14 | 
             
                      dashboard: {
         | 
| 15 15 | 
             
                        href: "http://example.com",
         | 
| 16 16 | 
             
                        unknown: "this should not be valid"
         | 
| 17 17 | 
             
                      }
         | 
| 18 18 | 
             
                    ]
         | 
| 19 | 
            -
                    serializer.class. | 
| 19 | 
            +
                    serializer.class._template = [
         | 
| 20 20 | 
             
                      name: { whatever: "this should not be valid" }
         | 
| 21 21 | 
             
                    ]
         | 
| 22 | 
            -
                    serializer.class. | 
| 22 | 
            +
                    serializer.class._queries = [
         | 
| 23 23 | 
             
                      name: {
         | 
| 24 24 | 
             
                        href: "http://example.com",
         | 
| 25 25 | 
             
                        whatever: "this should be invalid",
         | 
| @@ -23,7 +23,7 @@ module CollectionJson | |
| 23 23 |  | 
| 24 24 | 
             
                    # Href
         | 
| 25 25 | 
             
                    def test_that_href_generates_errors
         | 
| 26 | 
            -
                      @invalid.class. | 
| 26 | 
            +
                      @invalid.class._href = [self: "/users/1", collection: "www.users.com"]
         | 
| 27 27 |  | 
| 28 28 | 
             
                      assert @invalid.invalid?
         | 
| 29 29 | 
             
                      assert @invalid.errors.include? :href
         | 
| @@ -32,7 +32,7 @@ module CollectionJson | |
| 32 32 | 
             
                      assert @invalid.errors[:href][1].
         | 
| 33 33 | 
             
                              include? "href:collection is an invalid URL"
         | 
| 34 34 |  | 
| 35 | 
            -
                      @invalid.class. | 
| 35 | 
            +
                      @invalid.class._href = ["/users/1"]
         | 
| 36 36 |  | 
| 37 37 | 
             
                      assert @invalid.invalid?
         | 
| 38 38 | 
             
                      assert @invalid.errors.include? :href
         | 
| @@ -42,13 +42,13 @@ module CollectionJson | |
| 42 42 |  | 
| 43 43 | 
             
                    # Links
         | 
| 44 44 | 
             
                    def test_that_links_generates_errors
         | 
| 45 | 
            -
                      @invalid.class. | 
| 45 | 
            +
                      @invalid.class._links = [dashboard: { href: "/my-dashboard" }]
         | 
| 46 46 | 
             
                      assert @invalid.invalid?
         | 
| 47 47 | 
             
                      assert @invalid.errors.include? :links
         | 
| 48 48 | 
             
                      assert @invalid.errors[:links].first.
         | 
| 49 49 | 
             
                              include? "links:dashboard:href is an invalid URL"
         | 
| 50 50 |  | 
| 51 | 
            -
                      @invalid.class. | 
| 51 | 
            +
                      @invalid.class._links = [
         | 
| 52 52 | 
             
                        dashboard: {
         | 
| 53 53 | 
             
                          href: "http://valid.url.com",
         | 
| 54 54 | 
             
                          prompt: /invalid/
         | 
| @@ -61,7 +61,7 @@ module CollectionJson | |
| 61 61 | 
             
                    end
         | 
| 62 62 |  | 
| 63 63 | 
             
                    def test_that_links_missing_href_generates_error
         | 
| 64 | 
            -
                      @invalid.class. | 
| 64 | 
            +
                      @invalid.class._links = [dashboard: {}]
         | 
| 65 65 | 
             
                      assert @invalid.invalid?
         | 
| 66 66 | 
             
                      assert @invalid.errors.include? :links
         | 
| 67 67 | 
             
                      assert @invalid.errors[:links].first.
         | 
| @@ -103,7 +103,7 @@ module CollectionJson | |
| 103 103 | 
             
                    # Template
         | 
| 104 104 | 
             
                    def test_that_template_values_validate
         | 
| 105 105 | 
             
                      values_for_test(:invalid).each do |invalidate|
         | 
| 106 | 
            -
                        @invalid.class. | 
| 106 | 
            +
                        @invalid.class._template = [
         | 
| 107 107 | 
             
                          name: {
         | 
| 108 108 | 
             
                            prompt: invalidate,
         | 
| 109 109 | 
             
                            name: invalidate
         | 
| @@ -123,7 +123,7 @@ module CollectionJson | |
| 123 123 |  | 
| 124 124 | 
             
                    # Queries
         | 
| 125 125 | 
             
                    def test_that_queries_validate_href_format
         | 
| 126 | 
            -
                      @invalid.class. | 
| 126 | 
            +
                      @invalid.class._queries = [
         | 
| 127 127 | 
             
                        search: {
         | 
| 128 128 | 
             
                          href: "not-valid"
         | 
| 129 129 | 
             
                        }
         | 
| @@ -138,7 +138,7 @@ module CollectionJson | |
| 138 138 | 
             
                    end
         | 
| 139 139 |  | 
| 140 140 | 
             
                    def test_that_queries_href_is_required
         | 
| 141 | 
            -
                      @invalid.class. | 
| 141 | 
            +
                      @invalid.class._queries = [
         | 
| 142 142 | 
             
                        search: {
         | 
| 143 143 | 
             
                          name: "missing href"
         | 
| 144 144 | 
             
                        }
         | 
| @@ -153,7 +153,7 @@ module CollectionJson | |
| 153 153 |  | 
| 154 154 | 
             
                    def test_that_queries_values_are_validated
         | 
| 155 155 | 
             
                      values_for_test(:invalid).each do |invalidate|
         | 
| 156 | 
            -
                        @invalid.class. | 
| 156 | 
            +
                        @invalid.class._queries = [
         | 
| 157 157 | 
             
                          search: {
         | 
| 158 158 | 
             
                            href: "http://example.com/",
         | 
| 159 159 | 
             
                            name: invalidate,
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: collection_json_serializer
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Carles Jove i Buxeda
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015-02- | 
| 11 | 
            +
            date: 2015-02-17 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: activesupport
         |