haml 5.2.0 → 6.0.0.beta.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/test.yml +40 -0
  4. data/.gitignore +16 -16
  5. data/CHANGELOG.md +26 -1
  6. data/Gemfile +18 -11
  7. data/MIT-LICENSE +1 -1
  8. data/REFERENCE.md +19 -8
  9. data/Rakefile +95 -93
  10. data/bin/bench +66 -0
  11. data/bin/console +11 -0
  12. data/bin/ruby +3 -0
  13. data/bin/setup +7 -0
  14. data/bin/stackprof +27 -0
  15. data/bin/test +24 -0
  16. data/exe/haml +6 -0
  17. data/ext/haml/extconf.rb +10 -0
  18. data/ext/haml/haml.c +537 -0
  19. data/ext/haml/hescape.c +108 -0
  20. data/ext/haml/hescape.h +20 -0
  21. data/haml.gemspec +39 -37
  22. data/lib/haml/ambles.rb +20 -0
  23. data/lib/haml/attribute_builder.rb +140 -129
  24. data/lib/haml/attribute_compiler.rb +85 -192
  25. data/lib/haml/attribute_parser.rb +86 -126
  26. data/lib/haml/cli.rb +154 -0
  27. data/lib/haml/compiler/children_compiler.rb +126 -0
  28. data/lib/haml/compiler/comment_compiler.rb +39 -0
  29. data/lib/haml/compiler/doctype_compiler.rb +46 -0
  30. data/lib/haml/compiler/script_compiler.rb +116 -0
  31. data/lib/haml/compiler/silent_script_compiler.rb +24 -0
  32. data/lib/haml/compiler/tag_compiler.rb +76 -0
  33. data/lib/haml/compiler.rb +63 -296
  34. data/lib/haml/dynamic_merger.rb +67 -0
  35. data/lib/haml/engine.rb +42 -227
  36. data/lib/haml/error.rb +3 -52
  37. data/lib/haml/escapable.rb +6 -70
  38. data/lib/haml/filters/base.rb +12 -0
  39. data/lib/haml/filters/cdata.rb +20 -0
  40. data/lib/haml/filters/coffee.rb +17 -0
  41. data/lib/haml/filters/css.rb +33 -0
  42. data/lib/haml/filters/erb.rb +10 -0
  43. data/lib/haml/filters/escaped.rb +22 -0
  44. data/lib/haml/filters/javascript.rb +33 -0
  45. data/lib/haml/filters/less.rb +20 -0
  46. data/lib/haml/filters/markdown.rb +11 -0
  47. data/lib/haml/filters/plain.rb +29 -0
  48. data/lib/haml/filters/preserve.rb +22 -0
  49. data/lib/haml/filters/ruby.rb +10 -0
  50. data/lib/haml/filters/sass.rb +15 -0
  51. data/lib/haml/filters/scss.rb +15 -0
  52. data/lib/haml/filters/text_base.rb +25 -0
  53. data/lib/haml/filters/tilt_base.rb +49 -0
  54. data/lib/haml/filters.rb +54 -378
  55. data/lib/haml/force_escapable.rb +29 -0
  56. data/lib/haml/haml_error.rb +66 -0
  57. data/lib/haml/helpers.rb +3 -697
  58. data/lib/haml/html.rb +22 -0
  59. data/lib/haml/identity.rb +13 -0
  60. data/lib/haml/object_ref.rb +30 -0
  61. data/lib/haml/parser.rb +208 -50
  62. data/lib/haml/rails_helpers.rb +51 -0
  63. data/lib/haml/rails_template.rb +55 -0
  64. data/lib/haml/railtie.rb +7 -40
  65. data/lib/haml/ruby_expression.rb +32 -0
  66. data/lib/haml/string_splitter.rb +20 -0
  67. data/lib/haml/template.rb +15 -34
  68. data/lib/haml/temple_line_counter.rb +2 -1
  69. data/lib/haml/util.rb +18 -16
  70. data/lib/haml/version.rb +1 -2
  71. data/lib/haml.rb +8 -20
  72. metadata +216 -62
  73. data/.gitmodules +0 -3
  74. data/.travis.yml +0 -72
  75. data/.yardopts +0 -22
  76. data/TODO +0 -24
  77. data/benchmark.rb +0 -70
  78. data/bin/haml +0 -9
  79. data/lib/haml/.gitattributes +0 -1
  80. data/lib/haml/buffer.rb +0 -238
  81. data/lib/haml/exec.rb +0 -347
  82. data/lib/haml/generator.rb +0 -42
  83. data/lib/haml/helpers/action_view_extensions.rb +0 -60
  84. data/lib/haml/helpers/action_view_mods.rb +0 -132
  85. data/lib/haml/helpers/action_view_xss_mods.rb +0 -60
  86. data/lib/haml/helpers/safe_erubi_template.rb +0 -20
  87. data/lib/haml/helpers/safe_erubis_template.rb +0 -33
  88. data/lib/haml/helpers/xss_mods.rb +0 -114
  89. data/lib/haml/options.rb +0 -273
  90. data/lib/haml/plugin.rb +0 -37
  91. data/lib/haml/sass_rails_filter.rb +0 -47
  92. data/lib/haml/template/options.rb +0 -27
  93. data/lib/haml/temple_engine.rb +0 -123
  94. data/yard/default/.gitignore +0 -1
  95. data/yard/default/fulldoc/html/css/common.sass +0 -15
  96. data/yard/default/layout/html/footer.erb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ccbf9b5c93745c83284467b77b73dd156f049dacf55861dd486bd14404d84e84
