iron_fixture_extractor 1.0.0 → 1.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.
Files changed (56) hide show
  1. data/CHANGELOG.md +6 -0
  2. data/Gemfile +7 -9
  3. data/README.md +129 -47
  4. data/Rakefile +5 -6
  5. data/iron_fixture_extractor.gemspec +0 -3
  6. data/lib/fe.rb +18 -43
  7. data/lib/fe/extractor.rb +91 -63
  8. data/lib/fe/version.rb +1 -1
  9. data/spec/README_FOR_DEVELOPERS.md +26 -0
  10. data/spec/dummy_environments/sqlite/dummy1/config/database.yml +11 -0
  11. data/spec/dummy_environments/sqlite/dummy1/data_migrations/001_create_some_data.rb +17 -0
  12. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043601_create_posts.rb +13 -0
  13. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043602_create_authors.rb +9 -0
  14. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043603_create_different_posts.rb +14 -0
  15. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043639_create_comments.rb +13 -0
  16. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043808_create_group_members.rb +13 -0
  17. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043818_create_groups.rb +9 -0
  18. data/spec/dummy_environments/sqlite/dummy1/migrations/20120604043819_create_users.rb +10 -0
  19. data/spec/dummy_environments/sqlite/dummy1/models/author.rb +5 -0
  20. data/spec/dummy_environments/sqlite/dummy1/models/comment.rb +5 -0
  21. data/spec/dummy_environments/sqlite/dummy1/models/complex_thing.rb +4 -0
  22. data/spec/dummy_environments/sqlite/dummy1/models/different_post.rb +9 -0
  23. data/spec/dummy_environments/sqlite/dummy1/models/group.rb +5 -0
  24. data/spec/dummy_environments/sqlite/dummy1/models/group_member.rb +5 -0
  25. data/spec/dummy_environments/sqlite/dummy1/models/post.rb +7 -0
  26. data/spec/dummy_environments/sqlite/dummy1/models/serialized_attribute_encoder.rb +12 -0
  27. data/spec/dummy_environments/sqlite/dummy1/models/user.rb +2 -0
  28. data/spec/dummy_environments/sqlite/dummy1/models/user/admin.rb +3 -0
  29. data/spec/dummy_environments/sqlite/dummy1/models/user/jerk.rb +3 -0
  30. data/spec/execute_extract_code_spec.rb +29 -0
  31. data/spec/extract_spec.rb +37 -0
  32. data/spec/extract_works_with_multiple_extract_queries_in_one_command_spec.rb +12 -0
  33. data/spec/fe_test_env_spec.rb +65 -0
  34. data/spec/get_hash_spec.rb +27 -0
  35. data/spec/load_db_map_option_spec.rb +39 -0
  36. data/spec/load_db_spec.rb +48 -0
  37. data/spec/load_db_works_with_serialized_attributes_spec.rb +18 -0
  38. data/spec/rebuild_spec.rb +18 -0
  39. data/spec/spec_helper.rb +15 -0
  40. data/spec/support/fe_test_env.rb +181 -0
  41. data/spec/support/first_post_w_comments_and_authors.rb +12 -0
  42. data/spec/truncate_tables_for_spec.rb +39 -0
  43. data/spec/works_with_single_table_inheritance_spec.rb +16 -0
  44. data/test/basic_usage_test.ported.rb +114 -0
  45. data/test/{different_target_table_test.rb → different_target_table_test.not_porting.rb} +0 -0
  46. data/test/factory_girl_test.not_porting_now.rb +79 -0
  47. data/test/{fe_test_env.rb → fe_test_env.ported.rb} +0 -0
  48. data/test/{get_hash_test.rb → get_hash_test.ported.rb} +17 -1
  49. data/test/{multi_tree_usage_test.rb → multi_tree_usage_test.ported.rb} +0 -0
  50. data/test/{serialized_attribute_test.rb → serialized_attribute_test.ported.rb} +0 -0
  51. data/test/{sti_test.rb → sti_test.ported.rb} +0 -0
  52. data/test/test_helper.rb +0 -1
  53. metadata +135 -88
  54. data/lib/fe/factory_girl_dsl_methods.rb +0 -28
  55. data/test/basic_usage_test.rb +0 -106
  56. data/test/factory_girl_test.rb +0 -77
