deas 0.23.4 → 0.24.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/deas/runner.rb CHANGED
@@ -2,7 +2,7 @@ module Deas
2
2
 
3
3
  class Runner
4
4
 
5
- attr_reader :app_settings
5
+ attr_reader :handler_class, :handler
6
6
  attr_reader :request, :response, :params, :logger, :session
7
7
 
8
8
  def initialize(handler_class)
@@ -16,6 +16,7 @@ module Deas
16
16
  def status(*args); raise NotImplementedError; end
17
17
  def headers(*args); raise NotImplementedError; end
18
18
  def render(*args); raise NotImplementedError; end
19
+ def partial(*args); raise NotImplementedError; end
19
20
  def send_file(*args); raise NotImplementedError; end
20
21
 
21
22
  end
@@ -9,14 +9,18 @@ module Deas
9
9
  self.new(*args).run
10
10
  end
11
11
 
12
+ attr_reader :app_settings
13
+
12
14
  def initialize(handler_class, sinatra_call)
13
15
  @sinatra_call = sinatra_call
14
16
  @app_settings = @sinatra_call.settings
15
- @logger = @sinatra_call.settings.logger
16
- @params = normalize_params(@sinatra_call.params)
17
+
17
18
  @request = @sinatra_call.request
18
19
  @response = @sinatra_call.response
20
+ @params = normalize_params(@sinatra_call.params)
21
+ @logger = @sinatra_call.settings.logger
19
22
  @session = @sinatra_call.session
23
+
20
24
  super(handler_class)
21
25
  end
22
26
 
@@ -67,6 +71,10 @@ module Deas
67
71
  Deas::Template.new(@sinatra_call, template_name, options).render(&block)
68
72
  end
69
73
 
74
+ def partial(partial_name, locals = nil)
75
+ Deas::Template::Partial.new(@sinatra_call, partial_name, locals).render
76
+ end
77
+
70
78
  def send_file(*args, &block)
71
79
  @sinatra_call.send_file(*args, &block)
72
80
  end
data/lib/deas/template.rb CHANGED
@@ -40,7 +40,9 @@ module Deas
40
40
  end
41
41
 
42
42
  class Scope
43
+
43
44
  attr_reader :sinatra_call
45
+
44
46
  def initialize(sinatra_call)
45
47
  @sinatra_call = sinatra_call
46
48
  end
@@ -71,6 +73,7 @@ module Deas
71
73
  self.sinatra_call == other_scope.sinatra_call
72
74
  self.class.included_modules == other_scope.class.included_modules
73
75
  end
76
+
74
77
  end
75
78
 
76
79
  class Partial < Template
@@ -6,15 +6,16 @@ module Deas
6
6
 
7
7
  class TestRunner < Runner
8
8
 
9
- attr_reader :handler, :return_value
9
+ attr_reader :app_settings, :return_value
10
10
 
11
11
  def initialize(handler_class, args = nil)
12
12
  args = (args || {}).dup
13
13
  @app_settings = OpenStruct.new(args.delete(:app_settings))
14
- @logger = args.delete(:logger) || Deas::NullLogger.new
15
- @params = normalize_params(args.delete(:params) || {})
14
+
16
15
  @request = args.delete(:request)
17
16
  @response = args.delete(:response)
17
+ @params = normalize_params(args.delete(:params) || {})
18
+ @logger = args.delete(:logger) || Deas::NullLogger.new
18
19
  @session = args.delete(:session)
19
20
 
20
21
  super(handler_class)
@@ -54,31 +55,31 @@ module Deas
54
55
  def content_type(value, opts={})
55
56
  ContentTypeArgs.new(value, opts)
56
57
  end
57
-
58
58
  ContentTypeArgs = Struct.new(:value, :opts)
59
59
 
60
60
  def status(value)
61
61
  StatusArgs.new(value)
62
62
  end
63
-
64
63
  StatusArgs = Struct.new(:value)
65
64
 
66
65
  def headers(value)
67
66
  HeadersArgs.new(value)
68
67
  end
69
-
70
68
  HeadersArgs = Struct.new(:value)
71
69
 
72
70
  def render(template_name, options = nil, &block)
73
71
  RenderArgs.new(template_name, options, block)
74
72
  end
75
-
76
73
  RenderArgs = Struct.new(:template_name, :options, :block)
77
74
 
75
+ def partial(partial_name, locals = nil)
76
+ PartialArgs.new(partial_name, locals)
77
+ end
78
+ PartialArgs = Struct.new(:partial_name, :locals)
79
+
78
80
  def send_file(file_path, options = nil, &block)
79
81
  SendFileArgs.new(file_path, options, block)
80
82
  end
81
-
82
83
  SendFileArgs = Struct.new(:file_path, :options, :block)
83
84
 
84
85
  private
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.23.4"
2
+ VERSION = "0.24.0"
3
3
  end
@@ -54,6 +54,7 @@ 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
57
58
  def send_file(*args, &block); @deas_runner.send_file(*args, &block); end
58
59
 
59
60
  def app_settings; @deas_runner.app_settings; end
@@ -9,15 +9,16 @@ class FakeSinatraCall
9
9
  attr_accessor :request, :response, :params, :settings, :session, :logger
10
10
 
11
11
  def initialize(settings={})
12
- @request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
13
- @params = @request.params
14
- @session = @request.session
15
- @response = FakeResponse.new
16
- @logger = Deas::NullLogger.new
17
12
  @settings = OpenStruct.new(settings.merge({
18
13
  :deas_template_scope => Deas::Template::Scope,
19
14
  :deas_default_charset => 'utf-8'
20
15
  }))
16
+
17
+ @request = FakeRequest.new('GET','/something', {}, OpenStruct.new)
18
+ @response = FakeResponse.new
19
+ @params = @request.params
20
+ @logger = Deas::NullLogger.new
21
+ @session = @request.session
21
22
  end
22
23
 
23
24
  def halt(*args)
@@ -33,9 +34,6 @@ class FakeSinatraCall
33
34
  def headers(*args); args; end
34
35
 
35
36
  # return the template name for each nested calls
36
-
37
- RenderArgs = Struct.new(:template_name, :opts, :block_call_result)
38
-
39
37
  def erb(template_name, opts, &block)
40
38
  if block
41
39
  RenderArgs.new(template_name, opts, block.call)
@@ -43,6 +41,16 @@ class FakeSinatraCall
43
41
  RenderArgs.new(template_name, opts, nil)
44
42
  end
45
43
  end
44
+ RenderArgs = Struct.new(:template_name, :opts, :block_call_result)
45
+
46
+ def send_file(file_path, opts, &block)
47
+ if block
48
+ SendFileArgs.new(file_path, opts, block.call)
49
+ else
50
+ SendFileArgs.new(file_path, opts, nil)
51
+ end
52
+ end
53
+ SendFileArgs = Struct.new(:file_path, :options, :block_call_result)
46
54
 
47
55
  end
48
56
 
@@ -37,6 +37,7 @@ 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'
40
41
 
41
42
  get '/handler/tests.json', 'HandlerTestsHandler'
42
43
 
@@ -194,6 +195,13 @@ class HamlWithHamlLayoutHandler
194
195
 
195
196
  end
196
197
 
198
+ class PartialHandler
199
+ include Deas::ViewHandler
200
+
201
+ def run!; partial 'info', :info => 'some-info'; end
202
+
203
+ end
204
+
197
205
  class RedirectHandler
198
206
  include Deas::ViewHandler
199
207
 
@@ -24,6 +24,14 @@ class RenderViewHandler
24
24
  end
25
25
  end
26
26
 
27
+ class PartialViewHandler
28
+ include Deas::ViewHandler
29
+
30
+ def run!
31
+ partial "my_partial", :some => 'locals'
32
+ end
33
+ end
34
+
27
35
  class SendFileViewHandler
28
36
  include Deas::ViewHandler
29
37
 
@@ -96,6 +96,13 @@ module Deas
96
96
  assert_equal expected_body, last_response.body
97
97
  end
98
98
 
99
+ should "render partial templates" do
100
+ get '/partial.html'
101
+ expected_body = "Stuff: some-info\n"
102
+ assert_equal 200, last_response.status
103
+ assert_equal expected_body, last_response.body
104
+ end
105
+
99
106
  should "return a 302 redirecting to the expected locations" do
100
107
  get '/redirect'
101
108
  expected_location = 'http://google.com'
@@ -1,7 +1,8 @@
1
1
  require 'assert'
2
- require 'test/support/view_handlers'
3
2
  require 'deas/runner'
4
3
 
4
+ require 'test/support/view_handlers'
5
+
5
6
  class Deas::Runner
6
7
 
7
8
  class BaseTests < Assert::Context
@@ -11,37 +12,33 @@ class Deas::Runner
11
12
  end
12
13
  subject{ @runner }
13
14
 
14
- should have_reader :app_settings
15
+ should have_readers :handler_class, :handler
15
16
  should have_readers :request, :response, :params, :logger, :session