4
- data.tar.gz: 4e2439c5e370db4bd765ca76ab4d76c027d9a9f9f6b68e5d38761e6858f3312f
3
+ metadata.gz: 6bda3cad64d59ca87a154986af35ca0e8f4aad63ccb20dcfc6baef0d4d1c5484
4
+ data.tar.gz: 025dca6d373cc07efe22112720722b4b419cb64b7588db502ee96d3597798edb
5
5
  SHA512:
6
- metadata.gz: f0c7b716e9866070fc50281e4486eb519832c3f098cbd58bb62ca18f2659ca85bc44cd6a275121fe71f37f8d9e442ac9b75f254b28747b5fbff47a98b1e633c5
7
- data.tar.gz: 3e870080f42d925cddc479a52318d2cb8e6a9dbfd5613e8027c0c4dfd80e4f7636fa9f50cd41d3eca6f72f12bcc1cc7e5a5b2b9120223e1e6218ad8d6dcf9ca8
6
+ metadata.gz: e526126720ad094d1a15281c028c8c8e002a3bcc1929f40d92caeebe25dccd1e8dc99471e7f52f95290241b65e4a83266c6e7fe58771891095e897408eef9b80
7
+ data.tar.gz: '078dfbdbd0c4f3904d303a376f2c460f4e35ba33b0e87bb33d449246e925e4d7e42248b32bd1060586d527130629d41e682ee426b2fb9a2539a6adca3ecde09c'
@@ -0,0 +1 @@
1
+ github: haml
@@ -0,0 +1,40 @@
1
+ name: test
2
+ on:
3
+ push:
4
+ branches:
5
+ - main
6
+ pull_request:
7
+ types:
8
+ - opened
9
+ - synchronize
10
+ - reopened
11
+ schedule:
12
+ - cron: "00 15 * * *"
13
+ jobs:
14
+ test:
15
+ runs-on: ubuntu-latest
16
+ strategy:
17
+ matrix:
18
+ ruby:
19
+ - '2.5'
20
+ - '2.6'
21
+ - '2.7'
22
+ - '3.0'
23
+ - '3.1'
24
+ - jruby
25
+ - truffleruby-head
26
+ steps:
27
+ - uses: actions/checkout@v2
28
+ - name: Set up Ruby
29
+ uses: ruby/setup-ruby@v1
30
+ with:
31
+ ruby-version: ${{ matrix.ruby }}
32
+ - uses: actions/cache@v2
33
+ with:
34
+ path: vendor/bundle
35
+ key: ${{ runner.os }}-${{ matrix.ruby }}-gems-${{ hashFiles('**/Gemfile.lock') }}
36
+ restore-keys: ${{ runner.os }}-gems-
37
+ - run: sudo apt-get update && sudo apt-get install -y nodejs libxslt-dev # nodejs for execjs, libxslt for TruffleRuby nokogiri
38
+ - name: bundle install
39
+ run: bundle config path vendor/bundle && bundle install -j$(nproc) --retry 3
40
+ - run: bundle exec rake test
data/.gitignore CHANGED
@@ -1,19 +1,19 @@
1
- /.idea
1
+ /.bundle/
2
2
  /.yardoc
