active_mongoid 0.1.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.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +22 -0
- data/.ruby_gemset +1 -0
- data/.ruby_version +1 -0
- data/.travis.yml +11 -0
- data/Appraisals +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +198 -0
- data/Rakefile +7 -0
- data/active_mongoid.gemspec +36 -0
- data/gemfiles/mongoid_2.8.gemfile +7 -0
- data/gemfiles/mongoid_2.8.gemfile.lock +105 -0
- data/gemfiles/mongoid_3.1.gemfile +7 -0
- data/gemfiles/mongoid_3.1.gemfile.lock +108 -0
- data/lib/active_mongoid.rb +8 -0
- data/lib/active_mongoid/associations.rb +82 -0
- data/lib/active_mongoid/associations/binding.rb +77 -0
- data/lib/active_mongoid/associations/builder.rb +26 -0
- data/lib/active_mongoid/associations/builders/in.rb +17 -0
- data/lib/active_mongoid/associations/builders/many.rb +15 -0
- data/lib/active_mongoid/associations/builders/one.rb +15 -0
- data/lib/active_mongoid/associations/document_relation/accessors.rb +100 -0
- data/lib/active_mongoid/associations/document_relation/associations.rb +33 -0
- data/lib/active_mongoid/associations/document_relation/auto_save.rb +31 -0
- data/lib/active_mongoid/associations/document_relation/bindings/in.rb +48 -0
- data/lib/active_mongoid/associations/document_relation/bindings/many.rb +19 -0
- data/lib/active_mongoid/associations/document_relation/bindings/one.rb +19 -0
- data/lib/active_mongoid/associations/document_relation/builders.rb +31 -0
- data/lib/active_mongoid/associations/document_relation/dependent.rb +26 -0
- data/lib/active_mongoid/associations/document_relation/macros.rb +51 -0
- data/lib/active_mongoid/associations/document_relation/referenced/in.rb +72 -0
- data/lib/active_mongoid/associations/document_relation/referenced/many.rb +125 -0
- data/lib/active_mongoid/associations/document_relation/referenced/one.rb +75 -0
- data/lib/active_mongoid/associations/many.rb +211 -0
- data/lib/active_mongoid/associations/metadata.rb +229 -0
- data/lib/active_mongoid/associations/one.rb +21 -0
- data/lib/active_mongoid/associations/proxy.rb +38 -0
- data/lib/active_mongoid/associations/record_relation/accessors.rb +80 -0
- data/lib/active_mongoid/associations/record_relation/associations.rb +33 -0
- data/lib/active_mongoid/associations/record_relation/auto_save.rb +43 -0
- data/lib/active_mongoid/associations/record_relation/bindings/in.rb +48 -0
- data/lib/active_mongoid/associations/record_relation/bindings/many.rb +19 -0
- data/lib/active_mongoid/associations/record_relation/bindings/one.rb +19 -0
- data/lib/active_mongoid/associations/record_relation/builders.rb +31 -0
- data/lib/active_mongoid/associations/record_relation/dependent.rb +26 -0
- data/lib/active_mongoid/associations/record_relation/macros.rb +65 -0
- data/lib/active_mongoid/associations/record_relation/referenced/in.rb +72 -0
- data/lib/active_mongoid/associations/record_relation/referenced/many.rb +128 -0
- data/lib/active_mongoid/associations/record_relation/referenced/one.rb +75 -0
- data/lib/active_mongoid/associations/targets/enumerable.rb +161 -0
- data/lib/active_mongoid/bson_id.rb +44 -0
- data/lib/active_mongoid/finder_proxy.rb +55 -0
- data/lib/active_mongoid/finders.rb +60 -0
- data/lib/active_mongoid/version.rb +3 -0
- data/spec/lib/associations/document_relation/accessors_spec.rb +330 -0
- data/spec/lib/associations/document_relation/auto_save_spec.rb +157 -0
- data/spec/lib/associations/document_relation/bindings/in_spec.rb +39 -0
- data/spec/lib/associations/document_relation/bindings/many_spec.rb +36 -0
- data/spec/lib/associations/document_relation/bindings/one_spec.rb +39 -0
- data/spec/lib/associations/document_relation/builders_spec.rb +117 -0
- data/spec/lib/associations/document_relation/dependent_spec.rb +87 -0
- data/spec/lib/associations/document_relation/macros_spec.rb +68 -0
- data/spec/lib/associations/document_relation/referenced/in_spec.rb +27 -0
- data/spec/lib/associations/document_relation/referenced/many_spec.rb +32 -0
- data/spec/lib/associations/document_relation/referenced/one_spec.rb +28 -0
- data/spec/lib/associations/metadata_spec.rb +157 -0
- data/spec/lib/associations/record_relation/accessors_spec.rb +328 -0
- data/spec/lib/associations/record_relation/auto_save_spec.rb +157 -0
- data/spec/lib/associations/record_relation/bindings/in_spec.rb +39 -0
- data/spec/lib/associations/record_relation/bindings/many_spec.rb +39 -0
- data/spec/lib/associations/record_relation/bindings/one_spec.rb +57 -0
- data/spec/lib/associations/record_relation/builders_spec.rb +118 -0
- data/spec/lib/associations/record_relation/dependent_spec.rb +87 -0
- data/spec/lib/associations/record_relation/macros_spec.rb +73 -0
- data/spec/lib/associations/record_relation/referenced/in_spec.rb +27 -0
- data/spec/lib/associations/record_relation/referenced/many_spec.rb +32 -0
- data/spec/lib/associations/record_relation/referenced/one_spec.rb +27 -0
- data/spec/lib/bson_id_spec.rb +48 -0
- data/spec/lib/finders_spec.rb +105 -0
- data/spec/spec_helper.rb +89 -0
- data/spec/support/models/active_record/address.rb +6 -0
- data/spec/support/models/active_record/division.rb +16 -0
- data/spec/support/models/active_record/division_setting.rb +9 -0
- data/spec/support/models/active_record/player.rb +12 -0
- data/spec/support/models/mongoid/league.rb +10 -0
- data/spec/support/models/mongoid/person.rb +9 -0
- data/spec/support/models/mongoid/post.rb +9 -0
- data/spec/support/models/mongoid/stat.rb +8 -0
- data/spec/support/models/mongoid/team.rb +9 -0
- data/spec/support/shared_examples/shared_many_spec.rb +411 -0
- metadata +370 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Bindings::In do
|
|
4
|
+
|
|
5
|
+
let(:division) do
|
|
6
|
+
Division.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:league) do
|
|
10
|
+
League.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
let(:division_metadata) do
|
|
14
|
+
Division.am_relations["league"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "#bind_one" do
|
|
18
|
+
|
|
19
|
+
context "when the child of a references one" do
|
|
20
|
+
|
|
21
|
+
let(:binder) do
|
|
22
|
+
described_class.new(division, league, division_metadata)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context "when the document is bindable with default" do
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
binder.bind_one
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "sets the inverse relation" do
|
|
32
|
+
expect(league.division).to eq(division)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
describe ActiveMongoid::Associations::DocumentRelation::Bindings::Many do
|
|
5
|
+
|
|
6
|
+
let(:division){ Division.new }
|
|
7
|
+
|
|
8
|
+
let(:team){ Team.new }
|
|
9
|
+
|
|
10
|
+
let(:division_metadata) do
|
|
11
|
+
Division.am_relations["teams"]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "#bind_one" do
|
|
15
|
+
|
|
16
|
+
context "when the child of a references many" do
|
|
17
|
+
|
|
18
|
+
let(:binder) do
|
|
19
|
+
described_class.new(division, team, division_metadata)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "when the document is bindable with default" do
|
|
23
|
+
|
|
24
|
+
before do
|
|
25
|
+
binder.bind_one(team)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it "sets the inverse relation" do
|
|
29
|
+
expect(team.division).to eq(division)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Bindings::One do
|
|
4
|
+
|
|
5
|
+
let(:player) do
|
|
6
|
+
Player.new
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
let(:person) do
|
|
10
|
+
Person.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
let(:player_metadata) do
|
|
14
|
+
Player.am_relations["person"]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
describe "#bind_one" do
|
|
18
|
+
|
|
19
|
+
context "when the child of a references one" do
|
|
20
|
+
|
|
21
|
+
let(:binder) do
|
|
22
|
+
described_class.new(player, person, player_metadata)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
context "when the document is bindable with default" do
|
|
26
|
+
|
|
27
|
+
before do
|
|
28
|
+
binder.bind_one
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "sets the inverse relation" do
|
|
32
|
+
expect(person.player).to eq(player)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Builders do
|
|
4
|
+
|
|
5
|
+
describe "#build_#\{name}" do
|
|
6
|
+
|
|
7
|
+
context "when the relation is a has_one" do
|
|
8
|
+
|
|
9
|
+
let(:player) do
|
|
10
|
+
Player.new
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
let!(:person) do
|
|
14
|
+
player.build_person
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "builds the document" do
|
|
18
|
+
expect(player.person).to eq(person)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "sets the inverse" do
|
|
22
|
+
expect(person.player).to eq(player)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "does not save the document" do
|
|
26
|
+
expect(person).to_not be_persisted
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "when the relation is a belongs to" do
|
|
32
|
+
|
|
33
|
+
context "when the inverse is a has one" do
|
|
34
|
+
|
|
35
|
+
let(:division) do
|
|
36
|
+
Division.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
let!(:league) do
|
|
40
|
+
division.build_league
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "builds the document" do
|
|
44
|
+
expect(division.league).to eq(league)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "sets the inverse" do
|
|
48
|
+
expect(league.division).to eq(division)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "does not save the document" do
|
|
52
|
+
expect(league).to_not be_persisted
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe "#create_#\{name}" do
|
|
61
|
+
|
|
62
|
+
context "when the relation is a has_one" do
|
|
63
|
+
|
|
64
|
+
let(:player) do
|
|
65
|
+
Player.create
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
let!(:person) do
|
|
69
|
+
player.create_person
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it "builds the document" do
|
|
73
|
+
expect(player.person).to eq(person)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
it "sets the inverse" do
|
|
77
|
+
expect(person.player).to eq(player)
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "does save the document" do
|
|
81
|
+
expect(person).to be_persisted
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
context "when the relation is a belongs to" do
|
|
87
|
+
|
|
88
|
+
context "when the inverse is a has one" do
|
|
89
|
+
|
|
90
|
+
let(:division) do
|
|
91
|
+
Division.create
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
let!(:league) do
|
|
95
|
+
division.create_league
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
it "builds the document" do
|
|
99
|
+
expect(division.league).to eq(league)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
it "sets the inverse" do
|
|
103
|
+
expect(league.division).to eq(division)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "does save the document" do
|
|
107
|
+
expect(league).to be_persisted
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Dependent do
|
|
4
|
+
|
|
5
|
+
describe ".dependent_documents" do
|
|
6
|
+
|
|
7
|
+
context "relation is a has_one" do
|
|
8
|
+
|
|
9
|
+
let(:base_class) { Player }
|
|
10
|
+
let(:target_class) { Person }
|
|
11
|
+
let(:relation_name) { :person }
|
|
12
|
+
let(:persisted_base) { base_class.create }
|
|
13
|
+
let(:new_target) { target_class.new }
|
|
14
|
+
let(:metadata) { base_class.am_relations[relation_name.to_s] }
|
|
15
|
+
|
|
16
|
+
before do
|
|
17
|
+
base_class.dependent_documents(metadata.merge!(dependent: :destroy))
|
|
18
|
+
persisted_base.person = new_target
|
|
19
|
+
new_target.save!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
after do
|
|
23
|
+
base_class.reset_callbacks(:destroy)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "destroys dependent" do
|
|
27
|
+
persisted_base.destroy
|
|
28
|
+
expect { new_target.reload }.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "relation is a belongs_to" do
|
|
34
|
+
|
|
35
|
+
let(:base_class) { Division }
|
|
36
|
+
let(:target_class) { League }
|
|
37
|
+
let(:relation_name) { :league }
|
|
38
|
+
let(:new_base) { base_class.new }
|
|
39
|
+
let(:persisted_target) { target_class.create }
|
|
40
|
+
let(:metadata) { base_class.am_relations[relation_name.to_s] }
|
|
41
|
+
|
|
42
|
+
before do
|
|
43
|
+
base_class.dependent_documents(metadata.merge!(dependent: :destroy))
|
|
44
|
+
new_base.league = persisted_target
|
|
45
|
+
new_base.save!
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
after do
|
|
49
|
+
base_class.reset_callbacks(:destroy)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it "destroys dependent" do
|
|
53
|
+
new_base.destroy
|
|
54
|
+
expect { persisted_target.reload }.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
context "relation is a has_many" do
|
|
60
|
+
|
|
61
|
+
let(:base_class) { Division }
|
|
62
|
+
let(:target_class) { Team }
|
|
63
|
+
let(:relation_name) { :teams }
|
|
64
|
+
let(:persisted_base) { base_class.create }
|
|
65
|
+
let(:new_target) { target_class.new }
|
|
66
|
+
let(:metadata) { base_class.am_relations[relation_name.to_s] }
|
|
67
|
+
|
|
68
|
+
before do
|
|
69
|
+
base_class.dependent_documents(metadata.merge!(dependent: :destroy))
|
|
70
|
+
persisted_base.teams << new_target
|
|
71
|
+
new_target.save!
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
after do
|
|
75
|
+
base_class.reset_callbacks(:destroy)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "destroys dependents" do
|
|
79
|
+
persisted_base.destroy
|
|
80
|
+
expect { new_target.reload }.to raise_error(Mongoid::Errors::DocumentNotFound)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Macros do
|
|
4
|
+
|
|
5
|
+
ActiveRecord::Schema.define do
|
|
6
|
+
create_table :active_record_test_classes, :force => true do |t|
|
|
7
|
+
t.string :_id
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class ActiveRecordTestClass < ActiveRecord::Base
|
|
12
|
+
include ActiveMongoid::Associations
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:klass) do
|
|
16
|
+
ActiveRecordTestClass
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
before do
|
|
20
|
+
klass.am_relations.clear
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "has_one_document" do
|
|
24
|
+
|
|
25
|
+
it "defines the macro" do
|
|
26
|
+
expect(klass).to respond_to(:has_one_document)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "when defining the relation" do
|
|
30
|
+
|
|
31
|
+
before do
|
|
32
|
+
klass.has_one_document :person
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
let(:object) do
|
|
36
|
+
klass.new
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "adds the metadata to the klass" do
|
|
40
|
+
expect(klass.am_relations['person']).to_not be_nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "defines the getter" do
|
|
44
|
+
expect(object).to respond_to(:person)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "defines the setter" do
|
|
48
|
+
expect(object).to respond_to(:person=)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "defines the builder" do
|
|
52
|
+
expect(object).to respond_to(:build_person)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "defines the creator" do
|
|
56
|
+
expect(object).to respond_to(:create_person)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "creates the correct relation" do
|
|
60
|
+
expect(klass.am_relations["person"].relation).to eq(
|
|
61
|
+
ActiveMongoid::Associations::DocumentRelation::Referenced::One
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Referenced::In do
|
|
4
|
+
describe ".criteria" do
|
|
5
|
+
context "" do
|
|
6
|
+
|
|
7
|
+
let(:id) do
|
|
8
|
+
1
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:metadata) do
|
|
12
|
+
Division.am_relations["league"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:criteria) do
|
|
16
|
+
described_class.criteria(metadata, id, League)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "does not include the type in the criteria" do
|
|
20
|
+
expect(criteria.selector).to eq({"_id" => id})
|
|
21
|
+
expect(criteria.klass).to eq(League)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require "spec_helper"
|
|
2
|
+
|
|
3
|
+
describe ActiveMongoid::Associations::DocumentRelation::Referenced::Many do
|
|
4
|
+
|
|
5
|
+
describe ".criteria" do
|
|
6
|
+
|
|
7
|
+
let(:id) do
|
|
8
|
+
1
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
let(:metadata) do
|
|
12
|
+
Division.am_relations["teams"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
let(:criteria) do
|
|
16
|
+
described_class.criteria(metadata, id, Team)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "does not include the type in the criteria" do
|
|
20
|
+
expect(criteria.selector).to eq({"division_id" => id})
|
|
21
|
+
expect(criteria.klass).to eq(Team)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it_behaves_like "a has_many relation" do
|
|
27
|
+
let(:base_class) { Division }
|
|
28
|
+
let(:target_class) { Team }
|
|
29
|
+
let(:relation_name) { :teams }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|