representable 0.10.1 → 0.10.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 +6 -0
- data/README.rdoc +16 -0
- data/lib/representable.rb +21 -10
- data/lib/representable/version.rb +1 -1
- data/representable.gemspec +2 -3
- data/test/representable_test.rb +58 -7
- data/test/xml_test.rb +5 -1
- metadata +16 -27
data/CHANGES.textile
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
h2. 0.10.2
|
2
|
+
|
3
|
+
* Added `representable_property :accessors => false` option to suppress adding accessors.
|
4
|
+
* @Representable.representation_wrap@ is no longer inherited.
|
5
|
+
* Representers can now be defined in modules. They inherit to including modules.
|
6
|
+
|
1
7
|
h2. 0.10.1
|
2
8
|
|
3
9
|
* The block in @to_*@ and @from_*@ now yields the symbolized property name. If you need the binding/definition you gotta get it yourself.
|
data/README.rdoc
CHANGED
@@ -37,6 +37,22 @@ Since you keep forgetting the heroes of your childhood you decide to implement a
|
|
37
37
|
|
38
38
|
This declares two simple properties. Representable will automatically add accessors to the class.
|
39
39
|
|
40
|
+
If you don't want declarations in your models, use a module.
|
41
|
+
|
42
|
+
module HeroRepresentation
|
43
|
+
include Representable
|
44
|
+
|
45
|
+
representable_property :forename
|
46
|
+
representable_property :surename
|
47
|
+
end
|
48
|
+
|
49
|
+
This module needs a host class to be used with.
|
50
|
+
|
51
|
+
class Hero
|
52
|
+
include Representable::JSON
|
53
|
+
include HeroRepresentation
|
54
|
+
end
|
55
|
+
|
40
56
|
== Rendering
|
41
57
|
|
42
58
|
Now let's create and render our first hero.
|
data/lib/representable.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require 'hooks/inheritable_attribute'
|
2
1
|
require 'representable/definition'
|
3
2
|
|
4
3
|
module Representable
|
@@ -7,11 +6,9 @@ module Representable
|
|
7
6
|
extend ClassMethods::Declarations
|
8
7
|
extend ClassMethods::Accessors
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
inheritable_attr :representable_wrap
|
9
|
+
def self.included(base)
|
10
|
+
base.representable_attrs.push(*representable_attrs) # "inherit".
|
11
|
+
end
|
15
12
|
end
|
16
13
|
end
|
17
14
|
|
@@ -64,10 +61,12 @@ private
|
|
64
61
|
# representable_property :name
|
65
62
|
# representable_property :name, :from => :title
|
66
63
|
# representable_property :name, :as => Name
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
64
|
+
# representable_property :name, :accessors => false
|
65
|
+
def representable_property(name, options={})
|
66
|
+
attr = add_representable_property(name, options)
|
67
|
+
|
68
|
+
attr_reader(attr.getter) unless options[:accessors] == false
|
69
|
+
attr_writer(attr.getter) unless options[:accessors] == false
|
71
70
|
end
|
72
71
|
|
73
72
|
# Declares a represented document node collection.
|
@@ -91,6 +90,18 @@ private
|
|
91
90
|
end
|
92
91
|
|
93
92
|
module Accessors
|
93
|
+
def representable_attrs
|
94
|
+
@representable_attrs ||= []
|
95
|
+
end
|
96
|
+
|
97
|
+
def representable_wrap
|
98
|
+
@representable_wrap ||= false
|
99
|
+
end
|
100
|
+
|
101
|
+
def representable_wrap=(name)
|
102
|
+
@representable_wrap = name
|
103
|
+
end
|
104
|
+
|
94
105
|
def representation_wrap=(name)
|
95
106
|
self.representable_wrap = name
|
96
107
|
end
|
data/representable.gemspec
CHANGED
@@ -11,15 +11,14 @@ Gem::Specification.new do |s|
|
|
11
11
|
s.authors = ["Nick Sutterer"]
|
12
12
|
s.email = ["apotonick@gmail.com"]
|
13
13
|
s.homepage = "http://representable.apotomo.de"
|
14
|
-
s.summary = %q{Maps representation documents from and to Ruby objects. Includes XML and JSON support, plain properties and compositions.}
|
15
|
-
s.description = %q{Maps representation documents from and to Ruby objects. Includes XML and JSON support, plain properties and compositions.}
|
14
|
+
s.summary = %q{Maps representation documents from and to Ruby objects. Includes XML and JSON support, plain properties, collections and compositions.}
|
15
|
+
s.description = %q{Maps representation documents from and to Ruby objects. Includes XML and JSON support, plain properties, collections and compositions.}
|
16
16
|
|
17
17
|
s.files = `git ls-files`.split("\n")
|
18
18
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
19
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
20
|
s.require_paths = ["lib"]
|
21
21
|
|
22
|
-
s.add_dependency "hooks"
|
23
22
|
s.add_dependency "nokogiri"
|
24
23
|
s.add_dependency "json"
|
25
24
|
|
data/test/representable_test.rb
CHANGED
@@ -10,6 +10,19 @@ class RepresentableTest < MiniTest::Spec
|
|
10
10
|
representable_property :street_cred
|
11
11
|
end
|
12
12
|
|
13
|
+
module BandRepresentation
|
14
|
+
include Representable
|
15
|
+
|
16
|
+
representable_property :name
|
17
|
+
end
|
18
|
+
|
19
|
+
module PunkBandRepresentation
|
20
|
+
include Representable
|
21
|
+
include BandRepresentation
|
22
|
+
|
23
|
+
representable_property :street_cred
|
24
|
+
end
|
25
|
+
|
13
26
|
|
14
27
|
describe "#representable_attrs" do
|
15
28
|
it "responds to #representable_attrs" do
|
@@ -17,10 +30,40 @@ class RepresentableTest < MiniTest::Spec
|
|
17
30
|
assert_equal "name", Band.representable_attrs.first.name
|
18
31
|
end
|
19
32
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
33
|
+
describe "in module" do
|
34
|
+
it "returns definitions" do
|
35
|
+
assert_equal 1, BandRepresentation.representable_attrs.size
|
36
|
+
assert_equal "name", BandRepresentation.representable_attrs.first.name
|
37
|
+
end
|
38
|
+
|
39
|
+
it "inherits to including modules" do
|
40
|
+
assert_equal 2, PunkBandRepresentation.representable_attrs.size
|
41
|
+
assert_equal "name", PunkBandRepresentation.representable_attrs.first.name
|
42
|
+
assert_equal "street_cred", PunkBandRepresentation.representable_attrs.last.name
|
43
|
+
end
|
44
|
+
|
45
|
+
it "inherits to including class" do
|
46
|
+
band = Class.new do
|
47
|
+
include Representable
|
48
|
+
include PunkBandRepresentation
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_equal 2, band.representable_attrs.size
|
52
|
+
assert_equal "name", band.representable_attrs.first.name
|
53
|
+
assert_equal "street_cred", band.representable_attrs.last.name
|
54
|
+
end
|
55
|
+
|
56
|
+
it "allows including the concrete representer module later" do
|
57
|
+
require 'representable/json'
|
58
|
+
vd = class VD
|
59
|
+
include Representable::JSON
|
60
|
+
include PunkBandRepresentation
|
61
|
+
end.new
|
62
|
+
vd.name = "Vention Dention"
|
63
|
+
vd.street_cred = 1
|
64
|
+
assert_equal "{\"name\":\"Vention Dention\",\"street_cred\":1}", vd.to_json
|
65
|
+
end
|
66
|
+
|
24
67
|
end
|
25
68
|
end
|
26
69
|
|
@@ -44,6 +87,15 @@ class RepresentableTest < MiniTest::Spec
|
|
44
87
|
assert_equal "friends", band.representable_attrs.last.from
|
45
88
|
end
|
46
89
|
end
|
90
|
+
|
91
|
+
describe ":accessor" do
|
92
|
+
it "doesn't add methods when false" do
|
93
|
+
klass = Class.new(Band) { representable_property :friends, :accessors => false }
|
94
|
+
band = klass.new
|
95
|
+
assert ! band.respond_to?(:friends)
|
96
|
+
assert ! band.respond_to?("friends=")
|
97
|
+
end
|
98
|
+
end
|
47
99
|
end
|
48
100
|
|
49
101
|
describe "#representable_collection" do
|
@@ -74,7 +126,6 @@ class RepresentableTest < MiniTest::Spec
|
|
74
126
|
assert_equal nil, SoundSystem.representation_wrap
|
75
127
|
end
|
76
128
|
|
77
|
-
|
78
129
|
it "infers a printable class name if set to true" do
|
79
130
|
HardcoreBand.representation_wrap = true
|
80
131
|
assert_equal "hardcore_band", HardcoreBand.send(:representation_wrap)
|
@@ -85,9 +136,9 @@ class RepresentableTest < MiniTest::Spec
|
|
85
136
|
assert_equal "breach", HardcoreBand.representation_wrap
|
86
137
|
end
|
87
138
|
|
88
|
-
it "
|
139
|
+
it "doesn't inherit correctly" do
|
89
140
|
HardcoreBand.representation_wrap = "breach"
|
90
|
-
assert_equal
|
141
|
+
assert_equal nil, SoftcoreBand.representation_wrap
|
91
142
|
end
|
92
143
|
end
|
93
144
|
|
data/test/xml_test.rb
CHANGED
@@ -125,7 +125,11 @@ class XmlTest < MiniTest::Spec
|
|
125
125
|
end
|
126
126
|
|
127
127
|
it "respects #representation_wrap=" do
|
128
|
-
klass = Class.new(Band)
|
128
|
+
klass = Class.new(Band) do
|
129
|
+
include Representable
|
130
|
+
representable_property :name
|
131
|
+
end
|
132
|
+
|
129
133
|
klass.representation_wrap = :group
|
130
134
|
assert_xml_equal "<group><name>Rise Against</name></group>", klass.new("Rise Against").to_node.to_s
|
131
135
|
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: 0.10.
|
4
|
+
version: 0.10.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-12-
|
12
|
+
date: 2011-12-03 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: hooks
|
16
|
-
requirement: &72137670 !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *72137670
|
25
14
|
- !ruby/object:Gem::Dependency
|
26
15
|
name: nokogiri
|
27
|
-
requirement: &
|
16
|
+
requirement: &75503660 !ruby/object:Gem::Requirement
|
28
17
|
none: false
|
29
18
|
requirements:
|
30
19
|
- - ! '>='
|
@@ -32,10 +21,10 @@ dependencies:
|
|
32
21
|
version: '0'
|
33
22
|
type: :runtime
|
34
23
|
prerelease: false
|
35
|
-
version_requirements: *
|
24
|
+
version_requirements: *75503660
|
36
25
|
- !ruby/object:Gem::Dependency
|
37
26
|
name: json
|
38
|
-
requirement: &
|
27
|
+
requirement: &75503430 !ruby/object:Gem::Requirement
|
39
28
|
none: false
|
40
29
|
requirements:
|
41
30
|
- - ! '>='
|
@@ -43,10 +32,10 @@ dependencies:
|
|
43
32
|
version: '0'
|
44
33
|
type: :runtime
|
45
34
|
prerelease: false
|
46
|
-
version_requirements: *
|
35
|
+
version_requirements: *75503430
|
47
36
|
- !ruby/object:Gem::Dependency
|
48
37
|
name: rake
|
49
|
-
requirement: &
|
38
|
+
requirement: &75503180 !ruby/object:Gem::Requirement
|
50
39
|
none: false
|
51
40
|
requirements:
|
52
41
|
- - ! '>='
|
@@ -54,10 +43,10 @@ dependencies:
|
|
54
43
|
version: '0'
|
55
44
|
type: :development
|
56
45
|
prerelease: false
|
57
|
-
version_requirements: *
|
46
|
+
version_requirements: *75503180
|
58
47
|
- !ruby/object:Gem::Dependency
|
59
48
|
name: test_xml
|
60
|
-
requirement: &
|
49
|
+
requirement: &75502870 !ruby/object:Gem::Requirement
|
61
50
|
none: false
|
62
51
|
requirements:
|
63
52
|
- - ! '>='
|
@@ -65,10 +54,10 @@ dependencies:
|
|
65
54
|
version: '0'
|
66
55
|
type: :development
|
67
56
|
prerelease: false
|
68
|
-
version_requirements: *
|
57
|
+
version_requirements: *75502870
|
69
58
|
- !ruby/object:Gem::Dependency
|
70
59
|
name: minitest
|
71
|
-
requirement: &
|
60
|
+
requirement: &75502410 !ruby/object:Gem::Requirement
|
72
61
|
none: false
|
73
62
|
requirements:
|
74
63
|
- - ~>
|
@@ -76,10 +65,10 @@ dependencies:
|
|
76
65
|
version: '2.8'
|
77
66
|
type: :development
|
78
67
|
prerelease: false
|
79
|
-
version_requirements: *
|
68
|
+
version_requirements: *75502410
|
80
69
|
- !ruby/object:Gem::Dependency
|
81
70
|
name: mocha
|
82
|
-
requirement: &
|
71
|
+
requirement: &75501950 !ruby/object:Gem::Requirement
|
83
72
|
none: false
|
84
73
|
requirements:
|
85
74
|
- - ! '>='
|
@@ -87,9 +76,9 @@ dependencies:
|
|
87
76
|
version: '0'
|
88
77
|
type: :development
|
89
78
|
prerelease: false
|
90
|
-
version_requirements: *
|
79
|
+
version_requirements: *75501950
|
91
80
|
description: Maps representation documents from and to Ruby objects. Includes XML
|
92
|
-
and JSON support, plain properties and compositions.
|
81
|
+
and JSON support, plain properties, collections and compositions.
|
93
82
|
email:
|
94
83
|
- apotonick@gmail.com
|
95
84
|
executables: []
|
@@ -143,5 +132,5 @@ rubygems_version: 1.8.10
|
|
143
132
|
signing_key:
|
144
133
|
specification_version: 3
|
145
134
|
summary: Maps representation documents from and to Ruby objects. Includes XML and
|
146
|
-
JSON support, plain properties and compositions.
|
135
|
+
JSON support, plain properties, collections and compositions.
|
147
136
|
test_files: []
|