faml 0.2.5 → 0.2.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5be22673d059f3065d3e748acab1499879a0808
4
- data.tar.gz: 493d64d87e95ee62a3f2567a60233de635a7ab69
3
+ metadata.gz: e56f6b1d1e1616fb0c3fad21f37e222335c035a5
4
+ data.tar.gz: 75024b5bd093c4fcc27505e42d9fd17e3ff4cca5
5
5
  SHA512:
6
- metadata.gz: ed6b5e9ef55122c50b410dc412f403f781a80ba99193f415a3eb8a6a188598e6861a8afb71362733acb71039856c4fc3d5fb7e9710e337f5cde92882eba5ca3f
7
- data.tar.gz: bca6c7834c44dab97238d108da0ee99db1f9152c15e6609e5e506ac2af6039b208c8aee57aab5bff4479ed27d5469810fb85ea83fd0f99a9164705ee9dde1c4d
6
+ metadata.gz: c5c2e4fd53a113be080c4a36e93dfc9c9472fd2bd2d2beecb5f60b7c0a8e47534380a9c3116239dcf2206710951d247b4a673f30441abd7eb07cc6d0b977f6a4
7
+ data.tar.gz: 3bb17b5f494fed5b47bbbe7507156b90cf7cc8f2378e52398527e97228e854249b50d4c976335055e8fad919ee90ad490e22004e52b30c867404900ea552bc3b
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## 0.2.6 (2015-03-31)
2
+ - Fix dependency on temple
3
+ - Improve backtrace when syntax error is raised
4
+ - https://github.com/eagletmt/faml/issues/13
5
+
1
6
  ## 0.2.5 (2015-03-30)
2
7
  - Fix parser when parsing attributes in `{'foo': 'bar'}` form
3
8
  - The syntax was introduced in Ruby 2.2.
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ require 'rspec/core/rake_task'
11
11
  RSpec::Core::RakeTask.new(:spec)
12
12
 
13
13
  namespace :benchmark do
14
- task :rendering => ['benchmark:rendering:haml', 'benchmark:rendering:attributes']
14
+ task :rendering => ['benchmark:rendering:haml', 'benchmark:rendering:attributes', 'benchmark:rendering:slim']
15
15
  namespace :rendering do
16
16
  desc "Run benchmark with Haml's standard template"
17
17
  task :haml do
@@ -22,7 +22,12 @@ namespace :benchmark do
22
22
 
23
23
  desc "Run benchmark for attribute builder"
24
24
  task :attributes do
25
- sh 'ruby', 'benchmark/rendering.rb', File.join('benchmark/attribute_builder.haml')
25
+ sh 'ruby', 'benchmark/rendering.rb', 'benchmark/attribute_builder.haml', 'benchmark/attribute_builder.slim'
26
+ end
27
+
28
+ desc "Run slim's benchmark"
29
+ task :slim do
30
+ sh 'ruby', 'benchmark/slim.rb'
26
31
  end
27
32
  end
28
33
  end
@@ -0,0 +1,5 @@
1
+ - h = { 'user' => { id: 1234, name: 'eagletmt' }, book_id: 5432 }
2
+ - c = %w[content active]
3
+
4
+ span.book data=h class=c
5
+ |Book
@@ -0,0 +1,11 @@
1
+ class Context
2
+ def header
3
+ 'Colors'
4
+ end
5
+
6
+ def item
7
+ [ { name: 'red', current: true, url: '#red' },
8
+ { name: 'green', current: false, url: '#green' },
9
+ { name: 'blue', current: false, url: '#blue' } ]
10
+ end
11
+ end
@@ -2,34 +2,38 @@
2
2
  require 'benchmark/ips'
3
3
  require 'haml'
4
4
  require 'faml'
5
+ require 'slim'
5
6
  require 'escape_utils/html/haml'
6
7
 
7
- template = ARGV[0]
8
- unless template
9
- $stderr.puts "Usage: #{$0} template.haml"
8
+ unless ARGV[0]
9
+ $stderr.puts "Usage: #{$0} template.haml [template.slim]"
10
10
  exit 1
11
11
  end
12
12
 
