neo4j 3.0.0.rc.5 → 3.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: 26a95704c598f6b1e39d5a05d8cebc03ef2e4705
4
- data.tar.gz: b8246ee70c32ae137eaff9bc169ef14646d52868
3
+ metadata.gz: 8c7dc4797f55611d07474d42b4618485691dc613
4
+ data.tar.gz: 8b8dd2f9eee185c7a157eeba14afcbe8cfbf043c
5
5
  SHA512:
6
- metadata.gz: afc6ef946ce72a7bf88afa316218f2e78155fdc269f91d795d6c12e1d9d5edb90d409374cdf746872f5dd1e585c8535c00fe0180522b5ab14b3bc37511ab870c
7
- data.tar.gz: 8733527ffa47beccdf15477380a953c8f8789b854df097f656f6a00736ee5a02627632461c8b79f7d66f6e0ff7c5148604516d034db4c8b4b7ba5418ed71b049
6
+ metadata.gz: 97484101ffda9dc168e5f1ce39bde7fc28f019231dc9cfa82ae74dbc49fc75942279882023da33329453644d3734ea072415d9996fdeb6089f404e952f2aa262
7
+ data.tar.gz: 2770dacf06cbb2816acf892c0e162e3049ff18af305013b358ab5b850cf20462a556b3197760ed128aad870d57f362302296b00c32906325b23b963ece0419a7
data/CHANGELOG CHANGED
@@ -1,3 +1,6 @@
1
+ == 3.0.0
2
+ No change from rc 4
3
+
1
4
  == 3.0.0.rc.4
2
5
  * UUIDs are now automatically specified on models as neo IDs won't be reliable
3
6
  in future versions of neo4j
@@ -67,7 +67,7 @@ module Neo4j
67
67
  end
68
68
 
69
69
  Neo4j::Session.on_session_available do |_|
70
- id_property :uuid, auto: :uuid
70
+ id_property :uuid, auto: :uuid unless self.has_id_property?
71
71
 
72
72
  name = Neo4j::Config[:id_property]
73
73
  type = Neo4j::Config[:id_property_type]
@@ -42,12 +42,8 @@ module Neo4j::ActiveNode
42
42
 
43
43
  def validate_conf(conf)
44
44
  return if conf.empty?
45
-
46
45
  raise "Expected a Hash, got #{conf.class} (#{conf.to_s}) for id_property" unless conf.is_a?(Hash)
47
-
48
- unless conf.include?(:auto) || conf.include?(:on)
49
- raise "Illegal value #{conf.inspect} for id_property, expected :on or :auto"
50
- end
46
+ raise "Illegal value #{conf.inspect} for id_property, expected :on or :auto" unless conf.include?(:auto) || conf.include?(:on)
51
47
  end
52
48
 
53
49
  def define_property_method(clazz, name)
@@ -86,7 +86,7 @@ module Neo4j
86
86
  self.query_as(:n).where(n: eval(args.join)).limit(1).pluck(:n).first
87
87
  end
88
88
 
89
- # Like find_by, except that if no record is found, raises a RecordNotFound error.
89
+ # Like find_by, except that if no record is found, raises a RecordNotFound error.
90
90
  def find_by!(*args)
91
91
  a = eval(args.join)
92
92
  find_by(args) or raise RecordNotFound, "#{self.query_as(:n).where(n: a).limit(1).to_cypher} returned no results"
@@ -37,7 +37,7 @@ module Neo4j
37
37
  def include?(other, target=nil)
38
38
  raise(InvalidParameterError, ':include? only accepts nodes') unless other.respond_to?(:neo_id)
39
39
  query_with_target(target) do |target|
40
- self.query.where(target => {@model.primary_key => other.id}).return("count(#{target}) AS count").first.count > 0
40
+ self.where("#{target}.#{other.class.primary_key} = {other_node_id}").params(other_node_id: other.id).query.return("count(#{target}) as count").first.count > 0
41
41
  end
