faml 0.2.5 → 0.2.6

Sign up to get free protection for your applications and to get access to all the features.
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