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
@@ -1,65 +1,31 @@
|
|
1
1
|
module OrientDB::AR
|
2
2
|
module Relations
|
3
3
|
|
4
|
-
|
5
|
-
klass = klass_for klass
|
6
|
-
name = options[:name].to_s || field_name_for(klass, true)
|
7
|
-
|
8
|
-
field name, [OrientDB::FIELD_TYPES[:embedded], klass.oclass]
|
9
|
-
|
10
|
-
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
11
|
-
def #{name} # def address
|
12
|
-
self[:#{name}] # self[:address]
|
13
|
-
end # end
|
14
|
-
eorb
|
15
|
-
|
16
|
-
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
17
|
-
def #{name}=(value) # def address=(value)
|
18
|
-
self[:#{name}] = value # self[:address] = value.odocument
|
19
|
-
#{name} # address
|
20
|
-
end # end
|
21
|
-
eorb
|
22
|
-
end
|
23
|
-
|
24
|
-
def embedds_many(klass, options = {})
|
25
|
-
klass = klass_for klass
|
26
|
-
name = options[:name].to_s || field_name_for(klass, false)
|
27
|
-
|
28
|
-
field name, [OrientDB::FIELD_TYPES[:embedded_list], klass.oclass]
|
29
|
-
|
30
|
-
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
31
|
-
def #{name} # def addresses
|
32
|
-
self[:#{name}] # self[:addresses]
|
33
|
-
end # end
|
34
|
-
eorb
|
35
|
-
|
36
|
-
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
37
|
-
def #{name}=(value) # def addresses=(value)
|
38
|
-
self[:#{name}] # self[:addresses]
|
39
|
-
end # end
|
40
|
-
eorb
|
4
|
+
private
|
41
5
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
6
|
+
def check_rel_options(klass_name, options, plurality, default = nil)
|
7
|
+
klass_name = klass_name_for klass_name
|
8
|
+
options[:plurality] ||= plurality
|
9
|
+
options[:name] ||= field_name_for klass_name, plurality
|
10
|
+
options[:name] = options[:name].to_s
|
11
|
+
options[:default] ||= default
|
12
|
+
[klass_name, options]
|
49
13
|
end
|
50
14
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
return klass if klass.class.name == 'Class'
|
55
|
-
klass.to_s.singularize.camelize.constantize
|
56
|
-
rescue
|
57
|
-
raise "Problem getting klass for [#{klass}]"
|
15
|
+
def klass_name_for(klass_name)
|
16
|
+
return klass_name.name if klass_name.class.name == 'Class'
|
17
|
+
klass_name.to_s
|
58
18
|
end
|
59
19
|
|
60
|
-
def field_name_for(klass,
|
61
|
-
|
20
|
+
def field_name_for(klass, plurality)
|
21
|
+
plurality_meth = plurality.to_s + 'ize'
|
22
|
+
klass.to_s.underscore.send(plurality_meth).gsub('/', '__')
|
62
23
|
end
|
63
24
|
|
64
25
|
end
|
65
|
-
end
|
26
|
+
end
|
27
|
+
|
28
|
+
require 'orientdb-ar/relations/embedds_one'
|
29
|
+
require 'orientdb-ar/relations/embedds_many'
|
30
|
+
require 'orientdb-ar/relations/links_one'
|
31
|
+
require 'orientdb-ar/relations/links_many'
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module OrientDB::AR
|
2
|
+
module Relations
|
3
|
+
|
4
|
+
def embedds_many(klass_name, options = { })
|
5
|
+
klass_name, options = check_rel_options klass_name, options, :plural, []
|
6
|
+
name = options[:name]
|
7
|
+
|
8
|
+
relationships[name] = options.merge :type => :embedds_many, :class_name => klass_name
|
9
|
+
|
10
|
+
field name, [OrientDB::FIELD_TYPES[:embedded_list], OrientDB::AR::Base.oclass_name_for(klass_name)]
|
11
|
+
|
12
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
13
|
+
def #{name} # def address
|
14
|
+
self[:#{name}] || #{options[:default].inspect} # self[:address] || nil
|
15
|
+
end # end
|
16
|
+
eorb
|
17
|
+
|
18
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
19
|
+
def #{name}=(value) # def addresses=(value)
|
20
|
+
self[:#{name}] = value # self[:addresses] = value
|
21
|
+
end # end
|
22
|
+
eorb
|
23
|
+
|
24
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
25
|
+
def add_#{name.singularize}(value) # def add_address(value)
|
26
|
+
self[:#{name}] ||= #{options[:default].inspect} # self[:addresses] ||= []
|
27
|
+
self[:#{name}] << self.class.to_orientdb(value) # self[:addresses] << self.class.to_orientdb(value)
|
28
|
+
#{name} # addresses
|
29
|
+
end # end
|
30
|
+
eorb
|
31
|
+
|
32
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
33
|
+
def build_#{name}(fields = {}) # def build_address(fields = {})
|
34
|
+
add_#{name} #{klass_name}.new fields # self[:addresses] = Address.new fields
|
35
|
+
end # end
|
36
|
+
eorb
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module OrientDB::AR
|
2
|
+
module Relations
|
3
|
+
|
4
|
+
def embedds_one(klass_name, options = { })
|
5
|
+
klass_name, options = check_rel_options klass_name, options, :singular
|
6
|
+
name = options[:name]
|
7
|
+
|
8
|
+
relationships[name] = options.merge :type => :embedds_one, :class_name => klass_name
|
9
|
+
|
10
|
+
field name, [OrientDB::FIELD_TYPES[:embedded], OrientDB::AR::Base.oclass_name_for(klass_name)]
|
11
|
+
|
12
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
13
|
+
def #{name} # def address
|
14
|
+
self[:#{name}] || #{options[:default].inspect} # self[:address] || nil
|
15
|
+
end # end
|
16
|
+
eorb
|
17
|
+
|
18
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
19
|
+
def #{name}=(value) # def addresses=(value)
|
20
|
+
self[:#{name}] = value # self[:addresses] = value
|
21
|
+
end # end
|
22
|
+
eorb
|
23
|
+
|
24
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
25
|
+
def build_#{name}(fields = {}) # def build_address(fields = {})
|
26
|
+
self[:#{name}] = #{klass_name}.new fields # self[:addresses] = Address.new fields
|
27
|
+
#{name} # address
|
28
|
+
end # end
|
29
|
+
eorb
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module OrientDB::AR
|
2
|
+
module Relations
|
3
|
+
|
4
|
+
def links_many(klass_name, options = { })
|
5
|
+
klass_name, options = check_rel_options klass_name, options, :plural, []
|
6
|
+
name = options[:name]
|
7
|
+
|
8
|
+
relationships[name] = options.merge :type => :links_many, :class_name => klass_name
|
9
|
+
|
10
|
+
field name, [OrientDB::FIELD_TYPES[:link_list], OrientDB::AR::Base.oclass_name_for(klass_name)]
|
11
|
+
|
12
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
13
|
+
def #{name} # def address
|
14
|
+
self[:#{name}] || #{options[:default].inspect} # self[:address] || nil
|
15
|
+
end # end
|
16
|
+
eorb
|
17
|
+
|
18
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
19
|
+
def #{name}=(value) # def addresses=(value)
|
20
|
+
self[:#{name}] = value # self[:addresses] = value
|
21
|
+
end # end
|
22
|
+
eorb
|
23
|
+
|
24
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
25
|
+
def add_#{name.singularize}(value) # def add_address(value)
|
26
|
+
self[:#{name}] ||= #{options[:default].inspect} # self[:addresses] ||= []
|
27
|
+
self[:#{name}] << self.class.to_orientdb(value) # self[:addresses] << self.class.to_orientdb(value)
|
28
|
+
#{name} # addresses
|
29
|
+
end # end
|
30
|
+
eorb
|
31
|
+
|
32
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
33
|
+
def build_#{name}(fields = {}) # def build_address(fields = {})
|
34
|
+
add_#{name} #{klass_name}.new fields # self[:addresses] = Address.new fields
|
35
|
+
end # end
|
36
|
+
eorb
|
37
|
+
|
38
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
39
|
+
def create_#{name}(fields = {}) # def create_address(fields = {})
|
40
|
+
add_#{name} #{klass_name}.create fields # self[:addresses] = Address.create fields
|
41
|
+
end # end
|
42
|
+
eorb
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module OrientDB::AR
|
2
|
+
module Relations
|
3
|
+
|
4
|
+
def links_one(klass_name, options = { })
|
5
|
+
klass_name, options = check_rel_options klass_name, options, :singular
|
6
|
+
puts "links_one : #{klass_name} : #{options.inspect}"
|
7
|
+
name = options[:name]
|
8
|
+
|
9
|
+
relationships[name] = options.merge :type => :links_one, :class_name => klass_name
|
10
|
+
|
11
|
+
field name, [OrientDB::FIELD_TYPES[:link], OrientDB::AR::Base.oclass_name_for(klass_name)]
|
12
|
+
|
13
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
14
|
+
def #{name} # def address
|
15
|
+
self[:#{name}] || #{options[:default].inspect} # self[:address] || nil
|
16
|
+
end # end
|
17
|
+
eorb
|
18
|
+
|
19
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
20
|
+
def #{name}=(value) # def addresses=(value)
|
21
|
+
self[:#{name}] = value # self[:addresses] = value
|
22
|
+
end # end
|
23
|
+
eorb
|
24
|
+
|
25
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
26
|
+
def build_#{name}(fields = {}) # def build_address(fields = {})
|
27
|
+
self[:#{name}] = #{klass_name}.new fields # self[:addresses] = Address.create fields
|
28
|
+
#{name} # address
|
29
|
+
end # end
|
30
|
+
eorb
|
31
|
+
|
32
|
+
class_eval <<-eorb, __FILE__, __LINE__ + 1
|
33
|
+
def create_#{name}(fields = {}) # def create_address(fields = {})
|
34
|
+
self[:#{name}] = #{klass_name}.create fields # self[:addresses] = Address.create fields
|
35
|
+
#{name} # address
|
36
|
+
end # end
|
37
|
+
eorb
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
@@ -2,6 +2,12 @@ class OrientDB::AR::Query
|
|
2
2
|
|
3
3
|
attr_accessor :model, :query
|
4
4
|
|
5
|
+
def self.for_oclass(name, query = OrientDB::SQL::Query.new)
|
6
|
+
obj = new OrientDB::AR::Base, query
|
7
|
+
obj.from OrientDB::AR::Base.oclass_name_for name
|
8
|
+
obj
|
9
|
+
end
|
10
|
+
|
5
11
|
def initialize(model, query = OrientDB::SQL::Query.new)
|
6
12
|
@model, @query = model, query
|
7
13
|
@query.from model.oclass_name
|
data/orientdb-ar.gemspec
CHANGED
@@ -5,16 +5,15 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{orientdb-ar}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.5"
|
9
9
|
s.platform = %q{jruby}
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.6") if s.respond_to? :required_rubygems_version=
|
12
|
-
s.authors = [
|
13
|
-
s.date = %q{
|
14
|
-
s.default_executable = %q{orientdbar_console}
|
12
|
+
s.authors = [%q{Adrian Madrid}]
|
13
|
+
s.date = %q{2012-01-12}
|
15
14
|
s.description = %q{Active Model wrappers to persist Ruby objects under OrientDB in JRuby.}
|
16
|
-
s.email = [
|
17
|
-
s.executables = [
|
15
|
+
s.email = [%q{aemadrid@gmail.com}]
|
16
|
+
s.executables = [%q{orientdbar_console}]
|
18
17
|
s.extra_rdoc_files = [
|
19
18
|
"LICENSE",
|
20
19
|
"README.rdoc"
|
@@ -36,12 +35,15 @@ Gem::Specification.new do |s|
|
|
36
35
|
"lib/orientdb-ar/embedded.rb",
|
37
36
|
"lib/orientdb-ar/ext.rb",
|
38
37
|
"lib/orientdb-ar/relations.rb",
|
38
|
+
"lib/orientdb-ar/relations/embedds_many.rb",
|
39
|
+
"lib/orientdb-ar/relations/embedds_one.rb",
|
40
|
+
"lib/orientdb-ar/relations/links_many.rb",
|
41
|
+
"lib/orientdb-ar/relations/links_one.rb",
|
39
42
|
"lib/orientdb-ar/sql.rb",
|
40
43
|
"lib/orientdb-ar/sql/delete.rb",
|
41
44
|
"lib/orientdb-ar/sql/insert.rb",
|
42
45
|
"lib/orientdb-ar/sql/query.rb",
|
43
46
|
"lib/orientdb-ar/sql/update.rb",
|
44
|
-
"lib/orientdb-ar/validations.rb",
|
45
47
|
"orientdb-ar.gemspec",
|
46
48
|
"spec/base_spec.rb",
|
47
49
|
"spec/dirty_spec.rb",
|
@@ -51,36 +53,42 @@ Gem::Specification.new do |s|
|
|
51
53
|
"spec/models/address.rb",
|
52
54
|
"spec/models/customer.rb",
|
53
55
|
"spec/models/flo_admin.rb",
|
56
|
+
"spec/models/invoice.rb",
|
57
|
+
"spec/models/invoice_line.rb",
|
54
58
|
"spec/models/person.rb",
|
55
59
|
"spec/models/phone_number.rb",
|
60
|
+
"spec/models/product.rb",
|
56
61
|
"spec/models/simple_person.rb",
|
57
62
|
"spec/serialization_spec.rb",
|
58
63
|
"spec/spec.opts",
|
59
64
|
"spec/spec_helper.rb"
|
60
65
|
]
|
61
66
|
s.homepage = %q{http://rubygems.org/gems/orientdb}
|
62
|
-
s.require_paths = [
|
67
|
+
s.require_paths = [%q{lib}]
|
63
68
|
s.rubyforge_project = %q{orientdb-ar}
|
64
|
-
s.rubygems_version = %q{1.
|
69
|
+
s.rubygems_version = %q{1.8.9}
|
65
70
|
s.summary = %q{ActiveRecord-like persistency through OrientDB in JRuby}
|
66
71
|
|
67
72
|
if s.respond_to? :specification_version then
|
68
73
|
s.specification_version = 3
|
69
74
|
|
70
75
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
71
|
-
s.add_runtime_dependency(%q<orientdb>, ["
|
76
|
+
s.add_runtime_dependency(%q<orientdb>, [">= 0.0.20"])
|
72
77
|
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.3"])
|
78
|
+
s.add_runtime_dependency(%q<jnunemaker-validatable>, ["= 1.8.4"])
|
73
79
|
s.add_development_dependency(%q<awesome_print>, [">= 0"])
|
74
80
|
s.add_development_dependency(%q<rspec>, [">= 2.4"])
|
75
81
|
else
|
76
|
-
s.add_dependency(%q<orientdb>, ["
|
82
|
+
s.add_dependency(%q<orientdb>, [">= 0.0.20"])
|
77
83
|
s.add_dependency(%q<activemodel>, [">= 3.0.3"])
|
84
|
+
s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.4"])
|
78
85
|
s.add_dependency(%q<awesome_print>, [">= 0"])
|
79
86
|
s.add_dependency(%q<rspec>, [">= 2.4"])
|
80
87
|
end
|
81
88
|
else
|
82
|
-
s.add_dependency(%q<orientdb>, ["
|
89
|
+
s.add_dependency(%q<orientdb>, [">= 0.0.20"])
|
83
90
|
s.add_dependency(%q<activemodel>, [">= 3.0.3"])
|
91
|
+
s.add_dependency(%q<jnunemaker-validatable>, ["= 1.8.4"])
|
84
92
|
s.add_dependency(%q<awesome_print>, [">= 0"])
|
85
93
|
s.add_dependency(%q<rspec>, [">= 2.4"])
|
86
94
|
end
|
data/spec/dirty_spec.rb
CHANGED
@@ -1,33 +1,30 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
describe "ActiveModel" do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
@person.changed.should == ['name']
|
29
|
-
@person.changes.should == {'name' => ['Bill', 'Bob']}
|
30
|
-
end
|
3
|
+
describe "ActiveModel::Dirty" do
|
4
|
+
|
5
|
+
it "should comply" do
|
6
|
+
@person = Person.create :name => "Uncle Bob", :age => 45
|
7
|
+
@person.changed?.should == false
|
8
|
+
|
9
|
+
@person.name = 'Bob'
|
10
|
+
@person.changed?.should == true
|
11
|
+
@person.name_changed?.should == true
|
12
|
+
@person.name_was.should == 'Uncle Bob'
|
13
|
+
@person.name_change.should == ['Uncle Bob', 'Bob']
|
14
|
+
@person.name = 'Bill'
|
15
|
+
@person.name_change.should == ['Uncle Bob', 'Bill']
|
16
|
+
|
17
|
+
@person.save
|
18
|
+
@person.changed?.should == false
|
19
|
+
@person.name_changed?.should == false
|
20
|
+
|
21
|
+
@person.name = 'Bill'
|
22
|
+
@person.name_changed?.should == false
|
23
|
+
@person.name_change.should == nil
|
24
|
+
|
25
|
+
@person.name = 'Bob'
|
26
|
+
@person.changed.should == ['name']
|
27
|
+
@person.changes.should == { 'name' => ['Bill', 'Bob'] }
|
31
28
|
end
|
32
29
|
|
33
30
|
end
|
data/spec/lint_behavior.rb
CHANGED
@@ -17,10 +17,10 @@ module RspecRailsMatchers
|
|
17
17
|
it { should respond_to(:to_param) }
|
18
18
|
|
19
19
|
it { should respond_to(:valid?) }
|
20
|
-
its(:valid?) { should be_a_boolean }
|
20
|
+
#its(:valid?) { should be_a_boolean }
|
21
21
|
|
22
22
|
it { should respond_to(:persisted?) }
|
23
|
-
its(:persisted?) { should be_a_boolean }
|
23
|
+
#its(:persisted?) { should be_a_boolean }
|
24
24
|
|
25
25
|
its(:class) { should respond_to(:model_name) }
|
26
26
|
|
data/spec/lint_spec.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
2
2
|
|
3
|
-
describe "ActiveModel" do
|
3
|
+
describe "ActiveModel::Lint" do
|
4
|
+
include RspecRailsMatchers::Behavior::Lint
|
4
5
|
|
5
6
|
describe Person do
|
6
7
|
it_should_behave_like AnActiveModel
|
@@ -41,7 +42,7 @@ describe "ActiveModel" do
|
|
41
42
|
@person.serializable_hash.should == {"name" => nil}
|
42
43
|
@person.as_json.should == {"name" => nil}
|
43
44
|
@person.to_json.should == %{{"name":null}}
|
44
|
-
@person.to_xml.should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<simple-person>\n <name
|
45
|
+
@person.to_xml.should == "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<simple-person>\n <name nil=\"true\"></name>\n</simple-person>\n"
|
45
46
|
|
46
47
|
@person.name = "Bob"
|
47
48
|
@person.serializable_hash.should == {"name" => "Bob"}
|
data/spec/model_spec.rb
CHANGED
@@ -2,100 +2,230 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
|
|
2
2
|
|
3
3
|
describe "Model" do
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
describe :connection do
|
6
|
+
it "should have a valid connection" do
|
7
|
+
Person.connection.should be_a_kind_of OrientDB::DocumentDatabase
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
describe :schema do
|
12
|
+
it "should have the right schema" do
|
13
|
+
Person.new.should be_a_kind_of Person
|
14
|
+
Person.oclass_name.should == 'Person'
|
15
|
+
Person.fields.keys.should == [:name, :age, :tags]
|
16
|
+
Person.fields[:name].should == { :type => :string, :not_null => true }
|
17
|
+
Person.fields[:age].should == { :type => :int }
|
18
|
+
Person.fields[:tags].should == { :type => [:list, :string] }
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
describe :attributes do
|
23
|
+
it "should create working models" do
|
24
|
+
p = Person.create :name => "Tester Testing", :age => 45, :tags => %w{ tech_support rocks }
|
20
25
|
|
21
|
-
|
22
|
-
|
23
|
-
|
26
|
+
p.name.should == "Tester Testing"
|
27
|
+
p.age.should == 45
|
28
|
+
p.tags.should == %w{ tech_support rocks }
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
30
|
+
p2 = Person.first :name => "Tester Testing"
|
31
|
+
p2.name.should == p.name
|
32
|
+
p2.age.should == p.age
|
33
|
+
p2.tags.map.should == p.tags
|
34
|
+
end
|
29
35
|
end
|
30
36
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
describe :embedded do
|
38
|
+
it "should handle embedds_one models as relations" do
|
39
|
+
Customer.clear
|
40
|
+
Customer.count.should <= 0
|
41
|
+
|
42
|
+
a = Address.new :street => "123 S Main", :city => "Salt Lake", :state => "UT", :country => "USA"
|
43
|
+
c1 = Customer.create :name => "Albert Einstein", :number => 1, :address => a, :age => 35
|
44
|
+
c1.saved?.should == true
|
45
|
+
c1.address.should == a
|
46
|
+
c1.phones.should == []
|
47
|
+
|
48
|
+
c2 = Customer.first
|
49
|
+
c1.should == c2
|
50
|
+
c2.address.should == a
|
51
|
+
c2.phones.should == []
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should handle embedds_many models as relations" do
|
55
|
+
Customer.clear
|
56
|
+
Customer.count.should <= 0
|
57
|
+
|
58
|
+
p1 = PhoneNumber.new :number => "123456789"
|
59
|
+
p2 = PhoneNumber.new :number => "987654321"
|
60
|
+
c1 = Customer.create :name => "Albert Einstein", :number => 1, :phones => [p1, p2], :age => 35
|
61
|
+
c1.saved?.should == true
|
62
|
+
c1.address.should == nil
|
63
|
+
c1.phones.should == [p1, p2]
|
64
|
+
|
65
|
+
c2 = Customer.first
|
66
|
+
c1.should == c2
|
67
|
+
c2.address.should == nil
|
68
|
+
c2.phones.should == [p1, p2]
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should handle mixed embedded models as relations" do
|
72
|
+
Customer.clear
|
73
|
+
Customer.count.should <= 0
|
74
|
+
|
75
|
+
a = Address.new :street => "123 S Main", :city => "Salt Lake", :state => "UT", :country => "USA"
|
76
|
+
p1 = PhoneNumber.new :number => "123456789"
|
77
|
+
p2 = PhoneNumber.new :number => "987654321"
|
78
|
+
c1 = Customer.create :name => "Albert Einstein", :number => 1, :address => a, :phones => [p1, p2], :age => 35
|
79
|
+
c1.saved?.should == true
|
80
|
+
c1.address.should == a
|
81
|
+
c1.phones.should == [p1, p2]
|
82
|
+
|
83
|
+
c2 = Customer.first
|
84
|
+
c1.should == c2
|
85
|
+
c2.address.should == a
|
86
|
+
c2.phones.should == [p1, p2]
|
87
|
+
end
|
41
88
|
end
|
42
89
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
90
|
+
describe :linked do
|
91
|
+
it "should handle mixed linked models as relations" do
|
92
|
+
Invoice.clear; InvoiceLine.clear; Product.clear; Customer.clear
|
93
|
+
|
94
|
+
c1 = Customer.create :name => "Generous Buyer", :age => 38, :number => 1001
|
95
|
+
p1 = Product.create :sku => "h1", :title => "Hammer", :price => 7.25
|
96
|
+
p2 = Product.create :sku => "n2", :title => "9in Nail", :price => 0.12
|
97
|
+
l1 = InvoiceLine.create :product => p1, :quantity => 1, :price => p1.price
|
98
|
+
l2 = InvoiceLine.create :product => p2, :quantity => 10, :price => p2.price
|
99
|
+
total = l1.quantity * l1.price + l2.quantity * l2.price
|
100
|
+
i1 = Invoice.create :number => 417, :customer => c1, :sold_on => Date.today, :total => total, :lines => [l1, l2]
|
101
|
+
l3 = InvoiceLine.create :product => p1, :quantity => 2, :price => p1.price
|
102
|
+
i3 = Invoice.create :number => 418, :customer => c1, :sold_on => Date.today, :lines => [l3]
|
103
|
+
l4 = InvoiceLine.create :product => p2, :quantity => 3, :price => p2.price
|
104
|
+
i4 = Invoice.create :number => 419, :customer => c1, :sold_on => Date.today, :lines => [l4]
|
105
|
+
i1.saved?.should == true
|
106
|
+
i1.customer.should == c1
|
107
|
+
i1.lines.should == [l1, l2]
|
108
|
+
i1.lines[0].product.should == p1
|
109
|
+
i1.lines[1].product.should == p2
|
110
|
+
|
111
|
+
i2 = Invoice.first
|
112
|
+
i2.customer.should == c1
|
113
|
+
i2.lines.map { |x| x.rid }.should == [l1.rid, l2.rid]
|
114
|
+
i2.lines[0].product.rid.should == p1.rid
|
115
|
+
i2.lines[1].product.rid.should == p2.rid
|
116
|
+
i2.rid.should == i1.rid
|
117
|
+
end
|
57
118
|
end
|
58
119
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
120
|
+
describe "SQL" do
|
121
|
+
describe "query" do
|
122
|
+
it "should find models" do
|
123
|
+
OrientDB::SQL.monkey_patch! Symbol
|
124
|
+
Person.clear
|
125
|
+
Person.count.should == 0
|
126
|
+
|
127
|
+
p1 = Person.create :name => "Hans Solo", :age => 38, :tags => %w{ fighter pilot }
|
128
|
+
p2 = Person.create :name => "Yoda", :age => 387, :tags => %w{ genius jedi }
|
129
|
+
p3 = Person.create :name => "Luke Skywalker", :age => 28, :tags => %w{ jedi fighter pilot }
|
130
|
+
p4 = Person.create :name => "Princess Leia", :age => 28, :tags => %w{ fighter royalty }
|
131
|
+
p5 = Person.create :name => "Chewbaca", :age => 53, :tags => %w{ fighter brave hairy }
|
132
|
+
|
133
|
+
Person.where(:name.like('%w%')).all.should == [p3, p5]
|
134
|
+
Person.where(:age.gt(28), :age.lt(75)).all.should == [p1, p5]
|
135
|
+
Person.where("'jedi' IN tags").all.should == [p2, p3]
|
136
|
+
Person.where("'fighter' IN tags", :age.lte(28)).order(:name.desc).all.first.should == p4
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
describe "update" do
|
141
|
+
it "should update models" do
|
142
|
+
Person.clear
|
143
|
+
Person.count.should == 0
|
144
|
+
|
145
|
+
p1 = Person.create :name => "Hans Solo", :age => 38, :tags => %w{ fighter pilot }
|
146
|
+
p2 = Person.create :name => "Yoda", :age => 387, :tags => %w{ genius jedi }
|
147
|
+
p3 = Person.create :name => "Luke Skywalker", :age => 28, :tags => %w{ jedi fighter pilot }
|
148
|
+
|
149
|
+
Person.where(:name => "Hans Solo").update(:name => "Hans Meister")
|
150
|
+
Person.where(:name => "Hans Meister").all.map { |x| x.rid }.should == [p1.rid]
|
151
|
+
p1.reload
|
152
|
+
Person.where(:name => "Hans Meister").all.should == [p1]
|
153
|
+
|
154
|
+
|
155
|
+
Person.update(:age => 45)
|
156
|
+
Person.where(:age => 45).all.map { |x| x.name }.should == [p1.name, p2.name, p3.name]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
describe "delete" do
|
161
|
+
it "should delete models" do
|
162
|
+
Person.delete
|
163
|
+
Person.count.should == 0
|
164
|
+
|
165
|
+
Person.create :name => "Hans Solo", :age => 38, :tags => %w{ fighter pilot }
|
166
|
+
Person.create :name => "Yoda", :age => 387, :tags => %w{ genius jedi }
|
167
|
+
Person.create :name => "Luke Skywalker", :age => 28, :tags => %w{ jedi fighter pilot }
|
168
|
+
|
169
|
+
Person.count.should == 3
|
170
|
+
|
171
|
+
Person.where(:name => "Hans Solo").delete
|
172
|
+
Person.count.should == 2
|
173
|
+
|
174
|
+
Person.delete
|
175
|
+
Person.count.should == 0
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
describe "insert" do
|
180
|
+
it "should insert models" do
|
181
|
+
Person.delete
|
182
|
+
Person.count.should == 0
|
183
|
+
|
184
|
+
p1 = Person.insert :name => "Hans Solo", :age => 38, :tags => %w{ fighter pilot }
|
185
|
+
Person.count.should == 1
|
186
|
+
|
187
|
+
p2 = Person.first
|
188
|
+
p1.should == p2
|
189
|
+
end
|
190
|
+
end
|
74
191
|
end
|
75
192
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
193
|
+
describe :validations do
|
194
|
+
it "should validate models correctly" do
|
195
|
+
Person.delete
|
196
|
+
Person.count.should == 0
|
197
|
+
|
198
|
+
p1 = Person.new
|
199
|
+
p1.save.should == false
|
200
|
+
p1.errors.size.should == 2
|
201
|
+
p1.errors.keys.should == [:name, :age]
|
202
|
+
p1.errors[:name].should == ["can't be empty"]
|
203
|
+
p1.errors[:age].should == ["can't be empty"]
|
204
|
+
|
205
|
+
p1.name = "Tester"
|
206
|
+
p1.valid?.should == false
|
207
|
+
p1.errors.size.should == 1
|
208
|
+
p1.errors[:age].should == ["can't be empty"]
|
209
|
+
|
210
|
+
p1.age = 25
|
211
|
+
p1.valid?.should == true
|
212
|
+
p1.errors.size.should == 0
|
213
|
+
|
214
|
+
p1.save.should == true
|
215
|
+
end
|
90
216
|
end
|
91
217
|
|
92
|
-
|
93
|
-
|
218
|
+
describe :validate_embedded do
|
219
|
+
it "should validate properly with embedded documents" do
|
220
|
+
Customer.clear
|
94
221
|
|
95
|
-
|
96
|
-
|
222
|
+
c1 = Customer.new :name => "Tester", :age => 37
|
223
|
+
c1.valid?.should == true
|
97
224
|
|
98
|
-
|
99
|
-
|
225
|
+
c1.build_address :street => "4647 Pagentry", :city => "Sandy"
|
226
|
+
c1.valid?.should == false
|
227
|
+
c1.errors.size.should == 1
|
228
|
+
c1.errors[:address].should == ["#-1:-1 State can't be empty"]
|
229
|
+
end
|
100
230
|
end
|
101
231
|
end
|