16
- should have_imeths :halt, :redirect, :content_type, :status
17
- should have_imeths :render, :send_file
17
+ should have_imeths :halt, :redirect, :content_type, :status, :headers
18
+ should have_imeths :render, :partial, :send_file
18
19
 
19
- should "raise NotImplementedError with #send_file" do
20
- assert_raises(NotImplementedError){ subject.send_file }
20
+ should "know its handler and handler class" do
21
+ assert_equal TestViewHandler, subject.handler_class
22
+ assert_instance_of subject.handler_class, subject.handler
21
23
  end
22
24
 
23
- should "raise NotImplementedError with #halt" do
24
- assert_raises(NotImplementedError){ subject.halt }
25
+ should "not set any settings" do
26
+ assert_nil subject.request
27
+ assert_nil subject.response
28
+ assert_nil subject.params
29
+ assert_nil subject.logger
30
+ assert_nil subject.session
25
31
  end
26
32
 
27
- should "raise NotImplementedError with #redirect" do
33
+ should "not implement any actions" do
34
+ assert_raises(NotImplementedError){ subject.halt }
28
35
  assert_raises(NotImplementedError){ subject.redirect }
29
- end
30
-
31
- should "raise NotImplementedError with #content_type" do
32
36
  assert_raises(NotImplementedError){ subject.content_type }
33
- end
34
-
35
- should "raise NotImplementedError with #status" do
36
37
  assert_raises(NotImplementedError){ subject.status }
37
- end
38
-
39
- should "raise NotImplementedError with #headers" do
40
38
  assert_raises(NotImplementedError){ subject.headers }
41
- end
42
-
43
- should "raise NotImplementedError with #render" do
44
39
  assert_raises(NotImplementedError){ subject.render }
40
+ assert_raises(NotImplementedError){ subject.partial }
41
+ assert_raises(NotImplementedError){ subject.send_file }
45
42
  end
46
43
 
47
44
  end
@@ -1,8 +1,9 @@
1
1
  require 'assert'
2
+ require 'deas/sinatra_runner'
3
+
2
4
  require 'test/support/fake_sinatra_call'
3
5
  require 'test/support/view_handlers'
4
6
  require 'deas/template'
5
- require 'deas/sinatra_runner'
6
7
 
7
8
  class Deas::SinatraRunner
8
9
 
@@ -14,35 +15,23 @@ class Deas::SinatraRunner
14
15
  end
15
16
  subject{ @runner }
16
17
 
17
- should have_imeths :run, :request, :response, :params, :logger, :session
18
- should have_imeths :halt, :redirect, :content_type, :status, :render
18
+ should have_readers :app_settings
19
+ should have_imeths :run
19
20
 
20
- should "return the sinatra_call's request with #request" do
21
+ should "get its settings from the sinatra call" do
21
22
  assert_equal @fake_sinatra_call.request, subject.request
22
- end
23
-
24
- should "return the sinatra_call's response with #response" do
25
23
  assert_equal @fake_sinatra_call.response, subject.response
26
- end
27
-
28
- should "return the sinatra_call's params with #params" do
29
24
  assert_equal @fake_sinatra_call.params, subject.params
30
- end
31
-
32
- should "return the sinatra_call's session with #session" do
33
- assert_equal @fake_sinatra_call.session, subject.session
34
- end
35
-
36
- should "return the sinatra_call's settings logger with #logger" do
37
25
  assert_equal @fake_sinatra_call.settings.deas_logger, subject.logger
26
+ assert_equal @fake_sinatra_call.session, subject.session
38
27
  end
39
28
 
40
- should "call the sinatra_call's halt with #halt" do
29
+ should "call the sinatra_call's halt with" do
41
30
  return_value = catch(:halt){ subject.halt('test') }
42
31
  assert_equal [ 'test' ], return_value
43
32
  end
44
33
 
45
- should "call the sinatra_call's redirect method with #redirect" do
34
+ should "call the sinatra_call's redirect method with" do
46
35
  return_value = catch(:halt){ subject.redirect('http://google.com') }
47
36
  expected = [ 302, { 'Location' => 'http://google.com' } ]
48
37
 
@@ -61,7 +50,7 @@ class Deas::SinatraRunner
61
50
  assert_equal [422], subject.status(422)
62
51
  end
63
52
 
