nitro 0.21.0 → 0.21.2

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 CHANGED
@@ -1,5 +1,53 @@
1
+ 28-07-2005 George Moschovitis <gm@navel.gr>
2
+
3
+ * lib/nitro/dispatcher/nice.rb (#dispatch): fixed.
4
+
5
+ * doc/RELEASES: updated.
6
+
7
+ * doc/MIGRATION: updated.
8
+
9
+ 27-07-2005 George Moschovitis <gm@navel.gr>
10
+
11
+ * lib/nitro/mixin/markup.rb: cleaned up,
12
+ added setup_xxx_transformation helpers.
13
+
14
+ * lib/nitro/server/runner.rb: added scgi support (--lhttpd-scgi)
15
+
16
+ * lib/nitro/adapter/scgi.rb: implemented.
17
+
18
+ * lib/nitro/controller.rb: added some cookie helpers.
19
+
20
+ * lib/nitro.rb: use nice dispatcher by default.
21
+
22
+ * lib/nitro/dispatcher.rb: mode setting.
23
+
24
+ * lib/nitro/dispatcher/general.rb: introduced.
25
+
26
+ * lib/nitro/dispatcher/nice.rb: introduced.
27
+
28
+ 27-07-2005 Deborah Hooker <deb@ysabel.org>
29
+
30
+ * lib/nitro/server.rb: access_log attr_accessor.
31
+
32
+ 26-07-2005 George Moschovitis <gm@navel.gr>
33
+
34
+ * lib/nitro/compiler.rb: more clever implicit nice urls.
35
+
36
+ * lib/nitro/controller.rb (#alias_action): made standalone.
37
+
38
+ * lib/nitro/dispatcher.rb (#dispatch): new algorithm,
39
+ more clever implicit nice urls.
40
+
1
41
  25-07-2005 George Moschovitis <gm@navel.gr>
2
42
 
43
+ * lib/nitro/mixin/markup.rb (#escape/#unescape): added.
44
+
45
+ * proto/public/error.xhtml: temp fix, use ..markuper (ugh),
46
+
47
+ * proto/public/robots.txt added.
48
+
49
+ * --- VERSION 0.21.0 ---
50
+
3
51
  * doc/MIGRATION: updated.
4
52
 
5
53
  24-07-2005 George Moschovitis <gm@navel.gr>
data/README CHANGED
@@ -1,4 +1,4 @@
1
- = Nitro 0.21.0 README
1
+ = Nitro 0.21.2 README
2
2
 
3
3
  Nitro provides everything you need to develop professional Web
4
4
  applications using Ruby and Javascript.
@@ -503,7 +503,7 @@ http://rubyforge.org/mailman/listinfo/nitro-general
503
503
 
504
504
  == Licence
505
505
 
506
- Copyright (c) 2004-2005, George 'tml' Moschovitis.
506
+ Copyright (c) 2004-2005, George 'gmosx' Moschovitis (http://www.nitrohq.com)
507
507
  Copyright (c) 2004-2005, Navel Ltd (http://www.navel.gr)
508
508
 
509
509
  Nitro (http://www.nitrohq.com) is copyrighted free software
@@ -9,6 +9,16 @@ For more help, send your question to the mailing list:
9
9
 
10
10
  http://rubyforge.org/mailman/listinfo/nitro-general
11
11
 
12
+
13
+ == 0.21.2 <- 0.21.0
14
+
15
+ 1. The new 'nice' dispatching alogirthm is enabled by default. If
16
+ your app needs more general url dispatching you can enable the
17
+ old dispatcher with the following line:
18
+
19
+ require 'nitro/dispatcher/general'
20
+
21
+
12
22
  == 0.21.0 <- 0.20.0
13
23
 
14
24
  1. The helper methods for starting the application and defining
@@ -1,4 +1,20 @@
1
- == Version 0.21.0
1
+ == Version 0.21.2
2
+
3
+ This is mainly a bug fix release. Some minor features are
4
+ implemented:
5
+
6
+ * Plugable dispatchers. A new dispatcher that implicitly handles
7
+ nice urls is enabled by default. You can easily change to the
8
+ old general dispatcher though.
9
+
10
+ * Better markup setup.
11
+
12
+ * Cookie Helpers.
13
+
14
+ * Important bug fixes in Og.
15
+
16
+
17
+ == Version 0.21.0 was released on 25-07-2005
2
18
 
3
19
  Nitro goes from strength to strength as the community gets bigger.
4
20
  Great new features were introduced and a lot of effort
@@ -1,7 +1,13 @@
1
1
  = Configuration parameters
2
2
 
3
3
  This file presents a complete list of Nitro Configuration
4
- Parameters.
4
+ Parameters.
5
+
6
+ INFO: To browse a documented listing of an application's settings
7
+ point your browser to:
8
+
9
+ http://www.myapp.com/settings.
10
+
5
11
 
6
12
  === Session.store_type = :memory
7
13
 
@@ -25,7 +25,7 @@ module Nitro
25
25
 
26
26
  # The version.
27
27
 
28
- Version = '0.21.0'
28
+ Version = '0.21.2'
29
29
 
30
30
  # Library path.
31
31
 
@@ -43,7 +43,7 @@ end
43
43
 
44
44
  require 'nitro/context'
45
45
  require 'nitro/controller'
46
- require 'nitro/dispatcher'
46
+ require 'nitro/dispatcher/nice'
47
47
  require 'nitro/render'
48
48
  require 'nitro/server'
49
49
 
@@ -0,0 +1,78 @@
1
+ # WARNING: Does not work yet!
2
+
3
+ require 'cgi'
4
+ require 'scgi'
5
+ require 'stringio'
6
+
7
+ require 'nitro/context'
8
+ require 'nitro/dispatcher'
9
+ require 'nitro/adapter/cgi'
10
+
11
+ # Speeds things up, more comaptible with OSX.
12
+
13
+ Socket.do_not_reverse_lookup = true
14
+
15
+ module Nitro
16
+
17
+ # SCGI Adaptor.
18
+ # No need for connection pooling, SCGI uses processes.
19
+
20
+ class Scgi
21
+
22
+ # A special modification so that we can make the socket and then pass it in.
23
+ # Should generalize this since it will be pretty common.
24
+
25
+ class Listener < Myriad::Listener
26
+ def initialize(socket, server_class, *params)
27
+ @socket = socket
28
+ @server_class = server_class
29
+ @params = params
30
+ @tick = [3,0] # this is just here until I can figure out the signals crap
31
+ Event::set(self, @socket.fileno, Event::READ | Event::TIMEOUT)
32
+ Event::add(self, @tick)
33
+ end
34
+ end
35
+
36
+ class SCGINitro < ::SCGI::SCGIServer
37
+ def process_request(data)
38
+ context = Context.new(Nitro::Server.new)
39
+
40
+ context.in = SCGIFixed.new(@request, data)
41
+ context.headers = cgi.env
42
+
43
+ CgiUtils.parse_params(context)
44
+ CgiUtils.parse_cookies(context)
45
+
46
+ context.render(context.path)
47
+
48
+ body = ''
49
+ body << CgiUtils.response_headers(context)
50
+ body << context.out
51
+
52
+ @trans.write(body)
53
+
54
+ super(data)
55
+ end
56
+ end
57
+
58
+ def self.start(server)
59
+ children = "5"
60
+ host = "127.0.0.0"
61
+ port = "8888"
62
+
63
+ socket = TCPServer.new(host, port)
64
+ socket.fcntl(Fcntl::F_SETFL, socket.fcntl(Fcntl::F_GETFL) | Fcntl::O_NONBLOCK)
65
+
66
+ children.to_i.times do
67
+ pid = fork do
68
+ Event::init(10)
69
+ server = Listener.new(socket, SCGINitro)
70
+ Event::dispatch
71
+ end
72
+ Process.detach(pid)
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -126,21 +126,19 @@ class Compiler
126
126
  code << "#{params.join(';')}"
127
127
  end
128
128
 
129
- # Try to resolve action parameters.
129
+ # Try to resolve action parameters. Returns negative
130
+ # numbers for arbitrary parameters.
130
131
 
131
132
  param_count = klass.instance_method(action.intern).arity
132
133
 
133
- # gmosx, FIXME: REIMPLEMENT THIS!!!!
134
-
135
- if param_count > 0
134
+ if param_count != 0
136
135
  code << %{
137
136
  params = []
138
- qs = context.query_string.split(/[&;]/)
139
-
140
- #{param_count}.times do |i|
141
- params << qs.shift.split(/=/).last
142
- end
143
-
137
+ if context.query_string
138
+ context.query_string.split(/[&;]/).each do |qs|
139
+ params << qs.split(/=/).last
140
+ end
141
+ end
144
142
  action_return_value = #{action}(*params)
145
143
  }
146
144
  else
@@ -36,7 +36,7 @@ class ActionMeta < Hash
36
36
 
37
37
  # Initialize the metadata.
38
38
 
39
- def initialize(options)
39
+ def initialize(options = {})
40
40
  @params = {}
41
41
  update(options)
42
42
  end
@@ -114,7 +114,7 @@ module Publishable
114
114
  base.module_eval do
115
115
  def self.alias_action(new, old)
116
116
  alias_method new, old
117
- md = action_metadata[old] || ActionMetadata.new
117
+ md = action_metadata[old] || ActionMeta.new
118
118
  md[:view] = old
119
119
  action_metadata[new] = md
120
120
  end
@@ -166,8 +166,22 @@ module Publishable
166
166
  end
167
167
  end
168
168
  end
169
-
169
+
170
+ # Cookie helpers.
171
+
172
+ base.module_eval do
173
+ private
174
+
175
+ def cookies
176
+ @context.cookies
177
+ end
178
+
179
+ def send_cookie(name, value = nil)
180
+ @context.add_cookie(name, value)
181
+ end
182
+ end
170
183
  end
184
+
171
185
  end
172
186
 
173
187
  # The Controller part in the MVC paradigm. The controller's
@@ -12,9 +12,9 @@ class Dispatcher
12
12
 
13
13
  include Router
14
14
 
15
- # The map.
15
+ # The dispatcher specialization used.
16
16
 
17
- setting :map, :default => { '/' => SimpleController }, :doc => 'The controller map'
17
+ setting :mode, :default => :nice, :doc => 'The dispatcher specialization used'
18
18
 
19
19
  unless const_defined? :ROOT
20
20
  ROOT = '/'
@@ -149,45 +149,8 @@ class Dispatcher
149
149
  #++
150
150
 
151
151
  def dispatch(path, context = nil)
152
- path = route(path, context)
153
-
154
- parts = path.split('/')
155
- parts.shift
156
-
157
- case parts.size
158
- when 0
159
- # / -> root.index
160
- base = '/'
161
- klass = controller_class_for(base)
162
- action = 'index'
163
-
164
- when 1
165
- base = "/#{parts[0]}"
166
- if klass = controller_class_for(base)
167
- # controller/ -> controller.index
168
- action = 'index'
169
- else
170
- # action/ -> root.action
171
- base = '/'
172
- klass = controller_class_for(base)
173
- action = parts[0]
174
- end
175
-
176
- else
177
- base = "/#{parts[0]}"
178
- if klass = controller_class_for(base)
179
- # controller/action -> controller.action
180
- parts.shift
181
- action = parts.join('__')
182
- else
183
- # action/ -> root.action
184
- base = '/'
185
- klass = controller_class_for(base)
186
- action = parts.join('__')
187
- end
188
- end
189
-
190
- return klass, "#{action}_action", base
152
+ # Specialize in your application or use the default
153
+ # specializations in lib/nitro/dispatcher/*
191
154
  end
192
155
  alias_method :split_path, :dispatch
193
156
 
@@ -0,0 +1,62 @@
1
+ require 'nitro/dispatcher'
2
+
3
+ module Nitro
4
+
5
+ # Specialize the Dispatcher to handle general urls. This is
6
+ # useful for PHP/ASP style programming.
7
+
8
+ class Dispatcher
9
+
10
+ # An alternative dispatching algorithm that handles
11
+ # general urls. Action containing '/' separators look for
12
+ # templates in subdirectories. The '/' char is converted
13
+ # to '__' to find the actual action.
14
+
15
+ def dispatch(path, context = nil)
16
+ path = route(path, context)
17
+
18
+ parts = path.split('/')
19
+ parts.shift
20
+
21
+ case parts.size
22
+ when 0
23
+ # / -> root.index
24
+ base = '/'
25
+ klass = controller_class_for(base)
26
+ action = 'index'
27
+
28
+ when 1
29
+ base = "/#{parts[0]}"
30
+ if klass = controller_class_for(base)
31
+ # controller/ -> controller.index
32
+ action = 'index'
33
+ else
34
+ # action/ -> root.action
35
+ base = '/'
36
+ klass = controller_class_for(base)
37
+ action = parts[0]
38
+ end
39
+
40
+ else
41
+ base = "/#{parts[0]}"
42
+ if klass = controller_class_for(base)
43
+ # controller/action -> controller.action
44
+ parts.shift
45
+ action = parts.join('__')
46
+ else
47
+ # action/ -> root.action
48
+ base = '/'
49
+ klass = controller_class_for(base)
50
+ action = parts.join('__')
51
+ end
52
+ end
53
+
54
+ return klass, "#{action}_action", base
55
+ end
56
+ end
57
+
58
+ Dispatcher.mode = :general
59
+
60
+ end
61
+
62
+ # * George Moschovitis <gm@navel.gr>
@@ -0,0 +1,41 @@
1
+ require 'nitro/dispatcher'
2
+
3
+ module Nitro
4
+
5
+ # Specialize the Dispatcher to handle implicit 'nice' urls.
6
+
7
+ class Dispatcher
8
+
9
+ # An alternative dispatching algorithm that handles
10
+ # implicit nice urls. Subdirectories are not supported.
11
+
12
+ def dispatch(path, context)
13
+ path = route(path, context)
14
+
15
+ parts = path.split('/')
16
+ parts.shift # get rid of the leading '/'.
17
+
18
+ if klass = controller_class_for("/#{parts.first}")
19
+ base = "/#{parts.shift}"
20
+ else
21
+ base = ROOT
22
+ klass = controller_class_for(ROOT)
23
+ end
24
+
25
+ unless action = parts.shift
26
+ action = 'index'
27
+ end
28
+
29
+ unless parts.empty?
30
+ context.headers['QUERY_STRING'] = "#{parts.join(';')}#{context.headers['QUERY_STRING']}"
31
+ end
32
+
33
+ return klass, "#{action}_action", base
34
+ end
35
+ end
36
+
37
+ Dispatcher.mode = :nice
38
+
39
+ end
40
+
41
+ # * George Moschovitis <gm@navel.gr>
@@ -1,58 +1,11 @@
1
1
  require 'singleton'
2
2
  require 'redcloth'
3
+ require 'cgi'
3
4
 
4
- require 'glue/property'
5
5
  require 'glue/sanitize'
6
6
 
7
7
  module Nitro
8
8
 
9
- #--
10
- # Override the default PropertyUtils implementation to
11
- # add markup support.
12
- #++
13
- =begin
14
- module PropertyUtils
15
- # Override to add markup code.
16
- #
17
- def self.prop_setter(prop)
18
- s = prop.symbol
19
- if markup = prop.meta[:markup]
20
- # if true, set to default Markup
21
- markup = Nitro::Markup if true == markup
22
-
23
- code = %{
24
- def #{s}=(val)
25
- }
26
-
27
- if Property.type_checking
28
- code << %{
29
- unless String == val.class
30
- raise "Invalid type, expected '#{prop.klass}', is '\#\{val.class\}'."
31
- end
32
- }
33
- end
34
-
35
- code << %{
36
- @#{s} = #{markup}.expand(val)
37
- end
38
-
39
- def compact_#{s}
40
- #{markup}.compact(@#{s})
41
- end
42
- }
43
-
44
- return code
45
- else
46
- return %{
47
- def #{s}=(val)
48
- @#{s} = val
49
- end
50
- }
51
- end
52
- end
53
- end
54
- =end
55
-
56
9
  # Generalised Markup transformations.
57
10
  #
58
11
  # The expand methods evaluate (expand) the markup
@@ -68,7 +21,7 @@ end
68
21
  #
69
22
  # Define your custom markup methods like this:
70
23
  #
71
- # module Markup
24
+ # module MarkupMixin
72
25
  # def markup_simple
73
26
  # ...
74
27
  # end
@@ -130,12 +83,36 @@ private
130
83
 
131
84
  def clear(str)
132
85
  end
86
+
87
+ def escape(str)
88
+ CGI.escape(str.gsub(/ /, '_'))
89
+ end
90
+
91
+ def unescape(str)
92
+ CGI.unescape(str.gsub(/_/, ' '))
93
+ end
94
+
95
+ class << self
96
+ # Helper method for manipulating the sanitize transformation.
97
+
98
+ def setup_sanitize_transform(&block)
99
+ self.send :define_method, :sanitize, block
100
+ end
101
+ alias_method :setup_sanitize_transformation, :setup_sanitize_transform
102
+
103
+ # Helper method for manipulating the markup transformation.
104
+
105
+ def setup_markup_transform(&block)
106
+ self.send :define_method, :markup, block
107
+ end
108
+ alias_method :setup_markup_transformation, :setup_markup_transform
109
+ end
133
110
  end
134
111
 
135
112
  # An abstract Markup class.
136
113
 
137
- class Markuper
138
- include Singleton
114
+ class MarkupKit
115
+ extend Markup
139
116
  include Markup
140
117
  end
141
118
 
@@ -140,11 +140,12 @@ private
140
140
  raise RenderExit
141
141
  end
142
142
 
143
- # Redirect to the referer of this method.
143
+ # Redirect to the referer.
144
144
 
145
145
  def redirect_referer(postfix = nil, status = 303)
146
146
  redirect("#{@context.referer}#{postfix}", status)
147
147
  end
148
+ alias_method :redirect_to_referer, :redirect_referer
148
149
 
149
150
  # Log a rendering error.
150
151
 
@@ -56,7 +56,11 @@ class Server
56
56
  # Additional server options. Useful to pass options to
57
57
  # Webrick for example.
58
58
 
59
- attr_accessor :options
59
+ attr_accessor :options
60
+
61
+ # The access_log for this server, used by Webrick.
62
+
63
+ attr_accessor :access_log
60
64
 
61
65
  def initialize(name = 'Nitro', options = {})
62
66
  @name = name
@@ -119,17 +119,22 @@ class Runner
119
119
  @server = :webrick
120
120
  end
121
121
 
122
- opts.on('-l', '--lhttpd', 'Use a lighttpd server.') do
122
+ opts.on('-l', '--lhttpd', 'Use a lighttpd server (FastCGI).') do
123
123
  @server = :lhttpd
124
124
  Logger.set(Logger.new('log/app.log'))
125
125
  end
126
126
 
127
+ opts.on('-l', '--lhttpd-scgi', 'Use the SCGI adapter (Lighttpd).') do
128
+ @server = :lhttpd_scgi
129
+ Logger.set(Logger.new('log/app.log'))
130
+ end
131
+
127
132
  opts.on('-a', '--apache', 'Use an apache server.') do
128
133
  @server = :apache
129
134
  Logger.set(Logger.new('log/app.log'))
130
135
  end
131
136
 
132
- opts.on('--apache-cgi', 'Run as CGI (Apache)') do
137
+ opts.on('--apache-cgi', 'Use the CGI adapter (Apache)') do
133
138
  @server = :cgi
134
139
  Logger.set(Logger.new('log/app.log'))
135
140
  end
@@ -225,6 +230,10 @@ class Runner
225
230
  if 'fcgi_proc' == ENV['NITRO_INVOKE']
226
231
  require 'nitro/adapter/fastcgi'
227
232
  FastCGI.start(server)
233
+
234
+ elsif 'scgi_proc' == ENV['NITRO_INVOKE']
235
+ require 'nitro/adapter/scgi'
236
+ Scgi.start(server)
228
237
 
229
238
  elsif 'cgi_proc' == ENV['NITRO_INVOKE']
230
239
  require 'nitro/adapter/cgi'
@@ -272,6 +281,10 @@ class Runner
272
281
  require 'nitro/adapter/fastcgi'
273
282
  `lighttpd -f conf/lhttpd.conf`
274
283
 
284
+ when :lhttpd_scgi
285
+ require 'nitro/adapter/scgi'
286
+ `lighttpd -f conf/lhttpd_scgi.conf`
287
+
275
288
  when :apache
276
289
  require 'nitro/adapter/fastcgi'
277
290
  `apachectl -d #{Dir.pwd} -f conf/apache.conf -k start`
@@ -41,7 +41,7 @@
41
41
  <?r
42
42
  extract = error.source_extract.split("\n")
43
43
  extract.each_with_index do |line, idx|
44
- line = Nitro::Markup.expand(line)
44
+ line = Nitro::Markuper.instance.send(:expand, line)
45
45
  if 4 == idx
46
46
  ?>
47
47
  <div style="background: #eee">#{line}</div>
File without changes
@@ -2,6 +2,7 @@ $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'lib')
2
2
 
3
3
  require 'test/unit'
4
4
  require 'nitro/dispatcher'
5
+ require 'nitro/dispatcher/general'
5
6
 
6
7
  class TC_Dispatcher < Test::Unit::TestCase # :nodoc: all
7
8
  include Nitro
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
3
3
  specification_version: 1
4
4
  name: nitro
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.21.0
7
- date: 2005-07-25 00:00:00 +03:00
6
+ version: 0.21.2
7
+ date: 2005-07-28 00:00:00 +03:00
8
8
  summary: Nitro Web Engine
9
9
  require_paths:
10
10
  - lib
@@ -75,6 +75,7 @@ files:
75
75
  - proto/public/cgi.rb
76
76
  - proto/public/error.xhtml
77
77
  - proto/public/fcgi.rb
78
+ - proto/public/robots.txt
78
79
  - proto/public/media/nitro.png
79
80
  - proto/public/js/prototype.js
80
81
  - proto/public/js/dragdrop.js
@@ -94,6 +95,7 @@ files:
94
95
  - lib/nitro/mail.rb
95
96
  - lib/nitro/dispatcher.rb
96
97
  - lib/nitro/context.rb
98
+ - lib/nitro/dispatcher
97
99
  - lib/nitro/request.rb
98
100
  - lib/nitro/mixin
99
101
  - lib/nitro/caching.rb
@@ -122,12 +124,15 @@ files:
122
124
  - lib/nitro/adapter/fastcgi.rb
123
125
  - lib/nitro/adapter/cgi.rb
124
126
  - lib/nitro/adapter/webrick.rb
127
+ - lib/nitro/adapter/scgi.rb
125
128
  - lib/nitro/caching/invalidation.rb
126
129
  - lib/nitro/caching/stores.rb
127
130
  - lib/nitro/caching/actions.rb
128
131
  - lib/nitro/caching/output.rb
129
132
  - lib/nitro/caching/fragments.rb
130
133
  - lib/nitro/element/java_script.rb
134
+ - lib/nitro/dispatcher/nice.rb
135
+ - lib/nitro/dispatcher/general.rb
131
136
  - lib/nitro/mixin/debug.rb
132
137
  - lib/nitro/mixin/pager.rb
133
138
  - lib/nitro/mixin/markup.rb
@@ -203,7 +208,7 @@ dependencies:
203
208
  -
204
209
  - "="
205
210
  - !ruby/object:Gem::Version
206
- version: 0.21.0
211
+ version: 0.21.2
207
212
  version:
208
213
  - !ruby/object:Gem::Dependency
209
214
  name: og
@@ -213,7 +218,7 @@ dependencies:
213
218
  -
214
219
  - "="
215
220
  - !ruby/object:Gem::Version
216
- version: 0.21.0
221
+ version: 0.21.2
217
222
  version:
218
223
  - !ruby/object:Gem::Dependency
219
224
  name: ruby-breakpoint