activegraph 10.0.0.pre.alpha.6 → 10.0.0.pre.alpha.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '080320681eddb19c4c347525bd2aa1eb29c570084d341c6ec6ee4b66f1ab8480'
4
- data.tar.gz: edcfccffbedcd4c49504fb86241574d26e6c737b0ab12dac30947b99c792c4d1
3
+ metadata.gz: 2ee929286df7c03716620060ba6229dae865612f295c02e02872a8a1fa329c7f
4
+ data.tar.gz: 7d3983fc31041476a7cc6e0b92119b6c1e6ad1207ae5d1e6293871a92f9f865a
5
5
  SHA512:
6
- metadata.gz: 61fe3eb22783d399afd333bce3770621758162bbae701f3a6127c594b0268984899594a228c531bff717059390a57412eb92527bdae38312331b6a68a6be1479
7
- data.tar.gz: dfd1debd983d0e65e223d0a4c15779d39e3be8611aadc975f75298a90063fa735f7be248d79694694b06d8f66b2612f5478420d8d98ef7fd384d056632cadd70
6
+ metadata.gz: 582aedd1880e79fb5983774d2fea5456b247f8c72b57caa676de5b5272766f4e7db44c6de927c3899a23a5bc38a92ef4b71bffc782ba44facf9086d818ca9c58
7
+ data.tar.gz: 982dc47105a57220e1b1e09a1fb3ed18b47646dd9c7166cef754a30609e12f0487722b411b7efef2dcacc3fa5bb7ac149028b8ccb3d3c8abca4cb1b93f501d32
@@ -25,7 +25,7 @@ module Neo4j
25
25
  def new_driver(url, options = {})
26
26
  verbose_query_logs = Neo4j::Config.fetch(:verbose_query_logs, false)
27
27
  Neo4j::Core::Driver
28
- .new(url, options.merge(verbose_query_logs: verbose_query_logs))
28
+ .new(url, options, verbose_query_logs: verbose_query_logs)
29
29
  end
30
30
 
31
31
  def transaction
@@ -42,7 +42,7 @@ module Neo4j
42
42
  .with(other_node)
43
43
  .match("()#{association.arrow_cypher(:orphan_rel)}(#{other_node})")
44
44
  .with(other_node, count: 'count(*)')
45
- .where('count = {one}', one: 1)
45
+ .where('count = $one', one: 1)
46
46
  .break
47
47
  end
48
48
  end
@@ -66,7 +66,7 @@ module Neo4j::ActiveNode
66
66
  # @param [Array] labels The labels to use for creating the new node.
67
67
  # @return [Neo4j::Node] A CypherNode or EmbeddedNode
68
68
  def _create_node(node_props, labels = labels_for_create)
69
- query = "CREATE (n:`#{Array(labels).join('`:`')}`) SET n = {props} RETURN n"
69
+ query = "CREATE (n:`#{Array(labels).join('`:`')}`) SET n = $props RETURN n"
70
70
  neo4j_query(query, {props: node_props}, wrap_level: :core_entity).to_a[0].n
71
71
  end
72
72
 
@@ -23,7 +23,7 @@ module Neo4j
23
23
  # This method does not exist within QueryProxy and can only be used to start a new chain.
24
24
  #
25
25
  # @example Start a new QueryProxy chain with the first identifier set manually
26
- # # Generates: MATCH (s:`Student`), (l:`Lesson`), s-[rel1:`ENROLLED_IN`]->(l:`Lesson`) WHERE ID(s) = {neo_id_17963}
26
+ # # Generates: MATCH (s:`Student`), (l:`Lesson`), s-[rel1:`ENROLLED_IN`]->(l:`Lesson`) WHERE ID(s) = $neo_id_17963
27
27
  # student.as(:s).lessons(:l)
28
28
  #
29
29
  # @param [String, Symbol] node_var The identifier to use within the QueryProxy object
@@ -88,9 +88,9 @@ module Neo4j
88
88
  def include?(other, target = nil)
89
89
  query_with_target(target) do |var|
90
90
  where_filter = if other.respond_to?(:neo_id) || association_id_key == :neo_id
