rack-golem 0.0.3 → 0.0.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.md CHANGED
@@ -18,7 +18,7 @@ Install with:
18
18
  Config.ru is one of his names, so say it in a Rackup file.
19
19
 
20
20
  require 'db' # Loads ORM models and all
21
- require 'go' # Our controller (I don not like that word really)
21
+ require 'go' # Our controller (I do not like that word really)
22
22
  use Rack::ContentLength
23
23
  use Rack::Session::Cookies
24
24
  run Go
@@ -42,7 +42,7 @@ And the winner is:
42
42
  def index(*args)
43
43
  # When no public method is found
44
44
  # Of course you don't have to declare one and it is gonna use Controller#not_found instead
45
- # But if it is declared, keep in mind it's a catch-all so make it deal with args
45
+ # Still can have arguments
46
46
  @articles = Post.all
47
47
  erb :index
48
48
  end
@@ -66,6 +66,14 @@ And the winner is:
66
66
  Email.alert('Too many people are looking for porn here') if args.includes?("porn")
67
67
  super(args)
68
68
  end
69
+
70
+ def error(err, *args)
71
+ # Again this one is defined by Golem and only shows up when RACK_ENV is not `nil` or `dev` or `development`
72
+ # Default only prints "ERROR"
73
+ # Here we're going to send the error message
74
+ # One would rarely show that to the end user but this is just a demo
75
+ err.message
76
+ end
69
77
 
70
78
  after do
71
79
  Spy.analyse.send_info_to([:government, :facebook, :google, :james_bond])
data/lib/rack/golem.rb CHANGED
@@ -19,7 +19,7 @@ module Rack::Golem
19
19
  @path_atoms = @r.path_info.split('/').find_all{|s| s!=''}
20
20
  @action, *@action_arguments = @path_atoms
21
21
  unless public_methods.include?(@action)||(@action&&public_methods.include?(@action.to_sym))
22
- if public_methods.include?('index')||public_methods.include?(:index)
22
+ if public_methods.include?('index')||public_methods.include?(:index) # For different RUBY_VERSION(s)
23
23
  @action, @action_arguments = 'index', @path_atoms
24
24
  else
25
25
  @action, @action_arguments = 'not_found', @path_atoms
@@ -28,7 +28,13 @@ module Rack::Golem
28
28
 
29
29
  instance_eval(&self.class.before_block) unless self.class.before_block.nil?
30
30
 
