deas 0.26.0 → 0.27.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.
@@ -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