3
- /coverage
4
- /doc
5
- /log
6
- /pkg
7
- /test/rails
8
- /test/gemfiles/*.lock
9
- /.haml
10
- /site
11
- *.rbc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /.idea
6
+ /coverage/
7
+ /doc/
8
+ /pkg/
9
+ /spec/reports/
10
+ /tmp/
11
+ /haml/
12
12
  .sass-cache
13
- .rbenv-version
14
- .rbx
15
13
  .ruby-version
16
- .rvmrc
17
- Gemfile.lock
18
- tmp
19
- .bundle/
14
+ *.bundle
15
+ *.so
16
+ *.su
17
+ *.a
18
+ *.o
19
+ *.swp
data/CHANGELOG.md CHANGED
@@ -1,9 +1,34 @@
1
1
  # Haml Changelog
2
2
 
3
+ ## 6.0.0
4
+
5
+ Not released yet
6
+ ([diff](https://github.com/haml/haml/compare/v5.2.2...main)).
7
+
8
+ * Replace the implementation with Hamlit
9
+ * Haml 6 is about 1.7x faster than Haml 5 in [this benchmark](benchmark/slim/run-benchmarks.rb).
10
+ * The parser is kept as is, but everything else is replaced.
11
+ * All Haml helpers except for `preserve` are removed.
12
+ * Some legacy Rails integration is removed.
13
+
14
+ ## 5.2.2
15
+
16
+ Released on July 27, 2021
17
+ ([diff](https://github.com/haml/haml/compare/v5.2.1...v5.2.2)).
18
+
19
+ * Support `config.action_view.annotate_rendered_view_with_filenames = true` of Rails 6.1
20
+
21
+ ## 5.2.1
22
+
23
+ Released on November 30, 2020
24
+ ([diff](https://github.com/haml/haml/compare/v5.2.0...v5.2.1)).
25
+
26
+ * Add in improved "multiline" support for attributes [#1043](https://github.com/haml/haml/issues/1043)
27
+
3
28
  ## 5.2
4
29
 
5
30
  Released on September 28, 2020
6
- ([diff](https://github.com/haml/haml/compare/v5.1.2...v5.2)).
31
+ ([diff](https://github.com/haml/haml/compare/v5.1.2...v5.2.0)).
7
32
 
8
33
  * Fix crash in the attribute optimizer when `#inspect` is overridden in TrueClass / FalseClass [#972](https://github.com/haml/haml/issues/972)
9
34
  * Do not HTML-escape templates that are declared to be plaintext [#1014](https://github.com/haml/haml/issues/1014) (Thanks [@cesarizu](https://github.com/cesarizu))
data/Gemfile CHANGED
@@ -1,16 +1,23 @@
1
- source "https://rubygems.org"
1
+ source 'https://rubygems.org'
2
+
3
+ git_source(:github) do |repo_name|
4
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
5
+ "https://github.com/#{repo_name}.git"
6
+ end
7
+
8
+ # Specify your gem's dependencies in haml.gemspec
2
9
  gemspec
3
10
 
4
- gem "m"
5
- gem "pry"
6
- gem "simplecov"
11
+ gem 'benchmark-ips', '2.3.0'
12
+ gem 'maxitest'
13
+ gem 'pry'
7
14
 
8
- group :docs do
9
- gem "yard"
10
- gem "kramdown"
11
- gem "sass"
12
- end
15
+ if /java/ === RUBY_PLATFORM # JRuby
16
+ gem 'pandoc-ruby'
17
+ else
18
+ gem 'redcarpet'
13
19
 
14
- platform :mri do
15
- gem "ruby-prof"
20
+ if RUBY_PLATFORM !~ /mswin|mingw/ && RUBY_ENGINE != 'truffleruby'
21
+ gem 'stackprof'
22
+ end
16
23
  end
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006-2019 Hampton Catlin and Natalie Weizenbaum
1
+ Copyright (c) 2006-2021 Hampton Catlin, Natalie Weizenbaum and Takashi Kokubun
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/REFERENCE.md CHANGED
@@ -107,13 +107,20 @@ output.
107
107
  In Rails, options can be set by setting the {Haml::Template#options Haml::Template.options}
108
108
  hash in an initializer:
109
109
 
110
- # config/initializers/haml.rb
111
- Haml::Template.options[:format] = :html5
110
+ ```ruby
111
+ # config/initializers/haml.rb
112
+ Haml::Template.options[:format] = :html5
113
+
114
+ # Avoid escaping attributes which are already escaped
115
+ Haml::Template.options[:escape_attrs] = :once
116
+ ```
112
117
 
113
118
  Outside Rails, you can set them by configuring them globally in
114
119
  Haml::Options.defaults:
115
120
 
116
- Haml::Options.defaults[:format] = :html5
121
+ ```ruby
122
+ Haml::Options.defaults[:format] = :html5
123
+ ```
117
124
 
118
125
  In sinatra specifically, you can set them in global config with:
119
126
  ```ruby
@@ -228,15 +235,19 @@ is compiled to:
228
235
  <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en'></html>
229
236
 
230
237
  Attribute hashes can also be stretched out over multiple lines to accommodate
231
- many attributes. However, newlines may only be placed immediately after commas.
232
- For example:
238
+ many attributes.
233
239
 
234
- %script{:type => "text/javascript",
235
- :src => "javascripts/script_#{2 + 7}"}
240
+ %script{
241
+ "type": text/javascript",
242
+ "src": javascripts/script_#{2 + 7}",
243
+ "data": {
244
+ "controller": "reporter",
245
+ },
246
+ }
236
247
 
237
248
  is compiled to:
238
249
 
239
- <script src='javascripts/script_9' type='text/javascript'></script>
250
+ <script src='javascripts/script_9' type='text/javascript' data-controller='reporter'></script>
240
251
 
241
252
  #### `:class` and `:id` Attributes {#class-and-id-attributes}
242
253
 
data/Rakefile CHANGED
@@ -1,115 +1,117 @@
1
- require "rake/clean"
2
- require "rake/testtask"
3
- require "bundler/gem_tasks"
1
+ require 'bundler/setup'
2
+ require 'bundler/gem_tasks'
3
+
4
+ #
5
+ # Prepend DevKit into compilation phase
6
+ #
7
+ if Gem.win_platform?
8
+ desc 'Activates DevKit'
9
+ task :devkit do
10
+ begin
11
+ require 'devkit'
12
+ rescue LoadError
13
+ abort 'Failed to load DevKit required for compilation'
14
+ end
15
+ end
16
+ task compile: :devkit
17
+ end
4
18
 
5
- task :default => :test
19
+ require 'rake/testtask'
20
+ if /java/ === RUBY_PLATFORM
21
+ # require 'rake/javaextensiontask'
22
+ # Rake::JavaExtensionTask.new(:haml) do |ext|
23
+ # ext.ext_dir = 'ext/java'
24
+ # ext.lib_dir = 'lib/haml'
25
+ # end
6
26
 
7
- # FIXME: Redefining :test task to run test/options_test.rb in isolated process since it depends on whether Rails is loaded or not.
8
- # Remove this task when we finished changing escape_html option to be true by default.
9
- isolated_test = Rake::TestTask.new do |t|
10
- t.libs << 'test'
11
- t.test_files = %w[test/options_test.rb]
12
- t.warning = true
13
- t.verbose = true
14
- end
15
- Rake::TestTask.new do |t|
16
- t.libs << 'test'
17
- t.test_files = Dir['test/*_test.rb'] + Dir['test/haml-spec/*_test.rb'] + Dir['test/cases/*_test.rb'] - isolated_test.file_list
18
- t.warning = true
19
- t.verbose = true
27
+ task :compile do
28
+ # dummy for now
29
+ end
30
+ else
31
+ require 'rake/extensiontask'
32
+ Rake::ExtensionTask.new(:haml) do |ext|
33
+ ext.lib_dir = 'lib/haml'
34
+ end
20
35
  end
21
36
 
22
- CLEAN.replace %w(pkg doc coverage .yardoc test/haml vendor)
37
+ Dir['benchmark/*.rake'].each { |b| import(b) }
23
38
 
24
- desc "Benchmark Haml against ERB. TIMES=n sets the number of runs, default is 1000."
25
- task :benchmark do
26
- sh "ruby benchmark.rb #{ENV['TIMES']}"
39
+ namespace :haml do
40
+ Rake::TestTask.new do |t|
41
+ t.libs << 'lib' << 'test'
42
+ files = Dir['test/haml/*_test.rb']
43
+ files << 'test/haml/haml-spec/*_test.rb'
44
+ t.ruby_opts = %w[-rtest_helper]
45
+ t.test_files = files
46
+ t.verbose = true
47
+ end
27
48
  end
28
49
 
29
- task :submodules do
30
- if File.exist?(File.dirname(__FILE__) + "/.git")
31
- sh %{git submodule sync}
32
- sh %{git submodule update --init --recursive}
50
+ namespace :hamlit do
51
+ Rake::TestTask.new do |t|
52
+ t.libs << 'lib' << 'test'
53
+ t.ruby_opts = %w[-rtest_helper]
54
+ t.test_files = Dir['test/hamlit/**/*_test.rb']
55
+ t.verbose = true
33
56
  end
34
57
  end
35
58
 
36
- namespace :doc do
37
- task :sass do
38
- require 'sass'
39
- Dir["yard/default/**/*.sass"].each do |sass|
40
- File.open(sass.gsub(/sass$/, 'css'), 'w') do |f|
41
- f.write(Sass::Engine.new(File.read(sass)).render)
42
- end
43
- end
59
+ namespace :test do
60
+ Rake::TestTask.new(:all) do |t|
61
+ t.libs << 'lib' << 'test'
62
+ files = Dir['test/hamlit/**/*_test.rb']
63
+ files += Dir['test/haml/*_test.rb']
64
+ files << 'test/haml/haml-spec/*_test.rb'
65
+ t.ruby_opts = %w[-rtest_helper]
66
+ t.test_files = files
67
+ t.verbose = true
44
68
  end
45
69
 
46
- desc "List all undocumented methods and classes."
47
- task :undocumented do
48
- command = 'yard --list --query '
49
- command << '"object.docstring.blank? && '
50
- command << '!(object.type == :method && object.is_alias?)"'
51
- sh command
70
+ Rake::TestTask.new(:spec) do |t|
71
+ t.libs << 'lib' << 'test'
72
+ t.ruby_opts = %w[-rtest_helper]
73
+ t.test_files = %w[test/haml/haml-spec/ugly_test.rb test/haml/haml-spec/pretty_test.rb]
74
+ t.verbose = true
52
75
  end