@@ -0,0 +1,79 @@
1
+ # About
2
+ # =====
3
+ #
4
+ # This feature is being deprecated in favor of eventually writing a spec demonstrating
5
+ # how to use this with FactoryGirl
6
+ #
7
+ # require 'test_helper'
8
+ # require 'factory_girl'
9
+ # class FactoryGirlTest < ActiveSupport::TestCase
10
+ # setup do
11
+
12
+ # @extract_code = 'Post.includes(:comments, :author).limit(1)'
13
+ # @extract_name = :first_post_w_comments_and_authors
14
+ # FeTestEnv.setup # regular production db
15
+ # Fe.extract(@extract_code, :name => @extract_name) # build fixture yml
16
+ # FeTestEnv.the_env = 'fake_test'
17
+ # FeTestEnv.recreate_schema_without_data
18
+
19
+ # @post_hash = Fe.get_hash(:first_post_w_comments_and_authors, Post,"r1")
20
+
21
+
22
+ # end
23
+ # should "expose a .to_factory_girl_string method" do
24
+ # assert_kind_of Hash, @post_hash
25
+ # assert_respond_to @post_hash, :to_factory_girl_string
26
+ # assert !Hash.instance_methods.include?(:to_factory_girl_string)
27
+
28
+ # @fg_string = @post_hash.to_factory_girl_string
29
+ # assert_match /Post/, @fg_string, "The string should have the model name on the first line"
30
+ # end
31
+
32
+ # should ".to_factory_girl_string should return a monkey patched string implementing .to_proc" do
33
+ # @fg_string = @post_hash.to_factory_girl_string
34
+ # assert_respond_to @fg_string, :to_proc
35
+ # end
36
+
37
+ # should "be just like a factory produced in a non-meta way" do
38
+ # FactoryGirl.define do
39
+ # # This is the essense of the code that .to_factory_girl_string spits out
40
+ # factory :fe2, :class => Post do
41
+ # x = Post.new(Fe.get_hash(:first_post_w_comments_and_authors,Post,"r1"))
42
+ # id x.id
43
+ # author_id x.author_id
44
+ # name x.name
45
+ # content x.content
46
+ # serialized_thing x.serialized_thing
47
+ # created_at x.created_at
48
+ # updated_at x.updated_at
49
+ # end
50
+
51
+ # # We are evaluating the to_factory_girl_string in the block context factory girl
52
+ # # if you wanted to override settings you could do so afterwords
53
+ # factory :fe3, :class => Post, &Proc.new {
54
+ # self.instance_eval(Fe.get_hash(:first_post_w_comments_and_authors,Post,"r1").to_factory_girl_string)
55
+ # # I think You could override attributes set in the fixture here, like:
56
+ # # name "poo poo"
57
+ # }
58
+
59
+ # # This is two levels meta-ness away
60
+ # factory :fe4,
61
+ # :class => Post,
62
+ # &Fe.get_hash(:first_post_w_comments_and_authors,Post,"r1").to_factory_girl_string.to_proc
63
+ # end
64
+
65
+ # @fe2 = FactoryGirl.create(:fe2)
66
+ # assert_kind_of Post, @fe2
67
+
68
+ # @fe3 = FactoryGirl.create(:fe3)
69
+ # assert_kind_of Post, @fe3
70
+ # assert_kind_of Time, @fe3.updated_at, "Objects get the right type"
71
+
72
+ # @fe4 = FactoryGirl.create(:fe4)
73
+ # assert_kind_of Post, @fe4
74
+ # assert_kind_of Time, @fe4.updated_at, "Objects get the right type"
75
+ # end
76
+ # teardown do
77
+ # FeTestEnv.teardown
78
+ # end
79
+ # end
File without changes
@@ -1,6 +1,6 @@
1
1
  require 'test_helper'
2
2
  class GetHashTest < ActiveSupport::TestCase
3
- context "Fe" do
3
+ context "Fe#get_hash" do
4
4
  setup do
5
5
  FeTestEnv.setup
6
6
  @extract_code = 'Post.includes(:comments, :author).limit(1)'
@@ -32,4 +32,20 @@ class GetHashTest < ActiveSupport::TestCase
32
32
  FeTestEnv.teardown
33
33
  end
34
34
  end
35
+ context "Fe#get_hashes" do
36
+ setup do
37
+ FeTestEnv.setup
38
+ @extract_code = 'Post.all'
39
+ @extract_name = :all_posts
40
+ extractor = Fe.extract(@extract_code, :name => @extract_name)
41
+ end
42
+ should "work as expected...(this might fail on 1.8.7, where hashes aren't ordered)" do
43
+ uber_fixture_hash = Fe.get_hash(:all_posts, Post, :all)
44
+ fixture_hashes = Fe.get_hashes(:all_posts, Post)
45
+ assert_equal(uber_fixture_hash.values, fixture_hashes, "get_hashes is syntactic sugar for get_hash(...).values")
46
+ end
47
+ teardown do
48
+ FeTestEnv.teardown
49
+ end
50
+ end
35
51
  end
