deas-erubis 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,73 +8,33 @@ module Deas::Erubis
8
8
  class Source
9
9
 
10
10
  EXT = '.erb'.freeze
11
- CACHE_EXT = '.cache'.freeze
12
11
  BUFVAR_NAME = '@_erb_buf'.freeze
13
12
  DEFAULT_ERUBY = ::Erubis::Eruby
14
13
 
15
- attr_reader :root, :cache_root, :eruby_class, :context_class
14
+ attr_reader :root, :eruby_class, :cache, :context_class
16
15
 
17
16
  def initialize(root, opts)
18
- @root = Pathname.new(root.to_s)
19
- @eruby_class = opts[:eruby] || DEFAULT_ERUBY
20
-
21
- should_cache = !!opts[:cache]
22
- @cache_root = opts[:cache] == true ? @root : Pathname.new(opts[:cache].to_s)
23
- @cache_root.mkpath if should_cache && !@cache_root.exist?
24
-
25
- if should_cache
26
- # use `load_file` to lookup and cache templates (faster renders)
27
- if @cache_root == @root
28
- # use the `load_file` default and don't bother with looking up, setting,
29
- # and making sure the cache file path exists - by default `load_file`
30
- # caches alongside the source with the `CACHE_EXT` appended.
31
- add_meta_eruby_method do |file_name|
32
- @eruby_class.load_file(source_file_path(file_name), {
33
- :bufvar => BUFVAR_NAME
34
- })
35
- end
36
- else
37
- # lookup and ensure the custom cache location exists (more expensive)
38
- add_meta_eruby_method do |file_name|
39
- @eruby_class.load_file(source_file_path(file_name), {
40
- :bufvar => BUFVAR_NAME,
41
- :cachename => cache_file_path(file_name)
42
- })
43
- end
44
- end
45
- else
46
- # don't cache template files (slower renders, but no cache files created)
47
- add_meta_eruby_method do |file_name|
48
- filename = source_file_path(file_name).to_s
49
- template = File.send(File.respond_to?(:binread) ? :binread : :read, filename)
50
- @eruby_class.new(template, {
51
- :bufvar => BUFVAR_NAME,
52
- :filename => filename
53
- })
54
- end
55
- end
56
-
57
- @deas_source = opts[:deas_source]
17
+ @root = Pathname.new(root.to_s)
18
+ @eruby_class = opts[:eruby] || DEFAULT_ERUBY
19
+ @cache = opts[:cache] ? Hash.new : NullCache.new
58
20
  @context_class = build_context_class(opts)
59
- end
60
21
 
61
- def eruby(file_name)
62
- # should be overridden by a metaclass equivalent on init
63
- # the implementation changes whether you are caching templates or not
64
- # and the goal here is to not add a bunch of conditional overhead as this
65
- # will be called on every render
66
- raise NotImplementedError
22
+ @deas_source = opts[:deas_source]
67
23
  end
68
24
 
69
25
  def render(file_name, locals, &content)
70
- eruby(file_name).evaluate(@context_class.new(@deas_source, locals), &content)
26
+ load(file_name).evaluate(@context_class.new(@deas_source, locals), &content)
71
27
  end
72
28
 
73
- def compile(file_name, content)
29
+ def compile(filename, content)
30
+ eruby(filename, content).evaluate(@context_class.new(@deas_source, {}))
31
+ end
32
+
33
+ def eruby(filename, content)
74
34
  @eruby_class.new(content, {
75
35
  :bufvar => BUFVAR_NAME,
76
- :filename => file_name
77
- }).evaluate(@context_class.new(@deas_source, {}))
36
+ :filename => filename
37
+ })
78
38
  end
79
39
 
80
40
  def inspect
@@ -85,21 +45,16 @@ module Deas::Erubis
85
45
 
86
46
  private
87
47
 
88
- def source_file_path(file_name)
89
- self.root.join("#{file_name}#{EXT}").to_s
90
- end
91
-
92
- def cache_file_path(file_name)
93
- self.cache_root.join("#{file_name}#{EXT}#{CACHE_EXT}").tap do |path|
94
- path.dirname.mkpath if !path.dirname.exist?
95
- end.to_s
48
+ def load(file_name)
49
+ @cache[file_name] ||= begin
50
+ filename = source_file_path(file_name).to_s
51
+ content = File.send(File.respond_to?(:binread) ? :binread : :read, filename)
52
+ eruby(filename, content)
53
+ end
96
54
  end
97
55
 
98
- def add_meta_eruby_method(&method)
99
- metaclass = class << self; self; end
100
- metaclass.class_eval do
101
- define_method(:eruby, &method)
102
- end
56
+ def source_file_path(file_name)
57
+ self.root.join("#{file_name}#{EXT}").to_s
103
58
  end
104
59
 
105
60
  def build_context_class(opts)
@@ -121,6 +76,12 @@ module Deas::Erubis
121
76
  end
122
77
  end
