activegraph 10.0.0.pre.beta.8 → 10.0.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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +25 -4
  3. data/README.md +21 -17
  4. data/activegraph.gemspec +1 -1
  5. data/lib/active_graph/class_arguments.rb +1 -1
  6. data/lib/active_graph/core.rb +5 -6
  7. data/lib/active_graph/core/entity.rb +11 -0
  8. data/lib/active_graph/core/node.rb +3 -11
  9. data/lib/active_graph/node/has_n.rb +1 -1
  10. data/lib/active_graph/node/has_n/association.rb +1 -1
  11. data/lib/active_graph/node/initialize.rb +1 -1
  12. data/lib/active_graph/node/labels.rb +3 -3
  13. data/lib/active_graph/node/node_wrapper.rb +1 -1
  14. data/lib/active_graph/node/persistence.rb +3 -3
  15. data/lib/active_graph/node/query/query_proxy.rb +1 -1
  16. data/lib/active_graph/node/query/query_proxy_eager_loading.rb +1 -1
  17. data/lib/active_graph/node/query/query_proxy_methods.rb +1 -1
  18. data/lib/active_graph/node/query/query_proxy_methods_of_mass_updating.rb +8 -19
  19. data/lib/active_graph/railtie.rb +17 -16
  20. data/lib/active_graph/relationship.rb +1 -1
  21. data/lib/active_graph/relationship/initialize.rb +3 -3
  22. data/lib/active_graph/relationship/persistence.rb +5 -5
  23. data/lib/active_graph/relationship/persistence/query_factory.rb +1 -1
  24. data/lib/active_graph/relationship/property.rb +1 -4
  25. data/lib/active_graph/relationship/query.rb +2 -2
  26. data/lib/active_graph/relationship/rel_wrapper.rb +5 -5
  27. data/lib/active_graph/relationship/types.rb +6 -8
  28. data/lib/active_graph/shared/attributes.rb +1 -1
  29. data/lib/active_graph/shared/callbacks.rb +1 -1
  30. data/lib/active_graph/shared/declared_properties.rb +2 -2
  31. data/lib/active_graph/shared/identity.rb +1 -1
  32. data/lib/active_graph/shared/mass_assignment.rb +1 -2
  33. data/lib/active_graph/shared/persistence.rb +8 -8
  34. data/lib/active_graph/shared/property.rb +1 -1
  35. data/lib/active_graph/shared/query_factory.rb +1 -1
  36. data/lib/active_graph/shared/type_converters.rb +27 -0
  37. data/lib/active_graph/undeclared_properties.rb +1 -1
  38. data/lib/active_graph/version.rb +1 -1
  39. data/lib/rails/generators/active_graph/model/templates/migration.erb +2 -0
  40. metadata +12 -12
  41. data/lib/active_graph/core/relationship.rb +0 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca2e28b863dbc266bb8f33c14507f473a476beea1076effcae5348179df07950
4
- data.tar.gz: 4f4757827f9ece88a3944cfa64bacdc0ee4ca7d5abc82aad98ea01c4cf421969
3
+ metadata.gz: e434fda5c1ab2cf1ad9d3d859cec6fc31d7b076fefcf3ead00dd5890849436a1
4
+ data.tar.gz: 1d0827473f9f6c0e6000fd0da3175f6721c1e11d146734b58d9a3c216502b973
5
5
  SHA512:
6
- metadata.gz: 9b9174c954408a250198d647b2146d200728ae4ff54247ebca82c6c5fa375854dfeec47f05b4cc2fdc8ac28f2adba0d08b5b745f0079d08425edb4eefb4e55f3
7
- data.tar.gz: efb7332fc14cc7acddb6dde5eba71e6b975b37bcbe53dc15098e89d02009d4e585c150dfd924d2a745d1a33e64c727bbfe9e603f7b9cac5895efd1b566f44ace
6
+ metadata.gz: d260e538a8121c313d08a51893a773ba2e7e6d7c6f0cf9e1a99f2f28da656c5192779e408f02cb7c8f399e9dbe427ed67ff6df5cf2f406a727ebb2259549c113
7
+ data.tar.gz: 40b4a2bbdc71d888447f9b2c057cdb3d0c5b5f75f783e6a61fa04defc8916908e7dc3aee2f09c8261bd9e851c67c270b1eef920fff1039cdaa68d4a023291dff
@@ -3,11 +3,32 @@ 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
- ## [10.0.x] 2020-01-23
6
+ ## [10.0.1] 2020-07-26
7
7
 
