faml 0.3.2 → 0.3.3

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: 11898f802ec5a7c2db4ee3dddda380478dc5cbff
4
- data.tar.gz: 4151d81c63cc375de89f7eb5f165cb63fa9388a3
3
+ metadata.gz: 9f188aeb028e6438b455033f6f2efe701297ad13
4
+ data.tar.gz: cac035f6c7671aef877c83ff47d7e772941b2d1a
5
5
  SHA512:
6
- metadata.gz: d8917747df51adc7d2df2606657e659760eecab5ea673d1241c9acaa024edb6c88884d1e8560093b1faca4a3c5fec77fe345c5b6c3fbfbf713e98e9f7221c4ed
7
- data.tar.gz: 3b667d9450d939a47690b906c3b25f1be9708914c07435f5485305374729a2a33ff9c366a1a278ed63fc710c846785d77900f42ab3416b081030a9442481d87f
6
+ metadata.gz: 0e9c2a21ca2ad84c4cb9c219bfbf971c11e85bc07fa02910a177a9f081a82a18ea37a9e4b0ecf900f84150eb41f369f65ed14c1b6b5c3ea8dc5791500c9da58e
7
+ data.tar.gz: 2f0873cb28c9d275e2c11ca00d2ff3b0ca3d37d794ab2c76c747eaf82cd8f780a7dc376f615dccbaf736f8a6e32c510516c790002e544fed70d0696bb260d961
data/.rubocop.yml ADDED
@@ -0,0 +1,44 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'haml-spec/**/*'
6
+
7
+ Lint/HandleExceptions:
8
+ Exclude:
9
+ # Ignore LoadError
10
+ - 'lib/faml.rb'
11
+ - 'lib/faml/tilt.rb'
12
+ Lint/Eval:
13
+ Exclude:
14
+ - 'lib/faml/static_hash_parser.rb'
15
+ - 'spec/spec_helper.rb'
16
+
17
+ Style/BarePercentLiterals:
18
+ EnforcedStyle: percent_q
19
+ Style/CaseEquality:
20
+ Enabled: false
21
+ Style/GlobalVars:
22
+ Exclude:
23
+ - '**/extconf.rb'
24
+ Style/GuardClause:
25
+ Enabled: false
26
+ Style/HashSyntax:
27
+ Exclude:
28
+ - 'Rakefile'
29
+ Style/IfUnlessModifier:
30
+ Enabled: false
31
+ Style/PercentLiteralDelimiters:
32
+ Enabled: false
33
+ Style/RaiseArgs:
34
+ EnforcedStyle: compact
35
+ Style/SignalException:
36
+ Enabled: false
37
+ Style/TrailingComma:
38
+ Enabled: false
39
+ Style/TrailingWhitespace:
40
+ Exclude:
41
+ - 'spec/render/multiline_spec.rb'
42
+
43
+ Style/UnneededPercentQ:
44
+ Enabled: false # buggy
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,43 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2015-10-06 23:31:05 +0900 using RuboCop version 0.34.2.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 17
10
+ Metrics/AbcSize:
11
+ Max: 32
12
+
13
+ # Offense count: 1
14
+ Metrics/BlockNesting:
15
+ Max: 4
16
+
17
+ # Offense count: 4
18
+ # Configuration parameters: CountComments.
19
+ Metrics/ClassLength:
20
+ Max: 341
21
+
22
+ # Offense count: 7
23
+ Metrics/CyclomaticComplexity:
24
+ Max: 12
25
+
26
+ # Offense count: 214
27
+ # Configuration parameters: AllowURI, URISchemes.
28
+ Metrics/LineLength:
29
+ Max: 199
30
+
31
+ # Offense count: 20
32
+ # Configuration parameters: CountComments.
33
+ Metrics/MethodLength:
34
+ Max: 29
35
+
36
+ # Offense count: 5
37
+ Metrics/PerceivedComplexity:
38
+ Max: 13
39
+
40
+ # Offense count: 45
41
+ # Configuration parameters: Exclude.
42
+ Style/Documentation:
43
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.3.3 (2015-10-07)
2
+ - Improve `Faml::AttributeBuilder.build` performance
3
+ - Optimize string conversions
4
+ - Fix handling true/false/nil values in data attribute
5
+ - Add `stats` subcommand
6
+ - Currently, it shows AST ratio and element attribute's ratio.
7
+
1
8
  ## 0.3.2 (2015-09-24)
2
9
  - Fix illegal constant name
3
10
  - Use `require_relative` if possible
data/Rakefile CHANGED
@@ -22,7 +22,7 @@ namespace :benchmark do
22
22
  sh 'ruby', 'benchmark/rendering.rb', standard_haml_path
23
23
  end
24
24
 
25
- desc "Run rendering benchmark for attribute builder"
25
+ desc 'Run rendering benchmark for attribute builder'
26
26
  task :attributes do
27
27
  sh 'ruby', 'benchmark/rendering.rb', 'benchmark/attribute_builder.haml', 'benchmark/attribute_builder.slim'
28
28
  end
@@ -7,7 +7,7 @@ require 'slim'
7
7
  require 'escape_utils/html/haml'
8
8
 
9
9
  unless ARGV[0]
10
- $stderr.puts "Usage: #{$0} template.haml [template.slim]"
10
+ $stderr.puts "Usage: #{$PROGRAM_NAME} template.haml [template.slim]"
11
11
  exit 1
12
12
  end
13
13
 
data/benchmark/context.rb CHANGED
@@ -4,8 +4,8 @@ class Context
4
4
  end
5
5
 
6
6
  def item
7
- [ { name: 'red', current: true, url: '#red' },
8
- { name: 'green', current: false, url: '#green' },
9
- { name: 'blue', current: false, url: '#blue' } ]
7
+ [{ name: 'red', current: true, url: '#red' },
8
+ { name: 'green', current: false, url: '#green' },
9
+ { name: 'blue', current: false, url: '#blue' }]
10
10
  end
11
11
  end
@@ -7,7 +7,7 @@ require 'slim'
7
7
  require 'escape_utils/html/haml'
8
8
 
9
9
  unless ARGV[0]
