cells 3.5.6 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ h2. 3.6.0
2
+
3
+ h3. Changes
4
+ * Cells runs with Rails 3.0 and 3.1.
5
+
6
+
1
7
  h2. 3.5.6
2
8
 
3
9
  h3. Changes
@@ -16,7 +16,7 @@ And the best: You can have as many cells in your page as you need!
16
16
 
17
17
  It's a gem!
18
18
 
19
- Rails 3:
19
+ Rails 3.x:
20
20
 
21
21
  gem install cells
22
22
 
@@ -19,8 +19,8 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency "actionpack", "~> 3.0.0"
23
- s.add_dependency "railties", "~> 3.0.0"
22
+ s.add_dependency "actionpack", "~> 3.0"
23
+ s.add_dependency "railties", "~> 3.0"
24
24
 
25
25
  s.add_development_dependency "shoulda"
26
26
  s.add_development_dependency "haml"
@@ -70,23 +70,6 @@ module Cell
70
70
  @builders ||= []
71
71
  end
72
72
 
73
- # Return the default view path for +state+. Override this if you cell has a differing naming style.
74
- def view_for_state(state)
75
- "#{cell_name}/#{state}"
76
- end
77
-
78
- # Returns all possible view paths for +state+ by invoking #view_for_state on all classes up
79
- # the inheritance chain.
80
- def find_class_view_for_state(state)
81
- return [view_for_state(state)] unless superclass.respond_to?(:find_class_view_for_state)
82
-
83
- superclass.find_class_view_for_state(state) << view_for_state(state)
84
- end
85
-
86
- def cell_name # TODO: remove in 3.6.
87
- controller_path
88
- end
89
-
90
73
  # The cell class constant for +cell_name+.
91
74
  def class_from_cell_name(cell_name)
92
75
  "#{cell_name}_cell".classify.constantize
@@ -94,11 +77,6 @@ module Cell
94
77
  end
95
78
 
96
79
  module InstanceMethods
97
- # Computes all possible paths for +state+ by traversing up the inheritance chain.
98
- def possible_paths_for_state(state)
99
- self.class.find_class_view_for_state(state).reverse!
100
- end
101
-
102
80
  def state_accepts_args?(state)
103
81
  method(state).arity != 0
104
82
  end
@@ -60,7 +60,7 @@ module Cell
60
60
 
61
61
  # Computes the complete, namespaced cache key for +state+.
62
62
  def state_cache_key(state, key_parts={})
63
- expand_cache_key([cell_name, state, key_parts])
63
+ expand_cache_key([controller_path, state, key_parts])
64
64
  end
65
65
 
66
66
  def expire_cache_key(key, *args)
@@ -7,8 +7,13 @@ module Cell
7
7
  include AbstractController
8
8
  include Rendering, Layouts, Helpers, Callbacks, Translation, Logger
9
9
  include ActionController::RequestForgeryProtection
10
-
11
-
10
+
11
+ if Cells.rails3_0?
12
+ require 'cell/rails3_0_strategy'
13
+ elsif Cells.rails3_1?
14
+ require 'cell/rails3_1_strategy'
15
+ end
16
+
12
17
  class View < ActionView::Base
13
18
  def render(*args, &block)
14
19
  options = args.first.is_a?(::Hash) ? args.first : {} # this is copied from #render by intention.
@@ -17,15 +22,8 @@ module Cell
17
22
  super
18
23
  end
19
24
  end
20
-
21
-
22
- class MissingTemplate < ActionView::ActionViewError
23
- def initialize(message, possible_paths)
24
- super(message + " and possible paths #{possible_paths}")
25
- end
26
- end
27
-
28
-
25
+
26
+
29
27
  module Rendering
30
28
  # Invoke the state method for +state+ which usually renders something nice.
31
29
  def render_state(state, *args)
@@ -35,13 +33,15 @@ module Cell
35
33
 
36
34
 
37
35
  module Metal
38
- delegate :session, :params, :request, :config, :to => :parent_controller
36
+ delegate :session, :params, :request, :config, :env, :to => :parent_controller
39
37
  end
40
38
 
41
39
 
42
40
  include Metal
43
41
  include Rendering
44
42
  include Caching
43
+ include VersionStrategy
44
+
45
45
 
46
46
  attr_reader :parent_controller
47
47
  attr_accessor :options
@@ -60,18 +60,6 @@ module Cell
60
60
  @opts = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(self, :options)
61
61
  end
62
62
 
63
- def self.view_context_class
64
- controller = self
65
-
66
- View.class_eval do
67
- include controller._helpers
68
- include controller._routes.url_helpers
69
- end
70
-
71
-
72
- @view_context_class ||= View
73
- end
74
-
75
63
  def self.controller_path
76
64
  @controller_path ||= name.sub(/Cell$/, '').underscore unless anonymous?
77
65
  end
@@ -142,22 +130,6 @@ module Cell
142
130
  end
143
131
 
144
132
  private
145
- # Climbs up the inheritance chain, looking for a view for the current +state+.
146
- def find_family_view_for_state(state)
147
- exception = nil
148
- possible_paths = possible_paths_for_state(state)
149
-
150
- possible_paths.each do |template_path|
151
- begin
152
- template = find_template(template_path)
153
- return template if template
154
- rescue ::ActionView::MissingTemplate => exception
155
- end
156
- end
157
-
158
- raise MissingTemplate.new(exception.message, possible_paths)
159
- end
160
-
161
133
  # Renders the view belonging to the given state. Will raise ActionView::MissingTemplate
162
134
  # if it can't find a view.
163
135
  def render_view_for(state, *args)
@@ -168,15 +140,10 @@ module Cell
168
140
  if opts[:state]
169
141
  opts[:text] = render_state(opts.delete(:state), *args)
170
142
  elsif (opts.keys & [:text, :inline, :file]).blank?
171
- opts = defaultize_render_options_for(opts, state)
172
- opts[:template] = find_family_view_for_state(opts.delete(:view))
143
+ process_opts_for(opts, state)
173
144
  end
174
145
 
175
146
  render_to_string(opts).html_safe # ActionView::Template::Text doesn't do that for us.
176
147
  end
177
-
178
- def defaultize_render_options_for(opts, state)
179
- opts.reverse_merge!(:view => state)
180
- end
181
148
  end
182
149
  end
@@ -0,0 +1,69 @@
1
+ module Cell
2
+ # Methods to be included in Cell::Rails in 3.0 context, where there's no view inheritance.
3
+ module VersionStrategy
4
+ extend ActiveSupport::Concern
5
+
6
+ class MissingTemplate < ActionView::ActionViewError
7
+ def initialize(message, possible_paths)
8
+ super(message + " and possible paths #{possible_paths}")
9
+ end
10
+ end
11
+
12
+
13
+ module ClassMethods
14
+ def view_context_class
15
+ controller = self
16
+
17
+ Cell::Rails::View.class_eval do
18
+ include controller._helpers
19
+ include controller._routes.url_helpers
20
+ end
21
+
22
+ @view_context_class ||= Cell::Rails::View
23
+ end
24
+
25
+ # Return the default view path for +state+. Override this if you cell has a differing naming style.
26
+ def view_for_state(state)
27
+ "#{cell_name}/#{state}"
28
+ end
29
+
30
+ # Returns all possible view paths for +state+ by invoking #view_for_state on all classes up
31
+ # the inheritance chain.
32
+ def find_class_view_for_state(state)
33
+ return [view_for_state(state)] unless superclass.respond_to?(:find_class_view_for_state)
34
+
35
+ superclass.find_class_view_for_state(state) << view_for_state(state)
36
+ end
37
+
38
+ def cell_name
39
+ controller_path
40
+ end
41
+ end
42
+
43
+ private
44
+ # Computes all possible paths for +state+ by traversing up the inheritance chain.
45
+ def possible_paths_for_state(state)
46
+ self.class.find_class_view_for_state(state).reverse!
47
+ end
48
+
49
+ # Climbs up the inheritance chain, looking for a view for the current +state+.
50
+ def find_family_view_for_state(state)
51
+ exception = nil
52
+ possible_paths = possible_paths_for_state(state)
53
+
54
+ possible_paths.each do |template_path|
55
+ begin
56
+ template = find_template(template_path)
57
+ return template if template
58
+ rescue ::ActionView::MissingTemplate => exception
59
+ end
60
+ end
61
+
62
+ raise MissingTemplate.new(exception.message, possible_paths)
63
+ end
64
+
65
+ def process_opts_for(opts, state)
66
+ opts[:template] = find_family_view_for_state(opts.delete(:view) || state)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,24 @@
1
+ module Cell
2
+ # Methods to be included in Cell::Rails in 3.1 context.
3
+ module VersionStrategy
4
+ extend ActiveSupport::Concern
5
+
6
+ include AbstractController::UrlFor # must be included before _routes is set in Railstie.
7
+
8
+
9
+ module ClassMethods
10
+ def view_context_class
11
+ @view_context_class ||= begin
12
+ routes = _routes #if respond_to?(:_routes)
13
+ helpers = _helpers #if respond_to?(:_helpers)
14
+ Cell::Rails::View.prepare(routes, helpers)
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+ def process_opts_for(opts, state)
21
+ opts[:action] = opts[:view] || state
22
+ end
23
+ end
24
+ end
@@ -58,13 +58,6 @@
58
58
  # Beside your new class you'd provide a star-sprangled button view in +xmas_cart/order_button.haml+.
