deas 0.39.2 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a00b252a65f50835be12b3dfaa0250f7604daaa4
4
- data.tar.gz: 8e0056e396f5f24f9d65f5422d8f418eb01e567c
3
+ metadata.gz: cc1b0541f8352e417fcaea600dfc199984f4ee5f
4
+ data.tar.gz: 55e89c13f41a75441fb281025d62deb3fa114080
5
5
  SHA512:
6
- metadata.gz: 01bff2c3747cf37a17ab7840bc2e332889a0acf0c436b3a9c62531cbfb83f123e1ce80ca6654bec9217b35b44106469ce76040332cbde6cd34a633563847b858
7
- data.tar.gz: 2465addcff960eab76c8d9a0fa71b3105574d00b84b703461fcf7b22fda388452b8f86dafc35e0406d7f6e2382c6be1988796e7964122ed9e10e993252ea51e2
6
+ metadata.gz: 066f4eac74ffd2e34af998f5622291a9d3db400381e3e3b1bbb68fd819ca00880d208460462f2b340980659b1518da9a575d4b58d67a8750b099688c6b5d7187
7
+ data.tar.gz: c4bf700bfe1196493333e38cf2bf437841d4f86258bd6e713159c5c9838db19c5d3526ab04f18619d5fd30c6e513b8369589c91e0a368ca081ba747c41d1de57
@@ -30,10 +30,16 @@ module Deas
30
30
  class NullTemplateEngine < TemplateEngine
31
31
 
32
32
  def render(template_name, view_handler, locals, &content)
33
- if (path = Dir.glob(self.source_path.join("#{template_name}*")).first).nil?
34
- raise ArgumentError, "template file `#{path}` does not exist"
33
+ paths = Dir.glob(self.source_path.join("#{template_name}*"))
34
+ if paths.size > 1
35
+ raise ArgumentError, "#{template_name.inspect} matches more than one " \
36
+ "file, consider using a more specific template name"
35
37
  end
36
- File.read(path)
38
+ if paths.size < 1
39
+ raise ArgumentError, "a template file named #{template_name.inspect} " \
40
+ "does not exist"
41
+ end
42
+ File.read(paths.first)
37
43
  end
38
44
 
39
45
  def partial(template_name, locals, &content)
@@ -41,7 +47,7 @@ module Deas
41
47
  end
42
48
 
43
49
  def compile(template_name, compiled_content)
44
- compiled_content # no-op, pass-thru - just return the given content
50
+ compiled_content # no-op, pass-thru - just return the given content
45
51
  end
46
52
 
47
53
  end
@@ -5,10 +5,6 @@ module Deas
5
5
 
6
6
  class TemplateSource
7
7
 
8
- DISALLOWED_ENGINE_EXTS = [ 'rb' ]
9
-
10
- DisallowedEngineExtError = Class.new(ArgumentError)
11
-
12
8
  attr_reader :path, :engines
13
9
 
14
10
  def initialize(path, logger = nil)
@@ -18,7 +14,12 @@ module Deas
18
14
  'logger' => logger || Deas::NullLogger.new,
19
15
  'default_template_source' => self
20
16
  }
21
- @engines = Hash.new{ |h, k| Deas::NullTemplateEngine.new(@default_engine_opts) }
17
+ @engines = Hash.new do |hash, ext|
18
+ # cache null template exts so we don't repeatedly call this block for
19
+ # known null template exts
20
+ hash[ext.to_s] = Deas::NullTemplateEngine.new(@default_engine_opts)
21
+ end
22
+ @engine_exts = []
22
23
  @ext_lists = Hash.new do |hash, template_name|
23
24
  # An ext list is an array of non-template-name extensions that have engines
24
25
  # configured. The first ext in the list is the most precedent. Its engine
@@ -29,16 +30,15 @@ module Deas
29
30
  end
30
31
 
31
32
  def engine(input_ext, engine_class, registered_opts = nil)
32
- if DISALLOWED_ENGINE_EXTS.include?(input_ext)
33
- raise DisallowedEngineExtError, "`#{input_ext}` is disallowed as an"\
34
- " engine extension."
35
- end
33
+ @engine_exts << input_ext.to_s
34
+
36
35
  engine_opts = @default_engine_opts.merge(registered_opts || {})
36
+ engine_opts['ext'] = input_ext.to_s
37
37
  @engines[input_ext.to_s] = engine_class.new(engine_opts)
38
38
  end
39
39
 
40
40
  def engine_for?(ext)
41
- @engines.keys.include?(ext)
41
+ @engine_exts.include?(ext.to_s)
42
42
  end
43
43
 
44
44
  def render(template_name, view_handler, locals, &content)
@@ -62,17 +62,29 @@ module Deas
62
62
  private
63
63
 
64
64
  def compile(name)
65
- ext_list = @ext_lists[name].dup
66
- ext_list.inject(yield @engines[ext_list.shift]) do |content, ext|
67
- @engines[ext].compile(name, content)
65
+ @ext_lists[name].drop(1).inject(yield @engines[@ext_lists[name].first]) do |c, e|
66
+ @engines[e].compile(name, c)
68
67
  end
69
68
  end
70
69
 
71
70
  def parse_ext_list(template_name)
72
- no_ext_path = "#{File.join(@path, template_name.to_s)}."
73
- path = Dir.glob("#{no_ext_path}*").first || ''
74
- path.sub(no_ext_path, '').split('.').reverse.reject do |ext|
75
- !self.engine_for?(ext)
71
+ paths = Dir.glob(File.join(@path, "#{template_name}*"))
72
+ if paths.size > 1
73
+ raise ArgumentError, "#{template_name.inspect} matches more than one " \
74
+ "file, consider using a more specific template name"
75
+ end
76
+ get_ext_list(paths.first.to_s)
77
+ end
78
+
79
+ def get_ext_list(path)
80
+ # get the base name of the path (file name plus extensions). Split on the
81
+ # periods and drop the first value (the file name). reverse the list b/c
82
+ # we process exts right-to-left. reject any unnecessary exts.
83
+ File.basename(path).split('.').drop(1).reverse.reject.each_with_index do |e, i|
84
+ # keep the first ext (for initial render from source) and any registered
85
+ # exts. remove any non-first non-registered exts so you don't have the
86
+ # overhead of running through the null engine for each.
87
+ i != 0 && !self.engine_for?(e)
76
88
  end
77
89
  end
78
90
 
data/lib/deas/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Deas
2
- VERSION = "0.39.2"
2
+ VERSION = "0.40.0"
3
3
  end
@@ -0,0 +1 @@
1
+ This is a json template for use in template source/engine tests.
@@ -0,0 +1 @@
1
+ This is a json template for use in template source/engine tests.
@@ -86,17 +86,23 @@ class Deas::TemplateEngine
86
86
  end
87
87
 
88
88
  should "read and return the given path in its source path on `render`" do
89
- template = 'test/support/template'
89
+ template = ['test/support/template.a', 'test/support/template.a.json'].choice
90
90
  exp = File.read(Dir.glob(subject.source_path.join("#{template}*")).first)
91
91
  assert_equal exp, subject.render(template, @v, @l)
92
92
  end
93
93
 
94
94
  should "call `render` to implement its `partial` method" do
95
- template = 'test/support/template'
95
+ template = ['test/support/template.a', 'test/support/template.a.json'].choice
96
96
  exp = subject.render(template, nil, @l)
97
97
  assert_equal exp, subject.partial(template, @l)
98
98
  end
99
99
 
100
+ should "complain if given a path that matches multiple files" do
101
+ template = 'test/support/template'
102
+ assert_raises(ArgumentError){ subject.render(template, @v, @l) }
103
+ assert_raises(ArgumentError){ subject.partial(template, @l) }
104
+ end
105
+
100
106
  should "complain if given a path that does not exist in its source path" do
101
107
  template = '/does/not/exists'
102
108
  assert_raises(ArgumentError){ subject.render(template, @v, @l) }
@@ -10,11 +10,6 @@ class Deas::TemplateSource
10
10
  desc "Deas::TemplateSource"
