waves 0.8.2 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (166) hide show
  1. data/bin/waves +4 -3
  2. data/doc/VERSION +1 -1
  3. data/lib/waves.rb +52 -40
  4. data/lib/{caches → waves/caches}/file.rb +3 -1
  5. data/lib/waves/caches/memcached.rb +56 -0
  6. data/lib/{caches → waves/caches}/simple.rb +6 -7
  7. data/lib/{caches → waves/caches}/synchronized.rb +15 -1
  8. data/lib/{commands → waves/commands}/console.rb +4 -4
  9. data/lib/{commands → waves/commands}/generate.rb +6 -5
  10. data/lib/{commands → waves/commands}/help.rb +0 -0
  11. data/lib/{commands → waves/commands}/server.rb +1 -1
  12. data/lib/{dispatchers → waves/dispatchers}/base.rb +17 -31
  13. data/lib/waves/dispatchers/default.rb +19 -0
  14. data/lib/{ext → waves/ext}/float.rb +0 -0
  15. data/lib/{ext → waves/ext}/hash.rb +0 -0
  16. data/lib/{ext → waves/ext}/integer.rb +16 -1
  17. data/lib/{ext → waves/ext}/kernel.rb +3 -7
  18. data/lib/{ext → waves/ext}/module.rb +3 -3
  19. data/lib/{ext → waves/ext}/object.rb +2 -0
  20. data/lib/waves/ext/string.rb +73 -0
  21. data/lib/{ext → waves/ext}/symbol.rb +0 -1
  22. data/lib/{ext → waves/ext}/tempfile.rb +0 -0
  23. data/lib/waves/ext/time.rb +5 -0
  24. data/lib/{foundations → waves/foundations}/classic.rb +9 -21
  25. data/lib/{foundations → waves/foundations}/compact.rb +15 -20
  26. data/lib/waves/foundations/rest.rb +311 -0
  27. data/lib/waves/helpers/basic.rb +13 -0
  28. data/lib/{helpers → waves/helpers}/doc_type.rb +3 -0
  29. data/lib/waves/helpers/form.rb +94 -0
  30. data/lib/waves/helpers/formatting.rb +14 -0
  31. data/lib/waves/layers/mvc.rb +65 -0
  32. data/lib/{layers → waves/layers}/mvc/controllers.rb +0 -0
  33. data/lib/{layers → waves/layers}/mvc/extensions.rb +23 -11
  34. data/lib/{layers → waves/layers}/orm/migration.rb +0 -0
  35. data/lib/{layers → waves/layers}/orm/providers/active_record.rb +2 -5
  36. data/lib/{layers → waves/layers}/orm/providers/active_record/migrations/empty.rb.erb +0 -0
  37. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/generate.rb +1 -1
  38. data/lib/{layers → waves/layers}/orm/providers/active_record/tasks/schema.rb +1 -1
  39. data/lib/{layers → waves/layers}/orm/providers/data_mapper.rb +0 -0
  40. data/lib/{layers → waves/layers}/orm/providers/filebase.rb +0 -0
  41. data/lib/{layers → waves/layers}/orm/providers/sequel.rb +28 -29
  42. data/lib/{layers → waves/layers}/orm/providers/sequel/migrations/empty.rb.erb +0 -0
  43. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/generate.rb +1 -1
  44. data/lib/{layers → waves/layers}/orm/providers/sequel/tasks/schema.rb +2 -0
  45. data/lib/waves/layers/rack/rack_cache.rb +32 -0
  46. data/lib/waves/layers/renderers/erubis.rb +52 -0
  47. data/lib/waves/layers/renderers/haml.rb +67 -0
  48. data/lib/waves/layers/renderers/markaby.rb +41 -0
  49. data/lib/waves/layers/text/inflect/english.rb +42 -0
  50. data/lib/waves/matchers/accept.rb +47 -0
  51. data/lib/waves/matchers/ext.rb +27 -0
  52. data/lib/waves/matchers/path.rb +72 -0
  53. data/lib/waves/matchers/query.rb +43 -0
  54. data/lib/waves/matchers/request.rb +86 -0
  55. data/lib/waves/matchers/requested.rb +31 -0
  56. data/lib/{matchers → waves/matchers}/resource.rb +8 -1
  57. data/lib/waves/matchers/traits.rb +30 -0
  58. data/lib/waves/matchers/uri.rb +69 -0
  59. data/lib/waves/media/mime_types.rb +542 -0
  60. data/lib/waves/renderers/mixin.rb +9 -0
  61. data/lib/waves/request/accept.rb +92 -0
  62. data/lib/{runtime → waves/request}/request.rb +77 -61
  63. data/lib/waves/resources/file_mixin.rb +11 -0
  64. data/lib/{resources → waves/resources}/mixin.rb +42 -44
  65. data/lib/waves/resources/paths.rb +132 -0
  66. data/lib/waves/response/client_errors.rb +10 -0
  67. data/lib/waves/response/packaged.rb +19 -0
  68. data/lib/waves/response/redirects.rb +35 -0
  69. data/lib/{runtime → waves/response}/response.rb +29 -11
  70. data/lib/{runtime → waves/response}/response_mixin.rb +30 -17
  71. data/lib/waves/runtime/applications.rb +18 -0
  72. data/lib/{runtime → waves/runtime}/configuration.rb +31 -25
  73. data/lib/waves/runtime/console.rb +24 -0
  74. data/lib/{runtime → waves/runtime}/logger.rb +3 -3
  75. data/lib/{runtime → waves/runtime}/mocks.rb +2 -2
  76. data/lib/waves/runtime/rackup.rb +37 -0
  77. data/lib/waves/runtime/runtime.rb +48 -0
  78. data/lib/waves/runtime/server.rb +33 -0
  79. data/lib/{servers → waves/servers}/base.rb +0 -0
  80. data/lib/{servers → waves/servers}/mongrel.rb +0 -0
  81. data/lib/{servers → waves/servers}/webrick.rb +0 -0
  82. data/lib/{tasks → waves/tasks}/gem.rb +0 -0
  83. data/lib/{tasks → waves/tasks}/generate.rb +0 -0
  84. data/lib/waves/views/cassy.rb +173 -0
  85. data/lib/{views → waves/views}/errors.rb +8 -7
  86. data/lib/waves/views/mixin.rb +23 -0
  87. data/lib/waves/views/templated.rb +40 -0
  88. data/samples/basic/basic_startup.rb +70 -0
  89. data/samples/basic/config.ru +9 -0
  90. data/samples/blog/configurations/development.rb +17 -16
  91. data/samples/blog/configurations/production.rb +0 -11
  92. data/samples/blog/resources/entry.rb +3 -3
  93. data/samples/blog/resources/map.rb +10 -3
  94. data/samples/blog/startup.rb +4 -3
  95. data/templates/classic/Rakefile +28 -29
  96. data/templates/classic/configurations/default.rb.erb +8 -3
  97. data/templates/classic/configurations/development.rb.erb +1 -20
  98. data/templates/classic/configurations/production.rb.erb +2 -16
  99. data/templates/classic/public/images/favicon.ico +0 -0
  100. data/templates/classic/resources/server.rb.erb +9 -0
  101. data/templates/classic/startup.rb.erb +3 -3
  102. data/templates/classic/views/css.rb.erb +14 -0
  103. data/templates/classic/views/default.rb.erb +17 -0
  104. data/templates/classic/views/errors.rb.erb +10 -0
  105. data/templates/classic/views/pages.rb.erb +14 -0
  106. data/templates/compact/startup.rb.erb +8 -3
  107. data/test/ext/object.rb +55 -0
  108. data/test/ext/shortcuts.rb +73 -0
  109. data/test/helpers.rb +17 -0
  110. data/test/match/accept.rb +78 -0
  111. data/test/match/ext.rb +156 -0
  112. data/test/match/methods.rb +22 -0
  113. data/test/match/params.rb +33 -0
  114. data/test/match/path.rb +106 -0
  115. data/test/match/query.rb +60 -0
  116. data/test/match/request.rb +91 -0
  117. data/test/match/requested.rb +149 -0
  118. data/test/match/uri.rb +136 -0
  119. data/test/process/request.rb +75 -0
  120. data/test/process/resource.rb +53 -0
  121. data/test/resources/path.rb +166 -0
  122. data/test/runtime/configurations.rb +19 -0
  123. data/test/runtime/request.rb +63 -0
  124. data/test/runtime/response.rb +85 -0
  125. data/test/views/views.rb +40 -0
  126. metadata +243 -157
  127. data/lib/caches/memcached.rb +0 -40
  128. data/lib/dispatchers/default.rb +0 -25
  129. data/lib/ext/string.rb +0 -20
  130. data/lib/helpers/basic.rb +0 -11
  131. data/lib/helpers/extended.rb +0 -21
  132. data/lib/helpers/form.rb +0 -42
  133. data/lib/helpers/formatting.rb +0 -30
  134. data/lib/helpers/layouts.rb +0 -37
  135. data/lib/helpers/model.rb +0 -37
  136. data/lib/helpers/view.rb +0 -22
  137. data/lib/layers/inflect/english.rb +0 -67
  138. data/lib/layers/mvc.rb +0 -54
  139. data/lib/layers/renderers/erubis.rb +0 -60
  140. data/lib/layers/renderers/haml.rb +0 -47
  141. data/lib/layers/renderers/markaby.rb +0 -29
  142. data/lib/matchers/accept.rb +0 -21
  143. data/lib/matchers/base.rb +0 -30
  144. data/lib/matchers/content_type.rb +0 -17
  145. data/lib/matchers/path.rb +0 -67
  146. data/lib/matchers/query.rb +0 -21
  147. data/lib/matchers/request.rb +0 -27
  148. data/lib/matchers/traits.rb +0 -19
  149. data/lib/matchers/uri.rb +0 -20
  150. data/lib/renderers/mixin.rb +0 -36
  151. data/lib/resources/paths.rb +0 -34
  152. data/lib/runtime/console.rb +0 -23
  153. data/lib/runtime/mime_types.rb +0 -536
  154. data/lib/runtime/monitor.rb +0 -32
  155. data/lib/runtime/runtime.rb +0 -67
  156. data/lib/runtime/server.rb +0 -20
  157. data/lib/runtime/session.rb +0 -27
  158. data/lib/runtime/worker.rb +0 -86
  159. data/lib/views/mixin.rb +0 -62
  160. data/samples/blog/blog.db +0 -0
  161. data/samples/blog/log/waves.production +0 -3
  162. data/templates/classic/resources/map.rb.erb +0 -8
  163. data/templates/classic/templates/errors/not_found_404.mab +0 -7
  164. data/templates/classic/templates/errors/server_error_500.mab +0 -7
  165. data/templates/classic/templates/layouts/default.mab +0 -14
  166. data/templates/classic/tmp/sessions/.gitignore +0 -0
