Capcode 0.5.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +44 -37
- data/doc/rdoc/classes/Capcode.html +235 -219
- data/doc/rdoc/classes/Capcode/HTTPError.html +1 -1
- data/doc/rdoc/classes/Capcode/Helpers.html +68 -53
- data/doc/rdoc/classes/Capcode/RenderError.html +129 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/README.html +59 -36
- data/doc/rdoc/files/lib/capcode_rb.html +2 -1
- data/examples/sample.rb +4 -4
- data/examples/test/index.html +1 -0
- data/lib/capcode.rb +135 -75
- data/lib/capcode/render/erb.rb +7 -3
- data/lib/capcode/render/haml.rb +7 -3
- data/lib/capcode/version.rb +1 -1
- metadata +23 -6
data/examples/sample.rb
CHANGED
@@ -76,8 +76,8 @@ module Capcode::Views
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
Capcode.map( "/file" ) do
|
80
|
-
Rack::File.new( "." )
|
81
|
-
end
|
79
|
+
#Capcode.map( "/file" ) do
|
80
|
+
# Rack::File.new( "." )
|
81
|
+
#end
|
82
82
|
|
83
|
-
Capcode.run( :port => 3001, :host => "localhost" )
|
83
|
+
Capcode.run( :port => 3001, :host => "localhost", :root => "." )
|
@@ -0,0 +1 @@
|
|
1
|
+
welcome in test directory
|
data/lib/capcode.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rack'
|
3
|
-
require 'json'
|
3
|
+
require 'json' ## DELETE THIS IN 1.0.0
|
4
4
|
require 'logger'
|
5
|
+
require 'mime/types'
|
5
6
|
require 'capcode/version'
|
6
7
|
require 'capcode/core_ext'
|
7
8
|
|
@@ -21,6 +22,11 @@ module Capcode
|
|
21
22
|
|
22
23
|
# Helpers contains methods available in your controllers
|
23
24
|
module Helpers
|
25
|
+
@@__ROOT_DIRECTORY = ""
|
26
|
+
def self.root=(p)
|
27
|
+
@@__ROOT_DIRECTORY=p
|
28
|
+
end
|
29
|
+
|
24
30
|
# Render a view
|
25
31
|
def render( h )
|
26
32
|
if h.class == Hash
|
@@ -46,7 +52,7 @@ module Capcode
|
|
46
52
|
# end
|
47
53
|
# end
|
48
54
|
# end
|
49
|
-
def json( d )
|
55
|
+
def json( d ) ## DELETE THIS IN 1.0.0
|
50
56
|
warn( "json is deprecated, please use `render( :json => ... )'" )
|
51
57
|
@response['Content-Type'] = 'application/json'
|
52
58
|
d.to_json
|
@@ -113,22 +119,66 @@ module Capcode
|
|
113
119
|
# end
|
114
120
|
# end
|
115
121
|
#
|
116
|
-
# Do the same (r500
|
122
|
+
# Do the same (r500, r501, r403) to customize 500, 501, 403 errors
|
117
123
|
class HTTPError
|
118
|
-
def initialize(app)#:nodoc:
|
124
|
+
def initialize(app, root)#:nodoc:
|
119
125
|
@app = app
|
126
|
+
@root = root
|
120
127
|
end
|
121
128
|
|
122
129
|
def call(env) #:nodoc:
|
123
|
-
|
130
|
+
@env = env
|
131
|
+
@status, @headers, @body = @app.call(@env)
|
124
132
|
|
125
|
-
if
|
126
|
-
|
127
|
-
|
133
|
+
if @status == 404
|
134
|
+
if @env["PATH_INFO"].include? ".."
|
135
|
+
@status = 403
|
136
|
+
@headers = {}
|
137
|
+
@body = '403 - Invalid path'
|
138
|
+
error
|
139
|
+
end
|
140
|
+
|
141
|
+
@path = File.join(@root, @env["PATH_INFO"])
|
142
|
+
begin
|
143
|
+
if File.file?(@path) && File.readable?(@path)
|
144
|
+
serving
|
145
|
+
else
|
146
|
+
tmpPath = File.join(@root, @env["PATH_INFO"], "index.html")
|
147
|
+
if File.file?(tmpPath) && File.readable?(tmpPath) # @env["PATH_INFO"][-1].chr == "/" &&
|
148
|
+
@path = tmpPath
|
149
|
+
serving
|
150
|
+
else
|
151
|
+
raise Errno::EPERM
|
152
|
+
end
|
153
|
+
end
|
154
|
+
rescue SystemCallError
|
155
|
+
error
|
156
|
+
end
|
157
|
+
else
|
158
|
+
error
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def serving #:nodoc:
|
163
|
+
body = open(@path).read
|
164
|
+
size = body.size
|
165
|
+
|
166
|
+
[200, {
|
167
|
+
"Last-Modified" => File.mtime(@path).httpdate,
|
168
|
+
"Content-Type" => (MIME::Types.type_for(@path)[0] || '/text/plain').to_s,
|
169
|
+
"Content-Length" => size.to_s
|
170
|
+
}, body]
|
171
|
+
end
|
172
|
+
|
173
|
+
def error #:nodoc:
|
174
|
+
if self.methods.include? "r#{@status}"
|
175
|
+
@body = self.send( "r#{@status}", @env['REQUEST_PATH'] )
|
176
|
+
@headers['Content-Length'] = @body.length.to_s
|
128
177
|
end
|
129
178
|
|
130
|
-
[status, headers, body]
|
179
|
+
[@status, @headers, @body]
|
131
180
|
end
|
181
|
+
|
132
182
|
end
|
133
183
|
|
134
184
|
class << self
|
@@ -279,6 +329,8 @@ module Capcode
|
|
279
329
|
# * <tt>:pid</tt> = PID file (default: $0.pid)
|
280
330
|
# * <tt>:daemonize</tt> = Daemonize application (default: false)
|
281
331
|
# * <tt>:db_config</tt> = database configuration file (default: database.yml)
|
332
|
+
# * <tt>:root</tt> = root directory (default: "." -- relative to the working directory)
|
333
|
+
# * <tt>:working_directory</tt> = Working directory (default: directory of the main.rb)
|
282
334
|
def run( args = {} )
|
283
335
|
conf = {
|
284
336
|
:port => args[:port]||3000,
|
@@ -288,79 +340,87 @@ module Capcode
|
|
288
340
|
:session => args[:session]||{},
|
289
341
|
:pid => args[:pid]||"#{$0}.pid",
|
290
342
|
:daemonize => args[:daemonize]||false,
|
291
|
-
:db_config => args[:db_config]||"database.yml"
|
343
|
+
:db_config => args[:db_config]||"database.yml",
|
344
|
+
:root => args[:root]||".",
|
345
|
+
:working_directory => args[:working_directory]||File.expand_path(File.dirname($0))
|
292
346
|
}
|
293
347
|
|
294
|
-
#
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
348
|
+
# Run in the Working directory
|
349
|
+
Dir.chdir( conf[:working_directory] ) do
|
350
|
+
# Set root directory for helpers
|
351
|
+
Capcode::Helpers.root = File.expand_path( conf[:root] )
|
352
|
+
|
353
|
+
# Check that mongrel exists
|
354
|
+
if conf[:server].nil? || conf[:server] == "mongrel"
|
355
|
+
begin
|
356
|
+
require 'mongrel'
|
357
|
+
conf[:server] = "mongrel"
|
358
|
+
rescue LoadError
|
359
|
+
puts "!! could not load mongrel. Falling back to webrick."
|
360
|
+
conf[:server] = "webrick"
|
361
|
+
end
|
302
362
|
end
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
363
|
+
|
364
|
+
Capcode.constants.each do |k|
|
365
|
+
begin
|
366
|
+
if eval "Capcode::#{k}.public_methods(true).include?( '__urls__' )"
|
367
|
+
u, m, c = eval "Capcode::#{k}.__urls__"
|
368
|
+
u.keys.each do |_u|
|
369
|
+
raise Capcode::RouteError, "Route `#{_u}' already define !", caller if @@__ROUTES.keys.include?(_u)
|
370
|
+
@@__ROUTES[_u] = c.new
|
371
|
+
end
|
312
372
|
end
|
373
|
+
rescue => e
|
374
|
+
raise e.message
|
313
375
|
end
|
314
|
-
rescue => e
|
315
|
-
raise e.message
|
316
376
|
end
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
377
|
+
|
378
|
+
app = Rack::URLMap.new(@@__ROUTES)
|
379
|
+
app = Rack::Session::Cookie.new( app, conf[:session] )
|
380
|
+
app = Capcode::HTTPError.new(app, conf[:root])
|
381
|
+
app = Rack::ContentLength.new(app)
|
382
|
+
app = Rack::Lint.new(app)
|
383
|
+
app = Rack::ShowExceptions.new(app)
|
384
|
+
# app = Rack::Reloader.new(app) ## -- NE RELOAD QUE capcode.rb -- So !!!
|
385
|
+
app = Rack::CommonLogger.new( app, Logger.new(conf[:log]) )
|
386
|
+
|
387
|
+
# From rackup !!!
|
388
|
+
if conf[:daemonize]
|
389
|
+
if RUBY_VERSION < "1.9"
|
390
|
+
exit if fork
|
391
|
+
Process.setsid
|
392
|
+
exit if fork
|
393
|
+
# Dir.chdir "/"
|
394
|
+
File.umask 0000
|
395
|
+
STDIN.reopen "/dev/null"
|
396
|
+
STDOUT.reopen "/dev/null", "a"
|
397
|
+
STDERR.reopen "/dev/null", "a"
|
398
|
+
else
|
399
|
+
Process.daemon
|
400
|
+
end
|
401
|
+
|
402
|
+
File.open(conf[:pid], 'w'){ |f| f.write("#{Process.pid}") }
|
403
|
+
at_exit { File.delete(conf[:pid]) if File.exist?(conf[:pid]) }
|
404
|
+
end
|
405
|
+
|
406
|
+
# Start database
|
407
|
+
if self.methods.include? "db_connect"
|
408
|
+
db_connect( conf[:db_config], conf[:log] )
|
409
|
+
end
|
410
|
+
|
411
|
+
# Start server
|
412
|
+
case conf[:server]
|
413
|
+
when "mongrel"
|
414
|
+
puts "** Starting Mongrel on #{conf[:host]}:#{conf[:port]}"
|
415
|
+
Rack::Handler::Mongrel.run( app, {:Port => conf[:port], :Host => conf[:host]} ) { |server|
|
416
|
+
trap "SIGINT", proc { server.stop }
|
417
|
+
}
|
418
|
+
when "webrick"
|
419
|
+
puts "** Starting WEBrick on #{conf[:host]}:#{conf[:port]}"
|
420
|
+
Rack::Handler::WEBrick.run( app, {:Port => conf[:port], :BindAddress => conf[:host]} ) { |server|
|
421
|
+
trap "SIGINT", proc { server.shutdown }
|
422
|
+
}
|
341
423
|
end
|
342
|
-
|
343
|
-
File.open(conf[:pid], 'w'){ |f| f.write("#{Process.pid}") }
|
344
|
-
at_exit { File.delete(conf[:pid]) if File.exist?(conf[:pid]) }
|
345
|
-
end
|
346
|
-
|
347
|
-
# Start database
|
348
|
-
if self.methods.include? "db_connect"
|
349
|
-
db_connect( conf[:db_config], conf[:log] )
|
350
|
-
end
|
351
|
-
|
352
|
-
# Start server
|
353
|
-
case conf[:server]
|
354
|
-
when "mongrel"
|
355
|
-
puts "** Starting Mongrel on #{conf[:host]}:#{conf[:port]}"
|
356
|
-
Rack::Handler::Mongrel.run( app, {:Port => conf[:port], :Host => conf[:host]} ) { |server|
|
357
|
-
trap "SIGINT", proc { server.stop }
|
358
|
-
}
|
359
|
-
when "webrick"
|
360
|
-
puts "** Starting WEBrick on #{conf[:host]}:#{conf[:port]}"
|
361
|
-
Rack::Handler::WEBrick.run( app, {:Port => conf[:port], :BindAddress => conf[:host]} ) { |server|
|
362
|
-
trap "SIGINT", proc { server.shutdown }
|
363
|
-
}
|
364
424
|
end
|
365
425
|
end
|
366
426
|
|
data/lib/capcode/render/erb.rb
CHANGED
@@ -2,9 +2,9 @@ require 'erb'
|
|
2
2
|
|
3
3
|
module Capcode
|
4
4
|
module Helpers
|
5
|
-
@@__ERB_PATH__ =
|
5
|
+
@@__ERB_PATH__ = "."
|
6
6
|
def self.erb_path=( p )
|
7
|
-
@@__ERB_PATH__ =
|
7
|
+
@@__ERB_PATH__ = p
|
8
8
|
end
|
9
9
|
|
10
10
|
def render_erb( f )
|
@@ -12,7 +12,11 @@ module Capcode
|
|
12
12
|
if f.include? '..'
|
13
13
|
return [403, {}, '403 - Invalid path']
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
|
+
unless( @@__ERB_PATH__[0].chr == "/" )
|
17
|
+
@@__ERB_PATH__ = File.expand_path( File.join(@@__ROOT_DIRECTORY, @@__ERB_PATH__) )
|
18
|
+
end
|
19
|
+
|
16
20
|
f = f + ".rhtml" if File.extname( f ) != ".rhtml"
|
17
21
|
file = File.join( @@__ERB_PATH__, f )
|
18
22
|
ERB.new(open(file).read).result(binding)
|
data/lib/capcode/render/haml.rb
CHANGED
@@ -2,9 +2,9 @@ require "haml"
|
|
2
2
|
|
3
3
|
module Capcode
|
4
4
|
module Helpers
|
5
|
-
@@__HAML_PATH__ =
|
5
|
+
@@__HAML_PATH__ = "."
|
6
6
|
def self.haml_path=( p )
|
7
|
-
@@__HAML_PATH__ =
|
7
|
+
@@__HAML_PATH__ = p
|
8
8
|
end
|
9
9
|
|
10
10
|
def render_haml( f ) #:nodoc:
|
@@ -12,7 +12,11 @@ module Capcode
|
|
12
12
|
if f.include? '..'
|
13
13
|
return [403, {}, '403 - Invalid path']
|
14
14
|
end
|
15
|
-
|
15
|
+
|
16
|
+
unless( @@__HAML_PATH__[0].chr == "/" )
|
17
|
+
@@__HAML_PATH__ = File.expand_path( File.join(@@__ROOT_DIRECTORY, @@__HAML_PATH__) )
|
18
|
+
end
|
19
|
+
|
16
20
|
f = f + ".haml" if File.extname( f ) != ".haml"
|
17
21
|
file = File.join( @@__HAML_PATH__, f )
|
18
22
|
Haml::Engine.new( open( file ).read ).to_html( self )
|
data/lib/capcode/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Capcode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Gr\xC3\xA9goire Lejeune"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-09 00:00:00 +02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -22,6 +22,16 @@ dependencies:
|
|
22
22
|
- !ruby/object:Gem::Version
|
23
23
|
version: "0"
|
24
24
|
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: mime-types
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
25
35
|
description: Capcode is a web microframework
|
26
36
|
email: gregoire.lejeune@free.fr
|
27
37
|
executables: []
|
@@ -40,6 +50,7 @@ files:
|
|
40
50
|
- setup.rb
|
41
51
|
- doc/rdoc/classes/Capcode/Helpers.html
|
42
52
|
- doc/rdoc/classes/Capcode/HTTPError.html
|
53
|
+
- doc/rdoc/classes/Capcode/RenderError.html
|
43
54
|
- doc/rdoc/classes/Capcode/Views.html
|
44
55
|
- doc/rdoc/classes/Capcode.html
|
45
56
|
- doc/rdoc/created.rid
|
@@ -70,13 +81,19 @@ files:
|
|
70
81
|
- examples/my_blog.db
|
71
82
|
- examples/sample.rb
|
72
83
|
- examples/session.rb
|
84
|
+
- examples/test/index.html
|
73
85
|
has_rdoc: true
|
74
86
|
homepage: http://algorithmique.net
|
75
87
|
licenses: []
|
76
88
|
|
77
|
-
post_install_message:
|
78
|
-
|
79
|
-
|
89
|
+
post_install_message: |+
|
90
|
+
|
91
|
+
If you want to use Markaby renderer, you must install Markaby.
|
92
|
+
If you want to use HAML renderer, you must install haml.
|
93
|
+
|
94
|
+
If For more information about Capcode, see
|
95
|
+
http://capcode.rubyforge.org"
|
96
|
+
|
80
97
|
rdoc_options:
|
81
98
|
- --quiet
|
82
99
|
- --title
|
@@ -106,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
123
|
requirements: []
|
107
124
|
|
108
125
|
rubyforge_project: capcode
|
109
|
-
rubygems_version: 1.3.
|
126
|
+
rubygems_version: 1.3.4
|
110
127
|
signing_key:
|
111
128
|
specification_version: 3
|
112
129
|
summary: Capcode is a web microframework
|