10
- $stderr.puts "Usage: #{$0} template.haml [template.slim]"
10
+ $stderr.puts "Usage: #{$PROGRAM_NAME} template.haml [template.slim]"
11
11
  exit 1
12
12
  end
13
13
 
@@ -18,17 +18,17 @@ Benchmark.ips do |x|
18
18
  obj = Object.new
19
19
 
20
20
  Haml::Engine.new(haml_code, ugly: true, escape_html: true).def_method(obj, :haml)
21
- obj.instance_eval %{
21
+ obj.instance_eval "
22
22
  def faml_array; #{Faml::Engine.new.call(haml_code)}; end
23
23
  def faml_string; #{Faml::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(haml_code)}; end
24
24
  def hamlit_array; #{Hamlit::Engine.new.call(haml_code)}; end
25
25
  def hamlit_string; #{Hamlit::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(haml_code)}; end
26
- }
26
+ "
27
27
  if slim_code
28
- obj.instance_eval %{
28
+ obj.instance_eval "
29
29
  def slim_array; #{Slim::Engine.new.call(slim_code)}; end
30
30
  def slim_string; #{Slim::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(slim_code)}; end
31
- }
31
+ "
32
32
  end
33
33
 
34
34
  x.report('Haml') { obj.haml }
data/benchmark/slim.rb CHANGED
@@ -13,11 +13,11 @@ slim_code = File.read(File.join(__dir__, 'view.slim'))
13
13
 
14
14
  context = Context.new
15
15
  Haml::Engine.new(haml_code, ugly: true, escape_html: true).def_method(context, :haml)
16
- context.instance_eval %{
16
+ context.instance_eval "
17
17
  def faml; #{Faml::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(haml_code)}; end
18
18
  def hamlit; #{Hamlit::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(haml_code)}; end
19
19
  def slim; #{Slim::Engine.new(generator: Temple::Generators::RailsOutputBuffer).call(slim_code)}; end
20
- }
20
+ "
21
21
 
22
22
  Benchmark.ips do |x|
23
23
  x.report('Haml') { context.haml }
@@ -11,7 +11,7 @@
11
11
  #endif
12
12
 
13
13
  VALUE rb_mAttributeBuilder;
14
- static ID id_keys, id_sort_bang, id_uniq_bang, id_merge_bang, id_to_s;
14
+ static ID id_keys, id_sort_bang, id_uniq_bang, id_merge_bang;
15
15
  static ID id_id, id_class, id_underscore, id_hyphen, id_space, id_equal;
16
16
 
17
17
  static void
@@ -34,7 +34,7 @@ concat_array_attribute(VALUE attributes, VALUE hash, VALUE key)
34
34
  static int
35
35
  stringify_keys_i(VALUE key, VALUE value, VALUE arg)
36
36
  {
37
- key = rb_funcall(key, id_to_s, 0);
37
+ key = rb_convert_type(key, T_STRING, "String", "to_s");
38
38
  rb_hash_aset(arg, key, value);
39
39
  return ST_CONTINUE;
40
40
  }
@@ -77,16 +77,15 @@ substitute_underscores(VALUE str)
77
77
  static int
78
78
  normalize_data_i2(VALUE key, VALUE value, VALUE ptr)
