crnixon-mongomapper 0.2.0 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/.gitignore +1 -0
  2. data/History +48 -0
  3. data/README.rdoc +5 -3
  4. data/Rakefile +6 -4
  5. data/VERSION +1 -1
  6. data/bin/mmconsole +56 -0
  7. data/lib/mongomapper.rb +29 -18
  8. data/lib/mongomapper/associations.rb +53 -38
  9. data/lib/mongomapper/associations/base.rb +53 -20
  10. data/lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb +34 -0
  11. data/lib/mongomapper/associations/belongs_to_proxy.rb +10 -14
  12. data/lib/mongomapper/associations/many_documents_as_proxy.rb +27 -0
  13. data/lib/mongomapper/associations/many_documents_proxy.rb +103 -0
  14. data/lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb +33 -0
  15. data/lib/mongomapper/associations/{has_many_embedded_proxy.rb → many_embedded_proxy.rb} +6 -8
  16. data/lib/mongomapper/associations/many_polymorphic_proxy.rb +11 -0
  17. data/lib/mongomapper/associations/{array_proxy.rb → many_proxy.rb} +1 -1
  18. data/lib/mongomapper/associations/proxy.rb +24 -21
  19. data/lib/mongomapper/callbacks.rb +1 -1
  20. data/lib/mongomapper/document.rb +160 -74
  21. data/lib/mongomapper/dynamic_finder.rb +38 -0
  22. data/lib/mongomapper/embedded_document.rb +154 -105
  23. data/lib/mongomapper/finder_options.rb +11 -7
  24. data/lib/mongomapper/key.rb +15 -21
  25. data/lib/mongomapper/pagination.rb +52 -0
  26. data/lib/mongomapper/rails_compatibility/document.rb +15 -0
  27. data/lib/mongomapper/rails_compatibility/embedded_document.rb +25 -0
  28. data/lib/mongomapper/serialization.rb +1 -1
  29. data/lib/mongomapper/serializers/json_serializer.rb +15 -0
  30. data/lib/mongomapper/support.rb +30 -0
  31. data/mongomapper.gemspec +87 -46
  32. data/test/NOTE_ON_TESTING +1 -0
  33. data/test/functional/associations/test_belongs_to_polymorphic_proxy.rb +53 -0
  34. data/test/functional/associations/test_belongs_to_proxy.rb +45 -0
  35. data/test/functional/associations/test_many_documents_as_proxy.rb +253 -0
  36. data/test/functional/associations/test_many_embedded_polymorphic_proxy.rb +131 -0
  37. data/test/functional/associations/test_many_embedded_proxy.rb +106 -0
  38. data/test/functional/associations/test_many_polymorphic_proxy.rb +261 -0
  39. data/test/functional/associations/test_many_proxy.rb +295 -0
  40. data/test/functional/test_associations.rb +47 -0
  41. data/test/{test_callbacks.rb → functional/test_callbacks.rb} +2 -1
  42. data/test/functional/test_document.rb +952 -0
  43. data/test/functional/test_pagination.rb +81 -0
  44. data/test/functional/test_rails_compatibility.rb +30 -0
  45. data/test/functional/test_validations.rb +172 -0
  46. data/test/models.rb +169 -0
  47. data/test/test_helper.rb +7 -2
  48. data/test/unit/serializers/test_json_serializer.rb +189 -0
  49. data/test/unit/test_association_base.rb +144 -0
  50. data/test/unit/test_document.rb +123 -0
  51. data/test/unit/test_embedded_document.rb +526 -0
  52. data/test/{test_finder_options.rb → unit/test_finder_options.rb} +36 -1
  53. data/test/{test_key.rb → unit/test_key.rb} +59 -12
  54. data/test/{test_mongomapper.rb → unit/test_mongomapper.rb} +0 -0
  55. data/test/{test_observing.rb → unit/test_observing.rb} +0 -0
  56. data/test/unit/test_pagination.rb +113 -0
  57. data/test/unit/test_rails_compatibility.rb +34 -0
  58. data/test/{test_serializations.rb → unit/test_serializations.rb} +0 -2
  59. data/test/{test_validations.rb → unit/test_validations.rb} +0 -134
  60. metadata +81 -43
  61. data/lib/mongomapper/associations/has_many_proxy.rb +0 -28
  62. data/lib/mongomapper/associations/polymorphic_belongs_to_proxy.rb +0 -31
  63. data/lib/mongomapper/rails_compatibility.rb +0 -23
  64. data/test/serializers/test_json_serializer.rb +0 -104
  65. data/test/test_associations.rb +0 -174
  66. data/test/test_document.rb +0 -944
  67. data/test/test_embedded_document.rb +0 -253
  68. data/test/test_rails_compatibility.rb +0 -29
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crnixon-mongomapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -9,8 +9,8 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-07-07 00:00:00 -07:00
13
- default_executable:
12
+ date: 2009-08-28 00:00:00 -07:00
13
+ default_executable: mmconsole
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -28,9 +28,9 @@ dependencies:
28
28
  version_requirement:
