Capcode 0.9.3 → 0.9.4
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/README.rdoc +7 -0
- data/doc/rdoc/classes/Capcode.html +421 -406
- data/doc/rdoc/classes/Capcode/HTTPError.html +14 -0
- data/doc/rdoc/classes/Capcode/Helpers.html +137 -119
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/README_rdoc.html +23 -1
- data/doc/rdoc/files/lib/capcode/render/text_rb.html +1 -1
- data/doc/rdoc/files/lib/capcode_rb.html +4 -2
- data/examples/route.rb +68 -0
- data/examples/upload.rb +1 -1
- data/lib/capcode.rb +105 -74
- data/lib/capcode/ext/rack/urlmap.rb +59 -0
- data/lib/capcode/render/text.rb +1 -0
- data/lib/capcode/version.rb +1 -1
- metadata +42 -8
data/examples/upload.rb
CHANGED
@@ -12,7 +12,7 @@ module Capcode
|
|
12
12
|
def post
|
13
13
|
FileUtils.cp(
|
14
14
|
params["upfile"][:tempfile].path,
|
15
|
-
File.join( static[:path], params["upfile"][:filename] )
|
15
|
+
::File.join( static[:path], params["upfile"][:filename] )
|
16
16
|
)
|
17
17
|
render :static => params["upfile"][:filename]
|
18
18
|
end
|
data/lib/capcode.rb
CHANGED
@@ -6,7 +6,7 @@ require 'logger'
|
|
6
6
|
Logger.class_eval { alias :write :<< } unless Logger.instance_methods.include? "write"
|
7
7
|
require 'optparse'
|
8
8
|
require 'irb'
|
9
|
-
require '
|
9
|
+
require 'active_support'
|
10
10
|
require 'capcode/version'
|
11
11
|
require 'capcode/core_ext'
|
12
12
|
require 'capcode/helpers/auth'
|
@@ -14,17 +14,9 @@ require 'capcode/render/text'
|
|
14
14
|
require 'capcode/configuration'
|
15
15
|
require 'capcode/filters'
|
16
16
|
|
17
|
+
require 'capcode/ext/rack/urlmap'
|
18
|
+
|
17
19
|
module Capcode
|
18
|
-
#@@__ROUTES = {}
|
19
|
-
#@@__STATIC_DIR = nil
|
20
|
-
#@@__APP = nil
|
21
|
-
|
22
|
-
# @@__FILTERS = []
|
23
|
-
# def self.before_filter( opts, &b )
|
24
|
-
# opts[:action] = b
|
25
|
-
# @@__FILTERS << opts
|
26
|
-
# end
|
27
|
-
|
28
20
|
class ParameterError < ArgumentError #:nodoc: all
|
29
21
|
end
|
30
22
|
|
@@ -42,7 +34,6 @@ module Capcode
|
|
42
34
|
|
43
35
|
# Helpers contains methods available in your controllers
|
44
36
|
module Helpers
|
45
|
-
#@@__ARGS__ = nil
|
46
37
|
def self.args
|
47
38
|
@args ||= nil
|
48
39
|
end
|
@@ -85,33 +76,32 @@ module Capcode
|
|
85
76
|
render_type = nil
|
86
77
|
possible_code_renderer = nil
|
87
78
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
raise Capcode::RenderError, "Can't use multiple renderer (`#{render_type}' and `#{key}') !", caller
|
102
|
-
end
|
103
|
-
render_type = key
|
104
|
-
end
|
105
|
-
|
106
|
-
if key.class == Fixnum
|
107
|
-
possible_code_renderer = key
|
79
|
+
hash.keys.each do |key|
|
80
|
+
begin
|
81
|
+
gem "capcode-render-#{key.to_s}"
|
82
|
+
require "capcode/render/#{key.to_s}"
|
83
|
+
rescue Gem::LoadError
|
84
|
+
nil
|
85
|
+
rescue LoadError
|
86
|
+
raise Capcode::RenderError, "Hum... The #{key} renderer is malformated! Please try to install a new version or use an other renderer!", caller
|
87
|
+
end
|
88
|
+
|
89
|
+
if self.respond_to?("render_#{key.to_s}")
|
90
|
+
unless render_type.nil?
|
91
|
+
raise Capcode::RenderError, "Can't use multiple renderer (`#{render_type}' and `#{key}') !", caller
|
108
92
|
end
|
93
|
+
render_type = key
|
109
94
|
end
|
110
95
|
|
111
|
-
if
|
112
|
-
|
96
|
+
if key.class == Fixnum
|
97
|
+
possible_code_renderer = key
|
113
98
|
end
|
114
99
|
end
|
100
|
+
|
101
|
+
if render_type.nil? and possible_code_renderer.nil?
|
102
|
+
raise Capcode::RenderError, "Renderer type not specified!", caller
|
103
|
+
end
|
104
|
+
|
115
105
|
unless self.respond_to?("render_#{render_type.to_s}")
|
116
106
|
if possible_code_renderer.nil?
|
117
107
|
raise Capcode::RenderError, "#{render_type} renderer not present ! please require 'capcode/render/#{render_type}'", caller
|
@@ -123,7 +113,8 @@ module Capcode
|
|
123
113
|
k = k.to_s.split(/_/).map{|e| e.capitalize}.join("-")
|
124
114
|
header[k] = v
|
125
115
|
end
|
126
|
-
|
116
|
+
|
117
|
+
[code, header, body]
|
127
118
|
end
|
128
119
|
else
|
129
120
|
render_name = hash.delete(render_type)
|
@@ -212,17 +203,39 @@ module Capcode
|
|
212
203
|
# URL( Capcode::Hello, "you" ) # => /hello/you
|
213
204
|
def URL( klass, *a )
|
214
205
|
path = nil
|
206
|
+
result = {}
|
207
|
+
|
215
208
|
a = a.delete_if{ |x| x.nil? }
|
216
209
|
|
217
210
|
if klass.class == Class
|
218
|
-
|
219
|
-
|
211
|
+
last_size = 0
|
212
|
+
|
213
|
+
klass.__urls__[0].each do |cpath, regexp|
|
214
|
+
data = a.clone
|
215
|
+
|
216
|
+
n = Regexp.new( regexp ).number_of_captures
|
217
|
+
equart = (a.size - n).abs
|
218
|
+
|
219
|
+
rtable = regexp.dup.gsub( /\\\(/, "" ).gsub( /\\\)/, "" ).split( /\([^\)]*\)/ )
|
220
|
+
|
221
|
+
rtable.each do |r|
|
222
|
+
if r == ""
|
223
|
+
cpath = cpath + "/#{data.shift}"
|
224
|
+
else
|
225
|
+
cpath = cpath + "/#{r}"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
cpath = (cpath + "/" + data.join( "/" )).gsub( /\/\//, "/" ).gsub( /\/$/, "" )
|
230
|
+
result[equart] = cpath
|
220
231
|
end
|
232
|
+
|
233
|
+
path = result[result.keys.min]
|
221
234
|
else
|
222
235
|
path = klass
|
223
236
|
end
|
224
237
|
|
225
|
-
(ENV['RACK_BASE_URI']||'')+path
|
238
|
+
(ENV['RACK_BASE_URI']||'')+path
|
226
239
|
end
|
227
240
|
|
228
241
|
# Calling content_for stores a block of markup in an identifier.
|
@@ -258,7 +271,6 @@ module Capcode
|
|
258
271
|
# end
|
259
272
|
# end
|
260
273
|
def content_for( x )
|
261
|
-
#if @@__ARGS__.map{|_| _.to_s }.include?(x.to_s)
|
262
274
|
if Capcode::Helpers.args.map{|_| _.to_s }.include?(x.to_s)
|
263
275
|
yield
|
264
276
|
end
|
@@ -293,6 +305,18 @@ module Capcode
|
|
293
305
|
# end
|
294
306
|
# end
|
295
307
|
#
|
308
|
+
# the rXXX method can also receive a second optional parameter corresponding
|
309
|
+
# of the header's Hash :
|
310
|
+
#
|
311
|
+
# module Capcode
|
312
|
+
# class HTTPError
|
313
|
+
# def r404(f, h)
|
314
|
+
# h['Content-Type'] = 'text/plain'
|
315
|
+
# "You are here ---> X (#{f} point)"
|
316
|
+
# end
|
317
|
+
# end
|
318
|
+
# end
|
319
|
+
#
|
296
320
|
# Do the same (r500, r501, r403) to customize 500, 501, 403 errors
|
297
321
|
class HTTPError
|
298
322
|
def initialize(app) #:nodoc:
|
@@ -301,16 +325,23 @@ module Capcode
|
|
301
325
|
|
302
326
|
def call(env) #:nodoc:
|
303
327
|
status, headers, body = @app.call(env)
|
304
|
-
|
305
328
|
if self.methods.include? "r#{status}"
|
306
|
-
|
329
|
+
headers.delete('Content-Type') if headers.keys.include?('Content-Type')
|
330
|
+
body = begin
|
331
|
+
self.send( "r#{status}", env['REQUEST_PATH'], headers )
|
332
|
+
rescue
|
333
|
+
self.send( "r#{status}", env['REQUEST_PATH'] )
|
334
|
+
end
|
307
335
|
headers['Content-Length'] = body.length.to_s
|
336
|
+
headers['Content-Type'] = "text/html" unless headers.keys.include?('Content-Type')
|
308
337
|
end
|
309
338
|
|
310
339
|
[status, headers, body]
|
311
340
|
end
|
312
341
|
end
|
313
342
|
|
343
|
+
require 'capcode/response'
|
344
|
+
|
314
345
|
class << self
|
315
346
|
attr :__auth__, true #:nodoc:
|
316
347
|
|
@@ -332,8 +363,10 @@ module Capcode
|
|
332
363
|
#
|
333
364
|
# If the regexp in the route does not match, all arguments will be <tt>nil</tt>
|
334
365
|
def Route *routes_paths
|
366
|
+
create_path = routes_paths[0].nil?
|
335
367
|
Class.new {
|
336
368
|
meta_def(:__urls__) {
|
369
|
+
routes_paths = ['/'+self.to_s.gsub( /^Capcode::/, "" ).underscore] if create_path == true
|
337
370
|
# < Route '/hello/world/([^\/]*)/id(\d*)', '/hello/(.*)', :agent => /Songbird (\d\.\d)[\d\/]*?/
|
338
371
|
# # => [ {'/hello/world' => '([^\/]*)/id(\d*)', '/hello' => '(.*)'},
|
339
372
|
# 2,
|
@@ -391,21 +424,6 @@ module Capcode
|
|
391
424
|
@response = Rack::Response.new
|
392
425
|
@request = Rack::Request.new(@env)
|
393
426
|
|
394
|
-
# __k = self.class.to_s.split( /::/ )[-1].downcase.to_sym
|
395
|
-
# @@__FILTERS.each do |f|
|
396
|
-
# proc = f.delete(:action)
|
397
|
-
# __run = true
|
398
|
-
# if f[:only]
|
399
|
-
# __run = f[:only].include?(__k)
|
400
|
-
# end
|
401
|
-
# if f[:except]
|
402
|
-
# __run = !f[:except].include?(__k)
|
403
|
-
# end
|
404
|
-
#
|
405
|
-
# # proc.call(self) if __run
|
406
|
-
# puts "call #{proc} for #{__k}"
|
407
|
-
# end
|
408
|
-
|
409
427
|
# Check authz
|
410
428
|
authz_options = nil
|
411
429
|
if Capcode.__auth__ and Capcode.__auth__.size > 0
|
@@ -441,14 +459,17 @@ module Capcode
|
|
441
459
|
xPath = p.gsub( /^\//, "" ).split( "/" )
|
442
460
|
if (xPath - aPath).size == 0
|
443
461
|
diffArgs = aPath - xPath
|
444
|
-
diffNArgs = diffArgs.size
|
462
|
+
diffNArgs = diffArgs.size - 1
|
445
463
|
if finalNArgs.nil? or finalNArgs > diffNArgs
|
446
464
|
finalPath = p
|
447
465
|
finalNArgs = diffNArgs
|
448
466
|
finalArgs = diffArgs
|
449
467
|
end
|
450
468
|
end
|
451
|
-
|
469
|
+
end
|
470
|
+
|
471
|
+
if finalNArgs > self.class.__urls__[1]
|
472
|
+
return [404, {'Content-Type' => 'text/plain'}, "Not Found: #{@request.path}"]
|
452
473
|
end
|
453
474
|
|
454
475
|
nargs = self.class.__urls__[1]
|
@@ -481,32 +502,33 @@ module Capcode
|
|
481
502
|
filter_output
|
482
503
|
end
|
483
504
|
}
|
505
|
+
|
484
506
|
if r.respond_to?(:to_ary)
|
485
507
|
@response.status = r.shift #r[0]
|
486
508
|
#r[1].each do |k,v|
|
487
509
|
r.shift.each do |k,v|
|
488
510
|
@response[k] = v
|
489
511
|
end
|
490
|
-
@response.
|
512
|
+
@response.write r.shift #r[2]
|
491
513
|
else
|
492
514
|
@response.write r
|
493
515
|
end
|
494
|
-
|
516
|
+
|
495
517
|
@response.finish
|
496
518
|
end
|
497
519
|
|
498
520
|
include Capcode::Helpers
|
499
|
-
include Capcode::Views
|
521
|
+
include Capcode::Views
|
500
522
|
}
|
501
523
|
end
|
502
|
-
|
524
|
+
Capcode::Route = Capcode::Route(nil)
|
525
|
+
|
503
526
|
# This method help you to map and URL to a Rack or What you want Helper
|
504
527
|
#
|
505
528
|
# Capcode.map( "/file" ) do
|
506
529
|
# Rack::File.new( "." )
|
507
530
|
# end
|
508
531
|
def map( route, &b )
|
509
|
-
#@@__ROUTES[route] = yield
|
510
532
|
Capcode.routes[route] = yield
|
511
533
|
end
|
512
534
|
|
@@ -570,15 +592,28 @@ module Capcode
|
|
570
592
|
def application( args = {} )
|
571
593
|
Capcode::Configuration.configuration(args)
|
572
594
|
|
573
|
-
Capcode.constants.
|
595
|
+
Capcode.constants.clone.delete_if {|k|
|
596
|
+
not( Capcode.const_get(k).to_s =~ /Capcode/ ) or [
|
597
|
+
"Filter",
|
598
|
+
"Helpers",
|
599
|
+
"RouteError",
|
600
|
+
"Views",
|
601
|
+
"ParameterError",
|
602
|
+
"HTTPError",
|
603
|
+
"Configuration",
|
604
|
+
"MissingLibrary",
|
605
|
+
"Route",
|
606
|
+
"RenderError"
|
607
|
+
].include?(k)
|
608
|
+
}.each do |k|
|
574
609
|
begin
|
575
610
|
if eval "Capcode::#{k}.public_methods(true).include?( '__urls__' )"
|
576
|
-
hash_of_routes, max_captures_for_routes, klass = eval "Capcode::#{k}.__urls__"
|
611
|
+
hash_of_routes, max_captures_for_routes, klass = eval "Capcode::#{k}.__urls__"
|
577
612
|
hash_of_routes.keys.each do |current_route_path|
|
578
613
|
#raise Capcode::RouteError, "Route `#{current_route_path}' already define !", caller if @@__ROUTES.keys.include?(current_route_path)
|
579
614
|
raise Capcode::RouteError, "Route `#{current_route_path}' already define !", caller if Capcode.routes.keys.include?(current_route_path)
|
580
|
-
|
581
|
-
Capcode.routes[current_route_path] = klass
|
615
|
+
# Capcode.routes[current_route_path] = klass.new
|
616
|
+
Capcode.routes[current_route_path] = klass
|
582
617
|
end
|
583
618
|
end
|
584
619
|
rescue => e
|
@@ -587,13 +622,12 @@ module Capcode
|
|
587
622
|
end
|
588
623
|
|
589
624
|
# Set Static directory
|
590
|
-
#@@__STATIC_DIR = (conf[:static][0].chr == "/")?conf[:static]:"/"+conf[:static] unless conf[:static].nil?
|
591
625
|
Capcode.static = (Capcode::Configuration.get(:static)[0].chr == "/")?Capcode::Configuration.get(:static):"/"+Capcode::Configuration.get(:static) unless Capcode::Configuration.get(:static).nil?
|
592
626
|
|
593
627
|
# Initialize Rack App
|
594
628
|
puts "** Map routes." if Capcode::Configuration.get(:verbose)
|
595
|
-
|
596
|
-
app = Rack::URLMap.new(Capcode.routes)
|
629
|
+
# app = Rack::URLMap.new(Capcode.routes)
|
630
|
+
app = Capcode::Ext::Rack::URLMap.new(Capcode.routes)
|
597
631
|
puts "** Initialize static directory (#{Capcode.static}) in #{File.expand_path(Capcode::Configuration.get(:root))}" if Capcode::Configuration.get(:verbose)
|
598
632
|
app = Rack::Static.new(
|
599
633
|
app,
|
@@ -608,7 +642,6 @@ module Capcode
|
|
608
642
|
app = Rack::Lint.new(app)
|
609
643
|
app = Rack::ShowExceptions.new(app)
|
610
644
|
#app = Rack::Reloader.new(app) ## -- NE RELOAD QUE capcode.rb -- So !!!
|
611
|
-
# app = Rack::CommonLogger.new( app, Logger.new(conf[:log]) )
|
612
645
|
|
613
646
|
middlewares.each do |mw|
|
614
647
|
middleware, args, block = mw
|
@@ -626,6 +659,7 @@ module Capcode
|
|
626
659
|
end
|
627
660
|
|
628
661
|
if block_given?
|
662
|
+
puts "** Execute block" if Capcode::Configuration.get(:verbose)
|
629
663
|
yield( self )
|
630
664
|
end
|
631
665
|
|
@@ -763,16 +797,13 @@ module Capcode
|
|
763
797
|
end
|
764
798
|
|
765
799
|
def routes #:nodoc:
|
766
|
-
#@@__ROUTES
|
767
800
|
@routes ||= {}
|
768
801
|
end
|
769
802
|
|
770
803
|
def static #:nodoc:
|
771
|
-
#@@__STATIC_DIR
|
772
804
|
@static_dir ||= nil
|
773
805
|
end
|
774
806
|
def static=(x) #:nodoc:
|
775
|
-
#@@__STATIC_DIR
|
776
807
|
@static_dir = x
|
777
808
|
end
|
778
809
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Capcode
|
2
|
+
module Ext
|
3
|
+
module Rack
|
4
|
+
# Rack::URLMap takes a hash mapping urls or paths to apps, and
|
5
|
+
# dispatches accordingly. Support for HTTP/1.1 host names exists if
|
6
|
+
# the URLs start with <tt>http://</tt> or <tt>https://</tt>.
|
7
|
+
#
|
8
|
+
# URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part
|
9
|
+
# relevant for dispatch is in the SCRIPT_NAME, and the rest in the
|
10
|
+
# PATH_INFO. This should be taken care of when you need to
|
11
|
+
# reconstruct the URL in order to create links.
|
12
|
+
#
|
13
|
+
# URLMap dispatches in such a way that the longest paths are tried
|
14
|
+
# first, since they are most specific.
|
15
|
+
|
16
|
+
class URLMap
|
17
|
+
def initialize(map = {})
|
18
|
+
remap(map)
|
19
|
+
end
|
20
|
+
|
21
|
+
def remap(map)
|
22
|
+
@mapping = map.map { |location, app|
|
23
|
+
if location =~ %r{\Ahttps?://(.*?)(/.*)}
|
24
|
+
host, location = $1, $2
|
25
|
+
else
|
26
|
+
host = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
unless location[0] == ?/
|
30
|
+
raise ArgumentError, "paths need to start with /"
|
31
|
+
end
|
32
|
+
location = location.chomp('/')
|
33
|
+
match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n')
|
34
|
+
|
35
|
+
[host, location, match, app]
|
36
|
+
}.sort_by { |(h, l, m, a)| [h ? -h.size : (-1.0 / 0.0), -l.size] } # Longest path first
|
37
|
+
end
|
38
|
+
|
39
|
+
def call(env)
|
40
|
+
path = env["PATH_INFO"].to_s
|
41
|
+
script_name = env['SCRIPT_NAME']
|
42
|
+
hHost, sName, sPort = env.values_at('HTTP_HOST','SERVER_NAME','SERVER_PORT')
|
43
|
+
@mapping.each { |host, location, match, app|
|
44
|
+
next unless (hHost == host || sName == host \
|
45
|
+
|| (host.nil? && (hHost == sName || hHost == sName+':'+sPort)))
|
46
|
+
next unless path =~ match && rest = $1
|
47
|
+
next unless rest.empty? || rest[0] == ?/
|
48
|
+
|
49
|
+
return app.new.call(
|
50
|
+
env.merge(
|
51
|
+
'SCRIPT_NAME' => (script_name + location),
|
52
|
+
'PATH_INFO' => rest))
|
53
|
+
}
|
54
|
+
[404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/capcode/render/text.rb
CHANGED
data/lib/capcode/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: Capcode
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 51
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 9
|
9
|
+
- 4
|
10
|
+
version: 0.9.4
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- "Gr\xC3\xA9goire Lejeune"
|
@@ -9,19 +15,37 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2010-
|
18
|
+
date: 2010-05-28 00:00:00 +02:00
|
13
19
|
default_executable:
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: rack
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
17
33
|
type: :runtime
|
18
|
-
|
19
|
-
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: activesupport
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
20
40
|
requirements:
|
21
41
|
- - ">="
|
22
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
23
46
|
version: "0"
|
24
|
-
|
47
|
+
type: :runtime
|
48
|
+
version_requirements: *id002
|
25
49
|
description: Capcode is a web microframework
|
26
50
|
email: gregoire.lejeune@free.fr
|
27
51
|
executables: []
|
@@ -67,6 +91,7 @@ files:
|
|
67
91
|
- lib/capcode/base/db.rb
|
68
92
|
- lib/capcode/configuration.rb
|
69
93
|
- lib/capcode/core_ext.rb
|
94
|
+
- lib/capcode/ext/rack/urlmap.rb
|
70
95
|
- lib/capcode/filters.rb
|
71
96
|
- lib/capcode/helpers/auth.rb
|
72
97
|
- lib/capcode/render/text.rb
|
@@ -89,6 +114,7 @@ files:
|
|
89
114
|
- examples/rest-run.rb
|
90
115
|
- examples/rest.rb
|
91
116
|
- examples/rest.ru
|
117
|
+
- examples/route.rb
|
92
118
|
- examples/sample.rb
|
93
119
|
- examples/session.rb
|
94
120
|
- examples/soapbox/public/jquery.js
|
@@ -144,21 +170,29 @@ rdoc_options:
|
|
144
170
|
require_paths:
|
145
171
|
- lib
|
146
172
|
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
+
none: false
|
147
174
|
requirements:
|
148
175
|
- - ">="
|
149
176
|
- !ruby/object:Gem::Version
|
177
|
+
hash: 53
|
178
|
+
segments:
|
179
|
+
- 1
|
180
|
+
- 8
|
181
|
+
- 1
|
150
182
|
version: 1.8.1
|
151
|
-
version:
|
152
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
184
|
+
none: false
|
153
185
|
requirements:
|
154
186
|
- - ">="
|
155
187
|
- !ruby/object:Gem::Version
|
188
|
+
hash: 3
|
189
|
+
segments:
|
190
|
+
- 0
|
156
191
|
version: "0"
|
157
|
-
version:
|
158
192
|
requirements: []
|
159
193
|
|
160
194
|
rubyforge_project: capcode
|
161
|
-
rubygems_version: 1.3.
|
195
|
+
rubygems_version: 1.3.7
|
162
196
|
signing_key:
|
163
197
|
specification_version: 3
|
164
198
|
summary: Capcode is a web microframework
|