pacer 0.9.1.1-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/.autotest +8 -0
- data/.document +5 -0
- data/.gitignore +26 -0
- data/.rspec +1 -0
- data/.rvmrc +0 -0
- data/CONTRIBUTORS +5 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +24 -0
- data/README.md +187 -0
- data/Rakefile +49 -0
- data/autotest/discover.rb +1 -0
- data/bin/autospec +16 -0
- data/bin/autotest +16 -0
- data/bin/rake +16 -0
- data/bin/rcov +16 -0
- data/bin/rspec +16 -0
- data/bin/yard +16 -0
- data/bin/yardoc +16 -0
- data/lib/pacer/blueprints/extensions.rb +77 -0
- data/lib/pacer/blueprints/multi_graph.rb +121 -0
- data/lib/pacer/blueprints/ruby_graph.rb +199 -0
- data/lib/pacer/blueprints/tg.rb +100 -0
- data/lib/pacer/blueprints.rb +4 -0
- data/lib/pacer/core/graph/edges_route.rb +92 -0
- data/lib/pacer/core/graph/element_route.rb +171 -0
- data/lib/pacer/core/graph/graph_index_route.rb +48 -0
- data/lib/pacer/core/graph/graph_route.rb +55 -0
- data/lib/pacer/core/graph/mixed_route.rb +96 -0
- data/lib/pacer/core/graph/vertices_route.rb +220 -0
- data/lib/pacer/core/graph.rb +13 -0
- data/lib/pacer/core/route.rb +502 -0
- data/lib/pacer/core/side_effect.rb +11 -0
- data/lib/pacer/core.rb +8 -0
- data/lib/pacer/exceptions.rb +11 -0
- data/lib/pacer/extensions/block_filter_element.rb +22 -0
- data/lib/pacer/extensions.rb +6 -0
- data/lib/pacer/filter/block_filter.rb +31 -0
- data/lib/pacer/filter/collection_filter.rb +109 -0
- data/lib/pacer/filter/empty_filter.rb +70 -0
- data/lib/pacer/filter/future_filter.rb +68 -0
- data/lib/pacer/filter/index_filter.rb +30 -0
- data/lib/pacer/filter/loop_filter.rb +95 -0
- data/lib/pacer/filter/object_filter.rb +55 -0
- data/lib/pacer/filter/property_filter/edge_filters.rb +93 -0
- data/lib/pacer/filter/property_filter/filters.rb +269 -0
- data/lib/pacer/filter/property_filter.rb +111 -0
- data/lib/pacer/filter/random_filter.rb +13 -0
- data/lib/pacer/filter/range_filter.rb +104 -0
- data/lib/pacer/filter/uniq_filter.rb +12 -0
- data/lib/pacer/filter/where_filter/node_visitor.rb +280 -0
- data/lib/pacer/filter/where_filter.rb +47 -0
- data/lib/pacer/filter.rb +17 -0
- data/lib/pacer/function_resolver.rb +43 -0
- data/lib/pacer/graph/edge_mixin.rb +127 -0
- data/lib/pacer/graph/element_mixin.rb +202 -0
- data/lib/pacer/graph/graph_indices_mixin.rb +93 -0
- data/lib/pacer/graph/graph_mixin.rb +361 -0
- data/lib/pacer/graph/graph_transactions_mixin.rb +207 -0
- data/lib/pacer/graph/index_mixin.rb +30 -0
- data/lib/pacer/graph/vertex_mixin.rb +119 -0
- data/lib/pacer/graph.rb +14 -0
- data/lib/pacer/pipe/blackbox_pipeline.rb +48 -0
- data/lib/pacer/pipe/block_filter_pipe.rb +38 -0
- data/lib/pacer/pipe/collection_filter_pipe.rb +10 -0
- data/lib/pacer/pipe/cross_product_transform_pipe.rb +48 -0
- data/lib/pacer/pipe/enumerable_pipe.rb +30 -0
- data/lib/pacer/pipe/expandable_pipe.rb +63 -0
- data/lib/pacer/pipe/id_collection_filter_pipe.rb +33 -0
- data/lib/pacer/pipe/is_empty_pipe.rb +30 -0
- data/lib/pacer/pipe/is_unique_pipe.rb +61 -0
- data/lib/pacer/pipe/label_collection_filter_pipe.rb +21 -0
- data/lib/pacer/pipe/label_prefix_pipe.rb +21 -0
- data/lib/pacer/pipe/loop_pipe.rb +86 -0
- data/lib/pacer/pipe/map_pipe.rb +36 -0
- data/lib/pacer/pipe/never_pipe.rb +9 -0
- data/lib/pacer/pipe/process_pipe.rb +37 -0
- data/lib/pacer/pipe/property_comparison_pipe.rb +40 -0
- data/lib/pacer/pipe/ruby_pipe.rb +25 -0
- data/lib/pacer/pipe/simple_visitor_pipe.rb +43 -0
- data/lib/pacer/pipe/stream_sort_pipe.rb +84 -0
- data/lib/pacer/pipe/stream_uniq_pipe.rb +33 -0
- data/lib/pacer/pipe/type_filter_pipe.rb +22 -0
- data/lib/pacer/pipe/unary_transform_pipe.rb +59 -0
- data/lib/pacer/pipe/variable_store_iterator_wrapper.rb +26 -0
- data/lib/pacer/pipe/visitor_pipe.rb +67 -0
- data/lib/pacer/pipes.rb +61 -0
- data/lib/pacer/route/mixin/bulk_operations.rb +52 -0
- data/lib/pacer/route/mixin/route_operations.rb +107 -0
- data/lib/pacer/route/mixin/variable_route_module.rb +26 -0
- data/lib/pacer/route/mixins.rb +3 -0
- data/lib/pacer/route.rb +228 -0
- data/lib/pacer/routes.rb +6 -0
- data/lib/pacer/side_effect/aggregate.rb +31 -0
- data/lib/pacer/side_effect/counted.rb +30 -0
- data/lib/pacer/side_effect/group_count.rb +44 -0
- data/lib/pacer/side_effect/is_unique.rb +32 -0
- data/lib/pacer/side_effect/section.rb +25 -0
- data/lib/pacer/side_effect/visitor.rb +37 -0
- data/lib/pacer/side_effect.rb +11 -0
- data/lib/pacer/support/array_list.rb +28 -0
- data/lib/pacer/support/enumerable.rb +100 -0
- data/lib/pacer/support/hash.rb +9 -0
- data/lib/pacer/support/iterator_mixins.rb +110 -0
- data/lib/pacer/support/native_exception.rb +22 -0
- data/lib/pacer/support/proc.rb +16 -0
- data/lib/pacer/support.rb +10 -0
- data/lib/pacer/transform/cap.rb +50 -0
- data/lib/pacer/transform/gather.rb +9 -0
- data/lib/pacer/transform/has_count_cap.rb +41 -0
- data/lib/pacer/transform/join.rb +181 -0
- data/lib/pacer/transform/map.rb +23 -0
- data/lib/pacer/transform/path.rb +50 -0
- data/lib/pacer/transform/process.rb +23 -0
- data/lib/pacer/transform/scatter.rb +23 -0
- data/lib/pacer/transform/sort_section.rb +103 -0
- data/lib/pacer/transform/stream_sort.rb +21 -0
- data/lib/pacer/transform/stream_uniq.rb +21 -0
- data/lib/pacer/transform.rb +16 -0
- data/lib/pacer/utils/graph_analysis.rb +112 -0
- data/lib/pacer/utils/trie.rb +93 -0
- data/lib/pacer/utils/tsort.rb +65 -0
- data/lib/pacer/utils/y_files.rb +127 -0
- data/lib/pacer/utils.rb +10 -0
- data/lib/pacer/version.rb +13 -0
- data/lib/pacer/wrappers/edge_wrapper.rb +51 -0
- data/lib/pacer/wrappers/element_wrapper.rb +78 -0
- data/lib/pacer/wrappers/new_element.rb +106 -0
- data/lib/pacer/wrappers/vertex_wrapper.rb +51 -0
- data/lib/pacer/wrappers.rb +19 -0
- data/lib/pacer-0.9.1.1-standalone.jar +0 -0
- data/lib/pacer.rb +290 -0
- data/pacer.gemspec +30 -0
- data/pom/standalone.xml +22 -0
- data/pom.xml +124 -0
- data/samples/grateful-dead.xml +26380 -0
- data/samples/grateful_dead.rb +63 -0
- data/samples/profile.rb +15 -0
- data/spec/data/grateful-dead.xml +26380 -0
- data/spec/data/pacer.graphml +319 -0
- data/spec/pacer/blueprints/dex_spec.rb +172 -0
- data/spec/pacer/blueprints/neo4j_spec.rb +177 -0
- data/spec/pacer/blueprints/tg_spec.rb +128 -0
- data/spec/pacer/core/graph/edges_route_spec.rb +52 -0
- data/spec/pacer/core/graph/element_route_spec.rb +46 -0
- data/spec/pacer/core/graph/graph_route_spec.rb +94 -0
- data/spec/pacer/core/graph/vertices_route_spec.rb +169 -0
- data/spec/pacer/core/route_spec.rb +197 -0
- data/spec/pacer/filter/collection_filter_spec.rb +19 -0
- data/spec/pacer/filter/empty_filter_spec.rb +29 -0
- data/spec/pacer/filter/future_filter_spec.rb +97 -0
- data/spec/pacer/filter/loop_filter_spec.rb +31 -0
- data/spec/pacer/filter/property_filter_spec.rb +111 -0
- data/spec/pacer/filter/random_filter_spec.rb +17 -0
- data/spec/pacer/filter/uniq_filter_spec.rb +18 -0
- data/spec/pacer/filter/where_filter_spec.rb +93 -0
- data/spec/pacer/graph/edge_mixin_spec.rb +116 -0
- data/spec/pacer/graph/element_mixin_spec.rb +297 -0
- data/spec/pacer/graph/graph_mixin_spec.rb +538 -0
- data/spec/pacer/graph/index_mixin_spec.rb +0 -0
- data/spec/pacer/graph/vertex_mixin_spec.rb +192 -0
- data/spec/pacer/pipe/block_filter_pipe_spec.rb +0 -0
- data/spec/pacer/pipe/labels_filter_pipe_spec.rb +0 -0
- data/spec/pacer/pipe/ruby_pipe_spec.rb +0 -0
- data/spec/pacer/pipe/type_filter_pipe_spec.rb +0 -0
- data/spec/pacer/route/mixin/base_spec.rb +419 -0
- data/spec/pacer/route/mixin/bulk_operations_spec.rb +30 -0
- data/spec/pacer/route/mixin/route_operations_spec.rb +127 -0
- data/spec/pacer/support/array_list_spec.rb +0 -0
- data/spec/pacer/support/enumerable_spec.rb +115 -0
- data/spec/pacer/transform/join_spec.rb +138 -0
- data/spec/pacer/transform/path_spec.rb +54 -0
- data/spec/pacer/utils/tsort_spec.rb +89 -0
- data/spec/pacer/wrapper/edge_wrapper_spec.rb +33 -0
- data/spec/pacer/wrapper/element_wrapper_spec.rb +169 -0
- data/spec/pacer/wrapper/vertex_wrapper_spec.rb +33 -0
- data/spec/pacer_spec.rb +0 -0
- data/spec/spec_helper.rb +91 -0
- data/spec/support/contexts.rb +14 -0
- data/spec/support/graph_runner.rb +142 -0
- data/spec/support/matchers.rb +19 -0
- data/spec/support/use_transactions.rb +31 -0
- data/spec/tackle/simple_mixin.rb +21 -0
- data/spec/tackle/tinkerpop_graph_mixins.rb +60 -0
- metadata +364 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'pacer/graph/element_mixin_spec'
|
|
3
|
+
|
|
4
|
+
Run.all do
|
|
5
|
+
# This runs about 500 specs, basically it should test all the ways
|
|
6
|
+
# that wrappers act the same as native elements
|
|
7
|
+
describe Pacer::Wrappers::ElementWrapper do
|
|
8
|
+
it_uses Pacer::ElementMixin do
|
|
9
|
+
let(:v0) { graph.create_vertex(Tackle::SimpleMixin, :name => 'eliza') }
|
|
10
|
+
let(:v1) { graph.create_vertex(Tackle::SimpleMixin, :name => 'darrick') }
|
|
11
|
+
let(:e0) { graph.create_edge nil, v0, v1, :links, Tackle::SimpleMixin }
|
|
12
|
+
let(:e1) { graph.create_edge nil, v0, v1, :relinks, Tackle::SimpleMixin }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe Pacer, '.wrap_vertex' do
|
|
18
|
+
before { Pacer.edge_wrapper Tackle::SimpleMixin }
|
|
19
|
+
subject { Pacer.vertex_wrapper Tackle::SimpleMixin }
|
|
20
|
+
its(:name) { should =~ /^Pacer::Wrap::/ }
|
|
21
|
+
its(:ancestors) { should include Pacer::Wrappers::VertexWrapper }
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe Pacer, '.wrap_vertex' do
|
|
25
|
+
before { Pacer.vertex_wrapper Tackle::SimpleMixin }
|
|
26
|
+
subject { Pacer.edge_wrapper Tackle::SimpleMixin }
|
|
27
|
+
its(:name) { should =~ /^Pacer::Wrap::/ }
|
|
28
|
+
its(:ancestors) { should include Pacer::Wrappers::EdgeWrapper }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
Run.tg :read_only do
|
|
32
|
+
use_pacer_graphml_data :read_only
|
|
33
|
+
|
|
34
|
+
describe Pacer::Wrappers::ElementWrapper do
|
|
35
|
+
subject { Pacer.vertex_wrapper Tackle::SimpleMixin }
|
|
36
|
+
|
|
37
|
+
its(:name) { should =~ /^Pacer::Wrap::/ }
|
|
38
|
+
its(:extensions) { should == [Tackle::SimpleMixin] }
|
|
39
|
+
|
|
40
|
+
describe '.clear_cache' do
|
|
41
|
+
before do
|
|
42
|
+
subject.const_set :ORIGINAL, true
|
|
43
|
+
Pacer.vertex_wrapper(Tackle::SimpleMixin).const_defined?(:ORIGINAL).should be_true
|
|
44
|
+
Pacer::Wrappers::ElementWrapper.clear_cache
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it 'should get rid of the Pacer::Wrap namespace' do
|
|
48
|
+
Pacer.const_defined?(:Wrap).should be_false
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'should not be the same object if redefined' do
|
|
52
|
+
# if the wrapper is redefined identically, you can't use a normal
|
|
53
|
+
# comparison to see if it's actually been redefined.
|
|
54
|
+
Pacer.vertex_wrapper(Tackle::SimpleMixin).const_defined?(:ORIGINAL).should be_false
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe 'extension ordering' do
|
|
59
|
+
before do
|
|
60
|
+
Pacer::Wrappers::ElementWrapper.clear_cache
|
|
61
|
+
end
|
|
62
|
+
subject { Pacer.vertex_wrapper TP::Person, Tackle::SimpleMixin, TP::Coder }
|
|
63
|
+
|
|
64
|
+
its(:extensions) { should == [TP::Person, Tackle::SimpleMixin, TP::Coder] }
|
|
65
|
+
it 'should have the ancestors set in the correct order' do
|
|
66
|
+
# Ruby searches for methods down this list, so order is
|
|
67
|
+
# important for method overrides.
|
|
68
|
+
subject.ancestors[0...6].should == [
|
|
69
|
+
Pacer::Wrap::VertexWrapperTP_PersonTackle_SimpleMixinTP_Coder,
|
|
70
|
+
TP::Coder::Route,
|
|
71
|
+
Tackle::SimpleMixin::Vertex,
|
|
72
|
+
Tackle::SimpleMixin::Route,
|
|
73
|
+
TP::Person::Route,
|
|
74
|
+
Pacer::Wrappers::VertexWrapper,
|
|
75
|
+
]
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it 'should preserve the order once it is established for that combination of extensions' do
|
|
79
|
+
subject.ancestors.should == Pacer.vertex_wrapper(TP::Coder, TP::Person, Tackle::SimpleMixin).ancestors
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context 'should preserve extension order if a route uses the wrapper and adds more extensions' do
|
|
83
|
+
let(:wrapper) { Pacer.vertex_wrapper TP::Person, Tackle::SimpleMixin, TP::Coder }
|
|
84
|
+
subject do
|
|
85
|
+
route = graph.v(wrapper, Pacer::Utils::TSort)
|
|
86
|
+
first = route.first
|
|
87
|
+
first.should_not be_nil
|
|
88
|
+
first.class
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'should have ancestors in the correct order' do
|
|
92
|
+
subject.ancestors[0...9].should == [
|
|
93
|
+
Pacer::Wrap::VertexWrapperTP_PersonTackle_SimpleMixinTP_CoderPacer_Utils_TSort,
|
|
94
|
+
Pacer::Utils::TSort::Vertex,
|
|
95
|
+
Pacer::Utils::TSort::Route,
|
|
96
|
+
TSort,
|
|
97
|
+
TP::Coder::Route,
|
|
98
|
+
Tackle::SimpleMixin::Vertex,
|
|
99
|
+
Tackle::SimpleMixin::Route,
|
|
100
|
+
TP::Person::Route,
|
|
101
|
+
Pacer::Wrappers::VertexWrapper,
|
|
102
|
+
]
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
context 'should preserve extension order in a block filter' do
|
|
107
|
+
subject do
|
|
108
|
+
klass = nil
|
|
109
|
+
route = graph.v(TP::Person, Tackle::SimpleMixin, TP::Coder) { |e| klass = e.class }
|
|
110
|
+
route.first.should_not be_nil
|
|
111
|
+
klass
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'should have ancestors in the correct order' do
|
|
115
|
+
subject.ancestors[0...7].should == [
|
|
116
|
+
Pacer::Wrap::VertexWrapperTP_PersonTackle_SimpleMixinTP_CoderPacer_Extensions_BlockFilterElement,
|
|
117
|
+
Pacer::Extensions::BlockFilterElement::Route,
|
|
118
|
+
TP::Coder::Route,
|
|
119
|
+
Tackle::SimpleMixin::Vertex,
|
|
120
|
+
Tackle::SimpleMixin::Route,
|
|
121
|
+
TP::Person::Route,
|
|
122
|
+
Pacer::Wrappers::VertexWrapper,
|
|
123
|
+
]
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
context 'should be in a different order if cleared and defined differently' do
|
|
128
|
+
before { Pacer::Wrappers::ElementWrapper.clear_cache }
|
|
129
|
+
subject { Pacer.vertex_wrapper Tackle::SimpleMixin, TP::Person, TP::Coder }
|
|
130
|
+
|
|
131
|
+
its(:extensions) { should == [Tackle::SimpleMixin, TP::Person, TP::Coder] }
|
|
132
|
+
it 'should have the ancestors set in the correct order' do
|
|
133
|
+
# Ruby searches for methods down this list, so order is
|
|
134
|
+
# important for method overrides.
|
|
135
|
+
subject.ancestors[0...6].should == [
|
|
136
|
+
Pacer::Wrap::VertexWrapperTackle_SimpleMixinTP_PersonTP_Coder,
|
|
137
|
+
TP::Coder::Route,
|
|
138
|
+
TP::Person::Route,
|
|
139
|
+
Tackle::SimpleMixin::Vertex,
|
|
140
|
+
Tackle::SimpleMixin::Route,
|
|
141
|
+
Pacer::Wrappers::VertexWrapper,
|
|
142
|
+
]
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
context 'should preserve extension order if a route adds more extensions' do
|
|
146
|
+
subject do
|
|
147
|
+
klass = nil
|
|
148
|
+
route = graph.v(Tackle::SimpleMixin, TP::Person, TP::Coder) { |e| klass = e.class }
|
|
149
|
+
route.first.should_not be_nil
|
|
150
|
+
klass
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
it { should_not be_nil }
|
|
154
|
+
it 'should have ancestors in the correct order' do
|
|
155
|
+
subject.ancestors[0...7].should == [
|
|
156
|
+
Pacer::Wrap::VertexWrapperTackle_SimpleMixinTP_PersonTP_CoderPacer_Extensions_BlockFilterElement,
|
|
157
|
+
Pacer::Extensions::BlockFilterElement::Route,
|
|
158
|
+
TP::Coder::Route,
|
|
159
|
+
TP::Person::Route,
|
|
160
|
+
Tackle::SimpleMixin::Vertex,
|
|
161
|
+
Tackle::SimpleMixin::Route,
|
|
162
|
+
Pacer::Wrappers::VertexWrapper,
|
|
163
|
+
]
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
Run.all :read_only do
|
|
4
|
+
use_pacer_graphml_data :read_only
|
|
5
|
+
|
|
6
|
+
describe Pacer::Wrappers::VertexWrapper do
|
|
7
|
+
|
|
8
|
+
let(:v_exts) { [Tackle::SimpleMixin, TP::Project] }
|
|
9
|
+
let(:v_wrapper_class) { Pacer::Wrappers::VertexWrapper.wrapper_for v_exts }
|
|
10
|
+
|
|
11
|
+
subject { v_wrapper_class }
|
|
12
|
+
|
|
13
|
+
it { should_not be_nil }
|
|
14
|
+
its(:route_conditions) { should == { type: 'project' } }
|
|
15
|
+
its(:extensions) { should == v_exts }
|
|
16
|
+
|
|
17
|
+
describe 'instance' do
|
|
18
|
+
subject { v_wrapper_class.new pacer }
|
|
19
|
+
it { should_not be_nil }
|
|
20
|
+
its(:element) { should_not be_nil }
|
|
21
|
+
it { should == pacer }
|
|
22
|
+
it { should_not equal pacer }
|
|
23
|
+
its(:element_id) { should == pacer.element_id }
|
|
24
|
+
its(:extensions) { should == v_exts }
|
|
25
|
+
|
|
26
|
+
describe 'with more extensions added' do
|
|
27
|
+
subject { v_wrapper_class.new(pacer).add_extensions([Pacer::Utils::TSort]) }
|
|
28
|
+
its(:class) { should_not == v_wrapper_class }
|
|
29
|
+
its(:extensions) { should == v_exts + [Pacer::Utils::TSort] }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
data/spec/pacer_spec.rb
ADDED
|
File without changes
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
require "rubygems"
|
|
2
|
+
require "bundler"
|
|
3
|
+
Bundler.setup(:default, :development)
|
|
4
|
+
require 'rspec'
|
|
5
|
+
require 'pacer'
|
|
6
|
+
require 'set'
|
|
7
|
+
|
|
8
|
+
Dir['./spec/support/**/*.rb'].map {|f| require f}
|
|
9
|
+
Dir['./spec/tackle/*.rb'].map {|f| require f}
|
|
10
|
+
|
|
11
|
+
include Pacer::Routes
|
|
12
|
+
|
|
13
|
+
class RSpec::Core::ExampleGroup
|
|
14
|
+
def self.run_all(reporter=nil)
|
|
15
|
+
run(reporter || NullObject.new)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def in_editor?
|
|
20
|
+
ENV.has_key?('TM_MODE') || ENV.has_key?('EMACS') || ENV.has_key?('VIM')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
require 'pacer-neo4j'
|
|
24
|
+
# require 'pacer-dex'
|
|
25
|
+
Pacer::DexGraph = Class.new unless defined? Pacer::DexGraph
|
|
26
|
+
|
|
27
|
+
Run = RSpec::GraphRunner.new ENV['GRAPHS']
|
|
28
|
+
|
|
29
|
+
def use_simple_graph_data
|
|
30
|
+
let(:setup_data) { e0; e1 }
|
|
31
|
+
let(:v0) { graph.create_vertex :name => 'eliza' }
|
|
32
|
+
let(:v1) { graph.create_vertex :name => 'darrick' }
|
|
33
|
+
let(:e0) { graph.create_edge nil, v0, v1, :links }
|
|
34
|
+
let(:e1) { graph.create_edge nil, v0, v1, :relinks }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def use_pacer_graphml_data(usage_style = :read_write)
|
|
38
|
+
if usage_style == :read_only
|
|
39
|
+
let(:setup_data) { }
|
|
40
|
+
before(:all) do
|
|
41
|
+
graph.import 'spec/data/pacer.graphml' if graph
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
let(:setup_data) do
|
|
45
|
+
graph.import 'spec/data/pacer.graphml' if graph
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
let(:pangloss) { graph.v(:name => 'pangloss', :type => 'person').first }
|
|
49
|
+
let(:pacer) { graph.v(:name => 'pacer', :type => 'project').first }
|
|
50
|
+
let(:people) { graph.v(:type => 'person') }
|
|
51
|
+
let(:pangloss_wrote_pacer) { pangloss.out_e(:wrote) { |e| e.in_vertex == pacer }.first }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def use_grateful_dead_data(usage_style = :read_write)
|
|
55
|
+
if usage_style == :read_only
|
|
56
|
+
let(:setup_data) { }
|
|
57
|
+
before(:all) do
|
|
58
|
+
graph.import 'spec/data/grateful-dead.xml' if graph
|
|
59
|
+
end
|
|
60
|
+
else
|
|
61
|
+
let(:setup_data) do
|
|
62
|
+
graph.import 'spec/data/grateful-dead.xml' if graph
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
RSpec.configure do |c|
|
|
68
|
+
c.color_enabled = !in_editor?
|
|
69
|
+
c.filter_run :focus => true
|
|
70
|
+
c.run_all_when_everything_filtered = true
|
|
71
|
+
Pacer.hide_route_elements = true
|
|
72
|
+
Pacer.verbose = false
|
|
73
|
+
c.mock_with :rr
|
|
74
|
+
|
|
75
|
+
c.alias_it_should_behave_like_to :it_uses, '-'
|
|
76
|
+
|
|
77
|
+
puts "Using JRuby #{ JRUBY_VERSION } in #{ RUBY_VERSION } mode."
|
|
78
|
+
puts Run.inspect
|
|
79
|
+
|
|
80
|
+
# Not sure what this does: ...
|
|
81
|
+
# c.filter_run_excluding :ruby => lambda {|version|
|
|
82
|
+
# case version.to_s
|
|
83
|
+
# when "!jruby"
|
|
84
|
+
# RUBY_ENGINE != "jruby"
|
|
85
|
+
# when /^> (.*)/
|
|
86
|
+
# !(RUBY_VERSION.to_s > $1)
|
|
87
|
+
# else
|
|
88
|
+
# !(RUBY_VERSION.to_s =~ /^#{version.to_s}/)
|
|
89
|
+
# end
|
|
90
|
+
# }
|
|
91
|
+
end
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
class RSpec::GraphRunner
|
|
2
|
+
module Tg
|
|
3
|
+
def all(usage_style = :read_write, indices = true, &block)
|
|
4
|
+
tg(usage_style, indices, &block)
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def tg(usage_style = :read_write, indices = true, &block)
|
|
8
|
+
return unless use_graph? 'tg'
|
|
9
|
+
describe 'tg' do
|
|
10
|
+
let(:graph) do
|
|
11
|
+
g = Pacer.tg
|
|
12
|
+
unless indices
|
|
13
|
+
g.drop_index :vertices
|
|
14
|
+
g.drop_index :edges
|
|
15
|
+
end
|
|
16
|
+
g
|
|
17
|
+
end
|
|
18
|
+
let(:graph2) { Pacer.tg }
|
|
19
|
+
instance_eval(&block)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def dex(*args)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module RubyGraph
|
|
28
|
+
def all(usage_style = :read_write, indices = true, &block)
|
|
29
|
+
super
|
|
30
|
+
rg(usage_style, indices, &block)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def rg(usage_style = :read_write, indices = true, &block)
|
|
34
|
+
for_graph('rg', usage_style, indices, false, ruby_graph, ruby_graph2, nil, block)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
protected
|
|
38
|
+
|
|
39
|
+
def ruby_graph
|
|
40
|
+
Pacer::RubyGraph.new
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def ruby_graph2
|
|
44
|
+
Pacer::RubyGraph.new
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
module MultiGraph
|
|
49
|
+
def all(usage_style = :read_write, indices = true, &block)
|
|
50
|
+
super
|
|
51
|
+
multigraph(usage_style, indices, &block)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def multigraph(usage_style = :read_write, indices = true, &block)
|
|
55
|
+
for_graph('multigraph', usage_style, indices, false, multi_graph, multi_graph2, nil, block)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
protected
|
|
59
|
+
|
|
60
|
+
def multi_graph
|
|
61
|
+
Pacer::MultiGraph.new
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def multi_graph2
|
|
65
|
+
Pacer::MultiGraph.new
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
include Tg
|
|
70
|
+
include RubyGraph
|
|
71
|
+
include MultiGraph
|
|
72
|
+
|
|
73
|
+
def initialize(*graphs)
|
|
74
|
+
@graphs = graphs.map { |s| s.to_s.downcase.split(/\s*,\s*/) }.flatten.map { |s| s.strip }.reject { |s| s == '' }
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def inspect
|
|
78
|
+
if @graphs.empty?
|
|
79
|
+
"Testing all graphs."
|
|
80
|
+
else
|
|
81
|
+
"Testing graphs: #{ @graphs.join ', ' }."
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def use_graph?(name)
|
|
86
|
+
if @graphs.empty?
|
|
87
|
+
true
|
|
88
|
+
else
|
|
89
|
+
@graphs.include? name
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
protected
|
|
94
|
+
|
|
95
|
+
def for_graph(name, usage_style, indices, transactions, source_graph_1, source_graph_2, unindexed_graph, block)
|
|
96
|
+
return unless use_graph? name
|
|
97
|
+
describe name do
|
|
98
|
+
let(:graph) do
|
|
99
|
+
if indices
|
|
100
|
+
source_graph_1
|
|
101
|
+
else
|
|
102
|
+
unindexed_graph
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
let(:graph2) do
|
|
106
|
+
source_graph_2
|
|
107
|
+
end
|
|
108
|
+
if usage_style == :read_only
|
|
109
|
+
before(:all) do
|
|
110
|
+
source_graph_1.v.delete!
|
|
111
|
+
source_graph_2.v.delete!
|
|
112
|
+
unindexed_graph.v.delete! if unindexed_graph
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
around do |spec|
|
|
116
|
+
if usage_style == :read_write
|
|
117
|
+
source_graph_1.v.delete!
|
|
118
|
+
source_graph_2.v.delete!
|
|
119
|
+
unindexed_graph.v.delete! if unindexed_graph
|
|
120
|
+
end
|
|
121
|
+
if transactions and spec.use_transactions?
|
|
122
|
+
graph.manual_transactions do
|
|
123
|
+
graph2.manual_transactions do
|
|
124
|
+
begin
|
|
125
|
+
graph.begin_transaction
|
|
126
|
+
graph2.begin_transaction
|
|
127
|
+
spec.run
|
|
128
|
+
ensure
|
|
129
|
+
graph.rollback_transaction rescue nil
|
|
130
|
+
graph2.rollback_transaction rescue nil
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
else
|
|
135
|
+
spec.run
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
instance_eval(&block)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Core
|
|
3
|
+
module Matchers
|
|
4
|
+
def fail
|
|
5
|
+
raise_error(::RSpec::Expectations::ExpectationNotMetError)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def fail_with(message)
|
|
9
|
+
raise_error(::RSpec::Expectations::ExpectationNotMetError, message)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
RSpec::Matchers.define :be_one_of do |*list|
|
|
16
|
+
match do |item|
|
|
17
|
+
list.include? item
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module RSpec
|
|
2
|
+
module Core
|
|
3
|
+
class Example
|
|
4
|
+
module ProcsyTransactions
|
|
5
|
+
def use_transactions?
|
|
6
|
+
find_metadata(metadata, :transactions) != false
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def find_metadata(hash, key)
|
|
10
|
+
return unless hash.is_a? Hash
|
|
11
|
+
if hash.key? key
|
|
12
|
+
hash[key]
|
|
13
|
+
elsif hash.key? :example_group
|
|
14
|
+
find_metadata(hash[:example_group], key)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
if not defined? Procsy or Procsy.class == Module
|
|
20
|
+
# RSpec version >= '2.5.0'
|
|
21
|
+
module Procsy
|
|
22
|
+
include ProcsyTransactions
|
|
23
|
+
end
|
|
24
|
+
else
|
|
25
|
+
class Procsy
|
|
26
|
+
include ProcsyTransactions
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Tackle
|
|
2
|
+
module SimpleMixin
|
|
3
|
+
module Route
|
|
4
|
+
def route_mixin_method
|
|
5
|
+
true
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Vertex
|
|
10
|
+
def vertex_mixin_method
|
|
11
|
+
true
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module Edge
|
|
16
|
+
def edge_mixin_method
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
module TP
|
|
2
|
+
module Person
|
|
3
|
+
def self.route_conditions
|
|
4
|
+
{ :type => 'person' }
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
module Route
|
|
8
|
+
def projects
|
|
9
|
+
out_e.in_v(Project)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Project
|
|
16
|
+
def self.route_conditions
|
|
17
|
+
{ :type => 'project' }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module Route
|
|
21
|
+
def people
|
|
22
|
+
in_e.out_v(Person)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class Pangloss
|
|
28
|
+
def self.route(base)
|
|
29
|
+
base.v(:name => 'pangloss')
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
module Coder
|
|
34
|
+
module Route
|
|
35
|
+
def projects
|
|
36
|
+
out(Project, Software)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
module Software
|
|
42
|
+
module Route
|
|
43
|
+
def coders
|
|
44
|
+
self.in(Coder)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
module Wrote
|
|
50
|
+
def self.route_conditions
|
|
51
|
+
{ label: 'wrote' }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
module Edge
|
|
55
|
+
def writer
|
|
56
|
+
out_vertex
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|