maveric 0.4.0 → 1.0.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/README +56 -0
- data/lib/maveric.rb +223 -627
- metadata +53 -38
- data/lib/maveric/extensions.rb +0 -111
- data/lib/maveric/fastcgi.rb +0 -18
- data/lib/maveric/mongrel.rb +0 -24
- data/lib/maveric/sessions.rb +0 -112
- data/lib/maveric/webrick.rb +0 -30
metadata
CHANGED
@@ -1,51 +1,66 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.2
|
3
|
-
specification_version: 1
|
4
2
|
name: maveric
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-02-13 00:00:00 -08:00
|
8
|
-
summary: A simple, non-magical, framework.
|
9
|
-
require_paths:
|
10
|
-
- lib/
|
11
|
-
email: blinketje@gmail.com
|
12
|
-
homepage: http://maveric.rubyforge.org/
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: maveric
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 1.0.0
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
|
-
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
- lib/maveric/extensions.rb
|
35
|
-
- lib/maveric/webrick.rb
|
36
|
-
- lib/maveric/mongrel.rb
|
37
|
-
- lib/maveric/sessions.rb
|
38
|
-
test_files: []
|
39
|
-
|
40
|
-
rdoc_options: []
|
41
|
-
|
42
|
-
extra_rdoc_files: []
|
7
|
+
- Scytrin dai Kinthra
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
43
11
|
|
12
|
+
date: 2009-12-14 00:00:00 -08:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rack
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
description:
|
26
|
+
email: scytrin@gmail.com
|
44
27
|
executables: []
|
45
28
|
|
46
29
|
extensions: []
|
47
30
|
|
31
|
+
extra_rdoc_files:
|
32
|
+
- README
|
33
|
+
files:
|
34
|
+
- README
|
35
|
+
- lib/maveric.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/scytrin/maveric
|
38
|
+
licenses: []
|
39
|
+
|
40
|
+
post_install_message:
|
41
|
+
rdoc_options:
|
42
|
+
- --main
|
43
|
+
- README
|
44
|
+
require_paths:
|
45
|
+
- lib
|
46
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: "0"
|
57
|
+
version:
|
48
58
|
requirements: []
|
49
59
|
|
50
|
-
|
60
|
+
rubyforge_project: maveric
|
61
|
+
rubygems_version: 1.3.5
|
62
|
+
signing_key:
|
63
|
+
specification_version: 3
|
64
|
+
summary: A simple, non-magical, MVC-ish framework for Rack.
|
65
|
+
test_files: []
|
51
66
|
|
data/lib/maveric/extensions.rb
DELETED
@@ -1,111 +0,0 @@
|
|
1
|
-
class Module
|
2
|
-
## Build a string akin to the absolute path of the nesting structure.
|
3
|
-
def to_path flatten=false
|
4
|
-
path = '/'+self.to_s.gsub(/::+/, '/') # '^/' as absolute path.
|
5
|
-
path = path.gsub(/([a-z])([A-Z])/,'\1_\2').sub(/\/Index$/,'/').downcase if flatten
|
6
|
-
path
|
7
|
-
end
|
8
|
-
|
9
|
-
# Still deving this.
|
10
|
-
def self.nesting_path_to_constant path
|
11
|
-
dig = proc{|c,n| c.const_get(n) }
|
12
|
-
path.gsub(/_([a-z])/){$1.upcase}.split('/')
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
class Symbol
|
17
|
-
# #to_s makes sense, but #to_i is just as effective.
|
18
|
-
def <=> obj
|
19
|
-
obj.instance_of?(Symbol) ?
|
20
|
-
self.to_i <=> obj.to_i :
|
21
|
-
super
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
module Enumerable
|
26
|
-
# blink> wtf do I call this? #find{|e| r = do_stuff(e) and break r }
|
27
|
-
# manveru> map.find
|
28
|
-
# LoganCapaldo> first_mapped
|
29
|
-
# LoganCapaldo> find_such_that
|
30
|
-
# tpope> Enumerable#eject
|
31
|
-
# blink> o.O
|
32
|
-
# tpope> returns on the first non-nil yield
|
33
|
-
# tpope> it rhymes with select and detect and reject and collect and inject
|
34
|
-
# tpope> it's a little confusing, but it's a confusing concept
|
35
|
-
|
36
|
-
##
|
37
|
-
# Used to return the first value for which the given block evalutes as true.
|
38
|
-
# Think .map(&b).compact.first
|
39
|
-
def eject &block
|
40
|
-
find{|e| result = block[e] and break result }
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
##
|
45
|
-
# Extensions to StandardError to enable their usage in Maveric as responses.
|
46
|
-
# The default response is 500 and content-type of text/plain.
|
47
|
-
class StandardError
|
48
|
-
DEFAULT_STATUS = 500
|
49
|
-
DEFAULT_HEADERS = {'Content-Type'=>'text/plain'}
|
50
|
-
|
51
|
-
## Returns @status or DEFAULT_STATUS if unset.
|
52
|
-
def status
|
53
|
-
defined?(@status)? @status : DEFAULT_STATUS
|
54
|
-
end
|
55
|
-
|
56
|
-
## Returns @headers or DEFAULT_HEADERS if unset.
|
57
|
-
def headers
|
58
|
-
defined?(@headers)? @headers : DEFAULT_HEADERS
|
59
|
-
end
|
60
|
-
|
61
|
-
## Unless @body is defined, a self inspect and backtrace is output.
|
62
|
-
def body
|
63
|
-
defined?(@body)? @body : [inspect, *backtrace]*"\n"
|
64
|
-
end
|
65
|
-
|
66
|
-
## See Maveric::Controller#to_http
|
67
|
-
def to_http(raw=true)
|
68
|
-
response = if not raw then 'Status:'
|
69
|
-
elsif defined? @env and @env.key? 'HTTP_VERSION' then @env['HTTP_VERSION']
|
70
|
-
else 'HTTP/1.1'end
|
71
|
-
response += " #{self.status}" + ::Maveric::EOL # Status message? :/
|
72
|
-
response << self.headers.map{|k,v| "#{k}: #{v}" }*::Maveric::EOL
|
73
|
-
response << ::Maveric::EOL*2 + self.body
|
74
|
-
end
|
75
|
-
|
76
|
-
##
|
77
|
-
# After a bit of experimenting with Exception and raise I determined a fun
|
78
|
-
# and simple way to generate fast HTTP response error thingies. As long as
|
79
|
-
# you're within a call to Maveric#dispatch (with no further rescue clauses)
|
80
|
-
# the StandardError will propogate up and be returned. As a StandardError
|
81
|
-
# has similar accessors as a Controller, they should be compatible with any
|
82
|
-
# outputting implimentation for Maveric.
|
83
|
-
#
|
84
|
-
# raise StandardErrpr; # 500 error
|
85
|
-
# raise StandardError, 'Crap!'; # 500 error with message set to 'Crap!'
|
86
|
-
# raise StandardError, [status, headers, body, *other_data] # Magic!
|
87
|
-
#
|
88
|
-
# In the final example line an Array is passed to raise as a second argument
|
89
|
-
# rather than a String. This is taken as the HTTP status code. The next
|
90
|
-
# element is tested to be a Hash, if so then it's values are merged into
|
91
|
-
# the HTTP headers. The next item is tested to be a String, if so it is
|
92
|
-
# appended to the response body. All remaining elements are appended to
|
93
|
-
# the response body in inspect format.
|
94
|
-
#
|
95
|
-
# A simple way of only including data that might be interpreted to being the
|
96
|
-
# status, headers, or body is to place a nil previous to the data you want
|
97
|
-
# appended to the response body.
|
98
|
-
def initialize data=nil
|
99
|
-
# consider autosetting @status, like 503 for NoMethodError
|
100
|
-
if data.is_a? Array and data[0].is_a? Integer
|
101
|
-
@body = ''
|
102
|
-
@status = data.shift if Integer === data.first
|
103
|
-
@headers = DEF_HEADERS.merge data.shift if Hash === data.first
|
104
|
-
@body << data.shift if String === data.first
|
105
|
-
msg = @body.dup
|
106
|
-
@body << "\n\n#{data.compact.map{|e|e.inspect}*"\n"}" unless data.empty?
|
107
|
-
data = msg
|
108
|
-
end
|
109
|
-
super data
|
110
|
-
end
|
111
|
-
end
|
data/lib/maveric/fastcgi.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
%w~fcgi~.each{|m|require m}
|
2
|
-
##
|
3
|
-
# Opening arguments are a Maveric class and options. Plz, don't pass a Maveric
|
4
|
-
# instance. The options of +opts+ are passed to the Maveric on instantiation.
|
5
|
-
#
|
6
|
-
# Maveric::FCGI(MyMaveric.new)
|
7
|
-
def Maveric.FCGI maveric, opts={}
|
8
|
-
::FCGI.each do |req|
|
9
|
-
req.out << "Status: 200 OK" + ::Maveric::EOL*2 if $DEBUG
|
10
|
-
req.out << response = begin
|
11
|
-
maveric.dispatch(req.in, req.env).to_http
|
12
|
-
rescue
|
13
|
-
"Status: 500 Server Error omgwtf!"+::Maveric::EOL*2+
|
14
|
-
"#{$!}\n#{$!.backtrace*"\n"}"
|
15
|
-
end
|
16
|
-
req.finish
|
17
|
-
end
|
18
|
-
end
|
data/lib/maveric/mongrel.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
%w~mongrel~.each{|m|require m}
|
2
|
-
|
3
|
-
##
|
4
|
-
# Includes Mongrel::HttpHandlerPlugin into Maveric, allowing the use of Maveric
|
5
|
-
# subclasses as HttpHandlers in the context of Mongrel.
|
6
|
-
class Maveric
|
7
|
-
include Mongrel::HttpHandlerPlugin
|
8
|
-
|
9
|
-
##
|
10
|
-
# Runs #dispatch on the request and filters the resulting Controller instance
|
11
|
-
# to the +response+ object.
|
12
|
-
def process request, response
|
13
|
-
reply = dispatch request.body, request.params
|
14
|
-
response.start reply.status do |head,out|
|
15
|
-
reply.headers.each {|k,v| head[k] = v }
|
16
|
-
out.write reply.body
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
## Runs #prepare_enviroment on the env to get things moving.
|
21
|
-
def request_begins params
|
22
|
-
prepare_environment params
|
23
|
-
end
|
24
|
-
end
|
data/lib/maveric/sessions.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
require 'set'
|
2
|
-
|
3
|
-
class Maveric
|
4
|
-
##
|
5
|
-
# Contains session data and provides conveniance in generating an appropriate
|
6
|
-
# cookie.
|
7
|
-
#
|
8
|
-
# This is a simple session implementation. Data is kept in a self maintaining
|
9
|
-
# Set persisting in memory. Noot good if yoou're dealing with oodles of sets.
|
10
|
-
class SimpleSessions < Set
|
11
|
-
COOKIE_NAME = 'SESSIONID'
|
12
|
-
|
13
|
-
##
|
14
|
-
# Looks up a sessions by id given. The id argument should be a string of
|
15
|
-
# a hex number. (num.to_s(16) If id is not found a new Session is created
|
16
|
-
# and its Session#id is returned.
|
17
|
-
def session id #wants stringed hex num
|
18
|
-
|
19
|
-
#ensure crusty old sessions don't linger
|
20
|
-
@__i = 0 unless defined? @__i
|
21
|
-
@__i += 1
|
22
|
-
reject!{|s| s.expires < Time.now-3 } if (@__i%=10) == 0 # 3 second grace
|
23
|
-
|
24
|
-
if id # now get the session if we have something to search for
|
25
|
-
session = find{|s| id.casecmp(s.id)==0 }
|
26
|
-
else # there isn't one? then make a new one!
|
27
|
-
add session=Session.new
|
28
|
-
end
|
29
|
-
return session
|
30
|
-
end
|
31
|
-
|
32
|
-
##
|
33
|
-
# Because apparently sessions are handy or helpful or something like that.
|
34
|
-
# Implemented as that the hex of their #object_id (the one you'd see in
|
35
|
-
# an Object#inspect) is treated as a session id.
|
36
|
-
class Session
|
37
|
-
DURATION = 15*60
|
38
|
-
## The default session length is 15 minutes. Simple to change.
|
39
|
-
def initialize duration=DURATION
|
40
|
-
@duration, @data = duration, {}
|
41
|
-
touch
|
42
|
-
end
|
43
|
-
|
44
|
-
attr_reader :expires, :data, :duration
|
45
|
-
|
46
|
-
## Returns an upcased hexed object_id, not #object_id.to_s(16) however.
|
47
|
-
def id
|
48
|
-
@id||=[object_id<<1].pack('i').unpack('I')[0].to_s(16).upcase
|
49
|
-
end
|
50
|
-
|
51
|
-
##
|
52
|
-
# One session is less than another if it expires sooner. Useful if we
|
53
|
-
# are managing in a manner akin to a priority stack.
|
54
|
-
def <=> obj
|
55
|
-
Session === obj ?
|
56
|
-
self.expires <=> obj.expires :
|
57
|
-
super
|
58
|
-
end
|
59
|
-
|
60
|
-
## Set this session's expiry to @duration+Time.now
|
61
|
-
def touch
|
62
|
-
@expires = Time.now.gmtime + Integer(@duration)
|
63
|
-
end
|
64
|
-
|
65
|
-
## Perhaps better named as #to_cookie for clarity?
|
66
|
-
def to_s env=nil
|
67
|
-
touch
|
68
|
-
c = "#{::Maveric::SimpleSessions::COOKIE_NAME}=#{id}" #required
|
69
|
-
c << "; expires=#{expires.httpdate}"
|
70
|
-
return c unless env
|
71
|
-
c << "; domain=#{env['SERVER_NAME']};"
|
72
|
-
# need to determine a good way to discern proper path.
|
73
|
-
# pertinant Maveric?
|
74
|
-
c << "; secure" if false
|
75
|
-
c
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
@sessions = SimpleSessions.new
|
81
|
-
|
82
|
-
## Return the standard session set.
|
83
|
-
def self.sessions
|
84
|
-
@sessions
|
85
|
-
end
|
86
|
-
|
87
|
-
## Return a session via Session#session
|
88
|
-
def self.session id
|
89
|
-
@sessions.session id
|
90
|
-
end
|
91
|
-
|
92
|
-
##
|
93
|
-
# Uses env[:cookies] to find the session_id, and retrives the data to set the
|
94
|
-
# values or env[:session].
|
95
|
-
def set_session env
|
96
|
-
session_id = env[:cookies][::Maveric::SimpleSessions::COOKIE_NAME].first
|
97
|
-
env[:session] = ::Maveric.session session_id
|
98
|
-
end
|
99
|
-
|
100
|
-
prepare_env :set_session
|
101
|
-
|
102
|
-
class Controller
|
103
|
-
## Touches the session and includes it into the http headers.
|
104
|
-
def session_cleanup controller
|
105
|
-
return unless @env[:session]
|
106
|
-
@env[:session].touch
|
107
|
-
@headers['Set-Cookie'] = [@env[:session].to_s(@env)]
|
108
|
-
end
|
109
|
-
|
110
|
-
after :session_cleanup
|
111
|
-
end
|
112
|
-
end
|
data/lib/maveric/webrick.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
%w~webrick webrick/httpservlet/abstract~.each{|m|require m}
|
2
|
-
|
3
|
-
## Adaptation of CampingHandler, quick works.
|
4
|
-
class Maveric::WEBrickServlet < WEBrick::HTTPServlet::AbstractServlet
|
5
|
-
|
6
|
-
##
|
7
|
-
# As a WEBrick servlet, but pass all but the first option to the Maveric on
|
8
|
-
# initialization. The Maveric (not an instance) is expected as the first
|
9
|
-
# option.
|
10
|
-
def initialize server, maveric, *opts
|
11
|
-
@maveric = maveric.new *@options
|
12
|
-
super server, *opts
|
13
|
-
end
|
14
|
-
|
15
|
-
## We don't need no stinkin' do_* methods.
|
16
|
-
def service req, res
|
17
|
-
begin
|
18
|
-
env = req.meta_vars
|
19
|
-
env['REQUEST_URI'] = req.unparsed_uri
|
20
|
-
result = @maveric.dispatch req_body, env, req
|
21
|
-
result.headers.each do |k, v|
|
22
|
-
if k =~ /^X-SENDFILE$/i then @local_path = v
|
23
|
-
else [*v].each {|x| res[k] = x } end
|
24
|
-
end
|
25
|
-
res.status, h, res.body = *result
|
26
|
-
rescue ::Maveric::ServerError => error
|
27
|
-
Maveric.log.fatal "WEBrick done got f'd up: #{error.inspect}"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|