deas 0.28.0 → 0.29.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/deas/route.rb CHANGED
@@ -16,14 +16,14 @@ module Deas
16
16
  end
17
17
 
18
18
  def run(sinatra_call)
19
- runner = Deas::SinatraRunner.new(self.handler_class, {
20
- :sinatra_call => sinatra_call,
21
- :request => sinatra_call.request,
22
- :response => sinatra_call.response,
23
- :session => sinatra_call.session,
24
- :params => sinatra_call.params,
25
- :logger => sinatra_call.settings.logger,
26
- :router => sinatra_call.settings.router,
19
+ runner = SinatraRunner.new(self.handler_class, {
20
+ :sinatra_call => sinatra_call,
21
+ :request => sinatra_call.request,
22
+ :response => sinatra_call.response,
23
+ :session => sinatra_call.session,
24
+ :params => sinatra_call.params,
25
+ :logger => sinatra_call.settings.logger,
26
+ :router => sinatra_call.settings.router,
27
27
  :template_source => sinatra_call.settings.template_source
28
28
  })
29
29
 
data/lib/deas/runner.rb CHANGED
@@ -1,3 +1,8 @@
1
+ # need to define class immediately b/c of circular requires:
2
+ # - runner -> router -> route -> deas_runner -> runner
3
+ module Deas; end
4
+ class Deas::Runner; end
5
+
1
6
  require 'rack/utils'
2
7
  require 'deas/logger'
3
8
  require 'deas/router'
@@ -13,15 +13,15 @@ module Deas
13
13
  @logger = @opts['logger'] || Deas::NullLogger.new
14
14
  end
15
15
 
16
- def render(template_name, view_handler, locals)
16
+ def render(template_name, view_handler, locals, &content)
17
17
  raise NotImplementedError
18
18
  end
19
19
 
20
- def partial(template_name, locals)
20
+ def partial(template_name, locals, &content)
21
21
  raise NotImplementedError
22
22
  end
23
23
 
24
- def capture_partial(template_name, locals, &content)
24
+ def compile(template_name, compiled_content)
25
25
  raise NotImplementedError
26
26
  end
27
27
 
@@ -29,7 +29,7 @@ module Deas
29
29
 
30
30
  class NullTemplateEngine < TemplateEngine
31
31
 
32
- def render(template_name, view_handler, locals)
32
+ def render(template_name, view_handler, locals, &content)
33
33
  template_file = self.source_path.join(template_name).to_s
34
34
  unless File.exists?(template_file)
35
35
  raise ArgumentError, "template file `#{template_file}` does not exist"
@@ -37,12 +37,12 @@ module Deas
37
37
  File.read(template_file)
38
38
  end
39
39
 
40
- def partial(template_name, locals)
40
+ def partial(template_name, locals, &content)
41
41
  render(template_name, nil, locals)
42
42
  end
43
43
 
44
- def capture_partial(template_name, locals, &content)
45
- render(template_name, nil, locals)
44
+ def compile(template_name, compiled_content)
45
+ compiled_content # no-op, pass-thru - just return the given content
46
46
  end
47
47
 
48
48
  end
@@ -14,8 +14,9 @@ module Deas
14
14
  def initialize(path, logger = nil)
15
15
  @path = path.to_s
16
16
  @default_opts = {
17
- 'source_path' => @path,
18
- 'logger' => logger || Deas::NullLogger.new
17
+ 'source_path' => @path,
18
+ 'logger' => logger || Deas::NullLogger.new,
19
+ 'deas_template_source' => self
19
20
  }
20
21
  @engines = Hash.new{ |h,k| Deas::NullTemplateEngine.new(@default_opts) }
21
22
  end
@@ -33,16 +34,16 @@ module Deas
33
34
  @engines.keys.include?(get_template_ext(template_name))
34
35
  end
35
36
 
36
- def render(template_name, view_handler, locals)
37
- get_engine(template_name).render(template_name, view_handler, locals)
37
+ def render(template_name, view_handler, locals, &content)
38
+ [ view_handler.class.layouts,
39
+ template_name
40
+ ].flatten.reverse.inject(content) do |render_proc, name|
41
+ proc{ get_engine(name).render(name, view_handler, locals, &render_proc) }
42
+ end.call
38
43
  end
39
44
 
40
- def partial(template_name, locals)
41
- get_engine(template_name).partial(template_name, locals)
42
- end
43
-
44
- def capture_partial(template_name, locals, &content)
45
- get_engine(template_name).capture_partial(template_name, locals, &content)
45
+ def partial(template_name, locals, &content)
46
+ get_engine(template_name).partial(template_name, locals, &content)
46
47
  end
47
48
 
48
49
  private
@@ -1,16 +1,23 @@
1
1
  require 'rack/multipart'
2
2
  require 'deas/router'
3
3
  require 'deas/runner'
4
+ require 'deas/view_handler'
4
5
 
5
6
  module Deas
6
7
 
8
+ InvalidServiceHandlerError = Class.new(StandardError)
9
+
7
10
  class TestRunner < Runner
8
11
 
9
12
  attr_reader :return_value
10
13
 
11
14
  def initialize(handler_class, args = nil)
12
- args = (args || {}).dup
15
+ if !handler_class.include?(Deas::ViewHandler)
16
+ raise InvalidServiceHandlerError, "#{handler_class.inspect} is not a"\
17
+ " Deas::ServiceHandler"
18
+ end
13
19
 
20
+ args = (args || {}).dup
14
21
  super(handler_class, {
15
22
  :request => args.delete(:request),
16
23
  :response => args.delete(:response),
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.28.0"
2
+ VERSION = "0.29.0"
3
3
  end
File without changes
File without changes
@@ -8,11 +8,13 @@ end
8
8
  class TestRunnerViewHandler
9
9
  include Deas::ViewHandler
10
10
 
11
+ attr_reader :before_called, :init_called
11
12
  attr_accessor :custom_value
12
13
 
13
- def run!
14
- 'run has run'
15
- end
14
+ before{ @before_called = true }
15
+
16
+ def init!; @init_called = true; end
17
+ def run!; 'run has run'; end
16
18
 
17
19
  end
18
20
 
@@ -59,13 +59,13 @@ class Deas::Route
59
59
  assert_equal subject.handler_class, @runner_spy.handler_class
60
60
 
61
61
  exp_args = {
62
- :sinatra_call => @fake_sinatra_call,
63
- :request => @fake_sinatra_call.request,
64
- :response => @fake_sinatra_call.response,
65
- :session => @fake_sinatra_call.session,
66
- :params => @fake_sinatra_call.params,
67
- :logger => @fake_sinatra_call.settings.logger,
68
- :router => @fake_sinatra_call.settings.router,
62
+ :sinatra_call => @fake_sinatra_call,
63
+ :request => @fake_sinatra_call.request,
64
+ :response => @fake_sinatra_call.response,
65
+ :session => @fake_sinatra_call.session,
66
+ :params => @fake_sinatra_call.params,
67
+ :logger => @fake_sinatra_call.settings.logger,
68
+ :router => @fake_sinatra_call.settings.router,
69
69
  :template_source => @fake_sinatra_call.settings.template_source
70
70
  }
71
71
  assert_equal exp_args, @runner_spy.args
@@ -98,8 +98,8 @@ class Deas::Route
98
98
  attr_reader :run_called
99
99
  attr_reader :handler_class, :args
100
100
  attr_reader :sinatra_call
101
- attr_reader :request, :response, :params
102
- attr_reader :logger, :router, :session
101
+ attr_reader :request, :response, :session, :params
102
+ attr_reader :logger, :router, :template_source
103
103
 
104
104
  def initialize
105
105
  @run_called = false
@@ -108,13 +108,13 @@ class Deas::Route
108
108
  def build(handler_class, args)
109
109
  @handler_class, @args = handler_class, args
110
110
 
111
- @sinatra_call = args[:sinatra_call]
112
- @request = args[:request]
113
- @response = args[:response]
114
- @session = args[:session]
115
- @params = args[:params]
116
- @logger = args[:logger]
117
- @router = args[:router]
111
+ @sinatra_call = args[:sinatra_call]
112
+ @request = args[:request]
113
+ @response = args[:response]
114
+ @session = args[:session]
115
+ @params = args[:params]
116
+ @logger = args[:logger]
117
+ @router = args[:router]
118
118
  @template_source = args[:template_source]
119
119
  end
120
120
 
@@ -38,17 +38,12 @@ class Deas::Runner
38
38
  assert_nil subject.request
39
39
  assert_nil subject.response
40
40
  assert_nil subject.session
41
- assert_kind_of ::Hash, subject.params
41
+ assert_equal ::Hash.new, subject.params
42
42
  assert_kind_of Deas::NullLogger, subject.logger
43
43
  assert_kind_of Deas::Router, subject.router
44
44
  assert_kind_of Deas::NullTemplateSource, subject.template_source
45
45
  end
46
46
 
47
- should "default its params" do
48
- runner = @runner_class.new(TestRunnerViewHandler)
49
- assert_equal ::Hash.new, runner.params
50
- end
51
-
52
47
  should "not implement any actions" do
53
48
  assert_raises(NotImplementedError){ subject.halt }
54
49
  assert_raises(NotImplementedError){ subject.redirect }
@@ -20,7 +20,7 @@ class Deas::TemplateEngine
20
20
  subject{ @engine }
21
21
 
22
22
  should have_readers :source_path, :logger, :opts
23
- should have_imeths :render, :partial, :capture_partial
23
+ should have_imeths :render, :partial, :compile
24
24
 
25
25
  should "default its source path" do
26
26
  assert_equal Pathname.new(nil.to_s), subject.source_path
@@ -35,7 +35,7 @@ class Deas::TemplateEngine
35
35
  assert_instance_of Deas::NullLogger, subject.logger
36
36
  end
37
37
 
38
- should "allow custom source loggers" do
38
+ should "allow custom loggers" do
39
39
  logger = 'a-logger'
40
40
  engine = Deas::TemplateEngine.new('logger' => logger)
41
41
  assert_equal logger, engine.logger
@@ -63,9 +63,9 @@ class Deas::TemplateEngine
63
63
  end
64
64
  end
65
65
 
66
- should "raise NotImplementedError on `capture_partial`" do
66
+ should "raise NotImplementedError on `compile`" do
67
67
  assert_raises NotImplementedError do
68
- subject.capture_partial(@template_name, @locals, &@content)
68
+ subject.compile(@template_name, Factory.text)
69
69
  end
70
70
  end
71
71
 
@@ -97,12 +97,6 @@ class Deas::TemplateEngine
97
97
  assert_equal exp, subject.partial(exists_file, @l)
98
98
  end
99
99
 
100
- should "call `render` to implement its `capture_partial` method" do
101
- exists_file = 'test/support/template.json'
102
- exp = subject.render(exists_file, nil, @l)
103
- assert_equal exp, subject.capture_partial(exists_file, @l, &@c)
104
- end
105
-
106
100
  should "complain if given a path that does not exist in its source path" do
107
101
  no_exists_file = '/does/not/exists'
108
102
  assert_raises ArgumentError do
@@ -111,9 +105,11 @@ class Deas::TemplateEngine
111
105
  assert_raises ArgumentError do
112
106
  subject.partial(no_exists_file, @l)
113
107
  end
114
- assert_raises ArgumentError do
115
- subject.capture_partial(no_exists_file, @l, &@c)
116
- end
108
+ end
109
+
110
+ should "return any given content with its `compile` method" do
111
+ exp = Factory.string
112
+ assert_equal exp, subject.compile(Factory.path, exp)
117
113
  end
118
114
 
119
115
  end
@@ -1,6 +1,7 @@
1
1
  require 'assert'
2
2
  require 'deas/template_source'
3
3
 
4
+ require 'deas/logger'
4
5
  require 'deas/template_engine'
5
6
 
6
7
  class Deas::TemplateSource
@@ -26,7 +27,7 @@ class Deas::TemplateSource
26
27
 
27
28
  should have_readers :path, :engines
28
29
  should have_imeths :engine, :engine_for?
29
- should have_imeths :render, :partial, :capture_partial
30
+ should have_imeths :render, :partial
30
31
 
31
32
  should "know its path" do
32
33
  assert_equal @source_path.to_s, subject.path
@@ -49,26 +50,30 @@ class Deas::TemplateSource
49
50
  should "register with default options" do
50
51
  subject.engine 'test', @test_engine
51
52
  exp_opts = {
52
- 'source_path' => subject.path,
53
- 'logger' => @logger
53
+ 'source_path' => subject.path,
54
+ 'logger' => @logger,
55
+ 'deas_template_source' => subject
54
56
  }
55
57
  assert_equal exp_opts, subject.engines['test'].opts
56
58
 
57
59
  subject.engine 'test', @test_engine, 'an' => 'opt'
58
60
  exp_opts = {
59
- 'source_path' => subject.path,
60
- 'logger' => @logger,
61
- 'an' => 'opt'
61
+ 'source_path' => subject.path,
62
+ 'logger' => @logger,
63
+ 'deas_template_source' => subject,
64
+ 'an' => 'opt'
62
65
  }
63
66
  assert_equal exp_opts, subject.engines['test'].opts
64
67
 
65
68
  subject.engine('test', @test_engine, {
66
- 'source_path' => 'something',
67
- 'logger' => 'another'
69
+ 'source_path' => 'something',
70
+ 'logger' => 'another',
71
+ 'deas_template_source' => 'tempsource'
68
72
  })
69
73
  exp_opts = {
70
- 'source_path' => 'something',
71
- 'logger' => 'another'
74
+ 'source_path' => 'something',
75
+ 'logger' => 'another',
76
+ 'deas_template_source' => 'tempsource'
72
77
  }
73
78
  assert_equal exp_opts, subject.engines['test'].opts
74
79
 
@@ -99,7 +104,7 @@ class Deas::TemplateSource
99
104
  @source.engine('test', TestEngine)
100
105
  @source.engine('json', JsonEngine)
101
106
 
102
- @v = TestServiceHandler
107
+ @v = TestViewHandler.new
103
108
  @l = {}
104
109
  @c = Proc.new{}
105
110
  end
@@ -110,15 +115,15 @@ class Deas::TemplateSource
110
115
  desc "when rendering a template"
111
116
 
112
117
  should "call `render` on the configured engine" do
113
- result = subject.render('test_template', @v, @l)
114
- assert_equal 'render-test-engine', result
118
+ exp = "render-test-engine on test_template\n"
119
+ assert_equal exp, subject.render('test_template', @v, @l)
115
120
  end
116
121
 
117
122
  should "only try rendering template files its has engines for" do
118
123
  # there should be 2 files called "template" in `test/support` with diff
119
124
  # extensions
120
- result = subject.render('template', @v, @l)
121
- assert_equal 'render-json-engine', result
125
+ exp = 'render-json-engine'
126
+ assert_equal exp, subject.render('template', @v, @l)
122
127
  end
123
128
 
124
129
  should "use the null template engine when an engine can't be found" do
@@ -129,47 +134,39 @@ class Deas::TemplateSource
129
134
 
130
135
  end
131
136
 
132
- class PartialTests < RenderTests
133
- desc "when partial rendering a template"
134
-
135
- should "call `partial` on the configured engine" do
136
- result = subject.partial('test_template', @l)
137
- assert_equal 'partial-test-engine', result
138
- end
139
-
140
- should "only try rendering template files its has engines for" do
141
- # there should be 2 files called "template" in `test/support` with diff
142
- # extensions
143
- result = subject.partial('template', @l)
144
- assert_equal 'partial-json-engine', result
137
+ class RenderLayoutsTests < RenderOrPartialTests
138
+ desc "when rendering a template in layouts"
139
+ setup do
140
+ @v = LayoutViewHandler.new
145
141
  end
146
142
 
147
- should "use the null template engine when an engine can't be found" do
148
- assert_raises(ArgumentError) do
149
- subject.partial(Factory.string, @l)
150
- end
143
+ should "render view handlers with layouts" do
144
+ exp = "render-test-engine on test_layout1\n"\
145
+ "render-test-engine on test_layout2\n"\
146
+ "render-test-engine on test_template\n"
147
+ assert_equal exp, subject.render('test_template', @v, @l)
151
148
  end
152
149
 
153
150
  end
154
151
 
155
- class CapturePartialTests < RenderOrPartialTests
156
- desc "when capture partial rendering a template"
152
+ class PartialTests < RenderTests
153
+ desc "when partial rendering a template"
157
154
 
158
- should "call `capture_partial` on the configured engine" do
159
- result = subject.capture_partial('test_template', @l, &@c)
160
- assert_equal 'capture-partial-test-engine', result
155
+ should "call `partial` on the configured engine" do
156
+ exp = "partial-test-engine\n"
157
+ assert_equal exp, subject.partial('test_template', @l)
161
158
  end
162
159
 
163
160
  should "only try rendering template files its has engines for" do
164
161
  # there should be 2 files called "template" in `test/support` with diff
165
162
  # extensions
166
- result = subject.capture_partial('template', @l, &@c)
167
- assert_equal 'capture-partial-json-engine', result
163
+ exp = 'partial-json-engine'
164
+ assert_equal exp, subject.partial('template', @l)
168
165
  end
169
166
 
170
167
  should "use the null template engine when an engine can't be found" do
171
168
  assert_raises(ArgumentError) do
172
- subject.capture_partial(Factory.string, @l, &@c)
169
+ subject.partial(Factory.string, @l)
173
170
  end
174
171
  end
175
172
 
@@ -193,11 +190,12 @@ class Deas::TemplateSource
193
190
  end
194
191
 
195
192
  class TestEngine < Deas::TemplateEngine
196
- def render(template_name, view_handler, locals)
197
- 'render-test-engine'
193
+ def render(template_name, view_handler, locals, &content)
194
+ "render-test-engine on #{template_name}\n" +
195
+ (content || proc{}).call.to_s
198
196
  end
199
- def partial(template_name, locals)
200
- 'partial-test-engine'
197
+ def partial(template_name, locals, &content)
198
+ "partial-test-engine\n" + (content || proc{}).call.to_s
201
199
  end
202
200
  def capture_partial(template_name, locals, &content)
203
201
  'capture-partial-test-engine'
@@ -205,7 +203,7 @@ class Deas::TemplateSource
205
203
  end
206
204
 
207
205
  class JsonEngine < Deas::TemplateEngine
208
- def render(template_name, view_handler, locals)
206
+ def render(template_name, view_handler, locals, &content)
209
207
  'render-json-engine'
210
208
  end
211
209
  def partial(template_name, locals)
@@ -216,6 +214,12 @@ class Deas::TemplateSource
216
214
  end
217
215
  end
218
216
 
219
- TestServiceHandler = Class.new
217
+ TestViewHandler = Class.new do
218
+ def self.layouts; []; end
219
+ end
220
+
221
+ LayoutViewHandler = Class.new do
222
+ def self.layouts; ['test_layout1', 'test_layout2']; end
223
+ end
220
224
 
221
225
  end
@@ -11,6 +11,7 @@ class Deas::TestRunner
11
11
  class UnitTests < Assert::Context
12
12
  desc "Deas::TestRunner"
13
13
  setup do
14
+ @handler_class = TestRunnerViewHandler
14
15
  @runner_class = Deas::TestRunner
15
16
  end
16
17
  subject{ @runner_class }
@@ -26,25 +27,31 @@ class Deas::TestRunner
26
27
  setup do
27
28
  @params = { 'value' => '1' }
28
29
  @args = {
29
- :request => 'a-request',
30
- :response => 'a-response',
31
- :session => 'a-session',
32
- :params => @params,
33
- :logger => 'a-logger',
34
- :router => 'a-router',
30
+ :request => 'a-request',
31
+ :response => 'a-response',
32
+ :session => 'a-session',
33
+ :params => @params,
34
+ :logger => 'a-logger',
35
+ :router => 'a-router',
35
36
  :template_source => 'a-source'
36
37
  }
37
38
 
38
39
  @norm_params_spy = Deas::Runner::NormalizedParamsSpy.new
39
40
  Assert.stub(NormalizedParams, :new){ |p| @norm_params_spy.new(p) }
40
41
 
41
- @runner = @runner_class.new(TestRunnerViewHandler, @args)
42
+ @runner = @runner_class.new(@handler_class, @args)
42
43
  end
43
44
  subject{ @runner }
44
45
 
45
46
  should have_readers :return_value
46
47
  should have_imeths :run
47
48
 
49
+ should "raise an invalid error when not passed a view handler" do
50
+ assert_raises(Deas::InvalidServiceHandlerError) do
51
+ @runner_class.new(Class.new)
52
+ end
53
+ end
54
+
48
55
  should "super its standard args" do
49
56
  assert_equal 'a-request', subject.request
50
57
  assert_equal 'a-response', subject.response
@@ -61,10 +68,18 @@ class Deas::TestRunner
61
68
  end
62
69
 
63
70
  should "write any non-standard args on the handler" do
64
- runner = @runner_class.new(TestRunnerViewHandler, :custom_value => 42)
71
+ runner = @runner_class.new(@handler_class, :custom_value => 42)
65
72
  assert_equal 42, runner.handler.custom_value
66
73
  end
67
74
 
75
+ should "not have called its service handlers before callbacks" do
76
+ assert_not_true subject.handler.before_called
77
+ end
78
+
79
+ should "have called init on its service handler" do
80
+ assert_true subject.handler.init_called
81
+ end
82
+
68
83
  should "not set a return value on initialize" do
69
84
  assert_nil subject.return_value
70
85
  end
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: 111
4
+ hash: 107
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 28
8
+ - 29
9
9
  - 0
10
- version: 0.28.0
10
+ version: 0.29.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Kelly Redding
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2014-11-12 00:00:00 Z
19
+ date: 2015-01-08 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  requirement: &id001 !ruby/object:Gem::Requirement
@@ -164,6 +164,8 @@ files:
164
164
  - test/support/routes.rb
165
165
  - test/support/template.erb
166
166
  - test/support/template.json
167
+ - test/support/test_layout1.test
168
+ - test/support/test_layout2.test
167
169
  - test/support/test_template.test
168
170
  - test/support/view_handlers.rb
169
171
  - test/support/views/_info.erb
@@ -244,6 +246,8 @@ test_files:
244
246
  - test/support/routes.rb
245
247
  - test/support/template.erb
246
248
  - test/support/template.json
249
+ - test/support/test_layout1.test
250
+ - test/support/test_layout2.test
247
251
  - test/support/test_template.test
248
252
  - test/support/view_handlers.rb
249
253
  - test/support/views/_info.erb