hogan_assets 1.5.1 → 1.6.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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZTEyZTQxNDZlYWQ1MzA5NzAzZTZmZTAxOGMwZmI3M2VhZTU5MDBlZA==
5
+ data.tar.gz: !binary |-
6
+ M2UzMmZiMGU1YTRhNzU4ZDNkNzAzMWI1NDYwMzRjYmFiMWZlZjNlZA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ M2FiNzhkM2U3MzcxODI5ZTI1YWYxMjM1YjAwODZhMDJjMjhmOGNmMzNkNzc3
10
+ Y2VjZmViN2U4OTM3MDU5NmUyNTAyMTVhNzU2NWExMGQxMTdiYzAyMTk4OWVl
11
+ YjlkZTY5OGY4NzRkMDdkZGQ2OGFjOTljYjg3MzQ3OTY5ZjFiOGY=
12
+ data.tar.gz: !binary |-
13
+ NDA1ODgyYjBkMDQ2MjRmMWRkOGEyM2FlMmJiMDM0MGIxOGJjMTI1MjdjMWQ5
14
+ OTE3OGY4YzdlNjE1NGZjZDFlNzdjN2VhYzVlZjhmZTBkYjIzZmYzYzg1ZWU5
15
+ NTQwYmRjZmM3ZmZhYWJlODY5YmZlMTZmYzhmNzk0NGZmOTUwMDc=
data/.gitignore CHANGED
@@ -11,6 +11,7 @@ lib/bundler/man
11
11
  pkg
12
12
  rdoc
13
13
  spec/reports
14
+ tags
14
15
  test/tmp
15
16
  test/version_tmp
16
17
  tmp
@@ -1,3 +1,7 @@
1
+ ## 1.6.0 (2013-03-27)
2
+
3
+ * Update to `hogan.js` as of this [commit](https://github.com/twitter/hogan.js/commit/9a9eb1ab8fbbfedc9de73aeac4f9c1798d190a21)
4
+
1
5
  ## 1.5.1 (2013-2-26)
2
6
 
3
7
  * hamstache\_extensions and slimstache\_extensions options - @AlexRiedler
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- hogan_assets (1.5.1)
4
+ hogan_assets (1.6.0)
5
5
  execjs (>= 1.2.9)
6
6
  sprockets (>= 2.0.3)
7
7
  tilt (>= 1.3.3)
@@ -21,8 +21,8 @@ GEM
21
21
  multi_json (~> 1.0)
22
22
  haml (3.1.6)
23
23
  hike (1.2.1)
24
- multi_json (1.3.5)
25
- rack (1.4.1)
24
+ multi_json (1.7.1)
25
+ rack (1.5.2)
26
26
  slim (1.3.4)
27
27
  temple (~> 0.5.5)
28
28
  tilt (~> 1.3.3)
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  **hogan.js** is a templating engine developed at [Twitter](http://twitter.com) that follows the **mustache** spec and compiles the templates to JavaScript. The first bit is *cool*, since **mustache** is *cool*. The second bit is **awesome and full of win** because we can now compile our **mustache** templates on the server using the asset pipeline/sprockets.
6
6
 
7
- This gem contains **hogan.js v3.0.0**
7
+ This gem contains **hogan.js 3.0.0** as of this [commit](https://github.com/twitter/hogan.js/commit/9a9eb1ab8fbbfedc9de73aeac4f9c1798d190a21)
8
8
 
9
9
  ## Installation
10
10
 
@@ -1,3 +1,3 @@
1
1
  module HoganAssets
2
- VERSION = "1.5.1"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -15,22 +15,24 @@ module HoganAssets
15
15
  def test_render
16
16
  scope = make_scope '/myapp/app/assets/javascripts', 'path/to/template.mustache'
17
17
 
18
- template = HoganAssets::Tilt.new(scope.s_path) { "This is {{mustache}}" }
18
+ source = "This is {{mustache}}"
19
+ template = HoganAssets::Tilt.new(scope.s_path) { source }
19
20
 
20
21
  assert_equal <<-END_EXPECTED, template.render(scope, {})
21
22
  this.HoganTemplates || (this.HoganTemplates = {});
22
- this.HoganTemplates[\"path/to/template\"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||\"\");t.b(\"This is \");t.b(t.v(t.f(\"mustache\",c,p,0)));return t.fl(); },partials: {}, subs: { }}, "", Hogan, {});
23
+ this.HoganTemplates["path/to/template"] = new Hogan.Template(#{compiled_template source}, "", Hogan, {});
23
24
  END_EXPECTED
24
25
  end
25
26
 
26
27
  def test_hamstache_render
27
28
  scope = make_scope '/myapp/app/assets/javascripts', 'path/to/template.hamstache'
28
29
 
29
- template = HoganAssets::Tilt.new(scope.s_path) { "%p This is {{hamstache}}" }
30
+ source = "%p This is {{mustache}}"
31
+ template = HoganAssets::Tilt.new(scope.s_path) { source }
30
32
 
31
33
  assert_equal <<-END_EXPECTED, template.render(scope, {})
32
34
  this.HoganTemplates || (this.HoganTemplates = {});
33
- this.HoganTemplates[\"path/to/template\"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||\"\");t.b(\"<p>This is \");t.b(t.v(t.f(\"hamstache\",c,p,0)));t.b(\"</p>\");t.b(\"\\n\");return t.fl(); },partials: {}, subs: { }}, \"\", Hogan, {});
35
+ this.HoganTemplates["path/to/template"] = new Hogan.Template(#{compiled_template haml_compiled scope, source}, "", Hogan, {});
34
36
  END_EXPECTED
35
37
  end
36
38
 
@@ -41,11 +43,12 @@ module HoganAssets
41
43
 
42
44
  scope = make_scope '/myapp/app/assets/javascripts', 'path/to/template.mustache'
43
45
 
44
- template = HoganAssets::Tilt.new(scope.s_path) { "This is {{mustache}}" }
46
+ source = "This is {{mustache}}"
47
+ template = HoganAssets::Tilt.new(scope.s_path) { source }
45
48
 
46
49
  assert_equal <<-END_EXPECTED, template.render(scope, {})
47
50
  this.HoganTemplates || (this.HoganTemplates = {});
48
- this.HoganTemplates[\"path/to/template\"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||\"\");t.b(\"This is \");t.b(t.v(t.f(\"mustache\",c,p,0)));return t.fl(); },partials: {}, subs: { }}, "This is {{mustache}}", Hogan, {});
51
+ this.HoganTemplates["path/to/template"] = new Hogan.Template(#{compiled_template source}, "This is {{mustache}}", Hogan, {});
49
52
  END_EXPECTED
50
53
  end
51
54
 
@@ -56,11 +59,12 @@ module HoganAssets
56
59
 
57
60
  scope = make_scope '/myapp/app/assets/javascripts', 'app/templates/template.mustache'
58
61
 
59
- template = HoganAssets::Tilt.new(scope.s_path) { "This is {{mustache}}" }
62
+ source = "This is {{mustache}}"
63
+ template = HoganAssets::Tilt.new(scope.s_path) { source }
60
64
 
61
65
  assert_equal <<-END_EXPECTED, template.render(scope, {})
62
66
  this.HoganTemplates || (this.HoganTemplates = {});
63
- this.HoganTemplates[\"template\"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||\"\");t.b(\"This is \");t.b(t.v(t.f(\"mustache\",c,p,0)));return t.fl(); },partials: {}, subs: { }}, "", Hogan, {});
67
+ this.HoganTemplates["template"] = new Hogan.Template(#{compiled_template source}, "", Hogan, {});
64
68
  END_EXPECTED
65
69
  end
66
70
 
@@ -71,11 +75,12 @@ module HoganAssets
71
75
 
72
76
  scope = make_scope '/myapp/app/assets/javascripts', 'path/to/template.mustache'
73
77
 
74
- template = HoganAssets::Tilt.new(scope.s_path) { "This is {{mustache}}" }
78
+ source = "This is {{mustache}}"
79
+ template = HoganAssets::Tilt.new(scope.s_path) { source }
75
80
 
76
81
  assert_equal <<-END_EXPECTED, template.render(scope, {})
77
82
  this.JST || (this.JST = {});
78
- this.JST[\"path/to/template\"] = new Hogan.Template({code: function (c,p,i) { var t=this;t.b(i=i||\"\");t.b(\"This is \");t.b(t.v(t.f(\"mustache\",c,p,0)));return t.fl(); },partials: {}, subs: { }}, "", Hogan, {});
83
+ this.JST["path/to/template"] = new Hogan.Template(#{compiled_template source}, "", Hogan, {});
79
84
  END_EXPECTED
80
85
  end
81
86
 
@@ -11,7 +11,16 @@ module HoganAssets::Config
11
11
 
12
12
  end
13
13
  end
14
+
14
15
  module TestSupport
16
+ def compiled_template(text)
17
+ HoganAssets::Hogan.compile(text)
18
+ end
19
+
20
+ def haml_compiled(scope, text)
21
+ Haml::Engine.new(text, HoganAssets::Config.haml_options.merge(@options)).render(scope, {})
22
+ end
23
+
15
24
  # Try to act like sprockets.
16
25
  def make_scope(root, file)
17
26
  Class.new do
@@ -1,4 +1,4 @@
1
- /*
1
+ /*!
2
2
  * Copyright 2011 Twitter, Inc.
3
3
  * Licensed under the Apache License, Version 2.0 (the "License");
4
4
  * you may not use this file except in compliance with the License.
@@ -22,7 +22,7 @@ var Hogan = {};
22
22
  codeObj = codeObj || {};
23
23
  this.r = codeObj.code || this.r;
24
24
  this.c = compiler;
25
- this.options = options;
25
+ this.options = options || {};
26
26
  this.text = text || '';
27
27
  this.partials = codeObj.partials || {};
28
28
  this.subs = codeObj.subs || {};
@@ -73,14 +73,18 @@ var Hogan = {};
73
73
  this.partials[symbol].base = template;
74
74
 
75
75
  if (partial.subs) {
76
- template = createSpecializedPartial(template, partial.subs, partial.partials);
77
- }
78
-
76
+ // Make sure we consider parent template now
77
+ if (this.activeSub === undefined) {
78
+ // Store parent template text in partials.stackText to perform substitutions in child templates correctly
79
+ partials.stackText = this.text;
80
+ }
81
+ template = createSpecializedPartial(template, partial.subs, partial.partials, partials.stackText || this.text);
82
+ }
79
83
  this.partials[symbol].instance = template;
80
84
  return template;
81
85
  },
82
86
 
83
- // tries to find a partial in the curent scope and render it
87
+ // tries to find a partial in the current scope and render it
84
88
  rp: function(symbol, context, partials, indent) {
85
89
  var partial = this.ep(symbol, partials);
86
90
  if (!partial) {
@@ -118,7 +122,7 @@ var Hogan = {};
118
122
  val = this.ms(val, ctx, partials, inverted, start, end, tags);
119
123
  }
120
124
 
121
- pass = (val === '') || !!val;
125
+ pass = !!val;
122
126
 
123
127
  if (!inverted && pass && ctx) {
124
128
  ctx.push((typeof val == 'object') ? val : ctx[ctx.length - 1]);
@@ -129,20 +133,23 @@ var Hogan = {};
129
133
 
130
134
  // find values with dotted names
131
135
  d: function(key, ctx, partials, returnFound) {
132
- var names = key.split('.'),
136
+ var found,
137
+ names = key.split('.'),
133
138
  val = this.f(names[0], ctx, partials, returnFound),
139
+ doModelGet = this.options.modelGet,
134
140
  cx = null;
135
141
 
136
142
  if (key === '.' && isArray(ctx[ctx.length - 2])) {
137
- return ctx[ctx.length - 1];
138
- }
139
-
140
- for (var i = 1; i < names.length; i++) {
141
- if (val && typeof val == 'object' && val[names[i]] != null) {
142
- cx = val;
143
- val = val[names[i]];
144
- } else {
145
- val = '';
143
+ val = ctx[ctx.length - 1];
144
+ } else {
145
+ for (var i = 1; i < names.length; i++) {
146
+ found = findInScope(names[i], val, doModelGet);
147
+ if (found != null) {
148
+ cx = val;
149
+ val = found;
150
+ } else {
151
+ val = '';
152
+ }
146
153
  }
147
154
  }
148
155
 
@@ -163,12 +170,13 @@ var Hogan = {};
163
170
  f: function(key, ctx, partials, returnFound) {
164
171
  var val = false,
165
172
  v = null,
166
- found = false;
173
+ found = false,
174
+ doModelGet = this.options.modelGet;
167
175
 
168
176
  for (var i = ctx.length - 1; i >= 0; i--) {
169
177
  v = ctx[i];
170
- if (v && typeof v == 'object' && v[key] != null) {
171
- val = v[key];
178
+ val = findInScope(key, v, doModelGet);
179
+ if (val != null) {
172
180
  found = true;
173
181
  break;
174
182
  }
@@ -217,14 +225,16 @@ var Hogan = {};
217
225
 
218
226
  // method replace section
219
227
  ms: function(func, ctx, partials, inverted, start, end, tags) {
220
- var cx = ctx[ctx.length - 1],
228
+ var textSource,
229
+ cx = ctx[ctx.length - 1],
221
230
  result = func.call(cx);
222
231
 
223
232
  if (typeof result == 'function') {
224
233
  if (inverted) {
225
234
  return true;
226
235
  } else {
227
- return this.ls(result, cx, partials, this.text.substring(start, end), tags);
236
+ textSource = (this.activeSub && this.subsText[this.activeSub]) ? this.subsText[this.activeSub] : this.text;
237
+ return this.ls(result, cx, partials, textSource.substring(start, end), tags);
228
238
  }
229
239
  }
230
240
 
@@ -246,13 +256,33 @@ var Hogan = {};
246
256
  sub: function(name, context, partials, indent) {
247
257
  var f = this.subs[name];
248
258
  if (f) {
259
+ this.activeSub = name;
249
260
  f(context, partials, this, indent);
261
+ this.activeSub = false;
250
262
  }
251
263
  }
252
264
 
253
265
  };
254
266
 
255
- function createSpecializedPartial(instance, subs, partials) {
267
+ //Find a key in an object
268
+ function findInScope(key, scope, doModelGet) {
269
+ var val, checkVal;
270
+
271
+ if (scope && typeof scope == 'object') {
272
+
273
+ if (scope[key] != null) {
274
+ val = scope[key];
275
+
276
+ // try lookup with get for backbone or similar model data
277
+ } else if (doModelGet && scope.get && typeof scope.get == 'function') {
278
+ val = scope.get(key);
279
+ }
280
+ }
281
+
282
+ return val;
283
+ }
284
+
285
+ function createSpecializedPartial(instance, subs, partials, childText) {
256
286
  function PartialTemplate() {};
257
287
  PartialTemplate.prototype = instance;
258
288
  function Substitutions() {};
@@ -260,10 +290,12 @@ var Hogan = {};
260
290
  var key;
261
291
  var partial = new PartialTemplate();
262
292
  partial.subs = new Substitutions();
293
+ partial.subsText = {}; //hehe. substext.
263
294
  partial.ib();
264
295
 
265
296
  for (key in subs) {
266
297
  partial.subs[key] = subs[key];
298
+ partial.subsText[key] = childText;
267
299
  }
268
300
 
269
301
  for (key in partials) {
@@ -276,9 +308,9 @@ var Hogan = {};
276
308
  var rAmp = /&/g,
277
309
  rLt = /</g,
278
310
  rGt = />/g,
279
- rApos =/\'/g,
311
+ rApos = /\'/g,
280
312
  rQuot = /\"/g,
281
- hChars =/[&<>\"\']/;
313
+ hChars = /[&<>\"\']/;
282
314
 
283
315
  function coerceToString(val) {
284
316
  return String((val === null || val === undefined) ? '' : val);
@@ -288,10 +320,10 @@ var Hogan = {};
288
320
  str = coerceToString(str);
289
321
  return hChars.test(str) ?
290
322
  str
291
- .replace(rAmp,'&amp;')
292
- .replace(rLt,'&lt;')
293
- .replace(rGt,'&gt;')
294
- .replace(rApos,'&#39;')
323
+ .replace(rAmp, '&amp;')
324
+ .replace(rLt, '&lt;')
325
+ .replace(rGt, '&gt;')
326
+ .replace(rApos, '&#39;')
295
327
  .replace(rQuot, '&quot;') :
296
328
  str;
297
329
  }
@@ -385,7 +417,7 @@ var Hogan = {};
385
417
  ).split(' ');
386
418
 
387
419
  otag = delimiters[0];
388
- ctag = delimiters[1];
420
+ ctag = delimiters[delimiters.length - 1];
389
421
 
390
422
  return closeIndex + close.length - 1;
391
423
  }
@@ -671,7 +703,7 @@ var Hogan = {};
671
703
  return 't.b(' + s + ');';
672
704
  }
673
705
 
674
- Hogan.walk = function (nodelist, context) {
706
+ Hogan.walk = function(nodelist, context) {
675
707
  var func;
676
708
  for (var i = 0, l = nodelist.length; i < l; i++) {
677
709
  func = Hogan.codegen[nodelist[i].tag];
@@ -683,13 +715,13 @@ var Hogan = {};
683
715
  Hogan.parse = function(tokens, text, options) {
684
716
  options = options || {};
685
717
  return buildTree(tokens, '', [], options.sectionTags || []);
686
- },
718
+ }
687
719
 
688
720
  Hogan.cache = {};
689
721
 
690
722
  Hogan.cacheKey = function(text, options) {
691
- return [text, !!options.asString, !!options.disableLambda].join('||');
692
- },
723
+ return [text, !!options.asString, !!options.disableLambda, options.delimiters, !!options.modelGet].join('||');
724
+ }
693
725
 
694
726
  Hogan.compile = function(text, options) {
695
727
  options = options || {};
@@ -702,6 +734,6 @@ var Hogan = {};
702
734
 
703
735
  template = this.generate(this.parse(this.scan(text, options.delimiters), text, options), text, options);
704
736
  return this.cache[key] = template;
705
- };
737
+ }
706
738
  })(typeof exports !== 'undefined' ? exports : Hogan);
707
739
 
metadata CHANGED
@@ -1,112 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hogan_assets
3
3
  version: !ruby/object:Gem::Version
4
- prerelease:
5
- version: 1.5.1
4
+ version: 1.6.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Les Hill
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-26 00:00:00.000000000 Z
11
+ date: 2013-03-27 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: execjs
16
- version_requirements: !ruby/object:Gem::Requirement
17
- none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: 1.2.9
22
15
  requirement: !ruby/object:Gem::Requirement
23
- none: false
24
16
  requirements:
25
17
  - - ! '>='
26
18
  - !ruby/object:Gem::Version
27
19
  version: 1.2.9
28
20
  type: :runtime
29
21
  prerelease: false
30
- - !ruby/object:Gem::Dependency
31
- name: tilt
32
22
  version_requirements: !ruby/object:Gem::Requirement
33
- none: false
34
23
  requirements:
35
24
  - - ! '>='
36
25
  - !ruby/object:Gem::Version
37
- version: 1.3.3
26
+ version: 1.2.9
27
+ - !ruby/object:Gem::Dependency
28
+ name: tilt
38
29
  requirement: !ruby/object:Gem::Requirement
39
- none: false
40
30
  requirements:
41
31
  - - ! '>='
42
32
  - !ruby/object:Gem::Version
43
33
  version: 1.3.3
44
34
  type: :runtime
45
35
  prerelease: false
46
- - !ruby/object:Gem::Dependency
47
- name: sprockets
48
36
  version_requirements: !ruby/object:Gem::Requirement
49
- none: false
50
37
  requirements:
51
38
  - - ! '>='
52
39
  - !ruby/object:Gem::Version
53
- version: 2.0.3
40
+ version: 1.3.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: sprockets
54
43
  requirement: !ruby/object:Gem::Requirement
55
- none: false
56
44
  requirements:
57
45
  - - ! '>='
58
46
  - !ruby/object:Gem::Version
59
47
  version: 2.0.3
60
48
  type: :runtime
61
49
  prerelease: false
62
- - !ruby/object:Gem::Dependency
63
- name: debugger
64
50
  version_requirements: !ruby/object:Gem::Requirement
65
- none: false
66
51
  requirements:
67
52
  - - ! '>='
68
53
  - !ruby/object:Gem::Version
69
- version: '0'
54
+ version: 2.0.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: debugger
70
57
  requirement: !ruby/object:Gem::Requirement
71
- none: false
72
58
  requirements:
73
59
  - - ! '>='
74
60
  - !ruby/object:Gem::Version
75
61
  version: '0'
76
62
  type: :development
77
63
  prerelease: false
78
- - !ruby/object:Gem::Dependency
79
- name: haml
80
64
  version_requirements: !ruby/object:Gem::Requirement
81
- none: false
82
65
  requirements:
83
66
  - - ! '>='
84
67
  - !ruby/object:Gem::Version
85
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: haml
86
71
  requirement: !ruby/object:Gem::Requirement
87
- none: false
88
72
  requirements:
89
73
  - - ! '>='
90
74
  - !ruby/object:Gem::Version
91
75
  version: '0'
92
76
  type: :development
93
77
  prerelease: false
94
- - !ruby/object:Gem::Dependency
95
- name: slim
96
78
  version_requirements: !ruby/object:Gem::Requirement
97
- none: false
98
79
  requirements:
99
80
  - - ! '>='
100
81
  - !ruby/object:Gem::Version
101
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: slim
102
85
  requirement: !ruby/object:Gem::Requirement
103
- none: false
104
86
  requirements:
105
87
  - - ! '>='
106
88
  - !ruby/object:Gem::Version
107
89
  version: '0'
108
90
  type: :development
109
91
  prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ! '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
110
97
  description: Use compiled hogan.js (mustache) JavaScript templates with sprockets
111
98
  and the Rails asset pipeline.
112
99
  email:
@@ -137,27 +124,26 @@ files:
137
124
  - vendor/assets/javascripts/hogan.js
138
125
  homepage: https://github.com/leshill/hogan_assets
139
126
  licenses: []
127
+ metadata: {}
140
128
  post_install_message:
141
129
  rdoc_options: []
142
130
  require_paths:
143
131
  - lib
144
132
  required_ruby_version: !ruby/object:Gem::Requirement
145
- none: false
146
133
  requirements:
147
134
  - - ! '>='
148
135
  - !ruby/object:Gem::Version
149
136
  version: '0'
150
137
  required_rubygems_version: !ruby/object:Gem::Requirement
151
- none: false
152
138
  requirements:
153
139
  - - ! '>='
154
140
  - !ruby/object:Gem::Version
155
141
  version: '0'
156
142
  requirements: []
157
143
  rubyforge_project:
158
- rubygems_version: 1.8.25
144
+ rubygems_version: 2.0.3
159
145
  signing_key:
160
- specification_version: 3
146
+ specification_version: 4
161
147
  summary: Use compiled hogan.js (mustache) JavaScript templates with sprockets and
162
148
  the Rails asset pipeline.
163
149
  test_files:
@@ -165,3 +151,4 @@ test_files:
165
151
  - test/hogan_assets/config_test.rb
166
152
  - test/hogan_assets/tilt_test.rb
167
153
  - test/test_helper.rb
154
+ has_rdoc: