active_model_serializers 0.10.9 → 0.10.10

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.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +18 -2
  3. data/lib/action_controller/serialization.rb +9 -1
  4. data/lib/active_model/serializer.rb +10 -2
  5. data/lib/active_model/serializer/version.rb +1 -1
  6. data/lib/active_model_serializers/adapter/attributes.rb +21 -0
  7. data/lib/active_model_serializers/adapter/json_api/resource_identifier.rb +1 -1
  8. metadata +12 -259
  9. data/.github/ISSUE_TEMPLATE.md +0 -29
  10. data/.github/PULL_REQUEST_TEMPLATE.md +0 -15
  11. data/.gitignore +0 -35
  12. data/.rubocop.yml +0 -109
  13. data/.simplecov +0 -110
  14. data/.travis.yml +0 -63
  15. data/CODE_OF_CONDUCT.md +0 -74
  16. data/CONTRIBUTING.md +0 -105
  17. data/Gemfile +0 -74
  18. data/Rakefile +0 -76
  19. data/active_model_serializers.gemspec +0 -64
  20. data/appveyor.yml +0 -28
  21. data/bin/bench +0 -171
  22. data/bin/bench_regression +0 -316
  23. data/bin/rubocop +0 -38
  24. data/bin/serve_benchmark +0 -39
  25. data/docs/README.md +0 -41
  26. data/docs/STYLE.md +0 -58
  27. data/docs/general/adapters.md +0 -269
  28. data/docs/general/caching.md +0 -58
  29. data/docs/general/configuration_options.md +0 -185
  30. data/docs/general/deserialization.md +0 -100
  31. data/docs/general/fields.md +0 -31
  32. data/docs/general/getting_started.md +0 -133
  33. data/docs/general/instrumentation.md +0 -40
  34. data/docs/general/key_transforms.md +0 -40
  35. data/docs/general/logging.md +0 -21
  36. data/docs/general/rendering.md +0 -293
  37. data/docs/general/serializers.md +0 -495
  38. data/docs/how-open-source-maintained.jpg +0 -0
  39. data/docs/howto/add_pagination_links.md +0 -138
  40. data/docs/howto/add_relationship_links.md +0 -140
  41. data/docs/howto/add_root_key.md +0 -62
  42. data/docs/howto/grape_integration.md +0 -42
  43. data/docs/howto/outside_controller_use.md +0 -66
  44. data/docs/howto/passing_arbitrary_options.md +0 -27
  45. data/docs/howto/serialize_poro.md +0 -73
  46. data/docs/howto/test.md +0 -154
  47. data/docs/howto/upgrade_from_0_8_to_0_10.md +0 -265
  48. data/docs/integrations/ember-and-json-api.md +0 -147
  49. data/docs/integrations/grape.md +0 -19
  50. data/docs/jsonapi/errors.md +0 -56
  51. data/docs/jsonapi/schema.md +0 -151
  52. data/docs/jsonapi/schema/schema.json +0 -366
  53. data/docs/rfcs/0000-namespace.md +0 -106
  54. data/docs/rfcs/template.md +0 -15
  55. data/test/action_controller/adapter_selector_test.rb +0 -64
  56. data/test/action_controller/explicit_serializer_test.rb +0 -137
  57. data/test/action_controller/json/include_test.rb +0 -248
  58. data/test/action_controller/json_api/deserialization_test.rb +0 -114
  59. data/test/action_controller/json_api/errors_test.rb +0 -42
  60. data/test/action_controller/json_api/fields_test.rb +0 -68
  61. data/test/action_controller/json_api/linked_test.rb +0 -204
  62. data/test/action_controller/json_api/pagination_test.rb +0 -126
  63. data/test/action_controller/json_api/transform_test.rb +0 -191
  64. data/test/action_controller/lookup_proc_test.rb +0 -51
  65. data/test/action_controller/namespace_lookup_test.rb +0 -234
  66. data/test/action_controller/serialization_scope_name_test.rb +0 -237
  67. data/test/action_controller/serialization_test.rb +0 -480
  68. data/test/active_model_serializers/adapter_for_test.rb +0 -210
  69. data/test/active_model_serializers/json_pointer_test.rb +0 -24
  70. data/test/active_model_serializers/logging_test.rb +0 -79
  71. data/test/active_model_serializers/model_test.rb +0 -144
  72. data/test/active_model_serializers/railtie_test_isolated.rb +0 -70
  73. data/test/active_model_serializers/register_jsonapi_renderer_test_isolated.rb +0 -163
  74. data/test/active_model_serializers/serialization_context_test_isolated.rb +0 -73
  75. data/test/active_model_serializers/test/schema_test.rb +0 -133
  76. data/test/active_model_serializers/test/serializer_test.rb +0 -64
  77. data/test/active_record_test.rb +0 -11
  78. data/test/adapter/attributes_test.rb +0 -42
  79. data/test/adapter/deprecation_test.rb +0 -102
  80. data/test/adapter/json/belongs_to_test.rb +0 -47
  81. data/test/adapter/json/collection_test.rb +0 -106
  82. data/test/adapter/json/has_many_test.rb +0 -55
  83. data/test/adapter/json/transform_test.rb +0 -95
  84. data/test/adapter/json_api/belongs_to_test.rb +0 -157
  85. data/test/adapter/json_api/collection_test.rb +0 -98
  86. data/test/adapter/json_api/errors_test.rb +0 -78
  87. data/test/adapter/json_api/fields_test.rb +0 -98
  88. data/test/adapter/json_api/has_many_explicit_serializer_test.rb +0 -98
  89. data/test/adapter/json_api/has_many_test.rb +0 -175
  90. data/test/adapter/json_api/has_one_test.rb +0 -82
  91. data/test/adapter/json_api/include_data_if_sideloaded_test.rb +0 -215
  92. data/test/adapter/json_api/json_api_test.rb +0 -35
  93. data/test/adapter/json_api/linked_test.rb +0 -415
  94. data/test/adapter/json_api/links_test.rb +0 -112
  95. data/test/adapter/json_api/pagination_links_test.rb +0 -208
  96. data/test/adapter/json_api/parse_test.rb +0 -139
  97. data/test/adapter/json_api/relationship_test.rb +0 -399
  98. data/test/adapter/json_api/resource_meta_test.rb +0 -102
  99. data/test/adapter/json_api/toplevel_jsonapi_test.rb +0 -84
  100. data/test/adapter/json_api/transform_test.rb +0 -514
  101. data/test/adapter/json_api/type_test.rb +0 -195
  102. data/test/adapter/json_test.rb +0 -48
  103. data/test/adapter/null_test.rb +0 -24
  104. data/test/adapter/polymorphic_test.rb +0 -220
  105. data/test/adapter_test.rb +0 -69
  106. data/test/array_serializer_test.rb +0 -24
  107. data/test/benchmark/app.rb +0 -67
  108. data/test/benchmark/benchmarking_support.rb +0 -69
  109. data/test/benchmark/bm_active_record.rb +0 -83
  110. data/test/benchmark/bm_adapter.rb +0 -40
  111. data/test/benchmark/bm_caching.rb +0 -121
  112. data/test/benchmark/bm_lookup_chain.rb +0 -85
  113. data/test/benchmark/bm_transform.rb +0 -47
  114. data/test/benchmark/config.ru +0 -3
  115. data/test/benchmark/controllers.rb +0 -85
  116. data/test/benchmark/fixtures.rb +0 -221
  117. data/test/cache_test.rb +0 -717
  118. data/test/collection_serializer_test.rb +0 -129
  119. data/test/fixtures/active_record.rb +0 -115
  120. data/test/fixtures/poro.rb +0 -227
  121. data/test/generators/scaffold_controller_generator_test.rb +0 -26
  122. data/test/generators/serializer_generator_test.rb +0 -77
  123. data/test/grape_test.rb +0 -198
  124. data/test/lint_test.rb +0 -51
  125. data/test/logger_test.rb +0 -22
  126. data/test/poro_test.rb +0 -11
  127. data/test/serializable_resource_test.rb +0 -81
  128. data/test/serializers/association_macros_test.rb +0 -39
  129. data/test/serializers/associations_test.rb +0 -520
  130. data/test/serializers/attribute_test.rb +0 -155
  131. data/test/serializers/attributes_test.rb +0 -54
  132. data/test/serializers/caching_configuration_test_isolated.rb +0 -172
  133. data/test/serializers/configuration_test.rb +0 -34
  134. data/test/serializers/fieldset_test.rb +0 -16
  135. data/test/serializers/meta_test.rb +0 -204
  136. data/test/serializers/options_test.rb +0 -34
  137. data/test/serializers/read_attribute_for_serialization_test.rb +0 -81
  138. data/test/serializers/reflection_test.rb +0 -481
  139. data/test/serializers/root_test.rb +0 -23
  140. data/test/serializers/serialization_test.rb +0 -57
  141. data/test/serializers/serializer_for_test.rb +0 -138
  142. data/test/serializers/serializer_for_with_namespace_test.rb +0 -90
  143. data/test/support/custom_schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  144. data/test/support/isolated_unit.rb +0 -86
  145. data/test/support/rails5_shims.rb +0 -55
  146. data/test/support/rails_app.rb +0 -40
  147. data/test/support/schemas/active_model_serializers/test/schema_test/my/index.json +0 -6
  148. data/test/support/schemas/active_model_serializers/test/schema_test/my/show.json +0 -6
  149. data/test/support/schemas/custom/show.json +0 -7
  150. data/test/support/schemas/hyper_schema.json +0 -93
  151. data/test/support/schemas/render_using_json_api.json +0 -43
  152. data/test/support/schemas/simple_json_pointers.json +0 -10
  153. data/test/support/serialization_testing.rb +0 -81
  154. data/test/test_helper.rb +0 -72
@@ -1,191 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class JsonApi
8
- class KeyTransformTest < ActionController::TestCase
9
- class KeyTransformTestController < ActionController::Base
10
- class Post < ::Model
11
- attributes :title, :body, :publish_at
12
- associations :author, :top_comments
13
- end
14
- class Author < ::Model
15
- attributes :first_name, :last_name
16
- end
17
- class TopComment < ::Model
18
- attributes :body
19
- associations :author, :post
20
- end
21
- class PostSerializer < ActiveModel::Serializer
22
- type 'posts'
23
- attributes :title, :body, :publish_at
24
- belongs_to :author
25
- has_many :top_comments
26
-
27
- link(:post_authors) { 'https://example.com/post_authors' }
28
-
29
- meta do
30
- {
31
- rating: 5,
32
- favorite_count: 10
33
- }
34
- end
35
- end
36
-
37
- class AuthorSerializer < ActiveModel::Serializer
38
- type 'authors'
39
- attributes :first_name, :last_name
40
- end
41
-
42
- class TopCommentSerializer < ActiveModel::Serializer
43
- type 'top_comments'
44
- attributes :body
45
- belongs_to :author
46
- end
47
-
48
- def setup_post
49
- ActionController::Base.cache_store.clear
50
- @author = Author.new(id: 1, first_name: 'Bob', last_name: 'Jones')
51
- @comment1 = TopComment.new(id: 7, body: 'cool', author: @author)
52
- @comment2 = TopComment.new(id: 12, body: 'awesome', author: @author)
53
- @post = Post.new(id: 1337, title: 'Title 1', body: 'Body 1',
54
- author: @author, top_comments: [@comment1, @comment2],
55
- publish_at: '2020-03-16T03:55:25.291Z')
56
- @comment1.post = @post
57
- @comment2.post = @post
58
- end
59
-
60
- def render_resource_with_transform
61
- setup_post
62
- render json: @post, serializer: PostSerializer, adapter: :json_api,
63
- key_transform: :camel
64
- end
65
-
66
- def render_resource_with_transform_nil
67
- setup_post
68
- render json: @post, serializer: PostSerializer, adapter: :json_api,
69
- key_transform: nil
70
- end
71
-
72
- def render_resource_with_transform_with_global_config
73
- old_transform = ActiveModelSerializers.config.key_transform
74
- setup_post
75
- ActiveModelSerializers.config.key_transform = :camel_lower
76
- render json: @post, serializer: PostSerializer, adapter: :json_api
77
- ensure
78
- ActiveModelSerializers.config.key_transform = old_transform
79
- end
80
- end
81
-
82
- tests KeyTransformTestController
83
-
84
- def test_render_resource_with_transform
85
- get :render_resource_with_transform
86
- response = JSON.parse(@response.body)
87
- expected = {
88
- 'Data' => {
89
- 'Id' => '1337',
90
- 'Type' => 'Posts',
91
- 'Attributes' => {
92
- 'Title' => 'Title 1',
93
- 'Body' => 'Body 1',
94
- 'PublishAt' => '2020-03-16T03:55:25.291Z'
95
- },
96
- 'Relationships' => {
97
- 'Author' => {
98
- 'Data' => {
99
- 'Id' => '1',
100
- 'Type' => 'Authors'
101
- }
102
- },
103
- 'TopComments' => {
104
- 'Data' => [
105
- { 'Id' => '7', 'Type' => 'TopComments' },
106
- { 'Id' => '12', 'Type' => 'TopComments' }
107
- ]
108
- }
109
- },
110
- 'Links' => {
111
- 'PostAuthors' => 'https://example.com/post_authors'
112
- },
113
- 'Meta' => { 'Rating' => 5, 'FavoriteCount' => 10 }
114
- }
115
- }
116
- assert_equal expected, response
117
- end
118
-
119
- def test_render_resource_with_transform_nil
120
- get :render_resource_with_transform_nil
121
- response = JSON.parse(@response.body)
122
- expected = {
123
- 'data' => {
124
- 'id' => '1337',
125
- 'type' => 'posts',
126
- 'attributes' => {
127
- 'title' => 'Title 1',
128
- 'body' => 'Body 1',
129
- 'publish-at' => '2020-03-16T03:55:25.291Z'
130
- },
131
- 'relationships' => {
132
- 'author' => {
133
- 'data' => {
134
- 'id' => '1',
135
- 'type' => 'authors'
136
- }
137
- },
138
- 'top-comments' => {
139
- 'data' => [
140
- { 'id' => '7', 'type' => 'top-comments' },
141
- { 'id' => '12', 'type' => 'top-comments' }
142
- ]
143
- }
144
- },
145
- 'links' => {
146
- 'post-authors' => 'https://example.com/post_authors'
147
- },
148
- 'meta' => { 'rating' => 5, 'favorite-count' => 10 }
149
- }
150
- }
151
- assert_equal expected, response
152
- end
153
-
154
- def test_render_resource_with_transform_with_global_config
155
- get :render_resource_with_transform_with_global_config
156
- response = JSON.parse(@response.body)
157
- expected = {
158
- 'data' => {
159
- 'id' => '1337',
160
- 'type' => 'posts',
161
- 'attributes' => {
162
- 'title' => 'Title 1',
163
- 'body' => 'Body 1',
164
- 'publishAt' => '2020-03-16T03:55:25.291Z'
165
- },
166
- 'relationships' => {
167
- 'author' => {
168
- 'data' => {
169
- 'id' => '1',
170
- 'type' => 'authors'
171
- }
172
- },
173
- 'topComments' => {
174
- 'data' => [
175
- { 'id' => '7', 'type' => 'topComments' },
176
- { 'id' => '12', 'type' => 'topComments' }
177
- ]
178
- }
179
- },
180
- 'links' => {
181
- 'postAuthors' => 'https://example.com/post_authors'
182
- },
183
- 'meta' => { 'rating' => 5, 'favoriteCount' => 10 }
184
- }
185
- }
186
- assert_equal expected, response
187
- end
188
- end
189
- end
190
- end
191
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class LookupProcTest < ActionController::TestCase
8
- module Api
9
- module V3
10
- class PostCustomSerializer < ActiveModel::Serializer
11
- attributes :title, :body
12
-
13
- belongs_to :author
14
- end
15
-
16
- class AuthorCustomSerializer < ActiveModel::Serializer
17
- attributes :name
18
- end
19
-
20
- class LookupProcTestController < ActionController::Base
21
- def implicit_namespaced_serializer
22
- author = Author.new(name: 'Bob')
23
- post = Post.new(title: 'New Post', body: 'Body', author: author)
24
-
25
- render json: post
26
- end
27
- end
28
- end
29
- end
30
-
31
- tests Api::V3::LookupProcTestController
32
-
33
- test 'implicitly uses namespaced serializer' do
34
- controller_namespace = lambda do |resource_class, _parent_serializer_class, namespace|
35
- "#{namespace}::#{resource_class}CustomSerializer" if namespace
36
- end
37
-
38
- with_prepended_lookup(controller_namespace) do
39
- get :implicit_namespaced_serializer
40
-
41
- assert_serializer Api::V3::PostCustomSerializer
42
-
43
- expected = { 'title' => 'New Post', 'body' => 'Body', 'author' => { 'name' => 'Bob' } }
44
- actual = JSON.parse(@response.body)
45
-
46
- assert_equal expected, actual
47
- end
48
- end
49
- end
50
- end
51
- end
@@ -1,234 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'test_helper'
4
-
5
- module ActionController
6
- module Serialization
7
- class NamespaceLookupTest < ActionController::TestCase
8
- class Book < ::Model
9
- attributes :id, :title, :body
10
- associations :writer, :chapters
11
- end
12
- class Chapter < ::Model
13
- attributes :title
14
- end
15
- class Writer < ::Model
16
- attributes :name
17
- end
18
-
19
- module Api
20
- module V2
21
- class BookSerializer < ActiveModel::Serializer
22
- attributes :title
23
- end
24
- end
25
-
26
- module VHeader
27
- class BookSerializer < ActiveModel::Serializer
28
- attributes :title, :body
29
-
30
- def body
31
- 'header'
32
- end
33
- end
34
- end
35
-
36
- module V3
37
- class BookSerializer < ActiveModel::Serializer
38
- attributes :title, :body
39
-
40
- belongs_to :writer
41
- has_many :chapters
42
- end
43
-
44
- class ChapterSerializer < ActiveModel::Serializer
45
- attribute :title do
46
- "Chapter - #{object.title}"
47
- end
48
- end
49
-
50
- class WriterSerializer < ActiveModel::Serializer
51
- attributes :name
52
- end
53
-
54
- class LookupTestController < ActionController::Base
55
- before_action only: [:namespace_set_in_before_filter] do
56
- self.namespace_for_serializer = Api::V2
57
- end
58
-
59
- def implicit_namespaced_serializer
60
- writer = Writer.new(name: 'Bob')
61
- book = Book.new(title: 'New Post', body: 'Body', writer: writer, chapters: [])
62
-
63
- render json: book
64
- end
65
-
66
- def implicit_namespaced_collection_serializer
67
- chapter1 = Chapter.new(title: 'Oh')
68
- chapter2 = Chapter.new(title: 'Oh my')
69
-
70
- render json: [chapter1, chapter2]
71
- end
72
-
73
- def implicit_has_many_namespaced_serializer
74
- chapter1 = Chapter.new(title: 'Odd World')
75
- chapter2 = Chapter.new(title: 'New World')
76
- book = Book.new(title: 'New Post', body: 'Body', chapters: [chapter1, chapter2])
77
-
78
- render json: book
79
- end
80
-
81
- def explicit_namespace_as_module
82
- book = Book.new(title: 'New Post', body: 'Body')
83
-
84
- render json: book, namespace: Api::V2
85
- end
86
-
87
- def explicit_namespace_as_string
88
- book = Book.new(title: 'New Post', body: 'Body')
89
-
90
- # because this is a string, ruby can't auto-lookup the constant, so otherwise
91
- # the lookup thinks we mean ::Api::V2
92
- render json: book, namespace: 'ActionController::Serialization::NamespaceLookupTest::Api::V2'
93
- end
94
-
95
- def explicit_namespace_as_symbol
96
- book = Book.new(title: 'New Post', body: 'Body')
97
-
98
- # because this is a string, ruby can't auto-lookup the constant, so otherwise
99
- # the lookup thinks we mean ::Api::V2
100
- render json: book, namespace: :'ActionController::Serialization::NamespaceLookupTest::Api::V2'
101
- end
102
-
103
- def invalid_namespace
104
- book = Book.new(id: 'invalid_namespace_book_id', title: 'New Post', body: 'Body')
105
-
106
- render json: book, namespace: :api_v2
107
- end
108
-
109
- def namespace_set_in_before_filter
110
- book = Book.new(title: 'New Post', body: 'Body')
111
- render json: book
112
- end
113
-
114
- def namespace_set_by_request_headers
115
- book = Book.new(title: 'New Post', body: 'Body')
116
- version_from_header = request.headers['X-API_VERSION']
117
- namespace = "ActionController::Serialization::NamespaceLookupTest::#{version_from_header}"
118
-
119
- render json: book, namespace: namespace
120
- end
121
- end
122
- end
123
- end
124
-
125
- tests Api::V3::LookupTestController
126
-
127
- setup do
128
- @test_namespace = self.class.parent
129
- end
130
-
131
- test 'uses request headers to determine the namespace' do
132
- request.env['X-API_VERSION'] = 'Api::VHeader'
133
- get :namespace_set_by_request_headers
134
-
135
- assert_serializer Api::VHeader::BookSerializer
136
- end
137
-
138
- test 'implicitly uses namespaced serializer' do
139
- get :implicit_namespaced_serializer
140
-
141
- assert_serializer Api::V3::BookSerializer
142
-
143
- expected = { 'title' => 'New Post', 'body' => 'Body', 'writer' => { 'name' => 'Bob' }, 'chapters' => [] }
144
- actual = JSON.parse(@response.body)
145
-
146
- assert_equal expected, actual
147
- end
148
-
149
- test 'implicitly uses namespaced serializer for collection' do
150
- get :implicit_namespaced_collection_serializer
151
-
152
- assert_serializer 'ActiveModel::Serializer::CollectionSerializer'
153
-
154
- expected = [{ 'title' => 'Chapter - Oh' }, { 'title' => 'Chapter - Oh my' }]
155
- actual = JSON.parse(@response.body)
156
-
157
- assert_equal expected, actual
158
- end
159
-
160
- test 'implicitly uses namespaced serializer for has_many' do
161
- get :implicit_has_many_namespaced_serializer
162
-
163
- assert_serializer Api::V3::BookSerializer
164
-
165
- expected = {
166
- 'title' => 'New Post',
167
- 'body' => 'Body', 'writer' => nil,
168
- 'chapters' => [
169
- { 'title' => 'Chapter - Odd World' },
170
- { 'title' => 'Chapter - New World' }
171
- ]
172
- }
173
- actual = JSON.parse(@response.body)
174
-
175
- assert_equal expected, actual
176
- end
177
-
178
- test 'explicit namespace as module' do
179
- get :explicit_namespace_as_module
180
-
181
- assert_serializer Api::V2::BookSerializer
182
-
183
- expected = { 'title' => 'New Post' }
184
- actual = JSON.parse(@response.body)
185
-
186
- assert_equal expected, actual
187
- end
188
-
189
- test 'explicit namespace as string' do
190
- get :explicit_namespace_as_string
191
-
192
- assert_serializer Api::V2::BookSerializer
193
-
194
- expected = { 'title' => 'New Post' }
195
- actual = JSON.parse(@response.body)
196
-
197
- assert_equal expected, actual
198
- end
199
-
200
- test 'explicit namespace as symbol' do
201
- get :explicit_namespace_as_symbol
202
-
203
- assert_serializer Api::V2::BookSerializer
204
-
205
- expected = { 'title' => 'New Post' }
206
- actual = JSON.parse(@response.body)
207
-
208
- assert_equal expected, actual
209
- end
210
-
211
- test 'invalid namespace' do
212
- get :invalid_namespace
213
-
214
- assert_serializer ActiveModel::Serializer::Null
215
-
216
- expected = { 'id' => 'invalid_namespace_book_id', 'title' => 'New Post', 'body' => 'Body' }
217
- actual = JSON.parse(@response.body)
218
-
219
- assert_equal expected, actual
220
- end
221
-
222
- test 'namespace set in before filter' do
223
- get :namespace_set_in_before_filter
224
-
225
- assert_serializer Api::V2::BookSerializer
226
-
227
- expected = { 'title' => 'New Post' }
228
- actual = JSON.parse(@response.body)
229
-
230
- assert_equal expected, actual
231
- end
232
- end
233
- end
234
- end