91
- "ID(#{var}) = {other_node_id}"
91
+ "ID(#{var}) = $other_node_id"
92
92
  else
93
- "#{var}.#{association_id_key} = {other_node_id}"
93
+ "#{var}.#{association_id_key} = $other_node_id"
94
94
  end
95
95
  node_id = other.respond_to?(:neo_id) ? other.neo_id : other
96
96
  self.where(where_filter).params(other_node_id: node_id).query.reorder.return("count(#{var}) as count").first.count > 0
@@ -287,7 +287,7 @@ module Neo4j
287
287
  def exists_query_start(condition, target)
288
288
  case condition
289
289
  when Integer
290
- self.where("ID(#{target}) = {exists_condition}").params(exists_condition: condition)
290
+ self.where("ID(#{target}) = $exists_condition").params(exists_condition: condition)
291
291
  when Hash
292
292
  self.where(condition.keys.first => condition.values.first)
293
293
  when String
@@ -21,7 +21,7 @@ module Neo4j
21
21
  end
22
22
 
23
23
  class << self
24
- def new_instance(url)
24
+ def new_instance(url, options = {})
25
25
  uri = URI(url)
26
26
  user = uri.user
27
27
  password = uri.password
@@ -30,14 +30,14 @@ module Neo4j
30
30
  else
31
31
  Neo4j::Driver::AuthTokens.none
32
32
  end
33
- Neo4j::Driver::GraphDatabase.driver(url, auth_token)
33
+ Neo4j::Driver::GraphDatabase.driver(url, auth_token, options)
34
34
  end
35
35
  end
36
36
 
37
- def initialize(url, options = {})
37
+ def initialize(url, options = {}, extended_options = {})
38
38
  self.url = url
39
- @driver = self.class.new_instance(url)
40
- @options = options
39
+ @driver = self.class.new_instance(url, options.merge(encryption: false))
40
+ @options = extended_options
41
41
  end
42
42
 
43
43
  def logger
@@ -48,11 +48,13 @@ module Neo4j
48
48
  def drop_constraint(property, constraint)
49
49
  cypher = case constraint[:type]
50
50
  when :unique, :uniqueness
51
- "DROP CONSTRAINT ON (n:`#{name}`) ASSERT n.`#{property}` IS UNIQUE"
51
+ "n.`#{property}` IS UNIQUE"
52
+ when :exists
53
+ "exists(n.`#{property}`)"
52
54
  else
53
55
  fail "Not supported constraint #{constraint.inspect}"
54
56
  end
55
- schema_query(cypher)
57
+ schema_query("DROP CONSTRAINT ON (n:`#{name}`) ASSERT #{cypher}")
56
58
  end
57
59
 
58
60
  def drop_uniqueness_constraint(property, options = {})
@@ -65,25 +67,10 @@ module Neo4j
65
67
  end
66
68
  end
67
69
 
68
- def self.indexes
69
- Neo4j::Transaction.indexes
70
- end
71
-
72
70
  def drop_indexes
73
71
  self.class.drop_indexes
74
72
  end
75
73
 
76
- def self.drop_indexes
77
- indexes.each do |definition|
78
- begin
79
- Neo4j::Transaction.query("DROP INDEX ON :`#{definition[:label]}`(#{definition[:properties][0]})")
80
- rescue Neo4j::Server::CypherResponse::ResponseError
81
- # This will error on each constraint. Ignore and continue.
82
- next
83
- end
84
- end
85
- end
86
-
87
74
  def index?(property)
88
75
  indexes.any? { |definition| definition[:properties] == [property.to_sym] }
89
76
  end
@@ -100,16 +87,6 @@ module Neo4j
100
87
  end
101
88
  end
102
89
 
103
- def drop_uniqueness_constraints
104
- self.class.drop_uniqueness_constraints
105
- end
106
-
107
- def self.drop_uniqueness_constraints
108
- Neo4j::Transaction.constraints.each do |definition|
109
- Neo4j::Transaction.query("DROP CONSTRAINT ON (n:`#{definition[:label]}`) ASSERT n.`#{definition[:properties][0]}` IS UNIQUE")
110
- end
111
- end
112
-
113
90
  def constraint?(property)