File without changes
data/test/test_helper.rb CHANGED
@@ -5,7 +5,6 @@ require 'shoulda'
5
5
  require 'iron_fixture_extractor'
6
6
  # TEMP, COMMENT OUT IF NEEDED
7
7
  require 'sqlite3'
8
- #require 'ruby-debug'
9
8
  require 'fe_test_env'
10
9
  ActiveRecord::Migration.verbose = false
11
10
  FeTestEnv.reload
metadata CHANGED
@@ -1,82 +1,57 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: iron_fixture_extractor
3
- version: !ruby/object:Gem::Version
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.0
4
5
  prerelease:
5
- version: 1.0.0
6
6
  platform: ruby
7
- authors:
7
+ authors:
8
8
  - Joe Goggins
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
-
13
- date: 2012-11-30 00:00:00 Z
14
- dependencies:
15
- - !ruby/object:Gem::Dependency
12
+ date: 2013-08-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
16
15
  name: activerecord
17
- prerelease: false
18
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
19
17
  none: false
20
- requirements:
18
+ requirements:
21
19
  - - ~>
22
- - !ruby/object:Gem::Version
20
+ - !ruby/object:Gem::Version
23
21
  version: 3.2.1
24
22
  type: :runtime
25
- version_requirements: *id001
26
- - !ruby/object:Gem::Dependency
27
- name: activesupport
28
23
  prerelease: false
29
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
30
25
  none: false
31
- requirements:
26
+ requirements:
32
27
  - - ~>
33
- - !ruby/object:Gem::Version
28
+ - !ruby/object:Gem::Version
34
29
  version: 3.2.1
35
- type: :runtime
36
- version_requirements: *id002
37
- - !ruby/object:Gem::Dependency
38
- name: shoulda
39
- prerelease: false
40
- requirement: &id003 !ruby/object:Gem::Requirement
30
+ - !ruby/object:Gem::Dependency
31
+ name: activesupport
32
+ requirement: !ruby/object:Gem::Requirement
41
33
  none: false
42
- requirements:
34
+ requirements:
43
35
  - - ~>
44
- - !ruby/object:Gem::Version
45
- version: 3.0.1
46
- type: :development
47
- version_requirements: *id003
48
- - !ruby/object:Gem::Dependency
49
- name: sqlite3
50
- prerelease: false
51
- requirement: &id004 !ruby/object:Gem::Requirement
52
- none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- version: "0"
57
- type: :development
58
- version_requirements: *id004
59
- - !ruby/object:Gem::Dependency
60
- name: factory_girl
36
+ - !ruby/object:Gem::Version
37
+ version: 3.2.1
38
+ type: :runtime
61
39
  prerelease: false
62
- requirement: &id005 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
63
41
  none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- version: "0"
68
- type: :development
69
- version_requirements: *id005
70
- description: "When object factories don't work because your data is too complex and creating manual fixtures is cumbersome and brittle: Iron Fixture Extractor (for Rails/ActiveRecord) "
71
- email:
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 3.2.1
46
+ description: ! 'When object factories don''t work because your data is too complex
47
+ and creating manual fixtures is cumbersome and brittle: Iron Fixture Extractor (for
48
+ Rails/ActiveRecord) '
49
+ email:
72
50
  - goggins@umn.edu
73
51
  executables: []
74
-
75
52
  extensions: []
76
-
77
53
  extra_rdoc_files: []
78
-
79
- files:
54
+ files:
80
55
  - .gitignore
81
56
  - CHANGELOG.md
82
57
  - Gemfile
@@ -86,17 +61,51 @@ files:
86
61
  - iron_fixture_extractor.gemspec
87
62
  - lib/fe.rb
88
63
  - lib/fe/extractor.rb
89
- - lib/fe/factory_girl_dsl_methods.rb
90
64
  - lib/fe/railtie.rb
91
65
  - lib/fe/tasks/iron_fixture_extractor.rake
92
66
  - lib/fe/version.rb
93
67
  - lib/iron_fixture_extractor.rb