13
+ haml_code = File.read(ARGV[0])
14
+ slim_code = ARGV[1] ? File.read(ARGV[1]) : nil
15
+
13
16
  Benchmark.ips do |x|
14
17
  obj = Object.new
15
18
 
16
- Haml::Engine.new(File.read(template), ugly: true, escape_html: true).def_method(obj, :haml)
17
- code_array = Faml::Engine.new.call(File.read(template))
18
- obj.instance_eval("def faml_array; #{code_array}; end")
19
- code_string = Faml::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(File.read(template))
20
- obj.instance_eval("def faml_string; #{code_string}; end")
21
-
22
- x.report('Haml') do
23
- obj.haml
19
+ Haml::Engine.new(haml_code, ugly: true, escape_html: true).def_method(obj, :haml)
20
+ obj.instance_eval %{
21
+ def faml_array; #{Faml::Engine.new.call(haml_code)}; end
22
+ def faml_string; #{Faml::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(haml_code)}; end
23
+ }
24
+ if slim_code
25
+ obj.instance_eval %{
26
+ def slim_array; #{Slim::Engine.new.call(slim_code)}; end
27
+ def slim_string; #{Slim::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(slim_code)}; end
28
+ }
24
29
  end
25
30
 
26
- x.report('Faml (Array)') do
27
- obj.faml_array
31
+ x.report('Haml') { obj.haml }
32
+ x.report('Faml (Array)') { obj.faml_array }
33
+ x.report('Faml (String)') { obj.faml_string }
34
+ if slim_code
35
+ x.report('Slim (Array)') { obj.slim_array }
36
+ x.report('Slim (String)') { obj.slim_string }
28
37
  end
29
-
30
- x.report('Faml (String)') do
31
- obj.faml_string
32
- end
33
-
34
38
  x.compare!
35
39
  end
data/benchmark/slim.rb ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ require 'benchmark/ips'
3
+ require 'haml'
4
+ require 'faml'
5
+ require 'slim'
6
+ require 'escape_utils/html/haml'
7
+
8
+ require_relative 'context'
9
+
10
+ haml_code = File.read(File.join(__dir__, 'view.haml'))
11
+ slim_code = File.read(File.join(__dir__, 'view.slim'))
12
+
13
+ context = Context.new
14
+ Haml::Engine.new(haml_code, ugly: true, escape_html: true).def_method(context, :haml)
15
+ context.instance_eval %{
16
+ def faml; #{Faml::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(haml_code)}; end
17
+ def slim; #{Slim::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(slim_code)}; end
18
+ }
19
+
20
+ Benchmark.ips do |x|
21
+ x.report('Haml') { context.haml }
22
+ x.report('Faml') { context.faml }
23
+ x.report('Slim') { context.slim }
24
+ x.compare!
25
+ end
@@ -0,0 +1,18 @@
1
+ !!! html
2
+
3
+ %html
4
+ %head
5
+ %title Simple Benchmark
6
+ %body
7
+ %h1= header
8
+ - unless item.empty?
9
+ %ul
10
+ - for i in item
11
+ - if i[:current]
12
+ %li
13
+ %strong= i[:name]
14
+ - else
15
+ %li
16
+ %a{:href => i[:url]}= i[:name]
17
+ - else
18
+ %p The list is empty.
@@ -0,0 +1,17 @@
1
+ doctype html
2
+ html
3
+ head
4
+ title Simple Benchmark
5
+ body
6
+ h1 = header
7
+ - unless item.empty?
8
+ ul
9
+ - for i in item
10
+ - if i[:current]
11
+ li
12
+ strong = i[:name]
13
+ - else
14
+ li
15
+ a href=i[:url] = i[:name]
16
+ - else
17
+ p The list is empty.
data/faml.gemspec CHANGED
@@ -21,18 +21,19 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_dependency "escape_utils"
23
23
  spec.add_dependency "parser"
24
- spec.add_dependency "temple"
24
+ spec.add_dependency "temple", ">= 0.7.0"
25
25
  spec.add_dependency "tilt"
26
26
  spec.add_development_dependency "appraisal"
27
27
  spec.add_development_dependency "benchmark-ips"
28
28
  spec.add_development_dependency "bundler"
29
29
  spec.add_development_dependency "coffee-script"