64
- should "call the sinatra_call's status to set the response status" do
53
+ should "call the sinatra_call's headers to set the response headers" do
65
54
  exp_headers = {
66
55
  'a-header' => 'some value',
67
56
  'other' => 'other'
@@ -69,7 +58,7 @@ class Deas::SinatraRunner
69
58
  assert_equal [exp_headers], subject.headers(exp_headers)
70
59
  end
71
60
 
72
- should "render the template with a :view local and the handler layouts with #render" do
61
+ should "render the template with a :view local and the handler layouts" do
73
62
  exp_handler = FlagViewHandler.new(subject)
74
63
  exp_layouts = FlagViewHandler.layouts
75
64
  exp_result = Deas::Template.new(@fake_sinatra_call, 'index', {
@@ -80,6 +69,22 @@ class Deas::SinatraRunner
80
69
  assert_equal exp_result, subject.render('index')
81
70
  end
82
71
 
72
+ should "render partials with locals" do
73
+ exp_result = Deas::Template::Partial.new(@fake_sinatra_call, 'info', {
74
+ :some => 'locals'
75
+ }).render
76
+
77
+ assert_equal exp_result, subject.partial('info', :some => 'locals')
78
+ end
79
+
80
+ should "call the sinatra_call's send_file to set the send files" do
81
+ block_called = false
82
+ args = subject.send_file('a/file', {:some => 'opts'}, &proc{ block_called = true })
83
+ assert_equal 'a/file', args.file_path
84
+ assert_equal({:some => 'opts'}, args.options)
85
+ assert_true block_called
86
+ end
87
+
83
88
  end
84
89
 
85
90
  class RunTests < UnitTests
@@ -2,6 +2,7 @@ require 'assert'
2
2
  require 'deas/test_runner'
3
3
 
4
4
  require 'rack/test'
5
+ require 'deas/runner'
5
6
  require 'test/support/view_handlers'
6
7
 
7
8
  class Deas::TestRunner
@@ -13,18 +14,22 @@ class Deas::TestRunner
13
14
  end
14
15
  subject{ @runner }
15
16
 
16
- should have_readers :handler, :return_value
17
+ should have_readers :app_settings, :return_value
18
+ should have_imeths :run
17
19
 
18
- should "build a handler instance" do
19
- assert_kind_of TestRunnerViewHandler, subject.handler
20
+ should "be a Runner" do
21
+ assert subject.class < Deas::Runner
20
22
  end
21
23
 
22
- should "default the handler settings" do
24
+ should "know its app_settings" do
23
25
  assert_kind_of OpenStruct, subject.app_settings
24
- assert_kind_of Deas::NullLogger, subject.logger
25
- assert_equal Hash.new, subject.params
26
+ end
27
+
28
+ should "default its settings" do
26
29
  assert_nil subject.request
27
30
  assert_nil subject.response
31
+ assert_equal Hash.new, subject.params
32
+ assert_kind_of Deas::NullLogger, subject.logger
28
33
  assert_nil subject.session
29
34
  end
30
35
 
@@ -94,6 +99,16 @@ class Deas::TestRunner
94
99
  assert_equal 'some/template', value.template_name
95
100
  end
96
101
 
102
+ should "build partial args if partial is called" do
103
+ value = subject.partial 'some/partial', :some => 'locals'
104
+ assert_kind_of PartialArgs, value
105
+ [:partial_name, :locals].each do |meth|
106
+ assert_respond_to meth, value
107
+ end
108
+ assert_equal 'some/partial', value.partial_name
109
+ assert_equal({:some => 'locals'}, value.locals)
110
+ end
111
+
97
112
  should "build send file args if send file is called" do
98
113
  value = subject.send_file 'some/file/path'
99
114
  assert_kind_of SendFileArgs, value
@@ -23,17 +23,23 @@ module Deas::ViewHandler
23
23
  should have_cmeths :before_run, :prepend_before_run, :before_run_callbacks
24
24
  should have_cmeths :after_run, :prepend_after_run, :after_run_callbacks
25
25
 
26
- should "raise a NotImplementedError if run! is not overwritten" do
26
+ should "complain if run! is not overwritten" do
27
27
  assert_raises(NotImplementedError){ subject.run! }
28
28
  end
29
29
 
30
- should "be able to render templates" do
30
+ should "render templates" do
31
31
  render_args = test_runner(RenderViewHandler).run
32
32
  assert_equal "my_template", render_args.template_name
33
33
  assert_equal({ :some => :option }, render_args.options)
34
34
  end
35
35
 
36
- should "be able to send files" do
36
+ should "render partial templates" do
37
+ partial_args = test_runner(PartialViewHandler).run
38
+ assert_equal "my_partial", partial_args.partial_name
39
+ assert_equal({:some => 'locals'}, partial_args.locals)
40
+ end
41
+
42
+ should "send files" do
37
43
  send_file_args = test_runner(SendFileViewHandler).run
38
44
  assert_equal "my_file.txt", send_file_args.file_path
39
45
  assert_equal({ :some => :option }, send_file_args.options)
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: 75
4
+ hash: 127
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 23
9
- - 4
10
- version: 0.23.4
8
+ - 24
9
+ - 0
10
+ version: 0.24.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,11 +16,9 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2014-02-20 00:00:00 Z
19
+ date: 2014-06-24 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
- prerelease: false
23
- type: :runtime
24
22
  requirement: &id001 !ruby/object:Gem::Requirement
25
23
  none: false
26
24
  requirements:
@@ -39,11 +37,11 @@ dependencies:
39
37
  - 1
40
38
  - 4
41
39
  version: 1.1.4
42
- version_requirements: *id001
40
+ type: :runtime
43
41
  name: ns-options
44
- - !ruby/object:Gem::Dependency
42
+ version_requirements: *id001
45
43
  prerelease: false
46
- type: :runtime
44
+ - !ruby/object:Gem::Dependency
47
45
  requirement: &id002 !ruby/object:Gem::Requirement
48
46
  none: false
49
47
  requirements:
@@ -54,11 +52,11 @@ dependencies:
54
52
  - 1
55
53
  - 5
56
54
  version: "1.5"
57
- version_requirements: *id002
55
+ type: :runtime
58
56
  name: rack
59
- - !ruby/object:Gem::Dependency
57
+ version_requirements: *id002
60
58
  prerelease: false
61
- type: :runtime
59
+ - !ruby/object:Gem::Dependency
62
60
  requirement: &id003 !ruby/object:Gem::Requirement
63
61
  none: false
64
62
  requirements:
@@ -69,11 +67,11 @@ dependencies:
69
67
  - 1
70
68
  - 4
71
69
  version: "1.4"
72
- version_requirements: *id003
70
+ type: :runtime
73
71
  name: sinatra
74
- - !ruby/object:Gem::Dependency
72
+ version_requirements: *id003
75
73
  prerelease: false
76
- type: :development
74
+ - !ruby/object:Gem::Dependency
77
75
  requirement: &id004 !ruby/object:Gem::Requirement
78
76
  none: false
79
77
  requirements:
@@ -84,11 +82,11 @@ dependencies:
84
82
  - 2
85
83
  - 8
86
84
  version: "2.8"
87
- version_requirements: *id004
85
+ type: :development
88
86
  name: assert
89
- - !ruby/object:Gem::Dependency
87
+ version_requirements: *id004
90
88
  prerelease: false
91
- type: :development
89
+ - !ruby/object:Gem::Dependency
92
90
  requirement: &id005 !ruby/object:Gem::Requirement
93
91
  none: false
94
92
  requirements:
@@ -98,11 +96,11 @@ dependencies:
98
96
  segments:
99
97
  - 0
100
98
  version: "0"
101
- version_requirements: *id005
99
+ type: :development
102
100
  name: assert-mocha
103
- - !ruby/object:Gem::Dependency
101
+ version_requirements: *id005
104
102
  prerelease: false
105
- type: :development
103
+ - !ruby/object:Gem::Dependency
106
104
  requirement: &id006 !ruby/object:Gem::Requirement
107
105
  none: false
108
106
  requirements:
@@ -112,11 +110,11 @@ dependencies:
112
110
  segments:
113
111
  - 0
114
112
  version: "0"
115
- version_requirements: *id006
113
+ type: :development
116
114
  name: assert-rack-test
117
- - !ruby/object:Gem::Dependency
115
+ version_requirements: *id006
118
116
  prerelease: false
119
- type: :development
117
+ - !ruby/object:Gem::Dependency
120
118
  requirement: &id007 !ruby/object:Gem::Requirement
121
119
  none: false
122
120
  requirements:
@@ -126,8 +124,10 @@ dependencies:
126
124
  segments:
127
125
  - 0
128
126
  version: "0"
129
- version_requirements: *id007
127
+ type: :development
130
128
  name: haml
129
+ version_requirements: *id007
130
+ prerelease: false
131
131
  description: Handler-based web framework powered by Sinatra
132
132
  email:
133
133
  - kelly@kellyredding.com
@@ -234,7 +234,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
234
234
  requirements: []
235
235
 
236
236
  rubyforge_project:
237
- rubygems_version: 1.8.24
237
+ rubygems_version: 1.8.25
238
238
  signing_key:
239
239
  specification_version: 3
240
240
  summary: Handler-based web framework powered by Sinatra