11
11
  subject{ Deas::TemplateSource }
12
12
 
13
- should "disallow certain engine extensions" do
14
- exp = [ 'rb' ]
15
- assert_equal exp, subject::DISALLOWED_ENGINE_EXTS
16
- end
17
-
18
13
  end
19
14
 
20
15
  class InitTests < Assert::Context
@@ -45,49 +40,48 @@ class Deas::TemplateSource
45
40
  assert_kind_of Deas::NullTemplateEngine, subject.engines['test']
46
41
  subject.engine 'test', @test_engine
47
42
  assert_kind_of @test_engine, subject.engines['test']
43
+
44
+ assert_true subject.engine_for?('test')
45
+ assert_false subject.engine_for?(Factory.string)
48
46
  end
49
47
 
50
48
  should "register with default options" do
51
- subject.engine 'test', @test_engine
49
+ engine_ext = Factory.string
50
+ subject.engine engine_ext, @test_engine
52
51
  exp_opts = {
53
52
  'source_path' => subject.path,
54
53
  'logger' => @logger,
55
- 'default_template_source' => subject
54
+ 'default_template_source' => subject,
55
+ 'ext' => engine_ext
56
56
  }
57
- assert_equal exp_opts, subject.engines['test'].opts
57
+ assert_equal exp_opts, subject.engines[engine_ext].opts
58
+ assert_true subject.engine_for?(engine_ext)
58
59
 
59
- subject.engine 'test', @test_engine, 'an' => 'opt'
60
+ custom_opts = { Factory.string => Factory.string }
61
+ subject.engine engine_ext, @test_engine, custom_opts
60
62
  exp_opts = {
61
63
  'source_path' => subject.path,
62
64
  'logger' => @logger,
63
65
  'default_template_source' => subject,
64
- 'an' => 'opt'
65
- }
66
- assert_equal exp_opts, subject.engines['test'].opts
66
+ 'ext' => engine_ext
67
+ }.merge(custom_opts)
68
+ assert_equal exp_opts, subject.engines[engine_ext].opts
69
+ assert_true subject.engine_for?(engine_ext)
67
70
 
