neo4j 5.0.0.rc.3 → 5.0.0

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
  SHA1:
3
- metadata.gz: cc96b4d5b3007bf7da4b1894ad52a9a203171e44
4
- data.tar.gz: ee8e0b05b7df72c85a4d5f6d661a668fa350dbb9
3
+ metadata.gz: df42076f21c3f31cf2cde7b6d226af5c3f27ffd4
4
+ data.tar.gz: 284cff951e6666fe88f49147c05d89f59be231fd
5
5
  SHA512:
6
- metadata.gz: b5733ba5a5137b072f5e9dc0eded1bb0642a5361f0dffde0f6c257068b7f83db796967a6767b7683be8e454bfdfcd3e517f99ae9218357e853ea63472c319297
7
- data.tar.gz: 8b287427507618a06e4e3f27fa58d4c7ceb6298a2042400dc77591657046680ceacd404accbf20afff71fe545f3dcbfb71736f336d45854d27541ab7b5cb3afd
6
+ metadata.gz: dd03334a23759e25ecf0aa6a3586ad8b08b8650312505254e84e06e43502fab6e1ae775f9b86218db686baefdfec11e8078dfd7de378bcffe0ac1055682bc2bc
7
+ data.tar.gz: 408d0968f7796141d8f04f81fd91b08e859141001285eba1a7f4d79f30ad2be8a2f3f7ed46964b853743e497f9726c8d8b615f3ad3f3508fac132e9f0a946db5
@@ -6,7 +6,18 @@ This project adheres to [Semantic Versioning](http://semver.org/).
6
6
  ## [Unreleased][unreleased]
7
7
  - Nothing yet, placeholder
8
8
 
9
- ## [5.0.0.rc.3] - 2015-05-20
9
+ ## [5.0.0] - 2015-06-18
10
+
11
+ ### Fixed
12
+ - Prevented `to_key` from requiring an extra DB query. (See https://github.com/neo4jrb/neo4j/pull/827)
13
+
14
+ ### Added
15
+ - QueryProxy associations accept `labels: false` option to prevent generated Cypher from using labels.
16
+
17
+ ### Changed
18
+ - Properties explicitly set to type `Time` will no longer be converted to `DateTime`.
19
+
20
+ ## [5.0.0.rc.3] - 2015-06-07
10
21
 
11
22
  ### Fixed
12
23
  - Associations now allow `unique` option. Error handling is generalized to make this testable (Thanks to @olance, see #824)
@@ -44,6 +44,15 @@ module Neo4j
44
44
  _persisted_obj || fail('Tried to access native neo4j object on a non persisted object')
45
45
  end
46
46
 
47
+ def inspect
48
+ id_property_name = self.class.id_property_name.to_s
49
+ attribute_pairs = attributes.except(id_property_name).sort.map { |key, value| "#{key}: #{value.inspect}" }
50
+ attribute_pairs.unshift("#{id_property_name}: #{self.send(id_property_name).inspect}")
51
+ attribute_descriptions = attribute_pairs.join(', ')
52
+ separator = ' ' unless attribute_descriptions.empty?
53
+ "#<#{self.class.name}#{separator}#{attribute_descriptions}>"
54
+ end
55
+
47
56
  included do
48
57
  def self.inherited(other)
49
58
  inherit_id_property(other)
@@ -138,22 +138,13 @@ module Neo4j::ActiveNode
138
138
  end
139
139
  end
140
140
 
141
- # Uses the cypher generated by a QueryProxy object, complete with params, to generate a basic non-cryptographic hash
142
- # for use in @association_cache.
143
- # @param [String] the cypher used in the query
144
- # @return [String] A basic hash of the query
145
- def cypher_hash(cypher_string)
146
- cypher_string.hash.abs
147
- end
148
-
149
141
  def association_query_proxy(name, options = {})
150
- self.class.send(:association_query_proxy, name, {start_object: self}.merge(options))
142
+ self.class.send(:association_query_proxy, name, {start_object: self}.merge!(options))
151
143
  end
152
144
 
153
145
  def association_proxy(name, options = {})
154
146
  name = name.to_sym
155
- hash = [name, options.values_at(:node, :rel)].hash
156
-
147
+ hash = [name, options.values_at(:node, :rel, :labels)].hash
157
148
  association_proxy_cache_fetch(hash) do
158
149
  if previous_association_proxy = self.instance_variable_get('@association_proxy')
159
150
  result_by_previous_id = previous_association_proxy_results_by_previous_id(previous_association_proxy, name)
@@ -321,13 +312,13 @@ module Neo4j::ActiveNode
321
312
  define_method(name) do |node = nil, rel = nil, options = {}|
322
313
  return [].freeze unless self._persisted_obj
323
314
 
324
- association_proxy(name, {node: node, rel: rel, source_object: self}.merge(options))
315
+ association_proxy(name, {node: node, rel: rel, source_object: self, labels: options[:labels]}.merge!(options))
325
316
  end
326
317
 
327
318
  define_has_many_setter(name)
328
319
 
329
320
  define_class_method(name) do |node = nil, rel = nil, options = {}|
330
- association_proxy(name, {node: node, rel: rel}.merge(options))
321
+ association_proxy(name, {node: node, rel: rel, labels: options[:labels]}.merge!(options))
331
322
  end
332
323
  end
333
324
 
@@ -349,7 +340,7 @@ module Neo4j::ActiveNode
349
340
  define_has_one_setter(name)
350
341
 
351
342
  define_class_method(name) do |node = nil, rel = nil, options = {}|
352
- association_proxy(name, {node: node, rel: rel}.merge(options))
343
+ association_proxy(name, {node: node, rel: rel, labels: options[:labels]}.merge!(options))
353
344
  end
354
345
  end
355
346
 
@@ -373,14 +364,14 @@ module Neo4j::ActiveNode
373
364
  def association_query_proxy(name, options = {})
374
365
  previous_query_proxy = options[:previous_query_proxy] || current_scope
375
366
  query_proxy = previous_query_proxy || default_association_query_proxy(name)
376
-
377
367
  Neo4j::ActiveNode::Query::QueryProxy.new(association_target_class(name),
378
368
  associations[name],
379
369
  {session: neo4j_session,
380
370
  query_proxy: query_proxy,
381
371
  context: "#{query_proxy.context || self.name}##{name}",
382
372
  optional: query_proxy.optional?,
383
- source_object: query_proxy.source_object}.merge(options)).tap do |query_proxy_result|
373
+ association_labels: options[:labels],
374
+ source_object: query_proxy.source_object}.merge!(options)).tap do |query_proxy_result|
384
375
  target_classes = association_target_classes(name)
385
376
  return query_proxy_result.as_models(target_classes) if target_classes
386
377
  end
@@ -388,7 +379,6 @@ module Neo4j::ActiveNode
388
379
 
389
380
  def association_proxy(name, options = {})
390
381
  query_proxy = association_query_proxy(name, options)
391
-
392
382
  AssociationProxy.new(query_proxy)
393
383
  end
394
384
 
@@ -38,8 +38,7 @@ module Neo4j
38
38
  @context = options.delete(:context)
39
39
  @options = options
40
40
 
41
- @node_var, @session, @source_object, @starting_query, @optional, @start_object, @query_proxy, @chain_level =
42
- options.values_at(:node, :session, :source_object, :starting_query, :optional, :start_object, :query_proxy, :chain_level)
41
+ instance_vars_from_options!(options)
43
42
 
44
43
  @match_type = @optional ? :optional_match : :match
45
44
 
@@ -86,8 +85,8 @@ module Neo4j
86
85
  # and work with it from the more powerful (but less friendly) Neo4j::Core::Query.
87
86
  # @param [String,Symbol] var The identifier to use for node at this link of the QueryProxy chain.
88
87
  # student.lessons.query_as(:l).with('your cypher here...')
89
- def query_as(var, with_label = true)
90
- result_query = @chain.inject(base_query(var, with_label).params(@params)) do |query, link|
88
+ def query_as(var, with_labels = true)
89
+ result_query = @chain.inject(base_query(var, with_labels).params(@params)) do |query, link|
91
90
  args = link.args(var, rel_var)
92
91
 
93
92
  args.is_a?(Array) ? query.send(link.clause, *args) : query.send(link.clause, args)
@@ -106,8 +105,11 @@ module Neo4j
106
105
  end
107
106
  end
108
107
 
109
- def _model_label_string
110
- return if !@model
108
+ # param [TrueClass, FalseClass] with_labels This param is used by certain QueryProxy methods that already have the neo_id and
109
+ # therefore do not need labels.
110
+ # The @association_labels instance var is set during init and used during association chaining to keep labels out of Cypher queries.
111
+ def _model_label_string(with_labels = true)
112
+ return if !@model || (!with_labels || @association_labels == false)
111
113
  @model.mapped_label_names.map { |label_name| ":`#{label_name}`" }.join
112
114
  end
113
115
 
@@ -185,16 +187,6 @@ module Neo4j
185
187
  end
186
188
  end
187
189
 
188
- def rels
189
- fail 'Cannot get rels without a relationship variable.' if !@rel_var
190
-
191
- pluck(@rel_var)
192
- end
193
-
194
- def rel
195
- rels.first
196
- end
197
-
198
190
  def _nodeify!(*args)
199
191
  other_nodes = [args].flatten!.map! do |arg|
200
192
  (arg.is_a?(Integer) || arg.is_a?(String)) ? @model.find_by(@model.id_property_name => arg) : arg
@@ -232,12 +224,6 @@ module Neo4j
232
224
  (@model && @model.respond_to?(method_name, include_all)) || super
233
225
  end
234
226
 
235
- # Give ability to call `#find` on associations to get a scoped find
236
- # Doesn't pass through via `method_missing` because Enumerable has a `#find` method
237
- def find(*args)
238
- scoping { @model.find(*args) }
239
- end
240
-
241
227
  def optional?
242
228
  @optional == true
243
229
  end
@@ -325,6 +311,11 @@ module Neo4j
325
311
 
326
312
  private
327
313
 
314
+ def instance_vars_from_options!(options)
315
+ @node_var, @session, @source_object, @starting_query, @optional, @start_object, @query_proxy, @chain_level, @association_labels =
316
+ options.values_at(:node, :session, :source_object, :starting_query, :optional, :start_object, :query_proxy, :chain_level, :association_labels)
317
+ end
318
+
328
319
  def build_deeper_query_proxy(method, args)
329
320
  new_link.tap do |new_query|
330
321
  Link.for_args(@model, method, args).each { |link| new_query._add_links(link) }
@@ -6,6 +6,22 @@ module Neo4j
6
6
  FIRST = 'HEAD'
7
7
  LAST = 'LAST'
8
8
 
9
+ def rels
10
+ fail 'Cannot get rels without a relationship variable.' if !@rel_var
11
+
12
+ pluck(@rel_var)
13
+ end
14
+
15
+ def rel
16
+ rels.first
17
+ end
18
+
19
+ # Give ability to call `#find` on associations to get a scoped find
20
+ # Doesn't pass through via `method_missing` because Enumerable has a `#find` method
21
+ def find(*args)
22
+ scoping { @model.find(*args) }
23
+ end
24
+
9
25
  def first(target = nil)
10
26
  first_and_last(FIRST, target)
11
27
  end
@@ -34,10 +34,6 @@ module Neo4j::Shared
34
34
  # Tweaks properties
35
35
  def register_magic_properties
36
36
  options[:type] ||= DateTime if name.to_sym == :created_at || name.to_sym == :updated_at
37
- # TODO: Custom typecaster to fix the stuff below
38
- # ActiveAttr does not handle "Time", Rails and Neo4j.rb 2.3 did
39
- # Convert it to DateTime in the interest of consistency
40
- options[:type] = DateTime if options[:type] == Time
41
37
 
42
38
  register_magic_typecaster
43
39
  register_type_converter
@@ -8,7 +8,7 @@ module Neo4j::Shared
8
8
  # Returns an Enumerable of all (primary) key attributes
9
9
  # or nil if model.persisted? is false
10
10
  def to_key
11
- persisted? ? [id] : nil
11
+ _persisted_obj ? [id] : nil
12
12
  end
13
13
 
14
14
  # @return [Integer, nil] the neo4j id of the node if persisted or nil
@@ -57,6 +57,9 @@ module Neo4j::Shared
57
57
  Time
58
58
  end
59
59
 
60
+ def primitive_type
61
+ Integer
62
+ end
60
63
  # Converts the given DateTime (UTC) value to an Integer.
61
64
  # Only utc times are supported !
62
65
  def to_db(value)
@@ -70,6 +73,7 @@ module Neo4j::Shared
70
73
  def to_ruby(value)
71
74
  Time.at(value).utc
72
75
  end
76
+ alias_method :call, :to_ruby
73
77
  end
74
78
  end
75
79
 
@@ -1,3 +1,3 @@
1
1
  module Neo4j
2
- VERSION = '5.0.0.rc.3'
2
+ VERSION = '5.0.0'
3
3
  end
@@ -30,7 +30,7 @@ A Neo4j OGM (Object-Graph-Mapper) for use in Ruby on Rails and Rack frameworks h
30
30
  s.add_dependency('activemodel', '~> 4')
31
31
  s.add_dependency('activesupport', '~> 4')
32
32
  s.add_dependency('active_attr', '~> 0.8')
33
- s.add_dependency('neo4j-core', '>= 5.0.0.rc.1')
33
+ s.add_dependency('neo4j-core', '~> 5.0.0')
34
34
  s.add_dependency('neo4j-community', '~> 2.0') if RUBY_PLATFORM =~ /java/
35
35
  s.add_development_dependency('railties', '~> 4')
36
36
  s.add_development_dependency('pry')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neo4j
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0.rc.3
4
+ version: 5.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Ronge, Brian Underwood, Chris Grigg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-08 00:00:00.000000000 Z
11
+ date: 2015-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: orm_adapter
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: neo4j-core
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: 5.0.0.rc.1
75
+ version: 5.0.0
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: 5.0.0.rc.1
82
+ version: 5.0.0
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: railties
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -307,12 +307,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
307
307
  version: 1.9.3
308
308
  required_rubygems_version: !ruby/object:Gem::Requirement
309
309
  requirements:
310
- - - ">"
310
+ - - ">="
311
311
  - !ruby/object:Gem::Version
312
- version: 1.3.1
312
+ version: '0'
313
313
  requirements: []
314
314
  rubyforge_project: neo4j
315
- rubygems_version: 2.4.5
315
+ rubygems_version: 2.4.6
316
316
  signing_key:
317
317
  specification_version: 4
318
318
  summary: A graph database for Ruby