59
59
  # When rendering the +cart+ state, the states as well as the "missing" views are inherited from ancesting cells,
60
60
  # this is pretty DRY and object-oriented, isn't it?
61
-
62
- require 'cell/rails'
63
- require 'cells/railtie'
64
- require 'cells/rails'
65
- require 'cell/test_case' if Rails.env == "test"
66
- require 'cells/rails_compat' # fixes a bug in Rails <3.0.4. # TODO: remove me as soon as we support 3.1, only.
67
-
68
61
  module Cells
69
62
  # Setup your special needs for Cells here. Use this to add new view paths.
70
63
  #
@@ -77,6 +70,21 @@ module Cells
77
70
  def self.setup
78
71
  yield(Cell::Base)
79
72
  end
73
+
74
+ def self.rails3_0?
75
+ ::Rails::VERSION::MINOR == 0
76
+ end
77
+
78
+ def self.rails3_1?
79
+ ::Rails::VERSION::MINOR == 1
80
+ end
80
81
  end
81
82
 
83
+ require 'cell/rails'
84
+ require 'cells/railtie'
85
+ require 'cells/rails'
86
+ require 'cell/test_case' if Rails.env == "test"
87
+
88
+ require 'cells/rails_compat' # fixes a bug in Rails <3.0.4. # TODO: remove me as soon as we support 3.1, only.
89
+
82
90
  Cell::Base = Cell::Rails
@@ -1,3 +1,3 @@
1
1
  module Cells
2
- VERSION = '3.5.6'
2
+ VERSION = '3.6.0'
3
3
  end
@@ -0,0 +1 @@
1
+ alert("Doo");
@@ -134,24 +134,25 @@ class CellModuleTest < ActiveSupport::TestCase
134
134
  end
135
135
  end
136
136
 
137
- should "provide possible_paths_for_state" do
138
- assert_equal ["bad_guitarist/play", "bassist/play", "cell/rails/play"], cell(:bad_guitarist).possible_paths_for_state(:play)
139
- end
140
-
141
- should "provide Cell.cell_name" do
142
- assert_equal 'bassist', cell(:bassist).class.cell_name
137
+ should "provide class_from_cell_name" do
138
+ assert_equal BassistCell, ::Cell::Base.class_from_cell_name('bassist')
143
139
  end
144
140
 
145
- should "provide cell_name for modules, too" do
146
- class SingerCell < Cell::Base
141
+ if Cells.rails3_0?
142
+ should "provide possible_paths_for_state" do
143
+ assert_equal ["bad_guitarist/play", "bassist/play", "cell/rails/play"], cell(:bad_guitarist).send(:possible_paths_for_state, :play)
147
144
  end