8
- - Executing relationship callbacks on relationship deletion.
9
- - When assiging relationships, preserving earlier relationships.
10
- - Enforcing has one constraint on relationships.
8
+ ## Fixed
9
+
10
+ - fixed incorrect id comparison, which could result in lost relationships (https://github.com/neo4jrb/activegraph/issues/1611)
11
+ - brought back BigDecimalConverter
12
+ - fixed rails template (Thanks @ekampp)
13
+
14
+ ## [10.0.0] 2020-07-06
15
+
16
+ - neo4j 4.0 support (default database only)
17
+ - dropped support for neo4j 3.3 or earlier
18
+ - full bolt support
19
+ - full causal cluster support
20
+ - removal of http support
21
+ - removal of embedded support (neo4j embedded is still supported via bolt)
22
+ - support for a neo4j ruby driver with an api of the official drivers
23
+ - discontinuation of the ``neo4j-core`` gem. Its functionality is replaced partially by ``neo4j-ruby-driver`` and
24
+ partially by ``activegraph``
25
+ - higher naming consistency with ``activerecord`` and the official ``neo4j-java-driver``
26
+ - configuration more consistent with ``activerecord``
27
+ - changed transaction API
28
+ - support for sessions with bookmarks and read and write transaction
29
+ - enforcing has one constraint on relationships
30
+ - better handling of has_many (no deletion and recreation)
31
+ - executing association callbacks on relationship deletion
11
32
 
12
33
  ## [9.6.1] 2019-12-18
13
34
 
data/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
 
12
12
  ### Documentation
13
13
 
14
- All new documentation will be done via our [readthedocs](http://neo4jrb.readthedocs.org) site, though some old documentation has yet to be moved from our [wiki](https://github.com/neo4jrb/neo4j/wiki) (also there is the [neo4j-core wiki](https://github.com/neo4jrb/neo4j-core/wiki))
14
+ All new documentation will be done via our [readthedocs](http://neo4jrb.readthedocs.org) site, though some old documentation has yet to be moved from our [wiki](https://github.com/neo4jrb/neo4j/wiki)
15
15
 
16
16
  ### Contact Us
17
17
 
@@ -45,27 +45,31 @@ Neo4j.rb v4.1.0 was released in January of 2015. Its changes are outlined [here]
45
45
 
46
46
  ## Neo4j version support
47
47
 
48
- | **Neo4j Version** | v2.x | v3.x | >= v4.x | >= 7.0.3 |
49
- |-------------------|------|-------|---------|----------|
50
- | 1.9.x | Yes | No | No | No |
51
- | 2.0.x | No | Yes | No | No |
52
- | 2.1.x | No | Yes | Yes * | Yes |
53
- | 2.2.x | No | No | Yes | Yes |
54
- | 2.3.x | No | No | Yes | Yes |
55
- | >= 3.0.0 | No | No | No | Yes |
48
+ | **Neo4j Version** | v2.x | v3.x | >= v4.x | >= 7.0.3 | activegraph 10.0 |
49
+ |-------------------|------|-------|---------|----------|------------------|
50
+ | 1.9.x | Yes | No | No | No | No |
51
+ | 2.0.x | No | Yes | No | No | No |
52
+ | 2.1.x | No | Yes | Yes * | Yes | No |
53
+ | 2.2.x | No | No | Yes | Yes | No |
54
+ | 2.3.x | No | No | Yes | Yes | No |
55
+ | 3.0, 3.1, 3.3 | No | No | No | Yes | No |
56
+ | 3.4, 3.5 | No | No | No | Yes | Yes |
57
+ | 4.0 | No | No | No | No | Yes |
58
+ | 4.1 | No | No | No | No | No |
56
59
 
57
60
  `*` Neo4j.rb >= 4.x doesn't support Neo4j versions before 2.1.5. To use 2.1.x you should upgrade to a version >= 2.1.5
58
61
 
59
62
  ## Neo4j feature support
60
63
 
61
- | **Neo4j Feature** | v2.x | v3.x | >= v4.x | >= 8.x |
62
- |----------------------------|--------|------|---------|--------|
63
- | Bolt Protocol | No | No | No | Yes |
64
- | Auth | No | No | Yes | Yes |
65
- | Remote Cypher | Yes | Yes | Yes | Yes |
66
- | Transactions | Yes | Yes | Yes | Yes |
67
- | High Availability | No | Yes | Yes | Yes |
68
- | Embedded JVM support | Yes | Yes | Yes | Yes |
64
+ | **Neo4j Feature** | v2.x | v3.x | >= v4.x | >= 8.x | activegraph 10.0 |
65
+ |----------------------------|--------|------|---------|--------|------------------|
66
+ | Bolt Protocol | No | No | No | Yes | Yes |
67
+ | Auth | No | No | Yes | Yes | Yes |
68
+ | Remote Cypher | Yes | Yes | Yes | Yes | No |
69
+ | Transactions | Yes | Yes | Yes | Yes | Yes |
70
+ | High Availability | No | Yes | Yes | Yes | Yes |
71
+ | Causal Cluster | No | No | No | No | Yes |
72
+ | Embedded JVM support | Yes | Yes | Yes | Yes | via bolt only |
69
73
 
70
74
  ## Documentation
71
75
 
@@ -38,7 +38,7 @@ DESCRIPTION
38
38
  s.add_development_dependency('guard-rspec')
39
39
  s.add_development_dependency('guard-rubocop')
40
40
  s.add_development_dependency('neo4j-rake_tasks', '>= 0.3.0')
41
- s.add_development_dependency("neo4j-#{ENV['driver'] == 'java' ? 'java' : 'ruby'}-driver", '>= 0.4.0')
41
+ s.add_development_dependency("neo4j-#{ENV['driver'] == 'java' ? 'java' : 'ruby'}-driver", '~> 1.7.0')
42
42
  s.add_development_dependency('os')
43
43
  s.add_development_dependency('pry')
44
44
  s.add_development_dependency('railties', '>= 4.0')
@@ -1,7 +1,7 @@
1
1
  module ActiveGraph
2
2
  module ClassArguments
3
3
  class << self
4
- INVALID_CLASS_ARGUMENT_ERROR = 'option must by String, Symbol, false, nil, or an Array of Symbols/Strings'
4
+ INVALID_CLASS_ARGUMENT_ERROR = 'option must be String, Symbol, false, nil, or an Array of Symbols/Strings'
5
5
 
6
6
  def valid_argument?(class_argument)
7
7
  [NilClass, String, Symbol, FalseClass].include?(class_argument.class) ||
@@ -1,15 +1,14 @@
1
- require 'active_graph/transaction'
2
1
  require 'active_graph/core/instrumentable'
2
+ require 'active_graph/core/entity'
3
+ require 'active_graph/core/node'
3
4
  require 'active_graph/core/query'
4
5
  require 'active_graph/core/record'
5
-
6
- require 'neo4j_ruby_driver'
7
6
  require 'active_graph/core/wrappable'
8
- require 'active_graph/core/node'
9
- require 'active_graph/core/relationship'
7
+ require 'active_graph/transaction'
8
+ require 'neo4j_ruby_driver'
10
9
 
11
10
  Neo4j::Driver::Types::Entity.include ActiveGraph::Core::Wrappable
11
+ Neo4j::Driver::Types::Entity.prepend ActiveGraph::Core::Entity
12
12
  Neo4j::Driver::Types::Node.prepend ActiveGraph::Core::Node
13
- Neo4j::Driver::Types::Relationship.include ActiveGraph::Core::Relationship
14
13
  Neo4j::Driver::StatementResult.prepend ActiveGraph::Core::Result
15
14
  Neo4j::Driver::Record.prepend ActiveGraph::Core::Record
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveGraph
4
+ module Core
5
+ module Entity
6
+ def properties
7
+ @properties ||= super
8
+ end
9
+ end
10
+ end
11
+ end
@@ -1,23 +1,15 @@
1
- require 'active_graph/core/wrappable'
1
+ # frozen_string_literal: true
2
2
 
3
3
  module ActiveGraph
4
4
  module Core
5
5
  module Node
6
- def props; properties; end
7
- # Perhaps we should deprecate this?
8
- def neo_id; id; end
9
-
10
- def ==(other)
11
- other.is_a?(Node) && neo_id == other.neo_id
6
+ def neo_id
7
+ id
12
8
  end
13
9
 
14
10
  def labels
15
11
  @labels ||= super
16
12
  end
17
-
18
- def properties
19
- @properties ||= super
20
- end
21
13
  end
22
14
  end
23
15
  end
@@ -402,7 +402,7 @@ module ActiveGraph::Node
402
402
  #
403
403
  # This would define the methods: ``#vehicle``, ``#vehicle=``, and ``.vehicle``.
404
404
  #
405
- # See :ref:`#has_many <Neo4j/Node/HasN/ClassMethods#has_many>` for anything
405
+ # See :ref:`#has_many <ActiveGraph/Node/HasN/ClassMethods#has_many>` for anything
406
406
  # not specified here
407
407
  #
408
408
  def has_one(direction, name, options = {}) # rubocop:disable Naming/PredicateName
@@ -121,7 +121,7 @@ module ActiveGraph
121
121
  attr_reader :relationship_class_name
122
122
 
123
123
  def relationship_class_type
124
- relationship_class._type.to_sym
124
+ relationship_class.type.to_sym
125
125
  end
126
126
 
127
127
  def relationship_class
@@ -16,6 +16,6 @@ module ActiveGraph::Node::Initialize
16
16
 
17
17
  def init_on_reload(reloaded)
18
18
  @attributes = nil
19
- init_on_load(reloaded, reloaded.props)
19
+ init_on_load(reloaded, reloaded.properties)
20
20
  end
21
21
  end
@@ -21,7 +21,7 @@ module ActiveGraph
21
21
  class RecordNotFound < ActiveGraph::RecordNotFound; end
22
22
 
23
23
  # @return the labels
24
- # @see Neo4j-core
24
+ # @see ActiveGraph::Core
25
25
  def labels
26
26
  @_persisted_obj.labels
27
27
  end
@@ -32,7 +32,7 @@ module ActiveGraph
32
32
  # end
33
33
 
34
34
  # adds one or more labels
35
- # @see Neo4j-core
35
+ # @see ActiveGraph::Core
36
36
  def add_labels(*labels)
37
37
  labels.inject(query_as(:n)) do |query, label|
38
38
  query.set("n:`#{label}`")
@@ -43,7 +43,7 @@ module ActiveGraph
43
43
 
44
44
  # Removes one or more labels
45
45
  # Be careful, don't remove the label representing the Ruby class.
46
- # @see Neo4j-core
46
+ # @see ActiveGraph::Core
47
47
  def remove_labels(*labels)
48
48
  labels.inject(query_as(:n)) do |query, label|
49
49
  query.remove("n:`#{label}`")
@@ -6,7 +6,7 @@ wrapping_proc = proc do |node|
6
6
  next node if not found_class
7
7
 
8
8
  found_class.new.tap do |wrapped_node|
9
- wrapped_node.init_on_load(node, node.props)
9
+ wrapped_node.init_on_load(node, node.properties)
10
10
  end
11
11
  end
12
12
  Neo4j::Driver::Types::Node.wrapper_callback(wrapping_proc)
@@ -30,8 +30,8 @@ module ActiveGraph::Node
30
30
  end
31
31
 
32
32
  # Increments concurrently a numeric attribute by a centain amount
33
- # @param [Symbol, String] name of the attribute to increment
34
- # @param [Integer, Float] amount to increment
33
+ # @param [Symbol, String] attribute name of the attribute to increment
34
+ # @param [Integer, Float] by amount to increment
35
35
  def concurrent_increment!(attribute, by = 1)
36
36
  increment_by_query! query_as(:n), attribute, by
37
37
  end
@@ -55,7 +55,7 @@ module ActiveGraph::Node
55
55
  # @return true
56
56
  def create_model
57
57
  node = _create_node(props_for_create)
58
- init_on_load(node, node.props)
58
+ init_on_load(node, node.properties)
59
59
  @deferred_nodes = nil
60
60
  true
61
61
  end
@@ -16,7 +16,7 @@ module ActiveGraph
16
16
  attr_reader :source_object, :association, :model, :starting_query
17
17
 
18
18
  # QueryProxy is Node's Cypher DSL. While the name might imply that it creates queries in a general sense,
19
- # it is actually referring to <tt>ActiveGraph::Core::Query</tt>, which is a pure Ruby Cypher DSL provided by the <tt>neo4j-core</tt> gem.
19
+ # it is actually referring to <tt>ActiveGraph::Core::Query</tt>, which is a pure Ruby Cypher DSL provided by the <tt>activegraph</tt> gem.
20
20
  # QueryProxy provides ActiveRecord-like methods for common patterns. When it's not handling CRUD for relationships and queries, it
21
21
  # provides Node's association chaining (`student.lessons.teachers.where(age: 30).hobbies`) and enjoys long walks on the
22
22
  # beach.
@@ -62,7 +62,7 @@ module ActiveGraph
62
62
  if rel.is_a?(ActiveGraph::Relationship)
63
63
  rel.instance_variable_set(direction == :in ? '@from_node' : '@to_node', node)
64
64
  end
65
- @_cache[direction == :out ? rel.start_node_neo_id : rel.end_node_neo_id]
65
+ @_cache[direction == :out ? rel.start_node_id : rel.end_node_id]
66
66
  .association_proxy(element.name).add_to_cache(node, rel)
67
67
  end
68
68
 
@@ -82,7 +82,7 @@ module ActiveGraph
82
82
 
83
83
  alias blank? empty?
84
84
 
85
- # @param [ActiveGraph::Node, ActiveGraph::Node, String] other An instance of a Neo4j.rb model, a Neo4j-core node, or a string uuid
85
+ # @param [ActiveGraph::Node, ActiveGraph::Node, String] other An instance of a Neo4j.rb model, a core node, or a string uuid
86
86
  # @param [String, Symbol] target An identifier of a link in the Cypher chain
87
87
  # @return [Boolean]
88
88
  def include?(other, target = nil)
@@ -49,31 +49,20 @@ module ActiveGraph
49
49
  # Deletes the relationships between all nodes for the last step in the QueryProxy chain and replaces them with relationships to the given nodes.
50
50
  # Executed in the database, callbacks will not be run.
51
51
  def replace_with(node_or_nodes)
52
- node_hash = idify_hash(node_or_nodes)
52
+ node_or_nodes = Array(node_or_nodes).map { |arg| arg.is_a?(ActiveGraph::Node) ? arg : @model.find(arg) }
53
53
  original_ids = self.pluck(:id)
54
- new_nodes = add_rels(node_hash, original_ids)
55
- delete_rels_for_nodes(original_ids - node_hash.keys)
56
- new_nodes | node_hash.values
54
+ delete_rels_for_nodes(original_ids, node_or_nodes.collect(&:id))
55
+ add_rels(node_or_nodes, original_ids)
57
56
  end
58
57
 
59
- def idify_hash(args)
60
- Array(args).reject(&:blank?).flatten.each_with_object({}).with_index do |(arg, hash), inx|
61
- if arg.is_a?(Integer) || arg.is_a?(String)
62
- hash[arg.to_i] = @model.find(arg)
63
- else
64
- key = arg.persisted? ? arg.id : "tmp_#{inx}"
65
- hash[key] = arg
66
- end
67
- end
68
- end
69
-
70
- def add_rels(node_hash, original_ids)
71
- (node_hash.keys - original_ids).map do |id|
72
- node_hash[id] if _create_relation_or_defer(node_hash[id])
58
+ def add_rels(node_or_nodes, original_ids)
59
+ node_or_nodes.map do |obj|
60
+ obj if original_ids.include?(obj.id) || _create_relation_or_defer(obj)
73
61
  end.compact
74
62
  end
75
63
 
76
- def delete_rels_for_nodes(ids)
64
+ def delete_rels_for_nodes(original_ids, new_ids)
65
+ ids = original_ids.select { |id| !new_ids.include?(id) }
77
66
  return unless ids.present?
78
67
  if association.dependent
79
68
  start_object.public_send("dependent_#{association.dependent}_callback", association, ids)
@@ -2,12 +2,13 @@ require 'active_support/notifications'
2
2
  require 'rails/railtie'
3
3
  # Need the action_dispatch railtie to have action_dispatch.rescue_responses initialized correctly
4
4
  require 'action_dispatch/railtie'
5
+ require 'active_graph'
5
6
 
6
7
  module ActiveGraph
7
8
  class Railtie < ::Rails::Railtie
8
9
  def empty_config
9
10
  ActiveSupport::OrderedOptions.new.tap do |cfg|
10
- cfg.driver = ActiveSupport::OrderedOptions.new.tap { |cfg| cfg.config = ActiveSupport::OrderedOptions.new }
11
+ cfg.driver = ActiveSupport::OrderedOptions.new
11
12
  end
12
13
  end
13
14
 
@@ -58,29 +59,29 @@ module ActiveGraph
58
59
  end
59
60
  end
60
61
 
61
- def setup!(neo4j_config = empty_config)
62
- url, path, auth_token, username, password, config =
63
- final_driver_config!(neo4j_config).values_at(:url, :path, :auth_token, :username, :password, :config)
62
+ def setup!(config = empty_config)
63
+ config = final_driver_config!(config)
64
+ scheme = config.delete(:scheme) || 'bolt'
65
+ host = config.delete(:host) || 'localhost'
66
+ port = config.delete(:port) || 7687
67
+ url = config.delete(:url) || URI::Generic.build( scheme: scheme, host: host, port: port ).to_s
68
+ username = config.delete(:username)
69
+ password = config.delete(:password)
70
+ auth_token = config.delete(:auth_token)
64
71
  auth_token ||= username ? Neo4j::Driver::AuthTokens.basic(username, password) : Neo4j::Driver::AuthTokens.none
65
72
  register_neo4j_cypher_logging
66
73
 
67
- Neo4j::Driver::GraphDatabase.driver(url || path || default_driver_path_or_url, auth_token, config)
74
+ method = url.is_a?(Enumerable) ? :routing_driver : :driver
75
+ Neo4j::Driver::GraphDatabase.send(method, url, auth_token, config)
68
76
  end
69
77
 
70
- def final_driver_config!(neo4j_config)
71
- (neo4j_config[:driver].empty? ? yaml_config_data : neo4j_config[:driver]).dup
72
- end
73
-
74
- def default_driver_path_or_url
75
- ENV['NEO4J_URL'] || ENV['NEO4J_PATH'] || 'bolt://localhost:7474'
78
+ def final_driver_config!(config)
79
+ { url: ENV['NEO4J_URL'] }.compact.merge(config[:driver]).merge(yaml_config_data)
76
80
  end
77
81
 
78
82
  def yaml_config_data
79
- @yaml_config_data ||= if yaml_path
80
- HashWithIndifferentAccess.new(YAML.load(ERB.new(yaml_path.read).result)[Rails.env])
81
- else
82
- {}
83
- end
83
+ @yaml_config_data ||=
84
+ yaml_path ? YAML.load(ERB.new(yaml_path.read).result)[Rails.env].transform_keys!(&:to_sym) : {}
84
85
  end
85
86
 
86
87
  def yaml_path
@@ -4,7 +4,7 @@ module ActiveGraph
4
4
  module Relationship
5
5
  extend ActiveSupport::Concern
6
6
 
7
- MARSHAL_INSTANCE_VARIABLES = [:@attributes, :@rel_type, :@_persisted_obj]
7
+ MARSHAL_INSTANCE_VARIABLES = [:@attributes, :@type, :@_persisted_obj]
8
8
 
9
9
  include ActiveGraph::Shared
10
10
  include ActiveGraph::Relationship::Initialize
@@ -9,10 +9,10 @@ module ActiveGraph::Relationship
9
9
  # @param [ActiveGraph::Relationship] to_node_id The neo_id of the ending node of this rel
10
10
  # @param [String] type the relationship type
11
11
  def init_on_load(persisted_rel, from_node_id, to_node_id, type)
12
- @rel_type = type
12
+ @type = type
13
13
  @_persisted_obj = persisted_rel
14
14
  changed_attributes_clear!
15
- @attributes = convert_and_assign_attributes(persisted_rel.props)
15
+ @attributes = convert_and_assign_attributes(persisted_rel.properties)
16
16
  load_nodes(from_node_id, to_node_id)
17
17
  end
18
18
 
@@ -21,7 +21,7 @@ module ActiveGraph::Relationship
21
21
  init_on_load(unwrapped_reloaded,
22
22
  unwrapped_reloaded.start_node_id,
23
23
  unwrapped_reloaded.end_node_id,
24
- unwrapped_reloaded.rel_type)
24
+ unwrapped_reloaded.type)
25
25
  self
26
26
  end
27
27
  end
@@ -37,8 +37,8 @@ module ActiveGraph::Relationship
37
37
  end
38
38
 
39
39
  # Increments concurrently a numeric attribute by a centain amount
40
- # @param [Symbol, String] name of the attribute to increment
41
- # @param [Integer, Float] amount to increment
40
+ # @param [Symbol, String] attribute name of the attribute to increment
41
+ # @param [Integer, Float] by amount to increment
42
42
  def concurrent_increment!(attribute, by = 1)
43
43
  increment_by_query! query_as(:r), attribute, by, :r
44
44
  end
@@ -47,8 +47,8 @@ module ActiveGraph::Relationship
47
47
  validate_node_classes!
48
48
  delete_has_one_rel
49
49
  rel = _create_rel
50
- return self unless rel.respond_to?(:props)
51
- init_on_load(rel, from_node, to_node, @rel_type)
50
+ return self unless rel.respond_to?(:properties)
51
+ init_on_load(rel, from_node, to_node, @type)
52
52
  true
53
53
  end
54
54
 
@@ -65,7 +65,7 @@ module ActiveGraph::Relationship
65
65
 
66
66
  module ClassMethods
67
67
  # Creates a new relationship between objects
68
- # @param [Hash] props the properties the new relationship should have
68
+ # @param [Hash] args the properties the new relationship should have
69
69
  def create(*args)
70
70
  new(*args).tap(&:save)
71
71
  end
@@ -85,7 +85,7 @@ module ActiveGraph::Relationship::Persistence
85
85
  def wrap!(node, res, key)
86
86
  return if node.persisted? || !res.keys.include?(key)
87
87
  unwrapped = res[key]
88
- node.init_on_load(unwrapped, unwrapped.props)
88
+ node.init_on_load(unwrapped, unwrapped.properties)
89
89
  end
90
90
 
91
91
  def node_symbols
@@ -17,16 +17,13 @@ module ActiveGraph::Relationship
17
17
  alias end_node to_node
18
18
 
19
19
  %w(start_node end_node).each do |direction|
20
- define_method("#{direction}_neo_id") { send(direction).neo_id if direction }
20
+ define_method("#{direction}_id") { send(direction).neo_id if direction }
21
21
  end
22
- alias from_node_neo_id start_node_neo_id
23
- alias to_node_neo_id end_node_neo_id
24
22
 
25
23
  # @return [String] a string representing the relationship type that will be created
26
24
  def type
27
25
  self.class.type
28
26
  end
29
- alias rel_type type
30
27
 
31
28
  def initialize(attributes = nil)
32
29
  super(attributes)
@@ -51,12 +51,12 @@ module ActiveGraph::Relationship
51
51
 
52
52
  def where_query
53
53
  deprecation_warning!
54
- ActiveGraph::Base.new_query.match("#{cypher_string(:outbound)}-[r1:`#{self._type}`]->#{cypher_string(:inbound)}")
54
+ ActiveGraph::Base.new_query.match("#{cypher_string(:outbound)}-[r1:`#{type}`]->#{cypher_string(:inbound)}")
55
55
  end
56
56
 
57
57
  def all_query
58
58
  deprecation_warning!
59
- ActiveGraph::Base.new_query.match("#{cypher_string}-[r1:`#{self._type}`]->#{cypher_string(:inbound)}")
59
+ ActiveGraph::Base.new_query.match("#{cypher_string}-[r1:`#{type}`]->#{cypher_string(:inbound)}")
60
60
  end
61
61
 
62
62
  def cypher_string(dir = :outbound)
@@ -1,4 +1,4 @@
1
- require 'active_graph/core/relationship'
1
+ # frozen_string_literal: true
2
2
 
3
3
  wrapping_proc = proc do |relationship|
4
4
  ActiveGraph::RelWrapping.wrapper(relationship)
@@ -9,9 +9,9 @@ module ActiveGraph
9
9
  module RelWrapping
10
10
  class << self
11
11
  def wrapper(rel)
12
- rel.props.symbolize_keys!
12
+ rel.properties.symbolize_keys!
13
13
  begin
14
- most_concrete_class = class_from_type(rel.rel_type).constantize
14
+ most_concrete_class = class_from_type(rel.type).constantize
15
15
  return rel unless most_concrete_class < ActiveGraph::Relationship
16
16
  most_concrete_class.new
17
17
  rescue NameError => e
@@ -23,8 +23,8 @@ module ActiveGraph
23
23
  end
24
24
  end
25
25
 
26
- def class_from_type(rel_type)
27
- ActiveGraph::Relationship::Types::WRAPPED_CLASSES[rel_type] || ActiveGraph::Relationship::Types::WRAPPED_CLASSES[rel_type] = rel_type.to_s.downcase.camelize
26
+ def class_from_type(type)
27
+ ActiveGraph::Relationship::Types::WRAPPED_CLASSES[type] || ActiveGraph::Relationship::Types::WRAPPED_CLASSES[type] = type.to_s.downcase.camelize
28
28
  end
29
29
  end
30
30
  end
@@ -14,7 +14,7 @@ module ActiveGraph
14
14
  # and Lesson is 'EnrolledIn'." After all, that is a big part of why we have models, right? To make our lives easier?
15
15
  #
16
16
  # A model is added to WRAPPED_CLASSES when it is initalized AND when the `type` class method is called within a model. This means that
17
- # it's possible a model will be added twice: once with the rel_type version of the model name, again with the custom type. deal_with_it.gif.
17
+ # it's possible a model will be added twice: once with the type version of the model name, again with the custom type. deal_with_it.gif.
18
18
  WRAPPED_CLASSES = {}
19
19
 
20
20
  included do
@@ -34,16 +34,14 @@ module ActiveGraph
34
34
  # @param [Boolean] auto Should the given_type be changed in compliance with the gem's rel decorator setting?
35
35
  def type(given_type = nil, auto = false)
36
36
  case
37
- when !given_type && rel_type?
38
- @rel_type
37
+ when !given_type && type?
38
+ @type
39
39
  when given_type
40
40
  assign_type!(given_type, auto)
41
41
  else
42
42
  assign_type!(namespaced_model_name, true)
43
43
  end
44
44
  end
45
- alias rel_type type
46
- alias _type type # should be deprecated
47
45
 
48
46
  def namespaced_model_name
49
47
  case ActiveGraph::Config[:module_handling]
@@ -65,14 +63,14 @@ module ActiveGraph
65
63
  _wrapped_classes[type.to_sym] = self.name
66
64
  end
67
65
 
68
- def rel_type?
69
- !!@rel_type
66
+ def type?
67
+ !!@type
70
68
  end
71
69
 
72
70
  private
73
71
 
74
72
  def assign_type!(given_type, auto)
75
- @rel_type = (auto ? decorated_rel_type(given_type) : given_type).tap do |type|
73
+ @type = (auto ? decorated_rel_type(given_type) : given_type).tap do |type|
76
74
  add_wrapped_class(type)
77
75
  end
78
76
  end
@@ -189,7 +189,7 @@ module ActiveGraph::Shared
189
189
 
190
190
  # Assign a set of attribute definitions, used when subclassing models
191
191
  #
192
- # @param [Array<ActiveGraph::Shared::DeclaredProperties>] The Array of
192
+ # @param [Array<ActiveGraph::Shared::DeclaredProperties>] attributes The Array of
193
193
  # AttributeDefinition instances
194
194
  def attributes=(attributes)
195
195
  @attributes = attributes
@@ -9,7 +9,7 @@ module ActiveGraph
9
9
 
10
10
  included do
11
11
  include ActiveModel::Validations::Callbacks
12
- # after_find is triggered by the `find` method defined in lib/neo4j/node/id_property.rb
12
+ # after_find is triggered by the `find` method defined in lib/active_graph/node/id_property.rb
13
13
  define_model_callbacks :initialize, :find, only: :after
14
14
  define_model_callbacks :create_commit, :update_commit, :destroy_commit, only: :after
15
15
  define_model_callbacks :save, :create, :update, :destroy, :touch
@@ -75,7 +75,7 @@ module ActiveGraph::Shared
75
75
  end.freeze
76
76
  end
77
77
 
78
- # During object wrapping, a props hash is built with string keys but Neo4j-core provides symbols.
78
+ # During object wrapping, a props hash is built with string keys but ActiveGraph::Core provides symbols.
79
79
  # Rather than a `to_s` or `symbolize_keys` during every load, we build a map of symbol-to-string
80
80
  # to speed up the process. This increases memory used by the gem but reduces object allocation and GC, so it is faster
81
81
  # in practice.
@@ -174,7 +174,7 @@ module ActiveGraph::Shared
174
174
  (value.is_a?(Array) && supports_array?(key)) || !EXCLUDED_TYPES.include?(value.class)
175
175
  end
176
176
 
177
- # @param [Symbol] key An undeclared property value found in the _persisted_obj.props hash.
177
+ # @param [Symbol] key An undeclared property value found in the _persisted_obj.properties hash.
178
178
  # Typically, this is a node's id property, which will not be registered as other properties are.
179
179
  # In the future, this should probably be reworked a bit. This class should either not know or care
180
180
  # about the id property or it should be in charge of it. In the meantime, this improves
@@ -14,7 +14,7 @@ module ActiveGraph
14
14
 
15
15
  # @return [Integer, nil] the neo4j id of the node if persisted or nil
16
16
  def neo_id
17
- _persisted_obj ? _persisted_obj.neo_id : nil
17
+ _persisted_obj ? _persisted_obj.id : nil
18
18
  end
19
19
 
20
20
  def id
@@ -19,9 +19,8 @@ module ActiveGraph::Shared
19
19
  # person.first_name #=> "Chris"
20
20
  # person.last_name #=> "Griego"
21
21
  #
22
- # @param [Hash{#to_s => Object}, #each] attributes Attributes used to
22
+ # @param [Hash{#to_s => Object}, #each] new_attributes Attributes used to
23
23
  # populate the model
24
- # @param [Hash, #[]] options Options that affect mass assignment
25
24
  def assign_attributes(new_attributes = nil)
26
25
  return unless new_attributes.present?
27
26
  new_attributes.each do |name, value|
@@ -13,7 +13,7 @@ module ActiveGraph::Shared
13
13
  return if skip_update?
14
14
  props = props_for_update
15
15
  neo4j_query(query_as(:n).set(n: props))
16
- _persisted_obj.props.merge!(props)
16
+ _persisted_obj.properties.merge!(props)
17
17
  changed_attributes_clear!
18
18
  end
19
19
 
@@ -46,8 +46,8 @@ module ActiveGraph::Shared
46
46
  end
47
47
 
48
48
  # Increments a numeric attribute by a centain amount
49
- # @param [Symbol, String] name of the attribute to increment
50
- # @param [Integer, Float] amount to increment
49
+ # @param [Symbol, String] attribute name of the attribute to increment
50
+ # @param [Integer, Float] by amount to increment
51
51
  def increment(attribute, by = 1)
52
52
  self[attribute] ||= 0
53
53
  self[attribute] += by
@@ -55,15 +55,15 @@ module ActiveGraph::Shared
55
55
  end
56
56
 
57
57
  # Convenience method to increment numeric attribute and #save at the same time
58
- # @param [Symbol, String] name of the attribute to increment
59
- # @param [Integer, Float] amount to increment
58
+ # @param [Symbol, String] attribute name of the attribute to increment
59
+ # @param [Integer, Float] by amount to increment
60
60
  def increment!(attribute, by = 1)
61
61
  increment(attribute, by).update_attribute(attribute, self[attribute])
62
62
  end
63
63
 
64
64
  # Increments concurrently a numeric attribute by a centain amount
65
- # @param [Symbol, String] name of the attribute to increment
66
- # @param [Integer, Float] amount to increment
65
+ # @param [Symbol, String] _attribute name of the attribute to increment
66
+ # @param [Integer, Float] _by amount to increment
67
67
  def concurrent_increment!(_attribute, _by = 1)
68
68
  fail 'not_implemented'
69
69
  end
@@ -197,7 +197,7 @@ module ActiveGraph::Shared
197
197
  db_values = props_for_db(hash)
198
198
  neo4j_query(query_as(:n).set(n: db_values))
199
199
  db_values.each_pair { |k, v| self.public_send(:"#{k}=", v) }
200
- _persisted_obj.props.merge!(db_values)
200
+ _persisted_obj.properties.merge!(db_values)
201
201
  changed_attributes_selective_clear!(db_values)
202
202
  true
203
203
  end
@@ -132,7 +132,7 @@ module ActiveGraph::Shared
132
132
  # Defines a property on the class
133
133
  #
134
134
  # See active_attr gem for allowed options, e.g which type
135
- # Notice, in Neo4j you don't have to declare properties before using them, see the neo4j-core api.
135
+ # Notice, in ActiveGraph you don't have to declare properties before using them, see the ActiveGraph::Coree api.
136
136
  #
137
137
  # @example Without type
138
138
  # class Person
@@ -18,7 +18,7 @@ module ActiveGraph::Shared
18
18
  case
19
19
  when graph_obj.respond_to?(:labels_for_create)
20
20
  NodeQueryFactory
21
- when graph_obj.respond_to?(:rel_type)
21
+ when graph_obj.respond_to?(:type)
22
22
  RelQueryFactory
23
23
  else
24
24
  fail "Unable to find factory for #{graph_obj}"
@@ -69,6 +69,33 @@ module ActiveGraph::Shared
69
69
  end
70
70
  end
71
71
 
72
+ class BigDecimalConverter < BaseConverter
73
+ class << self
74
+ def convert_type
75
+ BigDecimal
76
+ end
77
+
78
+ def db_type
79
+ String
80
+ end
81
+
82
+ def to_db(value)
83
+ case value
84
+ when Rational
85
+ value.to_f.to_d
86
+ when respond_to?(:to_d)
87
+ value.to_d
88
+ else
89
+ BigDecimal(value.to_s)
90
+ end.to_s
91
+ end
92
+
93
+ def to_ruby(value)
94
+ value.to_d
95
+ end
96
+ end
97
+ end
98
+
72
99
  class StringConverter < BaseConverter
73
100
  class << self
74
101
  def convert_type
@@ -16,7 +16,7 @@ module ActiveGraph
16
16
  alias [] read_attribute
17
17
 
18
18
  def read_undeclared_property(name)
19
- _persisted_obj ? _persisted_obj.props[name] : (undeclared_properties && undeclared_properties[name])
19
+ _persisted_obj ? _persisted_obj.properties[name] : (undeclared_properties && undeclared_properties[name])
20
20
  end
21
21
 
22
22
  def write_attribute(name, value)
@@ -1,3 +1,3 @@
1
1
  module ActiveGraph
2
- VERSION = '10.0.0-beta.8'
2
+ VERSION = '10.0.1'
3
3
  end
@@ -1,4 +1,6 @@
1
1
  class Create<%= @migration_class_name.underscore.camelize %> < ActiveGraph::Migrations::Base
2
+ disable_transactions!
3
+
2
4
  def up
3
5
  add_constraint :<%= class_name %>, :uuid
4
6
  end
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.beta.8
4
+ version: 10.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Ronge, Brian Underwood, Chris Grigg, Heinrich Klobuczek
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-09 00:00:00.000000000 Z
11
+ date: 2020-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -126,16 +126,16 @@ dependencies:
126
126
  name: neo4j-ruby-driver
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - ">="
129
+ - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: 0.4.0
131
+ version: 1.7.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.4.0
138
+ version: 1.7.0
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: os
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -262,6 +262,7 @@ files:
262
262
  - lib/active_graph/core.rb
263
263
  - lib/active_graph/core/connection_failed_error.rb
264
264
  - lib/active_graph/core/cypher_error.rb
265
+ - lib/active_graph/core/entity.rb
265
266
  - lib/active_graph/core/instrumentable.rb
266
267
  - lib/active_graph/core/label.rb
267
268
  - lib/active_graph/core/logging.rb
@@ -273,7 +274,6 @@ files:
273
274
  - lib/active_graph/core/query_ext.rb
274
275
  - lib/active_graph/core/query_find_in_batches.rb
275
276
  - lib/active_graph/core/record.rb
276
- - lib/active_graph/core/relationship.rb
277
277
  - lib/active_graph/core/result.rb
278
278
  - lib/active_graph/core/schema.rb
279
279
  - lib/active_graph/core/schema_errors.rb
@@ -394,7 +394,7 @@ metadata:
394
394
  changelog_uri: https://github.com/neo4jrb/activegraph/blob/master/CHANGELOG.md
395
395
  source_code_uri: https://github.com/neo4jrb/activegraph/
396
396
  bug_tracker_uri: https://github.com/neo4jrb/activegraph/issues
397
- post_install_message:
397
+ post_install_message:
398
398
  rdoc_options:
399
399
  - "--quiet"
400
400
  - "--title"
@@ -412,12 +412,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
412
412
  version: '2.5'
413
413
  required_rubygems_version: !ruby/object:Gem::Requirement
414
414
  requirements:
415
- - - ">"
415
+ - - ">="
416
416
  - !ruby/object:Gem::Version
417
- version: 1.3.1
417
+ version: '0'
418
418
  requirements: []
419
419
  rubygems_version: 3.1.2
420
- signing_key:
420
+ signing_key:
421
421
  specification_version: 4
422
422
  summary: A graph database for Ruby
423
423
  test_files: []
@@ -1,13 +0,0 @@
1
- require 'active_graph/core/wrappable'
2
-
3
- module ActiveGraph
4
- module Core
5
- module Relationship
6
- def props; properties; end
7
- def neo_id; id; end
8
- def start_node_neo_id; start_node_id; end
9
- def end_node_neo_id; end_node_id; end
10
- def rel_type; type; end
11
- end
12
- end
13
- end