hamlit 1.5.4 → 1.5.5

Sign up to get free protection for your applications and to get access to all the features.
data/spec/spec_helper.rb CHANGED
@@ -17,18 +17,20 @@ module HamlitSpecHelper
17
17
  def assert_render(haml, html, options = {})
18
18
  errs = array_wrap(options.delete(:error_with) || [])
19
19
  impls = array_wrap(options.delete(:compatible_only) || [:haml, :faml] - errs)
20
- haml = haml.unindent
21
- html = html.unindent
20
+ fails = [:haml, :faml] - impls - errs
22
21
 
23
- expect(render_string(haml, options)).to eq(html)
24
- impls.each do |impl|
25
- expect_compatibility(impl, haml, options)
26
- end
27
- errs.each do |impl|
28
- expect_compatibility(impl, haml, options, type: :error)
29
- end
30
- ([:haml, :faml] - impls - errs).each do |impl|
31
- expect_compatibility(impl, haml, options, type: :failure)
22
+ test = TestCase.new
23
+ test.src_haml = haml.unindent
24
+ test.hamlit_html = html.unindent
25
+
26
+ expect(render_string(test.src_haml, options)).to eq(test.hamlit_html)
27
+ impls.each { |i| expect_compatibility(i, test, options) }
28
+ errs.each { |i| expect_compatibility(i, test, options, type: :error) }
29
+ fails.each { |i| expect_compatibility(i, test, options, type: :failure) }
30
+
31
+ if TestCase.generate_docs? && (errs.any? || fails.any?)
32
+ write_caller!(test)
33
+ TestCase.register_test!(test)
32
34
  end
33
35
  end
34
36
 
@@ -46,48 +48,57 @@ module HamlitSpecHelper
46
48
 
47
49
  private
48
50
 
49
- def expect_compatibility(impl, haml, options, type: :success)
51
+ def write_caller!(test)
52
+ line = caller.find{ |l| l =~ %r{spec/hamlit} }
53
+ path, lineno = line.match(/^([^:]+):([0-9]+)/).to_a.last(2)
54
+ test.lineno = lineno.to_i - 1
55
+ test.dir, test.file = path.gsub(%r{^.+spec/hamlit/}, '').split('/')
56
+ end
57
+
58
+ def expect_compatibility(impl, test, options, type: :success)
50
59
  case impl
51
60
  when :haml
52
- expect_haml(haml, options, type: type)
61
+ expect_haml(impl, test, options, type)
53
62
  when :faml
54
- expect_faml(haml, options, type: type)
63
+ expect_faml(impl, test, options, type)
55
64
  end
56
65
  end
57
66
 
58
- def expect_faml(haml, options, type: :success)
59
- hamlit_html = render_string(haml, options)
60
- options = options.dup
61
- options.delete(:escape_html)
67
+ def expect_haml(impl, test, options, type)
68
+ expect_implementation(impl, test, options, type) do |test, options|
69
+ options = DEFAULT_OPTIONS.merge(options)
70
+ Haml::Engine.new(test.src_haml, options).render(Object.new, {})
71
+ end
72
+ end
62
73
 
63
- case type
64
- when :success
65
- faml_html = eval Faml::Engine.new(options).call(haml)
66
- expect(hamlit_html).to eq(faml_html)
67
- when :failure
68
- faml_html = eval Faml::Engine.new(options).call(haml)
69
- expect(hamlit_html).to_not eq(faml_html)
70
- when :error
71
- expect {
72
- eval Faml::Engine.new(options).call(haml)
73
- }.to raise_error
74
+ def expect_faml(impl, test, options, type)
75
+ expect_implementation(impl, test, options, type) do |test, options|
76
+ options = options.dup
77
+ options.delete(:escape_html)
78
+ eval Faml::Engine.new(options).call(test.src_haml)
74
79
  end
75
80
  end
76
81
 
77
- def expect_haml(haml, options, type: :success)
78
- hamlit_html = render_string(haml, options)
79
- options = DEFAULT_OPTIONS.merge(options)
82
+ def expect_implementation(impl, test, options, type, &block)
83
+ if type == :error
84
+ expect { block.call(test, options) }.to raise_error
85
+ begin
86
+ block.call(test, options)
87
+ rescue Exception => e
88
+ err = "#{e.class}: #{e.message}"
89
+ test.send(:"#{impl}_html=", err)
90
+ end
91
+ return
92
+ end
93
+
94
+ result = block.call(test, options)
95
+ test.send(:"#{impl}_html=", result)
96
+
80
97
  case type
