deas 0.28.0 → 0.29.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/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