@@ -1,40 +0,0 @@
1
- require 'memcached'
2
- module Waves
3
- module Caches
4
- class Memcached < Simple
5
-
6
- def initialize( args )
7
- raise ArgumentError, ":servers is nil" if args[ :servers ].nil?
8
- @cache = ::Memcached.new( args[ :servers ], args[ :options ] || {} )
9
- end
10
-
11
- def store( key,value, ttl = 0, marshal = true )
12
- cache = @cache.clone; cache.add( key.to_s, value, ttl, marshal ); cache.destroy
13
- end
14
-
15
- def fetch( key )
16
- cache = @cache.clone; cache.get( key.to_s ); cache.destroy
17
- rescue ::Memcached::NotFound => e
18
- nil
19
- end
20
-
21
- def delete( key )
22
- cache = @cache.clone; cache.delete( key.to_s ); cache.destroy
23
- end
24
-
25
- def clear
26
- cache = @cache.clone; cache.flush; cache.destroy
27
- end
28
-
29
- end
30
-
31
- class SynchronizedMemcached < Synchronized
32
-
33
- def initialize( args )
34
- super( Memcached.new( args ) )
35
- end
36
-
37
- end
38
-
39
- end
40
- end
@@ -1,25 +0,0 @@
1
- module Waves
2
-
3
- module Dispatchers
4
-
5
- class Default < Base
6
-
7
- # Takes a Waves::Request and returns a Waves::Response
8
- def safe( request )
9
- # set a default content type -- this can be overridden by the resource
10
- request.response.content_type = request.accept.default
11
- resource = Waves.config.resource.new( request )
12
- if request.response.body.empty?
13
- request.response.body << resource.process.to_s
14
- else
15
- resource.process
16
- end
17
- # okay, we've handled the request, now write the response unless it was already done
18
- request.response.finish
19
- end
20
-
21
- end
22
-
23
- end
24
-
25
- end
data/lib/ext/string.rb DELETED
@@ -1,20 +0,0 @@
1
- # Utility methods mixed into String.
2
-
3
- class String
4
-
5
- # Syntactic sugar for using File.join to concatenate the argument to the receiver.
6
- #
7
- # require "lib" / "utilities" / "string"
8
- #
9
- # The idea is not original, but we can't remember where we first saw it.
10
- # Waves::Ext::Symbol defines the same method, allowing for :files / 'afilename.txt'
11
- #
12
-
13
- def / ( s ) ; File.join( self, s.to_s ); end
14
-
15
- alias_method :lower_camel_case, :subcamelcase
16
- alias_method :camel_case, :camelcase
17
- alias_method :snake_case, :snakecase
18
- alias_method :title_case, :titlecase
19
-
20
- end
data/lib/helpers/basic.rb DELETED
@@ -1,11 +0,0 @@
1
- module Waves
2
- module Helpers
3
- module Basic
4
- attr_reader :request
5
- include Waves::ResponseMixin
6
-
7
- def app ; Waves.main ; end
8
-
9
- end
10
- end
11
- end
@@ -1,21 +0,0 @@
1
- require 'helpers/basic'
2
- require 'helpers/doc_type'
3
- require 'helpers/layouts'
4
- require 'helpers/formatting'
5
- require 'helpers/model'
6
- require 'helpers/view'
7
- require 'helpers/form'
8
-
9
- module Waves
10
- module Helpers
11
- module Extended
12
- include Waves::Helpers::Basic
13
- include Waves::Helpers::DocType
14
- include Waves::Helpers::Layouts
15
- include Waves::Helpers::Formatting
16
- include Waves::Helpers::Model
17
- include Waves::Helpers::View
18
- include Waves::Helpers::Form
19
- end
20
- end
21
- end
data/lib/helpers/form.rb DELETED
@@ -1,42 +0,0 @@
1
- module Waves
2
-
3
- module Helpers
4
-
5
- # Form helpers are used in generating forms. Since Markaby already provides Ruby
6
- # methods for basic form generation, the focus of this helper is on providing templates
7
- # to handle things that go beyond the basics. You must define a form template
8
- # directory with templates for each type of form element you wish to use. The names
9
- # of the template should match the +type+ option provided in the property method.
10
- #
11
- # For example, this code:
12
- #
13
- # property :name => 'blog.title', :type => :text, :value => @blog.title
14
- #
15
- # will invoke the +text+ form view (the template in +templates/form/text.mab+),
16
- # passing in the name ('blog.title') and the value (@blog.title) as instance variables.
17
- #
18
- # These helpers work best with Markaby, but may work for other Renderers.
19
- #
20
-
21
- module Form
22
-
23
- # This method really is a place-holder for common wrappers around groups of
24
- # properties. You will usually want to override this. As is, it simply places
25
- # a DIV element with class 'properties' around the block.
26
- def properties(&block)
27
- div.properties do
28
- yield
29
- end
30
- end
31
-
32
- # Invokes the form view for the +type+ given in the option.
33
- def property( options )
34
- self << view( :form, options[:type], options )
35
- end
36
-
37
-
38
- end
39
-
40
- end
41
-
42
- end
@@ -1,30 +0,0 @@
1
- require 'redcloth'
2
- module Waves
3
- module Helpers
4
-
5
- # Formatting helpers are used to convert specialized content, like Markaby or
6
- # Textile, into valid HTML. It also provides common escaping functions.
7
- module Formatting
8
-
9
- # Escape a string as HTML content.
10
- def escape_html(s); Rack::Utils.escape_html(s); end
11
-
12
- # Escape a URI, converting quotes and spaces and so on.
13
- def escape_uri(s); Rack::Utils.escape(s); end
14
-
15
- # Treat content as Markaby and evaluate (only works within a Markaby template).
16
- # Used to pull Markaby content from a file or database into a Markaby template.
17
- def markaby( content ); self << eval( content ); end
18
-
19
- # Treat content as Textile.
20
- def textile( content )
21
- return if content.nil? or content.empty?
22
- #( ::RedCloth::TEXTILE_TAGS << [ 96.chr, '&8216;'] ).each do |pat,ent|
23
- # content.gsub!( pat, ent.gsub('&','&#') )
24
- #end
25
- self << ::RedCloth.new( content ).to_html
26
- end
27
-
28
- end
29
- end
30
- end
@@ -1,37 +0,0 @@
1
- module Waves
2
-
3
- module Helpers
4
-
5
- module Layouts
6
-
7
- # Invokes a layout view (i.e., a view from the layouts template directory), using
8
- # the assigns parameter to define instance variables for the view. The block is
9
- # evaluated and also passed into the view as the +layout_content+ instance variable.
10
- #
11
- # You can define a layout just by creating a template and then calling the
12
- # +layout_content+ accessor when you want to embed the caller's content.
13
- #
14
- # == Example
15
- #
16
- # doctype :html4_transitional
17
- # html do
18
- # title @title # passed as an assigns parameter
19
- # end
20
- # body do
21
- # layout_content
22
- # end
23
- #
24
- def layout( name, assigns = {}, &block )
25
- assigns[ :layout_content ] = capture(&block)
26
- self << Waves.main::Views[:layouts].process( request ) do
27
- send( name, assigns )
28
- end
29
- end
30
-
31
- def layout_content
32
- self << @layout_content
33
- end
34
-
35
- end
36
- end
37
- end
data/lib/helpers/model.rb DELETED
@@ -1,37 +0,0 @@
1
- module Waves
2
- module Helpers
3
-
4
- # Model helpers allow you to directly access a model from within a view.
5
- # This is useful when creating things like select boxes that need data
6
- # from anther model. For example, a Markaby select box for authors might look like:
7
- #
8
- # select do
9
- # all(:user).each do |user|
10
- # option user.full_name, :value => user.id
11
- # end
12
- # end
13
- #
14
- # You could also use these within a view class to keep model-based logic out
15
- # of the templates themselves. For example, in the view class you might define
16
- # a method called +authors+ that returns an array of name / id pairs. This could
17
- # then be called from the template instead of the model helper.
18
- #
19
- module Model
20
-
21
- def model( name )
22
- Waves.main::Models[ name ][ domain ]
23
- end
24
-
25
- # Just like model.all. Returns all the instances of that model.
26
- def all( model )
27
- model( model ).all
28
- end
29
-
30
- # Finds a specific instance using the name field
31
- def find( model, name )
32
- model( model )[name ] rescue nil
33
- end
34
-
35
- end
36
- end
37
- end
data/lib/helpers/view.rb DELETED
@@ -1,22 +0,0 @@
1
- module Waves
2
- module Helpers
3
-
4
- # View helpers are intended to help reuse views from within other views.
5
- # Both the +layout+ method in the common helpers and the +property+ method
6
- # of the form helpers are specialized instance of this.
7
- #
8
- # The star of our show here is the +view+ method. This takes a model, view,
9
- # and assigns hash (which are converted into instance variables in the target
10
- # view) and returns the result of evaluating the view as content in the current
11
- # template.
12
- module View
13
-
14
- # Invokes the view for the given model, passing the assigns as instance variables.
15
- def view( model, view, assigns = {} )
16
- self << Waves.main::Views[ model ].new( request ).send( view, assigns )
17
- end
18
-
19
-
20
- end
21
- end
22
- end
@@ -1,67 +0,0 @@
1
- module Waves
2
- module Layers
3
- module Inflect
4
-
5
- # Adds plural/singular methods for English to String
6
- module English
7
-
8
- def self.included(app)
9
-
10
- require 'english/inflect'
11
-
12
- Waves::Resources::Mixin::ClassMethods.module_eval do
13
- def singular ; basename.snake_case.singular ; end
14
- def plural ; basename.snake_case.plural ; end
15
- end
16
-
17
- Waves::Resources::Mixin.module_eval do
18
- def singular ; self.class.singular ; end
19
- def plural ; self.class.plural ; end
20
- end
21
-
22
- Waves::Resources::Paths.module_eval do
23
- def resource ; self.class.resource.singular ; end
24
- def resources ; self.class.resource.plural ; end
25
-
26
- # TODO: be nice to DRY this up ... basically the same code
27
- # as the mixin except with the singular / plural stuff
28
- # mixed in ...
29
- def generate( template, args )
30
- return "/#{ args * '/' }" unless template.is_a?( Array ) and not template.empty?
31
- path = []
32
- ( "/#{ path * '/' }" ) if template.all? do | want |
33
- case want
34
- when true then path += args
35
- when String then path << want
36
- when Symbol
37
- case want
38
- when :resource then path << resource
39
- when :resources then path << resources
40
- else path << args.shift
41
- end
42
- when Regexp then path << args.shift
43
- when Hash
44
- key, value = want.to_a.first
45
- case key
46
- when :resource then path << resource
47
- when :resources then path << resources
48
- else
49
- case value
50
- when true then path += args
51
- when String, Symbol, RegExp then path << args.unshift
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
58
-
59
- end
60
-
61
- end
62
- end
63
- end
64
- end
65
-
66
-
67
-
data/lib/layers/mvc.rb DELETED
@@ -1,54 +0,0 @@
1
- module Waves
2
- module Layers
3
- module MVC
4
-
5
- def self.included( app )
6
-
7
- require 'layers/mvc/extensions'
8
- require 'layers/mvc/controllers'
9
-
10
- app.auto_create_module( :Models ) do
11
- include AutoCode
12
- auto_create_class :Default
13
- auto_load :Default, :directories => [ :models ]
14
- end
15
-
16
- app.auto_eval( :Models ) do
17
- auto_create_class true, app::Models::Default
18
- auto_load true, :directories => [ :models ]
19
- end
20
-
21
- app.auto_create_module( :Views ) do
22
- include AutoCode
23
- auto_create_class :Default, Waves::Views::Base
24
- auto_load :Default, :directories => [ :views ]
25
- end
26
-
27
- app.auto_eval( :Views ) do
28
- auto_create_class true, app::Views::Default
29
- auto_load true, :directories => [ :views ]
30
- end
31
-
32
- app.auto_create_module( :Controllers ) do
33
- include AutoCode
34
- auto_create_class :Default, Waves::Controllers::Base
35
- auto_load :Default, :directories => [ :controllers ]
36
- end
37
-
38
- app.auto_eval( :Controllers ) do
39
- auto_create_class true, app::Controllers::Default
40
- auto_load true, :directories => [ :controllers ]
41
- end
42
-
43
- app.auto_create_module( :Helpers ) do
44
- include AutoCode
45
- auto_create_module( :Default ) { include Waves::Helpers::Extended }
46
- auto_load :Default, :directories => [ :helpers ]
47
- auto_create_module( true ) { include app::Helpers::Default }
48
- auto_load true, :directories => [ :helpers ]
49
- end
50
-
51
- end
52
- end
53
- end
54
- end
@@ -1,60 +0,0 @@
1
- require 'erubis'
2
-
3
- module Erubis # :nodoc:
4
-
5
- # This is added to the Erubis Content class to allow the same helper methods
6
- # to be used with both Markaby and Erubis.
7
- class Context
8
-
9
- def <<(s)
10
- eval("_buf << '#{s}'", @binding)
11
- end
12
-
13
- def capture
14
- eval("_context.push(_buf); _buf = ''", @binding) #ignore output from that eval, will be added via "<<"
15
- result = Erubis::Eruby.new(yield).result @binding
16
- eval("_buf = _context.pop", @binding)
17
- result
18
- end
19
-
20
- def to_s(eruby)
21
- unless @binding
22
- @binding = binding
23
- eval("_buf = ''; _context = []", @binding)
24
- end
25
- eruby.result @binding
26
- end
27
-
28
- end
29
-
30
- end
31
-
32
- module Waves
33
-
34
- module Renderers
35
-
36
- module Erubis
37
-
38
- Extension = :erb
39
-
40
- extend Waves::Renderers::Mixin
41
-
42
- def self.render( path, assigns )
43
- eruby = ::Erubis::Eruby.new( template( path ) )
44
- helper = helper( path )
45
- context = ::Erubis::Context.new
46
- context.meta_eval { include( helper ) ; }
47
- context.instance_eval do
48
- assigns.each do |key,val|
49
- instance_variable_set("@#{key}",val)
50
- end
51
- end
52
- context.to_s(eruby)
53
- end
54
-
55
-
56
- end
57
-
58
- end
59
-
60
- end