nitro 0.21.0 → 0.21.2

Sign up to get free protection for your applications and to get access to all the features.
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