nitro 0.21.2 → 0.22.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.
- data/CHANGELOG +121 -0
- data/README +9 -3
- data/doc/RELEASES +86 -1
- data/lib/nitro.rb +1 -1
- data/lib/nitro/adapter/cgi.rb +4 -1
- data/lib/nitro/adapter/scgi.rb +2 -0
- data/lib/nitro/adapter/webrick.rb +1 -1
- data/lib/nitro/caching/output.rb +6 -5
- data/lib/nitro/compiler.rb +8 -3
- data/lib/nitro/dispatcher.rb +2 -2
- data/lib/nitro/dispatcher/nice.rb +1 -1
- data/lib/nitro/element.rb +19 -2
- data/lib/nitro/mixin/markup.rb +2 -2
- data/lib/nitro/mixin/pager.rb +80 -25
- data/lib/nitro/mixin/rss.rb +5 -2
- data/lib/nitro/render.rb +9 -0
- data/lib/nitro/request.rb +93 -6
- data/lib/nitro/response.rb +4 -0
- data/lib/nitro/server.rb +24 -10
- data/lib/nitro/server/runner.rb +15 -10
- data/lib/nitro/service/xmlrpc.rb +1 -0
- data/lib/nitro/test.rb +5 -0
- data/lib/nitro/test/assertions.rb +171 -0
- data/lib/nitro/{testing → test}/context.rb +0 -0
- data/lib/nitro/test/testcase.rb +66 -0
- data/proto/public/error.xhtml +5 -2
- data/proto/public/settings.xhtml +2 -0
- data/proto/script/runner +20 -0
- data/test/nitro/tc_controller.rb +3 -3
- data/test/nitro/tc_controller_aspect.rb +29 -0
- data/test/nitro/tc_dispatcher.rb +2 -1
- data/test/nitro/tc_element.rb +9 -0
- data/test/nitro/tc_request.rb +38 -0
- metadata +13 -13
- data/lib/nitro/mail.rb +0 -270
- data/lib/nitro/template.rb +0 -202
- data/lib/nitro/testing.rb +0 -2
- data/lib/nitro/testing/assertions.rb +0 -100
- data/lib/nitro/testing/testcase.rb +0 -51
- data/test/nitro/tc_mail.rb +0 -97
- data/test/nitro/tc_template.rb +0 -32
data/CHANGELOG
CHANGED
@@ -1,5 +1,126 @@
|
|
1
|
+
07-08-2005 George Moschovitis <gm@navel.gr>
|
2
|
+
|
3
|
+
* lib/nitro/tc_controller.rb: ditto.
|
4
|
+
|
5
|
+
* lib/nitro/tc_dispatcher.rb: tmp fix for require order problem.
|
6
|
+
|
7
|
+
* doc/README: updated.
|
8
|
+
|
9
|
+
* doc/RELEASES: updated.
|
10
|
+
|
11
|
+
* test/nitro/tc_mail.rb: removed.
|
12
|
+
|
13
|
+
* lib/nitro/mail.rb: moved to glue.
|
14
|
+
|
15
|
+
06-08-2005 George Moschovitis <gm@navel.gr>
|
16
|
+
|
17
|
+
* proto/script/runner.rb: implemented.
|
18
|
+
|
19
|
+
05-08-2005 George Moschovitis <gm@navel.gr>
|
20
|
+
|
21
|
+
* lib/nitro/render.rb (#render_template): implemented [mneumann].
|
22
|
+
|
23
|
+
* lib/nitro/element.rb: prefix setting added,
|
24
|
+
(#start_tag/#end_tag): also work in prefix mode!
|
25
|
+
|
26
|
+
04-08-2005 George Moschovitis <gm@navel.gr>
|
27
|
+
|
28
|
+
* lib/nitro/template.rb: moved to glue.
|
29
|
+
|
30
|
+
* lib/nitro/test.rb: $NITRO_NO_INVOKE added.
|
31
|
+
|
32
|
+
* lib/nitro/test/testcase.rb (#controller): reimplemented to
|
33
|
+
be similar to the og test helpers and more flexible,
|
34
|
+
no need for settings.rb.
|
35
|
+
|
36
|
+
* lib/nitro/cache/output.rb (#expire_output): use the passed
|
37
|
+
name as is.
|
38
|
+
|
39
|
+
03-08-2005 George Moschovitis <gm@navel.gr>
|
40
|
+
|
41
|
+
* lib/nitro/server.rb (#start): accepts options hash [marcus].
|
42
|
+
|
43
|
+
03-08-2005 Michael Neumann <mneumann@ntecs.de>
|
44
|
+
|
45
|
+
* lib/nitro/adapter/cgi.rb (#parse_params): add query parameters
|
46
|
+
to the post parameters.
|
47
|
+
|
48
|
+
02-08-2005 George Moschovitis <gm@navel.gr>
|
49
|
+
|
50
|
+
* lib/nitro/mixin/rss.rb: use markup instead of cgi.escape [lindsay].
|
51
|
+
|
52
|
+
01-08-2005 George Moschovitis <gm@navel.gr>
|
53
|
+
|
54
|
+
* lib/nitro/cache/output.rb (#expire_output): fixed index bug.
|
55
|
+
|
56
|
+
* lib/nitro/mixin/pager.rb: dont sent offset 0, works with
|
57
|
+
older versions of mysql.
|
58
|
+
|
59
|
+
31-07-2005 George Moschovitis <gm@navel.gr>
|
60
|
+
|
61
|
+
* lib/nitro/compiler.rb: fix, don't pass more parameters
|
62
|
+
than the method arity.
|
63
|
+
|
64
|
+
* lib/nitro/caching/output.rb: fixed indexindex.
|
65
|
+
|
66
|
+
* test/nitro/tc_controller_aspect.rb: implemented.
|
67
|
+
|
68
|
+
* proto/public/settings.xhtml: only display in debug mode for
|
69
|
+
security.
|
70
|
+
|
71
|
+
* proto/public/error.xhtml: only display in debug mode for
|
72
|
+
security.
|
73
|
+
|
74
|
+
* lib/nitro/runner.rb: added mode setting,
|
75
|
+
better handling of mode,
|
76
|
+
Run alias for Runner.
|
77
|
+
|
78
|
+
30-07-2005 George Moschovitis <gm@navel.gr>
|
79
|
+
|
80
|
+
* lib/nitro/mixin/pager.rb (#first_page?, #last_page?):
|
81
|
+
implemented,
|
82
|
+
added more comments.
|
83
|
+
(#link_xxx_page): added helpers.
|
84
|
+
(#paginate): added support for Og::Collections.
|
85
|
+
|
86
|
+
* proto/public/error.xhtml: updated.
|
87
|
+
|
88
|
+
29-07-2005 George Moschovitis <gm@navel.gr>
|
89
|
+
|
90
|
+
* lib/nitro/response.rb (#content_type): added.
|
91
|
+
|
92
|
+
* lib/nitro/test/testcase.rb: recoded from scratch,
|
93
|
+
automatically build environment,
|
94
|
+
(#process): accept an option hash to be more flexible.
|
95
|
+
added process helpers,
|
96
|
+
add leading '/' if missing.
|
97
|
+
|
98
|
+
* lib/nitro/test/assertions.rb (#assert_response): reimplemented,
|
99
|
+
(#assert_METHOD): helpers added,
|
100
|
+
(#assert_output): reimplemented,
|
101
|
+
keep the old assertions, give more option.
|
102
|
+
(#assert_session): reimplemented,
|
103
|
+
(#assert_redirected): reimplemented.
|
104
|
+
(#assert_response): generalized.
|
105
|
+
(#assert_cookie): reimplemented.
|
106
|
+
|
107
|
+
* lib/nitro/test*: renamed from testing.
|
108
|
+
|
109
|
+
* test/nitro/tc_request.rb: added test case to test the
|
110
|
+
new feature, as always I found some bugs :)
|
111
|
+
|
112
|
+
* lib/nitro/request.rb: added method predicates for all
|
113
|
+
request methods,
|
114
|
+
(#post_format): added,
|
115
|
+
(#xxx_post?): added a set of helper methods,
|
116
|
+
(#xml_http_request?): added,
|
117
|
+
(#domain): added,
|
118
|
+
(#subdomains): added.
|
119
|
+
|
1
120
|
28-07-2005 George Moschovitis <gm@navel.gr>
|
2
121
|
|
122
|
+
* --- VERSION 0.21.1 ---
|
123
|
+
|
3
124
|
* lib/nitro/dispatcher/nice.rb (#dispatch): fixed.
|
4
125
|
|
5
126
|
* doc/RELEASES: updated.
|
data/README
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
= Nitro 0.
|
1
|
+
= Nitro 0.22.0 README
|
2
2
|
|
3
3
|
Nitro provides everything you need to develop professional Web
|
4
4
|
applications using Ruby and Javascript.
|
@@ -112,7 +112,7 @@ A short summary of the major features:
|
|
112
112
|
'RunTime' time.
|
113
113
|
|
114
114
|
<!-- compile time include (static include) -->
|
115
|
-
<?include href="myfile.inc"
|
115
|
+
<?include href="myfile.inc" ?>
|
116
116
|
|
117
117
|
<!-- run time include (dynamic include) -->
|
118
118
|
<include href="myfile.inc" />
|
@@ -239,6 +239,11 @@ A short summary of the major features:
|
|
239
239
|
p u.errors[:password]
|
240
240
|
end
|
241
241
|
|
242
|
+
* Excellent support for Test Driven Development and Testing.
|
243
|
+
Nitro provides full support for fixtures, mocking and a set
|
244
|
+
of custom assertions for testing everything, from controller
|
245
|
+
logic to your models.
|
246
|
+
|
242
247
|
* Implicit nice urls. Nitro automatically generates nice urls
|
243
248
|
for your actions. However, if you want to customize the defaults,
|
244
249
|
a powerful routing mechanism is provided.
|
@@ -272,7 +277,8 @@ A short summary of the major features:
|
|
272
277
|
* Mailer
|
273
278
|
|
274
279
|
Nitro provides excellent support for handling emails in your
|
275
|
-
Web application.
|
280
|
+
Web application. Both incoming and outgoing email support is
|
281
|
+
provided.
|
276
282
|
|
277
283
|
* Wee integration.
|
278
284
|
|
data/doc/RELEASES
CHANGED
@@ -1,9 +1,94 @@
|
|
1
|
+
== Version 0.22.0
|
2
|
+
|
3
|
+
A snapshot of the latest developments. Many requested features
|
4
|
+
where implemented, and many reported bugs fixed.
|
5
|
+
|
6
|
+
* The much requested Og 'reverse mode' is implemented. Og's
|
7
|
+
domain specific language and API is extended to allow fine-grained
|
8
|
+
customization of the schema-to-objects mapping. Og can now handle
|
9
|
+
most of the legacy schemas you can throw at it. Here is an
|
10
|
+
example:
|
11
|
+
|
12
|
+
class User
|
13
|
+
property :name, String, :field => :thename, :uniq => true
|
14
|
+
property :password, String
|
15
|
+
property :age, Fixnum, :field => :age3
|
16
|
+
has_many Comment, :foreign_field => :user
|
17
|
+
set_table :my_users
|
18
|
+
set_primary_key :name, String
|
19
|
+
end
|
20
|
+
|
21
|
+
class Comment
|
22
|
+
property :cid, Fixnum
|
23
|
+
property :body, String
|
24
|
+
belongs_to User, :field => :user
|
25
|
+
set_table :my_comments
|
26
|
+
set_primary_key :cid
|
27
|
+
end
|
28
|
+
|
29
|
+
As you can see, even relation fields can be customized. For
|
30
|
+
higher level customization you can overload methods like #table,
|
31
|
+
#field_for_property etc.
|
32
|
+
|
33
|
+
* Og now handles multiple connections to multiple stores even
|
34
|
+
in thread safe mode. This means you can now have objects serialized
|
35
|
+
in different RDBM systems in the same application. Or you can have
|
36
|
+
some objects managed by an RDBMS store and others by a FAST
|
37
|
+
in-memory store. You can still have relations between objects in
|
38
|
+
different stores. An example:
|
39
|
+
|
40
|
+
mysql = Og.setup(:store => :mysql, ..)
|
41
|
+
psql = Og.setup(:store => :psql, ..)
|
42
|
+
|
43
|
+
class User
|
44
|
+
has_many Comment
|
45
|
+
end
|
46
|
+
|
47
|
+
class Comment
|
48
|
+
belongs_to User
|
49
|
+
end
|
50
|
+
|
51
|
+
mysql.manage_class User
|
52
|
+
psql.manage_class Comment
|
53
|
+
|
54
|
+
user.comments << comment
|
55
|
+
|
56
|
+
* Greatly improved support for testing and test-driven-development.
|
57
|
+
A reworked testing infrastructure for controllers is in place.
|
58
|
+
Moreover, support for Og fixtures and automatic test database
|
59
|
+
setup is provided. Fixtures can be defined with yml or csv files.
|
60
|
+
|
61
|
+
For an example of the testing infrastructure check out the
|
62
|
+
Spark 0.4.0 sources. Spark is a Wiki powered by Nitro.
|
63
|
+
|
64
|
+
* Reworked mailer implementation. The new mailer allows for
|
65
|
+
incoming email handling. Here is an example:
|
66
|
+
|
67
|
+
class Mailman < Glue::Mailer
|
68
|
+
def receive(mail)
|
69
|
+
article = Article.new(mail.subject, mail.body)
|
70
|
+
article.category = Category.find_by_name(mail.to.split('@').first)
|
71
|
+
article.save
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
* Added script/runner in proto as a convenience to running
|
76
|
+
ruby code in your application environment.
|
77
|
+
|
78
|
+
* Many fixes in the caching infrastructure.
|
79
|
+
|
80
|
+
* Many fixes in the XMLRPC service infrastructure.
|
81
|
+
|
82
|
+
* Many smaller changes and feature implementations that make
|
83
|
+
development with Nitro so much more pleasurable.
|
84
|
+
|
85
|
+
|
1
86
|
== Version 0.21.2
|
2
87
|
|
3
88
|
This is mainly a bug fix release. Some minor features are
|
4
89
|
implemented:
|
5
90
|
|
6
|
-
*
|
91
|
+
* Pluggable dispatchers. A new dispatcher that implicitly handles
|
7
92
|
nice urls is enabled by default. You can easily change to the
|
8
93
|
old general dispatcher though.
|
9
94
|
|
data/lib/nitro.rb
CHANGED
data/lib/nitro/adapter/cgi.rb
CHANGED
@@ -204,8 +204,10 @@ class CgiUtils
|
|
204
204
|
if (:post == method) and
|
205
205
|
%r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|n.match(context.headers['CONTENT_TYPE'])
|
206
206
|
boundary = $1.dup
|
207
|
-
# context.params = read_multipart(boundary, Integer(context.headers['CONTENT_LENGTH']), context.in, context.headers)
|
208
207
|
context.params = parse_multipart(context, boundary)
|
208
|
+
|
209
|
+
# Also include the URL parameters.
|
210
|
+
context.params.update(CgiUtils.parse_query_string(context.query_string))
|
209
211
|
else
|
210
212
|
case method
|
211
213
|
when :get, :head
|
@@ -338,3 +340,4 @@ end
|
|
338
340
|
|
339
341
|
# * George Moschovitis <gm@navel.gr>
|
340
342
|
# * James Britt <james_b@neurogami.com>
|
343
|
+
# * Michael Neumann <mneumann@ntecs.de>
|
data/lib/nitro/adapter/scgi.rb
CHANGED
@@ -83,7 +83,7 @@ class WebrickAdapter < WEBrick::HTTPServlet::AbstractServlet
|
|
83
83
|
rescue WEBrick::HTTPStatus::PartialContent, WEBrick::HTTPStatus::NotModified => err
|
84
84
|
res.set_error(err)
|
85
85
|
return true
|
86
|
-
rescue
|
86
|
+
rescue Object => ex
|
87
87
|
return false
|
88
88
|
ensure
|
89
89
|
unrewrite(req)
|
data/lib/nitro/caching/output.rb
CHANGED
@@ -24,7 +24,7 @@ module Caching
|
|
24
24
|
filepath = output_cache_path(path)
|
25
25
|
FileUtils.makedirs(File.dirname(filepath))
|
26
26
|
File.open(filepath, 'w+') { |f| f.write(content) }
|
27
|
-
Logger.debug "Cached page
|
27
|
+
Logger.debug "Cached page '#{filepath}'" if $DBG
|
28
28
|
end
|
29
29
|
|
30
30
|
# Enable output caching for the given actions.
|
@@ -35,16 +35,16 @@ module Caching
|
|
35
35
|
str = actions.collect { |a| ":#{a}" }.join(', ')
|
36
36
|
|
37
37
|
module_eval %{
|
38
|
-
|
38
|
+
after "do_cache_output", :on => [ #{str} ]
|
39
39
|
}
|
40
40
|
end
|
41
41
|
|
42
42
|
private
|
43
43
|
|
44
44
|
def output_cache_path(path)
|
45
|
-
filename = ((path.empty? || path == '/') ? '
|
45
|
+
filename = ((path.empty? || path == '/') ? 'index.html' : path.dup)
|
46
46
|
# filename.gsub!(/\/$/, '')
|
47
|
-
filename << 'index.html' unless (
|
47
|
+
filename << 'index.html' unless (filename.split('/').last || filename).include? '.'
|
48
48
|
return output_cache_root + '/' + filename
|
49
49
|
end
|
50
50
|
|
@@ -60,7 +60,8 @@ module Caching
|
|
60
60
|
|
61
61
|
def expire_output(name)
|
62
62
|
begin
|
63
|
-
|
63
|
+
Logger.debug "Expirinig cache file '#{context.dispatcher.public_root}/#{name}'" if $DBG
|
64
|
+
FileUtils.rm_rf("#{context.dispatcher.public_root}/#{name}")
|
64
65
|
rescue Object
|
65
66
|
# gmosx: is this the right thing to do?
|
66
67
|
end
|
data/lib/nitro/compiler.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'facet/object/singleton_class'
|
2
2
|
|
3
|
-
require '
|
3
|
+
require 'glue/template'
|
4
4
|
require 'nitro/compiler/errors'
|
5
5
|
|
6
6
|
module Nitro
|
@@ -135,7 +135,13 @@ class Compiler
|
|
135
135
|
code << %{
|
136
136
|
params = []
|
137
137
|
if context.query_string
|
138
|
-
context.query_string.split(/[&;]/).
|
138
|
+
context.query_string.split(/[&;]/).each_with_index do |qs, i|
|
139
|
+
}
|
140
|
+
# Don't pass more parameters than the action's arity.
|
141
|
+
if param_count > 0
|
142
|
+
code << "break if i >= #{param_count};"
|
143
|
+
end
|
144
|
+
code << %{
|
139
145
|
params << qs.split(/=/).last
|
140
146
|
end
|
141
147
|
end
|
@@ -232,7 +238,6 @@ class Compiler
|
|
232
238
|
compile_template(klass, action, template_path) if template_path
|
233
239
|
|
234
240
|
return true
|
235
|
-
|
236
241
|
end
|
237
242
|
|
238
243
|
# Compiles an action method in the given (controller) class.
|
data/lib/nitro/dispatcher.rb
CHANGED
@@ -13,7 +13,7 @@ class Dispatcher
|
|
13
13
|
include Router
|
14
14
|
|
15
15
|
# The dispatcher specialization used.
|
16
|
-
|
16
|
+
|
17
17
|
setting :mode, :default => :nice, :doc => 'The dispatcher specialization used'
|
18
18
|
|
19
19
|
unless const_defined? :ROOT
|
@@ -86,7 +86,7 @@ class Dispatcher
|
|
86
86
|
end
|
87
87
|
|
88
88
|
auto_mixin(c)
|
89
|
-
|
89
|
+
|
90
90
|
# Try to setup a template_root if none is defined:
|
91
91
|
|
92
92
|
unless c.template_root
|
@@ -27,7 +27,7 @@ class Dispatcher
|
|
27
27
|
end
|
28
28
|
|
29
29
|
unless parts.empty?
|
30
|
-
context.headers['QUERY_STRING'] = "#{parts.join(';')}
|
30
|
+
context.headers['QUERY_STRING'] = "#{parts.join(';')};#{context.headers['QUERY_STRING']}"
|
31
31
|
end
|
32
32
|
|
33
33
|
return klass, "#{action}_action", base
|
data/lib/nitro/element.rb
CHANGED
@@ -2,6 +2,9 @@ require 'rexml/document'
|
|
2
2
|
require 'rexml/streamlistener'
|
3
3
|
|
4
4
|
require 'facet/string/capitalized%3F'
|
5
|
+
require 'facet/string/camelize'
|
6
|
+
|
7
|
+
require 'glue/configuration'
|
5
8
|
|
6
9
|
module Nitro
|
7
10
|
|
@@ -17,6 +20,10 @@ module Nitro
|
|
17
20
|
#++
|
18
21
|
|
19
22
|
class Element
|
23
|
+
# The prefix for element tags (in xhtml compatibility mode)
|
24
|
+
|
25
|
+
setting :prefix, :default => 'x', :doc => 'The prefix for element tags'
|
26
|
+
|
20
27
|
# The parent of this element.
|
21
28
|
|
22
29
|
attr_accessor :_parent
|
@@ -84,8 +91,15 @@ class ElementProcessor # :nodoc: all
|
|
84
91
|
@stack = []
|
85
92
|
end
|
86
93
|
|
94
|
+
PREFIX_RE = /^#{Element.prefix}:/
|
95
|
+
CAPITALIZED_RE = /^[A-Z]/
|
96
|
+
|
87
97
|
def tag_start(name, attributes)
|
88
|
-
if name
|
98
|
+
# check if the name starts with the element prefix, or
|
99
|
+
# is capitalized.
|
100
|
+
if name =~ PREFIX_RE or name =~ CAPITALIZED_RE
|
101
|
+
name = name.split(':')[1].camelize if name =~ PREFIX_RE
|
102
|
+
|
89
103
|
obj = Object.const_get(name).new
|
90
104
|
|
91
105
|
attributes.each do | k, v |
|
@@ -111,7 +125,10 @@ class ElementProcessor # :nodoc: all
|
|
111
125
|
end
|
112
126
|
|
113
127
|
def tag_end(name)
|
114
|
-
if name
|
128
|
+
# check if the name starts with the element prefix, or
|
129
|
+
# is capitalized.
|
130
|
+
if name =~ PREFIX_RE or name =~ CAPITALIZED_RE
|
131
|
+
name = name.split(':')[1].camelize if name =~ PREFIX_RE
|
115
132
|
obj, @buffer = @stack.pop
|
116
133
|
@buffer << obj.render
|
117
134
|
else
|