42
42
  end
43
43
 
@@ -44,10 +44,10 @@ module Neo4j
44
44
  private
45
45
 
46
46
  def exists_query_start(node_condition)
47
- case
48
- when node_condition.class == Fixnum
47
+ case node_condition
48
+ when Fixnum
49
49
  self.query_as(:n).where("ID(n) = #{node_condition}")
50
- when node_condition.class == Hash
50
+ when Hash
51
51
  self.where(node_condition.keys.first => node_condition.values.first)
52
52
  else
53
53
  self.query_as(:n)
@@ -61,7 +61,7 @@ module Neo4j::ActiveNode
61
61
 
62
62
  def _call_scope_context(eval_context, query_params, proc)
63
63
  if proc.arity == 1
64
- eval_context.instance_exec(query_params,&proc)
64
+ eval_context.instance_exec(query_params, &proc)
65
65
  else
66
66
  eval_context.instance_exec(&proc)
67
67
  end
@@ -31,19 +31,12 @@ module Neo4j
31
31
  # TODO: Added as find(:name => nil) throws error
32
32
  value = "" if value == nil
33
33
 
34
- if options[:case_sensitive]
35
- conditions[attribute] = value
36
- else
37
- conditions[attribute] = /^#{Regexp.escape(value.to_s)}$/i
38
- end
34
+ conditions[attribute] = options[:case_sensitive] ? value : /^#{Regexp.escape(value.to_s)}$/i
39
35
 
40
36
  # prevent that same object is returned
41
37
  # TODO: add negative condtion to not return current record
42
38
  found = record.class.where(conditions).to_a.select{|f| f.neo_id != record.neo_id}
43
-
44
- if found.count > 0
45
- record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
46
- end
39
+ record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value)) if found.count > 0
47
40
  end
48
41
 
49
42
  def message(instance)
@@ -13,9 +13,7 @@ module Neo4j::ActiveRel
13
13
  end
14
14
 
15
15
  def save!(*args)
16
- unless save(*args)
17
- raise RelInvalidError.new(self)
18
- end
16
+ raise RelInvalidError.new(self) unless save(*args)
19
17
  end
20
18
 
21
19
  def create_model(*)
@@ -44,21 +42,17 @@ module Neo4j::ActiveRel
44
42
 
45
43
  # Same as #create, but raises an error if there is a problem during save.
46
44
  def create!(*args)
47
- unless create(*args)
48
- raise RelInvalidError.new(self)
49
- end
45
+ raise RelInvalidError.new(self) unless create(*args)
50
46
  end
51
47
  end
52
48
 
53
- private
49
+ private
54
50
 
55
51
  def confirm_node_classes
56
52
  [from_node, to_node].each do |node|
57
53
  type = from_node == node ? :_from_class : :_to_class
58
54
  next if allows_any_class?(type)
59
- unless class_as_constant(type) == node.class
60
- raise ModelClassInvalidError, "Node class was #{node.class}, expected #{self.class.send(type)}"
61
- end
55
+ raise ModelClassInvalidError, "Node class was #{node.class}, expected #{self.class.send(type)}" unless class_as_constant(type) == node.class
62
56
  end
63
57
  end
64
58
 
@@ -71,10 +65,10 @@ module Neo4j::ActiveRel
71
65
 
72
66
  def class_as_constant(type)
73
67
  given_class = self.class.send(type)
74
- case
75
- when given_class.is_a?(String)
68
+ case given_class
69
+ when String
76
70
  given_class.constantize
77
- when given_class.is_a?(Symbol)
71
+ when Symbol
78
72
  given_class.to_s.constantize
79
73
  else
80
74
  given_class
@@ -54,7 +54,7 @@ module Neo4j::ActiveRel
54
54
  when :inbound
55
55
  identifier = '(n2'
56
56
  identifier + (_to_class == :any ? ')' : cypher_label(:inbound))
