barber 0.1.2 → 0.1.3

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,5 @@
1
+ rvm:
2
+ - "1.9.3"
3
+ - "1.9.2"
4
+ - jruby-19mode
5
+ - rbx-19mode
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in handlebars-precompiler.gemspec
4
4
  gemspec
5
+
6
+ platform :jruby do
7
+ gem 'therubyrhino'
8
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Barber
1
+ # Barber [![Build Status](https://travis-ci.org/tchak/barber.png)](https://travis-ci.org/tchak/barber)
2
2
 
3
3
  Barber handles all your Handlebars precompilation needs. You can use
4
4
  Barber as part of your project build system or with someting like
@@ -39,6 +39,7 @@ module Barber
39
39
  # break the compiler when \n are present in view helpers. Coffeescript block strings
40
40
  # usually cause this problem.
41
41
  # Case 3: "Normal" input. Reading from a file or something like that.
42
+ # Case 4: Sanitize using a RegExp (edge cases with jRuby + Rhino)
42
43
  #
43
44
  # Each one of these cases is covered by a test case. If you find another breaking
44
45
  # use case please address it here with a regression test.
@@ -46,16 +47,35 @@ module Barber
46
47
  begin
47
48
  if template =~ /\A".+"\Z/m
48
49
  # Case 1