94
- - test/basic_usage_test.rb
68
+ - spec/README_FOR_DEVELOPERS.md
69
+ - spec/dummy_environments/sqlite/dummy1/config/database.yml
70
+ - spec/dummy_environments/sqlite/dummy1/data_migrations/001_create_some_data.rb
71
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043601_create_posts.rb
72
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043602_create_authors.rb
73
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043603_create_different_posts.rb
74
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043639_create_comments.rb
75
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043808_create_group_members.rb
76
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043818_create_groups.rb
77
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043819_create_users.rb
78
+ - spec/dummy_environments/sqlite/dummy1/models/author.rb
79
+ - spec/dummy_environments/sqlite/dummy1/models/comment.rb
80
+ - spec/dummy_environments/sqlite/dummy1/models/complex_thing.rb
81
+ - spec/dummy_environments/sqlite/dummy1/models/different_post.rb
82
+ - spec/dummy_environments/sqlite/dummy1/models/group.rb
83
+ - spec/dummy_environments/sqlite/dummy1/models/group_member.rb
84
+ - spec/dummy_environments/sqlite/dummy1/models/post.rb
85
+ - spec/dummy_environments/sqlite/dummy1/models/serialized_attribute_encoder.rb
86
+ - spec/dummy_environments/sqlite/dummy1/models/user.rb
87
+ - spec/dummy_environments/sqlite/dummy1/models/user/admin.rb
88
+ - spec/dummy_environments/sqlite/dummy1/models/user/jerk.rb
89
+ - spec/execute_extract_code_spec.rb
90
+ - spec/extract_spec.rb
91
+ - spec/extract_works_with_multiple_extract_queries_in_one_command_spec.rb
92
+ - spec/fe_test_env_spec.rb
93
+ - spec/get_hash_spec.rb
94
+ - spec/load_db_map_option_spec.rb
95
+ - spec/load_db_spec.rb
96
+ - spec/load_db_works_with_serialized_attributes_spec.rb
97
+ - spec/rebuild_spec.rb
98
+ - spec/spec_helper.rb
99
+ - spec/support/fe_test_env.rb
100
+ - spec/support/first_post_w_comments_and_authors.rb
101
+ - spec/truncate_tables_for_spec.rb
102
+ - spec/works_with_single_table_inheritance_spec.rb
103
+ - test/basic_usage_test.ported.rb
95
104
  - test/config/database.yml
96
- - test/different_target_table_test.rb
97
- - test/factory_girl_test.rb
98
- - test/fe_test_env.rb
99
- - test/get_hash_test.rb
105
+ - test/different_target_table_test.not_porting.rb
106
+ - test/factory_girl_test.not_porting_now.rb
107
+ - test/fe_test_env.ported.rb
108
+ - test/get_hash_test.ported.rb
100
109
  - test/migrations/20120604043601_create_posts.rb
101
110
  - test/migrations/20120604043602_create_authors.rb
102
111
  - test/migrations/20120604043603_create_different_posts.rb
@@ -115,45 +124,83 @@ files:
115
124
  - test/models/user.rb
116
125
  - test/models/user/admin.rb
117
126
  - test/models/user/jerk.rb
118
- - test/multi_tree_usage_test.rb
119
- - test/serialized_attribute_test.rb
120
- - test/sti_test.rb
127
+ - test/multi_tree_usage_test.ported.rb
128
+ - test/serialized_attribute_test.ported.rb
129
+ - test/sti_test.ported.rb
121
130
  - test/test_data_migrations/001_create_some_data.rb
122
131
  - test/test_helper.rb
123
132
  homepage: https://github.com/joegoggins/iron_fixture_extractor
124
133
  licenses: []
125
-
126
134
  post_install_message:
127
135
  rdoc_options: []
128
-
129
- require_paths:
136
+ require_paths:
130
137
  - lib
131
- required_ruby_version: !ruby/object:Gem::Requirement
138
+ required_ruby_version: !ruby/object:Gem::Requirement
132
139
  none: false
133
- requirements:
134
- - - ">="
135
- - !ruby/object:Gem::Version
136
- version: "0"
137
- required_rubygems_version: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ! '>='
142
+ - !ruby/object:Gem::Version
143
+ version: '0'
144
+ segments:
145
+ - 0
146
+ hash: 553662890390521503
147
+ required_rubygems_version: !ruby/object:Gem::Requirement
138
148
  none: false
139
- requirements:
140
- - - ">="
141
- - !ruby/object:Gem::Version
142
- version: "0"
149
+ requirements:
150
+ - - ! '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ segments:
154
+ - 0
155
+ hash: 553662890390521503
143
156
  requirements: []
144
-
145
157
  rubyforge_project:
146
- rubygems_version: 1.8.15
158
+ rubygems_version: 1.8.23
147
159
  signing_key:
148
160
  specification_version: 3
149
161
  summary: Simplified dynamic fixture extraction for ActiveRecord