30
30
  spec.add_development_dependency "coveralls"
31
- spec.add_development_dependency "haml"
31
+ spec.add_development_dependency "haml" # for benchmark
32
32
  spec.add_development_dependency "rake"
33
33
  spec.add_development_dependency "rake-compiler"
34
34
  spec.add_development_dependency "redcarpet"
35
35
  spec.add_development_dependency "rspec", ">= 3"
36
36
  spec.add_development_dependency "sass"
37
37
  spec.add_development_dependency "simplecov"
38
+ spec.add_development_dependency "slim" # for benchmark
38
39
  end
data/lib/faml/engine.rb CHANGED
@@ -8,6 +8,7 @@ module Faml
8
8
  class Engine < Temple::Engine
9
9
  define_options(
10
10
  generator: Temple::Generators::ArrayBuffer,
11
+ filename: nil,
11
12
  )
12
13
 
13
14
  DEFAULT_OPTIONS = {
data/lib/faml/error.rb ADDED
@@ -0,0 +1,9 @@
1
+ module Faml
2
+ class Error < StandardError
3
+ attr_reader :lineno
4
+ def initialize(message, lineno)
5
+ super(message)
6
+ @lineno = lineno
7
+ end
8
+ end
9
+ end
@@ -1,12 +1,8 @@
1
+ require 'faml/error'
2
+
1
3
  module Faml
2
4
  class IndentTracker
3
- class IndentMismatch < StandardError
4
- attr_reader :lineno
5
-
6
- def initialize(message, lineno)
7
- super("#{message} at line #{lineno}")
8
- @lineno = lineno
9
- end
5
+ class IndentMismatch < Error
10
6
  end
11
7
 
12
8
  def initialize(on_enter: nil, on_leave: nil)
data/lib/faml/parser.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'faml/ast'
2
2
  require 'faml/element_parser'
3
+ require 'faml/error'
3
4
  require 'faml/filter_parser'
4
5
  require 'faml/indent_tracker'
5
6
  require 'faml/line_parser'
@@ -11,6 +12,7 @@ require 'faml/syntax_error'
11
12
  module Faml
12
13
  class Parser
13
14
  def initialize(options = {})
15
+ @filename = options[:filename]
14
16
  end
15
17
 
16
18
  def call(template_str)
@@ -39,6 +41,11 @@ module Faml
39
41
  end
40
42
  @indent_tracker.finish
41
43
  @ast
44
+ rescue Error => e
45
+ if @filename && e.lineno
46
+ e.backtrace.unshift "#{@filename}:#{e.lineno}"
47
+ end
48
+ raise e
42
49
  end
43
50
 
44
51
  private
@@ -4,6 +4,7 @@ module Faml
4
4
  Engine.new(
5
5
  use_html_safe: true,
6
6
  generator: Temple::Generators::RailsOutputBuffer,
7
+ filename: template.identifier,
7
8
  ).call(template.source)
8
9
  end
9
10
  end
@@ -1,10 +1,6 @@
1
- module Faml
2
- class SyntaxError < StandardError
3
- attr_reader :lineno
1
+ require 'faml/error'
4
2
 
5
- def initialize(message, lineno)
6
- super("#{message} at line #{lineno}")
7
- @lineno = lineno
8
- end
3
+ module Faml
4
+ class SyntaxError < Error
9
5
  end
10
6
  end
data/lib/faml/tilt.rb CHANGED
@@ -4,7 +4,7 @@ require 'faml/engine'
4
4
  module Faml
5
5
  class Tilt < Tilt::Template
6
6
  def prepare
7
- @code = Engine.new(options).call(data)
7
+ @code = Engine.new(options.merge(filename: File.expand_path(file))).call(data)
8
8
  end
9
9
 
10
10
  def precompiled_template(locals = {})
data/lib/faml/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Faml
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.6"
3
3
  end
@@ -0,0 +1,3 @@
1
+ %div
2
+ %span indent
3
+ %span mismatch
@@ -0,0 +1,2 @@
1
+ %div
2
+ %span{ syntax error
@@ -5,5 +5,7 @@ Rails.application.routes.draw do
5
5
  get :with_capture
6
6
  get :escaped
7
7
  get :preserve
8
+ get :syntax_error
9
+ get :indent_error
8
10
  end
9
11
  end
@@ -52,4 +52,22 @@ RSpec.describe 'Faml with Rails', type: :request do
52
52
  expect(response.body).to include('<b>preserve&#x000A;me</b>')
53
53
  end
54
54
  end
55
+
56
+ describe 'compile time errors' do
57
+ describe Faml::SyntaxError do
58
+ it 'has proper backtrace' do
59
+ expect { get '/books/syntax_error' }.to raise_error { |e|
60
+ expect(e.backtrace[0]).to end_with('app/views/books/syntax_error.html.haml:2')
61
+ }
62
+ end
63
+ end
64
+
65
+ describe Faml::IndentTracker::IndentMismatch do
66
+ it 'has proper backtrace' do
67
+ expect { get '/books/indent_error' }.to raise_error { |e|
68
+ expect(e.backtrace[0]).to end_with('app/views/books/indent_error.html.haml:3')
69
+ }
70
+ end
71
+ end
72
+ end
55
73
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-30 00:00:00.000000000 Z
11
+ date: 2015-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 0.7.0
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 0.7.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: tilt
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -234,6 +234,20 @@ dependencies:
234
234
  - - ">="
235
235
  - !ruby/object:Gem::Version
236
236
  version: '0'
237
+ - !ruby/object:Gem::Dependency
238
+ name: slim
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: '0'
237
251
  description: Faster implementation of Haml template language.
238
252
  email:
239
253
  - eagletmt@gmail.com
@@ -254,7 +268,12 @@ files:
254
268
  - README.md
255
269
  - Rakefile
256
270
  - benchmark/attribute_builder.haml
271
+ - benchmark/attribute_builder.slim
272
+ - benchmark/context.rb
257
273
  - benchmark/rendering.rb
274
+ - benchmark/slim.rb
275
+ - benchmark/view.haml
276
+ - benchmark/view.slim
258
277
  - bin/faml
259
278
  - ext/attribute_builder/attribute_builder.c
260
279
  - ext/attribute_builder/extconf.rb
@@ -270,6 +289,7 @@ files:
270
289
  - lib/faml/compiler.rb
271
290
  - lib/faml/element_parser.rb
272
291
  - lib/faml/engine.rb
292
+ - lib/faml/error.rb
273
293
  - lib/faml/filter_compilers.rb
274
294
  - lib/faml/filter_compilers/base.rb
275
295
  - lib/faml/filter_compilers/cdata.rb
@@ -317,7 +337,9 @@ files:
317
337
  - spec/rails/app/models/concerns/.keep
318
338
  - spec/rails/app/views/books/escaped.html.haml
319
339
  - spec/rails/app/views/books/hello.html.haml
340
+ - spec/rails/app/views/books/indent_error.html.haml
320
341
  - spec/rails/app/views/books/preserve.html.haml
342
+ - spec/rails/app/views/books/syntax_error.html.haml
321
343
  - spec/rails/app/views/books/with_capture.html.haml
322
344
  - spec/rails/app/views/books/with_variables.html.haml
323
345
  - spec/rails/app/views/layouts/application.html.haml
@@ -406,7 +428,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
406
428
  version: '0'
407
429
  requirements: []
408
430
  rubyforge_project:
409
- rubygems_version: 2.4.5
431
+ rubygems_version: 2.2.2
410
432
  signing_key:
411
433
  specification_version: 4
412
434
  summary: Faster implementation of Haml template language.
@@ -426,7 +448,9 @@ test_files:
426
448
  - spec/rails/app/models/concerns/.keep
427
449
  - spec/rails/app/views/books/escaped.html.haml
428
450
  - spec/rails/app/views/books/hello.html.haml
451
+ - spec/rails/app/views/books/indent_error.html.haml
429
452
  - spec/rails/app/views/books/preserve.html.haml
453
+ - spec/rails/app/views/books/syntax_error.html.haml
430
454
  - spec/rails/app/views/books/with_capture.html.haml
431
455
  - spec/rails/app/views/books/with_variables.html.haml
432
456
  - spec/rails/app/views/layouts/application.html.haml