53
- end
54
-
55
- desc "Generate documentation"
56
- task(:doc => 'doc:sass') {sh "yard"}
57
-
58
- desc "Generate documentation incrementally"
59
- task(:redoc) {sh "yard -c"}
60
-
61
- desc <<END
62
- Profile Haml.
63
- TIMES=n sets the number of runs. Defaults to 1000.
64
- FILE=str sets the file to profile. Defaults to 'standard'
65
- OUTPUT=str sets the ruby-prof output format.
66
- Can be Flat, CallInfo, or Graph. Defaults to Flat. Defaults to Flat.
67
- END
68
- task :profile do
69
- times = (ENV['TIMES'] || '1000').to_i
70
- file = ENV['FILE'] || 'test/templates/standard.haml'
71
76
 
72
- require 'bundler/setup'
73
- require 'ruby-prof'
74
- require 'haml'
75
- file = File.read(File.expand_path("../#{file}", __FILE__))
76
- obj = Object.new
77
- Haml::Engine.new(file).def_method(obj, :render)
78
- result = RubyProf.profile { times.times { obj.render } }
79
-
80
- RubyProf.const_get("#{(ENV['OUTPUT'] || 'Flat').capitalize}Printer").new(result).print
81
- end
82
-
83
- def gemfiles
84
- @gemfiles ||= Dir[File.dirname(__FILE__) + '/test/gemfiles/Gemfile.*'].reject {|f| f =~ /\.lock$/}
85
- end
77
+ Rake::TestTask.new(:engine) do |t|
78
+ t.libs << 'lib' << 'test'
79
+ t.ruby_opts = %w[-rtest_helper]
80
+ t.test_files = %w[test/haml/engine_test.rb]
81
+ t.verbose = true
82
+ end
86
83
 
87
- def with_each_gemfile
88
- gemfiles.each do |gemfile|
89
- Bundler.with_clean_env do
90
- puts "Using gemfile: #{gemfile}"
91
- ENV['BUNDLE_GEMFILE'] = gemfile
92
- yield
93
- end
84
+ Rake::TestTask.new(:filters) do |t|
85
+ t.libs << 'lib' << 'test'
86
+ t.ruby_opts = %w[-rtest_helper]
87
+ t.test_files = %w[test/haml/filters_test.rb]
88
+ t.verbose = true
94
89
  end
95
- end
96
90
 
97
- namespace :test do
98
- namespace :bundles do
99
- desc "Install all dependencies necessary to test Haml."
100
- task :install do
101
- with_each_gemfile {sh "bundle"}
102
- end
91
+ Rake::TestTask.new(:helper) do |t|
92
+ t.libs << 'lib' << 'test'
93
+ t.ruby_opts = %w[-rtest_helper]
94
+ t.test_files = %w[test/haml/helper_test.rb]
95
+ t.verbose = true
96
+ end
103
97
 
104
- desc "Update all dependencies for testing Haml."
105
- task :update do
106
- with_each_gemfile {sh "bundle update"}
107
- end
98
+ Rake::TestTask.new(:template) do |t|
99
+ t.libs << 'lib' << 'test'
100
+ t.ruby_opts = %w[-rtest_helper]
101
+ t.test_files = %w[test/haml/template_test.rb]
102
+ t.verbose = true
108
103
  end
104
+ end
109
105
 
110
- desc "Test all supported versions of rails. This takes a while."
111
- task :rails_compatibility => 'test:bundles:install' do
112
- with_each_gemfile {sh "bundle exec rake test"}
106
+ desc 'bench task for CI'
107
+ task bench: :compile do
108
+ if ENV['SLIM_BENCH'] == '1'
109
+ cmd = %w[bundle exec ruby benchmark/slim/run-benchmarks.rb]
110
+ else
111
+ cmd = ['bin/bench', 'bench', ('-c' if ENV['COMPILE'] == '1'), *ENV['TEMPLATE'].split(',')].compact
113
112
  end
114
- task :rc => :rails_compatibility
113
+ exit system(*cmd)
115
114
  end
115
+
116
+ task default: %w[compile hamlit:test]
117
+ task test: %w[compile test:all]
data/bin/bench ADDED
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'haml'
5
+ require 'thor'
6
+ require 'benchmark/ips'
7
+ require_relative '../benchmark/utils/benchmark_ips_extension'
8
+
9
+ class Bench < Thor
10
+ class_option :show_template, type: :boolean, aliases: ['-t']
11
+
12
+ desc 'bench HAML', 'Benchmark haml template'
13
+ option :compile, type: :boolean, aliases: ['-c']
14
+ option :show_code, type: :boolean, aliases: ['-s']
15
+ def bench(*files)
16
+ files.each { |file| render(file) }
17
+ files.each { |file| compile(file) if options[:compile] }
18
+ files.each { |file| code(file) if options[:show_code] }
19
+ end
20
+
21
+ desc 'compile HAML', 'Benchmark compilation'
22
+ def compile(file)
23
+ puts "#{?= * 49}\n Compilation: #{file}\n#{?= * 49}"
24
+ haml = File.read(file)
25
+
26
+ Benchmark.ips do |x|
27
+ x.report("haml v#{Haml::VERSION}") { Haml::Engine.new.call(haml) }
28
+ x.compare!
29
+ end
30
+ end
31
+
32
+ desc 'render HAML', 'Benchmark rendering'
33
+ def render(file)
34
+ puts "#{?= * 49}\n Rendering: #{file}\n#{?= * 49}"
35
+ haml = File.read(file)
36
+ puts haml + "\n" if options[:show_template]
37
+ object = Object.new
38
+ ruby_file = file.gsub(/\.haml\z/, '.rb')
39
+ if File.exist?(ruby_file)
40
+ object.instance_eval(File.read(ruby_file))
41
+ end
42
+
43
+ object.instance_eval "def haml; #{Haml::Engine.new.call(haml)}; end"
44
+
45
+ Benchmark.ips do |x|
46
+ x.report("haml v#{Haml::VERSION}") { object.haml }
47
+ x.compare!
48
+ end
49
+ end
50
+
51
+ desc 'code HAML', 'Show compiled code'
52
+ def code(file)
53
+ haml = File.read(file)
54
+ puts "\n#{?= * 49}\n Haml Source: #{file}\n#{?= * 49}"
55
+ puts Haml::Engine.new.call(haml)
56
+ end
57
+
58
+ private
59
+
60
+ def method_missing(*args)
61
+ return super if args.length > 1
62
+ render(args.first.to_s)
63
+ end
64
+ end
65
+
66
+ Bench.start
data/bin/console ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'hamlit'
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ require 'pry'
11
+ Pry.start
data/bin/ruby ADDED
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ bundle exec ruby -Ilib:test -rtest_helper $@
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/bin/stackprof ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'hamlit'
5
+ require 'stackprof'
6
+
7
+ def open_flamegraph(report)
8
+ temp = `mktemp /tmp/stackflame-XXXXXXXX`.strip
9
+ data_path = "#{temp}.js"
10
+ system("mv #{temp} #{data_path}")
11
+
12
+ File.open(data_path, 'w') do |f|
13
+ report.print_flamegraph(f)
14
+ end
15
+
16
+ viewer_path = File.join(`bundle show stackprof`.strip, 'lib/stackprof/flamegraph/viewer.html')
17
+ url = "file://#{viewer_path}?data=#{data_path}"
18
+ system(%Q[osascript -e 'open location "#{url}"'])
19
+ end
20
+
21
+ haml = File.read(ARGV.first)
22
+ StackProf.start(mode: :wall, interval: 1, raw: false)
23
+ Hamlit::Engine.new.call(haml)
24
+ StackProf.stop
25
+
26
+ report = StackProf::Report.new(StackProf.results)
27
+ report.print_text(false)
data/bin/test ADDED
@@ -0,0 +1,24 @@
1
+ #!/bin/bash
2
+
3
+ VERSIONS=(
4
+ 2.1.10
5
+ 2.2.5
6
+ 2.3.1
7
+ )
8
+
9
+ set -e
10
+ trap 'echo "${VERSIONS[2]}" > .ruby-version' 0
11
+
12
+ function test_with() {
13
+ version=$1
14
+ rbenv local $version
15
+ if ! bundle check > /dev/null; then
16
+ bundle install
17
+ fi
18
+ ruby -v
19
+ bundle exec rake test
20
+ }
21
+
22
+ for version in ${VERSIONS[@]}; do
23
+ test_with $version
24
+ done
data/exe/haml ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.expand_path('../lib', __dir__)
4
+ require 'haml/cli'
5
+
6
+ Haml::CLI.start(ARGV)
@@ -0,0 +1,10 @@
1
+ require 'mkmf'
2
+
3
+ $CFLAGS << ' -Wall -Wextra'
4
+
5
+ $srcs = %w[
6
+ haml.c
7
+ hescape.c
8
+ ]
9
+
10
+ create_makefile('haml/haml')