148
145
 
149
- assert_equal "cell_module_test/singer", CellModuleTest::SingerCell.cell_name
150
- end
151
-
152
-
153
- should "provide class_from_cell_name" do
154
- assert_equal BassistCell, ::Cell::Base.class_from_cell_name('bassist')
146
+ should "provide Cell.cell_name" do
147
+ assert_equal 'bassist', cell(:bassist).class.cell_name
148
+ end
149
+
150
+ should "provide cell_name for modules, too" do
151
+ class SingerCell < Cell::Base
152
+ end
153
+
154
+ assert_equal "cell_module_test/singer", CellModuleTest::SingerCell.cell_name
155
+ end
155
156
  end
156
157
 
157
158
  context "#state_accepts_args?" do
@@ -2,20 +2,32 @@ require 'test_helper'
2
2
 
3
3
  class CellsModuleTest < ActiveSupport::TestCase
4
4
  context "Cells" do
5
- setup do
6
- @old_view_paths = Cell::Base.view_paths.clone
7
- end
8
-
9
- should "provide .setup" do
10
- Cells.setup do |c|
11
- c.append_view_path "/road/to/nowhere"
5
+ context "view_paths" do
6
+ setup do
7
+ @old_view_paths = Cell::Base.view_paths.clone
8
+ end
9
+
10
+ teardown do
11
+ Cell::Base.view_paths = @old_view_paths
12
12
  end
13
13
 
14
- assert_equal "/road/to/nowhere", Cell::Base.view_paths.last.to_s
14
+ should "provide .setup" do
15
+ Cells.setup do |c|
16
+ c.append_view_path "/road/to/nowhere"
17
+ end
18
+
19
+ assert_equal "/road/to/nowhere", Cell::Base.view_paths.last.to_s
20
+ end
15
21
  end
16
22
 
17
- teardown do
18
- Cell::Base.view_paths = @old_view_paths
23
+ should "respond to #rails3_1?" do
24
+ if Rails::VERSION::MINOR == 0
25
+ assert ! Cells.rails3_1?
26
+ assert Cells.rails3_0?
27
+ elsif
28
+ assert Cells.rails3_1?
29
+ assert ! Cells.rails3_0?
30
+ end
19
31
  end
20
32
  end
21
33
  end
@@ -1,4 +1,4 @@
1
- Dummy::Application.routes.draw do |map|
1
+ Dummy::Application.routes.draw do
2
2
  match ':controller(/:action(/:id(.:format)))'
3
3
  root :to => 'musician#index'
4
4
  end
@@ -91,43 +91,25 @@ class RailsCellsTest < ActiveSupport::TestCase
91
91
  assert_equal({:song => "Lockdown"}, cell(:bassist, :song => "Lockdown").options)
92
92
  end
93
93
 
94
- context "invoking defaultize_render_options_for" do
95
- should "set default values" do
96
- options = cell(:bassist).send(:defaultize_render_options_for, {}, :play)
94
+ if Cells.rails3_0?
95
+ puts "rails-3.0"
96
+ context "invoking find_family_view_for_state" do
97
+ should "raise an error when a template is missing" do
98
+ assert_raises ActionView::MissingTemplate do
99
+ cell(:bassist).find_template("bassist/playyy")
100
+ end
101
+
102
+ #puts "format: #{cell(:bassist).find_template("bassist/play.js").formats.inspect}"
103
+ end
97
104
 
98
- assert_equal :play, options[:view]
99
- end
100
-
101
- should "allow overriding defaults" do
102
- assert cell(:bassist).send(:defaultize_render_options_for, {:view => :slap}, :play)[:view] == :slap
103
- end
104
- end
105
-
106
- context "invoking find_family_view_for_state" do
107
- should "raise an error when a template is missing" do
108
- assert_raises ActionView::MissingTemplate do
109
- cell(:bassist).find_template("bassist/playyy")
105
+ should "return play.html.erb" do
106
+ assert_equal "bassist/play", cell(:bassist).send(:find_family_view_for_state, :play).virtual_path
110
107
  end
