hamlit 1.5.4 → 1.5.5

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.
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: