neo4j 8.0.0.alpha.2 → 8.0.0.alpha.4
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 +4 -4
- data/CHANGELOG.md +40 -1
- data/Gemfile +9 -7
- data/bin/rake +17 -0
- data/lib/neo4j.rb +1 -0
- data/lib/neo4j/active_base.rb +1 -1
- data/lib/neo4j/active_node.rb +5 -2
- data/lib/neo4j/active_node/id_property.rb +6 -6
- data/lib/neo4j/active_node/labels.rb +1 -5
- data/lib/neo4j/active_rel.rb +3 -21
- data/lib/neo4j/active_rel/persistence.rb +3 -16
- data/lib/neo4j/config.rb +4 -0
- data/lib/neo4j/errors.rb +25 -0
- data/lib/neo4j/migrations.rb +9 -0
- data/lib/neo4j/migrations/runner.rb +7 -2
- data/lib/neo4j/model_schema.rb +24 -8
- data/lib/neo4j/railtie.rb +5 -11
- data/lib/neo4j/shared/enum.rb +11 -5
- data/lib/neo4j/shared/permitted_attributes.rb +28 -0
- data/lib/neo4j/shared/persistence.rb +2 -0
- data/lib/neo4j/shared/type_converters.rb +2 -1
- data/lib/neo4j/version.rb +1 -1
- data/lib/rails/generators/neo4j/migration/migration_generator.rb +5 -5
- data/lib/rails/generators/neo4j/model/model_generator.rb +5 -1
- data/lib/rails/generators/neo4j/model/templates/migration.erb +9 -0
- data/lib/rails/generators/neo4j/upgrade_v8/templates/migration.erb +17 -0
- data/lib/rails/generators/neo4j/upgrade_v8/upgrade_v8_generator.rb +32 -0
- data/lib/rails/generators/neo4j_generator.rb +24 -5
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd2973cc137423aab039e28ea9e4408447277665
|
4
|
+
data.tar.gz: 3d62800551e950fbdaadf39c6893f88371247d56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab42853f116ac28744c2d1fba3e7753a4361c677269615e4ee54b5c828e8106220106ba951bffec8a0b13d27962c046f837c0ee68fbb097b3044ec2b07cdcf5b
|
7
|
+
data.tar.gz: ae0c2386e659388839510a7c9f573a922c18772455726b3ce53218f9596850b68f5fe89f183d60447a7281e0daa1b018bfbf9be6db24cf18ca7f33d082f68ff0
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,22 @@ 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
|
+
## [Unreleased]
|
7
|
+
|
8
|
+
### Added
|
9
|
+
|
10
|
+
- A `Neo4j::Migrations.maintain_test_schema!` method, to keep the test database up to date with schema changes. (see #1277)
|
11
|
+
- A `Neo4j::Migrations.check_for_pending_migrations!` method, that fails when there are pending migration. In Rails, it's executed automatically on startup. (see #1277)
|
12
|
+
- Support for [`ForbiddenAttributesProtection` API](http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html) from ActiveRecord. (thanks ProGM, see #1245)
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
|
16
|
+
- `ActiveNode#destroy` and `ActiveRel#destroy` now return the object in question rather than `true` to be compatible with `ActiveRecord` (see #1254)
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
|
20
|
+
- Bugs with using `neo_id` as `ActiveNode` `id_property` (thanks klobuczek / see #1274)
|
21
|
+
|
6
22
|
## [8.0.0.alpha.2] 2016-08-05
|
7
23
|
|
8
24
|
### Changed
|
@@ -52,6 +68,24 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
52
68
|
|
53
69
|
- Made some memory optimizations (thanks ProGM / see #1221)
|
54
70
|
|
71
|
+
## [7.2.0] - 08-23-2016
|
72
|
+
|
73
|
+
### Added
|
74
|
+
|
75
|
+
- Backporting #1245 to 7.x versions. It implements the [`ForbiddenAttributesProtection` API](http://edgeapi.rubyonrails.org/classes/ActionController/StrongParameters.html) from ActiveRecord.
|
76
|
+
|
77
|
+
## [7.1.3] - 08-18-2016
|
78
|
+
|
79
|
+
### Changed
|
80
|
+
|
81
|
+
- Default value for `enum` is `nil` instead of the first value. This is a **BREAKING** change but is being released as a patch because the original behavior was considered a bug. See [this pull request](https://github.com/neo4jrb/neo4j/pull/1270) (thanks to ProGM and andyweiss1982)
|
82
|
+
|
83
|
+
## [7.1.2] - 08-01-2016
|
84
|
+
|
85
|
+
### Fixed
|
86
|
+
|
87
|
+
- Fixed issue where the label wrapping cache would get stuck
|
88
|
+
|
55
89
|
## [7.1.1] - 07-22-2016
|
56
90
|
|
57
91
|
### Fixed
|
@@ -65,6 +99,12 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
65
99
|
- Gemspec dependency requirements were modified where ActiveModel, ActiveSupport, and Railties are concerned. The gem now requires >= 4.0, < 5.1.
|
66
100
|
- `ActiveModel::Serializers::Xml` is only included if supported if available.
|
67
101
|
|
102
|
+
## [7.0.15] - 08-18-2016
|
103
|
+
|
104
|
+
### Changed
|
105
|
+
|
106
|
+
- Default value for `enum` is `nil` instead of the first value. This is a **BREAKING** change but is being released as a patch because the original behavior was considered a bug. See [this pull request](https://github.com/neo4jrb/neo4j/pull/1270) (thanks to ProGM and andyweiss1982)
|
107
|
+
|
68
108
|
## [7.0.14] - 07-10-2016
|
69
109
|
|
70
110
|
### Fixed
|
@@ -82,7 +122,6 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
82
122
|
### Fixed
|
83
123
|
|
84
124
|
- Fix dipendence from JSON when using outside of rails (thanks ProGM)
|
85
|
-
>>>>>>> 7.1.x
|
86
125
|
|
87
126
|
## [7.0.10] - 06-07-2016
|
88
127
|
|
data/Gemfile
CHANGED
@@ -19,23 +19,25 @@ end
|
|
19
19
|
gem 'listen', '< 3.1'
|
20
20
|
|
21
21
|
if RUBY_VERSION.to_f < 2.2
|
22
|
-
gem 'activemodel', '~> 4'
|
23
|
-
gem 'activesupport', '~> 4'
|
24
|
-
gem 'railties', '~> 4'
|
22
|
+
gem 'activemodel', '~> 4.2'
|
23
|
+
gem 'activesupport', '~> 4.2'
|
24
|
+
gem 'railties', '~> 4.2'
|
25
25
|
end
|
26
26
|
|
27
|
-
gem 'tins', '< 1.7' if RUBY_VERSION.to_f < 2.0
|
28
|
-
|
29
27
|
group 'test' do
|
30
28
|
gem 'coveralls', require: false
|
31
|
-
|
29
|
+
if RUBY_VERSION.to_f < 2.0
|
30
|
+
gem 'tins', '< 1.7'
|
31
|
+
gem 'overcommit', '< 0.35.0'
|
32
|
+
else
|
33
|
+
gem 'overcommit'
|
34
|
+
end
|
32
35
|
gem 'codecov', require: false
|
33
36
|
gem 'simplecov', require: false
|
34
37
|
gem 'simplecov-html', require: false
|
35
38
|
gem 'rspec', '~> 3.4'
|
36
39
|
gem 'its'
|
37
40
|
gem 'test-unit'
|
38
|
-
gem 'overcommit'
|
39
41
|
gem 'colored'
|
40
42
|
gem 'dotenv'
|
41
43
|
gem 'timecop'
|
data/bin/rake
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
#
|
4
|
+
# This file was generated by Bundler.
|
5
|
+
#
|
6
|
+
# The application 'rake' is installed as part of a gem, and
|
7
|
+
# this file is here to facilitate running it.
|
8
|
+
#
|
9
|
+
|
10
|
+
require 'pathname'
|
11
|
+
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile',
|
12
|
+
Pathname.new(__FILE__).realpath)
|
13
|
+
|
14
|
+
require 'rubygems'
|
15
|
+
require 'bundler/setup'
|
16
|
+
|
17
|
+
load Gem.bin_path('rake', 'rake')
|
data/lib/neo4j.rb
CHANGED
data/lib/neo4j/active_base.rb
CHANGED
data/lib/neo4j/active_node.rb
CHANGED
@@ -44,12 +44,13 @@ module Neo4j
|
|
44
44
|
include Neo4j::ActiveNode::Scope
|
45
45
|
include Neo4j::ActiveNode::Dependent
|
46
46
|
include Neo4j::ActiveNode::Enum
|
47
|
+
include Neo4j::Shared::PermittedAttributes
|
47
48
|
|
48
49
|
def initialize(args = nil)
|
49
50
|
self.class.ensure_id_property_info! # So that we make sure all objects have an id_property
|
50
51
|
|
51
|
-
|
52
|
-
super(
|
52
|
+
args = sanitize_input_parameters(args)
|
53
|
+
super(args)
|
53
54
|
end
|
54
55
|
|
55
56
|
def neo4j_obj
|
@@ -81,6 +82,8 @@ module Neo4j
|
|
81
82
|
end
|
82
83
|
|
83
84
|
def self.inherited(other)
|
85
|
+
Neo4j::ActiveNode::Labels.clear_wrapped_models
|
86
|
+
|
84
87
|
LOADED_CLASSES << other
|
85
88
|
other.instance_variable_set('@inherited', true)
|
86
89
|
inherit_id_property(other)
|
@@ -38,10 +38,10 @@ module Neo4j::ActiveNode
|
|
38
38
|
|
39
39
|
module TypeMethods
|
40
40
|
def define_id_methods(clazz, name, conf)
|
41
|
-
validate_conf!(conf)
|
42
|
-
|
43
41
|
return if name == :neo_id
|
44
42
|
|
43
|
+
validate_conf!(conf)
|
44
|
+
|
45
45
|
if conf[:on]
|
46
46
|
define_custom_method(clazz, name, conf[:on])
|
47
47
|
elsif conf[:auto]
|
@@ -188,16 +188,16 @@ module Neo4j::ActiveNode
|
|
188
188
|
|
189
189
|
def handle_model_schema!
|
190
190
|
id_property_name = @id_property_info[:name]
|
191
|
+
|
192
|
+
return if id_property_name == :neo_id || @id_property_info[:inherited]
|
193
|
+
|
191
194
|
if @id_property_info[:type][:constraint] == false &&
|
192
|
-
!@id_property_info[:inherited] &&
|
193
195
|
!@id_property_info[:warned_of_constraint]
|
194
196
|
@id_property_info[:warned_of_constraint] = true
|
195
197
|
warn_constraint_option_false!(id_property_name)
|
196
198
|
return
|
197
199
|
end
|
198
200
|
|
199
|
-
return if id_property_name == :neo_id || @id_property_info[:inherited]
|
200
|
-
|
201
201
|
Neo4j::ModelSchema.add_defined_constraint(self, id_property_name)
|
202
202
|
end
|
203
203
|
|
@@ -211,7 +211,7 @@ MSG
|
|
211
211
|
def id_property_name_type_value
|
212
212
|
name, type, value = Neo4j::Config.to_hash.values_at(*%w(id_property id_property_type id_property_type_value))
|
213
213
|
|
214
|
-
|
214
|
+
unless name == :neo_id || (name && type && value)
|
215
215
|
name = :uuid
|
216
216
|
type = :auto
|
217
217
|
value = :uuid
|
@@ -13,11 +13,7 @@ module Neo4j
|
|
13
13
|
MODELS_FOR_LABELS_CACHE.clear
|
14
14
|
|
15
15
|
included do |model|
|
16
|
-
|
17
|
-
add_wrapped_class(model)
|
18
|
-
|
19
|
-
super
|
20
|
-
end
|
16
|
+
Neo4j::ActiveNode::Labels.clear_wrapped_models
|
21
17
|
|
22
18
|
Neo4j::ActiveNode::Labels.add_wrapped_class(model) unless Neo4j::ActiveNode::Labels._wrapped_classes.include?(model)
|
23
19
|
end
|
data/lib/neo4j/active_rel.rb
CHANGED
@@ -18,13 +18,14 @@ module Neo4j
|
|
18
18
|
include Neo4j::ActiveRel::Query
|
19
19
|
include Neo4j::ActiveRel::Types
|
20
20
|
include Neo4j::Shared::Enum
|
21
|
+
include Neo4j::Shared::PermittedAttributes
|
21
22
|
|
22
23
|
class FrozenRelError < Neo4j::Error; end
|
23
24
|
|
24
25
|
def initialize(from_node = nil, to_node = nil, args = nil)
|
25
26
|
load_nodes(node_or_nil(from_node), node_or_nil(to_node))
|
26
27
|
resolved_args = hash_or_nil(from_node, args)
|
27
|
-
symbol_args = resolved_args
|
28
|
+
symbol_args = sanitize_input_parameters(resolved_args)
|
28
29
|
super(symbol_args)
|
29
30
|
end
|
30
31
|
|
@@ -60,26 +61,7 @@ module Neo4j
|
|
60
61
|
end
|
61
62
|
|
62
63
|
def hash_or_nil(node_or_hash, hash_or_nil)
|
63
|
-
|
64
|
-
end
|
65
|
-
|
66
|
-
module ClassMethods
|
67
|
-
[:create, :create!].each do |meth|
|
68
|
-
define_method(meth) do |from_node_or_args = nil, to_node = nil, args = nil|
|
69
|
-
return super(from_node_or_args) if from_node_or_args.is_a?(Hash)
|
70
|
-
args_hash = args || {}
|
71
|
-
args_with_node!(:from_node, from_node_or_args, args_hash)
|
72
|
-
args_with_node!(:to_node, to_node, args_hash)
|
73
|
-
super(args_hash)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
|
79
|
-
def args_with_node!(key, node, args)
|
80
|
-
args[key] = node if node.is_a?(Neo4j::ActiveNode)
|
81
|
-
args
|
82
|
-
end
|
64
|
+
hash_or_parameter?(node_or_hash) ? node_or_hash : hash_or_nil
|
83
65
|
end
|
84
66
|
end
|
85
67
|
end
|
@@ -60,26 +60,13 @@ module Neo4j::ActiveRel
|
|
60
60
|
module ClassMethods
|
61
61
|
# Creates a new relationship between objects
|
62
62
|
# @param [Hash] props the properties the new relationship should have
|
63
|
-
def create(
|
64
|
-
|
65
|
-
new(props).tap do |obj|
|
66
|
-
relationship_props.each do |prop, value|
|
67
|
-
obj.send("#{prop}=", value)
|
68
|
-
end
|
69
|
-
obj.save
|
70
|
-
end
|
63
|
+
def create(*args)
|
64
|
+
new(*args).tap(&:save)
|
71
65
|
end
|
72
66
|
|
73
67
|
# Same as #create, but raises an error if there is a problem during save.
|
74
68
|
def create!(*args)
|
75
|
-
|
76
|
-
relationship_props = extract_association_attributes!(props) || {}
|
77
|
-
new(props).tap do |obj|
|
78
|
-
relationship_props.each do |prop, value|
|
79
|
-
obj.send("#{prop}=", value)
|
80
|
-
end
|
81
|
-
obj.save!
|
82
|
-
end
|
69
|
+
new(*args).tap(&:save!)
|
83
70
|
end
|
84
71
|
|
85
72
|
def create_method
|
data/lib/neo4j/config.rb
CHANGED
@@ -95,6 +95,10 @@ module Neo4j
|
|
95
95
|
configuration.to_yaml
|
96
96
|
end
|
97
97
|
|
98
|
+
def fail_on_pending_migrations
|
99
|
+
Neo4j::Config[:fail_on_pending_migrations].nil? ? true : Neo4j::Config[:fail_on_pending_migrations]
|
100
|
+
end
|
101
|
+
|
98
102
|
def include_root_in_json
|
99
103
|
# we use ternary because a simple || will always evaluate true
|
100
104
|
Neo4j::Config[:include_root_in_json].nil? ? true : Neo4j::Config[:include_root_in_json]
|
data/lib/neo4j/errors.rb
CHANGED
@@ -17,6 +17,8 @@ module Neo4j
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
class DeprecatedSchemaDefinitionError < Error; end
|
21
|
+
|
20
22
|
class InvalidPropertyOptionsError < Error; end
|
21
23
|
|
22
24
|
class InvalidParameterError < Error; end
|
@@ -25,7 +27,30 @@ module Neo4j
|
|
25
27
|
|
26
28
|
class DangerousAttributeError < ScriptError; end
|
27
29
|
class UnknownAttributeError < NoMethodError; end
|
30
|
+
|
28
31
|
class MigrationError < Error; end
|
29
32
|
class IrreversibleMigration < MigrationError; end
|
30
33
|
class UnknownMigrationVersionError < MigrationError; end
|
34
|
+
|
35
|
+
# Inspired/taken from active_record/migration.rb
|
36
|
+
class PendingMigrationError < MigrationError
|
37
|
+
def initialize
|
38
|
+
if rails? && defined?(Rails.env)
|
39
|
+
super("Migrations are pending. To resolve this issue, run:\n\n #{command_name} neo4j:migrate RAILS_ENV=#{::Rails.env}")
|
40
|
+
else
|
41
|
+
super("Migrations are pending. To resolve this issue, run:\n\n #{command_name} neo4j:migrate")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def command_name
|
48
|
+
return 'rake' unless rails?
|
49
|
+
Rails.version.to_f >= 5 ? 'bin/rails' : 'bin/rake'
|
50
|
+
end
|
51
|
+
|
52
|
+
def rails?
|
53
|
+
defined?(Rails)
|
54
|
+
end
|
55
|
+
end
|
31
56
|
end
|
data/lib/neo4j/migrations.rb
CHANGED
@@ -6,5 +6,14 @@ module Neo4j
|
|
6
6
|
autoload :Base
|
7
7
|
autoload :Runner
|
8
8
|
autoload :SchemaMigration
|
9
|
+
|
10
|
+
def self.check_for_pending_migrations!
|
11
|
+
runner = Neo4j::Migrations::Runner.new
|
12
|
+
fail ::Neo4j::PendingMigrationError if runner.pending_migrations?
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.maintain_test_schema!
|
16
|
+
Neo4j::Migrations::Runner.new(silenced: true).all
|
17
|
+
end
|
9
18
|
end
|
10
19
|
end
|
@@ -11,7 +11,8 @@ module Neo4j
|
|
11
11
|
MIGRATION_RUNNING = {up: 'running'.freeze, down: 'reverting'.freeze}.freeze
|
12
12
|
MIGRATION_DONE = {up: 'migrated'.freeze, down: 'reverted'.freeze}.freeze
|
13
13
|
|
14
|
-
def initialize
|
14
|
+
def initialize(options = {})
|
15
|
+
@silenced = options[:silenced] || !!ENV['MIGRATIONS_SILENCED']
|
15
16
|
SchemaMigration.mapped_label.create_constraint(:migration_id, type: :unique)
|
16
17
|
@schema_migrations = SchemaMigration.all.to_a
|
17
18
|
@up_versions = SortedSet.new(@schema_migrations.map(&:migration_id))
|
@@ -46,6 +47,10 @@ module Neo4j
|
|
46
47
|
end
|
47
48
|
end
|
48
49
|
|
50
|
+
def pending_migrations?
|
51
|
+
all_migrations.any? { |migration| !up?(migration) }
|
52
|
+
end
|
53
|
+
|
49
54
|
def status
|
50
55
|
output STATUS_TABLE_FORMAT, *STATUS_TABLE_HEADER
|
51
56
|
output SEPARATOR
|
@@ -118,7 +123,7 @@ MSG
|
|
118
123
|
end
|
119
124
|
|
120
125
|
def output(*string_format)
|
121
|
-
puts format(*string_format) unless
|
126
|
+
puts format(*string_format) unless @silenced
|
122
127
|
end
|
123
128
|
|
124
129
|
def output_migration_message(message)
|
data/lib/neo4j/model_schema.rb
CHANGED
@@ -79,22 +79,28 @@ module Neo4j
|
|
79
79
|
@model_indexes = @model_constraints = nil
|
80
80
|
end
|
81
81
|
|
82
|
+
def legacy_model_schema_informations
|
83
|
+
data = {index: [], constraint: []}
|
84
|
+
each_schema_element do |type, model, label, property_name|
|
85
|
+
data[type] << {label: label, property_name: property_name, model: model}
|
86
|
+
end
|
87
|
+
data
|
88
|
+
end
|
89
|
+
|
82
90
|
def validate_model_schema!
|
83
91
|
ensure_model_data_state!
|
84
92
|
messages = {index: [], constraint: []}
|
85
|
-
|
86
|
-
|
87
|
-
if
|
88
|
-
|
89
|
-
|
90
|
-
messages[type] << force_add_message(type, label, property_name)
|
91
|
-
end
|
93
|
+
each_schema_element do |type, model, label, property_name, exists|
|
94
|
+
if exists
|
95
|
+
log_warning!(type, model, property_name) if model.id_property_name.to_sym != property_name
|
96
|
+
else
|
97
|
+
messages[type] << force_add_message(type, label, property_name)
|
92
98
|
end
|
93
99
|
end
|
94
100
|
|
95
101
|
return if messages.values.all?(&:empty?)
|
96
102
|
|
97
|
-
fail validation_error_message(messages)
|
103
|
+
fail ::Neo4j::DeprecatedSchemaDefinitionError, validation_error_message(messages)
|
98
104
|
end
|
99
105
|
|
100
106
|
def validation_error_message(messages)
|
@@ -117,6 +123,16 @@ MSG
|
|
117
123
|
def log_warning!(index_or_constraint, model, property_name)
|
118
124
|
Neo4j::ActiveBase.logger.warn "WARNING: The #{index_or_constraint} option is no longer supported (Defined on #{model.name} for #{property_name})"
|
119
125
|
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def each_schema_element
|
130
|
+
[[:constraint, model_constraints], [:index, model_indexes]].each do |type, schema_elements|
|
131
|
+
schema_elements.each do |args|
|
132
|
+
yield(type, *args)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
120
136
|
end
|
121
137
|
end
|
122
138
|
end
|
data/lib/neo4j/railtie.rb
CHANGED
@@ -22,17 +22,10 @@ module Neo4j
|
|
22
22
|
end
|
23
23
|
|
24
24
|
# Rescue responses similar to ActiveRecord.
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
'Neo4j::ActiveNode::Labels::RecordNotFound' => :not_found
|
30
|
-
)
|
31
|
-
else
|
32
|
-
# For rails 3.0 and 3.1
|
33
|
-
ActionDispatch::ShowExceptions.rescue_responses['Neo4j::RecordNotFound'] = :not_found
|
34
|
-
ActionDispatch::ShowExceptions.rescue_responses['Neo4j::ActiveNode::Labels::RecordNotFound'] = :not_found
|
35
|
-
end
|
25
|
+
config.action_dispatch.rescue_responses.merge!(
|
26
|
+
'Neo4j::RecordNotFound' => :not_found,
|
27
|
+
'Neo4j::ActiveNode::Labels::RecordNotFound' => :not_found
|
28
|
+
)
|
36
29
|
|
37
30
|
# Add ActiveModel translations to the I18n load_path
|
38
31
|
initializer 'i18n' do
|
@@ -61,6 +54,7 @@ module Neo4j
|
|
61
54
|
session_types = cfg.sessions.map { |session_opts| session_opts[:type] }
|
62
55
|
|
63
56
|
register_neo4j_cypher_logging(session_types)
|
57
|
+
Neo4j::Migrations.check_for_pending_migrations! if Rails.env.development? && Neo4j::Config.fail_on_pending_migrations
|
64
58
|
end
|
65
59
|
|
66
60
|
TYPE_SUBSCRIBERS = {
|
data/lib/neo4j/shared/enum.rb
CHANGED
@@ -64,8 +64,7 @@ module Neo4j::Shared
|
|
64
64
|
end
|
65
65
|
end
|
66
66
|
|
67
|
-
VALID_OPTIONS_FOR_ENUMS = [:_prefix, :_suffix]
|
68
|
-
DEFAULT_OPTIONS_FOR_ENUMS = {}
|
67
|
+
VALID_OPTIONS_FOR_ENUMS = [:_index, :_prefix, :_suffix, :_default]
|
69
68
|
|
70
69
|
def split_options_and_parameters(parameters)
|
71
70
|
options = {}
|
@@ -80,9 +79,16 @@ module Neo4j::Shared
|
|
80
79
|
[options, new_parameters]
|
81
80
|
end
|
82
81
|
|
83
|
-
def define_property(property_name, enum_keys,
|
84
|
-
|
85
|
-
|
82
|
+
def define_property(property_name, enum_keys, options)
|
83
|
+
property_options = build_property_options(enum_keys, options)
|
84
|
+
property property_name, property_options
|
85
|
+
serialize property_name, Neo4j::Shared::TypeConverters::EnumConverter.new(enum_keys, property_options)
|
86
|
+
end
|
87
|
+
|
88
|
+
def build_property_options(_enum_keys, options = {})
|
89
|
+
{
|
90
|
+
default: options[:_default]
|
91
|
+
}
|
86
92
|
end
|
87
93
|
|
88
94
|
def define_enum_methods(property_name, enum_keys, options)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Neo4j::Shared
|
2
|
+
module PermittedAttributes
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
include ActiveModel::ForbiddenAttributesProtection
|
5
|
+
|
6
|
+
def process_attributes(attributes)
|
7
|
+
attributes = sanitize_input_parameters(attributes)
|
8
|
+
super(attributes)
|
9
|
+
end
|
10
|
+
|
11
|
+
def attributes=(attributes)
|
12
|
+
attributes = sanitize_input_parameters(attributes)
|
13
|
+
super(attributes)
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
# Check if an argument is a string or an ActionController::Parameters
|
19
|
+
def hash_or_parameter?(args)
|
20
|
+
args.is_a?(Hash) || args.respond_to?(:to_unsafe_h)
|
21
|
+
end
|
22
|
+
|
23
|
+
def sanitize_input_parameters(attributes)
|
24
|
+
attributes = sanitize_for_mass_assignment(attributes)
|
25
|
+
attributes.respond_to?(:symbolize_keys) ? attributes.symbolize_keys : attributes
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/neo4j/version.rb
CHANGED
@@ -2,12 +2,12 @@ require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'neo4j.rb')
|
|
2
2
|
|
3
3
|
module Neo4j
|
4
4
|
module Generators
|
5
|
-
class
|
6
|
-
|
7
|
-
|
8
|
-
@migration_class_name = file_name.camelize
|
5
|
+
class MigrationGenerator < ::Rails::Generators::NamedBase
|
6
|
+
include ::Neo4j::Generators::SourcePathHelper
|
7
|
+
include ::Neo4j::Generators::MigrationHelper
|
9
8
|
|
10
|
-
|
9
|
+
def create_migration_file
|
10
|
+
migration_template 'migration.erb'
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'neo4j.rb')
|
2
2
|
|
3
|
-
class Neo4j::Generators::ModelGenerator <
|
3
|
+
class Neo4j::Generators::ModelGenerator < Rails::Generators::NamedBase #:nodoc:
|
4
|
+
include ::Neo4j::Generators::SourcePathHelper
|
5
|
+
include ::Neo4j::Generators::MigrationHelper
|
6
|
+
|
4
7
|
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
5
8
|
|
6
9
|
check_class_collision
|
@@ -13,6 +16,7 @@ class Neo4j::Generators::ModelGenerator < Neo4j::Generators::Base #:nodoc:
|
|
13
16
|
|
14
17
|
def create_model_file
|
15
18
|
template 'model.erb', File.join('app/models', class_path, "#{singular_name}.rb")
|
19
|
+
migration_template 'migration.erb'
|
16
20
|
end
|
17
21
|
|
18
22
|
protected
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class <%= @migration_class_name %> < Neo4j::Migrations::Base
|
2
|
+
def up
|
3
|
+
<% @schema.each do |type, data|
|
4
|
+
data.each do |element| %>
|
5
|
+
add_<%= type %> <%= element[:label].inspect %>, <%= element[:property_name].inspect %>, force: true
|
6
|
+
<% end
|
7
|
+
end %>
|
8
|
+
end
|
9
|
+
|
10
|
+
def down
|
11
|
+
<% @schema.each do |type, data|
|
12
|
+
data.each do |element| %>
|
13
|
+
drop_<%= type %> <%= element[:label].inspect %>, <%= element[:property_name].inspect %>
|
14
|
+
<% end
|
15
|
+
end %>
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', '..', '..', 'neo4j.rb')
|
2
|
+
|
3
|
+
module Neo4j
|
4
|
+
module Generators
|
5
|
+
class UpgradeV8Generator < ::Rails::Generators::Base
|
6
|
+
include ::Neo4j::Generators::SourcePathHelper
|
7
|
+
include ::Neo4j::Generators::MigrationHelper
|
8
|
+
|
9
|
+
def create_upgrade_v8_file
|
10
|
+
@schema = load_all_models_schema!
|
11
|
+
migration_template 'migration.erb'
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_name
|
15
|
+
'upgrate_to_v8'
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def load_all_models_schema!
|
21
|
+
Rails.application.eager_load!
|
22
|
+
initialize_all_models!
|
23
|
+
Neo4j::ModelSchema.legacy_model_schema_informations
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize_all_models!
|
27
|
+
models = Neo4j::ActiveNode.loaded_classes
|
28
|
+
models.map(&:ensure_id_property_info!)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,19 +1,38 @@
|
|
1
1
|
require 'rails/generators/named_base'
|
2
2
|
require 'rails/generators/active_model'
|
3
3
|
|
4
|
-
|
5
4
|
module Neo4j
|
6
5
|
module Generators #:nodoc:
|
7
6
|
end
|
8
7
|
end
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
module Neo4j::Generators::MigrationHelper
|
10
|
+
extend ActiveSupport::Concern
|
11
|
+
|
12
|
+
def migration_file_name(file_name)
|
13
|
+
"#{Time.zone.now.strftime('%Y%m%d%H%M%S')}_#{file_name.parameterize}.rb"
|
14
|
+
end
|
15
|
+
|
16
|
+
def migration_template(template_name)
|
17
|
+
real_file_name = migration_file_name(file_name)
|
18
|
+
@migration_class_name = file_name.camelize
|
19
|
+
|
20
|
+
template template_name, File.join('db/neo4j/migrate', real_file_name)
|
14
21
|
end
|
15
22
|
end
|
16
23
|
|
24
|
+
module Neo4j::Generators::SourcePathHelper
|
25
|
+
extend ActiveSupport::Concern
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
def source_root
|
29
|
+
@_neo4j_source_root ||= File.expand_path(File.join(File.dirname(__FILE__),
|
30
|
+
'neo4j', generator_name, 'templates'))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
|
17
36
|
class Neo4j::Generators::ActiveModel < Rails::Generators::ActiveModel #:nodoc:
|
18
37
|
def self.all(klass)
|
19
38
|
"#{klass}.all"
|
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: 8.0.0.alpha.
|
4
|
+
version: 8.0.0.alpha.4
|
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: 2016-08
|
11
|
+
date: 2016-09-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: orm_adapter
|
@@ -226,6 +226,7 @@ files:
|
|
226
226
|
- Gemfile
|
227
227
|
- README.md
|
228
228
|
- bin/neo4j-jars
|
229
|
+
- bin/rake
|
229
230
|
- config/locales/en.yml
|
230
231
|
- config/neo4j/add_classnames.yml
|
231
232
|
- config/neo4j/config.yml
|
@@ -311,6 +312,7 @@ files:
|
|
311
312
|
- lib/neo4j/shared/initialize.rb
|
312
313
|
- lib/neo4j/shared/marshal.rb
|
313
314
|
- lib/neo4j/shared/mass_assignment.rb
|
315
|
+
- lib/neo4j/shared/permitted_attributes.rb
|
314
316
|
- lib/neo4j/shared/persistence.rb
|
315
317
|
- lib/neo4j/shared/property.rb
|
316
318
|
- lib/neo4j/shared/query_factory.rb
|
@@ -330,7 +332,10 @@ files:
|
|
330
332
|
- lib/rails/generators/neo4j/migration/migration_generator.rb
|
331
333
|
- lib/rails/generators/neo4j/migration/templates/migration.erb
|
332
334
|
- lib/rails/generators/neo4j/model/model_generator.rb
|
335
|
+
- lib/rails/generators/neo4j/model/templates/migration.erb
|
333
336
|
- lib/rails/generators/neo4j/model/templates/model.erb
|
337
|
+
- lib/rails/generators/neo4j/upgrade_v8/templates/migration.erb
|
338
|
+
- lib/rails/generators/neo4j/upgrade_v8/upgrade_v8_generator.rb
|
334
339
|
- lib/rails/generators/neo4j_generator.rb
|
335
340
|
- neo4j.gemspec
|
336
341
|
homepage: https://github.com/neo4jrb/neo4j/
|