neo4j 9.6.2 → 10.0.0.pre.alpha.1

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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +0 -13
  3. data/CONTRIBUTORS +4 -0
  4. data/Gemfile +2 -33
  5. data/lib/neo4j.rb +6 -2
  6. data/lib/neo4j/active_base.rb +19 -22
  7. data/lib/neo4j/active_node/has_n.rb +1 -1
  8. data/lib/neo4j/active_node/labels.rb +1 -11
  9. data/lib/neo4j/active_node/node_wrapper.rb +1 -1
  10. data/lib/neo4j/active_node/query/query_proxy_methods_of_mass_updating.rb +1 -1
  11. data/lib/neo4j/active_rel/rel_wrapper.rb +2 -2
  12. data/lib/neo4j/ansi.rb +14 -0
  13. data/lib/neo4j/core.rb +14 -0
  14. data/lib/neo4j/core/connection_failed_error.rb +6 -0
  15. data/lib/neo4j/core/cypher_error.rb +37 -0
  16. data/lib/neo4j/core/driver.rb +83 -0
  17. data/lib/neo4j/core/has_uri.rb +63 -0
  18. data/lib/neo4j/core/instrumentable.rb +36 -0
  19. data/lib/neo4j/core/label.rb +158 -0
  20. data/lib/neo4j/core/logging.rb +44 -0
  21. data/lib/neo4j/core/node.rb +23 -0
  22. data/lib/neo4j/core/querable.rb +88 -0
  23. data/lib/neo4j/core/query.rb +487 -0
  24. data/lib/neo4j/core/query_builder.rb +32 -0
  25. data/lib/neo4j/core/query_clauses.rb +727 -0
  26. data/lib/neo4j/core/query_find_in_batches.rb +49 -0
  27. data/lib/neo4j/core/relationship.rb +13 -0
  28. data/lib/neo4j/core/responses.rb +50 -0
  29. data/lib/neo4j/core/result.rb +33 -0
  30. data/lib/neo4j/core/schema.rb +30 -0
  31. data/lib/neo4j/core/schema_errors.rb +12 -0
  32. data/lib/neo4j/core/wrappable.rb +30 -0
  33. data/lib/neo4j/migration.rb +2 -2
  34. data/lib/neo4j/migrations/base.rb +1 -1
  35. data/lib/neo4j/model_schema.rb +2 -2
  36. data/lib/neo4j/railtie.rb +8 -52
  37. data/lib/neo4j/schema/operation.rb +1 -1
  38. data/lib/neo4j/shared.rb +1 -1
  39. data/lib/neo4j/shared/property.rb +1 -1
  40. data/lib/neo4j/tasks/migration.rake +5 -4
  41. data/lib/neo4j/transaction.rb +137 -0
  42. data/lib/neo4j/version.rb +1 -1
  43. data/neo4j.gemspec +5 -5
  44. metadata +59 -26
  45. data/bin/neo4j-jars +0 -33
  46. data/lib/neo4j/active_base/session_registry.rb +0 -12
  47. data/lib/neo4j/session_manager.rb +0 -78
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a03fea8bd94bd82ee1f7dc8379be2d7b32522255094efa953ee916dbbd98e24d
4
- data.tar.gz: 974ce13ddb60fd778a425aad98590d858af5ed3a1424f6f818bb28d3b72fd92f
3
+ metadata.gz: 7ad62d7a9aef94c37ee1bee3ec34b94aa539240ddaf7fb3d0bd6081685569d70
4
+ data.tar.gz: b1f6a1a5bb2acb59ddaa364141e80aaad3fcf6d978fdf4c0b4301b934abd27bd
5
5
  SHA512:
6
- metadata.gz: cbf90843f2a0d208170a8e232141d9e8f49a259b62e7d3ac51a23a951c906e9bb785105c49a8372198d0628cc70db25c64c40eeabec9bd6115d6694be2afaafb
7
- data.tar.gz: d956459329732c7578d2fb7a58754dbce96811145baec33bd9b83812e13a91311f9aa84065a0ba5d0c103e16aff4fe7b025ddca93556e5585d023ea3200ceac3
6
+ metadata.gz: b6af43cca75d102ee54a0869dc72fbe2ea3337c49999591d0072caaf9bbceac05b8de0dfb092d8adf5a8d1f3b86a3527344883ca06b3909ed4d88017be19b30e
7
+ data.tar.gz: '08b1201082c9bf09557a5cc890e4c92b7b2c9fa1e7bcbfb05851369f8ff6df42dadb84761a47cfb8cf164d976b7976beff404177a56d1b13e12a9d1dcc8f80e5'
data/CHANGELOG.md CHANGED
@@ -3,19 +3,6 @@ All notable changes to this project will be documented in this file.
3
3
  This file should follow the standards specified on [http://keepachangelog.com/]
4
4
  This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
- ## [9.6.2] 2020-04-09
7
-
8
- ## Fixes
9
-
10
- - Perform separate tranactions around schema-load and migrations-update
11
- to allow the seabolt driver to load schemas (#1599)
12
-
13
- ## [9.6.1] 2019-12-18
14
-
15
- ## Fixed
16
-
17
- - Fixed duplicate records with with_associations on QueryProxy. (#1576)
18
-
19
6
  ## [9.6.0] 2019-09-3
20
7
 
21
8
  ## Added
data/CONTRIBUTORS CHANGED
@@ -1,4 +1,8 @@
1
1
  Maintainers:
2
+ Heinrich Klobuczek <klobuczek @ GitHub>
3
+ Amit Suryanvanshi <amitsuryavanshi @ GitHub>
4
+
5
+ Previous Maintainers:
2
6
  Chris Grigg <subvertallchris @ GitHub>
3
7
  Brian Underwood <cheerfulstoic @ GitHub>
4
8
 
data/Gemfile CHANGED
@@ -2,47 +2,16 @@ source 'http://rubygems.org'
2
2
 
3
3
  gemspec
4
4
 
5
- # gem 'neo4j-core', github: 'neo4jrb/neo4j-core', branch: 'master' if ENV['CI']
6
-
7
- branch = ENV['NEO4J_CORE_BRANCH'] || ENV['TRAVIS_PULL_REQUEST_BRANCH'] || ENV['TRAVIS_BRANCH']
8
- slug = !ENV['TRAVIS_PULL_REQUEST_SLUG'].to_s.empty? ? ENV['TRAVIS_PULL_REQUEST_SLUG'] : ENV['TRAVIS_REPO_SLUG']
9
- if branch
10
- command = "curl --head https://github.com/#{slug}-core/tree/#{branch} | head -1"
11
- result = `#{command}`
12
- if result =~ /200 OK/
13
- gem 'neo4j-core', github: "#{slug}-core", branch: branch
14
- else
15
- gem 'neo4j-core', github: 'neo4jrb/neo4j-core', branch: 'master'
16
- end
17
- elsif ENV['USE_LOCAL_CORE']
18
- gem 'neo4j-core', path: '../neo4j-core'
19
- else
20
- gem 'neo4j-core'
21
- end
22
-
23
- # gem 'active_attr', github: 'neo4jrb/active_attr', branch: 'performance'
24
- # gem 'active_attr', path: '../active_attr'
5
+ # gem 'neo4j-ruby-driver', path: '../neo4j-ruby-driver'
25
6
 
26
7
  gem 'listen', '< 3.1'
27
8
 
28
9
  active_model_version = ENV['ACTIVE_MODEL_VERSION']
29
10
  gem 'activemodel', "~> #{active_model_version}" if active_model_version
30
11
 
31
- if RUBY_VERSION.to_f < 2.2
32
- gem 'activemodel', '~> 4.2'
33
- gem 'activesupport', '~> 4.2'
34
- gem 'railties', '~> 4.2'
35
- end
36
-
37
12
  group 'test' do
38
13
  gem 'coveralls', require: false
39
- if RUBY_VERSION.to_f < 2.0
40
- gem 'term-ansicolor', '< 1.4'
41
- gem 'tins', '< 1.7'
42
- gem 'overcommit', '< 0.35.0'
43
- else
44
- gem 'overcommit'
45
- end
14
+ gem 'overcommit'
46
15
  gem 'codecov', require: false
47
16
  gem 'simplecov', require: false
48
17
  gem 'simplecov-html', require: false
data/lib/neo4j.rb CHANGED
@@ -1,17 +1,17 @@
1
1
  require 'forwardable'
2
2
  require 'neo4j/version'
3
3
 
4
- require 'neo4j-core'
4
+ require 'neo4j/core'
5
5
  require 'neo4j/core/query_ext' # From this gem
6
6
 
7
7
  require 'neo4j/active_base'
8
8
  require 'neo4j/model_schema'
9
- require 'neo4j/active_base/session_registry'
10
9
 
11
10
  require 'active_model'
12
11
  require 'active_support/concern'
13
12
  require 'active_support/core_ext/class/attribute.rb'
14
13
  require 'active_support/core_ext/class/subclasses.rb'
14
+ require 'active_support/core_ext/module/attribute_accessors'
15
15
  require 'json'
16
16
 
17
17
  require 'neo4j/errors'
@@ -97,6 +97,10 @@ require 'neo4j/active_node/query'
97
97
  require 'neo4j/active_node/scope'
98
98
  require 'neo4j/active_node'
99
99
 
100
+ require 'active_support/concern'
101
+ require 'neo4j/core/cypher_error'
102
+ require 'neo4j/core/schema_errors'
103
+
100
104
  module Neo4j
101
105
  extend ActiveSupport::Autoload
102
106
  autoload :Migrations
@@ -4,8 +4,8 @@ module Neo4j
4
4
  module ActiveBase
5
5
  class << self
6
6
  # private?
7
- def current_session
8
- (SessionRegistry.current_session ||= establish_session).tap do |session|
7
+ def current_driver
8
+ (@driver ||= establish_session).tap do |session|
9
9
  fail 'No session defined!' if session.nil?
10
10
  end
11
11
  end
@@ -15,57 +15,59 @@ module Neo4j
15
15
  end
16
16
 
17
17
  def establish_session
18
- make_session_wrap!(@establish_session_block.call) if @establish_session_block
18
+ @establish_session_block.call if @establish_session_block
19
+ end
20
+
21
+ def new_driver(url, options = {})
22
+ verbose_query_logs = Neo4j::Config.fetch(:verbose_query_logs, false)
23
+ Neo4j::Core::Driver
24
+ .new(url, options.merge(verbose_query_logs: verbose_query_logs))
19
25
  end
20
26
 
21
27
  def current_transaction_or_session
22
- current_transaction || current_session
28
+ current_transaction || Transaction
23
29
  end
24
30
 
25
31
  def query(*args)
26
32
  current_transaction_or_session.query(*args)
27
33
  end
28
34
 
29
- # Should support setting session via config options
30
- def current_session=(session)
31
- SessionRegistry.current_session = make_session_wrap!(session)
32
- end
33
-
34
- def current_adaptor=(adaptor)
35
- self.current_session = Neo4j::Core::CypherSession.new(adaptor)
35
+ # Should support setting driver via config options
36
+ def driver=(driver)
37
+ @driver = driver
36
38
  end
37
39
 
38
40
  def run_transaction(run_in_tx = true)
39
- Neo4j::Transaction.run(current_session, run_in_tx) do |tx|
41
+ Neo4j::Transaction.run(current_driver, run_in_tx) do |tx|
40
42
  yield tx
41
43
  end
42
44
  end
43
45
 
44
46
  def new_transaction
45
47
  validate_model_schema!
46
- Neo4j::Transaction.new(current_session)
48
+ Neo4j::Transaction.new
47
49
  end
48
50
 
49
51
  def new_query(options = {})
50
52
  validate_model_schema!
51
- Neo4j::Core::Query.new({session: current_session}.merge(options))
53
+ Neo4j::Core::Query.new({session: current_driver}.merge(options))
52
54
  end
53
55
 
54
56
  def magic_query(*args)
55
57
  if args.empty? || args.map(&:class) == [Hash]
56
58
  ActiveBase.new_query(*args)
57
59
  else
58
- ActiveBase.current_session.query(*args)
60
+ ActiveBase.current_driver.query(*args)
59
61
  end
60
62
  end
61
63
 
62
64
  def current_transaction
63
65
  validate_model_schema!
64
- Neo4j::Transaction.current_for(current_session)
66
+ Neo4j::Transaction.root
65
67
  end
66
68
 
67
69
  def label_object(label_name)
68
- Neo4j::Core::Label.new(label_name, current_session)
70
+ Neo4j::Core::Label.new(label_name)
69
71
  end
70
72
 
71
73
  def logger
@@ -77,11 +79,6 @@ module Neo4j
77
79
  def validate_model_schema!
78
80
  Neo4j::ModelSchema.validate_model_schema! unless Neo4j::Migrations.currently_running_migrations
79
81
  end
80
-
81
- def make_session_wrap!(session)
82
- session.adaptor.instance_variable_get('@options')[:wrap_level] = :proc
83
- session
84
- end
85
82
  end
86
83
  end
87
84
  end
@@ -103,7 +103,7 @@ module Neo4j::ActiveNode
103
103
 
104
104
  def add_to_cache(object, rel = nil)
105
105
  (@cached_rels ||= []) << rel if rel
106
- (@cached_result ||= []).tap { |results| results << object unless results.include?(object) }
106
+ (@cached_result ||= []) << object
107
107
  end
108
108
 
109
109
  def rels
@@ -41,11 +41,6 @@ module Neo4j
41
41
  @_persisted_obj.labels.uniq!
42
42
  end
43
43
 
44
- # Remove this method in 9.0.0
45
- def add_label(*_labels)
46
- fail 'add_label has been removed in favor of `add_labels`'
47
- end
48
-
49
44
  # Removes one or more labels
50
45
  # Be careful, don't remove the label representing the Ruby class.
51
46
  # @see Neo4j-core
@@ -56,11 +51,6 @@ module Neo4j
56
51
  labels.each(&@_persisted_obj.labels.method(:delete))
57
52
  end
58
53
 
59
- # Remove this method in 9.0.0
60
- def remove_label(*_labels)
61
- fail 'remove_label has been removed in favor of `remove_labels`'
62
- end
63
-
64
54
  def self._wrapped_classes
65
55
  WRAPPED_CLASSES
66
56
  end
@@ -141,7 +131,7 @@ module Neo4j
141
131
 
142
132
  # @return [Neo4j::Label] the label for this class
143
133
  def mapped_label
144
- Neo4j::Core::Label.new(mapped_label_name, neo4j_session)
134
+ Neo4j::Core::Label.new(mapped_label_name)
145
135
  end
146
136
 
147
137
  def base_class
@@ -9,7 +9,7 @@ wrapping_proc = proc do |node|
9
9
  wrapped_node.init_on_load(node, node.props)
10
10
  end
11
11
  end
12
- Neo4j::Core::Node.wrapper_callback(wrapping_proc)
12
+ Neo4j::Driver::Types::Node.wrapper_callback(wrapping_proc)
13
13
 
14
14
  module Neo4j
15
15
  module NodeWrapping
@@ -27,7 +27,7 @@ module Neo4j
27
27
  query_with_target(identifier) do |target|
28
28
  begin
29
29
  self.query.with(target).optional_match("(#{target})-[#{target}_rel]-()").delete("#{target}, #{target}_rel").exec
30
- rescue Neo4j::Core::CypherSession::CypherError # <=- Seems hacky
30
+ rescue Neo4j::Core::CypherError # <=- Seems hacky
31
31
  self.query.delete(target).exec
32
32
  end
33
33
  clear_source_object_cache
@@ -3,7 +3,7 @@ require 'neo4j/core/relationship'
3
3
  wrapping_proc = proc do |relationship|
4
4
  Neo4j::RelWrapping.wrapper(relationship)
5
5
  end
6
- Neo4j::Core::Relationship.wrapper_callback(wrapping_proc)
6
+ Neo4j::Driver::Types::Relationship.wrapper_callback(wrapping_proc)
7
7
 
8
8
  module Neo4j
9
9
  module RelWrapping
@@ -24,7 +24,7 @@ module Neo4j
24
24
  end
25
25
 
26
26
  def class_from_type(rel_type)
27
- Neo4j::ActiveRel::Types::WRAPPED_CLASSES[rel_type] || Neo4j::ActiveRel::Types::WRAPPED_CLASSES[rel_type] = rel_type.to_s.camelize
27
+ Neo4j::ActiveRel::Types::WRAPPED_CLASSES[rel_type] || Neo4j::ActiveRel::Types::WRAPPED_CLASSES[rel_type] = rel_type.to_s.downcase.camelize
28
28
  end
29
29
  end
30
30
  end
data/lib/neo4j/ansi.rb ADDED
@@ -0,0 +1,14 @@
1
+ module Neo4j
2
+ module ANSI
3
+ CLEAR = "\e[0m"
4
+ BOLD = "\e[1m"
5
+
6
+ RED = "\e[31m"
7
+ GREEN = "\e[32m"
8
+ YELLOW = "\e[33m"
9
+ BLUE = "\e[34m"
10
+ MAGENTA = "\e[35m"
11
+ CYAN = "\e[36m"
12
+ WHITE = "\e[37m"
13
+ end
14
+ end
data/lib/neo4j/core.rb ADDED
@@ -0,0 +1,14 @@
1
+ require 'neo4j/transaction'
2
+ require 'neo4j/core/instrumentable'
3
+ require 'neo4j/core/query'
4
+ require 'neo4j/core/driver'
5
+ require 'neo4j/core/responses'
6
+
7
+ require 'neo4j_ruby_driver'
8
+ require 'neo4j/core/wrappable'
9
+ require 'neo4j/core/node'
10
+ require 'neo4j/core/relationship'
11
+
12
+ Neo4j::Driver::Types::Entity.include Neo4j::Core::Wrappable
13
+ Neo4j::Driver::Types::Node.prepend Neo4j::Core::Node
14
+ Neo4j::Driver::Types::Relationship.include Neo4j::Core::Relationship
@@ -0,0 +1,6 @@
1
+ module Neo4j
2
+ module Core
3
+ class ConnectionFailedError < StandardError;
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,37 @@
1
+ module Neo4j
2
+ module Core
3
+ class CypherError < StandardError
4
+ attr_reader :code, :original_message, :stack_trace
5
+
6
+ def initialize(code = nil, original_message = nil, stack_trace = nil)
7
+ @code = code
8
+ @original_message = original_message
9
+ @stack_trace = stack_trace
10
+
11
+ msg = <<-ERROR
12
+ Cypher error:
13
+ #{ANSI::CYAN}#{code}#{ANSI::CLEAR}: #{original_message}
14
+ #{stack_trace}
15
+ ERROR
16
+ super(msg)
17
+ end
18
+
19
+ def self.new_from(code, message, stack_trace = nil)
20
+ error_class_from(code).new(code, message, stack_trace)
21
+ end
22
+
23
+ def self.error_class_from(code)
24
+ case code
25
+ when /(ConstraintValidationFailed|ConstraintViolation)/
26
+ SchemaErrors::ConstraintValidationFailedError
27
+ when /IndexAlreadyExists/
28
+ SchemaErrors::IndexAlreadyExistsError
29
+ when /ConstraintAlreadyExists/ # ?????
30
+ SchemaErrors::ConstraintAlreadyExistsError
31
+ else
32
+ CypherError
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,83 @@
1
+ require 'active_support/core_ext/module/attribute_accessors'
2
+ require 'neo4j/core/logging'
3
+ require 'neo4j/core/has_uri'
4
+
5
+ module Neo4j
6
+ module Core
7
+ class Driver
8
+ include HasUri
9
+
10
+ USER_AGENT_STRING = "neo4j-gem/#{::Neo4j::VERSION} (https://github.com/neo4jrb/neo4j)"
11
+
12
+ cattr_reader :singleton
13
+ attr_accessor :wrap_level
14
+ attr_reader :options, :driver
15
+ delegate :close, to: :driver
16
+
17
+ @@mutex = Mutex.new
18
+ at_exit do
19
+ close
20
+ end
21
+
22
+ default_url('bolt://neo4:neo4j@localhost:7687')
23
+
24
+ validate_uri do |uri|
25
+ uri.scheme == 'bolt'
26
+ end
27
+
28
+ class << self
29
+ def singleton=(driver)
30
+ @@mutex.synchronize do
31
+ singleton&.close
32
+ class_variable_set(:@@singleton, driver)
33
+ end
34
+ end
35
+
36
+ def new_instance(url)
37
+ uri = URI(url)
38
+ user = uri.user
39
+ password = uri.password
40
+ auth_token = if user
41
+ Neo4j::Driver::AuthTokens.basic(user, password)
42
+ else
43
+ Neo4j::Driver::AuthTokens.none
44
+ end
45
+ Neo4j::Driver::GraphDatabase.driver(url, auth_token)
46
+ end
47
+
48
+ def close
49
+ singleton&.close
50
+ end
51
+ end
52
+
53
+ def initialize(url, options = {})
54
+ self.url = url
55
+ @driver = self.class.new_instance(url)
56
+ self.class.singleton = self
57
+ @options = options
58
+ end
59
+
60
+ def logger
61
+ return @logger if @logger
62
+
63
+ @logger = if @options[:logger]
64
+ @options[:logger]
65
+ else
66
+ Logger.new(logger_location).tap do |logger|
67
+ logger.level = logger_level
68
+ end
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def logger_location
75
+ @options[:logger_location] || STDOUT
76
+ end
77
+
78
+ def logger_level
79
+ @options[:logger_level] || Logger::WARN
80
+ end
81
+ end
82
+ end
83
+ end