deas 0.23.4 → 0.24.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/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