81
98
  when :success
82
- haml_html = Haml::Engine.new(haml, options).render(Object.new, {})
83
- expect(hamlit_html).to eq(haml_html)
99
+ expect(test.hamlit_html).to eq(result)
84
100
  when :failure
85
- haml_html = Haml::Engine.new(haml, options).render(Object.new, {})
86
- expect(hamlit_html).to_not eq(haml_html)
87
- when :error
88
- expect {
89
- Haml::Engine.new(haml, options).render(Object.new, {})
90
- }.to raise_error
101
+ expect(test.hamlit_html).to_not eq(result)
91
102
  end
92
103
  end
93
104
 
@@ -95,6 +106,128 @@ module HamlitSpecHelper
95
106
  return arr if arr.is_a?(Array)
96
107
  [arr]
97
108
  end
109
+
110
+ def tests
111
+ @tests ||= []
112
+ end
113
+ end
114
+
115
+ # This is used to generate a document automatically.
116
+ class TestCase < Struct.new(:file, :dir, :lineno, :src_haml, :haml_html, :faml_html, :hamlit_html)
117
+ class << self
118
+ def incompatibilities
119
+ @incompatibilities ||= []
120
+ end
121
+
122
+ def generate_docs!
123
+ prepare_dirs!
124
+ generate_toc!
125
+
126
+ incompatibilities.group_by(&:doc_path).each do |path, tests|
127
+ doc = tests.sort_by(&:lineno).map(&:document).join("\n")
128
+ full_path = File.join(doc_dir, path)
129
+ File.write(full_path, doc)
130
+ end
131
+ end
132
+
133
+ def generate_docs?
134
+ ENV['AUTODOC']
135
+ end
136
+
137
+ def register_test!(test)
138
+ incompatibilities << test unless @skipdoc
139
+ end
140
+
141
+ def skipdoc(&block)
142
+ @skipdoc = true
143
+ block.call
144
+ ensure
145
+ @skipdoc = false
146
+ end
147
+
148
+ private
149
+
150
+ def generate_toc!
151
+ table_of_contents = <<-TOC.unindent
152
+ # Hamlit incompatibilities
153
+
154
+ This is a document generated from RSpec test cases.
155
+ Showing incompatibilities against [Haml](https://github.com/haml/haml) and [Faml](https://github.com/eagletmt/faml).
156
+ TOC
157
+
158
+ incompatibilities.group_by(&:dir).each do |dir, tests|
159
+ # TODO: Split incompatibility documents into haml and faml
160
+ # There are too many noisy documents now.
161
+ next if dir == 'filters'
162
+
163
+ table_of_contents << "\n## #{dir}\n"
164
+
165
+ tests.group_by(&:doc_path).each do |path, tests|
166
+ test = tests.first
167
+ file_path = File.join(test.dir, test.file)
168
+ base_url = 'https://github.com/k0kubun/hamlit/blob/master/doc/'
169
+ table_of_contents << "\n- [#{escape_markdown(file_path)}](#{File.join(base_url, path)})"
170
+ end
171
+ table_of_contents << "\n"
172
+ end
173
+
174
+ path = File.join(doc_dir, 'README.md')
175
+ File.write(path, table_of_contents)
176
+ end
177
+
178
+ def prepare_dirs!
179
+ system("rm -rf #{doc_dir}")
180
+ incompatibilities.map(&:dir).uniq.each do |dir|
181
+ system("mkdir -p #{doc_dir}/#{dir}")
182
+ end
183
+ end
184
+
185
+ def doc_dir
186
+ @doc_dir ||= File.expand_path('./doc')
187
+ end
188
+
189
+ def escape_markdown(text)
190
+ text.gsub(/_/, '\\_')
191
+ end
192
+ end
193
+
194
+ def document
195
+ base_url = 'https://github.com/k0kubun/hamlit/blob/master/spec/hamlit'
196
+ url = File.join(base_url, dir, file)
197
+ doc = <<-DOC
198
+ # [#{escape_markdown("#{file}:#{lineno}")}](#{url}#L#{lineno})
199
+ ## Input
200
+ ```haml
201
+ #{src_haml}
202
+ ```
203
+
204
+ ## Output
205
+ DOC
206
+
207
+ html_by_name = {
208
+ 'Haml' => haml_html,
209
+ 'Faml' => faml_html,
210
+ 'Hamlit' => hamlit_html,
211
+ }
212
+ html_by_name.group_by(&:last).each do |html, pairs|
213
+ doc << "### #{pairs.map(&:first).join(', ')}\n"
214
+ doc << "```html\n"
215
+ doc << "#{html}\n"
216
+ doc << "```\n\n"
217
+ end
218
+
219
+ doc
220
+ end
221
+
222
+ def doc_path
223
+ File.join(dir, file.gsub(/_spec\.rb$/, '.md'))
224
+ end
225
+
226
+ private
227
+
228
+ def escape_markdown(text)
229
+ self.class.send(:escape_markdown, text)
230
+ end
98
231
  end
99
232
 
100
233
  RSpec.configure do |config|
@@ -107,4 +240,14 @@ RSpec.configure do |config|
107
240
  config.mock_with :rspec do |mocks|
108
241
  mocks.verify_partial_doubles = true
109
242
  end
243
+
244
+ config.around(:each, skipdoc: true) do |example|
245
+ TestCase.skipdoc do
246
+ example.run
247
+ end
248
+ end
249
+
250
+ config.after(:suite) do
251
+ TestCase.generate_docs! if TestCase.generate_docs?
252
+ end
110
253
  end
data/test CHANGED
@@ -12,6 +12,9 @@ VERSIONS=(
12
12
  function test_with() {
13
13
  version=$1
14
14
  rbenv local $version
15
+ if ! bundle check > /dev/null; then
16
+ bundle install
17
+ fi
15
18
  ruby -v
16
19
  rake spec
17
20
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hamlit
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.4
4
+ version: 1.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Takashi Kokubun
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 0.7.3
33
+ version: 0.7.6
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 0.7.3
40
+ version: 0.7.6
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: thor
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -313,6 +313,18 @@ files:
313
313
  - benchmarks/view.rbhtml
314
314
  - benchmarks/view.slim
315
315
  - bin/hamlit
316
+ - doc/README.md
317
+ - doc/engine/old_attributes.md
318
+ - doc/engine/script.md
319
+ - doc/engine/text.md
320
+ - doc/filters/coffee.md
321
+ - doc/filters/erb.md
322
+ - doc/filters/javascript.md
323
+ - doc/filters/less.md
324
+ - doc/filters/markdown.md
325
+ - doc/filters/plain.md
326
+ - doc/filters/sass.md
327
+ - doc/filters/scss.md
316
328
  - hamlit.gemspec
317
329
  - lib/hamlit.rb
318
330
  - lib/hamlit/attribute.rb
@@ -390,6 +402,7 @@ files:
390
402
  - spec/hamlit/filters/javascript_spec.rb
391
403
  - spec/hamlit/filters/less_spec.rb
392
404
  - spec/hamlit/filters/markdown_spec.rb
405
+ - spec/hamlit/filters/plain_spec.rb
393
406
  - spec/hamlit/filters/ruby_spec.rb
394
407
  - spec/hamlit/filters/sass_spec.rb
395
408
  - spec/hamlit/filters/scss_spec.rb
@@ -504,6 +517,7 @@ test_files:
504
517
  - spec/hamlit/filters/javascript_spec.rb
505
518
  - spec/hamlit/filters/less_spec.rb
506
519
  - spec/hamlit/filters/markdown_spec.rb
520
+ - spec/hamlit/filters/plain_spec.rb
507
521
  - spec/hamlit/filters/ruby_spec.rb
508
522
  - spec/hamlit/filters/sass_spec.rb
509
523
  - spec/hamlit/filters/scss_spec.rb
@@ -573,4 +587,3 @@ test_files:
573
587
  - spec/rails/vendor/assets/javascripts/.keep
574
588
  - spec/rails/vendor/assets/stylesheets/.keep
575
589
  - spec/spec_helper.rb
576
- has_rdoc: