deas 0.26.0 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,34 @@
1
+ require 'deas/runner'
2
+
3
+ module Deas
4
+
5
+ class DeasRunner < Runner
6
+
7
+ def initialize(handler_class, args = nil)
8
+ a = args || {}
9
+ runner_args = a.merge(:params => NormalizedParams.new(a[:params]).value)
10
+ super(handler_class, runner_args)
11
+ end
12
+
13
+ def run
14
+ run_callbacks self.handler_class.before_callbacks
15
+ self.handler.init
16
+ response_data = self.handler.run
17
+ run_callbacks self.handler_class.after_callbacks
18
+ response_data
19
+ end
20
+
21
+ private
22
+
23
+ def run_callbacks(callbacks)
24
+ callbacks.each{|proc| self.handler.instance_eval(&proc) }
25
+ end
26
+
27
+ class NormalizedParams < Deas::Runner::NormalizedParams
28
+ def file_type?(value)
29
+ value.kind_of?(::Tempfile)
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -2,6 +2,7 @@ require 'deas/view_handler'
2
2
  require 'deas/url'
3
3
 
4
4
  module Deas
5
+
5
6
  class RedirectProxy
6
7
 
7
8
  attr_reader :handler_class_name, :handler_class
@@ -39,5 +40,8 @@ module Deas
39
40
  @handler_class_name = @handler_class.name
40
41
  end
41
42
 
43
+ def validate!; end
44
+
42
45
  end
46
+
43
47
  end
data/lib/deas/route.rb CHANGED
@@ -4,19 +4,29 @@ module Deas
4
4
 
5
5
  class Route
6
6
 
7
- attr_reader :method, :path, :handler_proxy, :handler_class
7
+ attr_reader :method, :path, :route_proxy, :handler_class
8
8
 
9
- def initialize(method, path, handler_proxy)
10
- @method, @path, @handler_proxy = method, path, handler_proxy
9
+ def initialize(method, path, route_proxy)
10
+ @method, @path, @route_proxy = method, path, route_proxy
11
11
  end
12
12
 
13
13
  def validate!
14
- @handler_class = @handler_proxy.handler_class
14
+ @route_proxy.validate!
15
+ @handler_class = @route_proxy.handler_class
15
16
  end
16
17
 
17
- # TODO: unit test this??
18
18
  def run(sinatra_call)
19
- runner = Deas::SinatraRunner.new(self.handler_class, sinatra_call)
19
+ args = {
20
+ :sinatra_call => sinatra_call,
21
+ :request => sinatra_call.request,
22
+ :response => sinatra_call.response,
23
+ :params => sinatra_call.params,
24
+ :logger => sinatra_call.settings.logger,
25
+ :router => sinatra_call.settings.router,
26
+ :session => sinatra_call.session
27
+ }
28
+ runner = Deas::SinatraRunner.new(self.handler_class, args)
29
+
20
30
  sinatra_call.request.env.tap do |env|
21
31
  env['deas.params'] = runner.params
22
32
  env['deas.handler_class_name'] = self.handler_class.name
@@ -4,14 +4,14 @@ require 'deas/exceptions'
4
4
  module Deas
5
5
  class RouteProxy
6
6
 
7
- attr_reader :handler_class_name
7
+ attr_reader :handler_class_name, :handler_class
8
8
 
9
9
  def initialize(handler_class_name)
10
10
  @handler_class_name = handler_class_name
11
11
  end
12
12
 
13
- def handler_class
14
- constantize(@handler_class_name).tap do |handler_class|
13
+ def validate!
14
+ @handler_class = constantize(@handler_class_name).tap do |handler_class|
15
15
  raise(NoHandlerClassError.new(@handler_class_name)) if !handler_class
16
16
  end
17
17
  end
data/lib/deas/runner.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'rack/utils'
2
+ require 'deas/router'
2
3
 
3
4
  module Deas
4
5
 
@@ -8,9 +9,17 @@ module Deas
8
9
  attr_reader :request, :response, :params
9
10
  attr_reader :logger, :router, :session
10
11
 
11
- def initialize(handler_class)
12
+ def initialize(handler_class, args = nil)
12
13
  @handler_class = handler_class
13
14
  @handler = @handler_class.new(self)
15
+
16
+ a = args || {}
17
+ @request = a[:request]
18
+ @response = a[:response]
19
+ @params = a[:params] || {}
20
+ @logger = a[:logger] || Deas::NullLogger.new
21
+ @router = a[:router] || Deas::Router.new
22
+ @session = a[:session]
14
23
  end
15
24
 
16
25
  def halt(*args); raise NotImplementedError; end
@@ -19,7 +28,6 @@ module Deas
19
28
  def status(*args); raise NotImplementedError; end
20
29
  def headers(*args); raise NotImplementedError; end
21
30
  def render(*args); raise NotImplementedError; end
22
- def partial(*args); raise NotImplementedError; end
23
31
  def send_file(*args); raise NotImplementedError; end
24
32
 
25
33
  class NormalizedParams
@@ -1,32 +1,13 @@
1
- require 'deas/runner'
1
+ require 'deas/deas_runner'
2
2
  require 'deas/template'
3
3
 
4
4
  module Deas
5
5
 
6
- class SinatraRunner < Runner
6
+ class SinatraRunner < DeasRunner
7
7
 
8
- attr_reader :app_settings
9
-
10
- def initialize(handler_class, sinatra_call)
11
- @sinatra_call = sinatra_call
12
- @app_settings = @sinatra_call.settings
13
-
14
- @request = @sinatra_call.request
15
- @response = @sinatra_call.response
16
- @params = NormalizedParams.new(@sinatra_call.params).value
17
- @logger = @sinatra_call.settings.logger
18
- @router = @sinatra_call.settings.router
19
- @session = @sinatra_call.session
20
-
21
- super(handler_class)
22
- end
23
-
24
- def run
25
- run_callbacks @handler_class.before_callbacks
26
- @handler.init
27
- response_data = @handler.run
28
- run_callbacks @handler_class.after_callbacks
29
- response_data
8
+ def initialize(handler_class, args = nil)
9
+ @sinatra_call = (args || {})[:sinatra_call]
10
+ super(handler_class, args)
30
11
  end
31
12
 
32
13
  # Helpers
@@ -59,41 +40,30 @@ module Deas
59
40
  @sinatra_call.headers(*args)
60
41
  end
61
42
 
62
- def render(template_name, options = nil, &block)
63
- options ||= {}
43
+ def render(template_name, opts = nil, &block)
44
+ self.content_type(get_content_type(template_name)) if self.content_type.nil?
45
+
46
+ # TODO: move to DeasRunner, don't pass sinatra call to create template
47
+ # def render(template_name, *args, &block)
48
+ # super(template_name, *args, &block)
49
+ options = opts || {}
64
50
  options[:locals] = {
65
- :view => @handler,
66
- :logger => @logger
51
+ :view => self.handler,
52
+ :logger => self.logger
67
53
  }.merge(options[:locals] || {})
68
- options[:layout] ||= @handler_class.layouts
69
-
70
- self.content_type(get_content_type(template_name)) if self.content_type.nil?
54
+ options[:layout] = self.handler_class.layouts if !options.key?(:layout)
71
55
  Deas::Template.new(@sinatra_call, template_name, options).render(&block)
72
56
  end
73
57
 
74
- def partial(partial_name, locals = nil)
75
- Deas::Template::Partial.new(@sinatra_call, partial_name, locals).render
76
- end
77
-
78
58
  def send_file(*args, &block)
79
59
  @sinatra_call.send_file(*args, &block)
80
60
  end
81
61
 
82
62
  private
83
63
 
84
- def run_callbacks(callbacks)
85
- callbacks.each{|proc| @handler.instance_eval(&proc) }
86
- end
87
-
88
64
  def get_content_type(template_name)
89
65
  File.extname(template_name)[1..-1] || 'html'
90
66
  end
91
67
 
92
- class NormalizedParams < Deas::Runner::NormalizedParams
93
- def file_type?(value)
94
- value.kind_of?(::Tempfile)
95
- end
96
- end
97
-
98
68
  end
99
69
  end
data/lib/deas/template.rb CHANGED
@@ -76,9 +76,9 @@ module Deas
76
76
 
77
77
  def initialize(sinatra_call, name, locals = nil)
78
78
  options = { :locals => (locals || {}) }