150
- test_files:
151
- - test/basic_usage_test.rb
162
+ test_files:
163
+ - spec/README_FOR_DEVELOPERS.md
164
+ - spec/dummy_environments/sqlite/dummy1/config/database.yml
165
+ - spec/dummy_environments/sqlite/dummy1/data_migrations/001_create_some_data.rb
166
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043601_create_posts.rb
167
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043602_create_authors.rb
168
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043603_create_different_posts.rb
169
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043639_create_comments.rb
170
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043808_create_group_members.rb
171
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043818_create_groups.rb
172
+ - spec/dummy_environments/sqlite/dummy1/migrations/20120604043819_create_users.rb
173
+ - spec/dummy_environments/sqlite/dummy1/models/author.rb
174
+ - spec/dummy_environments/sqlite/dummy1/models/comment.rb
175
+ - spec/dummy_environments/sqlite/dummy1/models/complex_thing.rb
176
+ - spec/dummy_environments/sqlite/dummy1/models/different_post.rb
177
+ - spec/dummy_environments/sqlite/dummy1/models/group.rb
178
+ - spec/dummy_environments/sqlite/dummy1/models/group_member.rb
179
+ - spec/dummy_environments/sqlite/dummy1/models/post.rb
180
+ - spec/dummy_environments/sqlite/dummy1/models/serialized_attribute_encoder.rb
181
+ - spec/dummy_environments/sqlite/dummy1/models/user.rb
182
+ - spec/dummy_environments/sqlite/dummy1/models/user/admin.rb
183
+ - spec/dummy_environments/sqlite/dummy1/models/user/jerk.rb
184
+ - spec/execute_extract_code_spec.rb
185
+ - spec/extract_spec.rb
186
+ - spec/extract_works_with_multiple_extract_queries_in_one_command_spec.rb
187
+ - spec/fe_test_env_spec.rb
188
+ - spec/get_hash_spec.rb
189
+ - spec/load_db_map_option_spec.rb
190
+ - spec/load_db_spec.rb
191
+ - spec/load_db_works_with_serialized_attributes_spec.rb
192
+ - spec/rebuild_spec.rb
193
+ - spec/spec_helper.rb
194
+ - spec/support/fe_test_env.rb
195
+ - spec/support/first_post_w_comments_and_authors.rb
196
+ - spec/truncate_tables_for_spec.rb
197
+ - spec/works_with_single_table_inheritance_spec.rb
198
+ - test/basic_usage_test.ported.rb
152
199
  - test/config/database.yml
153
- - test/different_target_table_test.rb
154
- - test/factory_girl_test.rb
155
- - test/fe_test_env.rb
156
- - test/get_hash_test.rb
200
+ - test/different_target_table_test.not_porting.rb
201
+ - test/factory_girl_test.not_porting_now.rb
202
+ - test/fe_test_env.ported.rb
203
+ - test/get_hash_test.ported.rb
157
204
  - test/migrations/20120604043601_create_posts.rb
158
205
  - test/migrations/20120604043602_create_authors.rb
159
206
  - test/migrations/20120604043603_create_different_posts.rb
@@ -172,8 +219,8 @@ test_files:
172
219
  - test/models/user.rb
173
220
  - test/models/user/admin.rb
174
221
  - test/models/user/jerk.rb
175
- - test/multi_tree_usage_test.rb
176
- - test/serialized_attribute_test.rb
177
- - test/sti_test.rb
222
+ - test/multi_tree_usage_test.ported.rb
223
+ - test/serialized_attribute_test.ported.rb
224
+ - test/sti_test.ported.rb
178
225
  - test/test_data_migrations/001_create_some_data.rb
179
226
  - test/test_helper.rb
@@ -1,28 +0,0 @@
1
- module Fe
2
- module FactoryGirlDslMethods
3
- def fe_factory(name, options = {})
4
- unless extract_name = options.delete(:extract_name)
5
- raise "Must specify extract_name (the fixture set name)"
6
- end
7
- unless fixture_name = options.delete(:fixture_name)
8
- raise "Must specify fixture_name" # TODO:Later, make this default to :first once impelmented in Fe
9
- end
10
- unless options.has_key?(:class)
11
- raise "Must specify the class when using with iron fixture extractor"
12
- end
13
-
14
- # CONTINUE HERE. We need to figure out how to build a
15
- # block for Factory girl from the hash that lives in the yaml.
16
- #
17
- fe_hash = Fe.get_hash(extract_name, options[:class],fixture_name)
18
-
19
- the_block = Proc.new {
20
- }
21
-
22
- factory(name,options,&the_block)
23
-
24
- factory_inst = ::FactoryGirl.factory_by_name(name)
25
- # require 'debugger'; debugger; puts 'DSLExt'
26
- end
27
- end
28
- end