57
- end
57
+ end
58
58
  end
59
59
 
60
60
  def cypher_label(dir = :outbound)
@@ -63,10 +63,10 @@ module Neo4j::ActiveRel
63
63
  end
64
64
 
65
65
  def as_constant(given_class)
66
- case
67
- when given_class.is_a?(String)
66
+ case given_class
67
+ when String
68
68
  given_class.constantize
69
- when given_class.is_a?(Symbol)
69
+ when Symbol
70
70
  given_class.to_s.constantize
71
71
  else
72
72
  given_class
@@ -74,11 +74,10 @@ module Neo4j::ActiveRel
74
74
  end
75
75
 
76
76
  def where_string(args)
77
- if args.is_a?(Hash)
78
- args.map do |k, v|
79
- v.is_a?(Integer) ? "r1.#{k} = #{v}" : "r1.#{k} = '#{v}'"
80
- end.join(', ')
81
- else
77
+ case args
78
+ when Hash
79
+ args.map { |k, v| v.is_a?(Integer) ? "r1.#{k} = #{v}" : "r1.#{k} = '#{v}'" }.join(', ')
80
+ else
82
81
  args
83
82
  end
84
83
  end
@@ -5,7 +5,7 @@ class Neo4j::Relationship
5
5
  props.symbolize_keys!
6
6
  return self unless props.is_a?(Hash) && props.has_key?(Neo4j::Config.class_name_property)
7
7
  begin
8
- found_class = props[Neo4j::Config.class_name_property].constantize
8
+ found_class = props[Neo4j::Config.class_name_property].constantize
9
9
  rescue NameError
10
10
  return self
11
11
  end
@@ -1,5 +1,18 @@
1
1
  module Neo4j
2
2
  class Migration
3
+
4
+ def migrate
5
+ raise 'not implemented'
6
+ end
7
+
8
+ def output(string = '')
9
+ puts string unless !!ENV['silenced']
10
+ end
11
+
12
+ def print_output(string)
13
+ print string unless !!ENV['silenced']
14
+ end
15
+
3
16
  class AddIdProperty < Neo4j::Migration
4
17
  attr_reader :models_filename
5
18
 
@@ -9,12 +22,12 @@ module Neo4j
9
22
 
10
23
  def migrate
11
24
  models = ActiveSupport::HashWithIndifferentAccess.new(YAML.load_file(models_filename))[:models]
12
- puts "This task will add an ID Property every node in the given file."
13
- puts "It may take a significant amount of time, please be patient."
25
+ output "This task will add an ID Property every node in the given file."
26
+ output "It may take a significant amount of time, please be patient."
14
27
  models.each do |model|
15
- puts
16
- puts
17
- puts "Adding IDs to #{model}"
28
+ output
29
+ output
30
+ output "Adding IDs to #{model}"
18
31
  add_ids_to model.constantize
19
32
  end
20
33
  end
@@ -44,10 +57,10 @@ module Neo4j
44
57
  nodes_left = Neo4j::Session.query.match(n: label).where("NOT has(n.#{property})").return("COUNT(n) AS ids").first.ids
45
58
 
46
59
  time_per_node = last_time_taken / max_per_batch if last_time_taken
47
- print "Running first batch...\r"
60
+ print_output "Running first batch...\r"
48
61
  if time_per_node
49
62
  eta_seconds = (nodes_left * time_per_node).round
50
- print "#{nodes_left} nodes left. Last batch: #{(time_per_node * 1000.0).round(1)}ms / node (ETA: #{eta_seconds / 60} minutes)\r"
63
+ print_output "#{nodes_left} nodes left. Last batch: #{(time_per_node * 1000.0).round(1)}ms / node (ETA: #{eta_seconds / 60} minutes)\r"
51
64
  end
52
65
 
53
66
  return if nodes_left == 0
@@ -58,7 +71,7 @@ module Neo4j
58
71
  last_time_taken = id_batch_set(label, property, new_ids, to_set)
59
72
  rescue Neo4j::Server::CypherResponse::ResponseError, Faraday::TimeoutError
60
73
  new_max_per_batch = (max_per_batch * 0.8).round
61
- puts "Error querying #{max_per_batch} nodes. Trying #{new_max_per_batch}"
74
+ output "Error querying #{max_per_batch} nodes. Trying #{new_max_per_batch}"
62
75
  max_per_batch = new_max_per_batch
63
76
  end
64
77
  end
@@ -92,7 +105,6 @@ module Neo4j
92
105
  end
93
106
 
94
107
  class AddClassnames < Neo4j::Migration
95
- attr_reader :classnames_filename, :classnames_filepath
96
108
 
97
109
  def initialize
98
110
  @classnames_filename = 'add_classnames.yml'
@@ -100,33 +112,34 @@ module Neo4j
100
112
  end
101
113
 
102
114
  def migrate
103
- puts "Adding classnames. This make take some time."
115
+ output "Adding classnames. This make take some time."
104
116
  execute(true)
105
117
  end
106
118
 
107
119
  def test
108
- puts "TESTING! No queries will be executed."
120
+ output "TESTING! No queries will be executed."
109
121
  execute(false)
110
122
  end
111
123
 
112
124
  def setup
113
- puts "Creating file #{classnames_filepath}. Please use this as the migration guide."
125
+ output "Creating file #{classnames_filepath}. Please use this as the migration guide."
114
126
  FileUtils.mkdir_p("db/neo4j-migrate")
115
- unless File.file?(@classnames_filepath)
127
+ unless File.file?(classnames_filepath)
116
128
  source = File.join(File.dirname(__FILE__), "..", "..", "config", "neo4j", classnames_filename)
117
129
  FileUtils.copy_file(source, classnames_filepath)
118
130
  end
119
131
  end
120
132
 
121
133
  private
134
+ attr_reader :classnames_filename, :classnames_filepath, :model_map
122
135
 
123
136
  def execute(migrate = false)
124
137
  file_init
125
138
  map = []
126
- map.push :nodes if @model_map[:nodes]
127
- map.push :relationships if @model_map[:relationships]
139
+ map.push :nodes if model_map[:nodes]
140
+ map.push :relationships if model_map[:relationships]
128
141
  map.each do |type|
129
- @model_map[type].each do |action, labels|
142
+ model_map[type].each do |action, labels|
130
143
  do_classnames(action, labels, type, migrate)
131
144
  end
132
145
  end
@@ -135,7 +148,7 @@ module Neo4j
135
148
  def do_classnames(action, labels, type, migrate = false)
136
149
  method = type == :nodes ? :node_cypher : :rel_cypher
137
150
  labels.each do |label|
138
- puts cypher = self.send(method, label, action)
151
+ output cypher = self.send(method, label, action)
139
152
  execute_cypher(cypher) if migrate
140
153
  end
141
154
  end
@@ -146,7 +159,7 @@ module Neo4j
146
159
 
147
160
  def node_cypher(label, action)
148
161
  where, phrase_start = action_variables(action, 'n')
149
- puts "#{phrase_start} _classname '#{label}' on nodes with matching label:"
162
+ output "#{phrase_start} _classname '#{label}' on nodes with matching label:"
150
163
  "MATCH (n:`#{label}`) #{where} SET n._classname = '#{label}' RETURN COUNT(n) as modified"
151
164
  end
152
165
 
@@ -161,13 +174,13 @@ module Neo4j
161
174
  to_cypher = to ? "(to:`#{to}`)" : "(to)"
162
175
  type = "[r:`#{value[:type]}`]"
163
176
  where, phrase_start = action_variables(action, 'r')
164
- puts "#{phrase_start} _classname '#{label}' where type is '#{value[:type]}' using cypher:"
177
+ output "#{phrase_start} _classname '#{label}' where type is '#{value[:type]}' using cypher:"
165
178
  "MATCH #{from_cypher}-#{type}->#{to_cypher} #{where} SET r._classname = '#{label}' return COUNT(r) as modified"
