abstract_mapper 0.0.2 → 0.1.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/.travis.yml +0 -4
- data/CHANGELOG.md +26 -0
- data/README.md +5 -5
- data/Rakefile +1 -1
- data/abstract_mapper.gemspec +1 -0
- data/lib/abstract_mapper.rb +4 -15
- data/lib/abstract_mapper/ast.rb +16 -0
- data/lib/abstract_mapper/ast/branch.rb +121 -0
- data/lib/abstract_mapper/ast/node.rb +91 -0
- data/lib/abstract_mapper/builder.rb +2 -2
- data/lib/abstract_mapper/commands.rb +4 -2
- data/lib/abstract_mapper/commands/base.rb +69 -0
- data/lib/abstract_mapper/dsl.rb +2 -2
- data/lib/abstract_mapper/errors.rb +17 -0
- data/lib/abstract_mapper/errors/wrong_node.rb +1 -1
- data/lib/abstract_mapper/errors/wrong_rule.rb +1 -1
- data/lib/abstract_mapper/optimizer.rb +1 -1
- data/lib/abstract_mapper/rules.rb +10 -5
- data/lib/abstract_mapper/rules/base.rb +74 -0
- data/lib/abstract_mapper/rules/pair.rb +68 -0
- data/lib/abstract_mapper/rules/sole.rb +60 -0
- data/lib/abstract_mapper/settings.rb +22 -30
- data/lib/abstract_mapper/version.rb +1 -1
- data/lib/rspec/nodes.rb +2 -2
- data/spec/integration/faceter.rb +4 -4
- data/spec/integration/rspec_examples_spec.rb +0 -6
- data/spec/unit/abstract_mapper/{branch_spec.rb → ast/branch_spec.rb} +28 -61
- data/spec/unit/abstract_mapper/{node_spec.rb → ast/node_spec.rb} +16 -53
- data/spec/unit/abstract_mapper/builder_spec.rb +9 -24
- data/spec/unit/abstract_mapper/{command_spec.rb → commands/base_spec.rb} +10 -25
- data/spec/unit/abstract_mapper/commands_spec.rb +9 -14
- data/spec/unit/abstract_mapper/dsl_spec.rb +23 -15
- data/spec/unit/abstract_mapper/errors/unknown_command_spec.rb +1 -4
- data/spec/unit/abstract_mapper/errors/wrong_node_spec.rb +5 -4
- data/spec/unit/abstract_mapper/errors/wrong_rule_spec.rb +5 -5
- data/spec/unit/abstract_mapper/functions/compact_spec.rb +0 -2
- data/spec/unit/abstract_mapper/functions/filter_spec.rb +0 -2
- data/spec/unit/abstract_mapper/functions/identity_spec.rb +0 -2
- data/spec/unit/abstract_mapper/functions/restrict_spec.rb +0 -3
- data/spec/unit/abstract_mapper/functions/subclass_spec.rb +0 -2
- data/spec/unit/abstract_mapper/optimizer_spec.rb +13 -17
- data/spec/unit/abstract_mapper/{rule_spec.rb → rules/base_spec.rb} +17 -34
- data/spec/unit/abstract_mapper/{pair_rule_spec.rb → rules/pair_spec.rb} +8 -8
- data/spec/unit/abstract_mapper/{sole_rule_spec.rb → rules/sole_spec.rb} +5 -5
- data/spec/unit/abstract_mapper/rules_spec.rb +24 -37
- data/spec/unit/abstract_mapper/settings_spec.rb +38 -32
- data/spec/unit/abstract_mapper_spec.rb +9 -16
- metadata +37 -22
- data/lib/abstract_mapper/attributes.rb +0 -65
- data/lib/abstract_mapper/branch.rb +0 -120
- data/lib/abstract_mapper/command.rb +0 -68
- data/lib/abstract_mapper/node.rb +0 -87
- data/lib/abstract_mapper/pair_rule.rb +0 -64
- data/lib/abstract_mapper/rule.rb +0 -73
- data/lib/abstract_mapper/sole_rule.rb +0 -56
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abstract_mapper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kozin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: attributes_dsl
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: ice_nine
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,24 +106,25 @@ files:
|
|
92
106
|
- config/metrics/simplecov.yml
|
93
107
|
- config/metrics/yardstick.yml
|
94
108
|
- lib/abstract_mapper.rb
|
95
|
-
- lib/abstract_mapper/
|
96
|
-
- lib/abstract_mapper/branch.rb
|
109
|
+
- lib/abstract_mapper/ast.rb
|
110
|
+
- lib/abstract_mapper/ast/branch.rb
|
111
|
+
- lib/abstract_mapper/ast/node.rb
|
97
112
|
- lib/abstract_mapper/builder.rb
|
98
|
-
- lib/abstract_mapper/command.rb
|
99
113
|
- lib/abstract_mapper/commands.rb
|
114
|
+
- lib/abstract_mapper/commands/base.rb
|
100
115
|
- lib/abstract_mapper/dsl.rb
|
116
|
+
- lib/abstract_mapper/errors.rb
|
101
117
|
- lib/abstract_mapper/errors/unknown_command.rb
|
102
118
|
- lib/abstract_mapper/errors/wrong_node.rb
|
103
119
|
- lib/abstract_mapper/errors/wrong_rule.rb
|
104
120
|
- lib/abstract_mapper/functions.rb
|
105
|
-
- lib/abstract_mapper/node.rb
|
106
121
|
- lib/abstract_mapper/optimizer.rb
|
107
|
-
- lib/abstract_mapper/pair_rule.rb
|
108
122
|
- lib/abstract_mapper/rspec.rb
|
109
|
-
- lib/abstract_mapper/rule.rb
|
110
123
|
- lib/abstract_mapper/rules.rb
|
124
|
+
- lib/abstract_mapper/rules/base.rb
|
125
|
+
- lib/abstract_mapper/rules/pair.rb
|
126
|
+
- lib/abstract_mapper/rules/sole.rb
|
111
127
|
- lib/abstract_mapper/settings.rb
|
112
|
-
- lib/abstract_mapper/sole_rule.rb
|
113
128
|
- lib/abstract_mapper/version.rb
|
114
129
|
- lib/rspec/doubles.rb
|
115
130
|
- lib/rspec/nodes.rb
|
@@ -118,9 +133,10 @@ files:
|
|
118
133
|
- spec/integration/mapper_definition_spec.rb
|
119
134
|
- spec/integration/rspec_examples_spec.rb
|
120
135
|
- spec/spec_helper.rb
|
121
|
-
- spec/unit/abstract_mapper/branch_spec.rb
|
136
|
+
- spec/unit/abstract_mapper/ast/branch_spec.rb
|
137
|
+
- spec/unit/abstract_mapper/ast/node_spec.rb
|
122
138
|
- spec/unit/abstract_mapper/builder_spec.rb
|
123
|
-
- spec/unit/abstract_mapper/
|
139
|
+
- spec/unit/abstract_mapper/commands/base_spec.rb
|
124
140
|
- spec/unit/abstract_mapper/commands_spec.rb
|
125
141
|
- spec/unit/abstract_mapper/dsl_spec.rb
|
126
142
|
- spec/unit/abstract_mapper/errors/unknown_command_spec.rb
|
@@ -131,13 +147,12 @@ files:
|
|
131
147
|
- spec/unit/abstract_mapper/functions/identity_spec.rb
|
132
148
|
- spec/unit/abstract_mapper/functions/restrict_spec.rb
|
133
149
|
- spec/unit/abstract_mapper/functions/subclass_spec.rb
|
134
|
-
- spec/unit/abstract_mapper/node_spec.rb
|
135
150
|
- spec/unit/abstract_mapper/optimizer_spec.rb
|
136
|
-
- spec/unit/abstract_mapper/
|
137
|
-
- spec/unit/abstract_mapper/
|
151
|
+
- spec/unit/abstract_mapper/rules/base_spec.rb
|
152
|
+
- spec/unit/abstract_mapper/rules/pair_spec.rb
|
153
|
+
- spec/unit/abstract_mapper/rules/sole_spec.rb
|
138
154
|
- spec/unit/abstract_mapper/rules_spec.rb
|
139
155
|
- spec/unit/abstract_mapper/settings_spec.rb
|
140
|
-
- spec/unit/abstract_mapper/sole_rule_spec.rb
|
141
156
|
- spec/unit/abstract_mapper_spec.rb
|
142
157
|
homepage: https://github.com/nepalez/abstract_mapper
|
143
158
|
licenses:
|
@@ -159,7 +174,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
159
174
|
version: '0'
|
160
175
|
requirements: []
|
161
176
|
rubyforge_project:
|
162
|
-
rubygems_version: 2.4.
|
177
|
+
rubygems_version: 2.4.8
|
163
178
|
signing_key:
|
164
179
|
specification_version: 4
|
165
180
|
summary: AST for ruby mappers
|
@@ -169,9 +184,6 @@ test_files:
|
|
169
184
|
- spec/integration/faceter.rb
|
170
185
|
- spec/integration/rspec_examples_spec.rb
|
171
186
|
- spec/unit/abstract_mapper/dsl_spec.rb
|
172
|
-
- spec/unit/abstract_mapper/rule_spec.rb
|
173
|
-
- spec/unit/abstract_mapper/sole_rule_spec.rb
|
174
|
-
- spec/unit/abstract_mapper/pair_rule_spec.rb
|
175
187
|
- spec/unit/abstract_mapper/functions/compact_spec.rb
|
176
188
|
- spec/unit/abstract_mapper/functions/filter_spec.rb
|
177
189
|
- spec/unit/abstract_mapper/functions/restrict_spec.rb
|
@@ -182,11 +194,14 @@ test_files:
|
|
182
194
|
- spec/unit/abstract_mapper/errors/wrong_node_spec.rb
|
183
195
|
- spec/unit/abstract_mapper/errors/unknown_command_spec.rb
|
184
196
|
- spec/unit/abstract_mapper/errors/wrong_rule_spec.rb
|
197
|
+
- spec/unit/abstract_mapper/rules/pair_spec.rb
|
198
|
+
- spec/unit/abstract_mapper/rules/sole_spec.rb
|
199
|
+
- spec/unit/abstract_mapper/rules/base_spec.rb
|
185
200
|
- spec/unit/abstract_mapper/commands_spec.rb
|
186
|
-
- spec/unit/abstract_mapper/
|
201
|
+
- spec/unit/abstract_mapper/commands/base_spec.rb
|
187
202
|
- spec/unit/abstract_mapper/settings_spec.rb
|
188
|
-
- spec/unit/abstract_mapper/
|
203
|
+
- spec/unit/abstract_mapper/ast/node_spec.rb
|
204
|
+
- spec/unit/abstract_mapper/ast/branch_spec.rb
|
189
205
|
- spec/unit/abstract_mapper/optimizer_spec.rb
|
190
|
-
- spec/unit/abstract_mapper/command_spec.rb
|
191
206
|
- spec/unit/abstract_mapper_spec.rb
|
192
207
|
has_rdoc:
|
@@ -1,65 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
class AbstractMapper
|
4
|
-
|
5
|
-
# Defines attributes along with the DSL for setting them
|
6
|
-
#
|
7
|
-
module Attributes
|
8
|
-
|
9
|
-
# @private
|
10
|
-
def self.included(klass)
|
11
|
-
klass.__send__ :extend, DSL
|
12
|
-
end
|
13
|
-
|
14
|
-
# @!attribute [r] attributes
|
15
|
-
#
|
16
|
-
# @return [Hash] The initialized attributes
|
17
|
-
#
|
18
|
-
attr_reader :attributes
|
19
|
-
|
20
|
-
# Initializes the instance with the hash of attributes
|
21
|
-
#
|
22
|
-
# @param [Hash] attributes
|
23
|
-
#
|
24
|
-
def initialize(attributes)
|
25
|
-
@attributes = Functions[:restrict, self.class.attributes][attributes]
|
26
|
-
end
|
27
|
-
|
28
|
-
# Attributes DSL
|
29
|
-
#
|
30
|
-
module DSL
|
31
|
-
|
32
|
-
# Makes a attributes inheritable
|
33
|
-
#
|
34
|
-
# @private
|
35
|
-
#
|
36
|
-
def inherited(klass)
|
37
|
-
attributes.each { |key, value| klass.attribute key, default: value }
|
38
|
-
end
|
39
|
-
|
40
|
-
# Default attributes for the node
|
41
|
-
#
|
42
|
-
# @return [Hash]
|
43
|
-
#
|
44
|
-
def attributes
|
45
|
-
@attributes ||= {}
|
46
|
-
end
|
47
|
-
|
48
|
-
# Declares the attribute
|
49
|
-
#
|
50
|
-
# @param [#to_sym] name
|
51
|
-
# @param [Hash] options
|
52
|
-
# @option options [Object] :default
|
53
|
-
#
|
54
|
-
# @return [undefined]
|
55
|
-
#
|
56
|
-
def attribute(name, options = {})
|
57
|
-
attributes[name.to_sym] = options[:default]
|
58
|
-
define_method(name) { attributes[name.to_sym] }
|
59
|
-
end
|
60
|
-
|
61
|
-
end # module DSL
|
62
|
-
|
63
|
-
end # module Attributes
|
64
|
-
|
65
|
-
end # class AbstractMapper
|
@@ -1,120 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
class AbstractMapper
|
4
|
-
|
5
|
-
# A special type of the composed node, that describes transformation,
|
6
|
-
# applied to some level of nested input.
|
7
|
-
#
|
8
|
-
# Unlike the simple node, describing a transformation of data, the
|
9
|
-
# branch carries a collection of subnodes along with methods to [#update]
|
10
|
-
# itself with the same attributes and different subnodes.
|
11
|
-
#
|
12
|
-
# Tne branch only stores subnodes and composes transformations.
|
13
|
-
# Its has no access to DSL and knows neither how to build a tree
|
14
|
-
# (see [AbstractMapper::Builder]), nor how to optimize it later
|
15
|
-
# (see [AbstractMapper::Optimizer]).
|
16
|
-
#
|
17
|
-
# @api public
|
18
|
-
#
|
19
|
-
class Branch < Node
|
20
|
-
|
21
|
-
include Enumerable
|
22
|
-
|
23
|
-
# @!scope class
|
24
|
-
# @!method new(*attributes, &block)
|
25
|
-
# Creates a new branch
|
26
|
-
#
|
27
|
-
# @param [Object, Array<Object>] attributes
|
28
|
-
# The list of type-specific attributes of the branch
|
29
|
-
# @param [Proc] block
|
30
|
-
# The block that returns an array of subnodes for the branch
|
31
|
-
#
|
32
|
-
# @return [Branch::Node]
|
33
|
-
|
34
|
-
# @private
|
35
|
-
def initialize(attributes = {})
|
36
|
-
@subnodes = block_given? ? yield : []
|
37
|
-
super(attributes, &nil)
|
38
|
-
end
|
39
|
-
|
40
|
-
# Returns a new branch of the same type, with the same attributes,
|
41
|
-
# but with a different collection of subnodes, transmitted by the block.
|
42
|
-
#
|
43
|
-
# @example
|
44
|
-
# branch = Branch.new(:foo)
|
45
|
-
# # => <Branch(:foo) []>
|
46
|
-
# branch.update { Node.new(:bar) }
|
47
|
-
# # => <Branch(:foo) [<Node(:bar)>]>
|
48
|
-
#
|
49
|
-
# @param [Proc] block
|
50
|
-
# The block that should return an array of subnodes for the branch
|
51
|
-
#
|
52
|
-
# @return [AbstractMapper::Branch]
|
53
|
-
#
|
54
|
-
# @yield block
|
55
|
-
#
|
56
|
-
def update
|
57
|
-
self.class.new(attributes) { yield }
|
58
|
-
end
|
59
|
-
|
60
|
-
# @!method each
|
61
|
-
# Returns the enumerator for subnodes
|
62
|
-
#
|
63
|
-
# @return [Enumerator]
|
64
|
-
#
|
65
|
-
def each(&block)
|
66
|
-
@subnodes.each(&block)
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns a new branch with the other node added to its subnodes
|
70
|
-
#
|
71
|
-
# @param [AbstractMapper::Node] other
|
72
|
-
#
|
73
|
-
# @return [AbstractMapper::Branch]
|
74
|
-
#
|
75
|
-
def <<(other)
|
76
|
-
update { entries << other }
|
77
|
-
end
|
78
|
-
|
79
|
-
# The composition of transformations from all subnodes of the branch
|
80
|
-
#
|
81
|
-
# To be reloaded by the subclasses to apply the composition to
|
82
|
-
# a corresponding level of nested data.
|
83
|
-
#
|
84
|
-
# @return [Transproc::Function]
|
85
|
-
#
|
86
|
-
# @abstract
|
87
|
-
#
|
88
|
-
def transproc
|
89
|
-
map(&:transproc).inject(:>>)
|
90
|
-
end
|
91
|
-
|
92
|
-
# Adds subnodes to the default description of the branch
|
93
|
-
#
|
94
|
-
# @return [String]
|
95
|
-
#
|
96
|
-
def to_s
|
97
|
-
"#{super} [#{map(&:inspect).join(", ")}]"
|
98
|
-
end
|
99
|
-
|
100
|
-
# Checks equality of branches by type, attributes and subnodes
|
101
|
-
#
|
102
|
-
# @param [Other] other
|
103
|
-
#
|
104
|
-
# @return [Boolean]
|
105
|
-
#
|
106
|
-
def eql?(other)
|
107
|
-
super && entries.eql?(other.entries)
|
108
|
-
end
|
109
|
-
|
110
|
-
private
|
111
|
-
|
112
|
-
# Substitutes the name of the class by the special name "Root"
|
113
|
-
# to describe the root node of AST.
|
114
|
-
def __name__
|
115
|
-
instance_of?(Branch) ? "Root" : super
|
116
|
-
end
|
117
|
-
|
118
|
-
end # class Branch
|
119
|
-
|
120
|
-
end # class AbstractMapper
|
@@ -1,68 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
class AbstractMapper
|
4
|
-
|
5
|
-
# Describes the command of the mapper
|
6
|
-
#
|
7
|
-
# Every command has a name, a node that is added to the AST and the function,
|
8
|
-
# that converts command attributes into the node's.
|
9
|
-
#
|
10
|
-
# Method `#call` builds a correspodning node for the AST.
|
11
|
-
#
|
12
|
-
# @api private
|
13
|
-
#
|
14
|
-
class Command
|
15
|
-
|
16
|
-
# @!attribute [r] name
|
17
|
-
#
|
18
|
-
# @return [Symbol] The name of the DSL command
|
19
|
-
#
|
20
|
-
attr_reader :name
|
21
|
-
|
22
|
-
# @!attribute [r] klass
|
23
|
-
#
|
24
|
-
# @return [Class] The class of the node to be created
|
25
|
-
#
|
26
|
-
attr_reader :klass
|
27
|
-
|
28
|
-
# @!attribute [r] converter
|
29
|
-
#
|
30
|
-
# @return [#call] The converter of the command's arguments into the node's
|
31
|
-
#
|
32
|
-
attr_reader :converter
|
33
|
-
|
34
|
-
# @!scope class
|
35
|
-
# @!method new(name, klass, converter)
|
36
|
-
# Creates the named command for node klass and arguments converter
|
37
|
-
#
|
38
|
-
# @param [#to_sym] name The name of the DSL command
|
39
|
-
# @param [Class] klass The klass of the node to be created
|
40
|
-
# @param [#call] converter The function that coerces attributes
|
41
|
-
#
|
42
|
-
# @return [AbstractMapper::Command]
|
43
|
-
|
44
|
-
# @private
|
45
|
-
def initialize(name, klass, converter = nil)
|
46
|
-
@name = name.to_sym
|
47
|
-
@klass = klass
|
48
|
-
@branch = Functions[:subclass?, Branch][klass]
|
49
|
-
@converter = converter || proc { |args = {}| args }
|
50
|
-
IceNine.deep_freeze(self)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Builds the AST node
|
54
|
-
#
|
55
|
-
# @param [Object, Array] args
|
56
|
-
# The argument of the command that should be converted to node attributes
|
57
|
-
# @param [Proc] block
|
58
|
-
#
|
59
|
-
# @return [AbstractMapper::Node]
|
60
|
-
#
|
61
|
-
def call(*args, &block)
|
62
|
-
block = nil if @branch
|
63
|
-
klass.new(converter.call(*args), &block)
|
64
|
-
end
|
65
|
-
|
66
|
-
end # class Command
|
67
|
-
|
68
|
-
end # class AbstractMapper
|
data/lib/abstract_mapper/node.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
class AbstractMapper
|
4
|
-
|
5
|
-
# An immutable node of the abstract syntax tree (AST), that describes
|
6
|
-
# either some "end-up" transformation, or a level of nested input data.
|
7
|
-
#
|
8
|
-
# Every node is expected to accept attributes and (possibly) block, and
|
9
|
-
# implement `#transproc` that implements the `#call` method to
|
10
|
-
# transform input data to the output.
|
11
|
-
#
|
12
|
-
# Nodes describe only the structure of AST, they know
|
13
|
-
# neither how to build the tree with DSL (see [AbstractMapper::Builder]),
|
14
|
-
# nor how to optimize it later (see [AbstractMapper::Optimizer]).
|
15
|
-
#
|
16
|
-
# @api public
|
17
|
-
#
|
18
|
-
class Node
|
19
|
-
|
20
|
-
include Attributes # adds attributes and their DSL
|
21
|
-
include Comparable
|
22
|
-
|
23
|
-
# @!attribute [r] block
|
24
|
-
#
|
25
|
-
# @return [Proc] The block given to initializer
|
26
|
-
#
|
27
|
-
attr_reader :block
|
28
|
-
|
29
|
-
# @private
|
30
|
-
def initialize(_ = {}, &block)
|
31
|
-
super
|
32
|
-
@block = block
|
33
|
-
IceNine.deep_freeze(self)
|
34
|
-
end
|
35
|
-
|
36
|
-
# @!method transproc
|
37
|
-
# The transformation function for the branch
|
38
|
-
#
|
39
|
-
# @return [Transproc::Function]
|
40
|
-
#
|
41
|
-
# @abstract
|
42
|
-
#
|
43
|
-
def transproc
|
44
|
-
Functions[:identity]
|
45
|
-
end
|
46
|
-
|
47
|
-
# Returns a human-readable string representating the node
|
48
|
-
#
|
49
|
-
# @return [String]
|
50
|
-
#
|
51
|
-
def inspect
|
52
|
-
"<#{self}>"
|
53
|
-
end
|
54
|
-
|
55
|
-
# Converts the node into string with its name and attributes
|
56
|
-
#
|
57
|
-
# @return [String]
|
58
|
-
#
|
59
|
-
def to_s
|
60
|
-
"#{__name__}#{__attributes__}"
|
61
|
-
end
|
62
|
-
|
63
|
-
# Compares the node to another one by type and attributes
|
64
|
-
#
|
65
|
-
# @param [Object] other
|
66
|
-
#
|
67
|
-
# @return [Boolean]
|
68
|
-
#
|
69
|
-
def ==(other)
|
70
|
-
other.instance_of?(self.class) && attributes.eql?(other.attributes)
|
71
|
-
end
|
72
|
-
alias_method :eql?, :==
|
73
|
-
|
74
|
-
private
|
75
|
-
|
76
|
-
def __name__
|
77
|
-
self.class.name.split("::").last
|
78
|
-
end
|
79
|
-
|
80
|
-
def __attributes__
|
81
|
-
return if attributes.empty?
|
82
|
-
"(#{attributes.map { |k, v| "#{k}: #{v.inspect}" }.join(", ")})"
|
83
|
-
end
|
84
|
-
|
85
|
-
end # class Node
|
86
|
-
|
87
|
-
end # class AbstractMapper
|