114
91
  constraints.any? { |definition| definition[:properties] == [property.to_sym] }
115
92
  end
@@ -118,11 +95,6 @@ module Neo4j
118
95
  uniqueness_constraints.include?([property])
119
96
  end
120
97
 
121
- def self.wait_for_schema_changes
122
- schema_threads.map(&:join)
123
- set_schema_threads(session, [])
124
- end
125
-
126
98
  private
127
99
 
128
100
  # Store schema threads on the session so that we can easily wait for all
@@ -136,6 +108,35 @@ module Neo4j
136
108
  end
137
109
 
138
110
  class << self
111
+ def indexes
112
+ Neo4j::Transaction.indexes
113
+ end
114
+
115
+ def drop_indexes
116
+ indexes.each do |definition|
117
+ begin
118
+ Neo4j::Transaction.query("DROP INDEX ON :`#{definition[:label]}`(#{definition[:properties][0]})")
119
+ rescue Neo4j::Driver::Exceptions::DatabaseException
120
+ # This will error on each constraint. Ignore and continue.
121
+ next
122
+ end
123
+ end
124
+ end
125
+
126
+ def drop_constraints
127
+ Neo4j::Transaction.named_constraints.each do |constraint|
128
+ Neo4j::Transaction.query("DROP CONSTRAINT #{constraint.name}")
129
+ end
130
+ Neo4j::Transaction.constraints.each do |definition|
131
+ Neo4j::Transaction.query("DROP CONSTRAINT ON (n:`#{definition[:label]}`) ASSERT n.`#{definition[:properties][0]}` IS UNIQUE")
132
+ end
133
+ end
134
+
135
+ def wait_for_schema_changes
136
+ schema_threads.map(&:join)
137
+ set_schema_threads(session, [])
138
+ end
139
+
139
140
  def schema_threads
140
141
  Neo4j::Transaction.instance_variable_get('@_schema_threads') || []
141
142
  end
@@ -216,10 +216,10 @@ module Neo4j
216
216
 
217
217
  # Allows for the specification of values for params specified in query
218
218
  # @example
219
- # # Creates a query representing the cypher: MATCH (q: Person {id: {id}})
219
+ # # Creates a query representing the cypher: MATCH (q: Person {id: $id})
220
220
  # # Calls to params don't affect the cypher query generated, but the params will be
221
221
  # # Passed down when the query is made
222
- # Query.new.match('(q: Person {id: {id}})').params(id: 12)
222
+ # Query.new.match('(q: Person {id: $id})').params(id: 12)
223
223
  #
224
224
  def params(args)
225
225
  copy.tap { |new_query| new_query.instance_variable_get('@params'.freeze).add_params(args) }
@@ -188,13 +188,13 @@ module Neo4j
188
188
 
189
189
  param = add_param(param, value)
190
190
 
191
- "#{key} #{array_value?(value, is_set) ? 'IN' : '='} {#{param}}"
191
+ "#{key} #{array_value?(value, is_set) ? 'IN' : '='} $#{param}"
192
192
  end
193
193
  end
194
194
 
195
195
  def range_key_value_string(key, value, previous_keys, param)
196
196
  begin_param, end_param = add_params("#{param}_range_min" => value.begin, "#{param}_range_max" => value.end)
197
- "#{key} >= {#{begin_param}} AND #{previous_keys[-2]}.#{key} <#{'=' unless value.exclude_end?} {#{end_param}}"
197
+ "#{key} >= $#{begin_param} AND #{previous_keys[-2]}.#{key} <#{'=' unless value.exclude_end?} $#{end_param}"
198
198
  end
199
199
 
200
200
  def array_value?(value, is_set)
@@ -221,7 +221,7 @@ module Neo4j
221
221
  else
222
222
  param_key = "#{prefix}#{key}".gsub(/:+/, '_')
223
223
  param_key = add_param(param_key, value)
224
- "#{key}: {#{param_key}}"
224
+ "#{key}: $#{param_key}"
225
225
  end
226
226
  end.join(Clause::COMMA_SPACE)
227
227
 
@@ -306,7 +306,7 @@ module Neo4j
306
306
 
307
307
  param = add_param(param, pattern)
308
308
 
309
- "#{key} =~ {#{param}}"
309
+ "#{key} =~ $#{param}"
310
310
  end
311
311
 
312
312
  class << self
@@ -320,7 +320,7 @@ module Neo4j
320
320
  params.add_params(params_arg)
321
321
  else
322
322
  param_var = params.add_params(question_mark_param: params_arg)[0]
323
- query_string = query_string.gsub(ARG_HAS_QUESTION_MARK_REGEX, "\\1{#{param_var}}\\2")
323
+ query_string = query_string.gsub(ARG_HAS_QUESTION_MARK_REGEX, "\\1$#{param_var}\\2")
324
324
  end
325
325
 
326
326
  [from_arg(query_string, params, options)]
@@ -456,7 +456,7 @@ module Neo4j
456
456
  end
457
457
 
458
458
  class CreateUniqueClause < CreateClause
459
- KEYWORD = 'CREATE UNIQUE'
459
+ KEYWORD = 'MERGE'
460
460
  end
461
461
 
462
462
  class MergeClause < CreateClause
@@ -536,7 +536,7 @@ module Neo4j
536
536
  def from_string(value)
537
537
  param_var = "#{self.class.keyword_downcase}_#{value}"
538
538
  param_var = add_param(param_var, value.to_i)
539
- "{#{param_var}}"
539
+ "$#{param_var}"
540
540
  end
541
541
 
542
542
  def from_integer(value)
@@ -566,13 +566,13 @@ module Neo4j
566
566
  def from_string(value)
567
567
  clause_id = "#{self.class.keyword_downcase}_#{value}"
568
568
  clause_id = add_param(clause_id, value.to_i)
569
- "{#{clause_id}}"
569
+ "$#{clause_id}"
570
570
  end
571
571
 
572
572
  def from_integer(value)
573
573
  clause_id = "#{self.class.keyword_downcase}_#{value}"
574
574
  clause_id = add_param(clause_id, value)
575
- "{#{clause_id}}"
575
+ "$#{clause_id}"
576
576
  end
577
577
 
578
578
  class << self
@@ -597,7 +597,7 @@ module Neo4j
597
597
  when Hash
598
598
  if @options[:set_props]
599
599
  param = add_param("#{key}_set_props", value)
600
- "#{key} = {#{param}}"
600
+ "#{key} = $#{param}"
601
601
  else
602
602
  value.map { |k, v| key_value_string("#{key}.`#{k}`", v, ['setter'], true) }
603
603
  end
@@ -19,7 +19,7 @@ module Neo4j
19
19
  break if records_size < batch_size
20
20
 
21
21
  primary_key_var = Neo4j::Core::QueryClauses::Clause.from_key_and_single_value(node_var, prop_var)
22
- records = query.where("#{primary_key_var} > {primary_key_offset}")
22
+ records = query.where("#{primary_key_var} > $primary_key_offset")
23
23
  .params(primary_key_offset: primary_key_offset).to_a
24
24
  end
25
25
  end
@@ -12,19 +12,50 @@ module Neo4j
12
12
  result = query('CALL db.indexes()', {}, skip_instrumentation: true)
13
13
 
14
14
  result.map do |row|
15
- label, property = row.description.match(/INDEX ON :([^\(]+)\(([^\)]+)\)/)[1, 2]
16
- { type: row.type.to_sym, label: label.to_sym, properties: [property.to_sym], state: row.state.to_sym }
15
+ { type: row.type.to_sym, label: label(result, row), properties: properties(row), state: row.state.to_sym }
17
16
  end
18
17
  end
19
18
 
20
19
  def constraints
21
20
  result = query('CALL db.indexes()', {}, skip_instrumentation: true)
22
21
 
23
- result.select { |row| row.type == 'node_unique_property' }.map do |row|
24
- label, property = row.description.match(/INDEX ON :([^\(]+)\(([^\)]+)\)/)[1, 2]
25
- { type: :uniqueness, label: label.to_sym, properties: [property.to_sym] }
22
+ result.select(&method(v4?(result) ? :v4_filter : :v3_filter)).map do |row|
23
+ { type: :uniqueness, label: label(result, row), properties: properties(row) }
26
24
  end
27
25
  end
26
+
27
+ def named_constraints
28
+ result = query('CALL db.constraints()', {}, skip_instrumentation: true)
29
+ result.columns.include?(:name) ? result : []
30
+ end
31
+
32
+ private
33
+
34
+ def v4_filter(row)
35
+ row.uniqueness == 'UNIQUE'
36
+ end
37
+
38
+ def v3_filter(row)
39
+ row.type == 'node_unique_property'
40
+ end
41
+
42
+ def label(result, row)
43
+ (v34?(result) ? row.label : (v4?(result) ? row.labelsOrTypes : row.tokenNames).first).to_sym
44
+ end
45
+
46
+ def v4?(result)
47
+ return @v4 unless @v4.nil?
48
+ @v4 = result.columns.include?(:labelsOrTypes)
49
+ end
50
+
51
+ def v34?(result)
52
+ return @v34 unless @v34.nil?
53
+ @v34 = result.columns.include?(:label)
54
+ end
55
+
56
+ def properties(row)
57
+ row.properties.map(&:to_sym)
58
+ end
28
59
  end
29
60
  end
30
61
  end
@@ -10,14 +10,26 @@ module Neo4j
10
10
  force = options[:force] || false
11
11
  type = options[:type] || :uniqueness
12
12
  label_object = ActiveBase.label_object(label)
13
- fail_duplicate_constraint_or_index!(:constraint, label, property) if !force && label_object.constraint?(property)
13
+ if label_object.constraint?(property)
14
+ if force
15
+ label_object.drop_constraint(property, type: type)
16
+ else
17
+ fail_duplicate_constraint_or_index!(:constraint, label, property)
18
+ end
19
+ end
14
20
  label_object.create_constraint(property, type: type)
15
21
  end
16
22
 
17
23
  def add_index(label, property, options = {})
18
24
  force = options[:force] || false
19
25
  label_object = ActiveBase.label_object(label)
20
- fail_duplicate_constraint_or_index!(:index, label, property) if !force && label_object.index?(property)
26
+ if label_object.index?(property)
27
+ if force
28
+ label_object.drop_index(property)
29
+ else
30
+ fail_duplicate_constraint_or_index!(:index, label, property)
31
+ end
32
+ end
21
33
  label_object.create_index(property)
22
34
  end
23
35
 
data/lib/neo4j/railtie.rb CHANGED
@@ -70,7 +70,7 @@ module Neo4j
70
70
  end
71
71
 
72
72
  def default_session_path_or_url
73
- ENV['NEO4J_URL'] || ENV['NEO4J_PATH'] || 'http://localhost:7474'
73
+ ENV['NEO4J_URL'] || ENV['NEO4J_PATH'] || 'bolt://localhost:7474'
74
74
  end
75
75
 
76
76
  def yaml_config_data
@@ -237,7 +237,7 @@ module Neo4j::Shared
237
237
 
238
238
  def increment_by_query!(match_query, attribute, by, element_name = :n)
239
239
  new_attribute = match_query.with(element_name)
240
- .set("#{element_name}.`#{attribute}` = COALESCE(#{element_name}.`#{attribute}`, 0) + {by}")
240
+ .set("#{element_name}.`#{attribute}` = COALESCE(#{element_name}.`#{attribute}`, 0) + $by")
241
241
  .params(by: by).limit(1)
242
242
  .pluck("#{element_name}.`#{attribute}`").first
243
243
  return false unless new_attribute
@@ -47,7 +47,7 @@ module Neo4j::Shared
47
47
 
48
48
  def match_query
49
49
  base_query
50
- .match(match_string).where("ID(#{identifier}) = {#{identifier_id}}")
50
+ .match(match_string).where("ID(#{identifier}) = $#{identifier_id}")
51
51
  .params(identifier_id.to_sym => graph_object.neo_id)
52
52
  end
53
53
 
@@ -70,7 +70,7 @@ module Neo4j::Shared
70
70
  def create_query
71
71
  return match_query if graph_object.persisted?
72
72
  labels = graph_object.labels_for_create.map { |l| ":`#{l}`" }.join
73
- base_query.create("(#{identifier}#{labels} {#{identifier}_params})").params(identifier_params => graph_object.props_for_create)
73
+ base_query.create("(#{identifier}#{labels} $#{identifier}_params)").params(identifier_params => graph_object.props_for_create)
74
74
  end
75
75
  end
76
76
 
@@ -84,9 +84,9 @@ module Neo4j::Shared
84
84
  def create_query
85
85
  return match_query if graph_object.persisted?
86
86
  create_props, set_props = filtered_props
87
- base_query.send(graph_object.create_method, query_string).break
88
- .set(identifier => set_props)
89
- .params(:"#{identifier}_create_props" => create_props)
87
+ base_query.send(graph_object.create_method, query_string(create_props)).break
88
+ .set(identifier => set_props)
89
+ .params(params(create_props))
90
90
  end
91
91
 
92
92
  private
@@ -95,8 +95,28 @@ module Neo4j::Shared
95
95
  Neo4j::Shared::FilteredHash.new(graph_object.props_for_create, graph_object.creates_unique_option).filtered_base
96
96
  end
97
97
 
98
- def query_string
99
- "(#{graph_object.from_node_identifier})-[#{identifier}:`#{graph_object.type}` {#{identifier}_create_props}]->(#{graph_object.to_node_identifier})"
98
+ def query_string(create_props)
99
+ "(#{graph_object.from_node_identifier})-[#{identifier}:`#{graph_object.type}` #{pattern(create_props)}]->(#{graph_object.to_node_identifier})"
100
+ end
101
+
102
+ def params(create_props)
103
+ unique? ? create_props.transform_keys { |key| scoped(key).to_sym } : { namespace.to_sym => create_props }
104
+ end
105
+
106
+ def unique?
107
+ graph_object.create_method == :create_unique
108
+ end
109
+
110
+ def pattern(create_props)
111
+ unique? ? "{#{create_props.keys.map { |key| "#{key}: $#{scoped(key)}" }.join(', ')}}" : "$#{namespace}"
112
+ end
113
+
114
+ def scoped(key)
115
+ "#{namespace}_#{key}"
116
+ end
117
+
118
+ def namespace
119
+ "#{identifier}_create_props"
100
120
  end
101
121
  end
102
122
  end
data/lib/neo4j/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Neo4j
2
- VERSION = '10.0.0-alpha.6'
2
+ VERSION = '10.0.0-alpha.7'
3
3
  end
data/neo4j.gemspec CHANGED
@@ -40,7 +40,7 @@ DESCRIPTION
40
40
  s.add_development_dependency('guard-rspec')
41
41
  s.add_development_dependency('guard-rubocop')
42
42
  s.add_development_dependency('neo4j-rake_tasks', '>= 0.3.0')
43
- s.add_development_dependency("neo4j-#{RUBY_PLATFORM =~ /java/ ? 'java' : 'ruby'}-driver", '>= 0.1.10')
43
+ s.add_development_dependency("neo4j-#{RUBY_PLATFORM =~ /java/ ? 'java' : 'ruby'}-driver", '>= 0.3.0')
44
44
  s.add_development_dependency('os')
45
45
  s.add_development_dependency('pry')
46
46
  s.add_development_dependency('railties', '>= 4.0')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activegraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.0.pre.alpha.6
4
+ version: 10.0.0.pre.alpha.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Ronge, Brian Underwood, Chris Grigg, Heinrich Klobuczek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-01-26 00:00:00.000000000 Z
11
+ date: 2020-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - ">="
130
130
  - !ruby/object:Gem::Version
131
- version: 0.1.10
131
+ version: 0.3.0
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
- version: 0.1.10
138
+ version: 0.3.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: os
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -414,7 +414,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
414
414
  - !ruby/object:Gem::Version
415
415
  version: 1.3.1
416
416
  requirements: []
417
- rubygems_version: 3.0.3
417
+ rubygems_version: 3.0.6
418
418
  signing_key:
419
419
  specification_version: 4
420
420
  summary: A graph database for Ruby