29
29
  version_requirements: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "="
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: "0.9"
33
+ version: 0.11.1
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: jnunemaker-validatable
@@ -38,9 +38,9 @@ dependencies:
38
38
  version_requirement:
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "="
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: 1.7.1
43
+ version: 1.7.2
44
44
  version:
45
45
  - !ruby/object:Gem::Dependency
46
46
  name: mocha
@@ -48,7 +48,7 @@ dependencies:
48
48
  version_requirement:
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - "="
51
+ - - ">="
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.9.4
54
54
  version:
@@ -58,14 +58,14 @@ dependencies:
58
58
  version_requirement:
59
59
  version_requirements: !ruby/object:Gem::Requirement
60
60
  requirements:
61
- - - "="
61
+ - - ">="
62
62
  - !ruby/object:Gem::Version
63
63
  version: 0.4.0
64
64
  version:
65
65
  description:
66
66
  email: nunemaker@gmail.com
67
- executables: []
68
-
67
+ executables:
68
+ - mmconsole
69
69
  extensions: []
70
70
 
71
71
  extra_rdoc_files:
@@ -78,42 +78,66 @@ files:
78
78
  - README.rdoc
79
79
  - Rakefile
80
80
  - VERSION
81
+ - bin/mmconsole
81
82
  - lib/mongomapper.rb
82
83
  - lib/mongomapper/associations.rb
83
- - lib/mongomapper/associations/array_proxy.rb
84
84
  - lib/mongomapper/associations/base.rb
85
+ - lib/mongomapper/associations/belongs_to_polymorphic_proxy.rb
85
86
  - lib/mongomapper/associations/belongs_to_proxy.rb
86
- - lib/mongomapper/associations/has_many_embedded_proxy.rb
87
- - lib/mongomapper/associations/has_many_proxy.rb
88
- - lib/mongomapper/associations/polymorphic_belongs_to_proxy.rb
87
+ - lib/mongomapper/associations/many_documents_as_proxy.rb
88
+ - lib/mongomapper/associations/many_documents_proxy.rb
89
+ - lib/mongomapper/associations/many_embedded_polymorphic_proxy.rb
90
+ - lib/mongomapper/associations/many_embedded_proxy.rb
91
+ - lib/mongomapper/associations/many_polymorphic_proxy.rb
92
+ - lib/mongomapper/associations/many_proxy.rb
89
93
  - lib/mongomapper/associations/proxy.rb
90
94
  - lib/mongomapper/callbacks.rb
91
95
  - lib/mongomapper/document.rb
96
+ - lib/mongomapper/dynamic_finder.rb
92
97
  - lib/mongomapper/embedded_document.rb
93
98
  - lib/mongomapper/finder_options.rb
94
99
  - lib/mongomapper/key.rb
95
100
  - lib/mongomapper/observing.rb