49
- JSON.load(%Q|{"template":#{template}}|)['template']
50
+ sanitize_with_json(template)
50
51
  else
51
52
  # Case 2: evaluate a literal JS string in Ruby in the JS context
52
53
  # to get an equivalent Ruby string back. This will convert liternal \n's
53
54
  # to new lines. This is safer than trying to modify the string using regex.
54
- context.eval("'#{template}'")
55
+ sanitize_with_execjs(template)
55
56
  end
56
57
  rescue JSON::ParserError, ExecJS::RuntimeError
57
58
  # Case 3
58
59
  template
60
+ rescue ExecJS::ProgramError
61
+ # Case 4
62
+ sanitize_with_regexp(template)
63
+ end
64
+ end
65
+
66
+ def sanitize_with_json(template)
67
+ JSON.load(%Q|{"template":#{template}}|)['template']
68
+ end
69
+
70
+ def sanitize_with_execjs(template)
71
+ context.eval("'#{template}'")
72
+ end
73
+
74
+ def sanitize_with_regexp(template)
75
+ if template.respond_to? :gsub
76
+ template.gsub(/\\n/,"\n")
77
+ else
78
+ template
59
79
  end
60
80
  end
61
81
 
@@ -1,3 +1,3 @@
1
1
  module Barber
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
@@ -20,20 +20,63 @@ class PrecompilerTest < MiniTest::Unit::TestCase
20
20
  assert result
21
21
  end
22
22
 
23
- def test_handles_multiline_coffeescript_strings
24
- template = '<h2>{{unbound view.title}}</h2>\n<ul>\n {{#each view.content}}\n {{view view.resultItemView\n contentBinding="this"\n selectedItemBinding="view.selectedItem"}}\n {{/each}}\n</ul>'
23
+ def test_handles_nil_template
24
+ result = compile nil
25
+ assert result
26
+ end
25
27
 
26
- result = compile template
28
+ def test_handles_multiline_coffeescript_strings
29
+ result = compile template_with_multiline_coffeescript_strings
27
30
  assert result
28
31
  end
29
32
 
30
33
  def test_handles_prescaped_JSON_strings
31
- template = '"<div class=\"comments\">\n <div class=\"span5 offset1\">\n {{#if view.comments.length}}\n <ul class=\"comments-list unstyled\">\n {{#each view.comments}}\n {{view Radium.CommentView commentBinding=\"this\"}}\n {{/each}}\n </ul>\n {{/if}}\n {{#if view.isError}}\n <p class=\"error\">Hmm, something wasn\'t done correctly. Try again?</p>\n {{/if}}\n <div style=\"clear: both\"></div>\n {{view view.commentTextArea}}\n </div>\n</div>\n"'
34
+ result = compile template_with_prescaped_JSON_strings
35
+ assert result
36
+ end
32
37
 
33
- result = compile template
38
+ def test_handles_single_quoted_strings
39
+ result = compile template_with_single_quoted_strings
40
+ assert result
41
+ end
42
+
43
+ def test_sanitize_with_json_multiline_coffeescript_strings
44
+ assert_raises JSON::ParserError do
45
+ sanitize_with_json template_with_multiline_coffeescript_strings
46
+ end
47
+ end
48
+
49
+ def test_sanitize_multiline_coffeescript_strings
50
+ result = sanitize template_with_multiline_coffeescript_strings
51
+ assert_equal sanitized_template_with_multiline_coffeescript_strings, result
52
+ end
53
+
54
+ def test_sanitize_prescaped_JSON_strings
55
+ result = sanitize template_with_prescaped_JSON_strings
56
+ assert result
57
+ end
58
+
59
+ def test_sanitize_with_execjs_multiline_coffeescript_strings
60
+ result = sanitize_with_execjs template_with_multiline_coffeescript_strings
61
+ assert_equal sanitized_template_with_multiline_coffeescript_strings, result
62
+ end
63
+
64
+ def test_sanitize_with_regexp_multiline_coffeescript_strings
65
+ result = sanitize_with_regexp template_with_multiline_coffeescript_strings
66
+ assert_equal sanitized_template_with_multiline_coffeescript_strings, result
67
+ end
68
+
69
+ def test_sanitize_with_json_prescaped_JSON_strings
70
+ result = sanitize_with_json template_with_prescaped_JSON_strings
34
71
  assert result
35
72
  end
36
73
 
74
+ def test_sanitize_with_execjs_prescaped_JSON_strings
75
+ assert_raises ExecJS::RuntimeError, ExecJS::ProgramError do
76
+ sanitize_with_execjs template_with_prescaped_JSON_strings
77
+ end
78
+ end
79
+
37
80
  def test_raises_an_error_on_bad_templates
38
81
  assert_raises Barber::PrecompilerError do
39
82
  compile "Hello {{"
@@ -58,4 +101,36 @@ class PrecompilerTest < MiniTest::Unit::TestCase
58
101
  def compile(template)
59
102
  Barber::Precompiler.compile template
60
103
  end
104
+
105
+ def sanitize_with_json(template)
106
+ Barber::Precompiler.new.send :sanitize_with_json, template
107
+ end
108
+
109
+ def sanitize_with_execjs(template)
110
+ Barber::Precompiler.new.send :sanitize_with_execjs, template
111
+ end
112
+
113
+ def sanitize_with_regexp(template)
114
+ Barber::Precompiler.new.send :sanitize_with_regexp, template
115
+ end
116
+
117
+ def sanitize(template)
118
+ Barber::Precompiler.new.send :sanitize, template
119
+ end
120
+
121
+ def template_with_multiline_coffeescript_strings
122
+ '<h2>{{unbound view.title}}</h2>\n<ul>\n {{#each view.content}}\n {{view view.resultItemView\n contentBinding="this"\n selectedItemBinding="view.selectedItem"}}\n {{/each}}\n</ul>'
123
+ end
124
+
125
+ def sanitized_template_with_multiline_coffeescript_strings
126
+ "<h2>{{unbound view.title}}</h2>\n<ul>\n {{#each view.content}}\n {{view view.resultItemView\n contentBinding=\"this\"\n selectedItemBinding=\"view.selectedItem\"}}\n {{/each}}\n</ul>"
127
+ end
128
+
129
+ def template_with_prescaped_JSON_strings
130
+ '"<div class=\"comments\">\n <div class=\"span5 offset1\">\n {{#if view.comments.length}}\n <ul class=\"comments-list unstyled\">\n {{#each view.comments}}\n {{view Radium.CommentView commentBinding=\"this\"}}\n {{/each}}\n </ul>\n {{/if}}\n {{#if view.isError}}\n <p class=\"error\">Hmm, something wasn\'t done correctly. Try again?</p>\n {{/if}}\n <div style=\"clear: both\"></div>\n {{view view.commentTextArea}}\n </div>\n</div>\n"'
131
+ end
132
+
133
+ def template_with_single_quoted_strings
134
+ "<h2>{{unbound view.title}}</h2>\n<ul>\n {{#each view.content}}\n {{view view.resultItemView\n contentBinding='this'\n selectedItemBinding='view.selectedItem'}}\n {{/each}}\n</ul>"
135
+ end
61
136
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: barber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
5
4
  prerelease:
5
+ version: 0.1.3
6
6
  platform: ruby
7
7
  authors:
8
8
  - tchak
@@ -10,67 +10,67 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-02 00:00:00.000000000 Z
13
+ date: 2012-12-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
+ type: :runtime
17
+ version_requirements: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
16
23
  name: execjs
24
+ prerelease: false
17
25
  requirement: !ruby/object:Gem::Requirement
18
26
  none: false
19
27
  requirements:
20
28
  - - ! '>='
21
29
  - !ruby/object:Gem::Version
22
30
  version: '0'
23
- type: :runtime
24
- prerelease: false
31
+ - !ruby/object:Gem::Dependency
32
+ type: :development
25
33
  version_requirements: !ruby/object:Gem::Requirement
26
34
  none: false
27
35
  requirements:
28
36
  - - ! '>='
29
37
  - !ruby/object:Gem::Version
30
38
  version: '0'
31
- - !ruby/object:Gem::Dependency
32
39
  name: rake
40
+ prerelease: false
33
41
  requirement: !ruby/object:Gem::Requirement
34
42
  none: false
35
43
  requirements:
36
44
  - - ! '>='
37
45
  - !ruby/object:Gem::Version
38
46
  version: '0'
47
+ - !ruby/object:Gem::Dependency
39
48
  type: :development
40
- prerelease: false
41
49
  version_requirements: !ruby/object:Gem::Requirement
42
50
  none: false
43
51
  requirements:
44
52
  - - ! '>='
45
53
  - !ruby/object:Gem::Version
46
54
  version: '0'
47
- - !ruby/object:Gem::Dependency
48
55
  name: simplecov
56
+ prerelease: false
49
57
  requirement: !ruby/object:Gem::Requirement
50
58
  none: false
51
59
  requirements:
52
60
  - - ! '>='
53
61
  - !ruby/object:Gem::Version
54
62
  version: '0'
63
+ - !ruby/object:Gem::Dependency
55
64
  type: :development
56
- prerelease: false
57
65
  version_requirements: !ruby/object:Gem::Requirement
58
66
  none: false
59
67
  requirements:
60
68
  - - ! '>='
61
69
  - !ruby/object:Gem::Version
62
70
  version: '0'
63
- - !ruby/object:Gem::Dependency
64
71
  name: mocha
65
- requirement: !ruby/object:Gem::Requirement
66
- none: false
67
- requirements:
68
- - - ! '>='
69
- - !ruby/object:Gem::Version
70
- version: '0'
71
- type: :development
72
72
  prerelease: false
73
- version_requirements: !ruby/object:Gem::Requirement
73
+ requirement: !ruby/object:Gem::Requirement
74
74
  none: false
75
75
  requirements:
76
76
  - - ! '>='
@@ -85,6 +85,7 @@ extensions: []
85
85
  extra_rdoc_files: []
86
86
  files:
87
87
  - .gitignore
88
+ - .travis.yml
88
89
  - Gemfile
89
90
  - LICENSE
90
91
  - README.md
@@ -116,22 +117,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
117
  requirements:
117
118
  - - ! '>='
118
119
  - !ruby/object:Gem::Version
119
- version: '0'
120
120
  segments:
121
121
  - 0
122
- hash: -2194861738178296462
122
+ hash: -4591227415054494269
123
+ version: '0'
123
124
  required_rubygems_version: !ruby/object:Gem::Requirement
124
125
  none: false
125
126
  requirements:
126
127
  - - ! '>='
127
128
  - !ruby/object:Gem::Version
128
- version: '0'
129
129
  segments:
130
130
  - 0
131
- hash: -2194861738178296462
131
+ hash: -4591227415054494269
132
+ version: '0'
132
133
  requirements: []
133
134
  rubyforge_project:
134
- rubygems_version: 1.8.24
135
+ rubygems_version: 1.8.23
135
136
  signing_key:
136
137
  specification_version: 3
137
138
  summary: Handlebars precompilation toolkit