79
- name = begin
80
- basename = File.basename(name.to_s)
81
- name.to_s.sub(/#{basename}\Z/, "_#{basename}")
79
+ name = name.to_s.tap do |n|
80
+ basename = File.basename(n)
81
+ n.sub!(/#{basename}\Z/, "_#{basename}") unless basename[0] == '_'[0]
82
82
  end
83
83
  super sinatra_call, name, options
84
84
  end
@@ -1,4 +1,3 @@
1
- require 'ostruct'
2
1
  require 'rack/multipart'
3
2
  require 'deas/router'
4
3
  require 'deas/runner'
@@ -7,27 +6,26 @@ module Deas
7
6
 
8
7
  class TestRunner < Runner
9
8
 
10
- attr_reader :app_settings, :return_value
9
+ attr_reader :return_value
11
10
 
12
11
  def initialize(handler_class, args = nil)
13
12
  args = (args || {}).dup
14
- @app_settings = OpenStruct.new(args.delete(:app_settings))
15
13
 
16
- @request = args.delete(:request)
17
- @response = args.delete(:response)
18
- @params = NormalizedParams.new(args.delete(:params) || {}).value
19
- @logger = args.delete(:logger) || Deas::NullLogger.new
20
- @router = args.delete(:router) || Deas::Router.new
21
- @session = args.delete(:session)
22
-
23
- super(handler_class)
24
- args.each{|key, value| @handler.send("#{key}=", value) }
25
-
26
- @return_value = catch(:halt){ @handler.init; nil }
14
+ super(handler_class, {
15
+ :request => args.delete(:request),
16
+ :response => args.delete(:response),
17
+ :params => NormalizedParams.new(args.delete(:params) || {}).value,
18
+ :logger => args.delete(:logger),
19
+ :router => args.delete(:router),
20
+ :session => args.delete(:session)
21
+ })
22
+ args.each{|key, value| self.handler.send("#{key}=", value) }
23
+
24
+ @return_value = catch(:halt){ self.handler.init; nil }
27
25
  end
28
26
 
29
27
  def run
30
- @return_value ||= catch(:halt){ @handler.run }
28
+ @return_value ||= catch(:halt){ self.handler.run }
31
29
  end
32
30
 
33
31
  # Helpers
@@ -74,11 +72,6 @@ module Deas
74
72
  end
75
73
  RenderArgs = Struct.new(:template_name, :options, :block)
76
74
 
77
- def partial(partial_name, locals = nil)
78
- PartialArgs.new(partial_name, locals)
79
- end
80
- PartialArgs = Struct.new(:partial_name, :locals)
81
-
82
75
  def send_file(file_path, options = nil, &block)
83
76
  SendFileArgs.new(file_path, options, block)
84
77
  end
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.26.0"
2
+ VERSION = "0.27.0"
3
3
  end
@@ -54,10 +54,8 @@ module Deas
54
54
  def headers(*args); @deas_runner.headers(*args); end
55
55
 
56
56
  def render(*args, &block); @deas_runner.render(*args, &block); end
57
- def partial(*args, &block); @deas_runner.partial(*args, &block); end
58
57
  def send_file(*args, &block); @deas_runner.send_file(*args, &block); end
59
58
 
60
- def app_settings; @deas_runner.app_settings; end
61
59
  def logger; @deas_runner.logger; end
62
60
  def router; @deas_runner.router; end
63
61
  def request; @deas_runner.request; end
@@ -1,18 +1,21 @@
1
- require 'deas'
2
1
  require 'ostruct'
2
+ require 'deas'
3
+ require 'deas/router'
3
4
 
4
5
  class FakeSinatraCall
5
6
 
6
7
  # Mimic's the context that is accessible in a Sinatra' route. Should provide
7
8
  # any methods needed to replace using an actual Sinatra app.
8
9
 
9
- attr_accessor :request, :response, :params, :settings, :session, :logger
10
+ attr_accessor :request, :response, :params, :logger, :router, :session
11
+ attr_accessor :settings
10
12
 
11
13
  def initialize(settings={})
12
- @request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
14
+ @request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
13
15
  @response = FakeResponse.new
14
16
  @params = @request.params
15
17
  @logger = Deas::NullLogger.new
18
+ @router = Deas::Router.new
16
19
  @session = @request.session
17
20
 
18
21
  @settings = OpenStruct.new({
@@ -58,5 +61,16 @@ end
58
61
 
59
62
  class FakeRequest < Struct.new(:http_method, :path, :params, :session)
60
63
  alias :request_method :http_method
64
+
65
+ attr_reader :logging_msgs
66
+
67
+ def env
68
+ @env ||= {
69
+ 'deas.logging' => Proc.new do |msg|
70
+ @logging_msgs ||= []
71
+ @logging_msgs.push(msg)
72
+ end
73
+ }
74
+ end
61
75
  end
62
76
  FakeResponse = Struct.new(:status, :headers, :body)
@@ -37,7 +37,6 @@ class DeasTestServer
37
37
  get '/haml_with_layout', 'HamlWithLayoutHandler'
38
38
  get '/with_haml_layout', 'WithHamlLayoutHandler'
39
39
  get '/haml_with_haml_layout', 'HamlWithHamlLayoutHandler'
40
- get '/partial.html', 'PartialHandler'
41
40
 
42
41
  get '/handler/tests.json', 'HandlerTestsHandler'
43
42
 
@@ -195,13 +194,6 @@ class HamlWithHamlLayoutHandler
195
194
 
196
195
  end
197
196
 
198
- class PartialHandler
199
- include Deas::ViewHandler
200
-
201
- def run!; partial 'info', :info => 'some-info'; end
202
-
203
- end
204
-
205
197
  class RedirectHandler
206
198
  include Deas::ViewHandler
207
199
 
@@ -235,7 +227,6 @@ class HandlerTestsHandler
235
227
 
236
228
  def init!
237
229
  @data = {}
238
- set_data('app_settings_a_setting'){ self.app_settings.a_setting }
239
230
  set_data('logger_class_name'){ self.logger.class.name }
240
231
  set_data('request_method'){ self.request.request_method.to_s }
241
232
  set_data('response_firstheaderval'){ self.response.headers.sort.first.to_s }
@@ -1,6 +1,6 @@
1
1
  require 'deas/view_handler'
2
2
 
3
- class TestViewHandler
3
+ class EmptyViewHandler
4
4
  include Deas::ViewHandler
5
5
 
6
6
  end
@@ -16,67 +16,36 @@ class TestRunnerViewHandler
16
16
 
17
17
  end
18
18
 
19
- class RenderViewHandler
19
+ class DeasRunnerViewHandler
20
20
  include Deas::ViewHandler
21
21
 
22
- def run!
23
- render "my_template", :some => :option
24
- end
25
- end
22
+ attr_reader :before_called, :after_called
23
+ attr_reader :init_bang_called, :run_bang_called
26
24
 
27
- class PartialViewHandler
28
- include Deas::ViewHandler
25
+ layout 'web'
26
+
27
+ before{ @before_called = true }
28
+ after{ @after_called = true }
29
+
30
+ def init!; @init_bang_called = true; end
31
+ def run!; @run_bang_called = true; end
29
32
 
30
- def run!
31
- partial "my_partial", :some => 'locals'
32
- end
33
33
  end
34
34
 
35
- class SendFileViewHandler
35
+ class RenderViewHandler
36
36
  include Deas::ViewHandler
37
37
 
38
38
  def run!
39
- send_file "my_file.txt", :some => :option
39
+ render "my_template", :some => :option
40
40
  end
41
41
  end
42
42
 
43
- class FlagViewHandler
43
+ class SendFileViewHandler
44
44
  include Deas::ViewHandler
45
- before{ @before_hook_called = true }
46
- after{ @after_hook_called = true }
47
- layout 'web'
48
-
49
- attr_reader :before_init_called, :init_bang_called, :after_init_called
50
- attr_reader :before_run_called, :run_bang_called, :after_run_called
51
- attr_reader :before_hook_called, :after_hook_called, :second_before_init_called
52
-
53
- before_init do
54
- @before_init_called = true
55
- end
56
- before_init do
57
- @second_before_init_called = true
58
- end
59
-
60
- def init!
61
- @init_bang_called = true
62
- end
63
-
64
- after_init do
65
- @after_init_called = true
66
- end
67
-
68
- before_run do
69
- @before_run_called = true
70
- end
71
45
 
72
46
  def run!
73
- @run_bang_called = true
74
- end
75
-
76
- after_run do
77
- @after_run_called = true
47
+ send_file "my_file.txt", :some => :option
78
48
  end
79
-
80
49
  end
81
50
 
82
51
  class HaltViewHandler