111
108
 
112
- puts "format: #{cell(:bassist).find_template("bassist/play.js").formats.inspect}"
113
- end
114
-
115
- should "return play.html.erb" do
116
- assert_equal "bassist/play", cell(:bassist).send(:find_family_view_for_state, :play).virtual_path
117
- end
118
-
119
- should "find inherited play.html.erb" do
120
- assert_equal "bassist/play", cell(:bad_guitarist).send(:find_family_view_for_state, :play).virtual_path
121
- end
122
-
123
- should_eventually "find the EN-version if i18n instructs" do
124
- swap I18n, :locale => :en do
125
- assert_equal "bassist/yell.en.html.erb", cell(:bassist).find_family_view_for_state(:yell).virtual_path
109
+ should "find inherited play.html.erb" do
110
+ assert_equal "bassist/play", cell(:bad_guitarist).send(:find_family_view_for_state, :play).virtual_path
126
111
  end
127
112
  end
128
-
129
-
130
- should_eventually "return an already cached family view"
131
113
  end
132
114
 
133
115
  context "delegation" do
@@ -156,16 +138,5 @@ class RailsCellsTest < ActiveSupport::TestCase
156
138
  assert_equal({"song" => "Creatures"}, cell(:bassist, "song" => "Lockdown").params)
157
139
  end
158
140
  end
159
-
160
-
161
- # DISCUSS: do we really need that test anymore?
162
- should "precede cell ivars over controller ivars" do
163
- @controller.instance_variable_set(:@note, "E")
164
- BassistCell.class_eval do
165
- def slap; @note = "A"; render; end
166
- end
167
- assert_equal "Boing in A", render_cell(:bassist, :slap)
168
- end
169
-
170
141
  end
171
142
  end
@@ -12,6 +12,13 @@ class RailsRenderTest < ActiveSupport::TestCase
12
12
  assert_equal "Doo", render_cell(:bassist, :play)
13
13
  end
14
14
 
15
+ should "accept :format" do
16
+ BassistCell.class_eval do
17
+ def play; render :format => :js; end
18
+ end
19
+ assert_equal "alert(\"Doo\");", render_cell(:bassist, :play)
20
+ end
21
+
15
22
  should "also render alternative engines, like haml" do
16
23
  BassistCell.class_eval do
17
24
  def sing; render; end
@@ -106,11 +113,19 @@ class RailsRenderTest < ActiveSupport::TestCase
106
113
  def groove; render; end
107
114
  end
108
115
 
109
- e = assert_raise Cell::Rails::MissingTemplate do
110
- render_cell(:bad_guitarist, :groove)
116
+ if Cells.rails3_0?
117
+ e = assert_raise Cell::Rails::MissingTemplate do
118
+ render_cell(:bad_guitarist, :groove)
119
+ end
120
+
121
+ assert_includes e.message, "Missing template cell/rails/groove with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json], :locale=>[:en, :en]} in view paths"
122
+ else # 3.1
123
+ e = assert_raise ActionView::MissingTemplate do
124
+ render_cell(:bad_guitarist, :groove)
125
+ end
126
+
127
+ assert_includes e.message, "Missing template bad_guitarist/groove, bassist/groove with {:handlers=>[:erb, :builder, :haml], :formats=>[:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json], :locale=>[:en, :en]}. Searched in:\n "
111
128
  end
112
-
113
- assert_includes e.message, "Missing template cell/rails/groove with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml, :haml], :formats=>[:html, :text, :js, :css, :ics, :csv, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json], :locale=>[:en, :en]} in view paths"
114
129
  end
115
130
 
116
131
  should "render instance variables from the cell" do
@@ -1,8 +1,14 @@
1
+ require 'test_helper'
2
+
1
3
  module ApplicationTests
2
4
  class RouterTest < ActionController::TestCase
3
5
  tests MusicianController
4
6
 
5
7
  context "A Rails app" do
8
+ should "pass url_helpers to the cell instance" do
9
+ assert_equal "/", BassistCell.new(@controller).root_path
10
+ end
11
+
6
12
  should "allow cells to use url_helpers" do
7
13
  BassistCell.class_eval do
8
14
  def promote; render; end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 3
7
- - 5
8
7
  - 6
9
- version: 3.5.6
8
+ - 0
9
+ version: 3.6.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Nick Sutterer
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-03-24 00:00:00 +01:00
17
+ date: 2011-06-14 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -28,8 +28,7 @@ dependencies:
28
28
  segments:
29
29
  - 3
30
30
  - 0
31
- - 0
32
- version: 3.0.0
31
+ version: "3.0"
33
32
  type: :runtime
34
33
  version_requirements: *id001
35
34
  - !ruby/object:Gem::Dependency
@@ -43,8 +42,7 @@ dependencies:
43
42
  segments:
44
43
  - 3
45
44
  - 0
46
- - 0
47
- version: 3.0.0
45
+ version: "3.0"
48
46
  type: :runtime
49
47
  version_requirements: *id002
50
48
  - !ruby/object:Gem::Dependency
@@ -106,6 +104,8 @@ files:
106
104
  - lib/cell.rb
107
105
  - lib/cell/caching.rb
108
106
  - lib/cell/rails.rb
107
+ - lib/cell/rails3_0_strategy.rb
108
+ - lib/cell/rails3_1_strategy.rb
109
109
  - lib/cell/test_case.rb
110
110
  - lib/cells.rb
111
111
  - lib/cells/cells.rake
@@ -127,7 +127,6 @@ files:
127
127
  - lib/generators/templates/view.haml
128
128
  - lib/generators/templates/view.slim
129
129
  - lib/generators/test_unit/cell_generator.rb
130
- - test/active_helper_test.rb
131
130
  - test/app/cells/bad_guitarist/_dii.html.erb
132
131
  - test/app/cells/bad_guitarist_cell.rb
133
132
  - test/app/cells/bassist/_dii.html.erb
@@ -1,57 +0,0 @@
1
- require 'test_helper'
2
-
3
- ### DISCUSS: how can we limit that test to systems where ActiveHelper's around?
4
-
5
- class ActiveHelperTest < ActiveSupport::TestCase
6
- context "The Cell::Base class" do
7
- setup do
8
- class FingeringHelper < ActiveHelper::Base
9
- provides :finger
10
- end
11
-
12
- class SlappingHelper < ActiveHelper::Base
13
- provides :slap
14
- end
15
- end
16
-
17
- should_eventually "respond to active_helper" do
18
- assert_respond_to Cell::Base, :active_helper
19
- end
20
-
21
- should_eventually "store helper constants from active_helper" do
22
- @cell = Class.new(BassistCell)
23
- @cell.active_helper SlappingHelper
24
- assert_equal [SlappingHelper], @cell.active_helpers
25
- end
26
-
27
- should_eventually "inherit helper constants from active_helper" do
28
- @base_cell = Class.new(BassistCell)
29
- @base_cell.active_helper SlappingHelper
30
- @cell = Class.new(@base_cell)
31
- @cell.active_helper FingeringHelper
32
- assert_equal [SlappingHelper, FingeringHelper], @cell.active_helpers
33
- end
34
-
35
-
36
- context "An Cell::View::Base instance" do
37
- should_eventually "respond to use" do
38
- # we didn't extend the view at this point.
39
- @view = bassist_mock.setup_action_view
40
- assert_respond_to @view, :use
41
- end
42
-
43
- end
44
-
45
- context "The view rendered by the cell" do
46
- should_eventually "respond to used helper methods" do
47
- @cell = bassist_mock
48
- @cell.class.active_helper SlappingHelper
49
-
50
- @view = @cell.setup_action_view
51
- @cell.prepare_action_view_for(@view, {})
52
-
53
- assert_respond_to @view, :slap # from the SlappingHelper
54
- end
55
- end
56
- end
57
- end