architect4r 0.3.2
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +53 -0
- data/Guardfile +10 -0
- data/License +20 -0
- data/README.md +62 -0
- data/Rakefile +40 -0
- data/ReleaseNotes.md +33 -0
- data/Roadmap.md +31 -0
- data/Specs.md +21 -0
- data/architect4r.gemspec +31 -0
- data/lib/architect4r.rb +66 -0
- data/lib/architect4r/adapters/carrier_wave.rb +64 -0
- data/lib/architect4r/core/configuration.rb +148 -0
- data/lib/architect4r/core/cypher_methods.rb +47 -0
- data/lib/architect4r/core/management_methods.rb +129 -0
- data/lib/architect4r/core/node_methods.rb +73 -0
- data/lib/architect4r/core/relationship_methods.rb +82 -0
- data/lib/architect4r/generic_node.rb +7 -0
- data/lib/architect4r/has_node.rb +80 -0
- data/lib/architect4r/instance_manager.rb +47 -0
- data/lib/architect4r/model/callbacks.rb +19 -0
- data/lib/architect4r/model/connection.rb +29 -0
- data/lib/architect4r/model/links_query_interface.rb +23 -0
- data/lib/architect4r/model/node.rb +117 -0
- data/lib/architect4r/model/persistency.rb +95 -0
- data/lib/architect4r/model/properties.rb +166 -0
- data/lib/architect4r/model/queries.rb +38 -0
- data/lib/architect4r/model/relationship.rb +105 -0
- data/lib/architect4r/model/relationships.rb +16 -0
- data/lib/architect4r/model/validations.rb +11 -0
- data/lib/architect4r/server.rb +96 -0
- data/lib/architect4r/version.rb +3 -0
- data/spec/architect4r_spec.rb +9 -0
- data/spec/core/configuration_spec.rb +54 -0
- data/spec/core/cypher_methods_spec.rb +29 -0
- data/spec/core/node_methods_spec.rb +47 -0
- data/spec/core/relationship_methods_spec.rb +92 -0
- data/spec/fixtures/architect4r.yml +21 -0
- data/spec/fixtures/graph.db.default/active_tx_log +1 -0
- data/spec/fixtures/graph.db.default/index/lucene-store.db +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.1 +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.active +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.v0 +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.v1 +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.v2 +0 -0
- data/spec/fixtures/graph.db.default/lock +0 -0
- data/spec/fixtures/graph.db.default/messages.log +183 -0
- data/spec/fixtures/graph.db.default/neostore +0 -0
- data/spec/fixtures/graph.db.default/neostore.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.nodestore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.nodestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.arrays +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.arrays.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.keys +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.keys.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.strings +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.strings.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshipstore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshipstore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.names +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.names.id +0 -0
- data/spec/fixtures/graph.db.default/nioneo_logical.log.1 +0 -0
- data/spec/fixtures/graph.db.default/nioneo_logical.log.active +0 -0
- data/spec/fixtures/graph.db.default/tm_tx_log.1 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/active_tx_log +1 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/messages.log +142 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.nodestore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.nodestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.arrays +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.arrays.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.keys +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.keys.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.strings +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.strings.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshipstore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshipstore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.names +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.names.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.active +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v0 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v1 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v2 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/tm_tx_log.1 +0 -0
- data/spec/has_node_spec.rb +87 -0
- data/spec/model/links_query_interface_spec.rb +22 -0
- data/spec/model/links_spec.rb +26 -0
- data/spec/model/node_spec.rb +48 -0
- data/spec/model/persistency_spec.rb +98 -0
- data/spec/model/properties_spec.rb +165 -0
- data/spec/model/queries_spec.rb +50 -0
- data/spec/model/relationship_spec.rb +63 -0
- data/spec/model/validations_spec.rb +31 -0
- data/spec/server_spec.rb +33 -0
- data/spec/spec_helper.rb +115 -0
- metadata +377 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Architect4r::HasNode do
|
|
4
|
+
|
|
5
|
+
subject { SomeDatabaseModel.new }
|
|
6
|
+
|
|
7
|
+
describe "setup" do
|
|
8
|
+
|
|
9
|
+
it "should have a node method" do
|
|
10
|
+
subject.should respond_to(:node)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should have a architect4r_create_node method" do
|
|
14
|
+
subject.should respond_to(:architect4r_create_node)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should have a architect4r_destroy_node method" do
|
|
18
|
+
subject.should respond_to(:architect4r_destroy_node)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should have a architect4r_sync_node method" do
|
|
22
|
+
subject.should respond_to(:architect4r_sync_node)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "node retrieval" do
|
|
28
|
+
|
|
29
|
+
it "should return nil if the parent record does not have an id" do
|
|
30
|
+
subject.should_receive(:id).and_return(nil)
|
|
31
|
+
subject.node.should be_nil
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should try to retrieve the node when an id is present" do
|
|
35
|
+
mock_node = mock(SomeDatabaseModelNode)
|
|
36
|
+
subject.should_receive(:id).at_least(2).times.and_return(1)
|
|
37
|
+
SomeDatabaseModelNode.should_receive(:find_by_cypher).at_least(1).times.and_return(mock(:first => mock_node))
|
|
38
|
+
subject.node.should == mock_node
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "node creation" do
|
|
44
|
+
|
|
45
|
+
it "should not create a new node if there is no record id" do
|
|
46
|
+
subject.should_receive(:id).and_return(nil)
|
|
47
|
+
subject.architect4r_create_node.should be_nil
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should trigger the node creating after create" do
|
|
51
|
+
subject.should_receive(:architect4r_create_node).once
|
|
52
|
+
subject.create
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "should create a sync node" do
|
|
56
|
+
subject.id = 2
|
|
57
|
+
subject.name = 'My little test'
|
|
58
|
+
subject.create
|
|
59
|
+
subject.node.should be_a(SomeDatabaseModelNode)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should check the node for required attributes" do
|
|
63
|
+
pending
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should save the sync attributes when creating the node" do
|
|
67
|
+
subject.id = 3
|
|
68
|
+
subject.name = "My little test"
|
|
69
|
+
subject.create
|
|
70
|
+
subject.node.name.should == subject.name
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe "node sync" do
|
|
76
|
+
it "should store the changed attributes to the node" do
|
|
77
|
+
subject.id = 4
|
|
78
|
+
subject.name = "My sync test"
|
|
79
|
+
subject.create
|
|
80
|
+
subject.node.name.should == subject.name
|
|
81
|
+
subject.name = "My changed sync test"
|
|
82
|
+
subject.update
|
|
83
|
+
subject.node.name.should == subject.name
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe Architect4r::Model::LinksQueryInterface do
|
|
4
|
+
|
|
5
|
+
before(:all) { @node = Person.create(:name => 'Neo') }
|
|
6
|
+
after(:all) { @node.destroy }
|
|
7
|
+
|
|
8
|
+
subject { Architect4r::Model::LinksQueryInterface.new(@node) }
|
|
9
|
+
|
|
10
|
+
it "should respond to :incoming" do
|
|
11
|
+
subject.should respond_to(:incoming)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should respond to :incoming" do
|
|
15
|
+
subject.should respond_to(:outgoing)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should respond to :incoming" do
|
|
19
|
+
subject.should respond_to(:both)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "links to and from nodes" do
|
|
4
|
+
|
|
5
|
+
before(:all) { @node = Person.create(:name => 'Neo') }
|
|
6
|
+
after(:all) { @node.destroy }
|
|
7
|
+
|
|
8
|
+
it "should respond to :links" do
|
|
9
|
+
@node.should respond_to(:links)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
subject { @node.links }
|
|
13
|
+
|
|
14
|
+
it "should respond to :incoming" do
|
|
15
|
+
subject.should respond_to(:incoming)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should respond to :incoming" do
|
|
19
|
+
subject.should respond_to(:outgoing)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should respond to :incoming" do
|
|
23
|
+
subject.should respond_to(:both)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe "Model Node" do
|
|
4
|
+
|
|
5
|
+
subject { Person }
|
|
6
|
+
|
|
7
|
+
describe :new do
|
|
8
|
+
|
|
9
|
+
it { should respond_to(:new) }
|
|
10
|
+
|
|
11
|
+
it "should accept a hash of properties with strings as keys" do
|
|
12
|
+
piano = subject.new({ 'name' => 'Neo' })
|
|
13
|
+
piano.should respond_to(:name)
|
|
14
|
+
piano.name.should eql('Neo')
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should accept a hash of properties with symbols as keys" do
|
|
18
|
+
piano = subject.new({ :name => 'Neo' })
|
|
19
|
+
piano.should respond_to(:name)
|
|
20
|
+
piano.name.should eql('Neo')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe "connection" do
|
|
25
|
+
|
|
26
|
+
it { should respond_to(:connection) }
|
|
27
|
+
|
|
28
|
+
its(:connection) { should respond_to(:get) }
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "node model_root" do
|
|
33
|
+
|
|
34
|
+
it "should create a model_root node if there is none" do
|
|
35
|
+
Person.create(:name => 'Morpheus', :human => true)
|
|
36
|
+
Person.model_root.should_not be_nil
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should reuse an existing model_root if there is already one" do
|
|
40
|
+
Person.create(:name => 'Morpheus', :human => true)
|
|
41
|
+
m_root = Person.model_root
|
|
42
|
+
Person.create(:name => 'Trinity', :human => true)
|
|
43
|
+
Person.model_root.should == m_root
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Persistency extension" do
|
|
4
|
+
|
|
5
|
+
describe :create do
|
|
6
|
+
|
|
7
|
+
subject { Person.new }
|
|
8
|
+
|
|
9
|
+
it "should create a new node" do
|
|
10
|
+
subject.name = 'Neo'
|
|
11
|
+
subject.human = true
|
|
12
|
+
subject.create.should be_true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should save a new node" do
|
|
16
|
+
subject.name = 'Neo'
|
|
17
|
+
subject.human = true
|
|
18
|
+
subject.save.should be_true
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe :update do
|
|
24
|
+
|
|
25
|
+
subject { Person.create(:name => 'Neo', :human => true, :note => 'Important person') }
|
|
26
|
+
|
|
27
|
+
it "should update the name" do
|
|
28
|
+
subject.name = "Agent Smith"
|
|
29
|
+
subject.update.should be_true
|
|
30
|
+
subject.name.should == "Agent Smith"
|
|
31
|
+
reloaded = Person.find_by_id(subject.id)
|
|
32
|
+
reloaded.name.should == "Agent Smith"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "should add new properties" do
|
|
36
|
+
subject.age_when_enlightend.should be_nil
|
|
37
|
+
subject.age_when_enlightend = 18
|
|
38
|
+
subject.update.should be_true
|
|
39
|
+
subject.age_when_enlightend.should == 18
|
|
40
|
+
|
|
41
|
+
reloaded = Person.find_by_id(subject.id)
|
|
42
|
+
reloaded.age_when_enlightend.should == 18
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it "should remove empty properties" do
|
|
46
|
+
subject.note.should_not be_nil
|
|
47
|
+
subject.note = nil
|
|
48
|
+
|
|
49
|
+
subject.update.should be_true
|
|
50
|
+
subject.note.should be_nil
|
|
51
|
+
|
|
52
|
+
reloaded = Person.find_by_id(subject.id)
|
|
53
|
+
reloaded.note.should be_nil
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe :delete do
|
|
59
|
+
|
|
60
|
+
subject { Person.create(:name => 'Max Mustermann', :human => true) }
|
|
61
|
+
|
|
62
|
+
it "should delete an existing node" do
|
|
63
|
+
deleted_id = subject.id
|
|
64
|
+
subject.destroy.should be_true
|
|
65
|
+
Person.find_by_id(deleted_id).should be_nil
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
it "should mark the object as deleted" do
|
|
69
|
+
subject.destroy.should be_true
|
|
70
|
+
subject.destroyed?.should be_true
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it "should not be possible to update a deleted object" do
|
|
74
|
+
subject.destroy.should be_true
|
|
75
|
+
expect { subject.update }.to raise_error
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should delete an existing node with relationships"
|
|
79
|
+
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe :new? do
|
|
83
|
+
|
|
84
|
+
subject { Person.new(:name => 'Name', :human => true) }
|
|
85
|
+
|
|
86
|
+
it "should be true if its a new record" do
|
|
87
|
+
subject.new?.should be_true
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
it "should be false if the record is created" do
|
|
91
|
+
subject.create
|
|
92
|
+
subject.new?.should be_false
|
|
93
|
+
subject.destroy
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe "Model properties based on test class Person" do
|
|
4
|
+
|
|
5
|
+
describe "casting properties" do
|
|
6
|
+
|
|
7
|
+
subject { Person.new }
|
|
8
|
+
|
|
9
|
+
it "should cast strings to integers" do
|
|
10
|
+
subject.age_when_enlightend = "4"
|
|
11
|
+
subject.age_when_enlightend.should == 4
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "should cast the integer 1 to boolean true" do
|
|
15
|
+
subject.human = 1
|
|
16
|
+
subject.human.should == true
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "should cast the integer 0 to boolean false" do
|
|
20
|
+
subject.human = 0
|
|
21
|
+
subject.human.should == false
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should cast the string 'true' to boolean true" do
|
|
25
|
+
subject.human = "true"
|
|
26
|
+
subject.human.should == true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should cast the string 'false' to boolean false" do
|
|
30
|
+
subject.human = "false"
|
|
31
|
+
subject.human.should == false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should cast the string '1' to boolean true" do
|
|
35
|
+
subject.human = "1"
|
|
36
|
+
subject.human.should == true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should cast the string '0' to boolean false" do
|
|
40
|
+
subject.human = "0"
|
|
41
|
+
subject.human.should == false
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "should create a ? method for boolean attributes" do
|
|
45
|
+
subject.human = true
|
|
46
|
+
subject.should respond_to(:human?)
|
|
47
|
+
subject.human?.should == true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "are nullified" do
|
|
53
|
+
|
|
54
|
+
context "when no property value is set" do
|
|
55
|
+
subject { Person.new }
|
|
56
|
+
|
|
57
|
+
its(:name) { should be_nil }
|
|
58
|
+
its(:age_when_enlightend) { should be_nil }
|
|
59
|
+
its(:human) { should be_nil }
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
context "when setting property value to nil" do
|
|
64
|
+
subject { Person.new(:name => 'Neo', :age_when_enlightend => 23, :human => true) }
|
|
65
|
+
|
|
66
|
+
it "should remove nil strings" do
|
|
67
|
+
subject.name = nil
|
|
68
|
+
subject.name.should be_nil
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe "database properties json" do
|
|
75
|
+
|
|
76
|
+
subject { Person }
|
|
77
|
+
|
|
78
|
+
it "should include the type when casted to database hash" do
|
|
79
|
+
obj = subject.new
|
|
80
|
+
data_hash = obj.send(:_to_database_hash)
|
|
81
|
+
data_hash['architect4r_type'].should == 'Person'
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
it "should include all valid properties" do
|
|
85
|
+
obj = subject.new('name' => 'Neo', 'size' => 3)
|
|
86
|
+
data_hash = obj.send(:_to_database_hash)
|
|
87
|
+
data_hash['name'].should == 'Neo'
|
|
88
|
+
data_hash.has_key?('human').should be_false
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it "should not include nil values" do
|
|
92
|
+
obj = subject.new(:name => 'Max Mustermann')
|
|
93
|
+
obj.send(:_to_database_hash).has_key?(:age).should be_false
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe "store in different localizations" do
|
|
99
|
+
|
|
100
|
+
subject { Person.new }
|
|
101
|
+
|
|
102
|
+
it "should provide a list of available locales"
|
|
103
|
+
|
|
104
|
+
it "should allow specifying a default locale"
|
|
105
|
+
|
|
106
|
+
it "should return the localized version based on the I18n locale" do
|
|
107
|
+
subject.write_attribute(:vita, "Neo the savior", :en)
|
|
108
|
+
subject.write_attribute(:vita, "Neo der Retter", :de)
|
|
109
|
+
|
|
110
|
+
I18n.locale = :en
|
|
111
|
+
subject.vita.should == "Neo the savior"
|
|
112
|
+
|
|
113
|
+
I18n.locale = :de
|
|
114
|
+
subject.vita.should == "Neo der Retter"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should fall back to the default value if no other is present" do
|
|
118
|
+
subject.write_attribute(:vita, "Hello there", :en)
|
|
119
|
+
# do not set a german title
|
|
120
|
+
|
|
121
|
+
I18n.locale = :de
|
|
122
|
+
subject.vita.should == "Hello there"
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should not fall back to another localized value if not wanted" do
|
|
126
|
+
subject.write_attribute(:note, "This is my description", :en)
|
|
127
|
+
# do not set a german description
|
|
128
|
+
|
|
129
|
+
I18n.locale = :de
|
|
130
|
+
subject.note.should be_nil
|
|
131
|
+
I18n.locale = :en
|
|
132
|
+
subject.note.should == "This is my description"
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should allow to force the returned locale" do
|
|
136
|
+
subject.write_attribute(:vita, "Hello there", :en)
|
|
137
|
+
subject.write_attribute(:vita, "Hallo du da", :de)
|
|
138
|
+
|
|
139
|
+
subject.read_attribute(:vita, :en).should == "Hello there"
|
|
140
|
+
subject.read_attribute(:vita, :de).should == "Hallo du da"
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "should set the localized version based on the I18n locale" do
|
|
144
|
+
I18n.locale = :en
|
|
145
|
+
subject.vita = "Hello there"
|
|
146
|
+
|
|
147
|
+
I18n.locale = :de
|
|
148
|
+
subject.vita = "Hallo du da"
|
|
149
|
+
I18n.locale = :en
|
|
150
|
+
|
|
151
|
+
subject.read_attribute('vita_en').should == "Hello there"
|
|
152
|
+
subject.read_attribute('vita_de').should == "Hallo du da"
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
it "should allow to force the locale in the setter" do
|
|
156
|
+
subject.write_attribute(:vita, "Hello there", :en)
|
|
157
|
+
subject.write_attribute(:vita, "Hallo du da", :de)
|
|
158
|
+
|
|
159
|
+
subject.read_attribute('vita_en').should == "Hello there"
|
|
160
|
+
subject.read_attribute('vita_de').should == "Hallo du da"
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
end
|