96
- - lib/mongomapper/rails_compatibility.rb
101
+ - lib/mongomapper/pagination.rb
102
+ - lib/mongomapper/rails_compatibility/document.rb
103
+ - lib/mongomapper/rails_compatibility/embedded_document.rb
97
104
  - lib/mongomapper/save_with_validation.rb
98
105
  - lib/mongomapper/serialization.rb
99
106
  - lib/mongomapper/serializers/json_serializer.rb
107
+ - lib/mongomapper/support.rb
100
108
  - lib/mongomapper/validations.rb
101
109
  - mongomapper.gemspec
102
- - test/serializers/test_json_serializer.rb
103
- - test/test_associations.rb
104
- - test/test_callbacks.rb
105
- - test/test_document.rb
106
- - test/test_embedded_document.rb
107
- - test/test_finder_options.rb
110
+ - test/NOTE_ON_TESTING
111
+ - test/functional/associations/test_belongs_to_polymorphic_proxy.rb
112
+ - test/functional/associations/test_belongs_to_proxy.rb
113
+ - test/functional/associations/test_many_documents_as_proxy.rb
114
+ - test/functional/associations/test_many_embedded_polymorphic_proxy.rb
115
+ - test/functional/associations/test_many_embedded_proxy.rb
116
+ - test/functional/associations/test_many_polymorphic_proxy.rb
117
+ - test/functional/associations/test_many_proxy.rb
118
+ - test/functional/test_associations.rb
119
+ - test/functional/test_callbacks.rb
120
+ - test/functional/test_document.rb
121
+ - test/functional/test_pagination.rb
122
+ - test/functional/test_rails_compatibility.rb
123
+ - test/functional/test_validations.rb
124
+ - test/models.rb
108
125
  - test/test_helper.rb
109
- - test/test_key.rb
110
- - test/test_mongomapper.rb
111
- - test/test_observing.rb
112
- - test/test_rails_compatibility.rb
113
- - test/test_serializations.rb
114
- - test/test_validations.rb
115
- has_rdoc: true
126
+ - test/unit/serializers/test_json_serializer.rb
127
+ - test/unit/test_association_base.rb
128
+ - test/unit/test_document.rb
129
+ - test/unit/test_embedded_document.rb
130
+ - test/unit/test_finder_options.rb
131
+ - test/unit/test_key.rb
132
+ - test/unit/test_mongomapper.rb
133
+ - test/unit/test_observing.rb
134
+ - test/unit/test_pagination.rb
135
+ - test/unit/test_rails_compatibility.rb
136
+ - test/unit/test_serializations.rb
137
+ - test/unit/test_validations.rb
138
+ has_rdoc: false
116
139
  homepage: http://github.com/jnunemaker/mongomapper
140
+ licenses:
117
141
  post_install_message:
118
142
  rdoc_options:
119
143
  - --charset=UTF-8
@@ -134,21 +158,35 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
158
  requirements: []
135
159
 
136
160
  rubyforge_project: mongomapper
137
- rubygems_version: 1.2.0
161
+ rubygems_version: 1.3.5
138
162
  signing_key:
139
- specification_version: 2
163
+ specification_version: 3
140
164
  summary: Awesome gem for modeling your domain and storing it in mongo
141
165
  test_files:
142
- - test/serializers/test_json_serializer.rb
143
- - test/test_associations.rb
144
- - test/test_callbacks.rb
145
- - test/test_document.rb
146
- - test/test_embedded_document.rb
147
- - test/test_finder_options.rb
166
+ - test/functional/associations/test_belongs_to_polymorphic_proxy.rb
167
+ - test/functional/associations/test_belongs_to_proxy.rb
168
+ - test/functional/associations/test_many_documents_as_proxy.rb
169
+ - test/functional/associations/test_many_embedded_polymorphic_proxy.rb
170
+ - test/functional/associations/test_many_embedded_proxy.rb
171
+ - test/functional/associations/test_many_polymorphic_proxy.rb
172
+ - test/functional/associations/test_many_proxy.rb
173
+ - test/functional/test_associations.rb
174
+ - test/functional/test_callbacks.rb
175
+ - test/functional/test_document.rb
176
+ - test/functional/test_pagination.rb
177
+ - test/functional/test_rails_compatibility.rb
178
+ - test/functional/test_validations.rb
179
+ - test/models.rb
148
180
  - test/test_helper.rb
149
- - test/test_key.rb
150
- - test/test_mongomapper.rb
151
- - test/test_observing.rb
152
- - test/test_rails_compatibility.rb
153
- - test/test_serializations.rb
154
- - test/test_validations.rb
181
+ - test/unit/serializers/test_json_serializer.rb
182
+ - test/unit/test_association_base.rb
183
+ - test/unit/test_document.rb
184
+ - test/unit/test_embedded_document.rb
185
+ - test/unit/test_finder_options.rb
186
+ - test/unit/test_key.rb
187
+ - test/unit/test_mongomapper.rb
188
+ - test/unit/test_observing.rb
189
+ - test/unit/test_pagination.rb
190
+ - test/unit/test_rails_compatibility.rb
191
+ - test/unit/test_serializations.rb
192
+ - test/unit/test_validations.rb
@@ -1,28 +0,0 @@
1
- module MongoMapper
2
- module Associations
3
- class HasManyProxy < ArrayProxy
4
- def replace(v)
5
- if load_target
6
- @target.map(&:destroy)
7
- end
8
-
9
- v.each do |o|
10
- @owner.save if @owner.new?
11
- o.__send__(:write_attribute, self.foreign_key, @owner.id)
12
- o.save
13
- o
14
- end
15
- reload_target
16
- end
17
-
18
- protected
19
- def find_target
20
- @association.klass.find(:all, {:conditions => {self.foreign_key => @owner.id}})
21
- end
22
-
23
- def foreign_key
24
- @association.options[:foreign_key] || @owner.class.name.underscore.gsub("/", "_") + "_id"
25
- end
26
- end
27
- end
28
- end
@@ -1,31 +0,0 @@
1
- module MongoMapper
2
- module Associations
3
- class PolymorphicBelongsToProxy < Proxy
4
- def replace(v)
5
- ref_id = "#{@association.name}_id"
6
- ref_type = "#{@association.name}_type"
7
-
8
- if v
9
- v.save if v.new?
10
- @owner.__send__(:write_attribute, ref_id, v.id)
11
- @owner.__send__(:write_attribute, ref_type, v.class.name)
12
- else
13
- @owner.__send__(:write_attribute, ref_id, nil)
14
- @owner.__send__(:write_attribute, ref_type, nil)
15
- end
16
- @owner.save
17
-
18
- reload_target
19
- end
20
-
21
- protected
22
- def find_target
23
- ref_id = @owner.__send__(:read_attribute, "#{@association.name}_id")
24
- ref_type = @owner.__send__(:read_attribute, "#{@association.name}_type")
25
- if ref_id && ref_type
26
- ref_type.constantize.find(ref_id)
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,23 +0,0 @@
1
- module MongoMapper
2
- module RailsCompatibility
3
- def self.included(model)
4
- model.class_eval do
5
- alias_method :new_record?, :new?
6
- extend ClassMethods
7
- end
8
- class << model
9
- alias_method :has_many, :many
10
- end
11
- end
12
-
13
- module ClassMethods
14
- def column_names
15
- keys.keys
16
- end
17
- end
18
-
19
- def to_param
20
- id
21
- end
22
- end
23
- end
@@ -1,104 +0,0 @@
1
- require 'test_helper'
2
-
3
- class JsonSerializationTest < Test::Unit::TestCase
4
- class Contact
5
- include MongoMapper::EmbeddedDocument
6
- key :name, String
7
- key :age, Integer
8
- key :created_at, Time
9
- key :awesome, Boolean
10
- key :preferences, Hash
11
- end
12
-
13
- def setup
14
- Contact.include_root_in_json = false
15
- @contact = Contact.new(
16
- :name => 'Konata Izumi',
17
- :age => 16,
18
- :created_at => Time.utc(2006, 8, 1),
19
- :awesome => true,
20
- :preferences => { :shows => 'anime' }
21
- )
22
- end
23
-
24
- should "include demodulized root" do
25
- Contact.include_root_in_json = true
26
- assert_match %r{^\{"contact": \{}, @contact.to_json
27
- end
28
-
29
- should "encode all encodable attributes" do
30
- json = @contact.to_json
31
-
32
- assert_match %r{"name": "Konata Izumi"}, json
33
- assert_match %r{"age": 16}, json
34
- assert json.include?(%("created_at": #{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
35
- assert_match %r{"awesome": true}, json
36
- assert_match %r{"preferences": \{"shows": "anime"\}}, json
37
- end
38
-
39
- should "allow attribute filtering with only" do
40
- json = @contact.to_json(:only => [:name, :age])
41
-
42
- assert_match %r{"name": "Konata Izumi"}, json
43
- assert_match %r{"age": 16}, json
44
- assert_no_match %r{"awesome"}, json
45
- assert_no_match %r{"created_at"}, json
46
- assert_no_match %r{"preferences"}, json
47
- end
48
-
49
- should "allow attribute filtering with except" do
50
- json = @contact.to_json(:except => [:name, :age])
51
-
52
- assert_no_match %r{"name"}, json
53
- assert_no_match %r{"age"}, json
54
- assert_match %r{"awesome"}, json
55
- assert_match %r{"created_at"}, json
56
- assert_match %r{"preferences"}, json
57
- end
58
-
59
- context "including methods" do
60
- setup do
61
- def @contact.label; "Has cheezburger"; end
62
- def @contact.favorite_quote; "Constraints are liberating"; end
63
- end
64
-
65
- should "include single method" do
66
- # Single method.
67
- assert_match %r{"label": "Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
68
- end
69
-
70
- should "include multiple methods" do
71
- json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
72
- assert_match %r{"label": "Has cheezburger"}, json
73
- assert_match %r{"favorite_quote": "Constraints are liberating"}, json
74
- end
75
- end
76
-
77
- context "array of records" do
78
- setup do
79
- @contacts = [
80
- Contact.new(:name => 'David', :age => 39),
81
- Contact.new(:name => 'Mary', :age => 14)
82
- ]
83
- end
84
-
85
- should "allow attribute filtering with only" do
86
- assert_equal %([{"name": "David"}, {"name": "Mary"}]), @contacts.to_json(:only => :name)
87
- end
88
-
89
- should "allow attribute filtering with except" do
90
- json = @contacts.to_json(:except => [:name, :preferences, :awesome, :created_at])
91
- assert_equal %([{"age": 39}, {"age": 14}]), json
92
- end
93
- end
94
-
95
- should "allow options for hash of records" do
96
- contacts = {
97
- 1 => Contact.new(:name => 'David', :age => 39),
98
- 2 => Contact.new(:name => 'Mary', :age => 14)
99
- }
100
-
101
- assert_equal %({"1": {"name": "David"}}), contacts.to_json(:only => [1, :name])
102
- end
103
-
104
- end
@@ -1,174 +0,0 @@
1
- require 'test_helper'
2
-
3
- class Address
4
- include MongoMapper::EmbeddedDocument
5
-
6
- key :address, String
7
- key :city, String
8
- key :state, String
9
- key :zip, Integer
10
- end
11
-
12
- class Project
13
- include MongoMapper::Document
14
-
15
- key :name, String
16
-
17
- many :statuses
18
- many :addresses
19
- end
20
-
21
- class Status
22
- include MongoMapper::Document
23
-
24
- belongs_to :project
25
- belongs_to :target, :polymorphic => true
26
-
27
- key :name, String
28
- end
29
-
30
- class Person
31
- include MongoMapper::EmbeddedDocument
32
- key :name, String
33
- key :child, Person
34
- end
35
-
36
- class AssociationsTest < Test::Unit::TestCase
37
- def setup
38
- Project.collection.clear
39
- Status.collection.clear
40
- end
41
-
42
- context "Polymorphic Belongs To" do
43
- should "default to nil" do
44
- status = Status.new
45
- status.target.should be_nil
46
- end
47
-
48
- should "store the association" do
49
- status = Status.new
50
- project = Project.new(:name => "mongomapper")
51
- status.target = project
52
- status.save.should be_true
53
-
54
- from_db = Status.find(status.id)
55
- from_db.target.should_not be_nil
56
- from_db.target_id.should == project.id
57
- from_db.target_type.should == "Project"
58
- from_db.target.name.should == "mongomapper"
59
- end
60
-
61
- should "unset the association" do
62
- status = Status.new
63
- project = Project.new(:name => "mongomapper")
64
- status.target = project
65
- status.save.should be_true
66
-
67
- from_db = Status.find(status.id)
68
- from_db.target = nil
69
- from_db.target_type.should be_nil
70
- from_db.target_id.should be_nil
71
- from_db.target.should be_nil
72
- end
73
- end
74
-
75
- context "Belongs To" do
76
- should "default to nil" do
77
- status = Status.new
78
- status.project.should be_nil
79
- end
80
-
81
- should "store the association" do
82
- status = Status.new
83
- project = Project.new(:name => "mongomapper")
84
- status.project = project
85
- status.save.should be_true
86
-
87
- from_db = Status.find(status.id)
88
- from_db.project.should_not be_nil
89
- from_db.project.name.should == "mongomapper"
90
- end
91
-
92
- should "unset the association" do
93
- status = Status.new
94
- project = Project.new(:name => "mongomapper")
95
- status.project = project
96
- status.save.should be_true
97
-
98
- from_db = Status.find(status.id)
99
- from_db.project = nil
100
- from_db.project.should be_nil
101
- end
102
- end
103
-
104
- context "Many documents" do
105
- should "default reader to empty array" do
106
- project = Project.new
107
- project.statuses.should == []
108
- end
109
-
110
- should "allow adding to association like it was an array" do
111
- project = Project.new
112
- project.statuses << Status.new
113
- project.statuses.push Status.new
114
- project.statuses.size.should == 2
115
- end
116
-
117
- should "store the association" do
118
- project = Project.new
119
- project.statuses = [Status.new("name" => "ready")]
120
- project.save.should be_true
121
-
122
- from_db = Project.find(project.id)
123
- from_db.statuses.size.should == 1
124
- from_db.statuses[0].name.should == "ready"
125
- end
126
- end
127
-
128
- context "Many embedded documents" do
129
- should "default reader to empty array" do
130
- project = Project.new
131
- project.addresses.should == []
132
- end
133
-
134
- should "allow adding to association like it was an array" do
135
- project = Project.new
136
- project.addresses << Address.new
137
- project.addresses.push Address.new
138
- project.addresses.size.should == 2
139
- end
140
-
141
- should "be embedded in document on save" do
142
- sb = Address.new(:city => 'South Bend', :state => 'IN')
143
- chi = Address.new(:city => 'Chicago', :state => 'IL')
144
- project = Project.new
145
- project.addresses << sb
146
- project.addresses << chi
147
- project.save
148
-
149
- from_db = Project.find(project.id)
150
- from_db.addresses.size.should == 2
151
- from_db.addresses[0].should == sb
152
- from_db.addresses[1].should == chi
153
- end
154
-
155
- should "allow embedding arbitrarily deep" do
156
- @document = Class.new do
157
- include MongoMapper::Document
158
- key :person, Person
159
- end
160
-
161
- meg = Person.new(:name => "Meg")
162
- meg.child = Person.new(:name => "Steve")
163
- meg.child.child = Person.new(:name => "Linda")
164
-
165
- doc = @document.new(:person => meg)
166
- doc.save
167
-
168
- from_db = @document.find(doc.id)
169
- from_db.person.name.should == 'Meg'
170
- from_db.person.child.name.should == 'Steve'
171
- from_db.person.child.child.name.should == 'Linda'
172
- end
173
- end
174
- end