79
79
  {
80
- struct normalize_data_i2_arg *arg = (struct normalize_data_i2_arg *)ptr;
81
- VALUE k = rb_funcall(arg->key, id_to_s, 0);
82
-
83
- k = substitute_underscores(k);
84
- if (OBJ_FROZEN(k)) {
85
- k = rb_str_dup(k);
80
+ if (!(RB_TYPE_P(value, T_FALSE) || NIL_P(value))) {
81
+ struct normalize_data_i2_arg *arg = (struct normalize_data_i2_arg *)ptr;
82
+ VALUE k = rb_str_dup(arg->key);
83
+
84
+ k = rb_str_dup(arg->key);
85
+ rb_str_cat(k, "-", 1);
86
+ rb_str_append(k, key);
87
+ rb_hash_aset(arg->normalized, k, value);
86
88
  }
87
- rb_str_cat(k, "-", 1);
88
- rb_str_append(k, key);
89
- rb_hash_aset(arg->normalized, k, value);
90
89
  return ST_CONTINUE;
91
90
  }
92
91
 
@@ -95,15 +94,21 @@ static VALUE normalize_data(VALUE data);
95
94
  static int
96
95
  normalize_data_i(VALUE key, VALUE value, VALUE normalized)
97
96
  {
97
+ key = rb_convert_type(key, T_STRING, "String", "to_s");
98
+ key = substitute_underscores(key);
99
+
98
100
  if (RB_TYPE_P(value, T_HASH)) {
99
101
  struct normalize_data_i2_arg arg;
100
102
  arg.key = key;
101
103
  arg.normalized = normalized;
102
104
  rb_hash_foreach(normalize_data(value), normalize_data_i2, (VALUE)(&arg));
103
- } else {
104
- key = rb_funcall(key, id_to_s, 0);
105
- key = substitute_underscores(key);
105
+ } else if (RB_TYPE_P(value, T_TRUE)) {
106
+ /* Keep Qtrue value */
106
107
  rb_hash_aset(normalized, key, value);
108
+ } else if (RB_TYPE_P(value, T_FALSE) || NIL_P(value)) {
109
+ /* Delete falsey values */
110
+ } else {
111
+ rb_hash_aset(normalized, key, rb_convert_type(value, T_STRING, "String", "to_s"));
107
112
  }
108
113
  return ST_CONTINUE;
109
114
  }
@@ -138,19 +143,21 @@ normalize(VALUE hash)
138
143
  for (i = 0; i < len; i++) {
139
144
  VALUE key = RARRAY_AREF(keys, i);
140
145
  VALUE value = rb_hash_lookup(hash, key);
141
- VALUE key_str = key;
142
146
 
143
- if (!RB_TYPE_P(key, T_STRING)) {
144
- key_str = rb_funcall(key, id_to_s, 0);
145
- }
146
- if (RB_TYPE_P(value, T_HASH) && RSTRING_LEN(key_str) == 4 && memcmp(RSTRING_PTR(key_str), "data", 4) == 0) {
147
+ /* key must be String because it is already stringified by stringify_keys */
148
+ Check_Type(key, T_STRING);
149
+ if (RB_TYPE_P(value, T_HASH) && RSTRING_LEN(key) == 4 && memcmp(RSTRING_PTR(key), "data", 4) == 0) {
147
150
  VALUE data;
148
151
 
149
152
  rb_hash_delete(hash, key);
150
153
  data = normalize_data(value);
151
154
  rb_hash_foreach(data, put_data_attribute, hash);
152
- } else if (!(RB_TYPE_P(value, T_TRUE) || RB_TYPE_P(value, T_FALSE) || NIL_P(value))) {
153
- rb_hash_aset(hash, key_str, rb_funcall(value, id_to_s, 0));
155
+ } else if (RB_TYPE_P(value, T_TRUE)) {
156
+ /* Keep Qtrue value */
157
+ } else if (RB_TYPE_P(value, T_FALSE) || NIL_P(value)) {
158
+ rb_hash_delete(hash, key);
159
+ } else {
160
+ rb_hash_aset(hash, key, rb_convert_type(value, T_STRING, "String", "to_s"));
154
161
  }
155
162
  }
156
163
  }
@@ -177,7 +184,6 @@ put_attribute(VALUE buf, VALUE attr_quote, VALUE key, VALUE value)
177
184
  {
178
185
  gh_buf ob = GH_BUF_INIT;
179
186
 
180
- value = rb_funcall(value, id_to_s, 0);
181
187
  Check_Type(value, T_STRING);
182
188
  if (houdini_escape_html(&ob, (const uint8_t *)RSTRING_PTR(value), RSTRING_LEN(value))) {
183
189
  value = rb_enc_str_new(ob.ptr, ob.size, rb_utf8_encoding());
@@ -195,9 +201,6 @@ put_attribute(VALUE buf, VALUE attr_quote, VALUE key, VALUE value)
195
201
  static void
196
202
  build_attribute(VALUE buf, VALUE attr_quote, int is_html, VALUE key, VALUE value)
197
203
  {
198
- if (!RB_TYPE_P(key, T_STRING)) {
199
- key = rb_funcall(key, id_to_s, 0);
200
- }
201
204
  Check_Type(key, T_STRING);
202
205
  if (RSTRING_LEN(key) == 5 && memcmp(RSTRING_PTR(key), "class", 5) == 0) {
203
206
  long len;
@@ -209,7 +212,7 @@ build_attribute(VALUE buf, VALUE attr_quote, int is_html, VALUE key, VALUE value
209
212
  VALUE ary = rb_ary_new_capa(len);
210
213
  for (i = 0; i < len; i++) {
211
214
  VALUE v = RARRAY_AREF(value, i);
212
- rb_ary_push(ary, rb_funcall(v, id_to_s, 0));
215
+ rb_ary_push(ary, rb_convert_type(v, T_STRING, "String", "to_s"));
213
216
  }
214
217
  rb_funcall(ary, id_sort_bang, 0);
215
218
  rb_funcall(ary, id_uniq_bang, 0);
@@ -225,7 +228,7 @@ build_attribute(VALUE buf, VALUE attr_quote, int is_html, VALUE key, VALUE value
225
228
  VALUE ary = rb_ary_new_capa(len);
226
229
  for (i = 0; i < len; i++) {
227
230
  VALUE v = RARRAY_AREF(value, i);
228
- rb_ary_push(ary, rb_funcall(v, id_to_s, 0));
231
+ rb_ary_push(ary, rb_convert_type(v, T_STRING, "String", "to_s"));
229
232
  }
230
233
  put_attribute(buf, attr_quote, key, rb_ary_join(ary, rb_const_get(rb_mAttributeBuilder, id_underscore)));
231
234
  }
@@ -236,8 +239,6 @@ build_attribute(VALUE buf, VALUE attr_quote, int is_html, VALUE key, VALUE value
236
239
  } else {
237
240
  put_attribute(buf, attr_quote, key, key);
238
241
  }
239
- } else if (RB_TYPE_P(value, T_FALSE) || NIL_P(value)) {
240
- /* do nothing */
241
242
  } else {
242
243
  put_attribute(buf, attr_quote, key, value);
243
244
  }
@@ -288,7 +289,6 @@ Init_attribute_builder(void)
288
289
  id_sort_bang = rb_intern("sort!");
289
290
  id_uniq_bang = rb_intern("uniq!");
290
291
  id_merge_bang = rb_intern("merge!");
291
- id_to_s = rb_intern("to_s");
292
292
 
293
293
  id_id = rb_intern("ID");
294
294
  id_class = rb_intern("CLASS");
data/faml.gemspec CHANGED
@@ -4,39 +4,40 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'faml/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
- spec.name = "faml"
7
+ spec.name = 'faml'
8
8
  spec.version = Faml::VERSION
9
- spec.authors = ["Kohei Suzuki"]
10
- spec.email = ["eagletmt@gmail.com"]
11
- spec.summary = %q{Faster implementation of Haml template language.}
12
- spec.description = %q{Faster implementation of Haml template language.}
13
- spec.homepage = "https://github.com/eagletmt/faml"
14
- spec.license = "MIT"
9
+ spec.authors = ['Kohei Suzuki']
10
+ spec.email = ['eagletmt@gmail.com']
11
+ spec.summary = 'Faster implementation of Haml template language.'
12
+ spec.description = 'Faster implementation of Haml template language.'
13
+ spec.homepage = 'https://github.com/eagletmt/faml'
14
+ spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files -z`.split("\x0") + `git -C vendor/houdini ls-files -z`.split("\x0").map { |path| "vendor/houdini/#{path}" }
17
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
18
  spec.extensions = ['ext/attribute_builder/extconf.rb']
19
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features|incompatibilities)/})
20
- spec.require_paths = ["lib"]
21
- spec.required_ruby_version = ">= 2.0.0"
20
+ spec.require_paths = ['lib']
21
+ spec.required_ruby_version = '>= 2.0.0'
22
22
 
23
- spec.add_dependency "escape_utils"
24
- spec.add_dependency "haml_parser", ">= 0.1.0"
25
- spec.add_dependency "parser"
26
- spec.add_dependency "temple", ">= 0.7.0"
27
- spec.add_dependency "tilt"
28
- spec.add_development_dependency "appraisal"
29
- spec.add_development_dependency "benchmark-ips"
30
- spec.add_development_dependency "bundler"
31
- spec.add_development_dependency "coffee-script"
32
- spec.add_development_dependency "coveralls"
33
- spec.add_development_dependency "haml" # for benchmark
34
- spec.add_development_dependency "hamlit", ">= 0.6.0" # for benchmark
35
- spec.add_development_dependency "rake"
36
- spec.add_development_dependency "rake-compiler"
37
- spec.add_development_dependency "redcarpet"
38
- spec.add_development_dependency "rspec", ">= 3"
39
- spec.add_development_dependency "sass"
40
- spec.add_development_dependency "simplecov"
41
- spec.add_development_dependency "slim" # for benchmark
23
+ spec.add_dependency 'escape_utils'
24
+ spec.add_dependency 'haml_parser', '>= 0.1.0'
25
+ spec.add_dependency 'parser'
26
+ spec.add_dependency 'temple', '>= 0.7.0'
27
+ spec.add_dependency 'tilt'
28
+ spec.add_development_dependency 'appraisal'
29
+ spec.add_development_dependency 'benchmark-ips'
30
+ spec.add_development_dependency 'bundler'
31
+ spec.add_development_dependency 'coffee-script'
32
+ spec.add_development_dependency 'coveralls'
33
+ spec.add_development_dependency 'haml' # for benchmark
34
+ spec.add_development_dependency 'hamlit', '>= 0.6.0' # for benchmark
35
+ spec.add_development_dependency 'rake'
36
+ spec.add_development_dependency 'rake-compiler'
37
+ spec.add_development_dependency 'redcarpet'
38
+ spec.add_development_dependency 'rspec', '>= 3'
39
+ spec.add_development_dependency 'rubocop'
40
+ spec.add_development_dependency 'sass'
41
+ spec.add_development_dependency 'simplecov'
42
+ spec.add_development_dependency 'slim' # for benchmark
42
43
  end
data/haml_spec_test.rb CHANGED
@@ -7,10 +7,10 @@ class HamlTest < Minitest::Test
7
7
  contexts.each do |context|
8
8
  context[1].each do |name, test|
9
9
  define_method("test_spec: #{name} (#{context[0]})") do
10
- html = test["html"]
11
- haml = test["haml"]
12
- locals = Hash[(test["locals"] || {}).map {|x, y| [x.to_sym, y]}]
13
- options = Hash[(test["config"] || {}).map {|x, y| [x.to_sym, y]}]
10
+ html = test['html']
11
+ haml = test['haml']
12
+ locals = Hash[(test['locals'] || {}).map { |x, y| [x.to_sym, y] }]
13
+ options = Hash[(test['config'] || {}).map { |x, y| [x.to_sym, y] }]
14
14
  options[:format] = options[:format].to_sym if options.key?(:format)
15
15
  tilt = Tilt.new("#{name}.haml", nil, options) { haml }
16
16
  result = tilt.render(Object.new, locals)
data/lib/faml/cli.rb CHANGED
@@ -25,6 +25,12 @@ module Faml
25
25
  pp Faml::Compiler.new(filename: file, format: options[:format].to_sym).call(parse_file(file))
26
26
  end
27
27
 
28
+ desc 'stats FILE/DIR ...', 'Show statistics'
29
+ def stats(*paths)
30
+ require_relative 'stats'
31
+ Stats.new(*paths).report
32
+ end
33
+
28
34
  desc 'version', 'Print version'
29
35
  option :numeric, type: :boolean, default: false, desc: 'Print version number only'
30
36
  def version
data/lib/faml/compiler.rb CHANGED
@@ -45,10 +45,10 @@ module Faml
45
45
 
46
46
  def self.find_and_preserve(input)
47
47
  # Taken from the original haml code
48
- re = /<(#{options[:preserve].map(&Regexp.method(:escape)).join('|')})([^>]*)>(.*?)(<\/\1>)/im
48
+ re = %r{<(#{options[:preserve].map(&Regexp.method(:escape)).join('|')})([^>]*)>(.*?)(<\/\1>)}im
49
49
  input.to_s.gsub(re) do |s|
50
- s =~ re # Can't rely on $1, etc. existing since Rails' SafeBuffer#gsub is incompatible
51
- "<#{$1}#{$2}>#{Helpers.preserve($3)}</#{$1}>"
50
+ m = s.match(re) # Can't rely on $1, etc. existing since Rails' SafeBuffer#gsub is incompatible
51
+ "<#{m[1]}#{m[2]}>#{Helpers.preserve(m[3])}</#{m[1]}>"
52
52
  end
53
53
  end
54
54
 
@@ -166,7 +166,7 @@ module Faml
166
166
  end
167
167
  compile_children(ast, temple)
168
168
  unless ast.conditional.empty?
169
- temple << [:static, "<![endif]"]
169
+ temple << [:static, '<![endif]']
170
170
  end
171
171
  [:multi, [:html, :comment, temple]]
172
172
  end
@@ -228,7 +228,8 @@ module Faml
228
228
  return compile_static_id_and_class(static_id, static_class)
229
229
  end
230
230
 
231
- if attrs = try_optimize_attributes(text, static_id, static_class)
231
+ attrs = try_optimize_attributes(text, static_id, static_class)
232
+ if attrs
232
233
  line_count = text.count("\n")
233
234
  return [:multi, [:html, :attrs, *attrs]].concat([[:newline]] * line_count)
234
235
  end
@@ -275,7 +276,7 @@ module Faml
275
276
  return nil
276
277
  end
277
278
 
278
- if dynamic_attributes.has_key?('data')
279
+ if dynamic_attributes.key?('data')
279
280
  # XXX: Quit optimization...
280
281
  return nil
281
282
  end
@@ -287,7 +288,7 @@ module Faml
287
288
  end
288
289
 
289
290
  (static_attributes.keys + dynamic_attributes.keys).sort.flat_map do |k|
290
- if static_attributes.has_key?(k)
291
+ if static_attributes.key?(k)
291
292
  compile_static_attribute(k, static_attributes[k])
292
293
  else
293
294
  compile_dynamic_attribute(k, dynamic_attributes[k])
@@ -331,7 +332,7 @@ module Faml
331
332
  dynamic_attributes = {}
332
333
  parser.dynamic_attributes.each do |k, v|
333
334
  k = k.to_s
334
- if static_attributes.has_key?(k)
335
+ if static_attributes.key?(k)
335
336
  if StaticHashParser::SPECIAL_ATTRIBUTES.include?(k)
336
337
  # XXX: Quit optimization
337
338
  return nil
@@ -343,18 +344,24 @@ module Faml
343
344
  end
344
345
 
345
346
  def compile_static_attribute(key, value)
346
- case
347
- when value == true
348
- [[:haml, :attr, key, [:multi]]]
349
- when value == false || value == nil
350
- [[:multi]]
351
- when value.is_a?(Hash) && key == 'data'
347
+ if value.is_a?(Hash) && key == 'data'
352
348
  data = AttributeBuilder.normalize_data(value)
353
349
  data.keys.sort.map do |k|
354
- [:haml, :attr, "data-#{k}", [:static, Temple::Utils.escape_html(data[k])]]
350
+ compile_static_simple_attribute("data-#{k}", data[k])
355
351
  end
356
352
  else
357
- [[:haml, :attr, key, [:static, Temple::Utils.escape_html(value)]]]
353
+ [compile_static_simple_attribute(key, value)]
354
+ end
355
+ end
356
+
357
+ def compile_static_simple_attribute(key, value)
358
+ case
359
+ when value == true
360
+ [:haml, :attr, key, [:multi]]
361
+ when value == false || value.nil?
362
+ [:multi]
363
+ else
364
+ [:haml, :attr, key, [:static, Temple::Utils.escape_html(value)]]
358
365
  end
359
366
  end
360
367
 
data/lib/faml/engine.rb CHANGED
@@ -20,7 +20,7 @@ module Faml
20
20
  use Newline
21
21
  filter :StaticMerger
22
22
  use :Generator do
23
- options[:generator].new(options.to_hash.reject {|k,v| !options[:generator].options.valid_key?(k) })
23
+ options[:generator].new(options.to_hash.reject { |k, _| !options[:generator].options.valid_key?(k) })
24
24
  end
25
25
  end
26
26
  end
@@ -19,7 +19,7 @@ module Faml
19
19
 
20
20
  def self.find(name)
21
21
  name = name.to_s
22
- if compilers.has_key?(name.to_s)
22
+ if compilers.key?(name.to_s)
23
23
  compilers[name].new
24
24
  else
25
25
  raise NotFound.new(name)
@@ -12,8 +12,8 @@ module Faml
12
12
  escape_code = Temple::Filters::Escapable.new(use_html_safe: false).instance_variable_get(:@escape_code)
13
13
  sym = unique_name
14
14
  [:multi,
15
- [:capture, sym, temple],
16
- [:dynamic, escape_code % sym],
15
+ [:capture, sym, temple],
16
+ [:dynamic, escape_code % sym],
17
17
  ]
18
18
  end
19
19
  end
@@ -11,8 +11,8 @@ module Faml
11
11
  compile_texts(temple, ast.lineno, ast.texts, keep_last_empty_lines: true)
12
12
  sym = unique_name
13
13
  [:multi,
14
- [:capture, sym, temple],
15
- [:dynamic, "::Faml::FilterCompilers::Preserve.preserve(#{sym})"],
14
+ [:capture, sym, temple],
15
+ [:dynamic, "::Faml::FilterCompilers::Preserve.preserve(#{sym})"],
16
16
  ]
17
17
  end
18
18
 
data/lib/faml/html.rb CHANGED
@@ -3,8 +3,8 @@ require 'faml/attribute_builder'
3
3
  module Faml
4
4
  class Html < Temple::HTML::Fast
5
5
  # Override temple's default
6
- self.options[:format] = :html
7
- self.options[:attr_quote] = "'"
6
+ options[:format] = :html
7
+ options[:attr_quote] = "'"
8
8
 
9
9
  def on_haml_tag(name, self_closing, attrs, content = nil)
10
10
  name = name.to_s
@@ -12,7 +12,7 @@ module Faml
12
12
  result = [:multi, [:static, "<#{name}"], compile(attrs)]
13
13
  result << [:static, (closed && @format != :html ? ' /' : '') + '>']
14
14
  result << compile(content) if content
15
- result << [:static, "</#{name}>"] if !closed
15
+ result << [:static, "</#{name}>"] unless closed
16
16
  result
17
17
  end
18
18
 
@@ -26,22 +26,22 @@ module Faml
26
26
  elsif value[0] == :dvalue
27
27
  sym = unique_name
28
28
  [:multi,
29
- [:code, "#{sym} = (#{value[1]})"],
30
- [:case, sym,
31
- ['true', true_attribute(name)],
32
- ['false, nil', [:multi]],
33
- [:else, [:multi,
34
- [:static, " #{name}=#{options[:attr_quote]}"],
35
- [:escape, true, [:dynamic, sym]],
36
- [:static, options[:attr_quote]],
37
- ]],
38
- ],
29
+ [:code, "#{sym} = (#{value[1]})"],
30
+ [:case, sym,
31
+ ['true', true_attribute(name)],
32
+ ['false, nil', [:multi]],
33
+ [:else, [:multi,
34
+ [:static, " #{name}=#{options[:attr_quote]}"],
35
+ [:escape, true, [:dynamic, sym]],
36
+ [:static, options[:attr_quote]],
37
+ ]],
38
+ ],
39
39
  ]
40
40
  else
41
41
  [:multi,
42
- [:static, " #{name}=#{options[:attr_quote]}"],
43
- compile(value),
44
- [:static, options[:attr_quote]]]
42
+ [:static, " #{name}=#{options[:attr_quote]}"],
43
+ compile(value),
44
+ [:static, options[:attr_quote]]]
45
45
  end
46
46
  end
47
47
 
data/lib/faml/newline.rb CHANGED
@@ -3,7 +3,7 @@ require 'temple'
3
3
  module Faml
4
4
  class Newline < Temple::Filter
5
5
  def on_multi(*exprs)
6
- i = exprs.size-1
6
+ i = exprs.size - 1
7
7
  marker = false
8
8
  while i >= 0
9
9
  case exprs[i]
data/lib/faml/railtie.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Faml
2
2
  class Railtie < ::Rails::Railtie
3
- initializer :faml do |app|
3
+ initializer :faml do
4
4
  require_relative 'rails_handler'
5
5
  ActionView::Template.register_template_handler(:haml, Faml::RailsHandler.new)
6
6
  ActionView::Template.register_template_handler(:faml, Faml::RailsHandler.new)
@@ -50,8 +50,8 @@ module Faml
50
50
  end
51
51
  key = node.children[0]
52
52
  val = node.children[1]
53
-
54
- if key_static = try_static_key(key)
53
+ key_static = try_static_key(key)
54
+ if key_static
55
55
  try_static_value(key_static, val)
56
56
  else
57
57
  throw FAILURE_TAG
data/lib/faml/stats.rb ADDED
@@ -0,0 +1,148 @@
1
+ require 'find'
2
+ require 'pathname'
3
+ require 'haml_parser/parser'
4
+ require_relative 'static_hash_parser'
5
+
6
+ module Faml
7
+ class Stats
8
+ Info = Struct.new(
9
+ :empty_attribute_count,
10
+ :static_attribute_count,
11
+ :dynamic_attribute_count,
12
+ :dynamic_attribute_with_data_count,
13
+ :dynamic_attribute_with_newline_count,
14
+ :ruby_attribute_count,
15
+ :ast_types
16
+ ) do
17
+ def initialize(*)
18
+ super
19
+ self.ast_types ||= Hash.new { |h, k| h[k] = 0 }
20
+ members.each do |k|
21
+ self[k] ||= 0
22
+ end
23
+ end
24
+ end
25
+
26
+ def initialize(*paths)
27
+ @files = find_files(paths)
28
+ end
29
+
30
+ def report
31
+ info = Info.new
32
+ @files.each do |file|
33
+ collect_info(info, file)
34
+ end
35
+
36
+ report_attribute_stats(info)
37
+ report_ast_stats(info)
38
+ end
39
+
40
+ private
41
+
42
+ def find_files(paths)
43
+ paths.flat_map do |path|
44
+ if File.directory?(path)
45
+ find_haml_files(path)
46
+ else
47
+ [path.to_s]
48
+ end
49
+ end
50
+ end
51
+
52
+ def find_haml_files(dir)
53
+ files = []
54
+ Find.find(dir) do |file|
55
+ if File.extname(file) == '.haml'
56
+ files << file
57
+ end
58
+ end
59
+ files
60
+ end
61
+
62
+ def collect_info(info, file)
63
+ ast = HamlParser::Parser.new(filename: file).call(File.read(file))
64
+ walk_ast(info, ast)
65
+ end
66
+
67
+ def walk_ast(info, ast)
68
+ info.ast_types[ast.class.to_s.sub(/\A.*::(.+)\z/, '\1')] += 1
69
+ case ast
70
+ when HamlParser::Ast::Root
71
+ ast.children.each { |c| walk_ast(info, c) }
72
+ when HamlParser::Ast::Doctype
73
+ :noop
74
+ when HamlParser::Ast::Element
75
+ collect_attribute_info(info, ast)
76
+ if ast.oneline_child
77
+ walk_ast(info, ast.oneline_child)
78
+ end
79
+ ast.children.each { |c| walk_ast(info, c) }
80
+ when HamlParser::Ast::Script
81
+ ast.children.each { |c| walk_ast(info, c) }
82
+ when HamlParser::Ast::SilentScript
83
+ ast.children.each { |c| walk_ast(info, c) }
84
+ when HamlParser::Ast::HtmlComment
85
+ ast.children.each { |c| walk_ast(info, c) }
86
+ when HamlParser::Ast::HamlComment
87
+ ast.children.each { |c| walk_ast(info, c) }
88
+ when HamlParser::Ast::Text
89
+ :noop
90
+ when HamlParser::Ast::Filter
91
+ :noop
92
+ when HamlParser::Ast::Empty
93
+ :noop
94
+ else
95
+ raise "InternalError: Unknown ast #{ast.class}: #{ast.inspect}"
96
+ end
97
+ end
98
+
99
+ def collect_attribute_info(info, ast)
100
+ if ast.attributes.empty?
101
+ if ast.static_class.empty? && ast.static_id.empty?
102
+ info.empty_attribute_count += 1
103
+ else
104
+ info.static_attribute_count += 1
105
+ end
106
+ else
107
+ static_hash_parser = StaticHashParser.new
108
+ if static_hash_parser.parse("{#{ast.attributes}}")
109
+ if static_hash_parser.dynamic_attributes.empty?
110
+ info.static_attribute_count += 1
111
+ else
112
+ if static_hash_parser.dynamic_attributes.key?('data')
113
+ info.dynamic_attribute_with_data_count += 1
114
+ elsif ast.attributes.include?("\n")
115
+ info.dynamic_attribute_with_newline_count += 1
116
+ else
117
+ info.dynamic_attribute_count += 1
118
+ end
119
+ end
120
+ else
121
+ info.ruby_attribute_count += 1
122
+ end
123
+ end
124
+ end
125
+
126
+ def report_attribute_stats(info)
127
+ static = info.static_attribute_count
128
+ dynamic = info.dynamic_attribute_count + info.dynamic_attribute_with_data_count + info.dynamic_attribute_with_newline_count
129
+ ruby = info.ruby_attribute_count
130
+ total = static + dynamic + ruby
131
+ puts 'Attribute stats'
132
+ printf(" Static attributes: %d (%.2f%%)\n", static, static * 100.0 / total)
133
+ printf(" Dynamic attributes: %d (%.2f%%)\n", dynamic, dynamic * 100.0 / total)
134
+ printf(" with data: %d\n", info.dynamic_attribute_with_data_count)
135
+ printf(" with newline: %d\n", info.dynamic_attribute_with_newline_count)
136
+ printf(" Ruby attributes: %d (%.2f%%)\n", ruby, ruby * 100.0 / total)
137
+ end
138
+
139
+ def report_ast_stats(info)
140
+ total = info.ast_types.values.inject(0, :+)
141
+ puts 'AST stats'
142
+ info.ast_types.keys.sort.each do |type|
143
+ v = info.ast_types[type]
144
+ printf(" %s: %d (%.2f%%)\n", type, v, v * 100.0 / total)
145
+ end
146
+ end
147
+ end
148
+ end
@@ -33,9 +33,9 @@ module Faml
33
33
  pos = s.pos
34
34
  while s.scan_until(INTERPOLATION_BEGIN)
35
35
  escapes = s[1].size
36
- pre = s.string.byteslice(pos ... (s.pos - s.matched.size))
37
- temple << [:static, pre] << [:static, "\\" * (escapes/2)]
38
- if escapes % 2 == 0
36
+ pre = s.string.byteslice(pos...(s.pos - s.matched.size))
37
+ temple << [:static, pre] << [:static, '\\' * (escapes / 2)]
38
+ if escapes.even?
39
39
  # perform interpolation
40
40
  if s[2] == '#{'
41
41
  temple << [:escape, escape_html, [:dynamic, find_close_brace(s, lineno)]]
@@ -63,7 +63,7 @@ module Faml
63
63
  if depth != 0
64
64
  raise InvalidInterpolation.new(scanner.string, lineno)
65
65
  else
66
- scanner.string.byteslice(pos ... (scanner.pos-1))
66
+ scanner.string.byteslice(pos...(scanner.pos - 1))
67
67
  end
68
68
  end
69
69
  end
data/lib/faml/tilt.rb CHANGED
@@ -18,7 +18,7 @@ module Faml
18
18
  @code = Engine.new(options.merge(filename: filename)).call(data)
19
19
  end
20
20
 
21
- def precompiled_template(locals = {})
21
+ def precompiled_template(_locals = {})
22
22
  @code
23
23
  end
24
24
  end
data/lib/faml/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Faml
2
- VERSION = "0.3.2"
2
+ VERSION = '0.3.3'
3
3
  end
data/spec/rails/bin/setup CHANGED
@@ -2,15 +2,15 @@
2
2
  require 'pathname'
3
3
 
4
4
  # path to your application root.
5
- APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
5
+ APP_ROOT = Pathname.new File.expand_path('../../', __FILE__)
6
6
 
7
7
  Dir.chdir APP_ROOT do
8
8
  # This script is a starting point to setup your application.
9
9
  # Add necessary setup steps to this file:
10
10
 
11
- puts "== Installing dependencies =="
12
- system "gem install bundler --conservative"
13
- system "bundle check || bundle install"
11
+ puts '== Installing dependencies =='
12
+ system 'gem install bundler --conservative'
13
+ system 'bundle check || bundle install'
14
14
 
15
15
  # puts "\n== Copying sample files =="
16
16
  # unless File.exist?("config/database.yml")
@@ -18,12 +18,12 @@ Dir.chdir APP_ROOT do
18
18
  # end
19
19
 
20
20
  puts "\n== Preparing database =="
21
- system "bin/rake db:setup"
21
+ system 'bin/rake db:setup'
22
22
 
23
23
  puts "\n== Removing old logs and tempfiles =="
24
- system "rm -f log/*"
25
- system "rm -rf tmp/cache"
24
+ system 'rm -f log/*'
25
+ system 'rm -rf tmp/cache'
26
26
 
27
27
  puts "\n== Restarting application server =="
28
- system "touch tmp/restart.txt"
28
+ system 'touch tmp/restart.txt'
29
29
  end
@@ -42,7 +42,7 @@ RSpec.describe 'Faml with Rails', type: :request do
42
42
  it 'works with :escaped filter' do
43
43
  get '/books/escaped'
44
44
  expect(response).to be_ok
45
- expect(response.body).to include("&lt;marquee&gt;escape me&lt;/marquee&gt;")
45
+ expect(response.body).to include('&lt;marquee&gt;escape me&lt;/marquee&gt;')
46
46
  end
47
47
 
48
48
  describe 'preserve helper' do
data/spec/rails_helper.rb CHANGED
@@ -1,4 +1,4 @@
1
- ENV["RAILS_ENV"] ||= 'test'
1
+ ENV['RAILS_ENV'] ||= 'test'
2
2
  require 'spec_helper'
3
- require File.expand_path("../rails/config/environment", __FILE__)
3
+ require File.expand_path('../rails/config/environment', __FILE__)
4
4
  require 'rspec/rails'
@@ -17,9 +17,9 @@ RSpec.describe 'Attributes rendering', type: :render do
17
17
 
18
18
  if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.2.0')
19
19
  it 'renders attributes with 2.2-style symbol literals' do
20
- expect(render_string(%Q|%span{"foo": 'bar'}|)).to eq("<span foo='bar'></span>\n")
20
+ expect(render_string(%q|%span{"foo": 'bar'}|)).to eq("<span foo='bar'></span>\n")
21
21
  expect(render_string(%Q|- x = 'bar'\n%span{"foo": x}|)).to eq("<span foo='bar'></span>\n")
22
- expect(render_string(%Q|%span{'foo': 'bar'}|)).to eq("<span foo='bar'></span>\n")
22
+ expect(render_string(%q|%span{'foo': 'bar'}|)).to eq("<span foo='bar'></span>\n")
23
23
  expect(render_string(%Q|- x = 'bar'\n%span{'foo': x}|)).to eq("<span foo='bar'></span>\n")
24
24
  end
25
25
  end
@@ -33,7 +33,7 @@ RSpec.describe 'Attributes rendering', type: :render do
33
33
  expect(render_string('%span.c2{class: ["c1", "c3"]}')).to eq("<span class='c1 c2 c3'></span>\n")
34
34
  end
35
35
 
36
- it "renders boolean attributes" do
36
+ it 'renders boolean attributes' do
37
37
  expect(render_string('%input{checked: true}')).to eq("<input checked>\n")
38
38
  expect(render_string('%input{checked: false}')).to eq("<input>\n")
39
39
  expect(render_string('%input{checked: nil}')).to eq("<input>\n")
@@ -153,6 +153,16 @@ HAML
153
153
  %span{data: data} hello
154
154
  HAML
155
155
  end
156
+
157
+ it 'skips falsey data attributes' do
158
+ expect(render_string('%span{data: { foo: nil }}')).to eq("<span></span>\n")
159
+ expect(render_string("- v = nil\n%span{data: { foo: v }}")).to eq("<span></span>\n")
160
+ end
161
+
162
+ it 'renders true data attributes' do
163
+ expect(render_string('%span{data: { foo: true }}')).to eq("<span data-foo></span>\n")
164
+ expect(render_string("- v = true\n%span{data: { foo: v }}")).to eq("<span data-foo></span>\n")
165
+ end
156
166
  end
157
167
 
158
168
  it 'renders __LINE__ correctly' do
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe 'Escaped filter rendering', type: :render do
4
- it' renders escaped filter' do
4
+ it ' renders escaped filter' do
5
5
  expect(render_string(<<'HAML')).to eq("<span>start</span>\nhello\n &lt;p&gt;world&lt;/p&gt;\n&lt;span&gt;hello&lt;/span&gt;\n\n<span>end</span>\n")
6
6
  %span start
7
7
  :escaped
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  RSpec.describe 'Plain filter rendering', type: :render do
4
4
  it 'renders plain filter' do
5
- expect(render_string(<<HAML)).to eq("<span>\nhello\n<span>world</span>\n</span>\n")
5
+ expect(render_string(<<'HAML')).to eq("<span>\nhello\n<span>world</span>\n</span>\n")
6
6
  %span
7
7
  :plain
8
8
  he#{'llo'}
@@ -11,7 +11,7 @@ HAML
11
11
  end
12
12
 
13
13
  it 'strips last empty lines' do
14
- expect(render_string(<<HAML)).to eq("<span>\nhello\n\nabc\n<span>world</span>\n</span>\n")
14
+ expect(render_string(<<'HAML')).to eq("<span>\nhello\n\nabc\n<span>world</span>\n</span>\n")
15
15
  %span
16
16
  :plain
17
17
  he#{'llo'}
@@ -14,7 +14,7 @@ HAML
14
14
  expect(html).to include('content: "hello"')
15
15
  end
16
16
 
17
- it 'parses string interpolation' do
17
+ it 'parses string interpolation' do
18
18
  html = render_string(<<'HAML')
19
19
  :sass
20
20
  nav
@@ -16,7 +16,7 @@ HAML
16
16
  expect(html).to include('content: "hello"')
17
17
  end
18
18
 
19
- it 'parses string interpolation' do
19
+ it 'parses string interpolation' do
20
20
  html = render_string(<<'HAML')
21
21
  :scss
22
22
  nav {
@@ -86,7 +86,7 @@ HAML
86
86
  end
87
87
 
88
88
  it 'allows double rmnl' do
89
- expect(render_string(<<HAML)).to eq("<div><span>hello</span></div>")
89
+ expect(render_string(<<HAML)).to eq('<div><span>hello</span></div>')
90
90
  %div><
91
91
  %span><= 'hello'
92
92
  HAML
@@ -6,7 +6,7 @@ require 'hamlit/version'
6
6
  class IncompatibilitiesGenerator
7
7
  include Singleton
8
8
 
9
- class Record < Struct.new(:template, :options, :spec_path, :line_number, :faml_result, :haml_result, :hamlit_result)
9
+ Record = Struct.new(:template, :options, :spec_path, :line_number, :faml_result, :haml_result, :hamlit_result) do
10
10
  def incompatible?
11
11
  !all_error? && (faml_result != haml_result || faml_result != hamlit_result || haml_result != hamlit_result)
12
12
  end
@@ -70,9 +70,9 @@ class IncompatibilitiesGenerator
70
70
 
71
71
  def render_haml(template, options)
72
72
  obj = Object.new
73
- Haml::Engine.new(template, {ugly: true, escape_html: true}.merge(options)).def_method(obj, :haml)
73
+ Haml::Engine.new(template, { ugly: true, escape_html: true }.merge(options)).def_method(obj, :haml)
74
74
  obj.haml
75
- rescue Exception => e
75
+ rescue => e
76
76
  e
77
77
  end
78
78
 
@@ -80,7 +80,7 @@ class IncompatibilitiesGenerator
80
80
  obj = Object.new
81
81
  obj.instance_eval "def hamlit; #{Hamlit::Engine.new(options).call(template)}; end"
82
82
  obj.hamlit
83
- rescue Exception => e
83
+ rescue => e
84
84
  e
85
85
  end
86
86
 
@@ -99,7 +99,7 @@ EOS
99
99
 
100
100
  def render_input_title(options)
101
101
  title = 'Input'
102
- if !options.empty?
102
+ unless options.empty?
103
103
  title << " (with options=#{options.inspect})"
104
104
  end
105
105
  title
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.3.2
4
+ version: 0.3.3
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-09-23 00:00:00.000000000 Z
11
+ date: 2015-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: escape_utils
@@ -234,6 +234,20 @@ dependencies:
234
234
  - - ">="
235
235
  - !ruby/object:Gem::Version
236
236
  version: '3'
237
+ - !ruby/object:Gem::Dependency
238
+ name: rubocop
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
  - !ruby/object:Gem::Dependency
238
252
  name: sass
239
253
  requirement: !ruby/object:Gem::Requirement
@@ -288,6 +302,8 @@ files:
288
302
  - ".gitignore"
289
303
  - ".gitmodules"
290
304
  - ".rspec"
305
+ - ".rubocop.yml"
306
+ - ".rubocop_todo.yml"
291
307
  - ".travis.yml"
292
308
  - Appraisals
293
309
  - CHANGELOG.md
@@ -359,6 +375,7 @@ files:
359
375
  - lib/faml/railtie.rb
360
376
  - lib/faml/ruby_syntax_checker.rb
361
377
  - lib/faml/static_hash_parser.rb
378
+ - lib/faml/stats.rb
362
379
  - lib/faml/text_compiler.rb
363
380
  - lib/faml/tilt.rb
364
381
  - lib/faml/version.rb