remodel 0.4.2 → 0.5.0
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/README.md +1 -4
- data/VERSION +1 -1
- data/example/book.rb +1 -2
- data/lib/remodel/entity.rb +30 -36
- data/lib/remodel/has_many.rb +6 -32
- data/test/test_has_many.rb +105 -0
- data/test/test_has_one.rb +68 -0
- data/test/test_inheritance.rb +65 -0
- data/test/test_shortnames.rb +73 -0
- metadata +12 -16
- data/docs/docco.css +0 -185
- data/docs/remodel.html +0 -269
- data/test/test_entity_shortnames.rb +0 -36
- data/test/test_many_to_many.rb +0 -77
- data/test/test_many_to_one.rb +0 -117
- data/test/test_one_to_many.rb +0 -96
- data/test/test_one_to_one.rb +0 -57
@@ -1,36 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestEntityShortnames < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class Bar < Remodel::Entity
|
6
|
-
property :foo, :short => 'z'
|
7
|
-
end
|
8
|
-
|
9
|
-
context "[short names]" do
|
10
|
-
setup do
|
11
|
-
@bar = Bar.create(context, :foo => 42)
|
12
|
-
end
|
13
|
-
|
14
|
-
should "be used when storing properties" do
|
15
|
-
serialized = redis.hget(context.key, @bar.key)
|
16
|
-
assert !serialized.match(/foo/)
|
17
|
-
assert serialized.match(/z/)
|
18
|
-
end
|
19
|
-
|
20
|
-
should "work in roundtrip" do
|
21
|
-
@bar.reload
|
22
|
-
assert_equal 42, @bar.foo
|
23
|
-
end
|
24
|
-
|
25
|
-
should "not be used in as_json" do
|
26
|
-
assert !@bar.as_json.has_key?(:z)
|
27
|
-
assert @bar.as_json.has_key?(:foo)
|
28
|
-
end
|
29
|
-
|
30
|
-
should "not be used in inspect" do
|
31
|
-
assert !@bar.inspect.match(/z/)
|
32
|
-
assert @bar.inspect.match(/foo/)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
data/test/test_many_to_many.rb
DELETED
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestManyToMany < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class Person < Remodel::Entity
|
6
|
-
has_many :groups, :class => 'TestManyToMany::Group', :reverse => 'members'
|
7
|
-
property :name
|
8
|
-
end
|
9
|
-
|
10
|
-
class Group < Remodel::Entity
|
11
|
-
has_many :members, :class => 'TestManyToMany::Person', :reverse => 'groups'
|
12
|
-
property :name
|
13
|
-
end
|
14
|
-
|
15
|
-
context "both associations" do
|
16
|
-
should "be empty by default" do
|
17
|
-
assert_equal [], Person.new(context).groups
|
18
|
-
assert_equal [], Group.new(context).members
|
19
|
-
end
|
20
|
-
|
21
|
-
context "create" do
|
22
|
-
should "add a new group to both associations" do
|
23
|
-
tim = Person.create(context, :name => 'tim')
|
24
|
-
rugb = tim.groups.create :name => 'rug-b'
|
25
|
-
assert_equal [tim], rugb.members
|
26
|
-
end
|
27
|
-
|
28
|
-
should "add a new person to both associations" do
|
29
|
-
rugb = Group.create(context, :name => 'rug-b')
|
30
|
-
tim = rugb.members.create :name => 'tim'
|
31
|
-
assert_equal [rugb], tim.groups
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "add" do
|
36
|
-
setup do
|
37
|
-
@tim = Person.create(context, :name => 'tim')
|
38
|
-
@rugb = Group.create(context, :name => 'rug-b')
|
39
|
-
end
|
40
|
-
|
41
|
-
should "add a new group to both associations" do
|
42
|
-
@tim.groups.add(@rugb)
|
43
|
-
assert_equal [@tim], @rugb.members
|
44
|
-
assert_equal [@rugb], @tim.groups
|
45
|
-
end
|
46
|
-
|
47
|
-
should "add a new person to both associations" do
|
48
|
-
@rugb.members.add(@tim)
|
49
|
-
assert_equal [@tim], @rugb.members
|
50
|
-
assert_equal [@rugb], @tim.groups
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
context "remove" do
|
55
|
-
setup do
|
56
|
-
@tim = Person.create(context, :name => 'tim')
|
57
|
-
@rugb = @tim.groups.create(:name => 'rug-b')
|
58
|
-
@erlang = @tim.groups.create(:name => 'erlang')
|
59
|
-
@aws = @tim.groups.create(:name => 'aws')
|
60
|
-
end
|
61
|
-
|
62
|
-
should "remove a group from both associations" do
|
63
|
-
@tim.groups.remove(@erlang)
|
64
|
-
assert_equal [@rugb, @aws], @tim.groups
|
65
|
-
assert_equal [], @erlang.members
|
66
|
-
end
|
67
|
-
|
68
|
-
should "remove a person from both associations" do
|
69
|
-
@erlang.members.remove(@tim)
|
70
|
-
assert_equal [@rugb, @aws], @tim.groups
|
71
|
-
assert_equal [], @erlang.members
|
72
|
-
end
|
73
|
-
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
end
|
data/test/test_many_to_one.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
class TestManyToOne < Test::Unit::TestCase
|
5
|
-
|
6
|
-
class Puzzle < Remodel::Entity
|
7
|
-
has_many :pieces, :class => 'TestManyToOne::Piece', :reverse => 'puzzle'
|
8
|
-
property :topic
|
9
|
-
end
|
10
|
-
|
11
|
-
class Piece < Remodel::Entity
|
12
|
-
has_one :puzzle, :class => 'TestManyToOne::Puzzle'
|
13
|
-
property :color
|
14
|
-
end
|
15
|
-
|
16
|
-
context "has_many" do
|
17
|
-
context "association" do
|
18
|
-
should "exist" do
|
19
|
-
assert Puzzle.create(context).respond_to?(:pieces)
|
20
|
-
end
|
21
|
-
|
22
|
-
should "return an empty list by default" do
|
23
|
-
assert_equal [], Puzzle.create(context).pieces
|
24
|
-
end
|
25
|
-
|
26
|
-
should "return any existing children" do
|
27
|
-
puzzle = Puzzle.create(context)
|
28
|
-
red_piece = Piece.create(context, :color => 'red')
|
29
|
-
blue_piece = Piece.create(context, :color => 'blue')
|
30
|
-
value = JSON.generate([red_piece.key, blue_piece.key])
|
31
|
-
redis.hset(context.key, "#{puzzle.key}_pieces", value)
|
32
|
-
assert_equal 2, puzzle.pieces.size
|
33
|
-
assert_equal Piece, puzzle.pieces[0].class
|
34
|
-
assert_equal 'red', puzzle.pieces[0].color
|
35
|
-
end
|
36
|
-
|
37
|
-
should "not return any child multiple times" do
|
38
|
-
puzzle = Puzzle.create(context)
|
39
|
-
red_piece = Piece.create(context, :color => 'red')
|
40
|
-
value = JSON.generate([red_piece.key, red_piece.key])
|
41
|
-
redis.hset(context.key, "#{puzzle.key}_pieces", value)
|
42
|
-
assert_equal 1, puzzle.pieces.size
|
43
|
-
assert_equal Piece, puzzle.pieces[0].class
|
44
|
-
assert_equal 'red', puzzle.pieces[0].color
|
45
|
-
end
|
46
|
-
|
47
|
-
context "create" do
|
48
|
-
should "have a create method" do
|
49
|
-
assert Puzzle.create(context).pieces.respond_to?(:create)
|
50
|
-
end
|
51
|
-
|
52
|
-
should "work without attributes" do
|
53
|
-
puzzle = Puzzle.create(context)
|
54
|
-
piece = puzzle.pieces.create
|
55
|
-
assert piece.is_a?(Piece)
|
56
|
-
end
|
57
|
-
|
58
|
-
should "create and store a new child" do
|
59
|
-
puzzle = Puzzle.create(context)
|
60
|
-
puzzle.pieces.create :color => 'green'
|
61
|
-
assert_equal 1, puzzle.pieces.size
|
62
|
-
puzzle.reload
|
63
|
-
assert_equal 1, puzzle.pieces.size
|
64
|
-
assert_equal Piece, puzzle.pieces[0].class
|
65
|
-
assert_equal 'green', puzzle.pieces[0].color
|
66
|
-
end
|
67
|
-
|
68
|
-
should "associate the created child with self" do
|
69
|
-
puzzle = Puzzle.create(context, :topic => 'provence')
|
70
|
-
piece = puzzle.pieces.create :color => 'green'
|
71
|
-
assert_equal 'provence', piece.puzzle.topic
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
context "add" do
|
76
|
-
should "add the given entity to the association" do
|
77
|
-
puzzle = Puzzle.create(context)
|
78
|
-
piece = Piece.create(context, :color => 'white')
|
79
|
-
puzzle.pieces.add piece
|
80
|
-
assert_equal 1, puzzle.pieces.size
|
81
|
-
puzzle.reload
|
82
|
-
assert_equal 1, puzzle.pieces.size
|
83
|
-
assert_equal Piece, puzzle.pieces[0].class
|
84
|
-
assert_equal 'white', puzzle.pieces[0].color
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
context "find" do
|
89
|
-
setup do
|
90
|
-
@puzzle = Puzzle.create(context)
|
91
|
-
5.times { @puzzle.pieces.create :color => 'blue' }
|
92
|
-
end
|
93
|
-
|
94
|
-
should "find the element with the given id" do
|
95
|
-
piece = @puzzle.pieces[2]
|
96
|
-
assert_equal piece, @puzzle.pieces.find(piece.id)
|
97
|
-
end
|
98
|
-
|
99
|
-
should "raise an exception if no element with the given id exists" do
|
100
|
-
assert_raises(Remodel::EntityNotFound) { @puzzle.pieces.find(-1) }
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
context "reload" do
|
108
|
-
should "reset has_many associations" do
|
109
|
-
puzzle = Puzzle.create(context)
|
110
|
-
piece = puzzle.pieces.create :color => 'black'
|
111
|
-
redis.hdel(context.key, "#{puzzle.key}_pieces")
|
112
|
-
puzzle.reload
|
113
|
-
assert_equal [], puzzle.pieces
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
end
|
data/test/test_one_to_many.rb
DELETED
@@ -1,96 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
|
4
|
-
class TestOneToMany < Test::Unit::TestCase
|
5
|
-
|
6
|
-
class Piece < Remodel::Entity
|
7
|
-
has_one :puzzle, :class => 'TestOneToMany::Puzzle', :reverse => 'pieces'
|
8
|
-
property :color
|
9
|
-
end
|
10
|
-
|
11
|
-
class Puzzle < Remodel::Entity
|
12
|
-
has_many :pieces, :class => 'TestOneToMany::Piece', :reverse => 'puzzle'
|
13
|
-
property :topic
|
14
|
-
end
|
15
|
-
|
16
|
-
context "has_one" do
|
17
|
-
context "association getter" do
|
18
|
-
should "exist" do
|
19
|
-
assert Piece.create(context).respond_to?(:puzzle)
|
20
|
-
end
|
21
|
-
|
22
|
-
should "return nil by default" do
|
23
|
-
assert_nil Piece.create(context).puzzle
|
24
|
-
end
|
25
|
-
|
26
|
-
should "return the associated entity" do
|
27
|
-
puzzle = Puzzle.create(context, :topic => 'animals')
|
28
|
-
piece = Piece.create(context)
|
29
|
-
redis.hset(context.key, "#{piece.key}_puzzle", puzzle.key)
|
30
|
-
assert_equal 'animals', piece.puzzle.topic
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
context "association setter" do
|
35
|
-
should "exist" do
|
36
|
-
assert Piece.create(context).respond_to?(:'puzzle=')
|
37
|
-
end
|
38
|
-
|
39
|
-
should "store the key of the associated entity" do
|
40
|
-
puzzle = Puzzle.create(context)
|
41
|
-
piece = Piece.create(context)
|
42
|
-
piece.puzzle = puzzle
|
43
|
-
assert_equal puzzle.key, redis.hget(context.key, "#{piece.key}_puzzle")
|
44
|
-
end
|
45
|
-
|
46
|
-
should "add the entity to the reverse association" do
|
47
|
-
puzzle = Puzzle.create(context)
|
48
|
-
piece = Piece.create(context)
|
49
|
-
piece.puzzle = puzzle
|
50
|
-
assert_equal 1, puzzle.pieces.size
|
51
|
-
assert_equal piece.id, puzzle.pieces.first.id
|
52
|
-
end
|
53
|
-
|
54
|
-
should "remove the entity from the old reverse association" do
|
55
|
-
puzzle = Puzzle.create(context)
|
56
|
-
piece = puzzle.pieces.create
|
57
|
-
new_puzzle = Puzzle.create(context)
|
58
|
-
piece.puzzle = new_puzzle
|
59
|
-
assert_equal [], puzzle.reload.pieces
|
60
|
-
end
|
61
|
-
|
62
|
-
should "be settable to nil" do
|
63
|
-
piece = Piece.create(context)
|
64
|
-
piece.puzzle = nil
|
65
|
-
assert_nil piece.puzzle
|
66
|
-
end
|
67
|
-
|
68
|
-
should "remove the key if set to nil" do
|
69
|
-
piece = Piece.create(context)
|
70
|
-
piece.puzzle = Puzzle.create(context)
|
71
|
-
piece.puzzle = nil
|
72
|
-
assert_nil redis.hget(piece.context, "#{piece.key}_puzzle")
|
73
|
-
end
|
74
|
-
|
75
|
-
should "remove the entity from the reverse association if set to nil" do
|
76
|
-
puzzle = Puzzle.create(context)
|
77
|
-
piece = Piece.create(context)
|
78
|
-
piece.puzzle = puzzle
|
79
|
-
piece.puzzle = nil
|
80
|
-
puzzle.reload
|
81
|
-
assert_equal 0, puzzle.pieces.size
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
|
-
context "reload" do
|
87
|
-
should "reset has_one associations" do
|
88
|
-
piece = Piece.create(context, :color => 'black')
|
89
|
-
piece.puzzle = Puzzle.create(context)
|
90
|
-
redis.hdel(context.key, "#{piece.key}_puzzle")
|
91
|
-
piece.reload
|
92
|
-
assert_nil piece.puzzle
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
end
|
data/test/test_one_to_one.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'helper'
|
2
|
-
|
3
|
-
class TestOneToOne < Test::Unit::TestCase
|
4
|
-
|
5
|
-
class Man < Remodel::Entity
|
6
|
-
has_one :wife, :class => 'TestOneToOne::Woman', :reverse => 'husband'
|
7
|
-
property :name
|
8
|
-
end
|
9
|
-
|
10
|
-
class Woman < Remodel::Entity
|
11
|
-
has_one :husband, :class => 'TestOneToOne::Man', :reverse => 'wife'
|
12
|
-
property :name
|
13
|
-
end
|
14
|
-
|
15
|
-
context "both associations" do
|
16
|
-
should "be nil by default" do
|
17
|
-
assert_equal nil, Man.new(context).wife
|
18
|
-
assert_equal nil, Woman.new(context).husband
|
19
|
-
end
|
20
|
-
|
21
|
-
context "setter" do
|
22
|
-
setup do
|
23
|
-
@bill = Man.create(context, :name => 'Bill')
|
24
|
-
@mary = Woman.create(context, :name => 'Mary')
|
25
|
-
end
|
26
|
-
|
27
|
-
context "non-nil value" do
|
28
|
-
should "also set husband" do
|
29
|
-
@bill.wife = @mary
|
30
|
-
assert_equal @bill, @mary.husband
|
31
|
-
end
|
32
|
-
|
33
|
-
should "also set wife" do
|
34
|
-
@mary.husband = @bill
|
35
|
-
assert_equal @mary, @bill.wife
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
context "nil value" do
|
40
|
-
setup do
|
41
|
-
@bill.wife = @mary
|
42
|
-
end
|
43
|
-
|
44
|
-
should "also clear husband" do
|
45
|
-
@bill.wife = nil
|
46
|
-
assert_equal nil, @mary.husband
|
47
|
-
end
|
48
|
-
|
49
|
-
should "also clear wife" do
|
50
|
-
@mary.husband = nil
|
51
|
-
assert_equal nil, @bill.wife
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
end
|