representable 2.1.3 → 2.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 00d2530b55af3101dbb2526089519f0bdb549b83
4
- data.tar.gz: ed33d0ffceab14486efa0a0e61edc84e3de03de7
3
+ metadata.gz: 19f89d36352fe54ab21a3759d6c85392950dc564
4
+ data.tar.gz: c3e581d0e9fb29d0a47f608a8b9b960b48f83fe4
5
5
  SHA512:
6
- metadata.gz: 4fb790c37b9c9bd1abe2f6caeff855031b5a263c44f58e8b43f37f1ada791a2e1a87efdf6dabd26a95c1e184e3d88a5049296c0459b0b95c1ac42bdd96937e72
7
- data.tar.gz: 597b5614752170094138b69d7c02ef70deb5a23c300d35e22bfa3f9232b5d8572ac53dd84dd1e7500f35940f3263cd96687a981878e046f3b29a94fba3cef22a
6
+ metadata.gz: a4cdc220373cb17d0f9934ddc8224925938c274a9489f8da931bcdac9c9782ecde3f1b5204bf7b9b7643b28105b52ba80b786e150d480a8893549e264f3612ce
7
+ data.tar.gz: 545f594e8786f27d2fca07dcd41241b9b754aacc9298fc02f24f8ff8916381046e24d03bb6907062a323448bc85c4403713e43aa04aaf2bd0f8032cfe519dd74
data/CHANGES.md CHANGED
@@ -1,3 +1,8 @@
1
+ # 2.1.4
2
+
3
+ * Allow lonely collection representers without configuration, with inline representer, only. This is for render-only collection representers and very handy.
4
+ * Now runs with MagLev.
5
+
1
6
  # 2.1.3
2
7
 
3
8
  * Like 2.1.2 (got yanked) because I thought it's buggy but it's not. What has changed is that `Serializer::Collection#serialize` no longer does `collection.collect` but `collection.each` since this allows filtering out unwanted elements.
data/README.md CHANGED
@@ -1119,7 +1119,7 @@ module SongRepresenter
1119
1119
  include Representable::JSON
1120
1120
 
1121
1121
  property :title
1122
- property :track, if: lambda { track > 0 }
1122
+ property :track, if: lambda { |args| track > 0 }
1123
1123
  end
1124
1124
  ```
1125
1125
 
@@ -12,7 +12,7 @@ module Representable::Hash
12
12
 
13
13
 
14
14
  module ClassMethods
15
- def items(options, &block)
15
+ def items(options={}, &block)
16
16
  collection(:_self, options.merge(:getter => lambda { |*| self }), &block)
17
17
  end
18
18
  end
@@ -0,0 +1,25 @@
1
+ require 'representable'
2
+ require 'representable/object/binding'
3
+
4
+ module Representable
5
+ module Object
6
+ def self.included(base)
7
+ base.class_eval do
8
+ include Representable
9
+ extend ClassMethods
10
+ register_feature Representable::Object
11
+ end
12
+ end
13
+
14
+
15
+ module ClassMethods
16
+ def collection_representer_class
17
+ Collection
18
+ end
19
+ end
20
+
21
+ def from_object(data, options={}, binding_builder=Binding)
22
+ update_properties_from(data, options, binding_builder)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,22 @@
1
+ module Representable
2
+ module Object
3
+ class Binding < Representable::Binding
4
+ def self.build_for(definition, *args) # TODO: remove default arg.
5
+ return Collection.new(definition, *args) if definition.array?
6
+ new(definition, *args)
7
+ end
8
+
9
+ def read(hash)
10
+ hash.send(as) # :getter? no, that's for parsing!
11
+ end
12
+
13
+ def deserialize_method
14
+ :from_object
15
+ end
16
+
17
+ class Collection < self
18
+ include Representable::Binding::Collection
19
+ end
20
+ end
21
+ end
22
+ end
@@ -50,7 +50,7 @@ module Representable
50
50
  args = args.last # TODO: don't pass i as separate block parameter but in Options.
51
51
  object_class = args.binding[:class].evaluate(self, fragment, args)
52
52
 
53
- object_class.find_by(id: fragment["id"]) or object_class.new
53
+ object_class.find_by({id: fragment["id"]}) or object_class.new
54
54
  }
55
55
  end
56
56
  end
@@ -1,3 +1,3 @@
1
1
  module Representable
2
- VERSION = "2.1.3"
2
+ VERSION = "2.1.4"
3
3
  end
@@ -3,10 +3,12 @@ module Representable::XML
3
3
  include Representable::XML
4
4
 
5
5
  def self.included(base)
6
+ base.send :include, Representable::XML
6
7
  base.send :include, Representable::Hash::Collection
7
8
  base.send :include, Methods
8
9
  end
9
10
 
11
+
10
12
  module Methods
11
13
  def update_properties_from(doc, *args)
12
14
  super(doc.search("./*"), *args) # pass the list of collection items to Hash::Collection#update_properties_from.
@@ -1,3 +1,4 @@
1
+ require 'representable/hash'
1
2
  require 'representable/yaml/binding'
2
3
 
3
4
  module Representable
@@ -3,6 +3,33 @@ require 'test_helper'
3
3
  require 'representable/json/hash'
4
4
 
5
5
  class LonelyRepresenterTest < MiniTest::Spec
6
+
7
+ # test ::items without arguments, render-only.
8
+ for_formats(
9
+ :hash => [Representable::Hash::Collection, [{"name"=>"Resist Stance"}, {"name"=>"Suffer"}]],
10
+ :json => [Representable::JSON::Collection, "[{\"name\":\"Resist Stance\"},{\"name\":\"Suffer\"}]"],
11
+ :xml => [Representable::XML::Collection, "<array><song><name>Resist Stance</name></song><song><name>Suffer</name></song></array>"],
12
+ ) do |format, mod, output, input|
13
+
14
+ describe "[#{format}] lonely collection, render-only" do # TODO: introduce :representable option?
15
+ let (:format) { format }
16
+
17
+ representer!(module: mod) do
18
+ items do
19
+ property :name
20
+ end
21
+ end
22
+
23
+ let (:album) { [Song.new("Resist Stance"), Song.new("Suffer")].extend(representer) }
24
+
25
+ it "calls #to_hash on song instances, nothing else" do
26
+ render(album).must_equal_document(output)
27
+ end
28
+ end
29
+ end
30
+
31
+
32
+
6
33
  module SongRepresenter
7
34
  include Representable::JSON
8
35
 
@@ -0,0 +1,31 @@
1
+ require "test_helper"
2
+ require "representable/object"
3
+
4
+ class ObjectTest < MiniTest::Spec
5
+ Song = Struct.new(:title, :album)
6
+ Album = Struct.new(:name, :songs)
7
+
8
+ representer!(module: Representable::Object) do
9
+ property :title
10
+
11
+ property :album, instance: lambda { |fragment, *| fragment } do
12
+ property :name
13
+
14
+ collection :songs, instance: lambda { |fragment, *|fragment } do
15
+ property :title
16
+ end
17
+ end
18
+ # TODO: collection
19
+ end
20
+
21
+ let (:source) { Song.new("The King Is Dead", Album.new("Ruiner", [Song.new("In Vino Veritas II")])) }
22
+ let (:target) { Song.new }
23
+
24
+ it do
25
+ representer.prepare(target).from_object(source)
26
+
27
+ target.title.must_equal "The King Is Dead"
28
+ target.album.name.must_equal "Ruiner"
29
+ target.album.songs[0].title.must_equal "In Vino Veritas II"
30
+ end
31
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: representable
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.3
4
+ version: 2.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-28 00:00:00.000000000 Z
11
+ date: 2015-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
@@ -189,6 +189,8 @@ files:
189
189
  - lib/representable/json/collection.rb
190
190
  - lib/representable/json/hash.rb
191
191
  - lib/representable/mapper.rb
192
+ - lib/representable/object.rb
193
+ - lib/representable/object/binding.rb
192
194
  - lib/representable/parse_strategies.rb
193
195
  - lib/representable/pipeline.rb
194
196
  - lib/representable/populator.rb
@@ -231,6 +233,7 @@ files:
231
233
  - test/lonely_test.rb
232
234
  - test/mongoid_test.rb
233
235
  - test/nested_test.rb
236
+ - test/object_test.rb
234
237
  - test/parse_strategy_test.rb
235
238
  - test/pass_options_test.rb
236
239
  - test/prepare_test.rb
@@ -302,6 +305,7 @@ test_files:
302
305
  - test/lonely_test.rb
303
306
  - test/mongoid_test.rb
304
307
  - test/nested_test.rb
308
+ - test/object_test.rb
305
309
  - test/parse_strategy_test.rb
306
310
  - test/pass_options_test.rb
307
311
  - test/prepare_test.rb