nitro 0.17.0 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. data/CHANGELOG +124 -0
  2. data/README +2 -2
  3. data/Rakefile +4 -12
  4. data/bin/nitro +1 -1
  5. data/bin/nitrogen +47 -31
  6. data/doc/AUTHORS +3 -3
  7. data/doc/RELEASES +50 -1
  8. data/examples/README +7 -0
  9. data/lib/nitro.rb +5 -4
  10. data/lib/nitro/{adapters → adapter}/cgi.rb +2 -4
  11. data/lib/nitro/{adapters → adapter}/fastcgi.rb +1 -1
  12. data/lib/nitro/{adapters → adapter}/webrick.rb +5 -10
  13. data/lib/nitro/buffering.rb +6 -0
  14. data/lib/nitro/{builders → builder}/atom.rb +1 -5
  15. data/lib/nitro/{builders → builder}/form.rb +1 -5
  16. data/lib/nitro/{builders → builder}/rss.rb +3 -1
  17. data/lib/nitro/{builders → builder}/table.rb +2 -4
  18. data/lib/nitro/{builders → builder}/xhtml.rb +3 -5
  19. data/lib/nitro/{builders → builder}/xml.rb +2 -4
  20. data/lib/nitro/caching.rb +6 -4
  21. data/lib/nitro/caching/output.rb +18 -11
  22. data/lib/nitro/context.rb +3 -1
  23. data/lib/nitro/controller.rb +29 -18
  24. data/lib/nitro/dispatcher.rb +2 -4
  25. data/lib/nitro/element.rb +2 -0
  26. data/lib/nitro/environment.rb +2 -4
  27. data/lib/nitro/errors.rb +69 -0
  28. data/lib/nitro/mail.rb +2 -4
  29. data/lib/nitro/markup.rb +20 -3
  30. data/lib/nitro/output.rb +5 -9
  31. data/lib/nitro/part.rb +2 -3
  32. data/lib/nitro/render.rb +49 -30
  33. data/lib/nitro/request.rb +2 -1
  34. data/lib/nitro/runner.rb +23 -12
  35. data/lib/nitro/scaffold.rb +5 -3
  36. data/lib/nitro/service.rb +22 -0
  37. data/lib/nitro/service/xmlrpc.rb +42 -0
  38. data/lib/nitro/session.rb +2 -4
  39. data/lib/nitro/template.rb +8 -10
  40. data/lib/nitro/testing.rb +0 -4
  41. data/proto/public/error.xhtml +27 -2
  42. data/test/nitro/{adapters → adapter}/raw_post1.bin +0 -0
  43. data/test/nitro/{adapters → adapter}/tc_cgi.rb +1 -1
  44. data/test/nitro/{adapters → adapter}/tc_webrick.rb +1 -1
  45. data/test/nitro/{builders → builder}/tc_atom.rb +1 -1
  46. data/test/nitro/{builders → builder}/tc_rss.rb +1 -1
  47. data/test/nitro/{builders → builder}/tc_table.rb +1 -1
  48. data/test/nitro/{builders → builder}/tc_xhtml.rb +1 -1
  49. data/test/nitro/{builders → builder}/tc_xml.rb +1 -1
  50. data/test/nitro/tc_caching.rb +18 -0
  51. data/test/nitro/tc_controller.rb +1 -1
  52. data/test/nitro/tc_mail.rb +3 -1
  53. metadata +33 -168
  54. data/examples/README.windows +0 -9
  55. data/examples/ajax/controller.rb +0 -21
  56. data/examples/ajax/public/index.xhtml +0 -72
  57. data/examples/ajax/public/js/ajax.js +0 -64
  58. data/examples/ajax/run.rb +0 -14
  59. data/examples/blog/README +0 -70
  60. data/examples/blog/conf/apache.conf +0 -30
  61. data/examples/blog/conf/apache.conf.new +0 -53
  62. data/examples/blog/conf/lhttpd.conf +0 -79
  63. data/examples/blog/conf/locales/de.yml +0 -4
  64. data/examples/blog/conf/locales/en.yml +0 -4
  65. data/examples/blog/log/README +0 -3
  66. data/examples/blog/log/apache.error_log +0 -6647
  67. data/examples/blog/log/rewrite_log +0 -161
  68. data/examples/blog/public/base.xsl +0 -153
  69. data/examples/blog/public/fcgi.rb +0 -5
  70. data/examples/blog/public/m/bubbles.gif +0 -0
  71. data/examples/blog/public/m/comments_curve.gif +0 -0
  72. data/examples/blog/public/m/down.gif +0 -0
  73. data/examples/blog/public/m/footer_bg.gif +0 -0
  74. data/examples/blog/public/m/garrow.gif +0 -0
  75. data/examples/blog/public/m/gbull.gif +0 -0
  76. data/examples/blog/public/m/grbull.gif +0 -0
  77. data/examples/blog/public/m/h1_bg.gif +0 -0
  78. data/examples/blog/public/m/header_bg.gif +0 -0
  79. data/examples/blog/public/m/nitro.gif +0 -0
  80. data/examples/blog/public/m/obull.gif +0 -0
  81. data/examples/blog/public/m/page_bg.gif +0 -0
  82. data/examples/blog/public/m/rss.gif +0 -0
  83. data/examples/blog/public/m/side_title_bg.gif +0 -0
  84. data/examples/blog/public/m/sidebar_bg.gif +0 -0
  85. data/examples/blog/public/style.css +0 -305
  86. data/examples/blog/run.rb +0 -43
  87. data/examples/blog/src/blog.rb +0 -21
  88. data/examples/blog/src/controller.rb +0 -151
  89. data/examples/blog/src/mailer.rb +0 -23
  90. data/examples/blog/src/models/blog.rb +0 -33
  91. data/examples/blog/src/models/content.rb +0 -18
  92. data/examples/blog/src/views/blog_entry_email.xhtml +0 -16
  93. data/examples/blog/src/views/comments.xhtml +0 -36
  94. data/examples/blog/src/views/entry_form.xhtml +0 -22
  95. data/examples/blog/src/views/error.xhtml +0 -56
  96. data/examples/blog/src/views/index.xhtml +0 -49
  97. data/examples/blog/src/views/login.xhtml +0 -26
  98. data/examples/blog/src/views/recent_posts.xhtml +0 -14
  99. data/examples/blog/src/views/view_entry.xhtml +0 -37
  100. data/examples/blog/src/views/view_entry.xml +0 -12
  101. data/examples/blog/src/xsl/base.xsl +0 -160
  102. data/examples/blog/src/xsl/style.xsl +0 -143
  103. data/examples/blog/test/tc_blog.rb +0 -43
  104. data/examples/flash/log/README +0 -3
  105. data/examples/flash/root/index.xhtml +0 -16
  106. data/examples/flash/root/show_inline_text.xhtml +0 -17
  107. data/examples/flash/run.rb +0 -7
  108. data/examples/no_xsl_blog/README +0 -24
  109. data/examples/no_xsl_blog/conf/apache.conf +0 -30
  110. data/examples/no_xsl_blog/conf/lhttpd.conf +0 -79
  111. data/examples/no_xsl_blog/conf/locales/de.yml +0 -4
  112. data/examples/no_xsl_blog/conf/locales/en.yml +0 -4
  113. data/examples/no_xsl_blog/lib/blog.rb +0 -16
  114. data/examples/no_xsl_blog/lib/blog/controller.rb +0 -116
  115. data/examples/no_xsl_blog/lib/blog/model.rb +0 -35
  116. data/examples/no_xsl_blog/lib/blog/template.rb +0 -138
  117. data/examples/no_xsl_blog/lib/content.rb +0 -47
  118. data/examples/no_xsl_blog/log/README +0 -3
  119. data/examples/no_xsl_blog/log/apache.error_log +0 -473
  120. data/examples/no_xsl_blog/public/comments.xhtml +0 -36
  121. data/examples/no_xsl_blog/public/entry_form.xhtml +0 -22
  122. data/examples/no_xsl_blog/public/fcgi.rb +0 -5
  123. data/examples/no_xsl_blog/public/index.xhtml +0 -39
  124. data/examples/no_xsl_blog/public/login.xhtml +0 -21
  125. data/examples/no_xsl_blog/public/m/bubbles.gif +0 -0
  126. data/examples/no_xsl_blog/public/m/comments_curve.gif +0 -0
  127. data/examples/no_xsl_blog/public/m/down.gif +0 -0
  128. data/examples/no_xsl_blog/public/m/footer_bg.gif +0 -0
  129. data/examples/no_xsl_blog/public/m/garrow.gif +0 -0
  130. data/examples/no_xsl_blog/public/m/gbull.gif +0 -0
  131. data/examples/no_xsl_blog/public/m/grbull.gif +0 -0
  132. data/examples/no_xsl_blog/public/m/h1_bg.gif +0 -0
  133. data/examples/no_xsl_blog/public/m/header_bg.gif +0 -0
  134. data/examples/no_xsl_blog/public/m/nitro.gif +0 -0
  135. data/examples/no_xsl_blog/public/m/obull.gif +0 -0
  136. data/examples/no_xsl_blog/public/m/page_bg.gif +0 -0
  137. data/examples/no_xsl_blog/public/m/rss.gif +0 -0
  138. data/examples/no_xsl_blog/public/m/side_title_bg.gif +0 -0
  139. data/examples/no_xsl_blog/public/m/sidebar_bg.gif +0 -0
  140. data/examples/no_xsl_blog/public/recent_posts.xhtml +0 -14
  141. data/examples/no_xsl_blog/public/style.css +0 -299
  142. data/examples/no_xsl_blog/public/view_entry.xhtml +0 -25
  143. data/examples/no_xsl_blog/public/view_entry.xml +0 -12
  144. data/examples/no_xsl_blog/run.rb +0 -35
  145. data/examples/tiny/README +0 -14
  146. data/examples/tiny/conf/apache.conf +0 -30
  147. data/examples/tiny/conf/lhttpd.conf +0 -79
  148. data/examples/tiny/log/README +0 -3
  149. data/examples/tiny/log/apache.error_log +0 -154
  150. data/examples/tiny/public/deep/dir/hello.xhtml +0 -3
  151. data/examples/tiny/public/fcgi.rb +0 -5
  152. data/examples/tiny/public/include.xhtml +0 -3
  153. data/examples/tiny/public/index.xhtml +0 -55
  154. data/examples/tiny/public/nitro.png +0 -0
  155. data/examples/tiny/public/upload.xhtml +0 -21
  156. data/examples/tiny/run.rb +0 -7
  157. data/examples/wee_style/README +0 -10
  158. data/examples/wee_style/run.rb +0 -50
  159. data/examples/why_wiki/README +0 -5
  160. data/examples/why_wiki/run.rb +0 -59
  161. data/proto/public/js/ajax.js +0 -63
