representable 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES.textile +4 -0
 - data/README.md +13 -12
 - data/lib/representable.rb +12 -3
 - data/lib/representable/bindings/hash_bindings.rb +5 -3
 - data/lib/representable/version.rb +1 -1
 - data/test/json_test.rb +12 -2
 - data/test/representable_test.rb +9 -11
 - data/test/test_helper.rb +11 -0
 - metadata +2 -2
 
    
        data/CHANGES.textile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | 
         @@ -55,6 +55,19 @@ It also adds support for parsing. 
     | 
|
| 
       55 
55 
     | 
    
         
             
                song = Song.new.extend(SongRepresenter).from_json(%{ {"title":"Roxanne"} })
         
     | 
| 
       56 
56 
     | 
    
         
             
                #=> #<Song title="Roxanne", track=nil>
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
      
 58 
     | 
    
         
            +
            ## Aliasing
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            If your property name doesn't match the name in the document, use the `:as` option.
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
                module SongRepresenter
         
     | 
| 
      
 63 
     | 
    
         
            +
                  include Representable::JSON
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  property :title, as: :name
         
     | 
| 
      
 66 
     | 
    
         
            +
                  property :track
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
                
         
     | 
| 
      
 69 
     | 
    
         
            +
                song.to_json #=> {"name":"Fallout","track":1}
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
       58 
71 
     | 
    
         | 
| 
       59 
72 
     | 
    
         
             
            ## Wrapping
         
     | 
| 
       60 
73 
     | 
    
         | 
| 
         @@ -436,18 +449,6 @@ You can also define conditions on properties using `:if`, making them being cons 
     | 
|
| 
       436 
449 
     | 
    
         
             
            When rendering or parsing, the `track` property is considered only if track is valid. Note that the block is executed in instance context, giving you access to instance methods.
         
     | 
| 
       437 
450 
     | 
    
         | 
| 
       438 
451 
     | 
    
         | 
| 
       439 
     | 
    
         
            -
            ### Mapping
         
     | 
| 
       440 
     | 
    
         
            -
             
     | 
| 
       441 
     | 
    
         
            -
            If your property name doesn't match the attribute name in the document, use the `:as` option.
         
     | 
| 
       442 
     | 
    
         
            -
             
     | 
| 
       443 
     | 
    
         
            -
                module SongRepresenter
         
     | 
| 
       444 
     | 
    
         
            -
                  property :title
         
     | 
| 
       445 
     | 
    
         
            -
                  property :track, as: :track_number
         
     | 
| 
       446 
     | 
    
         
            -
                end
         
     | 
| 
       447 
     | 
    
         
            -
                
         
     | 
| 
       448 
     | 
    
         
            -
                song.to_json #=> {"title":"Superstars","track_number":1}
         
     | 
| 
       449 
     | 
    
         
            -
             
     | 
| 
       450 
     | 
    
         
            -
             
     | 
| 
       451 
452 
     | 
    
         
             
            ### False and Nil Values
         
     | 
| 
       452 
453 
     | 
    
         | 
| 
       453 
454 
     | 
    
         
             
            Since representable-1.2 `false` values _are_ considered when parsing and rendering. That particularly means properties that used to be unset (i.e. `nil`) after parsing might be `false` now. Vice versa, `false` properties that weren't included in the rendered document will be visible now.
         
     | 
    
        data/lib/representable.rb
    CHANGED
    
    | 
         @@ -121,7 +121,7 @@ private 
     | 
|
| 
       121 
121 
     | 
    
         
             
              module ClassInclusions
         
     | 
| 
       122 
122 
     | 
    
         
             
                def included(base)
         
     | 
| 
       123 
123 
     | 
    
         
             
                  super
         
     | 
| 
       124 
     | 
    
         
            -
                  base.representable_attrs. 
     | 
| 
      
 124 
     | 
    
         
            +
                  base.representable_attrs.inherit(representable_attrs)
         
     | 
| 
       125 
125 
     | 
    
         
             
                end
         
     | 
| 
       126 
126 
     | 
    
         
             
              end
         
     | 
| 
       127 
127 
     | 
    
         | 
| 
         @@ -145,7 +145,7 @@ private 
     | 
|
| 
       145 
145 
     | 
    
         | 
| 
       146 
146 
     | 
    
         
             
                module Declarations
         
     | 
| 
       147 
147 
     | 
    
         
             
                  def representable_attrs
         
     | 
| 
       148 
     | 
    
         
            -
                    @representable_attrs ||=  
     | 
| 
      
 148 
     | 
    
         
            +
                    @representable_attrs ||= build_config
         
     | 
| 
       149 
149 
     | 
    
         
             
                  end
         
     | 
| 
       150 
150 
     | 
    
         | 
| 
       151 
151 
     | 
    
         
             
                  def representation_wrap=(name)
         
     | 
| 
         @@ -190,10 +190,15 @@ private 
     | 
|
| 
       190 
190 
     | 
    
         
             
                  def definition_class
         
     | 
| 
       191 
191 
     | 
    
         
             
                    Definition
         
     | 
| 
       192 
192 
     | 
    
         
             
                  end
         
     | 
| 
      
 193 
     | 
    
         
            +
             
     | 
| 
      
 194 
     | 
    
         
            +
                  def build_config
         
     | 
| 
      
 195 
     | 
    
         
            +
                    Config.new
         
     | 
| 
      
 196 
     | 
    
         
            +
                  end
         
     | 
| 
       193 
197 
     | 
    
         
             
                end
         
     | 
| 
       194 
198 
     | 
    
         
             
              end
         
     | 
| 
       195 
199 
     | 
    
         | 
| 
       196 
200 
     | 
    
         | 
| 
      
 201 
     | 
    
         
            +
              # NOTE: the API of Config is subject to change so don't rely too much on this private object.
         
     | 
| 
       197 
202 
     | 
    
         
             
              class Config < Array
         
     | 
| 
       198 
203 
     | 
    
         
             
                attr_accessor :wrap
         
     | 
| 
       199 
204 
     | 
    
         | 
| 
         @@ -207,7 +212,11 @@ private 
     | 
|
| 
       207 
212 
     | 
    
         
             
                def clone
         
     | 
| 
       208 
213 
     | 
    
         
             
                  self.class.new(collect { |d| d.clone })
         
     | 
| 
       209 
214 
     | 
    
         
             
                end
         
     | 
| 
       210 
     | 
    
         
            -
             
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
      
 216 
     | 
    
         
            +
                def inherit(parent)
         
     | 
| 
      
 217 
     | 
    
         
            +
                  push(*parent.clone)
         
     | 
| 
      
 218 
     | 
    
         
            +
                end
         
     | 
| 
      
 219 
     | 
    
         
            +
             
     | 
| 
       211 
220 
     | 
    
         
             
              private
         
     | 
| 
       212 
221 
     | 
    
         
             
                def infer_name_for(name)
         
     | 
| 
       213 
222 
     | 
    
         
             
                  name.to_s.split('::').last.
         
     | 
| 
         @@ -63,13 +63,15 @@ module Representable 
     | 
|
| 
       63 
63 
     | 
    
         
             
                class HashBinding < PropertyBinding
         
     | 
| 
       64 
64 
     | 
    
         
             
                  def serialize_for(value)
         
     | 
| 
       65 
65 
     | 
    
         
             
                    # requires value to respond to #each with two block parameters.
         
     | 
| 
       66 
     | 
    
         
            -
                    {}.tap do | 
     | 
| 
       67 
     | 
    
         
            -
                      value.each { |key, obj|  
     | 
| 
      
 66 
     | 
    
         
            +
                    {}.tap do |hsh|
         
     | 
| 
      
 67 
     | 
    
         
            +
                      value.each { |key, obj| hsh[key] = serialize(obj) }
         
     | 
| 
       68 
68 
     | 
    
         
             
                    end
         
     | 
| 
       69 
69 
     | 
    
         
             
                  end
         
     | 
| 
       70 
70 
     | 
    
         | 
| 
       71 
71 
     | 
    
         
             
                  def deserialize_from(fragment)
         
     | 
| 
       72 
     | 
    
         
            -
                     
     | 
| 
      
 72 
     | 
    
         
            +
                    {}.tap do |hsh|
         
     | 
| 
      
 73 
     | 
    
         
            +
                      fragment.each { |key, item_fragment| hsh[key] = deserialize(item_fragment) }
         
     | 
| 
      
 74 
     | 
    
         
            +
                    end
         
     | 
| 
       73 
75 
     | 
    
         
             
                  end
         
     | 
| 
       74 
76 
     | 
    
         
             
                end
         
     | 
| 
       75 
77 
     | 
    
         
             
              end
         
     | 
    
        data/test/json_test.rb
    CHANGED
    
    | 
         @@ -460,8 +460,18 @@ end 
     | 
|
| 
       460 
460 
     | 
    
         
             
                    OpenStruct.new(:songs => {"7" => Song.new("Contemplation")}).extend(representer).to_hash.must_equal("songs"=>{"7"=>{"name"=>"Contemplation"}})
         
     | 
| 
       461 
461 
     | 
    
         
             
                  end
         
     | 
| 
       462 
462 
     | 
    
         | 
| 
       463 
     | 
    
         
            -
                   
     | 
| 
       464 
     | 
    
         
            -
                    OpenStruct.new.extend(representer) 
     | 
| 
      
 463 
     | 
    
         
            +
                  describe "parsing" do
         
     | 
| 
      
 464 
     | 
    
         
            +
                    subject { OpenStruct.new.extend(representer) }
         
     | 
| 
      
 465 
     | 
    
         
            +
                    let (:hash) { {"7"=>{"name"=>"Contemplation"}} }
         
     | 
| 
      
 466 
     | 
    
         
            +
             
     | 
| 
      
 467 
     | 
    
         
            +
                    it "parses incoming hash" do
         
     | 
| 
      
 468 
     | 
    
         
            +
                      subject.from_hash("songs"=>hash).songs.must_equal({"7"=>Song.new("Contemplation")})
         
     | 
| 
      
 469 
     | 
    
         
            +
                    end
         
     | 
| 
      
 470 
     | 
    
         
            +
             
     | 
| 
      
 471 
     | 
    
         
            +
                    it "doesn't modify the incoming hash" do
         
     | 
| 
      
 472 
     | 
    
         
            +
                      subject.from_hash("songs"=> incoming_hash = hash.dup)
         
     | 
| 
      
 473 
     | 
    
         
            +
                      hash.must_equal incoming_hash
         
     | 
| 
      
 474 
     | 
    
         
            +
                    end
         
     | 
| 
       465 
475 
     | 
    
         
             
                  end
         
     | 
| 
       466 
476 
     | 
    
         
             
                end
         
     | 
| 
       467 
477 
     | 
    
         
             
              end
         
     | 
    
        data/test/representable_test.rb
    CHANGED
    
    | 
         @@ -571,31 +571,29 @@ class RepresentableTest < MiniTest::Spec 
     | 
|
| 
       571 
571 
     | 
    
         
             
              end
         
     | 
| 
       572 
572 
     | 
    
         | 
| 
       573 
573 
     | 
    
         
             
              describe "Config" do
         
     | 
| 
       574 
     | 
    
         
            -
                 
     | 
| 
       575 
     | 
    
         
            -
             
     | 
| 
       576 
     | 
    
         
            -
                  PunkRock = Class.new
         
     | 
| 
       577 
     | 
    
         
            -
                end
         
     | 
| 
      
 574 
     | 
    
         
            +
                subject { Representable::Config.new }
         
     | 
| 
      
 575 
     | 
    
         
            +
                PunkRock = Class.new
         
     | 
| 
       578 
576 
     | 
    
         | 
| 
       579 
577 
     | 
    
         
             
                describe "wrapping" do
         
     | 
| 
       580 
578 
     | 
    
         
             
                  it "returns false per default" do
         
     | 
| 
       581 
     | 
    
         
            -
                    assert_equal nil,  
     | 
| 
      
 579 
     | 
    
         
            +
                    assert_equal nil, subject.wrap_for("Punk")
         
     | 
| 
       582 
580 
     | 
    
         
             
                  end
         
     | 
| 
       583 
581 
     | 
    
         | 
| 
       584 
582 
     | 
    
         
             
                  it "infers a printable class name if set to true" do
         
     | 
| 
       585 
     | 
    
         
            -
                     
     | 
| 
       586 
     | 
    
         
            -
                    assert_equal "punk_rock",  
     | 
| 
      
 583 
     | 
    
         
            +
                    subject.wrap = true
         
     | 
| 
      
 584 
     | 
    
         
            +
                    assert_equal "punk_rock", subject.wrap_for(PunkRock)
         
     | 
| 
       587 
585 
     | 
    
         
             
                  end
         
     | 
| 
       588 
586 
     | 
    
         | 
| 
       589 
587 
     | 
    
         
             
                  it "can be set explicitely" do
         
     | 
| 
       590 
     | 
    
         
            -
                     
     | 
| 
       591 
     | 
    
         
            -
                    assert_equal "Descendents",  
     | 
| 
      
 588 
     | 
    
         
            +
                    subject.wrap = "Descendents"
         
     | 
| 
      
 589 
     | 
    
         
            +
                    assert_equal "Descendents", subject.wrap_for(PunkRock)
         
     | 
| 
       592 
590 
     | 
    
         
             
                  end
         
     | 
| 
       593 
591 
     | 
    
         
             
                end
         
     | 
| 
       594 
592 
     | 
    
         | 
| 
       595 
593 
     | 
    
         
             
                describe "clone" do
         
     | 
| 
       596 
594 
     | 
    
         
             
                  it "clones all definitions" do
         
     | 
| 
       597 
     | 
    
         
            -
                     
     | 
| 
       598 
     | 
    
         
            -
                    assert  
     | 
| 
      
 595 
     | 
    
         
            +
                    subject << Object.new
         
     | 
| 
      
 596 
     | 
    
         
            +
                    assert subject.first != subject.clone.first
         
     | 
| 
       599 
597 
     | 
    
         
             
                  end
         
     | 
| 
       600 
598 
     | 
    
         
             
                end
         
     | 
| 
       601 
599 
     | 
    
         
             
              end
         
     | 
    
        data/test/test_helper.rb
    CHANGED
    
    | 
         @@ -62,4 +62,15 @@ MiniTest::Spec.class_eval do 
     | 
|
| 
       62 
62 
     | 
    
         
             
                  end
         
     | 
| 
       63 
63 
     | 
    
         
             
                end
         
     | 
| 
       64 
64 
     | 
    
         
             
              end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
              module TestMethods
         
     | 
| 
      
 67 
     | 
    
         
            +
                def representer_for(modules=[Representable::Hash], &block)
         
     | 
| 
      
 68 
     | 
    
         
            +
                  Module.new do
         
     | 
| 
      
 69 
     | 
    
         
            +
                    extend TestMethods
         
     | 
| 
      
 70 
     | 
    
         
            +
                    include *modules
         
     | 
| 
      
 71 
     | 
    
         
            +
                    module_exec(&block)
         
     | 
| 
      
 72 
     | 
    
         
            +
                  end
         
     | 
| 
      
 73 
     | 
    
         
            +
                end
         
     | 
| 
      
 74 
     | 
    
         
            +
              end
         
     | 
| 
      
 75 
     | 
    
         
            +
              include TestMethods
         
     | 
| 
       65 
76 
     | 
    
         
             
            end
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: representable
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.3.2
         
     | 
| 
       5 
5 
     | 
    
         
             
              prerelease: 
         
     | 
| 
       6 
6 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       7 
7 
     | 
    
         
             
            authors:
         
     | 
| 
         @@ -9,7 +9,7 @@ authors: 
     | 
|
| 
       9 
9 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       10 
10 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       11 
11 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       12 
     | 
    
         
            -
            date: 2013- 
     | 
| 
      
 12 
     | 
    
         
            +
            date: 2013-02-12 00:00:00.000000000 Z
         
     | 
| 
       13 
13 
     | 
    
         
             
            dependencies:
         
     | 
| 
       14 
14 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       15 
15 
     | 
    
         
             
              name: nokogiri
         
     |