deas 0.9.0 → 0.10.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/lib/deas/logging.rb CHANGED
@@ -96,7 +96,7 @@ module Deas
96
96
  log SummaryLine.new({
97
97
  'method' => request.request_method,
98
98
  'path' => request.path,
99
- 'handler' => env['deas.handler_class'],
99
+ 'handler' => env['deas.handler_class_name'],
100
100
  'params' => env['sinatra.params'],
101
101
  'time' => env['deas.time_taken'],
102
102
  'status' => status
@@ -0,0 +1,34 @@
1
+ require 'deas/view_handler'
2
+
3
+ module Deas
4
+
5
+ module RedirectHandler
6
+
7
+ def self.new(path = nil, &block)
8
+ handler_class = Class.new do
9
+ include Deas::ViewHandler
10
+ include InstanceMethods
11
+ extend ClassMethods
12
+ end
13
+ handler_class.redirect_path = path ? proc{ path } : block
14
+ handler_class
15
+ end
16
+
17
+ module InstanceMethods
18
+
19
+ def run!
20
+ path = self.instance_eval(&self.class.redirect_path)
21
+ redirect path
22
+ end
23
+
24
+ end
25
+
26
+ module ClassMethods
27
+
28
+ attr_accessor :redirect_path
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
data/lib/deas/route.rb CHANGED
@@ -5,11 +5,11 @@ module Deas
5
5
  class Route
6
6
  attr_reader :method, :path, :handler_class_name, :handler_class
7
7
 
8
- def initialize(method, path, handler_class_name)
8
+ def initialize(method, path, handler_class_name, handler_class = nil)
9
9
  @method = method
10
10
  @path = path
11
11
  @handler_class_name = handler_class_name
12
- @handler_class = nil
12
+ @handler_class = handler_class
13
13
  end
14
14
 
15
15
  def constantize!
@@ -19,9 +19,9 @@ module Deas
19
19
 
20
20
  def run(sinatra_call)
21
21
  sinatra_call.request.env.tap do |env|
22
- env['sinatra.params'] = sinatra_call.params
23
- env['deas.handler_class'] = @handler_class
24
- env['deas.logging'].call " Handler: #{env['deas.handler_class']}"
22
+ env['sinatra.params'] = sinatra_call.params
23
+ env['deas.handler_class_name'] = @handler_class_name
24
+ env['deas.logging'].call " Handler: #{env['deas.handler_class_name']}"
25
25
  env['deas.logging'].call " Params: #{env['sinatra.params'].inspect}"
26
26
  end
27
27
  Deas::SinatraRunner.run(@handler_class, sinatra_call)
data/lib/deas/runner.rb CHANGED
@@ -22,10 +22,6 @@ module Deas
22
22
  raise NotImplementedError
23
23
  end
24
24
 
25
- def redirect_to(*args)
26
- raise NotImplementedError
27
- end
28
-
29
25
  end
30
26
 
31
27
  end
data/lib/deas/server.rb CHANGED
@@ -2,6 +2,7 @@ require 'ns-options'
2
2
  require 'ns-options/boolean'
3
3
  require 'pathname'
4
4
  require 'deas/template'
5
+ require 'deas/redirect_handler'
5
6
  require 'deas/route'
6
7
  require 'deas/sinatra_app'
7
8
 
@@ -172,6 +173,14 @@ module Deas::Server
172
173
  self.route(:delete, path, handler_class_name)
173
174
  end
174
175
 
176
+ def redirect(http_method, path, to_path = nil, &block)
177
+ name = 'Deas::RedirectHandler'
178
+ handler_class = Deas::RedirectHandler.new(to_path, &block)
179
+ Deas::Route.new(http_method, path, name, handler_class).tap do |route|
180
+ self.configuration.routes.push(route)
181
+ end
182
+ end
183
+
175
184
  def route(http_method, path, handler_class_name)
176
185
  if self.view_handler_ns && !(handler_class_name =~ /^::/)
177
186
  handler_class_name = "#{self.view_handler_ns}::#{handler_class_name}"
@@ -34,21 +34,17 @@ module Deas
34
34
  @sinatra_call.halt(*args)
35
35
  end
36
36
 
37
- def render(name, options = nil, &block)
37
+ def render(template_name, options = nil, &block)
38
38
  options ||= {}
39
39
  options[:locals] = { :view => @handler }.merge(options[:locals] || {})
40
40
  options[:layout] ||= @handler_class.layouts
41
- Deas::Template.new(@sinatra_call, name, options).render(&block)
41
+ Deas::Template.new(@sinatra_call, template_name, options).render(&block)
42
42
  end
43
43
 
44
44
  def redirect(*args)
45
45
  @sinatra_call.redirect(*args)
46
46
  end
47
47
 
48
- def redirect_to(path, *args)
49
- @sinatra_call.redirect(@sinatra_call.to(path), *args)
50
- end
51
-
52
48
  private
53
49
 
54
50
  def run_callbacks(callbacks)
@@ -32,8 +32,20 @@ module Deas
32
32
  throw(:halt, args)
33
33
  end
34
34
 
35
- def render(*args, &block)
36
- [ args, block ].compact.flatten
35
+ def render(template_name, options = nil, &block)
36
+ RenderArgs.new(template_name, options, block)
37
+ end
38
+
39
+ def redirect(path, *halt_args)
40
+ RedirectArgs.new(path, halt_args)
41
+ end
42
+
43
+ RenderArgs = Struct.new(:template_name, :options, :block)
44
+
45
+ class RedirectArgs < Struct.new(:path, :halt_args)
46
+ def redirect?
47
+ true
48
+ end
37
49
  end
38
50
 
39
51
  end
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.9.0"
2
+ VERSION = "0.10.0"
3
3
  end
@@ -47,9 +47,8 @@ module Deas
47
47
 
48
48
  # Helpers
49
49
 
50
- def halt(*args); @deas_runner.halt(*args); end
51
- def redirect(*args); @deas_runner.redirect(*args); end
52
- def redirect_to(*args); @deas_runner.redirect_to(*args); end
50
+ def halt(*args); @deas_runner.halt(*args); end
51
+ def redirect(*args); @deas_runner.redirect(*args); end
53
52
 
54
53
  def render(*args, &block)
55
54
  @deas_runner.render(*args, &block)
@@ -29,10 +29,6 @@ class FakeApp
29
29
  end
30
30
  end
31
31
 
32
- def to(relative_path)
33
- File.join("http://test.local", relative_path)
34
- end
35
-
36
32
  def redirect(*args)
37
33
  halt 302, { 'Location' => args[0] }
38
34
  end
@@ -25,12 +25,14 @@ class DeasTestServer
25
25
  get '/with_layout', 'WithLayoutHandler'
26
26
  get '/alt_with_layout', 'AlternateWithLayoutHandler'
27
27
  get '/redirect', 'RedirectHandler'
28
- get '/redirect_to', 'RedirectToHandler'
29
28
  post '/session', 'SetSessionHandler'
30
29
  get '/session', 'UseSessionHandler'
31
30
 
32
31
  get '/handler/tests.json', 'HandlerTestsHandler'
33
32
 
33
+ redirect :get, '/route_redirect', '/somewhere'
34
+ redirect(:get, '/:prefix/redirect'){ "/#{params['prefix']}/somewhere" }
35
+
34
36
  end
35
37
 
36
38
  class ShowHandler
@@ -100,21 +102,12 @@ class RedirectHandler
100
102
 
101
103
  end
102
104
 
103
- class RedirectToHandler
104
- include Deas::ViewHandler
105
-
106
- def run!
107
- redirect_to '/somewhere'
108
- end
109
-
110
- end
111
-
112
105
  class SetSessionHandler
113
106
  include Deas::ViewHandler
114
107
 
115
108
  def run!
116
109
  session[:secret] = 'session_secret'
117
- redirect_to '/session'
110
+ redirect '/session'
118
111
  end
119
112
 
120
113
  end
@@ -64,12 +64,21 @@ module Deas
64
64
 
65
65
  assert_equal 302, last_response.status
66
66
  assert_equal expected_location, last_response.headers['Location']
67
+ end
67
68
 
68
- get '/redirect_to'
69
+ should "return a 302 redirect to the expected location " \
70
+ "when using a route redirect" do
71
+ get '/route_redirect'
69
72
  expected_location = 'http://example.org/somewhere'
70
73
 
71
74
  assert_equal 302, last_response.status
72
75
  assert_equal expected_location, last_response.headers['Location']
76
+
77
+ get '/my_prefix/redirect'
78
+ expected_location = 'http://example.org/my_prefix/somewhere'
79
+
80
+ assert_equal 302, last_response.status
81
+ assert_equal expected_location, last_response.headers['Location']
73
82
  end
74
83
 
75
84
  end
@@ -0,0 +1,59 @@
1
+ require 'assert'
2
+ require 'deas/redirect_handler'
3
+ require 'deas/test_helpers'
4
+
5
+ module Deas::RedirectHandler
6
+
7
+ class BaseTests < Assert::Context
8
+ desc "Deas::RedirectHandler"
9
+ setup do
10
+ @handler_class = Deas::RedirectHandler.new('/somewhere')
11
+ end
12
+ subject{ @handler_class }
13
+
14
+ should have_accessors :redirect_path
15
+
16
+ should "build a redirect handler class" do
17
+ subject.included_modules.tap do |modules|
18
+ assert_includes Deas::ViewHandler, modules
19
+ assert_includes Deas::RedirectHandler::InstanceMethods, modules
20
+ end
21
+
22
+ assert_instance_of Proc, subject.redirect_path
23
+ assert_equal '/somewhere', subject.redirect_path.call
24
+ end
25
+
26
+ should "allow passing a block instead of a static path" do
27
+ path_proc = proc{ '/somewhere' }
28
+
29
+ handler_class = Deas::RedirectHandler.new(&path_proc)
30
+ assert_equal path_proc, handler_class.redirect_path
31
+ end
32
+
33
+ end
34
+
35
+ class RunTests < BaseTests
36
+ include Deas::TestHelpers
37
+
38
+ desc "when run"
39
+
40
+ should "redirect to the path that it was build with" do
41
+ render_args = test_runner(@handler_class).run
42
+ assert_equal true, render_args.redirect?
43
+ assert_equal '/somewhere', render_args.path
44
+ end
45
+
46
+ should "redirect to the path returned from instance evaling the proc" do
47
+ path_proc = proc{ params['redirect_to'] }
48
+ handler_class = Deas::RedirectHandler.new(&path_proc)
49
+
50
+ render_args = test_runner(handler_class, {
51
+ :params => { 'redirect_to' => '/go_here' }
52
+ }).run
53
+ assert_equal true, render_args.redirect?
54
+ assert_equal '/go_here', render_args.path
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -16,6 +16,13 @@ class Deas::Route
16
16
  should have_instance_methods :method, :path, :handler_class_name,
17
17
  :handler_class, :run
18
18
 
19
+ should "allow passing a constantized handler when initialized" do
20
+ route = Deas::Route.new(:get, '/test', 'TestViewHandler', TestViewHandler)
21
+
22
+ # handler class is set without calling constantize
23
+ assert_equal TestViewHandler, route.handler_class
24
+ end
25
+
19
26
  should "constantize the handler class with #constantize!" do
20
27
  assert_nil subject.handler_class
21
28
 
@@ -26,10 +26,6 @@ class Deas::Runner
26
26
  assert_raises(NotImplementedError){ subject.redirect }
27
27
  end
28
28
 
29
- should "raise NotImplementedError with #redirect_to" do
30
- assert_raises(NotImplementedError){ subject.redirect_to }
31
- end
32
-
33
29
  end
34
30
 
35
31
  end
@@ -125,6 +125,17 @@ module Deas::Server
125
125
  assert_equal 'DeleteAsset', route.handler_class_name
126
126
  end
127
127
 
128
+ should "add a redirect route using #redirect" do
129
+ subject.redirect(:get, '/invalid', '/assets')
130
+
131
+ route = subject.configuration.routes[0]
132
+ assert_instance_of Deas::Route, route
133
+ assert_equal :get, route.method
134
+ assert_equal '/invalid', route.path
135
+ assert_equal 'Deas::RedirectHandler', route.handler_class_name
136
+ assert_not_nil route.handler_class
137
+ end
138
+
128
139
  should "allow defining any kind of route using #route" do
129
140
  subject.route(:options, '/get_info', 'GetInfo')
130
141
 
@@ -152,7 +163,7 @@ module Deas::Server
152
163
  end
153
164
 
154
165
  should "add and query helper modules using #template_helpers and #template_helper?" do
155
- subject.template_helpers (helper_module = Module.new)
166
+ subject.template_helpers(helper_module = Module.new)
156
167
  assert subject.template_helper?(helper_module)
157
168
  end
158
169
 
@@ -14,8 +14,8 @@ class Deas::SinatraRunner
14
14
  end
15
15
  subject{ @runner }
16
16
 
17
- should have_instance_methods :run, :request, :response, :params, :logger,
18
- :halt, :render, :session, :redirect, :redirect_to
17
+ should have_imeths :run, :request, :response, :params, :logger, :halt
18
+ should have_imeths :render, :session, :redirect
19
19
 
20
20
  should "return the sinatra_call's request with #request" do
21
21
  assert_equal @fake_sinatra_call.request, subject.request
@@ -60,13 +60,6 @@ class Deas::SinatraRunner
60
60
  assert_equal expected, return_value
61
61
  end
62
62
 
63
- should "call the sinatra_call's redirect and to methods with #redirect_to" do
64
- return_value = catch(:halt){ subject.redirect_to('/somewhere') }
65
- expected = [ 302, { 'Location' => "http://test.local/somewhere" } ]
66
-
67
- assert_equal expected, return_value
68
- end
69
-
70
63
  end
71
64
 
72
65
  class RunTests < BaseTests
@@ -28,9 +28,9 @@ module Deas::ViewHandler
28
28
  end
29
29
 
30
30
  should "be able to render templates" do
31
- return_value = test_runner(RenderViewHandler).run
32
- assert_equal "my_template", return_value[0]
33
- assert_equal({ :some => :option }, return_value[1])
31
+ render_args = test_runner(RenderViewHandler).run
32
+ assert_equal "my_template", render_args.template_name
33
+ assert_equal({ :some => :option }, render_args.options)
34
34
  end
35
35
 
36
36
  should "allow specifying the layouts using #layout or #layouts" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deas
3
3
  version: !ruby/object:Gem::Version
4
- hash: 59
4
+ hash: 55
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 9
8
+ - 10
9
9
  - 0
10
- version: 0.9.0
10
+ version: 0.10.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,12 +16,11 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2013-05-13 00:00:00 Z
19
+ date: 2013-05-14 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- name: ns-options
23
22
  prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
23
+ version_requirements: &id001 !ruby/object:Gem::Requirement
25
24
  none: false
26
25
  requirements:
27
26
  - - ~>
@@ -39,12 +38,12 @@ dependencies:
39
38
  - 1
40
39
  - 4
41
40
  version: 1.1.4
41
+ requirement: *id001
42
+ name: ns-options
42
43
  type: :runtime
43
- version_requirements: *id001
44
44
  - !ruby/object:Gem::Dependency
45
- name: rack
46
45
  prerelease: false
47
- requirement: &id002 !ruby/object:Gem::Requirement
46
+ version_requirements: &id002 !ruby/object:Gem::Requirement
48
47
  none: false
49
48
  requirements:
50
49
  - - ~>
@@ -54,12 +53,12 @@ dependencies:
54
53
  - 1
55
54
  - 5
56
55
  version: "1.5"
56
+ requirement: *id002
57
+ name: rack
57
58
  type: :runtime
58
- version_requirements: *id002
59
59
  - !ruby/object:Gem::Dependency
60
- name: sinatra
61
60
  prerelease: false
62
- requirement: &id003 !ruby/object:Gem::Requirement
61
+ version_requirements: &id003 !ruby/object:Gem::Requirement
63
62
  none: false
64
63
  requirements:
65
64
  - - ~>
@@ -69,12 +68,12 @@ dependencies:
69
68
  - 1
70
69
  - 4
71
70
  version: "1.4"
71
+ requirement: *id003
72
+ name: sinatra
72
73
  type: :runtime
73
- version_requirements: *id003
74
74
  - !ruby/object:Gem::Dependency
75
- name: assert
76
75
  prerelease: false
77
- requirement: &id004 !ruby/object:Gem::Requirement
76
+ version_requirements: &id004 !ruby/object:Gem::Requirement
78
77
  none: false
79
78
  requirements:
80
79
  - - ">="
@@ -83,12 +82,12 @@ dependencies:
83
82
  segments:
84
83
  - 0
85
84
  version: "0"
85
+ requirement: *id004
86
+ name: assert
86
87
  type: :development
87
- version_requirements: *id004
88
88
  - !ruby/object:Gem::Dependency
89
- name: assert-mocha
90
89
  prerelease: false
91
- requirement: &id005 !ruby/object:Gem::Requirement
90
+ version_requirements: &id005 !ruby/object:Gem::Requirement
92
91
  none: false
93
92
  requirements:
94
93
  - - ">="
@@ -97,12 +96,12 @@ dependencies:
97
96
  segments:
98
97
  - 0
99
98
  version: "0"
99
+ requirement: *id005
100
+ name: assert-mocha
100
101
  type: :development
101
- version_requirements: *id005
102
102
  - !ruby/object:Gem::Dependency
103
- name: assert-rack-test
104
103
  prerelease: false
105
- requirement: &id006 !ruby/object:Gem::Requirement
104
+ version_requirements: &id006 !ruby/object:Gem::Requirement
106
105
  none: false
107
106
  requirements:
108
107
  - - ">="
@@ -111,8 +110,9 @@ dependencies:
111
110
  segments:
112
111
  - 0
113
112
  version: "0"
113
+ requirement: *id006
114
+ name: assert-rack-test
114
115
  type: :development
115
- version_requirements: *id006
116
116
  description: Handler-based web framework powered by Sinatra
117
117
  email:
118
118
  - kelly@kellyredding.com
@@ -134,6 +134,7 @@ files:
134
134
  - lib/deas/error_handler.rb
135
135
  - lib/deas/logging.rb
136
136
  - lib/deas/rack_request_fix.rb
137
+ - lib/deas/redirect_handler.rb
137
138
  - lib/deas/route.rb
138
139
  - lib/deas/runner.rb
139
140
  - lib/deas/server.rb
@@ -158,6 +159,7 @@ files:
158
159
  - test/system/rack_tests.rb
159
160
  - test/unit/error_handler_tests.rb
160
161
  - test/unit/logging_tests.rb
162
+ - test/unit/redirect_handler_tests.rb
161
163
  - test/unit/route_tests.rb
162
164
  - test/unit/runner_tests.rb
163
165
  - test/unit/server_tests.rb
@@ -195,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
195
197
  requirements: []
196
198
 
197
199
  rubyforge_project:
198
- rubygems_version: 1.8.24
200
+ rubygems_version: 1.8.15
199
201
  signing_key:
200
202
  specification_version: 3
201
203
  summary: Handler-based web framework powered by Sinatra
@@ -213,6 +215,7 @@ test_files:
213
215
  - test/system/rack_tests.rb
214
216
  - test/unit/error_handler_tests.rb
215
217
  - test/unit/logging_tests.rb
218
+ - test/unit/redirect_handler_tests.rb
216
219
  - test/unit/route_tests.rb
217
220
  - test/unit/runner_tests.rb
218
221
  - test/unit/server_tests.rb