@@ -6,6 +6,10 @@ module Nitro
6
6
 
7
7
  # The output buffering mixin. Provides php-style output
8
8
  # buffering functionality.
9
+ #--
10
+ # TODO: use better names but keep the ob_xxx php style methods
11
+ # as aliases.
12
+ #++
9
13
 
10
14
  module OutputBuffering
11
15
  # Output buffers stack, used for php-style nested output
@@ -37,3 +41,5 @@ module OutputBuffering
37
41
  end
38
42
 
39
43
  end
44
+
45
+ # * George Moschovitis <gm@navel.gr>
@@ -1,10 +1,6 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id$
4
-
5
1
  # WARNING: unfinished code, do NOT use yet.
6
2
 
7
- require 'nitro/builders/xml'
3
+ require 'nitro/builder/xml'
8
4
 
9
5
  module Nitro
10
6
 
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: form.rb 30 2005-04-25 12:28:02Z gmosx $
4
-
5
1
  require 'glue/hash'
6
2
  require 'nitro/markup'
7
3
 
@@ -25,7 +21,7 @@ module FormBuilderMixin
25
21
  def build_form(obj, lc = nil, show_all = false)
26
22
  str = '<dl>'
27
23
 
28
- for p in obj.class.__props
24
+ for p in obj.class.properties
29
25
  unless show_all
30
26
  next if :oid == p.symbol
31
27
  end
@@ -1,7 +1,7 @@
1
1
  require 'rss/0.9'
2
2
 
3
3
  require 'glue/string'
4
- require 'nitro/builders/xml'
4
+ require 'nitro/builder/xml'
5
5
 
6
6
  module Nitro
7
7
 
@@ -100,3 +100,5 @@ class RssBuilder < String
100
100
  end
101
101
 
102
102
  end
103
+
104
+ # * George Moschovitis <gm@navel.gr>
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: table.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  module Nitro
6
2
 
7
3
  # The TableBuilder is a helper class that automates the creation
@@ -80,3 +76,5 @@ class TableBuilder
80
76
  end
81
77
 
82
78
  end
79
+
80
+ # * George Moschovitis <gm@navel.gr>
@@ -1,8 +1,4 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: xhtml.rb 25 2005-04-18 12:31:55Z gmosx $
4
-
5
- require 'nitro/builders/xml'
1
+ require 'nitro/builder/xml'
6
2
 
7
3
  module Nitro
8
4
 
@@ -117,3 +113,5 @@ class XhtmlBuilder
117
113
  end
118
114
 
119
115
  end
116
+
117
+ # * George Moschovitis <gm@navel.gr>
@@ -1,7 +1,3 @@
1
- # George Moschovitis <gm@navel.gr>
2
- # (c) 2005 Navel, all rights reserved.
3
- # $Id: xml.rb 25 2005-04-18 12:31:55Z gmosx $
4
-
5
1
  module Nitro
6
2
 
7
3
  # A helper mixin for programmatically building XML
@@ -131,3 +127,5 @@ class XmlBuilder
131
127
  end
132
128
 
133
129
  end
130
+
131
+ # * George Moschovitis <gm@navel.gr>
data/lib/nitro/caching.rb CHANGED
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: caching.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  require 'fileutils'
6
2
 
7
3
  require 'glue/attribute'
@@ -15,6 +11,10 @@ module Nitro
15
11
  # Adds support for caching.
16
12
 
17
13
  module Caching
14
+
15
+ # Globaly enable/disable caching.
16
+
17
+ mattr_accessor :caching_enabled, true
18
18
 
19
19
  def self.append_features(base) #:nodoc:
20
20
  super
@@ -27,3 +27,5 @@ module Caching
27
27
  end
28
28
 
29
29
  end
30
+
31
+ # * George Moschovitis <gm@navel.gr>
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: output.rb 9 2005-04-13 00:08:20Z nasis $
4
-
5
1
  require 'fileutils'
6
2
 
7
3
  module Nitro
@@ -34,21 +30,22 @@ module Caching
34
30
  # Enable output caching for the given actions.
35
31
 
36
32
  def cache_output(*actions)
37
- return unless caching_enabled
33
+ return unless (caching_enabled and Caching.caching_enabled)
38
34
 
39
35
  str = actions.collect { |a| ":#{a}" }.join(', ')
40
36
 