31
- @res.write(self.__send__(@action,*@action_arguments))
31
+ begin
32
+ @res.write(self.__send__(@action,*@action_arguments))
33
+ rescue ArgumentError => e
34
+ failed_method = e.backtrace[0][/`.*'$/][1..-2]
35
+ raise unless failed_method==@action
36
+ @res.write(self.__send__('not_found', @path_atoms))
37
+ end
32
38
 
33
39
  instance_eval(&self.class.after_block) unless self.class.after_block.nil?
34
40
  }
@@ -36,19 +42,36 @@ module Rack::Golem
36
42
  end
37
43
 
38
44
  module InstanceMethods
45
+
46
+ DEV_ENV = [nil,'development','dev']
47
+
39
48
  def initialize(app=nil); @app = app; end
40
49
  def call(env); dup.call!(env); end
50
+
41
51
  def call!(env)
42
52
  @r = ::Rack::Request.new(env)
43
53
  @res = ::Rack::Response.new
44
- instance_eval(&self.class.dispatcher_block)
54
+ @session = env['rack.session'] || {}
55
+ begin
56
+ instance_eval(&self.class.dispatcher_block)
57
+ rescue => e
58
+ raise if DEV_ENV.include?(ENV['RACK_ENV'])
59
+ @res.write(self.__send__('error', e, @path_atoms))
60
+ end
45
61
  @res.status==404&&!@app.nil? ? @app.call(env) : @res.finish
46
62
  end
63
+
47
64
  def not_found(*args)
48
65
  @res.status = 404
49
66
  @res.headers['X-Cascade']='pass'
50
- "Not Found: #{@r.path_info}"
67
+ "NOT FOUND: #{@r.path_info}"
68
+ end
69
+
70
+ def error(e, *args)
71
+ @res.status = 500
72
+ "ERROR"
51
73
  end
74
+
52
75
  def erb(template)
53
76
  @@tilt_cache ||= {}
54
77
  if @@tilt_cache.has_key?(template)
data/rack-golem.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'rack-golem'
3
- s.version = "0.0.3"
3
+ s.version = "0.0.4"
4
4
  s.platform = Gem::Platform::RUBY
5
5
  s.summary = "A Controller middleware that is euh... basic"
6
6
  s.description = "A Controller middleware that is euh... basic. I would say it is a sort of Ramaze for kids"
@@ -9,6 +9,6 @@ Gem::Specification.new do |s|
9
9
  s.author = "Mickael Riga"
10
10
  s.email = "mig@campbellhay.com"
11
11
  s.homepage = "http://www.campbellhay.com"
12
- s.add_dependency(%q<tilt>, ["~> 1.2.2"])
12
+ s.add_dependency(%q<tilt>, [">= 1.2.2"])
13
13
  s.add_development_dependency(%q<bacon>, "~> 1.1.0")
14
14
  end
data/test/spec_golem.rb CHANGED
@@ -52,44 +52,108 @@ class Indexed
52
52
  end
53
53
  IndexedR = ::Rack::MockRequest.new(::Rack::Lint.new(Indexed.new))
54
54
 
55
+ # ==================
56
+ # = Simply indexed =
57
+ # ==================
58
+
59
+ class SimplyIndexed
60
+ include Rack::Golem
61
+ def index; 'index'; end
62
+ def will_fail; please_fail; end
63
+ private
64
+ def please_fail(num); 'ArgumentError baby'; end
65
+ end
66
+ SimplyIndexedR = ::Rack::MockRequest.new(::Rack::Lint.new(SimplyIndexed.new))
67
+ SimplyIndexedUsedR = ::Rack::MockRequest.new(::Rack::Lint.new(SimplyIndexed.new(lambda{|env| [200,{},"#{3+nil}"]})))
68
+
69
+ # =============
70
+ # = Sessioned =
71
+ # =============
72
+
73
+ class Sessioned
74
+ include Rack::Golem
75
+ def set_val(val); @session[:val] = val; end
76
+ def get_val; @session[:val]; end
77
+ end
78
+ SessionedR = ::Rack::MockRequest.new(::Rack::Session::Cookie.new(::Rack::Lint.new(Sessioned.new)))
79
+
55
80
  # =========
56
81
  # = Specs =
57
82
  # =========
58
83
 
59
84
  describe "Golem" do
85
+
60
86
  it "Should dispatch on a method with no arguments" do
61
87
  BasicR.get('/no_arg').body.should=='nothing'
62
88
  end
89
+
63
90
  it "Should dispatch on a method with arguments" do
64
91
  BasicR.get('/with_args/a/b').body.should=='a+b'
65
92
  end
93
+
66
94
  it "Should dispatch on a method with splat argument" do
67
95
  BasicR.get('/splat_arg/a/b/c/d').body.should=='a+b+c+d'
68
96
  end
97
+
69
98
  it "Should not dispatch if the method is private or does not exist" do
70
99
  r = BasicR.get('/no_way')
71
100
  r.status.should==404
72
- r.body.should=='Not Found: /no_way'
101
+ r.body.should=='NOT FOUND: /no_way'
73
102
  r = BasicR.get('/no')
74
103
  r.status.should==404
75
- r.body.should=='Not Found: /no'
104
+ r.body.should=='NOT FOUND: /no'
76
105
  end
106
+
77
107
  it "Should follow the rack stack if response is 404 and there are middlewares below" do
78
108
  r = BasicLobsterR.get("/no_way")
79
109
  r.status.should==200
80
110
  end
111
+
81
112
  it "Should provide filters" do
82
113
  FilterR.get('/wrapped').body.should=="before+wrapped+after"
83
114
  end
115
+
84
116
  it "Should provide arguments in filter when page is not_found" do
85
- FilterR.get('/a/b/c/d').body.should=="a+b+c+dNot Found: /a/b/c/d+after"
117
+ FilterR.get('/a/b/c/d').body.should=="a+b+c+dNOT FOUND: /a/b/c/d+after"
86
118
  end
119
+
87
120
  it "Should send everything to :index if it exists and there is no matching method for first arg" do
88
121
  IndexedR.get('/exist/a/b/c/d').body.should=='a+b+c+d'
89
122
  IndexedR.get('/a/b/c/d').body.should=='a+b+c+d'
90
123
  IndexedR.get('/').body.should==''
91
124
  end
125
+
126
+ it "Should send not_found if there is an argument error on handlers" do
127
+ SimplyIndexedR.get('/').status.should==200
128
+ SimplyIndexedR.get('/unknown').status.should==404
129
+ SimplyIndexedR.get('/will_fail/useless').status.should==404
130
+ lambda{ SimplyIndexedR.get('/will_fail') }.should.raise(ArgumentError)
131
+ end
132
+
133
+ it "Should handle errors without raising an exception unless in dev mode" do
134
+ lambda{ SimplyIndexedR.get('/will_fail') }.should.raise(ArgumentError)
135
+ ENV['RACK_ENV'] = 'development'
136
+ lambda{ SimplyIndexedR.get('/will_fail') }.should.raise(ArgumentError)
137
+ ENV['RACK_ENV'] = 'production'
138
+ res = SimplyIndexedR.get('/will_fail')
139
+ res.status.should==500
140
+ ENV['RACK_ENV'] = nil
141
+ end
142
+
143
+ it "Should not use the error handler if the error occur further down the rack stack" do
144
+ ENV['RACK_ENV'] = 'production'
145
+ lambda{ SimplyIndexedUsedR.get('/not_found') }.should.raise(TypeError)
146
+ ENV['RACK_ENV'] = nil
147
+ end
148
+
92
149
  it "Should set dispatch-specific variables correctly when defaulting to :index" do
93
150
  IndexedR.get('/a/b/c/d?switch=true').body.should=="action=index args=a,b,c,d a+b+c+d"
94
151
  end
152
+
153
+ it "Should have a shortcut for session hash" do
154
+ res = SessionedR.get('/set_val/ichigo')
155
+ res_2 = SessionedR.get('/get_val', 'HTTP_COOKIE'=>res["Set-Cookie"])
156
+ res_2.body.should=='ichigo'
157
+ end
158
+
95
159
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-golem
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 3
10
- version: 0.0.3
9
+ - 4
10
+ version: 0.0.4
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mickael Riga
@@ -15,8 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-10-06 00:00:00 +01:00
19
- default_executable:
18
+ date: 2012-03-20 00:00:00 Z
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
22
21
  name: tilt
@@ -24,7 +23,7 @@ dependencies:
24
23
  requirement: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
25
  requirements:
27
- - - ~>
26
+ - - ">="
28
27
  - !ruby/object:Gem::Version
29
28
  hash: 27
30
29
  segments:
@@ -64,7 +63,6 @@ files:
64
63
  - lib/rack_golem.rb
65
64
  - rack-golem.gemspec
66
65
  - test/spec_golem.rb
67
- has_rdoc: true
68
66
  homepage: http://www.campbellhay.com
69
67
  licenses: []
70
68
 
@@ -94,7 +92,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
92
  requirements: []
95
93
 
96
94
  rubyforge_project:
97
- rubygems_version: 1.4.2
95
+ rubygems_version: 1.8.15
98
96
  signing_key:
99
97
  specification_version: 3
100
98
  summary: A Controller middleware that is euh... basic