neo4j 3.0.0.alpha.2 → 3.0.0.alpha.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +6 -0
- data/Gemfile +3 -0
- data/README.md +7 -2
- data/lib/neo4j.rb +8 -0
- data/lib/neo4j/active_node.rb +14 -1
- data/lib/neo4j/active_node/has_n/decl_rel.rb +3 -11
- data/lib/neo4j/active_node/has_n/nodes.rb +2 -2
- data/lib/neo4j/active_node/initialize.rb +3 -1
- data/lib/neo4j/active_node/labels.rb +9 -8
- data/lib/neo4j/active_node/persistence.rb +14 -4
- data/lib/neo4j/active_node/property.rb +2 -0
- data/lib/neo4j/railtie.rb +23 -11
- data/lib/neo4j/type_converters.rb +124 -0
- data/lib/neo4j/version.rb +1 -1
- data/lib/rails/generators/neo4j/model/model_generator.rb +79 -0
- data/lib/rails/generators/neo4j/model/templates/model.erb +11 -0
- data/lib/rails/generators/neo4j_generator.rb +74 -0
- data/lib/test.rb +16 -0
- data/neo4j.gemspec +1 -1
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f3c1c35ef38235d2f240757530f1fec08473cc8
|
4
|
+
data.tar.gz: a0e24982bc743984f10a702d8933be694c9c2adf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee0818fd0db7f265ab529f0bf8792c862cec09daa137aa340f3b0f009d419e664c53c21541775be7c883dc66e29b016a360949a45eadffefce7966d54a9153d0
|
7
|
+
data.tar.gz: f37ed9996c2d068663e574887bf29828a29d9b9250144006701d14e4bc17b64259be36bf96c0ec4ca6046a52ed81d577b2300bdfc7f46629e73825bfec28af1b
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
== 3.0.0.alpha.3
|
2
|
+
* Support for rails scaffolds
|
3
|
+
* Support for created_at and updated_at (#305)
|
4
|
+
* Support for ability to select a session to use per model (#299)
|
5
|
+
* BugFix: updating a model should not clear out old properties (#296)
|
6
|
+
|
1
7
|
== 3.0.0.alpha.2
|
2
8
|
* Support for both embedded (only JRuby) and server API (runs on MRI Ruby !)
|
3
9
|
* Simple Rails app now work
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
-
# Welcome to Neo4j.rb [![Build Status](https://secure.travis-ci.org/andreasronge/neo4j.png?branch=master)](http://travis-ci.org/andreasronge/neo4j) [![
|
2
|
-
|
1
|
+
# Welcome to Neo4j.rb [![Build Status](https://secure.travis-ci.org/andreasronge/neo4j.png?branch=master)](http://travis-ci.org/andreasronge/neo4j) [![Coverage Status](https://coveralls.io/repos/andreasronge/neo4j/badge.png)](https://coveralls.io/r/andreasronge/neo4j) [![Code Climate](https://codeclimate.com/github/andreasronge/neo4j.png)](https://codeclimate.com/github/andreasronge/neo4j)
|
2
|
+
|
3
3
|
Neo4j.rb is a graph database for Ruby (and JRuby)
|
4
4
|
|
5
5
|
## Version 3.0
|
6
6
|
|
7
|
+
Unstable !
|
8
|
+
|
7
9
|
* Wiki: https://github.com/andreasronge/neo4j/wiki/Neo4j-v3
|
8
10
|
* Example: https://github.com/andreasronge/neo4j/tree/3.0/example/blog
|
9
11
|
|
12
|
+
## Version 2.x
|
13
|
+
|
14
|
+
This is the stable version, see https://github.com/andreasronge/neo4j/tree/2.x
|
10
15
|
|
11
16
|
## Contributing
|
12
17
|
|
data/lib/neo4j.rb
CHANGED
@@ -16,6 +16,7 @@ require 'active_support/core_ext/class/attribute.rb'
|
|
16
16
|
|
17
17
|
require 'active_attr'
|
18
18
|
require 'neo4j/wrapper'
|
19
|
+
require 'neo4j/type_converters'
|
19
20
|
require "neo4j/active_node/labels"
|
20
21
|
require 'neo4j/active_node/identity'
|
21
22
|
require 'neo4j/active_node/callbacks'
|
@@ -28,3 +29,10 @@ require 'neo4j/active_node/has_n'
|
|
28
29
|
require 'neo4j/active_node/has_n/decl_rel'
|
29
30
|
require 'neo4j/active_node/has_n/nodes'
|
30
31
|
require 'neo4j/active_node'
|
32
|
+
|
33
|
+
if defined? Rails::Generators
|
34
|
+
# TODO, not sure this is the correct way of adding rails generators
|
35
|
+
# See https://github.com/andreasronge/neo4j/blob/gh-pages/neo4j.rb
|
36
|
+
# It is required from the rails config/application file
|
37
|
+
require 'rails/generators/neo4j_generator'
|
38
|
+
end
|
data/lib/neo4j/active_node.rb
CHANGED
@@ -46,6 +46,19 @@ module Neo4j
|
|
46
46
|
_persisted_node || raise("Tried to access native neo4j object on a none persisted object")
|
47
47
|
end
|
48
48
|
|
49
|
+
module ClassMethods
|
50
|
+
def neo4j_session_name (name)
|
51
|
+
@neo4j_session_name = name
|
52
|
+
end
|
53
|
+
|
54
|
+
def neo4j_session
|
55
|
+
if @neo4j_session_name
|
56
|
+
Neo4j::Session.named(@neo4j_session_name) || raise("#{self.name} is configured to use a neo4j session named #{@neo4j_session_name}, but no such session is registered with Neo4j::Session")
|
57
|
+
else
|
58
|
+
Neo4j::Session.current
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
49
62
|
|
50
63
|
included do
|
51
64
|
def self.inherited(other)
|
@@ -57,4 +70,4 @@ module Neo4j
|
|
57
70
|
end
|
58
71
|
end
|
59
72
|
end
|
60
|
-
end
|
73
|
+
end
|
@@ -201,8 +201,7 @@ module Neo4j
|
|
201
201
|
end
|
202
202
|
|
203
203
|
def all_relationships(node)
|
204
|
-
|
205
|
-
Enumerator.new(self, :each_rel, node)
|
204
|
+
to_enum(:each_rel, node)
|
206
205
|
end
|
207
206
|
|
208
207
|
def each_rel(node, &block) #:nodoc:
|
@@ -218,16 +217,9 @@ module Neo4j
|
|
218
217
|
end
|
219
218
|
|
220
219
|
# @private
|
221
|
-
def
|
222
|
-
node._rels(dir: dir, type: rel_type).each do |rel|
|
223
|
-
block.call rel._other_node(node)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
|
227
|
-
# @private
|
228
|
-
def create_relationship_to(node, other) # :nodoc:
|
220
|
+
def create_relationship_to(node, other, relationship_props={}) # :nodoc:
|
229
221
|
from, to = incoming? ? [other, node] : [node, other]
|
230
|
-
from.create_rel(@rel_type, to)
|
222
|
+
from.create_rel(@rel_type, to, relationship_props)
|
231
223
|
end
|
232
224
|
|
233
225
|
end
|
@@ -55,8 +55,8 @@ module Neo4j
|
|
55
55
|
|
56
56
|
# Creates a relationship instance between this and the other node.
|
57
57
|
# Returns the relationship object
|
58
|
-
def create(other)
|
59
|
-
@decl_rel.create_relationship_to(@node, other)
|
58
|
+
def create(other, relationship_props)
|
59
|
+
@decl_rel.create_relationship_to(@node, other, relationship_props)
|
60
60
|
end
|
61
61
|
|
62
62
|
|
@@ -1,15 +1,17 @@
|
|
1
1
|
module Neo4j::ActiveNode::Initialize
|
2
2
|
extend ActiveSupport::Concern
|
3
|
+
include Neo4j::TypeConverters
|
3
4
|
|
4
5
|
attr_reader :_persisted_node
|
5
6
|
|
6
7
|
# called when loading the node from the database
|
7
8
|
# @param [Neo4j::Node] persisted_node the node this class wraps
|
8
|
-
# @param [Hash] properties
|
9
|
+
# @param [Hash] properties of the persisted node.
|
9
10
|
def init_on_load(persisted_node, properties)
|
10
11
|
@_persisted_node = persisted_node
|
11
12
|
@changed_attributes && @changed_attributes.clear
|
12
13
|
@attributes = attributes.merge(properties.stringify_keys)
|
14
|
+
@attributes = convert_properties_to :ruby, @attributes
|
13
15
|
end
|
14
16
|
|
15
17
|
# Implements the Neo4j::Node#wrapper and Neo4j::Relationship#wrapper method
|
@@ -46,8 +46,8 @@ module Neo4j
|
|
46
46
|
|
47
47
|
# Find all nodes/objects of this class, with given search criteria
|
48
48
|
# @param [Hash, nil] args the search critera or nil if finding all
|
49
|
-
# @param [Neo4j::Session] session defaults to the
|
50
|
-
def all(args = nil, session =
|
49
|
+
# @param [Neo4j::Session] session defaults to the model's session
|
50
|
+
def all(args = nil, session = self.neo4j_session)
|
51
51
|
if (args)
|
52
52
|
find_by_hash(args, session)
|
53
53
|
else
|
@@ -56,7 +56,7 @@ module Neo4j
|
|
56
56
|
end
|
57
57
|
|
58
58
|
# @return [Fixnum] number of nodes of this class
|
59
|
-
def count(session =
|
59
|
+
def count(session = self.neo4j_session)
|
60
60
|
q = session.query("MATCH (n:`#{mapped_label_name}`) RETURN count(n) AS count")
|
61
61
|
q.to_a[0][:count]
|
62
62
|
end
|
@@ -64,7 +64,7 @@ module Neo4j
|
|
64
64
|
# Same as #all but return only one object
|
65
65
|
# If given a String or Fixnum it will return the object with that neo4j id.
|
66
66
|
# @param [Hash,String,Fixnum] args search criteria
|
67
|
-
def find(args, session =
|
67
|
+
def find(args, session = self.neo4j_session)
|
68
68
|
case args
|
69
69
|
when Hash
|
70
70
|
find_by_hash(args, session).first
|
@@ -78,14 +78,14 @@ module Neo4j
|
|
78
78
|
|
79
79
|
# Destroy all nodes an connected relationships
|
80
80
|
def destroy_all
|
81
|
-
|
82
|
-
|
81
|
+
self.neo4j_session._query("MATCH (n:`#{mapped_label_name}`)-[r]-() DELETE n,r")
|
82
|
+
self.neo4j_session._query("MATCH (n:`#{mapped_label_name}`) DELETE n")
|
83
83
|
end
|
84
84
|
|
85
85
|
# Creates a Neo4j index on given property
|
86
86
|
# @param [Symbol] property the property we want a Neo4j index on
|
87
87
|
def index(property)
|
88
|
-
if
|
88
|
+
if self.neo4j_session
|
89
89
|
_index(property)
|
90
90
|
else
|
91
91
|
Neo4j::Session.add_listener do |event, _|
|
@@ -134,9 +134,10 @@ module Neo4j
|
|
134
134
|
def set_mapped_label_name(name)
|
135
135
|
@_label_name = name.to_sym
|
136
136
|
end
|
137
|
+
|
137
138
|
end
|
138
139
|
|
139
140
|
end
|
140
141
|
|
141
142
|
end
|
142
|
-
end
|
143
|
+
end
|
@@ -10,6 +10,7 @@ module Neo4j::ActiveNode
|
|
10
10
|
end
|
11
11
|
|
12
12
|
extend ActiveSupport::Concern
|
13
|
+
include Neo4j::TypeConverters
|
13
14
|
|
14
15
|
# Saves the model.
|
15
16
|
#
|
@@ -18,14 +19,22 @@ module Neo4j::ActiveNode
|
|
18
19
|
# If any of them fail the action is cancelled and save returns false. If the flag is false validations are bypassed altogether. See ActiveRecord::Validations for more information.
|
19
20
|
# There’s a series of callbacks associated with save. If any of the before_* callbacks return false the action is cancelled and save returns false.
|
20
21
|
def save(*)
|
22
|
+
# Update magic properties
|
23
|
+
update_magic_properties
|
21
24
|
create_or_update
|
22
25
|
end
|
23
26
|
|
27
|
+
def update_magic_properties
|
28
|
+
self.updated_at = DateTime.now if respond_to?(:updated_at=)
|
29
|
+
end
|
30
|
+
|
24
31
|
# Creates a model with values matching those of the instance attributes and returns its id.
|
25
32
|
# @private
|
26
33
|
# @return true
|
27
34
|
def create_model(*)
|
28
|
-
|
35
|
+
self.created_at = DateTime.now if respond_to?(:created_at=)
|
36
|
+
properties = convert_properties_to :db, props
|
37
|
+
node = _create_node(properties)
|
29
38
|
init_on_load(node, node.props)
|
30
39
|
# Neo4j::IdentityMap.add(node, self)
|
31
40
|
# write_changed_relationships
|
@@ -94,13 +103,14 @@ module Neo4j::ActiveNode
|
|
94
103
|
def update_model
|
95
104
|
if @changed_attributes && !@changed_attributes.empty?
|
96
105
|
changed_props = attributes.select{|k,v| @changed_attributes.include?(k)}
|
97
|
-
|
106
|
+
changed_props = convert_properties_to :db, changed_props
|
107
|
+
_persisted_node.update_props(changed_props)
|
98
108
|
@changed_attributes.clear
|
99
109
|
end
|
100
110
|
end
|
101
111
|
|
102
112
|
def _create_node(*args)
|
103
|
-
session =
|
113
|
+
session = self.class.neo4j_session
|
104
114
|
props = args[0] if args[0].is_a?(Hash)
|
105
115
|
labels = self.class.mapped_label_names
|
106
116
|
session.create_node(props, labels)
|
@@ -190,4 +200,4 @@ module Neo4j::ActiveNode
|
|
190
200
|
|
191
201
|
end
|
192
202
|
|
193
|
-
end
|
203
|
+
end
|
data/lib/neo4j/railtie.rb
CHANGED
@@ -15,22 +15,34 @@ module Neo4j
|
|
15
15
|
|
16
16
|
cfg.session_type ||= :server_db
|
17
17
|
cfg.session_path ||= "http://localhost:7474"
|
18
|
+
cfg.sessions ||= []
|
18
19
|
|
19
|
-
if
|
20
|
-
|
20
|
+
if cfg.sessions.empty?
|
21
|
+
cfg.sessions << {type: cfg.session_type, path: cfg.session_path}
|
21
22
|
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
24
|
+
cfg.sessions.each do |session_opts|
|
25
|
+
if !(RUBY_PLATFORM =~ /java/) && session_opts[:type] == :embedded_db
|
26
|
+
raise "Tried to start embedded Neo4j db without using JRuby (got #{RUBY_PLATFORM}), please run `rvm jruby`"
|
27
|
+
end
|
26
28
|
|
27
|
-
#
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
29
|
+
puts "Create Neo4j Session #{session_opts[:type]}, path: #{session_opts[:path]}"
|
30
|
+
if (session_opts.key? :name)
|
31
|
+
session = Neo4j::Session.open_named(session_opts[:type], session_opts[:name], session_opts[:default], session_opts[:path])
|
32
|
+
else
|
33
|
+
session = Neo4j::Session.open(session_opts[:type], session_opts[:path])
|
34
|
+
end
|
32
35
|
|
33
|
-
|
36
|
+
if session_opts[:type] == :embedded_db
|
37
|
+
|
38
|
+
# See https://github.com/jruby/jruby/wiki/UnlimitedStrengthCrypto
|
39
|
+
security_class = java.lang.Class.for_name('javax.crypto.JceSecurity')
|
40
|
+
restricted_field = security_class.get_declared_field('isRestricted')
|
41
|
+
restricted_field.accessible = true
|
42
|
+
restricted_field.set nil, false
|
43
|
+
|
44
|
+
session.start
|
45
|
+
end
|
34
46
|
end
|
35
47
|
|
36
48
|
#cfg.storage_path = "#{app.config.root}/db/neo4j-#{::Rails.env}" unless cfg.storage_path
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Neo4j
|
2
|
+
|
3
|
+
module TypeConverters
|
4
|
+
|
5
|
+
|
6
|
+
# Converts Date objects to Java long types. Must be timezone UTC.
|
7
|
+
class DateConverter
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def convert_type
|
11
|
+
Date
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_db(value)
|
15
|
+
return nil if value.nil?
|
16
|
+
Time.utc(value.year, value.month, value.day).to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_ruby(value)
|
20
|
+
return nil if value.nil?
|
21
|
+
Time.at(value).utc.to_date
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Converts DateTime objects to and from Java long types. Must be timezone UTC.
|
28
|
+
class DateTimeConverter
|
29
|
+
class << self
|
30
|
+
|
31
|
+
def convert_type
|
32
|
+
DateTime
|
33
|
+
end
|
34
|
+
|
35
|
+
# Converts the given DateTime (UTC) value to an Fixnum.
|
36
|
+
# DateTime values are automatically converted to UTC.
|
37
|
+
def to_db(value)
|
38
|
+
return nil if value.nil?
|
39
|
+
value = value.new_offset(0) if value.respond_to?(:new_offset)
|
40
|
+
if value.class == Date
|
41
|
+
Time.utc(value.year, value.month, value.day, 0, 0, 0).to_i
|
42
|
+
else
|
43
|
+
Time.utc(value.year, value.month, value.day, value.hour, value.min, value.sec).to_i
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_ruby(value)
|
48
|
+
return nil if value.nil?
|
49
|
+
t = Time.at(value).utc
|
50
|
+
DateTime.civil(t.year, t.month, t.day, t.hour, t.min, t.sec)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
class TimeConverter
|
57
|
+
class << self
|
58
|
+
|
59
|
+
def convert_type
|
60
|
+
Time
|
61
|
+
end
|
62
|
+
|
63
|
+
# Converts the given DateTime (UTC) value to an Fixnum.
|
64
|
+
# Only utc times are supported !
|
65
|
+
def to_db(value)
|
66
|
+
return nil if value.nil?
|
67
|
+
if value.class == Date
|
68
|
+
Time.utc(value.year, value.month, value.day, 0, 0, 0).to_i
|
69
|
+
else
|
70
|
+
value.utc.to_i
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_ruby(value)
|
75
|
+
return nil if value.nil?
|
76
|
+
Time.at(value).utc
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def convert_properties_to(medium, properties)
|
83
|
+
# Perform type conversion
|
84
|
+
properties = properties.inject({}) do |new_attributes, key_value_pair|
|
85
|
+
attr, value = key_value_pair
|
86
|
+
type = self.class._attribute_type(attr)
|
87
|
+
new_attributes[attr] = if TypeConverters.converters[type].nil?
|
88
|
+
value
|
89
|
+
else
|
90
|
+
TypeConverters.send "to_#{medium}", value, type
|
91
|
+
end
|
92
|
+
new_attributes
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class << self
|
97
|
+
|
98
|
+
# Converts the value to ruby from a Neo4j database value if there is a converter for given type
|
99
|
+
def to_ruby(value, type = nil)
|
100
|
+
found_converter = converters[type]
|
101
|
+
found_converter ? found_converter.to_ruby(value) : value
|
102
|
+
end
|
103
|
+
|
104
|
+
# Converts the value to a Neo4j database value from ruby if there is a converter for given type
|
105
|
+
def to_db(value, type = nil)
|
106
|
+
found_converter = converters[type]
|
107
|
+
found_converter ? found_converter.to_db(value) : value
|
108
|
+
end
|
109
|
+
|
110
|
+
def converters
|
111
|
+
@converters ||= begin
|
112
|
+
Neo4j::TypeConverters.constants.find_all do |c|
|
113
|
+
Neo4j::TypeConverters.const_get(c).respond_to?(:convert_type)
|
114
|
+
end.map do |c|
|
115
|
+
Neo4j::TypeConverters.const_get(c)
|
116
|
+
end.inject({}) do |ack, t|
|
117
|
+
ack[t.convert_type] = t
|
118
|
+
ack
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
data/lib/neo4j/version.rb
CHANGED
@@ -0,0 +1,79 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', '..', '..', '..','neo4j.rb')
|
2
|
+
|
3
|
+
class Neo4j::Generators::ModelGenerator < Neo4j::Generators::Base #:nodoc:
|
4
|
+
argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
|
5
|
+
|
6
|
+
check_class_collision
|
7
|
+
|
8
|
+
class_option :timestamps, :type => :boolean
|
9
|
+
class_option :parent, :type => :string, :desc => "The parent class for the generated model"
|
10
|
+
class_option :indices, :type => :array, :desc => "The properties which should be indexed"
|
11
|
+
class_option :has_one, :type => :array, :desc => "A list of has_one relationships"
|
12
|
+
class_option :has_n, :type => :array, :desc => "A list of has_n relationships"
|
13
|
+
|
14
|
+
def create_model_file
|
15
|
+
template "model.erb", File.join('app/models', "#{singular_name}.rb")
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
def migration?
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
def timestamps?
|
24
|
+
options[:timestamps]
|
25
|
+
end
|
26
|
+
|
27
|
+
def has_n?
|
28
|
+
options[:has_n]
|
29
|
+
end
|
30
|
+
|
31
|
+
def has_n_statements
|
32
|
+
txt = ""
|
33
|
+
options[:has_n].each do |key|
|
34
|
+
to, from = key.split(':')
|
35
|
+
txt << (from ? "\n has_n(:#{to}).from(:#{from})\n" : "\n has_n :#{to}")
|
36
|
+
end
|
37
|
+
txt
|
38
|
+
end
|
39
|
+
|
40
|
+
def has_one?
|
41
|
+
options[:has_one]
|
42
|
+
end
|
43
|
+
|
44
|
+
def has_one_statements
|
45
|
+
txt = ""
|
46
|
+
options[:has_one].each do |key|
|
47
|
+
to, from = key.split(':')
|
48
|
+
txt << (from ? "\n has_one(:#{to}).from(:#{from})\n" : "\n has_one :#{to}")
|
49
|
+
end
|
50
|
+
txt
|
51
|
+
end
|
52
|
+
|
53
|
+
def indices?
|
54
|
+
options[:indices]
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def index_fragment(property)
|
59
|
+
if options[:indices] && options[:indices].include?(property)
|
60
|
+
"index :#{property}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def parent?
|
65
|
+
options[:parent]
|
66
|
+
end
|
67
|
+
|
68
|
+
def timestamp_statements
|
69
|
+
%q{
|
70
|
+
property :created_at, :type => DateTime
|
71
|
+
# property :created_on, :type => Date
|
72
|
+
|
73
|
+
property :updated_at, :type => DateTime
|
74
|
+
# property :updated_on, :type => Date
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
hook_for :test_framework
|
79
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class <%= class_name %> <%= parent? ? "#{options[:parent].classify}" : "" %>
|
2
|
+
include Neo4j::ActiveNode
|
3
|
+
<% attributes.each do |attribute| -%>
|
4
|
+
property :<%= attribute.name %><%= ", :type => #{attribute.type_class}" unless attribute.type_class == 'any' %>
|
5
|
+
<%= index_fragment(attribute.name) %>
|
6
|
+
<% end -%>
|
7
|
+
<%= has_n_statements if has_n? -%>
|
8
|
+
<%= has_one_statements if has_one? -%>
|
9
|
+
|
10
|
+
<%= timestamp_statements if timestamps? -%>
|
11
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rails/generators/named_base'
|
2
|
+
require 'rails/generators/active_model'
|
3
|
+
|
4
|
+
|
5
|
+
module Neo4j
|
6
|
+
module Generators #:nodoc:
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class Neo4j::Generators::Base < ::Rails::Generators::NamedBase #:nodoc:
|
11
|
+
def self.source_root
|
12
|
+
@_neo4j_source_root ||= File.expand_path(File.join(File.dirname(__FILE__),
|
13
|
+
'neo4j', generator_name, 'templates'))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Neo4j::Generators::ActiveModel < Rails::Generators::ActiveModel #:nodoc:
|
18
|
+
def self.all(klass)
|
19
|
+
"#{klass}.all"
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.find(klass, params=nil)
|
23
|
+
"#{klass}.find(#{params})"
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.build(klass, params=nil)
|
27
|
+
if params
|
28
|
+
"#{klass}.new(#{params})"
|
29
|
+
else
|
30
|
+
"#{klass}.new"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def save
|
35
|
+
"#{name}.save"
|
36
|
+
end
|
37
|
+
|
38
|
+
def update_attributes(params=nil)
|
39
|
+
"#{name}.update_attributes(#{params})"
|
40
|
+
end
|
41
|
+
|
42
|
+
def errors
|
43
|
+
"#{name}.errors"
|
44
|
+
end
|
45
|
+
|
46
|
+
def destroy
|
47
|
+
"#{name}.destroy"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module Rails
|
52
|
+
module Generators
|
53
|
+
class GeneratedAttribute #:nodoc:
|
54
|
+
def type_class
|
55
|
+
case type.to_s.downcase
|
56
|
+
when 'any' then
|
57
|
+
'any'
|
58
|
+
when 'datetime' then
|
59
|
+
'DateTime'
|
60
|
+
when 'date' then
|
61
|
+
'Date'
|
62
|
+
when 'text' then
|
63
|
+
'String'
|
64
|
+
when 'integer', 'number', 'fixnum' then
|
65
|
+
'Fixnum'
|
66
|
+
when 'float' then
|
67
|
+
'Float'
|
68
|
+
else
|
69
|
+
'String'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/test.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'neo4j'
|
2
|
+
|
3
|
+
class Person
|
4
|
+
include Neo4j::ActiveNode
|
5
|
+
property :born, type: Date
|
6
|
+
property :since
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
#Neo4j::Session.open(:server_db, 'http://localhost:7474')
|
11
|
+
|
12
|
+
puts "Type #{Person._attribute_type(:born)}, class #{Person._attribute_type(:born).class}"
|
13
|
+
puts "Type since #{Person._attribute_type(:since)}"
|
14
|
+
p = Person.new(born: Date.today)
|
15
|
+
#p.save
|
16
|
+
puts "BORN #{p.born} type: #{p.born.class}"
|
data/neo4j.gemspec
CHANGED
@@ -32,7 +32,7 @@ It comes included with the Apache Lucene document database.
|
|
32
32
|
s.add_dependency("activemodel", "~> 4.0.0")
|
33
33
|
s.add_dependency("railties", "~> 4.0.0")
|
34
34
|
s.add_dependency('active_attr', "~> 0.8")
|
35
|
-
s.add_dependency("neo4j-core", "= 3.0.0.alpha.
|
35
|
+
s.add_dependency("neo4j-core", "= 3.0.0.alpha.8")
|
36
36
|
|
37
37
|
if RUBY_PLATFORM =~ /java/
|
38
38
|
s.add_dependency("neo4j-community", '~> 2.0.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.alpha.
|
4
|
+
version: 3.0.0.alpha.3
|
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-01-
|
11
|
+
date: 2014-01-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: orm_adapter
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.0.0.alpha.
|
75
|
+
version: 3.0.0.alpha.8
|
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: 3.0.0.alpha.
|
82
|
+
version: 3.0.0.alpha.8
|
83
83
|
description: "You can think of Neo4j as a high-performance graph engine with all the
|
84
84
|
features of a mature and robust database.\nThe programmer works with an object-oriented,
|
85
85
|
flexible network structure rather than with strict and static tables \nyet enjoys
|
@@ -106,9 +106,14 @@ files:
|
|
106
106
|
- lib/neo4j/active_node/validations.rb
|
107
107
|
- lib/neo4j/active_node.rb
|
108
108
|
- lib/neo4j/railtie.rb
|
109
|
+
- lib/neo4j/type_converters.rb
|
109
110
|
- lib/neo4j/version.rb
|
110
111
|
- lib/neo4j/wrapper.rb
|
111
112
|
- lib/neo4j.rb
|
113
|
+
- lib/rails/generators/neo4j/model/model_generator.rb
|
114
|
+
- lib/rails/generators/neo4j/model/templates/model.erb
|
115
|
+
- lib/rails/generators/neo4j_generator.rb
|
116
|
+
- lib/test.rb
|
112
117
|
- config/locales/en.yml
|
113
118
|
- config/neo4j/config.yml
|
114
119
|
- README.md
|