neo4j-core 8.1.4 → 9.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +71 -8
- data/lib/neo4j-core.rb +3 -49
- data/lib/neo4j/core.rb +4 -0
- data/lib/neo4j/core/config.rb +13 -0
- data/lib/neo4j/core/cypher_session/adaptors.rb +15 -15
- data/lib/neo4j/core/cypher_session/adaptors/bolt.rb +39 -48
- data/lib/neo4j/core/cypher_session/adaptors/bolt/chunk_writer_io.rb +0 -4
- data/lib/neo4j/core/cypher_session/adaptors/bolt/pack_stream.rb +7 -3
- data/lib/neo4j/core/cypher_session/adaptors/embedded.rb +1 -2
- data/lib/neo4j/core/cypher_session/adaptors/has_uri.rb +4 -0
- data/lib/neo4j/core/cypher_session/adaptors/http.rb +1 -3
- data/lib/neo4j/core/cypher_session/responses.rb +1 -1
- data/lib/neo4j/core/cypher_session/responses/bolt.rb +0 -17
- data/lib/neo4j/core/cypher_session/responses/embedded.rb +9 -7
- data/lib/neo4j/core/cypher_session/responses/http.rb +3 -4
- data/lib/neo4j/core/cypher_session/transactions.rb +2 -0
- data/lib/{neo4j-core → neo4j/core}/helpers.rb +1 -14
- data/lib/neo4j/core/logging.rb +44 -0
- data/lib/{neo4j-core → neo4j/core}/query.rb +7 -6
- data/lib/{neo4j-core → neo4j/core}/query_clauses.rb +9 -16
- data/lib/{neo4j-core → neo4j/core}/query_find_in_batches.rb +3 -5
- data/lib/{neo4j-core → neo4j/core}/version.rb +1 -1
- data/lib/neo4j/transaction.rb +6 -8
- data/neo4j-core.gemspec +13 -11
- metadata +46 -50
- data/lib/ext/kernel.rb +0 -9
- data/lib/neo4j-core/active_entity.rb +0 -11
- data/lib/neo4j-core/label.rb +0 -9
- data/lib/neo4j-embedded.rb +0 -16
- data/lib/neo4j-embedded/cypher_response.rb +0 -71
- data/lib/neo4j-embedded/embedded_database.rb +0 -26
- data/lib/neo4j-embedded/embedded_ha_session.rb +0 -30
- data/lib/neo4j-embedded/embedded_impermanent_session.rb +0 -17
- data/lib/neo4j-embedded/embedded_label.rb +0 -88
- data/lib/neo4j-embedded/embedded_node.rb +0 -206
- data/lib/neo4j-embedded/embedded_relationship.rb +0 -77
- data/lib/neo4j-embedded/embedded_session.rb +0 -203
- data/lib/neo4j-embedded/embedded_transaction.rb +0 -30
- data/lib/neo4j-embedded/label.rb +0 -66
- data/lib/neo4j-embedded/property.rb +0 -106
- data/lib/neo4j-embedded/to_java.rb +0 -44
- data/lib/neo4j-server.rb +0 -12
- data/lib/neo4j-server/cypher_label.rb +0 -35
- data/lib/neo4j-server/cypher_node.rb +0 -221
- data/lib/neo4j-server/cypher_relationship.rb +0 -142
- data/lib/neo4j-server/cypher_response.rb +0 -248
- data/lib/neo4j-server/cypher_session.rb +0 -263
- data/lib/neo4j-server/cypher_transaction.rb +0 -100
- data/lib/neo4j-server/label.rb +0 -40
- data/lib/neo4j-server/resource.rb +0 -57
- data/lib/neo4j/entity_equality.rb +0 -8
- data/lib/neo4j/entity_marshal.rb +0 -20
- data/lib/neo4j/label.rb +0 -90
- data/lib/neo4j/node.rb +0 -216
- data/lib/neo4j/property_container.rb +0 -17
- data/lib/neo4j/property_validator.rb +0 -22
- data/lib/neo4j/relationship.rb +0 -161
- data/lib/neo4j/session.rb +0 -222
@@ -13,7 +13,6 @@ class ChunkWriterIO < StringIO
|
|
13
13
|
|
14
14
|
# Write some bytes, splitting into chunks if necessary.
|
15
15
|
def write_with_chunking(string)
|
16
|
-
# Kernel.puts "Write!"
|
17
16
|
until string.empty?
|
18
17
|
future_size = @output_size + string.size
|
19
18
|
if future_size >= MAX_CHUNK_SIZE
|
@@ -56,15 +55,12 @@ class ChunkWriterIO < StringIO
|
|
56
55
|
def buffer_result(zero_chunk = false)
|
57
56
|
result = ''
|
58
57
|
|
59
|
-
# Kernel.puts 'result1', result.inspect
|
60
58
|
if !@output_buffer.empty?
|
61
59
|
result << [@output_size].pack('s>*')
|
62
60
|
result.concat(@output_buffer.join)
|
63
61
|
end
|
64
62
|
|
65
|
-
# Kernel.puts 'result2', result.inspect
|
66
63
|
result << "\x00\x00" if zero_chunk
|
67
|
-
# Kernel.puts 'result3', result.inspect
|
68
64
|
|
69
65
|
result
|
70
66
|
end
|
@@ -31,8 +31,10 @@ module Neo4j
|
|
31
31
|
DE: [:struct, 32]
|
32
32
|
}
|
33
33
|
# For efficiency. Translates directly from bytes to types
|
34
|
+
# Disabling because this needs to be able to change the hash inside the blocks
|
35
|
+
# There's probably a better way
|
34
36
|
MARKER_TYPES.keys.each do |key|
|
35
|
-
ord =
|
37
|
+
ord = key.to_s.to_i(16)
|
36
38
|
MARKER_TYPES[ord] = MARKER_TYPES.delete(key)
|
37
39
|
end
|
38
40
|
|
@@ -42,6 +44,7 @@ module Neo4j
|
|
42
44
|
MARKER_BYTES.delete(key) if key.is_a?(Array)
|
43
45
|
end
|
44
46
|
|
47
|
+
|
45
48
|
MARKER_HEADERS = MARKER_TYPES.each_with_object({}) do |(byte, (type, size)), headers|
|
46
49
|
headers[type] ||= {}
|
47
50
|
headers[type][size] = [byte].pack('C')
|
@@ -64,7 +67,7 @@ module Neo4j
|
|
64
67
|
else
|
65
68
|
case @object
|
66
69
|
when Date, Time, DateTime then string_stream
|
67
|
-
when Integer, Float, String, Symbol, Array, Structure, Hash
|
70
|
+
when Integer, Float, String, Symbol, Array, Set, Structure, Hash
|
68
71
|
send(@object.class.name.split('::').last.downcase + '_stream')
|
69
72
|
end
|
70
73
|
end
|
@@ -125,6 +128,8 @@ module Neo4j
|
|
125
128
|
end.join
|
126
129
|
end
|
127
130
|
|
131
|
+
alias set_stream array_stream
|
132
|
+
|
128
133
|
def structure_stream
|
129
134
|
fail 'Structure too big' if @object.list.size > 65_535
|
130
135
|
marker_string(0xB0, 0xDC, @object.list.size) + [@object.signature].pack('C') + @object.list.map do |e|
|
@@ -252,7 +257,6 @@ module Neo4j
|
|
252
257
|
Structure.new(shift_byte!, value_for_list!(size))
|
253
258
|
end
|
254
259
|
|
255
|
-
|
256
260
|
def shift_byte!
|
257
261
|
shift_bytes!(1).first unless depleted?
|
258
262
|
end
|
@@ -49,6 +49,10 @@ module Neo4j
|
|
49
49
|
@uri = self.class.uri_from_url!(url)
|
50
50
|
end
|
51
51
|
|
52
|
+
def url_without_password
|
53
|
+
@url_without_password ||= "#{scheme}://#{user + ':...@' if user}#{host}:#{port}"
|
54
|
+
end
|
55
|
+
|
52
56
|
included do
|
53
57
|
%w[scheme user password host port].each do |method|
|
54
58
|
define_method(method) do
|
@@ -177,9 +177,7 @@ module Neo4j
|
|
177
177
|
body_is_query_array = body.is_a?(Array) && body.all? { |o| o.respond_to?(:cypher) }
|
178
178
|
case body
|
179
179
|
when Hash, Array
|
180
|
-
if body_is_query_array
|
181
|
-
return {statements: body.map(&self.class.method(:statement_from_query))}
|
182
|
-
end
|
180
|
+
return {statements: body.map(&self.class.method(:statement_from_query))} if body_is_query_array
|
183
181
|
|
184
182
|
body
|
185
183
|
else
|
@@ -81,23 +81,6 @@ module Neo4j
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
-
def wrap_by_level(none_value)
|
85
|
-
case @wrap_level
|
86
|
-
when :none
|
87
|
-
if none_value.is_a?(Array)
|
88
|
-
none_value.map(&:symbolize_keys)
|
89
|
-
else
|
90
|
-
none_value.symbolize_keys
|
91
|
-
end
|
92
|
-
when :core_entity
|
93
|
-
yield
|
94
|
-
when :proc
|
95
|
-
yield.wrap
|
96
|
-
else
|
97
|
-
fail ArgumentError, "Invalid wrap_level: #{@wrap_level.inspect}"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
84
|
def wrap_node(id, labels, properties)
|
102
85
|
wrap_by_level(properties) { ::Neo4j::Core::Node.new(id, labels, properties) }
|
103
86
|
end
|
@@ -83,16 +83,18 @@ module Neo4j
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def wrap_value(entity)
|
86
|
-
|
86
|
+
case entity
|
87
|
+
when Java::ScalaCollectionConvert::Wrappers::MapWrapper
|
87
88
|
entity.each_with_object({}) { |(k, v), r| r[k.to_sym] = _wrap_entity(v) }
|
88
|
-
|
89
|
-
entity.is_a?(Java::OrgNeo4jKernelImplCore::RelationshipProxy)
|
89
|
+
when Java::OrgNeo4jKernelImplCore::NodeProxy, Java::OrgNeo4jKernelImplCore::RelationshipProxy
|
90
90
|
entity.property_keys.each_with_object({}) { |key, hash| hash[key.to_sym] = entity.get_property(key) }
|
91
|
-
elsif entity.respond_to?(:path_entities) || entity.is_a?(Java::ScalaCollectionConvert::Wrappers::SeqWrapper)
|
92
|
-
entity.to_a.map(&method(:_wrap_entity))
|
93
91
|
else
|
94
|
-
|
95
|
-
|
92
|
+
if entity.respond_to?(:path_entities) || entity.is_a?(Java::ScalaCollectionConvert::Wrappers::SeqWrapper)
|
93
|
+
entity.to_a.map(&method(:_wrap_entity))
|
94
|
+
else
|
95
|
+
# Convert from Java?
|
96
|
+
entity.is_a?(Hash) ? entity.symbolize_keys : entity
|
97
|
+
end
|
96
98
|
end
|
97
99
|
end
|
98
100
|
|
@@ -29,12 +29,11 @@ module Neo4j
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def wrap_entity(row_datum, rest_datum)
|
32
|
-
|
33
|
-
when rest_datum.is_a?(Array)
|
32
|
+
if rest_datum.is_a?(Array)
|
34
33
|
row_datum.zip(rest_datum).map { |row, rest| wrap_entity(row, rest) }
|
35
|
-
|
34
|
+
elsif ident = identify_entity(rest_datum)
|
36
35
|
send("wrap_#{ident}", rest_datum, row_datum)
|
37
|
-
|
36
|
+
elsif rest_datum.is_a?(Hash)
|
38
37
|
rest_datum.each_with_object({}) do |(k, v), result|
|
39
38
|
result[k.to_sym] = wrap_entity(row_datum[k], v)
|
40
39
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# TODO: Needed?
|
1
2
|
module Neo4j
|
2
3
|
module Core
|
3
4
|
module TxMethods
|
@@ -13,19 +14,5 @@ module Neo4j
|
|
13
14
|
end
|
14
15
|
end
|
15
16
|
end
|
16
|
-
|
17
|
-
module Config
|
18
|
-
def self.using_new_session?
|
19
|
-
ENV.key?('NEW_NEO4J_SESSIONS')
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.wrapping_level(level = nil)
|
23
|
-
if level.nil?
|
24
|
-
@wrapping_level || :core_entity
|
25
|
-
else
|
26
|
-
@wrapping_level = level
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
17
|
end
|
31
18
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copied largely from activerecord/lib/active_record/log_subscriber.rb
|
2
|
+
module Neo4j
|
3
|
+
module Core
|
4
|
+
module Logging
|
5
|
+
class << self
|
6
|
+
def first_external_path_and_line(callstack)
|
7
|
+
line = callstack.find do |frame|
|
8
|
+
frame.absolute_path && !ignored_callstack(frame.absolute_path)
|
9
|
+
end
|
10
|
+
|
11
|
+
offending_line = line || callstack.first
|
12
|
+
|
13
|
+
[offending_line.path,
|
14
|
+
offending_line.lineno]
|
15
|
+
end
|
16
|
+
|
17
|
+
NEO4J_CORE_GEM_ROOT = File.expand_path('../../..', __dir__) + '/'
|
18
|
+
|
19
|
+
def ignored_callstack(path)
|
20
|
+
paths_to_ignore.any?(&path.method(:start_with?))
|
21
|
+
end
|
22
|
+
|
23
|
+
def paths_to_ignore
|
24
|
+
@paths_to_ignore ||= [NEO4J_CORE_GEM_ROOT,
|
25
|
+
RbConfig::CONFIG['rubylibdir'],
|
26
|
+
neo4j_gem_path,
|
27
|
+
active_support_gem_path].compact
|
28
|
+
end
|
29
|
+
|
30
|
+
def neo4j_gem_path
|
31
|
+
return if !defined?(::Rails.root)
|
32
|
+
|
33
|
+
@neo4j_gem_path ||= File.expand_path('../../..', Neo4j::ActiveBase.method(:current_session).source_location[0])
|
34
|
+
end
|
35
|
+
|
36
|
+
def active_support_gem_path
|
37
|
+
return if !defined?(::ActiveSupport::Notifications)
|
38
|
+
|
39
|
+
@active_support_gem_path ||= File.expand_path('../../..', ActiveSupport::Notifications.method(:subscribe).source_location[0])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require 'neo4j
|
1
|
+
require 'neo4j/core/query_clauses'
|
2
|
+
require 'neo4j/core/query_find_in_batches'
|
2
3
|
require 'active_support/notifications'
|
3
4
|
|
4
5
|
module Neo4j
|
@@ -67,7 +68,7 @@ module Neo4j
|
|
67
68
|
end
|
68
69
|
|
69
70
|
def initialize(options = {})
|
70
|
-
@session = options
|
71
|
+
@session = options[:session]
|
71
72
|
|
72
73
|
@options = options
|
73
74
|
@clauses = []
|
@@ -174,9 +175,9 @@ module Neo4j
|
|
174
175
|
|
175
176
|
DEFINED_CLAUSES[clause.to_sym] = clause_class
|
176
177
|
define_method(clause) do |*args|
|
177
|
-
build_deeper_query(clause_class, args)
|
178
|
-
|
179
|
-
|
178
|
+
result = build_deeper_query(clause_class, args)
|
179
|
+
|
180
|
+
BREAK_METHODS.include?(clause) ? result.break : result
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
@@ -201,7 +202,7 @@ module Neo4j
|
|
201
202
|
# @example
|
202
203
|
# # Creates a query representing the cypher: MATCH (n:Person) SET n.age = 19
|
203
204
|
# Query.new.match(n: :Person).set_props(n: {age: 19})
|
204
|
-
def set_props(*args)
|
205
|
+
def set_props(*args) # rubocop:disable Naming/AccessorMethodName
|
205
206
|
build_deeper_query(SetClause, args, set_props: true)
|
206
207
|
end
|
207
208
|
|
@@ -30,7 +30,7 @@ module Neo4j
|
|
30
30
|
|
31
31
|
[String, Symbol, Integer, Hash, NilClass].each do |arg_class|
|
32
32
|
from_method = "from_#{arg_class.name.downcase}"
|
33
|
-
return @value = send(from_method, @arg) if @arg.is_a?(arg_class) &&
|
33
|
+
return @value = send(from_method, @arg) if @arg.is_a?(arg_class) && respond_to?(from_method)
|
34
34
|
end
|
35
35
|
|
36
36
|
fail ArgError
|
@@ -42,12 +42,10 @@ module Neo4j
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def from_hash(value)
|
45
|
-
if
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
else
|
50
|
-
fail ArgError
|
45
|
+
fail ArgError if !respond_to?(:from_key_and_value)
|
46
|
+
|
47
|
+
value.map do |k, v|
|
48
|
+
from_key_and_value k, v
|
51
49
|
end
|
52
50
|
end
|
53
51
|
|
@@ -64,9 +62,7 @@ module Neo4j
|
|
64
62
|
|
65
63
|
prefix_value = value
|
66
64
|
if value.is_a?(Hash)
|
67
|
-
prefix_value = if value.values.any? { |v| v.is_a?(Hash) }
|
68
|
-
value.keys.join(UNDERSCORE)
|
69
|
-
end
|
65
|
+
prefix_value = (value.keys.join(UNDERSCORE) if value.values.any? { |v| v.is_a?(Hash) })
|
70
66
|
end
|
71
67
|
|
72
68
|
prefix_array = [key, prefix_value].tap(&:compact!).join(UNDERSCORE)
|
@@ -107,7 +103,6 @@ module Neo4j
|
|
107
103
|
value.values.any? { |v| v.is_a?(Hash) }
|
108
104
|
end
|
109
105
|
|
110
|
-
|
111
106
|
def attributes_from_key_and_value(_key, value)
|
112
107
|
return nil unless value.is_a?(Hash)
|
113
108
|
|
@@ -150,7 +145,7 @@ module Neo4j
|
|
150
145
|
strings = clause_strings(clauses)
|
151
146
|
stripped_string = strings.join(join_string)
|
152
147
|
stripped_string.strip!
|
153
|
-
|
148
|
+
pretty && strings.size > 1 ? PRETTY_NEW_LINE + stripped_string : stripped_string
|
154
149
|
end
|
155
150
|
|
156
151
|
def clause_join
|
@@ -208,9 +203,7 @@ module Neo4j
|
|
208
203
|
end
|
209
204
|
|
210
205
|
def format_label(label_arg)
|
211
|
-
if label_arg.is_a?(Array)
|
212
|
-
return label_arg.map { |arg| format_label(arg) }.join
|
213
|
-
end
|
206
|
+
return label_arg.map { |arg| format_label(arg) }.join if label_arg.is_a?(Array)
|
214
207
|
|
215
208
|
label_arg = label_arg.to_s
|
216
209
|
label_arg.strip!
|
@@ -552,7 +545,7 @@ module Neo4j
|
|
552
545
|
from_string(value)
|
553
546
|
end
|
554
547
|
|
555
|
-
def from_nilclass(
|
548
|
+
def from_nilclass(_value)
|
556
549
|
''
|
557
550
|
end
|
558
551
|
|
@@ -24,10 +24,8 @@ module Neo4j
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def find_each(*args)
|
28
|
-
find_in_batches(*args)
|
29
|
-
batch.each { |result| yield result }
|
30
|
-
end
|
27
|
+
def find_each(*args, &block)
|
28
|
+
find_in_batches(*args) { |batch| batch.each(&block) }
|
31
29
|
end
|
32
30
|
|
33
31
|
private
|
@@ -41,7 +39,7 @@ module Neo4j
|
|
41
39
|
last_record.send(node_var).send(prop_var)
|
42
40
|
rescue NoMethodError
|
43
41
|
begin
|
44
|
-
last_record.send(node_var)[prop_var.to_sym]
|
42
|
+
last_record.send(node_var).properties[prop_var.to_sym]
|
45
43
|
rescue NoMethodError
|
46
44
|
last_record.send("#{node_var}.#{prop_var}") # In case we're explicitly returning it
|
47
45
|
end
|
data/lib/neo4j/transaction.rb
CHANGED
@@ -145,17 +145,15 @@ module Neo4j
|
|
145
145
|
# To support old syntax of providing run_in_tx first
|
146
146
|
# But session first is ideal
|
147
147
|
def session_and_run_in_tx_from_args(args)
|
148
|
+
fail ArgumentError, 'Too few arguments' if args.empty?
|
148
149
|
fail ArgumentError, 'Too many arguments' if args.size > 2
|
149
150
|
|
150
|
-
if args.
|
151
|
-
|
152
|
-
else
|
153
|
-
result = args.dup
|
154
|
-
if result.size == 1
|
155
|
-
result << ([true, false].include?(args[0]) ? Session.current! : true)
|
156
|
-
end
|
151
|
+
if args.size == 1
|
152
|
+
fail ArgumentError, 'Session must be specified' if !args[0].is_a?(Neo4j::Core::CypherSession)
|
157
153
|
|
158
|
-
[
|
154
|
+
[args[0], true]
|
155
|
+
else
|
156
|
+
[true, false].include?(args[0]) ? args.reverse : args.dup
|
159
157
|
end
|
160
158
|
end
|
161
159
|
|
data/neo4j-core.gemspec
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
lib = File.expand_path('
|
1
|
+
lib = File.expand_path('lib', __dir__)
|
2
2
|
$LOAD_PATH.unshift lib unless $LOAD_PATH.include?(lib)
|
3
3
|
|
4
|
-
require 'neo4j
|
4
|
+
require 'neo4j/core/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = 'neo4j-core'
|
8
8
|
s.version = Neo4j::Core::VERSION
|
9
|
-
s.required_ruby_version = '>= 1.
|
9
|
+
s.required_ruby_version = '>= 2.1.0'
|
10
10
|
|
11
11
|
s.authors = 'Andreas Ronge, Chris Grigg, Brian Underwood'
|
12
12
|
s.email = 'andreas.ronge@gmail.com, chris@subvertallmedia.com, brian@brian-underwood.codes'
|
@@ -14,9 +14,9 @@ Gem::Specification.new do |s|
|
|
14
14
|
s.summary = 'A basic library to work with the graph database Neo4j.'
|
15
15
|
s.license = 'MIT'
|
16
16
|
|
17
|
-
s.description = <<-
|
18
|
-
Neo4j-core provides classes and methods to work with the graph database Neo4j.
|
19
|
-
|
17
|
+
s.description = <<-DESCRIPTION
|
18
|
+
Neo4j-core provides classes and methods to work with the graph database Neo4j.
|
19
|
+
DESCRIPTION
|
20
20
|
|
21
21
|
s.require_path = 'lib'
|
22
22
|
s.files = Dir.glob('{bin,lib,config}/**/*') + %w[README.md Gemfile neo4j-core.gemspec]
|
@@ -38,19 +38,21 @@ Neo4j-core provides classes and methods to work with the graph database Neo4j.
|
|
38
38
|
s.add_dependency('httpclient')
|
39
39
|
s.add_dependency('json')
|
40
40
|
s.add_dependency('multi_json')
|
41
|
+
s.add_dependency('net_tcp_client', '>= 2.0.1')
|
41
42
|
s.add_dependency('typhoeus', '>= 1.1.2')
|
42
43
|
|
44
|
+
s.add_development_dependency('dryspec')
|
43
45
|
s.add_development_dependency('neo4j-rake_tasks', '>= 0.3.0')
|
44
46
|
s.add_development_dependency('pry')
|
45
47
|
s.add_development_dependency('simplecov')
|
46
48
|
s.add_development_dependency('yard')
|
47
49
|
|
48
50
|
if RUBY_PLATFORM == 'java'
|
49
|
-
s.
|
51
|
+
s.add_development_dependency('neo4j-community', '>= 2.1.1')
|
50
52
|
s.add_development_dependency 'ruby-debug'
|
51
|
-
else
|
52
|
-
s.add_development_dependency('guard')
|
53
|
-
s.add_development_dependency('guard-rubocop')
|
54
|
-
s.add_development_dependency('rubocop', '~> 0.49.1')
|
55
53
|
end
|
54
|
+
|
55
|
+
s.add_development_dependency('guard')
|
56
|
+
s.add_development_dependency('guard-rubocop')
|
57
|
+
s.add_development_dependency('rubocop', '~> 0.56.0')
|
56
58
|
end
|