representable 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.textile +4 -0
- data/LICENSE +20 -0
- data/README.md +10 -1
- data/lib/representable/binding.rb +6 -5
- data/lib/representable/decorator.rb +3 -1
- data/lib/representable/version.rb +1 -1
- data/test/representable_test.rb +39 -0
- metadata +4 -3
data/CHANGES.textile
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
h2. 1.4.1
|
2
|
+
|
3
|
+
* Added `:representer_exec` to have lambdas be executed in decorator instance context.
|
4
|
+
|
1
5
|
h2. 1.4.0
|
2
6
|
|
3
7
|
* We now have two strategies for representing: the old extend approach and the brand-new decorator which leaves represented objects untouched. See "README":https://github.com/apotonick/representable#decorator-vs-extend for details.
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 - 2013 Nick Sutterer and the roar contributors
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -558,10 +558,17 @@ Use the `:type` option to specify the conversion target. Note that `:default` st
|
|
558
558
|
|
559
559
|
(Please don't read this section!)
|
560
560
|
|
561
|
-
If you need a special binding for a property you're free to create it using the `:binding` option.
|
561
|
+
* If you need a special binding for a property you're free to create it using the `:binding` option.
|
562
562
|
|
563
563
|
property :title, :binding => lambda { |*args| JSON::TitleBinding.new(*args) }
|
564
564
|
|
565
|
+
* Lambdas are usually executed in the represented object's context. If your writing a `Decorator` representer and you need to execute lambdas in its context use the `:representer_exec` option.
|
566
|
+
|
567
|
+
class SongRepresenter < Representable::Decorator
|
568
|
+
property :title, :representer_exec => true, :getter => lambda {..}
|
569
|
+
end
|
570
|
+
|
571
|
+
You can still access the represented object in the lambda using `represented`. In a module representer this option is ignored.
|
565
572
|
|
566
573
|
## Copyright
|
567
574
|
|
@@ -569,3 +576,5 @@ Representable started as a heavily simplified fork of the ROXML gem. Big thanks
|
|
569
576
|
|
570
577
|
* Copyright (c) 2011-2013 Nick Sutterer <apotonick@gmail.com>
|
571
578
|
* ROXML is Copyright (c) 2004-2009 Ben Woosley, Zak Mandhro and Anders Engstrom.
|
579
|
+
|
580
|
+
Representable is released under the [MIT License](http://www.opensource.org/licenses/MIT).
|
@@ -16,13 +16,14 @@ module Representable
|
|
16
16
|
raise "Binding#definition is no longer supported as all Definition methods are now delegated automatically."
|
17
17
|
end
|
18
18
|
|
19
|
-
def initialize(definition, represented, user_options={}) # TODO: remove default arg.
|
19
|
+
def initialize(definition, represented, user_options={}, lambda_context=represented) # TODO: remove default arg for user options. # DISCUSS: make lambda_context an options hash?
|
20
20
|
super(definition)
|
21
|
-
@represented
|
22
|
-
@user_options
|
21
|
+
@represented = represented
|
22
|
+
@user_options = user_options
|
23
|
+
@lambda_context = lambda_context
|
23
24
|
end
|
24
25
|
|
25
|
-
attr_reader :user_options, :represented # TODO: make private/remove.
|
26
|
+
attr_reader :user_options, :represented, :lambda_context # TODO: make private/remove.
|
26
27
|
|
27
28
|
# Main entry point for rendering/parsing a property object.
|
28
29
|
def serialize(value)
|
@@ -89,7 +90,7 @@ module Representable
|
|
89
90
|
# Execute the block for +option_name+ on the represented object.
|
90
91
|
def represented_exec_for(option_name, *args)
|
91
92
|
return unless options[option_name]
|
92
|
-
|
93
|
+
lambda_context.instance_exec(*args+[user_options], &options[option_name])
|
93
94
|
end
|
94
95
|
|
95
96
|
|
@@ -13,7 +13,9 @@ module Representable
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def representable_binding_for(attr, format, options)
|
16
|
-
|
16
|
+
context = attr.options[:representer_exec] ? self : represented # DISCUSS: should Decorator know this kinda stuff?
|
17
|
+
|
18
|
+
format.build(attr, represented, options, context)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
data/test/representable_test.rb
CHANGED
@@ -674,6 +674,45 @@ class RepresentableTest < MiniTest::Spec
|
|
674
674
|
end
|
675
675
|
end
|
676
676
|
|
677
|
+
describe ":representer_exec" do
|
678
|
+
representer! do
|
679
|
+
property :title, :getter => lambda { |*| title_from_representer }, :representer_exec => true
|
680
|
+
end
|
681
|
+
|
682
|
+
it "executes lambdas in represented context" do
|
683
|
+
Class.new do
|
684
|
+
def title_from_representer
|
685
|
+
"Sounds Of Silence"
|
686
|
+
end
|
687
|
+
end.new.extend(representer).to_hash.must_equal({"title"=>"Sounds Of Silence"})
|
688
|
+
end
|
689
|
+
|
690
|
+
describe "with decorator" do
|
691
|
+
|
692
|
+
it "executes lambdas in representer context" do
|
693
|
+
rpr = representer
|
694
|
+
Class.new(Representable::Decorator) do
|
695
|
+
include rpr
|
696
|
+
|
697
|
+
def title_from_representer
|
698
|
+
"Sounds Of Silence"
|
699
|
+
end
|
700
|
+
end.new(Object.new).to_hash().must_equal({"title"=>"Sounds Of Silence"})
|
701
|
+
end
|
702
|
+
|
703
|
+
it "still allows accessing the represented object" do
|
704
|
+
Class.new(Representable::Decorator) do
|
705
|
+
include Representable::Hash
|
706
|
+
property :title, :getter => lambda { |*| represented.title }, :representer_exec => true
|
707
|
+
|
708
|
+
def title
|
709
|
+
"Sounds Of Silence"
|
710
|
+
end
|
711
|
+
end.new(OpenStruct.new(:title => "Secret")).to_hash.must_equal({"title"=>"Secret"})
|
712
|
+
end
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
677
716
|
describe "decorator" do
|
678
717
|
# TODO: Move to global place since it's used twice.
|
679
718
|
class SongRepresentation < Representable::Decorator
|
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.4.
|
4
|
+
version: 1.4.1
|
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-04-
|
12
|
+
date: 2013-04-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
@@ -167,6 +167,7 @@ files:
|
|
167
167
|
- .travis.yml
|
168
168
|
- CHANGES.textile
|
169
169
|
- Gemfile
|
170
|
+
- LICENSE
|
170
171
|
- README.md
|
171
172
|
- Rakefile
|
172
173
|
- TODO
|
@@ -225,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
226
|
version: '0'
|
226
227
|
requirements: []
|
227
228
|
rubyforge_project:
|
228
|
-
rubygems_version: 1.8.
|
229
|
+
rubygems_version: 1.8.25
|
229
230
|
signing_key:
|
230
231
|
specification_version: 3
|
231
232
|
summary: Maps representation documents from and to Ruby objects. Includes XML and
|