orientdb-ar 0.0.4-jruby → 0.0.5-jruby
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.
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/bin/orientdbar_console +24 -6
- data/lib/orientdb-ar/attributes.rb +2 -3
- data/lib/orientdb-ar/base.rb +32 -30
- data/lib/orientdb-ar/document_mixin.rb +86 -12
- data/lib/orientdb-ar/embedded.rb +10 -14
- data/lib/orientdb-ar/ext.rb +39 -1
- data/lib/orientdb-ar/relations.rb +20 -54
- data/lib/orientdb-ar/relations/embedds_many.rb +40 -0
- data/lib/orientdb-ar/relations/embedds_one.rb +33 -0
- data/lib/orientdb-ar/relations/links_many.rb +46 -0
- data/lib/orientdb-ar/relations/links_one.rb +41 -0
- data/lib/orientdb-ar/sql/query.rb +6 -0
- data/orientdb-ar.gemspec +20 -12
- data/spec/dirty_spec.rb +25 -28
- data/spec/lint_behavior.rb +2 -2
- data/spec/lint_spec.rb +3 -2
- data/spec/model_spec.rb +207 -77
- data/spec/models/address.rb +3 -0
- data/spec/models/customer.rb +1 -0
- data/spec/models/invoice.rb +12 -0
- data/spec/models/invoice_line.rb +14 -0
- data/spec/models/person.rb +7 -0
- data/spec/models/phone_number.rb +2 -1
- data/spec/models/product.rb +17 -0
- data/spec/serialization_spec.rb +12 -16
- data/spec/spec_helper.rb +44 -15
- metadata +27 -12
- data/lib/orientdb-ar/validations.rb +0 -11
data/Rakefile
CHANGED
@@ -17,8 +17,9 @@ begin
|
|
17
17
|
gem.required_rubygems_version = ">= 1.3.6"
|
18
18
|
gem.rubyforge_project = "orientdb-ar"
|
19
19
|
|
20
|
-
gem.add_dependency "orientdb", "0.0.
|
20
|
+
gem.add_dependency "orientdb", ">= 0.0.20"
|
21
21
|
gem.add_dependency "activemodel", ">= 3.0.3"
|
22
|
+
gem.add_dependency "jnunemaker-validatable", "1.8.4"
|
22
23
|
gem.add_development_dependency "awesome_print"
|
23
24
|
gem.add_development_dependency "rspec", ">= 2.4"
|
24
25
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.5
|
data/bin/orientdbar_console
CHANGED
@@ -11,6 +11,7 @@ if ARGV.include?('test:db')
|
|
11
11
|
puts ">> GEM_ROOT : #{GEM_ROOT}"
|
12
12
|
puts ">> TEST_DB PATH : #{TEST_DB_PATH}"
|
13
13
|
|
14
|
+
require 'rspec'
|
14
15
|
require 'fileutils'
|
15
16
|
puts ">> Removing tmp directory #{TEMP_DIR} ..."
|
16
17
|
FileUtils.remove_dir TEMP_DIR + '/databases', true
|
@@ -20,12 +21,29 @@ if ARGV.include?('test:db')
|
|
20
21
|
DB = OrientDB::AR::Base.connection
|
21
22
|
puts ">> Connection : #{OrientDB::AR::Base.connection}"
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
def remove_constant(const) #:nodoc:
|
25
|
+
names = const.to_s.sub(/^::(Object)?/, 'Object::').split("::")
|
26
|
+
to_remove = names.pop
|
27
|
+
parent = names.join('::').constantize
|
28
|
+
parent.instance_eval { remove_const to_remove }
|
29
|
+
true
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_models
|
33
|
+
%w{ person simple_person address phone_number customer flo_admin product invoice_line invoice }.each do |name|
|
34
|
+
klass_name = name.camelize
|
35
|
+
klass_name = "Flo::Admin" if klass_name == "FloAdmin"
|
36
|
+
klass = klass_name.constantize rescue nil
|
37
|
+
if klass
|
38
|
+
puts ">> Removing class #{klass} ..."
|
39
|
+
remove_constant klass
|
40
|
+
end
|
41
|
+
puts ">> Loading #{klass_name} ..."
|
42
|
+
load SPEC_ROOT + '/models/' + name + '.rb'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
load_models
|
29
47
|
end
|
30
48
|
|
31
49
|
require 'irb'
|
@@ -18,12 +18,11 @@ module OrientDB::AR
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def [](attr)
|
21
|
-
|
22
|
-
res.respond_to?(:to_orientdb_ar) ? res.to_orientdb_ar : res
|
21
|
+
self.class.from_orientdb @odocument[attr]
|
23
22
|
end
|
24
23
|
|
25
24
|
def []=(attr, value)
|
26
|
-
value =
|
25
|
+
value = self.class.to_orientdb value
|
27
26
|
old_value = self[attr]
|
28
27
|
return old_value if value == old_value
|
29
28
|
attribute_will_change!(attr)
|
data/lib/orientdb-ar/base.rb
CHANGED
@@ -1,29 +1,37 @@
|
|
1
1
|
class OrientDB::AR::Base
|
2
2
|
|
3
|
-
def self.embeddable?
|
4
|
-
false
|
5
|
-
end
|
6
|
-
|
7
3
|
include ActiveModel::AttributeMethods
|
8
4
|
include OrientDB::AR::DocumentMixin
|
9
5
|
|
10
|
-
class_inheritable_hash :fields
|
11
|
-
self.fields = ActiveSupport::OrderedHash.new
|
12
|
-
|
13
6
|
class_attribute :connection
|
14
7
|
|
15
|
-
define_model_callbacks :save, :delete
|
8
|
+
define_model_callbacks :validation, :save, :delete
|
16
9
|
|
17
|
-
def save
|
10
|
+
def save(perform_validations = true)
|
18
11
|
_run_save_callbacks do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
12
|
+
if perform_validations
|
13
|
+
validate
|
14
|
+
if @last_validation_result
|
15
|
+
save_without_validations
|
16
|
+
else
|
17
|
+
false
|
18
|
+
end
|
19
|
+
else
|
20
|
+
save_without_validations
|
21
|
+
end
|
23
22
|
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def save_without_validations
|
26
|
+
@odocument.save
|
27
|
+
@saved = true
|
28
|
+
@previously_changed = @changed_attributes
|
29
|
+
@changed_attributes.clear
|
24
30
|
true
|
25
31
|
end
|
26
32
|
|
33
|
+
private :save_without_validations
|
34
|
+
|
27
35
|
def delete
|
28
36
|
_run_delete_callbacks do
|
29
37
|
@odocument.delete
|
@@ -34,7 +42,7 @@ class OrientDB::AR::Base
|
|
34
42
|
|
35
43
|
def reload
|
36
44
|
raise "Not persisted, cannot reload" unless persisted?
|
37
|
-
@odocument
|
45
|
+
@odocument = OrientDB::AR::Query.new(self.class).where('@rid' => rid.lit).first_result
|
38
46
|
@changed_attributes = { }
|
39
47
|
@errors = ActiveModel::Errors.new(self)
|
40
48
|
self
|
@@ -58,13 +66,13 @@ class OrientDB::AR::Base
|
|
58
66
|
|
59
67
|
attr_writer :oclass_name
|
60
68
|
|
61
|
-
def
|
62
|
-
|
69
|
+
def embeddable?
|
70
|
+
false
|
63
71
|
end
|
64
72
|
|
65
73
|
def oclass
|
66
74
|
unless defined?(@oclass)
|
67
|
-
options = {}
|
75
|
+
options = { }
|
68
76
|
unless descends_from_base?
|
69
77
|
super_oclass = superclass.oclass
|
70
78
|
options[:super] = super_oclass
|
@@ -75,12 +83,12 @@ class OrientDB::AR::Base
|
|
75
83
|
@oclass
|
76
84
|
end
|
77
85
|
|
78
|
-
def field(name, type, options = {})
|
86
|
+
def field(name, type, options = { })
|
79
87
|
name = name.to_sym
|
80
88
|
if fields.key? name
|
81
89
|
puts "Already defined field [#{name}]"
|
82
90
|
else
|
83
|
-
fields[name] = {:type => type}.update options
|
91
|
+
fields[name] = { :type => type }.update options
|
84
92
|
end
|
85
93
|
end
|
86
94
|
|
@@ -88,14 +96,7 @@ class OrientDB::AR::Base
|
|
88
96
|
superclass && superclass == OrientDB::AR::Base
|
89
97
|
end
|
90
98
|
|
91
|
-
def
|
92
|
-
fields.each do |field, options|
|
93
|
-
oclass.add field, options[:type], options.except(:type)
|
94
|
-
end
|
95
|
-
self
|
96
|
-
end
|
97
|
-
|
98
|
-
def create(fields = {})
|
99
|
+
def create(fields = { })
|
99
100
|
obj = new fields
|
100
101
|
obj.save
|
101
102
|
obj
|
@@ -123,11 +124,11 @@ class OrientDB::AR::Base
|
|
123
124
|
OrientDB::AR::Query.new(self).range(lower_rid, upper_rid)
|
124
125
|
end
|
125
126
|
|
126
|
-
def all(conditions = {})
|
127
|
+
def all(conditions = { })
|
127
128
|
OrientDB::AR::Query.new(self).where(conditions).all
|
128
129
|
end
|
129
130
|
|
130
|
-
def first(conditions = {})
|
131
|
+
def first(conditions = { })
|
131
132
|
OrientDB::AR::Query.new(self).where(conditions).first
|
132
133
|
end
|
133
134
|
|
@@ -150,8 +151,9 @@ class OrientDB::AR::Base
|
|
150
151
|
def clear
|
151
152
|
oclass.truncate
|
152
153
|
end
|
153
|
-
end
|
154
154
|
|
155
|
+
|
156
|
+
end
|
155
157
|
end
|
156
158
|
|
157
159
|
OrientDB::AR::Base.include_root_in_json = false
|
@@ -4,28 +4,43 @@ require 'active_support/core_ext/class/attribute_accessors'
|
|
4
4
|
require 'active_support/core_ext/kernel'
|
5
5
|
require 'active_support/core_ext/class/attribute'
|
6
6
|
require 'active_support/core_ext/class/inheritable_attributes'
|
7
|
+
require 'active_support/core_ext/module/aliasing'
|
7
8
|
require 'orientdb'
|
9
|
+
require 'validatable'
|
8
10
|
|
9
11
|
require 'orientdb-ar/conversion'
|
10
12
|
require 'orientdb-ar/attributes'
|
11
|
-
require 'orientdb-ar/validations'
|
12
13
|
require 'orientdb-ar/relations'
|
13
14
|
require 'orientdb-ar/sql'
|
15
|
+
|
14
16
|
module OrientDB::AR::DocumentMixin
|
15
17
|
|
16
|
-
|
18
|
+
def self.included(base)
|
19
|
+
base.class_eval do
|
20
|
+
include Comparable
|
21
|
+
|
22
|
+
include Validatable
|
23
|
+
alias_method_chain :valid?, :default_group
|
17
24
|
|
18
|
-
|
19
|
-
|
20
|
-
include OrientDB::AR::Validations
|
25
|
+
include OrientDB::AR::Attributes
|
26
|
+
include OrientDB::AR::Conversion
|
21
27
|
|
22
|
-
|
23
|
-
|
24
|
-
|
28
|
+
extend ActiveModel::Translation
|
29
|
+
include ActiveModel::Serializers::JSON
|
30
|
+
include ActiveModel::Serializers::Xml
|
31
|
+
|
32
|
+
extend ActiveModel::Callbacks
|
33
|
+
|
34
|
+
class_inheritable_hash :fields
|
35
|
+
self.fields = ActiveSupport::OrderedHash.new
|
36
|
+
|
37
|
+
class_inheritable_hash :relationships
|
38
|
+
self.relationships = ActiveSupport::OrderedHash.new
|
25
39
|
|
26
|
-
|
27
|
-
base.send :include, ActiveModel::Serializers::Xml
|
40
|
+
class_inheritable_accessor :default_validation_group
|
28
41
|
|
42
|
+
class_attribute :connection
|
43
|
+
end
|
29
44
|
base.extend OrientDB::AR::DocumentMixin::ClassMethods
|
30
45
|
end
|
31
46
|
|
@@ -38,10 +53,53 @@ module OrientDB::AR::DocumentMixin
|
|
38
53
|
fields.each { |k, v| send "#{k}=", v }
|
39
54
|
end
|
40
55
|
|
56
|
+
def human_id
|
57
|
+
rid
|
58
|
+
end
|
59
|
+
|
41
60
|
def field?(name)
|
42
61
|
@odocument.field?(name)
|
43
62
|
end
|
44
63
|
|
64
|
+
def validate
|
65
|
+
@last_validation_result = nil
|
66
|
+
_run_validation_callbacks do
|
67
|
+
@last_validation_result = valid?
|
68
|
+
end
|
69
|
+
@last_validation_result
|
70
|
+
end
|
71
|
+
|
72
|
+
def valid_with_default_group?
|
73
|
+
valid_for_group?(default_validation_group) && related_valid?
|
74
|
+
end
|
75
|
+
|
76
|
+
def related_valid?
|
77
|
+
res = related.all? do |rel_name, row_or_coll|
|
78
|
+
case row_or_coll
|
79
|
+
when Array
|
80
|
+
row_or_coll.all? do |result|
|
81
|
+
result.validate_to_parent errors, rel_name
|
82
|
+
end
|
83
|
+
else
|
84
|
+
row_or_coll.validate_to_parent errors, rel_name
|
85
|
+
end
|
86
|
+
end
|
87
|
+
res
|
88
|
+
end
|
89
|
+
|
90
|
+
def validate_to_parent(parent_errors, rel_name)
|
91
|
+
return true if valid?
|
92
|
+
errors.full_messages.each { |msg| parent_errors[rel_name] = "#{human_id} #{msg}" }
|
93
|
+
false
|
94
|
+
end
|
95
|
+
|
96
|
+
def related
|
97
|
+
relationships.map do |rel_name, options|
|
98
|
+
rel_obj = send options[:name]
|
99
|
+
rel_obj.blank? ? nil : [rel_name, rel_obj]
|
100
|
+
end.compact
|
101
|
+
end
|
102
|
+
|
45
103
|
def respond_to?(method_name)
|
46
104
|
# Simple field value lookup
|
47
105
|
return true if field?(method_name)
|
@@ -96,7 +154,8 @@ module OrientDB::AR::DocumentMixin
|
|
96
154
|
def inspect
|
97
155
|
attrs = attributes.map { |k, v| "#{k}:#{v.inspect}" }.join(' ')
|
98
156
|
super_klass = self.class.descends_from_base? ? '' : "(#{self.class.superclass.name})"
|
99
|
-
|
157
|
+
rid_str = embedded? ? '(E)' : ":#{@odocument.rid}"
|
158
|
+
%{#<#{self.class.name}#{super_klass}#{rid_str} #{attrs}>}
|
100
159
|
end
|
101
160
|
|
102
161
|
alias :to_s :inspect
|
@@ -109,8 +168,12 @@ module OrientDB::AR::DocumentMixin
|
|
109
168
|
|
110
169
|
attr_writer :oclass_name
|
111
170
|
|
171
|
+
def oclass_name_for(value)
|
172
|
+
value.to_s.gsub('::', '__')
|
173
|
+
end
|
174
|
+
|
112
175
|
def oclass_name
|
113
|
-
@oclass_name ||= name
|
176
|
+
@oclass_name ||= oclass_name_for name
|
114
177
|
end
|
115
178
|
|
116
179
|
def field(name, type, options = { })
|
@@ -122,6 +185,17 @@ module OrientDB::AR::DocumentMixin
|
|
122
185
|
end
|
123
186
|
end
|
124
187
|
|
188
|
+
def schema!
|
189
|
+
fields.each do |field, options|
|
190
|
+
begin
|
191
|
+
oclass.add field, options[:type], options.except(:type)
|
192
|
+
rescue Exception => e
|
193
|
+
raise e unless e.message =~ /already exists/
|
194
|
+
end
|
195
|
+
end
|
196
|
+
self
|
197
|
+
end
|
198
|
+
|
125
199
|
def new_document
|
126
200
|
OrientDB::Document.new connection, oclass_name
|
127
201
|
end
|
data/lib/orientdb-ar/embedded.rb
CHANGED
@@ -1,14 +1,9 @@
|
|
1
1
|
class OrientDB::AR::Embedded
|
2
2
|
|
3
|
-
def self.embeddable?
|
4
|
-
true
|
5
|
-
end
|
6
|
-
|
7
3
|
include ActiveModel::AttributeMethods
|
8
4
|
include OrientDB::AR::DocumentMixin
|
9
5
|
|
10
|
-
|
11
|
-
self.fields = ActiveSupport::OrderedHash.new
|
6
|
+
define_model_callbacks :validation
|
12
7
|
|
13
8
|
def save
|
14
9
|
raise "Not implemented on Embedded models"
|
@@ -36,6 +31,12 @@ class OrientDB::AR::Embedded
|
|
36
31
|
|
37
32
|
class << self
|
38
33
|
|
34
|
+
include OrientDB::AR::Relations
|
35
|
+
|
36
|
+
def embeddable?
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
39
40
|
def connection
|
40
41
|
OrientDB::AR::Base.connection
|
41
42
|
end
|
@@ -48,11 +49,7 @@ class OrientDB::AR::Embedded
|
|
48
49
|
superclass && superclass == OrientDB::AR::Embedded
|
49
50
|
end
|
50
51
|
|
51
|
-
def
|
52
|
-
raise "Not implemented on Embedded models"
|
53
|
-
end
|
54
|
-
|
55
|
-
def create(fields = {})
|
52
|
+
def create(fields = { })
|
56
53
|
raise "Not implemented on Embedded models"
|
57
54
|
end
|
58
55
|
|
@@ -78,11 +75,11 @@ class OrientDB::AR::Embedded
|
|
78
75
|
raise "Not implemented on Embedded models"
|
79
76
|
end
|
80
77
|
|
81
|
-
def all(conditions = {})
|
78
|
+
def all(conditions = { })
|
82
79
|
raise "Not implemented on Embedded models"
|
83
80
|
end
|
84
81
|
|
85
|
-
def first(conditions = {})
|
82
|
+
def first(conditions = { })
|
86
83
|
raise "Not implemented on Embedded models"
|
87
84
|
end
|
88
85
|
|
@@ -106,5 +103,4 @@ class OrientDB::AR::Embedded
|
|
106
103
|
raise "Not implemented on Embedded models"
|
107
104
|
end
|
108
105
|
end
|
109
|
-
|
110
106
|
end
|
data/lib/orientdb-ar/ext.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
1
3
|
class OrientDB::Document
|
2
4
|
def to_orientdb_ar
|
3
5
|
klass = getClassName.gsub('__', '::').constantize
|
@@ -31,6 +33,42 @@ class NilClass
|
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
36
|
+
class Float
|
37
|
+
def to_orientdb
|
38
|
+
to_java
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Java::JavaLang::Double
|
43
|
+
def to_orientdb_ar
|
44
|
+
to_s.to_f
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class Java::JavaUtil::Date
|
49
|
+
def to_orientdb_ar
|
50
|
+
::Time.at(getTime / 1000)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class Time
|
55
|
+
def to_orientdb
|
56
|
+
java.util.Date.new to_i * 1000
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Date
|
61
|
+
def to_orientdb
|
62
|
+
java.util.Date.new year - 1900, month - 1, day, 0, 0, 0
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
class DateTime
|
67
|
+
def to_orientdb
|
68
|
+
java.util.Date.new year - 1900, month - 1, day, hour, min, sec
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
34
72
|
class Array
|
35
73
|
def to_orientdb
|
36
74
|
map { |x| x.respond_to?(:to_orientdb) ? x.to_orientdb : x }
|
@@ -55,4 +93,4 @@ class Java::JavaUtil::ArrayList
|
|
55
93
|
def to_orientdb_ar
|
56
94
|
map { |x| x.respond_to?(:to_orientdb_ar) ? x.to_orientdb_ar : x }
|
57
95
|
end
|
58
|
-
end
|
96
|
+
end
|