41
37
  module_eval %{
42
- after_filter "do_cache_output", :only => [ #{str} ]
38
+ post "do_cache_output", :only => [ #{str} ]
43
39
  }
44
40
  end
45
41
 
46
42
  private
47
43
 
48
44
  def output_cache_path(path)
49
- filename = ((path.empty? || path == '/') ? '/index' : path)
50
- filename << '.html' unless (name.split('/').last || name).include? '.'
51
- return output_cache_root + filename
45
+ filename = ((path.empty? || path == '/') ? '/index' : path.dup)
46
+ # filename.gsub!(/\/$/, '')
47
+ filename << 'index.html' unless (name.split('/').last || name).include? '.'
48
+ return output_cache_root + '/' + filename
52
49
  end
53
50
 
54
51
  end
@@ -56,11 +53,19 @@ module Caching
56
53
  private
57
54
 
58
55
  def do_cache_output
59
- if caching_enabled and caching_allowed?
60
- self.class.do_cache_output(@request.path, @out)
56
+ if caching_enabled and Caching.caching_enabled and caching_allowed?
57
+ self.class.do_cache_output(@request.uri, @out)
61
58
  end
62
59
  end
63
60
 
61
+ def expire_output(name)
62
+ begin
63
+ FileUtils.rm("#{context.dispatcher.public_root}/#{name}/index.html")
64
+ rescue Object
65
+ # gmosx: is this the right thing to do?
66
+ end
67
+ end
68
+
64
69
  def caching_allowed?
65
70
  !@request.post?
66
71
  end
@@ -70,3 +75,5 @@ module Caching
70
75
  end
71
76
 
72
77
  end
78
+
79
+ # * George Moschovitis <gm@navel.gr>
data/lib/nitro/context.rb CHANGED
@@ -3,7 +3,7 @@ require 'nitro/response'
3
3
  require 'nitro/render'
4
4
  require 'nitro/session'
5
5
  require 'nitro/output'
6
- require 'nitro/adapters/cgi.rb'
6
+ require 'nitro/adapter/cgi.rb'
7
7
 
8
8
  module Nitro
9
9
 
@@ -100,3 +100,5 @@ class Context
100
100
  end
101
101
 
102
102
  end
103
+
104
+ # * George Moschovitis <gm@navel.gr>
@@ -1,5 +1,6 @@
1
1
  require 'glue/aspects'
2
2
 
3
+ require 'nitro'
3
4
  require 'nitro/render'
4
5
  require 'nitro/scaffold'
5
6
  require 'nitro/caching'
@@ -81,18 +82,27 @@ class Controller
81
82
  # A hash containing metadata for the action
82
83
  # methods.
83
84
 
84
- cattr_accessor :action_metadata, {}
85
+ def self.action_metadata
86
+ # FIXME: improve this.
87
+ @action_metadata ||= {}
88
+ @action_metadata
89
+ end
90
+
91
+ # The directory where the templates for this controller
92
+ # reside.
93
+
94
+ @template_root = File.join(Nitro::LibPath, '..', 'proto', 'public')
85
95
 
86
96
  def initialize(context, base = nil)
87
97
  super
88
- self.class.template_root ||= "#{@context.dispatcher.template_root}#{base}"
98
+ # self.class.template_root ||= "#{@context.dispatcher.template_root}#{base}"
89
99
  end
90
100
 
91
101
  # Use the method_missing hook to compile the actions
92
102
  # for this controller.
93
103
 
94
104
  def method_missing(action, *args)
95
- if Rendering.compile_action(self.class, action, self.class.template_root)
105
+ if Rendering.compile_action(self.class, action)
96
106
  send(action, *args)
97
107
  else
98
108
  super
@@ -100,32 +110,30 @@ class Controller
100
110
  end
101
111
 
102
112
  class << self
113
+ attr_accessor :template_root
103
114
 
104
115
  alias __old_inherited inherited
105
-
116
+
106
117
  #--
107
118
  # gmosx, FIXME: the template_root hack is temporary.
108
119
  # this should be moved to the render.
109
120
  #++
110
121
 
111
122
  def inherited(child)
123
+ # child.template_root = template_root
124
+ child.template_root = 'public'
125
+
126
+ # Calculate the name of the file where this controller
127
+ # is defined. Currently used for reloading.
128
+
112
129
  child.class_eval %{
113
130
  if caller[2].to_s.split(':').last =~ /[0-9]+/
114
131
  DEF_FILE = caller[2].to_s.strip.gsub( /:[0-9]+$/ , '')
115
132
  else
116
133
  DEF_FILE = caller[3].to_s.strip.gsub( /:[0-9]+$/ , '')
117
134
  end
118
-
119
- @template_root = 'public'
120
-
121
- def self.template_root
122
- @template_root
123
- end
124
-
125
- def self.template_root=(root)
126
- @template_root = root
127
- end
128
135
  }
136
+
129
137
  __old_inherited(child)
130
138
  end
131
139
 
@@ -133,10 +141,10 @@ class Controller
133
141
  # macro.
134
142
 
135
143
  def action(name, options)
136
- if meta = @@action_metadata[name]
144
+ if meta = action_metadata[name]
137
145
  meta.update(options)
138
146
  else
139
- @@action_metadata[name] = ActionMeta.new(options)
147
+ action_metadata[name] = ActionMeta.new(options)
140
148
  end
141
149
  end
142
150
 
@@ -145,7 +153,7 @@ class Controller
145
153
 
146
154
  def action_methods
147
155
  classes = self.ancestors.reject do |a|
148
- [Object, Kernel, Render, Controller].include?(a)
156
+ [Object, Kernel, Render, Controller, Caching].include?(a)
149
157
  end
150
158
 
151
159
  classes.delete(PP::ObjectMixin) if defined?(PP::ObjectMixin)
@@ -159,7 +167,10 @@ class Controller
159
167
  return methods
160
168
  end
161
169
 
162
- end
170
+ end
163
171
  end
164
172
 
165
173
  end
174
+
175
+ # * George Moschovitis <gm@navel.gr>
176
+ # * James Britt <james_b@neurogami.com>
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: dispatcher.rb 30 2005-04-25 12:28:02Z gmosx $
4
-
5
1
  module Nitro
6
2
 
7
3
  require 'nitro/controller'
@@ -187,3 +183,5 @@ class Dispatcher
187
183
  end
188
184
 
189
185
  end
186
+
187
+ # * George Moschovitis <gm@navel.gr>
data/lib/nitro/element.rb CHANGED
@@ -144,6 +144,8 @@ class ElementProcessor # :nodoc: all
144
144
  def render(source)
145
145
  listener = Listener.new
146
146
  REXML::Document.parse_stream(source, listener)
147
+ # gmosx, FIXME: optimize this, how?
148
+ listener.buffer.gsub! /<(.*) ([^>]*)><\/\1>/, '<\1 \2 />'
147
149
  return listener.buffer
148
150
  end
149
151
  end
@@ -1,7 +1,3 @@
1
- # * George Moschovitis <gm@navel.gr>
2
- # (c) 2004-2005 Navel, all rights reserved.
3
- # $Id: environment.rb 1 2005-04-11 11:04:30Z gmosx $
4
-
5
1
  # Setup up the proposed environment. You are free
6
2
  # to skip this if you dont like it. Just set
7
3
  #
@@ -21,3 +17,5 @@ $LOAD_PATH.unshift 'src'
21
17
  # Library code come here.
22
18
 
23
19
  $LOAD_PATH.unshift 'lib'
20
+
21
+ # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,69 @@
1
+ require 'facet/string/demodulize'
2
+
3
+ module Nitro
4
+
5
+ class ActionCompileError < SyntaxError
6
+ SOURCE_CODE_RADIUS = 5
7
+
8
+ attr_accessor :original_excpetion
9
+
10
+ def initialize(source_code, filename, original_exception)
11
+ @source_code = source_code.split("\n")
12
+ @filename = filename
13
+ @original_exception = original_exception
14
+ end
15
+
16
+ def line_number
17
+ trace = @original_exception.backtrace.join
18
+
19
+ if trace.include?(":in `class_eval'")
20
+ trace.scan(/:([0-9]*):in `class_eval'/).first.first.to_i
21
+ else
22
+ 1
23
+ end
24
+ end
25
+
26
+ def source_extract(indent = 0)
27
+ ln = line_number
28
+ start_line = [ln - SOURCE_CODE_RADIUS, 0].max
29
+ end_line = [ln + SOURCE_CODE_RADIUS - 1, @source_code.length].min
30
+
31
+ number = start_line
32
+ extract = @source_code[start_line..end_line].collect do |line|
33
+ number += 1
34
+ line = line.gsub(/; @out << %\^/, ' ?>').gsub(/\^;/, '<?r ')
35
+ if number == line_number
36
+ "#{' ' * indent}#{number}: #{line}"
37
+ else
38
+ "#{' ' * indent}#{number}: #{line}"
39
+ end
40
+ end
41
+
42
+ return extract.join("\n")
43
+ end
44
+
45
+ def backtrace
46
+ @original_exception.backtrace.collect do |line|
47
+ # unless line =~ /\/usr/
48
+ line.gsub("#{Nitro::LibPath}/", '')
49
+ # else
50
+ # nil
51
+ # end
52
+ end.compact
53
+ end
54
+
55
+ def to_s
56
+ "#{self.class.to_s.demodulize} (#{@original_exception.class}): '#@filename' at line ##{line_number}"
57
+ end
58
+
59
+ def message
60
+ "#{to_s}\n#{source_extract}"
61
+ end
62
+ end
63
+
64
+ class TemplateCompileError < ActionCompileError
65
+ end
66
+
67
+ end
68
+
69
+ # * George Moschovitis <gm@navel.gr>
data/lib/nitro/mail.rb CHANGED
@@ -1,10 +1,6 @@
1
1
  # Based on original code from the RubyOnRails project.
2
2
  # http://www.rubyonrails.com
3
3
  # Copyright (c) 2004 David Heinemeier Hansson
4
- #
5
- # * George Moschovitis <gm@navel.gr>
6
- # (c) 2004-2005 Navel, all rights reserved.
7
- # $Id: mail.rb 1 2005-04-11 11:04:30Z gmosx $
8
4
 
9
5
  require 'net/smtp'
10
6
 
@@ -270,3 +266,5 @@ class Mailer < Mail
270
266
  end
271
267
 
272
268
  end
269
+
270
+ # * George Moschovitis <gm@navel.gr>