166
179
  end
167
180
 
168
181
  def execute_cypher(query_string)
169
- puts "Modified #{Neo4j::Session.query(query_string).first.modified} records"
170
- puts ""
182
+ output "Modified #{Neo4j::Session.query(query_string).first.modified} records"
183
+ output ""
171
184
  end
172
185
 
173
186
  def action_variables(action, identifier)
@@ -108,11 +108,7 @@ module Neo4j::Shared
108
108
  return nil if values_with_empty_parameters.all? { |v| v.nil? }
109
109
  values = values_with_empty_parameters.collect { |v| v.nil? ? 1 : v }
110
110
  klass = field[:type]
111
- if klass
112
- klass.new(*values)
113
- else
114
- values
115
- end
111
+ klass ? klass.new(*values) : values
116
112
  end
117
113
 
118
114
  module ClassMethods
@@ -163,6 +159,7 @@ module Neo4j::Shared
163
159
  end
164
160
 
165
161
  def default_property(name, &block)
162
+ reset_default_properties(name) if default_properties.respond_to?(:size)
166
163
  default_properties[name] = block
167
164
  end
168
165
 
@@ -171,6 +168,13 @@ module Neo4j::Shared
171
168
  @default_property ||= {}
172
169
  end
173
170
 
171
+ def reset_default_properties(name_to_keep)
172
+ default_properties.each_key do |property|
173
+ undef_method(property) unless property == name_to_keep
174
+ end
175
+ @default_property = {}
176
+ end
177
+
174
178
  def default_property_values(instance)
175
179
  default_properties.each_with_object({}) do |(key, block),result|
176
180
  result[key] = block.call(instance)
@@ -28,13 +28,13 @@ module Neo4j
28
28
  super(context)
29
29
  errors.empty?
30
30
  end
31
-
31
+
32
32
  private
33
-
33
+
34
34
  def perform_validations(options={})
35
35
  perform_validation = case options
36
- when Hash
37
- options[:validate] != false
36
+ when Hash
37
+ options[:validate] != false
38
38
  end
39
39
 
40
40
  if perform_validation
data/lib/neo4j/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Neo4j
2
- VERSION = "3.0.0.rc.5"
2
+ VERSION = "3.0.0"
3
3
  end
data/neo4j.gemspec CHANGED
@@ -31,7 +31,7 @@ A Neo4j OGM for use in Ruby on Rails and Rack frameworks, intended as a complete
31
31
  s.add_dependency("activesupport", "~> 4")
32
32
  s.add_dependency("railties", "~> 4")
33
33
  s.add_dependency('active_attr', "~> 0.8")
34
- s.add_dependency("neo4j-core", "= 3.0.0.rc.5")
34
+ s.add_dependency("neo4j-core", "= 3.0.0")
35
35
 
36
36
  if RUBY_PLATFORM =~ /java/
37
37
  s.add_dependency("neo4j-community", '~> 2.0')
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: 3.0.0.rc.5
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Ronge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-23 00:00:00.000000000 Z
11
+ date: 2014-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: orm_adapter
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - '='
88
88
  - !ruby/object:Gem::Version
89
- version: 3.0.0.rc.5
89
+ version: 3.0.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
- version: 3.0.0.rc.5
96
+ version: 3.0.0
97
97
  description: |
98
98
  A Neo4j OGM for use in Ruby on Rails and Rack frameworks, intended as a complete replacement for ActiveRecord.
99
99
  email: andreas.ronge@gmail.com
@@ -182,9 +182,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
182
  version: 1.9.1
183
183
  required_rubygems_version: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - ">"
185
+ - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 1.3.1
187
+ version: '0'
188
188
  requirements: []
189
189
  rubyforge_project: neo4j
190
190
  rubygems_version: 2.2.2