123
78
 
79
+ class NullCache
80
+ def [](file_name); end
81
+ def []=(file_name, value); end
82
+ def keys; []; end
83
+ end
84
+
124
85
  end
125
86
 
126
87
  class DefaultSource < Source
@@ -1,4 +1,4 @@
1
1
  module Deas; end
2
2
  module Deas::Erubis
3
- VERSION = "0.1.0"
3
+ VERSION = "0.2.0"
4
4
  end
@@ -12,9 +12,8 @@ class Deas::Erubis::Source
12
12
  end
13
13
  subject{ @source_class }
14
14
 
15
- should "know its extensions" do
15
+ should "know its extension" do
16
16
  assert_equal '.erb', subject::EXT
17
- assert_equal '.cache', subject::CACHE_EXT
18
17
  end
19
18
 
20
19
  should "know the bufvar name to use" do
@@ -35,8 +34,8 @@ class Deas::Erubis::Source
35
34
  end
36
35
  subject{ @source }
37
36
 
38
- should have_readers :root, :cache_root, :eruby_class, :context_class
39
- should have_imeths :eruby, :render, :compile
37
+ should have_readers :root, :eruby_class, :cache, :context_class
38
+ should have_imeths :render, :compile, :eruby
40
39
 
41
40
  should "know its root" do
42
41
  assert_equal @root, subject.root.to_s
@@ -53,32 +52,23 @@ class Deas::Erubis::Source
53
52
  end
54
53
 
55
54
  should "build eruby instances for a given template file" do
56
- assert_kind_of subject.eruby_class, subject.eruby('basic')
55
+ assert_kind_of subject.eruby_class, subject.eruby('basic', Factory.string)
57
56
  end
58
57
 
59
58
  should "build its eruby instances with the correct bufvar name" do
59
+ eruby = subject.eruby('basic', Factory.string)
60
+
60
61
  exp = Deas::Erubis::Source::BUFVAR_NAME
61
- assert_equal exp, subject.eruby('basic').instance_variable_get('@bufvar')
62
+ assert_equal exp, eruby.instance_variable_get('@bufvar')
62
63
  end
63
64
 
64
- should "default its cache root" do
65
- assert_equal Pathname.new('').to_s, subject.cache_root.to_s
65
+ should "not cache templates by default" do
66
+ assert_kind_of NullCache, subject.cache
66
67
  end
67
68
 
68
- should "use the root as its cache root if :cache opt is `true`" do
69
+ should "cache templates if the :cache opt is `true`" do
69
70
  source = @source_class.new(@root, :cache => true)
70
- assert_equal @root.to_s, source.cache_root.to_s
71
- end
72
-
73
- should "optionally use a custom cache root" do
74
- source = @source_class.new(@root, :cache => TEMPLATE_CACHE_ROOT)
75
- assert_equal TEMPLATE_CACHE_ROOT.to_s, source.cache_root.to_s
76
- end
77
-
78
- should "create the cache root if it doesn't exist already" do
79
- FileUtils.rm_rf(TEMPLATE_CACHE_ROOT) if TEMPLATE_CACHE_ROOT.exist?
80
- source = @source_class.new(@root, :cache => TEMPLATE_CACHE_ROOT)
81
- assert_file_exists TEMPLATE_CACHE_ROOT.to_s
71
+ assert_kind_of Hash, source.cache
82
72
  end
83
73
 
84
74
  should "know its context class" do
@@ -121,27 +111,15 @@ class Deas::Erubis::Source
121
111
 
122
112
  end
123
113
 
124
- class RenderSetupTests < InitTests
114
+ class RenderTests < InitTests
115
+ desc "`render` method"
125
116
  setup do
117
+ @file_name = "basic"
126
118
  @file_locals = {
127
119
  'name' => Factory.string,
128
120
  'local1' => Factory.integer
129
121
  }
130
122
  end
131
- teardown do
132
- root = TEMPLATE_ROOT.join("*#{@source_class::CACHE_EXT}").to_s
133
- Dir.glob(root).each{ |f| FileUtils.rm_f(f) }
134
- root = TEMPLATE_CACHE_ROOT.join("*#{@source_class::CACHE_EXT}").to_s
135
- Dir.glob(root).each{ |f| FileUtils.rm_f(f) }
136
- end
137
-
138
- end
139
-
140
- class RenderTests < RenderSetupTests
141
- desc "`render` method"
142
- setup do
143
- @file_name = "basic"
144
- end
145
123
 
146
124
  should "render a template for the given file name and return its data" do
147
125
  exp = Factory.basic_erb_rendered(@file_locals)
@@ -162,36 +140,18 @@ class Deas::Erubis::Source
162
140
 
163
141
  end
164
142
 
165
- class RenderEnabledCacheTests < RenderTests
143
+ class RenderCacheTests < RenderTests
166
144
  desc "when caching is enabled"
167
145
  setup do
168
146
  @source = @source_class.new(@root, :cache => true)
169
147
  end
170
148
 
171
- should "cache templates in the root (cache root) alongside the source" do
172
- f = "#{@file_name}#{@source_class::EXT}#{@source_class::CACHE_EXT}"
173
- cache_file = subject.root.join(f)
174
-
175
- assert_not_file_exists cache_file
176
- subject.render(@file_name, @file_locals)
177
- assert_file_exists cache_file
178
- end
179
-
180
- end
181
-
182
- class RenderCustomCacheTests < RenderTests
183
- desc "when caching is enabled on a custom cache root"
184
- setup do
185
- @source = @source_class.new(@root, :cache => TEMPLATE_CACHE_ROOT)
186
- end
187
-
188
- should "cache templates in the cache root" do
189
- f = "#{@file_name}#{@source_class::EXT}#{@source_class::CACHE_EXT}"
190
- cache_file = TEMPLATE_CACHE_ROOT.join(f)
149
+ should "cache template eruby instances by their file name" do
150
+ exp = Factory.basic_erb_rendered(@file_locals)
151
+ assert_equal exp, @source.render(@file_name, @file_locals)
191
152
 
192
- assert_not_file_exists cache_file
193
- subject.render(@file_name, @file_locals)
194
- assert_file_exists cache_file
153
+ assert_equal [@file_name], @source.cache.keys
154
+ assert_kind_of @source.eruby_class, @source.cache[@file_name]
195
155
  end
196
156
 
197
157
  end
@@ -202,13 +162,11 @@ class Deas::Erubis::Source
202
162
  @source = @source_class.new(@root, :cache => false)
203
163
  end
204
164
 
205
- should "not cache templates" do
206
- f = "#{@file_name}#{@source_class::EXT}#{@source_class::CACHE_EXT}"
207
- cache_file = subject.root.join(f)
165
+ should "not cache template eruby instances" do
166
+ exp = Factory.basic_erb_rendered(@file_locals)
167
+ assert_equal exp, @source.render(@file_name, @file_locals)
208
168
 
209
- assert_not_file_exists cache_file
210
- subject.render(@file_name, @file_locals)
211
- assert_not_file_exists cache_file
169
+ assert_equal [], @source.cache.keys
212
170
  end
213
171
 
214
172
  end
@@ -227,7 +185,7 @@ class Deas::Erubis::Source
227
185
 
228
186
  end
229
187
 
230
- class CompileTests < RenderSetupTests
188
+ class CompileTests < InitTests
231
189
  desc "`compile` method"
232
190
 
233
191
  should "compile raw content file name and return its data" do
@@ -238,15 +196,40 @@ class Deas::Erubis::Source
238
196
 
239
197
  end
240
198
 
241
- class DefaultSource < UnitTests
242
- desc "DefaultSource"
199
+ class NullCacheTests < UnitTests
200
+ desc "NullCache"
201
+ setup do
202
+ @cache = NullCache.new
203
+ end
204
+ subject{ @cache }
205
+
206
+ should have_imeths :[], :[]=, :keys
207
+
208
+ should "take a file name and return nothing on index" do
209
+ assert_nil subject[Factory.path]
210
+ end
211
+
212
+ should "take a file name and value and do nothing on index write" do
213
+ assert_nothing_raised do
214
+ subject[Factory.path] = Factory.string
215
+ end
216
+ end
217
+
218
+ should "always have empty keys" do
219
+ assert_equal [], subject.keys
220
+ end
221
+
222
+ end
223
+
224
+ class DefaultSourceTests < Assert::Context
225
+ desc "Deas::Erubis::DefaultSource"
243
226
  setup do
244
227
  @source = Deas::Erubis::DefaultSource.new
245
228
  end
246
229
  subject{ @source }
247
230
 
248
231
  should "be a Source" do
249
- assert_kind_of @source_class, subject
232
+ assert_kind_of Deas::Erubis::Source, subject
250
233
  end
251
234
 
252
235
  should "use `/` as its root" do
@@ -34,9 +34,9 @@ class Deas::Erubis::TemplateEngine
34
34
  assert_equal custom_eruby, engine.erb_source.eruby_class
35
35
  end
36
36
 
37
- should "allow custom cache roots on its source" do
38
- engine = Deas::Erubis::TemplateEngine.new('cache' => TEMPLATE_CACHE_ROOT)
39
- assert_equal TEMPLATE_CACHE_ROOT.to_s, engine.erb_source.cache_root.to_s
37
+ should "pass any given cache option to its source" do
38
+ engine = Deas::Erubis::TemplateEngine.new('cache' => true)
39
+ assert_kind_of Hash, engine.erb_source.cache
40
40
  end
41
41
 
42
42
  should "pass any given deas template source to its source" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deas-erubis
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.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: 2015-01-08 00:00:00 Z
19
+ date: 2015-01-14 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  requirement: &id001 !ruby/object:Gem::Requirement