pacer 1.0.2-java → 1.0.3-java
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/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
|