pacer 1.0.2-java → 1.0.3-java
Sign up to get free protection for your applications and to get access to all the features.
- data/blog/2012-09-18-pacer-1.0.md +63 -0
- data/lib/pacer/core/graph/element_route.rb +8 -4
- data/lib/pacer/core/graph/vertices_route.rb +1 -1
- data/lib/pacer/core/route.rb +20 -0
- data/lib/pacer/exceptions.rb +1 -0
- data/lib/pacer/filter/future_filter.rb +2 -0
- data/lib/pacer/graph/graph_transactions_mixin.rb +13 -12
- data/lib/pacer/graph/hash_index.rb +29 -0
- data/lib/pacer/graph/pacer_graph.rb +23 -6
- data/lib/pacer/graph/simple_encoder.rb +9 -4
- data/lib/pacer/graph/yaml_encoder.rb +18 -31
- data/lib/pacer/loader.rb +93 -0
- data/lib/pacer/route/mixin/bulk_operations.rb +1 -1
- data/lib/pacer/route.rb +0 -151
- data/lib/pacer/route_builder.rb +142 -0
- data/lib/pacer/side_effect/as.rb +1 -3
- data/lib/pacer/version.rb +1 -1
- data/lib/pacer/wrappers/edge_wrapper.rb +13 -16
- data/lib/pacer/wrappers/element_wrapper.rb +12 -22
- data/lib/pacer/wrappers/vertex_wrapper.rb +7 -4
- data/lib/{pacer-1.0.2-standalone.jar → pacer-1.0.3-standalone.jar} +0 -0
- data/lib/pacer.rb +9 -15
- data/pom.xml +1 -1
- data/spec/pacer/blueprints/dex_spec.rb +1 -154
- data/spec/pacer/blueprints/neo4j_spec.rb +8 -154
- data/spec/pacer/blueprints/orient_spec.rb +5 -0
- data/spec/pacer/blueprints/tg_spec.rb +1 -76
- data/spec/pacer/core/graph/vertices_route_spec.rb +32 -5
- data/spec/pacer/graph/pacer_graph_spec.rb +304 -336
- data/spec/pacer/graph/simple_encoder_spec.rb +78 -0
- data/spec/pacer/graph/yaml_encoder_spec.rb +71 -0
- data/spec/pacer/transform/join_spec.rb +1 -1
- data/spec/pacer/utils/tsort_spec.rb +1 -3
- data/spec/pacer/wrapper/edge_wrapper_spec.rb +46 -40
- data/spec/pacer/wrapper/element_wrapper_spec.rb +8 -13
- data/spec/support/graph_runner.rb +12 -3
- metadata +13 -14
- data/lib/pacer/blueprints.rb +0 -3
- data/lib/pacer/core.rb +0 -8
- data/lib/pacer/filter.rb +0 -17
- data/lib/pacer/graph.rb +0 -12
- data/lib/pacer/route/mixins.rb +0 -2
- data/lib/pacer/routes.rb +0 -6
- data/lib/pacer/side_effect.rb +0 -11
- data/lib/pacer/support.rb +0 -10
- data/lib/pacer/transform.rb +0 -16
- data/lib/pacer/visitors.rb +0 -7
- data/lib/pacer/wrappers.rb +0 -21
@@ -0,0 +1,142 @@
|
|
1
|
+
module Pacer
|
2
|
+
class RouteBuilder
|
3
|
+
class << self
|
4
|
+
attr_writer :current
|
5
|
+
|
6
|
+
def current
|
7
|
+
@current ||= RouteBuilder.new
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_reader :types
|
12
|
+
|
13
|
+
def initialize
|
14
|
+
@types = Hash.new do |h, type_def|
|
15
|
+
h[type_def] = Class.new(Route) do
|
16
|
+
type_def.each do |mods|
|
17
|
+
mods.each do |mod|
|
18
|
+
include mod
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def chain(source, args)
|
26
|
+
types[type_def(source, args)].new source, configuration(source, args), arguments(source, args)
|
27
|
+
end
|
28
|
+
|
29
|
+
protected
|
30
|
+
|
31
|
+
def source_value(source, name)
|
32
|
+
source.send name if source.respond_to? name
|
33
|
+
end
|
34
|
+
|
35
|
+
def type_def(source, args)
|
36
|
+
[
|
37
|
+
type_modules(source, args),
|
38
|
+
function_modules(source, args),
|
39
|
+
other_modules(source, args),
|
40
|
+
extension_modules(source, args)
|
41
|
+
]
|
42
|
+
end
|
43
|
+
|
44
|
+
def configuration(source, args)
|
45
|
+
{
|
46
|
+
element_type: element_type(source, args),
|
47
|
+
graph: graph(source, args),
|
48
|
+
extensions: extensions(source, args),
|
49
|
+
wrapper: wrapper(source, args),
|
50
|
+
function: function_modules(source, args).first
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def arguments(source, args)
|
55
|
+
args.reject do |key, val|
|
56
|
+
Set[:element_type, :wrapper, :extensions, :modules, :graph, :back, :filter, :side_effect, :transform, :visitor].include? key
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def graph(source, args)
|
61
|
+
args[:graph] || source_value(source, :graph)
|
62
|
+
end
|
63
|
+
|
64
|
+
def element_type(source, args)
|
65
|
+
et = args[:element_type] || source_value(source, :element_type)
|
66
|
+
if not et
|
67
|
+
fail ClientError, "No element_type specified or inferred"
|
68
|
+
end
|
69
|
+
if not graph(source, args) and (et == :vertex or et == :edge or et == :mixed)
|
70
|
+
fail ClientError, "Element type #{ et.inspect } specified, but no graph specified."
|
71
|
+
end
|
72
|
+
et
|
73
|
+
end
|
74
|
+
|
75
|
+
def type_modules(source, args)
|
76
|
+
case element_type source, args
|
77
|
+
when :vertex
|
78
|
+
[Pacer::Core::Graph::ElementRoute, Pacer::Core::Graph::VerticesRoute]
|
79
|
+
when :edge
|
80
|
+
[Pacer::Core::Graph::ElementRoute, Pacer::Core::Graph::EdgesRoute]
|
81
|
+
when :mixed
|
82
|
+
[Pacer::Core::Graph::ElementRoute, Pacer::Core::Graph::MixedRoute]
|
83
|
+
else
|
84
|
+
[]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def other_modules(source, args)
|
89
|
+
[*args[:modules]]
|
90
|
+
end
|
91
|
+
|
92
|
+
def type_from_source?(source, args)
|
93
|
+
element_type(source, args) == source_value(source, :element_type)
|
94
|
+
end
|
95
|
+
|
96
|
+
def wrapper(source, args)
|
97
|
+
args.fetch(:wrapper) do
|
98
|
+
source_value(source, :wrapper) if type_from_source? source, args
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def extensions(source, args)
|
103
|
+
exts = args.fetch(:extensions) do
|
104
|
+
source_value(source, :extensions) if type_from_source? source, args
|
105
|
+
end
|
106
|
+
if exts.is_a? Set
|
107
|
+
exts.to_a
|
108
|
+
elsif exts.is_a? Module
|
109
|
+
[exts]
|
110
|
+
elsif exts.is_a? Array
|
111
|
+
exts.uniq
|
112
|
+
else
|
113
|
+
[]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def all_extensions(source, args)
|
118
|
+
w = wrapper source, args
|
119
|
+
exts = extensions source, args
|
120
|
+
if w and exts
|
121
|
+
(w.extensions + exts).uniq
|
122
|
+
elsif w
|
123
|
+
w.extensions
|
124
|
+
elsif exts
|
125
|
+
exts
|
126
|
+
else
|
127
|
+
[]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def extension_modules(source, args)
|
132
|
+
all_extensions(source, args).uniq.select do |mod|
|
133
|
+
mod.respond_to?(:const_defined?) and mod.const_defined? :Route
|
134
|
+
end.map { |mod| mod::Route }
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
def function_modules(source, args)
|
139
|
+
FunctionResolver.function(args).compact
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/lib/pacer/side_effect/as.rb
CHANGED
data/lib/pacer/version.rb
CHANGED
@@ -9,10 +9,13 @@ module Pacer::Wrappers
|
|
9
9
|
:getRawEdge
|
10
10
|
|
11
11
|
class << self
|
12
|
+
def wrappers
|
13
|
+
@wrappers ||= {}
|
14
|
+
end
|
15
|
+
|
12
16
|
def wrapper_for(exts)
|
13
|
-
@wrappers = {} unless defined? @wrappers
|
14
17
|
if exts
|
15
|
-
|
18
|
+
EdgeWrapper.wrappers[exts] ||= build_edge_wrapper(exts)
|
16
19
|
else
|
17
20
|
fail Pacer::LogicError, "Extensions should not be nil"
|
18
21
|
end
|
@@ -127,18 +130,12 @@ module Pacer::Wrappers
|
|
127
130
|
#
|
128
131
|
# @raise [StandardError] If this the associated vertices don't exist and :create_vertices is not set
|
129
132
|
def clone_into(target_graph, opts = {})
|
130
|
-
e_idx = target_graph.
|
131
|
-
e =
|
132
|
-
unless e
|
133
|
-
e = e_idx.first('id', element_id)
|
134
|
-
if e
|
135
|
-
e = EdgeWrapper.new(graph, e)
|
136
|
-
end
|
137
|
-
end
|
133
|
+
e_idx = target_graph.temp_index("tmp-e-#{graph.graph_id}", :edge, :create => true)
|
134
|
+
e = e_idx.first('id', element_id)
|
138
135
|
unless e
|
139
|
-
v_idx = target_graph.
|
140
|
-
iv =
|
141
|
-
ov =
|
136
|
+
v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
|
137
|
+
iv = v_idx.first('id', in_vertex.element_id)
|
138
|
+
ov = v_idx.first('id', out_vertex.element_id)
|
142
139
|
if opts[:create_vertices]
|
143
140
|
iv ||= in_vertex.clone_into target_graph
|
144
141
|
ov ||= out_vertex.clone_into target_graph
|
@@ -149,7 +146,7 @@ module Pacer::Wrappers
|
|
149
146
|
raise message unless opts[:ignore_missing_vertices]
|
150
147
|
return nil
|
151
148
|
end
|
152
|
-
e = target_graph.create_edge(element_id,
|
149
|
+
e = target_graph.create_edge(element_id, ov, iv, label, properties)
|
153
150
|
e_idx.put('id', element_id, e)
|
154
151
|
yield e if block_given?
|
155
152
|
end
|
@@ -165,12 +162,12 @@ module Pacer::Wrappers
|
|
165
162
|
#
|
166
163
|
# @raise [StandardError] If this the associated vertices don't exist
|
167
164
|
def copy_into(target_graph)
|
168
|
-
v_idx = target_graph.
|
165
|
+
v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
|
169
166
|
iv = v_idx.first('id', in_vertex.element_id) || target_graph.vertex(in_vertex.element_id)
|
170
167
|
ov = v_idx.first('id', out_vertex.element_id) || target_graph.vertex(out_vertex.element_id)
|
171
168
|
|
172
169
|
raise 'vertices not found' if not iv or not ov
|
173
|
-
e = target_graph.create_edge nil,
|
170
|
+
e = target_graph.create_edge nil, ov, iv, label, properties
|
174
171
|
yield e if block_given?
|
175
172
|
e
|
176
173
|
end
|
@@ -20,7 +20,6 @@ module Pacer::Wrappers
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def clear_cache
|
23
|
-
Pacer.send :remove_const, :Wrap if Pacer.const_defined? :Wrap
|
24
23
|
VertexWrapper.clear_cache
|
25
24
|
EdgeWrapper.clear_cache
|
26
25
|
end
|
@@ -42,31 +41,18 @@ module Pacer::Wrappers
|
|
42
41
|
def build_extension_wrapper(exts, mod_names, superclass)
|
43
42
|
sc_name = superclass.to_s.split(/::/).last
|
44
43
|
exts = exts.uniq unless exts.is_a? Set
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
class #{classname.to_s} < #{sc_name}
|
44
|
+
Class.new(superclass) do
|
45
|
+
exts.each do |obj|
|
46
|
+
if obj.is_a? Module or obj.is_a? Class
|
47
|
+
mod_names.each do |mod_name|
|
48
|
+
if obj.const_defined? mod_name
|
49
|
+
include obj.const_get(mod_name)
|
50
|
+
extensions << obj unless extensions.include? obj
|
53
51
|
end
|
54
52
|
end
|
55
53
|
end
|
56
|
-
}
|
57
|
-
wrapper = Pacer::Wrap.const_get classname
|
58
|
-
end
|
59
|
-
exts.each do |obj|
|
60
|
-
if obj.is_a? Module or obj.is_a? Class
|
61
|
-
mod_names.each do |mod_name|
|
62
|
-
if obj.const_defined? mod_name
|
63
|
-
wrapper.send :include, obj.const_get(mod_name)
|
64
|
-
wrapper.extensions << obj unless wrapper.extensions.include? obj
|
65
|
-
end
|
66
|
-
end
|
67
54
|
end
|
68
55
|
end
|
69
|
-
wrapper
|
70
56
|
end
|
71
57
|
end
|
72
58
|
|
@@ -92,6 +78,10 @@ module Pacer::Wrappers
|
|
92
78
|
after_initialize
|
93
79
|
end
|
94
80
|
|
81
|
+
def chain_route(args_hash)
|
82
|
+
Pacer::RouteBuilder.current.chain self, args_hash
|
83
|
+
end
|
84
|
+
|
95
85
|
# Convenience method to retrieve a property by name.
|
96
86
|
#
|
97
87
|
# @param [#to_s] key the property name
|
@@ -137,7 +127,7 @@ module Pacer::Wrappers
|
|
137
127
|
#
|
138
128
|
# @return [Hash]
|
139
129
|
def properties
|
140
|
-
element.getPropertyKeys.
|
130
|
+
Hash[element.getPropertyKeys.map { |name| [name, graph.decode_property(element.getProperty(name))] }]
|
141
131
|
end
|
142
132
|
|
143
133
|
# Replace the element's properties with the given hash
|
@@ -9,10 +9,13 @@ module Pacer::Wrappers
|
|
9
9
|
:getRawVertex
|
10
10
|
|
11
11
|
class << self
|
12
|
+
def wrappers
|
13
|
+
@wrappers ||= {}
|
14
|
+
end
|
15
|
+
|
12
16
|
def wrapper_for(exts)
|
13
|
-
@wrappers = {} unless defined? @wrappers
|
14
17
|
if exts
|
15
|
-
|
18
|
+
VertexWrapper.wrappers[exts.to_set] ||= build_vertex_wrapper(exts)
|
16
19
|
else
|
17
20
|
fail Pacer::LogicError, "Extensions should not be nil"
|
18
21
|
end
|
@@ -128,8 +131,8 @@ module Pacer::Wrappers
|
|
128
131
|
# @yield [v] Optional block yields the vertex after it has been created.
|
129
132
|
# @return [Pacer::Wrappers::VertexWrapper] the new vertex
|
130
133
|
def clone_into(target_graph, opts = nil)
|
131
|
-
v_idx = target_graph.
|
132
|
-
v =
|
134
|
+
v_idx = target_graph.temp_index("tmp-v-#{graph.graph_id}", :vertex, :create => true)
|
135
|
+
v = v_idx.first('id', element_id)
|
133
136
|
unless v
|
134
137
|
v = target_graph.create_vertex element_id, properties
|
135
138
|
v_idx.put('id', element_id, v.element)
|
Binary file
|
data/lib/pacer.rb
CHANGED
@@ -39,21 +39,7 @@ module Pacer
|
|
39
39
|
|
40
40
|
require JAR
|
41
41
|
|
42
|
-
require 'pacer/
|
43
|
-
require 'pacer/pipes'
|
44
|
-
require 'pacer/core'
|
45
|
-
require 'pacer/graph'
|
46
|
-
require 'pacer/routes'
|
47
|
-
require 'pacer/wrappers'
|
48
|
-
require 'pacer/route'
|
49
|
-
require 'pacer/blueprints'
|
50
|
-
require 'pacer/support'
|
51
|
-
require 'pacer/utils'
|
52
|
-
require 'pacer/visitors'
|
53
|
-
require 'pacer/filter'
|
54
|
-
require 'pacer/transform'
|
55
|
-
require 'pacer/side_effect'
|
56
|
-
require 'pacer/function_resolver'
|
42
|
+
require 'pacer/loader'
|
57
43
|
|
58
44
|
class << self
|
59
45
|
# A global place for pacer to put debug info if it's tucked deep in
|
@@ -180,6 +166,14 @@ module Pacer
|
|
180
166
|
FunctionResolver.clear_cache
|
181
167
|
end
|
182
168
|
|
169
|
+
def vertex_wrapper(*exts)
|
170
|
+
Wrappers::VertexWrapper.wrapper_for(exts)
|
171
|
+
end
|
172
|
+
|
173
|
+
def edge_wrapper(*exts)
|
174
|
+
Wrappers::EdgeWrapper.wrapper_for(exts)
|
175
|
+
end
|
176
|
+
|
183
177
|
# Is the object a vertex?
|
184
178
|
def vertex?(element)
|
185
179
|
element.is_a? Pacer::Wrappers::VertexWrapper
|
data/pom.xml
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
<artifactId>pacer</artifactId>
|
8
8
|
<!-- NOTE: the following properties are automatically updated based on the values in lib/pacer-neo4j/version.rb -->
|
9
9
|
<properties>
|
10
|
-
<gem.version>1.0.
|
10
|
+
<gem.version>1.0.3</gem.version>
|
11
11
|
<blueprints.version>2.1.0</blueprints.version>
|
12
12
|
<pipes.version>2.1.0</pipes.version>
|
13
13
|
<gremlin.version>2.1.0</gremlin.version>
|
@@ -1,158 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
Run.dex do
|
4
|
-
|
5
|
-
let(:v0) { graph.create_vertex }
|
6
|
-
let(:v1) { graph.create_vertex }
|
7
|
-
let(:e0) { graph.create_edge '0', v0, v1, :default }
|
8
|
-
|
9
|
-
describe '#element_type' do
|
10
|
-
context 'invalid' do
|
11
|
-
it { expect { graph.element_type(:nothing) }.to raise_error(ArgumentError) }
|
12
|
-
end
|
13
|
-
|
14
|
-
context ':vertex' do
|
15
|
-
subject { graph.element_type(:vertex) }
|
16
|
-
it { should == :vertex }
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'a vertex' do
|
20
|
-
subject { graph.element_type(v0) }
|
21
|
-
it { should == :vertex }
|
22
|
-
end
|
23
|
-
|
24
|
-
context ':edge' do
|
25
|
-
subject { graph.element_type(:edge) }
|
26
|
-
it { should == :edge }
|
27
|
-
end
|
28
|
-
|
29
|
-
context 'an edge' do
|
30
|
-
subject { graph.element_type(e0) }
|
31
|
-
it { should == :edge }
|
32
|
-
end
|
33
|
-
|
34
|
-
context ':mixed' do
|
35
|
-
subject { graph.element_type(:mixed) }
|
36
|
-
it { should == :mixed }
|
37
|
-
end
|
38
|
-
|
39
|
-
context ':object' do
|
40
|
-
subject { graph.element_type(:object) }
|
41
|
-
it { should == :object }
|
42
|
-
end
|
43
|
-
|
44
|
-
context 'from element_type' do
|
45
|
-
context ':vertex' do
|
46
|
-
subject { graph.element_type(graph.element_type :vertex) }
|
47
|
-
it { should == :vertex }
|
48
|
-
end
|
49
|
-
|
50
|
-
context ':edge' do
|
51
|
-
subject { graph.element_type(graph.element_type :edge) }
|
52
|
-
it { should == :edge }
|
53
|
-
end
|
54
|
-
|
55
|
-
context ':mixed' do
|
56
|
-
subject { graph.element_type(graph.element_type :mixed) }
|
57
|
-
it { should == :mixed }
|
58
|
-
end
|
59
|
-
|
60
|
-
context ':object' do
|
61
|
-
subject { graph.element_type(graph.element_type :object) }
|
62
|
-
it { should == :object }
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
context 'from index_class' do
|
67
|
-
context ':vertex' do
|
68
|
-
subject { graph.element_type(graph.index_class :vertex) }
|
69
|
-
it { should == :vertex }
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
|
74
|
-
describe '#indices' do
|
75
|
-
subject { graph.indices.to_a }
|
76
|
-
it { should_not be_empty }
|
77
|
-
end
|
78
|
-
|
79
|
-
describe '#sanitize_properties' do
|
80
|
-
let(:original) do
|
81
|
-
{ :string => ' bob ',
|
82
|
-
:symbol => :abba,
|
83
|
-
:empty => '',
|
84
|
-
:integer => 121,
|
85
|
-
:float => 100.001,
|
86
|
-
:time => Time.utc(1999, 11, 9, 9, 9, 1),
|
87
|
-
:object => { :a => 1, 1 => :a },
|
88
|
-
99 => 'numeric key',
|
89
|
-
'string key' => 'string value'
|
90
|
-
}
|
91
|
-
end
|
92
|
-
|
93
|
-
subject { graph.sanitize_properties original }
|
94
|
-
|
95
|
-
it { should_not equal(original) }
|
96
|
-
specify 'original should be unchanged' do
|
97
|
-
original.should == {
|
98
|
-
:string => ' bob ',
|
99
|
-
:symbol => :abba,
|
100
|
-
:empty => '',
|
101
|
-
:integer => 121,
|
102
|
-
:float => 100.001,
|
103
|
-
:time => Time.utc(1999, 11, 9, 9, 9, 1),
|
104
|
-
:object => { :a => 1, 1 => :a },
|
105
|
-
99 => 'numeric key',
|
106
|
-
'string key' => 'string value'
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
specify 'string should be stripped' do
|
111
|
-
subject[:string].should == 'bob'
|
112
|
-
end
|
113
|
-
|
114
|
-
specify 'empty string becomes nil' do
|
115
|
-
subject[:empty].should be_nil
|
116
|
-
end
|
117
|
-
|
118
|
-
specify 'numbers should be javafied' do
|
119
|
-
subject[:integer].should == 121.to_java(:int)
|
120
|
-
subject[:float].should == 100.001
|
121
|
-
end
|
122
|
-
|
123
|
-
specify 'everything else should be yaml' do
|
124
|
-
subject[:time].should == YAML.dump(Time.utc(1999, 11, 9, 9, 9, 1))
|
125
|
-
end
|
126
|
-
|
127
|
-
its(:keys) { should == original.keys }
|
128
|
-
end
|
129
|
-
|
130
|
-
describe '#in_vertex' do
|
131
|
-
it 'should wrap the vertex' do
|
132
|
-
v = e0.in_vertex(Tackle::SimpleMixin)
|
133
|
-
v.should == v1
|
134
|
-
v.extensions.should include(Tackle::SimpleMixin)
|
135
|
-
end
|
136
|
-
|
137
|
-
it 'should wrap the vertex 2' do
|
138
|
-
v = e0.in_vertex([Tackle::SimpleMixin])
|
139
|
-
v.should == v1
|
140
|
-
v.extensions.should include(Tackle::SimpleMixin)
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
describe '#out_vertex' do
|
145
|
-
it 'should wrap the vertex' do
|
146
|
-
v = e0.out_vertex(Tackle::SimpleMixin)
|
147
|
-
v.should == v0
|
148
|
-
v.extensions.should include(Tackle::SimpleMixin)
|
149
|
-
end
|
150
|
-
|
151
|
-
it 'should wrap the vertex 2' do
|
152
|
-
v = e0.out_vertex([Tackle::SimpleMixin])
|
153
|
-
v.should == v0
|
154
|
-
v.extensions.should include(Tackle::SimpleMixin)
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
4
|
+
# no special cases?
|
158
5
|
end
|