68
- subject.engine('test', @test_engine, {
71
+ custom_opts = {
69
72
  'source_path' => 'something',
70
73
  'logger' => 'another',
71
- 'default_template_source' => 'tempsource'
72
- })
73
- exp_opts = {
74
- 'source_path' => 'something',
75
- 'logger' => 'another',
76
- 'default_template_source' => 'tempsource'
74
+ 'default_template_source' => 'tempsource',
75
+ 'ext' => Factory.string
77
76
  }
78
- assert_equal exp_opts, subject.engines['test'].opts
77
+ subject.engine(engine_ext, @test_engine, custom_opts)
78
+ exp_opts = custom_opts.merge('ext' => engine_ext)
79
+ assert_equal exp_opts, subject.engines[engine_ext].opts
80
+ assert_true subject.engine_for?(engine_ext)
79
81
 
80
82
  source = Deas::TemplateSource.new(@source_path)
81
- source.engine('test', @test_engine)
82
- assert_instance_of Deas::NullLogger, source.engines['test'].opts['logger']
83
- end
84
-
85
- should "complain if registering a disallowed temp" do
86
- assert_kind_of Deas::NullTemplateEngine, subject.engines['rb']
87
- assert_raises DisallowedEngineExtError do
88
- subject.engine 'rb', @test_engine
89
- end
90
- assert_kind_of Deas::NullTemplateEngine, subject.engines['rb']
83
+ source.engine(engine_ext, @test_engine)
84
+ assert_instance_of Deas::NullLogger, source.engines[engine_ext].opts['logger']
91
85
  end
92
86
 
93
87
  end
@@ -112,25 +106,29 @@ class Deas::TemplateSource
112
106
  assert_equal exp, subject.render('test_template', @v, @l)
113
107
  end
114
108
 
115
- should "only render the first template file matching the template name" do
116
- # there should be 2 files called "template" in `test/support` with diff
117
- # extensions
118
- exp = "render-json-engine on template\n"
119
- assert_equal exp, subject.render('template', @v, @l)
120
- end
121
-
122
109
  should "compile multiple engine outputs if template has multi-engine exts" do
123
110
  exp = "render-json-engine on template-compiled1\ncompile-test-engine"
124
111
  assert_equal exp, subject.render('template-compiled1', @v, @l)
125
112
 
126
113
  exp = "render-test-engine on template-compiled2\ncompile-json-engine"
127
114
  assert_equal exp, subject.render('template-compiled2', @v, @l)
115
+
116
+ exp = "render-json-engine on template-compiled3\n"
117
+ assert_equal exp, subject.render('template-compiled3', @v, @l)
118
+
119
+ exp = "This is a json template for use in template source/engine tests.\n"\
120
+ "compile-json-engine"
121
+ assert_equal exp, subject.render('template-compiled4', @v, @l)
122
+ end
123
+
124
+ should "complain if the given template name matches multiple templates" do
125
+ # there should be more than 1 file called "template" in `test/support`
126
+ # with various extensions
127
+ assert_raises(ArgumentError){ subject.render('template', @v, @l) }
128
128
  end
129
129
 
130
130
  should "use the null template engine when an engine can't be found" do
131
- assert_raises(ArgumentError) do
132
- subject.render(Factory.string, @v, @l)
133
- end
131
+ assert_raises(ArgumentError){ subject.render(Factory.string, @v, @l) }
134
132
  end
135
133
 
136
134
  end
@@ -158,13 +156,6 @@ class Deas::TemplateSource
158
156
  assert_equal exp, subject.partial('test_template', @l)
159
157
  end
160
158
 
161
- should "only render the first template file matching the template name" do
162
- # there should be 2 files called "template" in `test/support` with diff
163
- # extensions
164
- exp = "partial-json-engine on template\n"
165
- assert_equal exp, subject.partial('template', @l)
166
- end
167
-
168
159
  should "compile multiple engine outputs if template has multi-engine exts" do
169
160
  exp = "partial-json-engine on template-compiled1\ncompile-test-engine"
170
161
  assert_equal exp, subject.partial('template-compiled1', @l)
@@ -173,10 +164,14 @@ class Deas::TemplateSource
173
164
  assert_equal exp, subject.partial('template-compiled2', @l)
174
165
  end
175
166
 
167
+ should "complain if the given template name matches multiple templates" do
168
+ # there should be more than 1 file called "template" in `test/support`
169
+ # with various extensions
170
+ assert_raises(ArgumentError){ subject.partial('template', @l) }
171
+ end
172
+
176
173
  should "use the null template engine when an engine can't be found" do
177
- assert_raises(ArgumentError) do
178
- subject.partial(Factory.string, @l)
179
- end
174
+ assert_raises(ArgumentError){ subject.partial(Factory.string, @l) }
180
175
  end
181
176
 
182
177
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deas
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.39.2
4
+ version: 0.40.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kelly Redding
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2016-04-05 00:00:00 Z
13
+ date: 2016-04-11 00:00:00 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: assert
@@ -126,7 +126,9 @@ files:
126
126
  - test/support/show.json
127
127
  - test/support/template-compiled1.test.json
128
128
  - test/support/template-compiled2.json.test
129
- - test/support/template.json
129
+ - test/support/template-compiled3.foo.json
130
+ - test/support/template-compiled4.json.foo
131
+ - test/support/template.a.json
130
132
  - test/support/template.z.erb
131
133
  - test/support/test_layout1.test
132
134
  - test/support/test_layout2.test
@@ -193,7 +195,9 @@ test_files:
193
195
  - test/support/show.json
194
196
  - test/support/template-compiled1.test.json
195
197
  - test/support/template-compiled2.json.test
196
- - test/support/template.json
198
+ - test/support/template-compiled3.foo.json
199
+ - test/support/template-compiled4.json.foo
200
+ - test/support/template.a.json
197
201
  - test/support/template.z.erb
198
202
  - test/support/test_layout1.test
199
203
  - test/support/test_layout2.test