faml 0.4.2 → 0.5.0
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 +4 -4
- data/CHANGELOG.md +4 -0
- data/faml.gemspec +1 -1
- data/incompatibilities/README.md +1 -1
- data/incompatibilities/spec/render/attribute_spec.md +54 -0
- data/lib/faml/compiler.rb +21 -14
- data/lib/faml/object_ref.rb +50 -0
- data/lib/faml/stats.rb +8 -1
- data/lib/faml/version.rb +1 -1
- data/spec/rails/app/controllers/books_controller.rb +4 -0
- data/spec/rails/app/models/book.rb +1 -1
- data/spec/rails/app/views/books/object_ref.html.haml +2 -0
- data/spec/rails/config/routes.rb +1 -0
- data/spec/rails/spec/requests/faml_spec.rb +14 -0
- data/spec/render/attribute_spec.rb +14 -0
- data/spec/spec_helper.rb +9 -0
- metadata +7 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c7f71b5e360cafa8cef276e06dbc8c8b0c2214bb
|
4
|
+
data.tar.gz: b94247f91e3508b3261686ad678eb539cf535ea5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2aa2f8a5e0e40444fa7c87d1f864fe0ba713b7f2a76ddcc722635233a43a43a8b20ad480f599636a2f85f84a0018ba0adf912f0b2399f537b8c95ae0af26552c
|
7
|
+
data.tar.gz: e11276dff335fe35d1c95753539ea45be0500e09ff030a616d53b587b6cc5570869cc40ad0247f33c8deaefd0c764e9a8c1a424ae522faf87f50712e1a62087a
|
data/CHANGELOG.md
CHANGED
data/faml.gemspec
CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.required_ruby_version = '>= 2.0.0'
|
22
22
|
|
23
23
|
spec.add_dependency 'escape_utils'
|
24
|
-
spec.add_dependency 'haml_parser', '>= 0.
|
24
|
+
spec.add_dependency 'haml_parser', '>= 0.3.0'
|
25
25
|
spec.add_dependency 'parser'
|
26
26
|
spec.add_dependency 'temple', '>= 0.7.0'
|
27
27
|
spec.add_dependency 'tilt'
|
data/incompatibilities/README.md
CHANGED
@@ -459,3 +459,57 @@
|
|
459
459
|
... ^
|
460
460
|
```
|
461
461
|
|
462
|
+
# [./spec/render/attribute_spec.rb:215](../../../spec/render/attribute_spec.rb#L215)
|
463
|
+
## Input
|
464
|
+
```haml
|
465
|
+
%span[Faml::TestStruct.new(123)] hello
|
466
|
+
```
|
467
|
+
|
468
|
+
## Faml, Haml
|
469
|
+
```html
|
470
|
+
<span class='faml_test_struct' id='faml_test_struct_123'>hello</span>
|
471
|
+
|
472
|
+
```
|
473
|
+
|
474
|
+
## Hamlit
|
475
|
+
```html
|
476
|
+
<span>[Faml::TestStruct.new(123)] hello</span>
|
477
|
+
|
478
|
+
```
|
479
|
+
|
480
|
+
# [./spec/render/attribute_spec.rb:219](../../../spec/render/attribute_spec.rb#L219)
|
481
|
+
## Input
|
482
|
+
```haml
|
483
|
+
%span[Faml::TestStruct.new(123), :hello] hello
|
484
|
+
```
|
485
|
+
|
486
|
+
## Faml, Haml
|
487
|
+
```html
|
488
|
+
<span class='hello_faml_test_struct' id='hello_faml_test_struct_123'>hello</span>
|
489
|
+
|
490
|
+
```
|
491
|
+
|
492
|
+
## Hamlit
|
493
|
+
```html
|
494
|
+
<span>[Faml::TestStruct.new(123), :hello] hello</span>
|
495
|
+
|
496
|
+
```
|
497
|
+
|
498
|
+
# [./spec/render/attribute_spec.rb:223](../../../spec/render/attribute_spec.rb#L223)
|
499
|
+
## Input
|
500
|
+
```haml
|
501
|
+
%span[Faml::TestRefStruct.new(123)] hello
|
502
|
+
```
|
503
|
+
|
504
|
+
## Faml, Haml
|
505
|
+
```html
|
506
|
+
<span class='faml_test' id='faml_test_123'>hello</span>
|
507
|
+
|
508
|
+
```
|
509
|
+
|
510
|
+
## Hamlit
|
511
|
+
```html
|
512
|
+
<span>[Faml::TestRefStruct.new(123)] hello</span>
|
513
|
+
|
514
|
+
```
|
515
|
+
|
data/lib/faml/compiler.rb
CHANGED
@@ -4,6 +4,7 @@ require 'haml_parser/ast'
|
|
4
4
|
require_relative 'error'
|
5
5
|
require_relative 'filter_compilers'
|
6
6
|
require_relative 'helpers'
|
7
|
+
require_relative 'object_ref'
|
7
8
|
require_relative 'rails_helpers'
|
8
9
|
require_relative 'ruby_syntax_checker'
|
9
10
|
require_relative 'static_hash_parser'
|
@@ -181,7 +182,7 @@ module Faml
|
|
181
182
|
:haml, :tag,
|
182
183
|
ast.tag_name,
|
183
184
|
self_closing?(ast),
|
184
|
-
compile_attributes(ast.attributes, ast.static_id, ast.static_class),
|
185
|
+
compile_attributes(ast.attributes, ast.static_id, ast.static_class, ast.object_ref),
|
185
186
|
]
|
186
187
|
|
187
188
|
if ast.oneline_child
|
@@ -223,15 +224,17 @@ module Faml
|
|
223
224
|
ast.nuke_inner_whitespace || options[:preserve].include?(ast.tag_name)
|
224
225
|
end
|
225
226
|
|
226
|
-
def compile_attributes(text, static_id, static_class)
|
227
|
-
if text.empty?
|
227
|
+
def compile_attributes(text, static_id, static_class, object_ref)
|
228
|
+
if !object_ref && text.empty?
|
228
229
|
return compile_static_id_and_class(static_id, static_class)
|
229
230
|
end
|
230
231
|
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
232
|
+
unless object_ref
|
233
|
+
attrs = try_optimize_attributes(text, static_id, static_class)
|
234
|
+
if attrs
|
235
|
+
line_count = text.count("\n")
|
236
|
+
return [:multi, [:html, :attrs, *attrs]].concat([[:newline]] * line_count)
|
237
|
+
end
|
235
238
|
end
|
236
239
|
|
237
240
|
# Slow version
|
@@ -244,13 +247,17 @@ module Faml
|
|
244
247
|
h[:id] = static_id
|
245
248
|
end
|
246
249
|
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
250
|
+
codes = []
|
251
|
+
unless h.empty?
|
252
|
+
codes << h.inspect
|
253
|
+
end
|
254
|
+
if object_ref
|
255
|
+
codes << "::Faml::ObjectRef.render(#{object_ref})"
|
256
|
+
end
|
257
|
+
unless text.empty?
|
258
|
+
codes << text
|
259
|
+
end
|
260
|
+
[:haml, :attrs, codes.join(', ')]
|
254
261
|
end
|
255
262
|
|
256
263
|
def compile_static_id_and_class(static_id, static_class)
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module Faml
|
2
|
+
module ObjectRef
|
3
|
+
class << self
|
4
|
+
def render(ref = nil, prefix = nil, *)
|
5
|
+
h = {}
|
6
|
+
if ref.nil?
|
7
|
+
return h
|
8
|
+
end
|
9
|
+
c = class_name(ref)
|
10
|
+
i = "#{c}_#{id(ref) || 'new'}"
|
11
|
+
if prefix
|
12
|
+
c = "#{prefix}_#{c}"
|
13
|
+
i = "#{prefix}_#{i}"
|
14
|
+
end
|
15
|
+
{ id: i, class: c }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def class_name(ref)
|
21
|
+
if ref.respond_to?(:haml_object_ref)
|
22
|
+
ref.haml_object_ref
|
23
|
+
else
|
24
|
+
underscore(ref.class)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def id(ref)
|
29
|
+
if ref.respond_to?(:to_key)
|
30
|
+
key = ref.to_key
|
31
|
+
if key
|
32
|
+
key.join('_')
|
33
|
+
end
|
34
|
+
else
|
35
|
+
ref.id
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def underscore(camel_cased_word)
|
40
|
+
word = camel_cased_word.to_s.dup
|
41
|
+
word.gsub!(/::/, '_')
|
42
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
|
43
|
+
word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
|
44
|
+
word.tr!('-', '_')
|
45
|
+
word.downcase!
|
46
|
+
word
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/faml/stats.rb
CHANGED
@@ -13,6 +13,7 @@ module Faml
|
|
13
13
|
:dynamic_attribute_with_data_count,
|
14
14
|
:dynamic_attribute_with_newline_count,
|
15
15
|
:ruby_attribute_count,
|
16
|
+
:object_reference_count,
|
16
17
|
:multi_attribute_count,
|
17
18
|
:ast_types
|
18
19
|
) do
|
@@ -99,6 +100,11 @@ module Faml
|
|
99
100
|
end
|
100
101
|
|
101
102
|
def collect_attribute_info(info, ast)
|
103
|
+
if ast.object_ref
|
104
|
+
info.object_reference_count += 1
|
105
|
+
return
|
106
|
+
end
|
107
|
+
|
102
108
|
if ast.attributes.empty?
|
103
109
|
if ast.static_class.empty? && ast.static_id.empty?
|
104
110
|
info.empty_attribute_count += 1
|
@@ -133,7 +139,7 @@ module Faml
|
|
133
139
|
def report_attribute_stats(info)
|
134
140
|
static = info.static_attribute_count
|
135
141
|
dynamic = info.dynamic_attribute_count + info.dynamic_attribute_with_data_count + info.dynamic_attribute_with_newline_count
|
136
|
-
ruby = info.ruby_attribute_count + info.multi_attribute_count
|
142
|
+
ruby = info.ruby_attribute_count + info.multi_attribute_count + info.object_reference_count
|
137
143
|
total = static + dynamic + ruby
|
138
144
|
puts 'Attribute stats'
|
139
145
|
printf(" Empty attributes: %d\n", info.empty_attribute_count)
|
@@ -144,6 +150,7 @@ module Faml
|
|
144
150
|
printf(" with newline: %d\n", info.dynamic_attribute_with_newline_count)
|
145
151
|
printf(" Ruby attributes: %d (%.2f%%)\n", ruby, ruby * 100.0 / total)
|
146
152
|
printf(" with multiple arguments: %d\n", info.multi_attribute_count)
|
153
|
+
printf(" with object reference: %d\n", info.object_reference_count)
|
147
154
|
end
|
148
155
|
|
149
156
|
def report_ast_stats(info)
|
data/lib/faml/version.rb
CHANGED
data/spec/rails/config/routes.rb
CHANGED
@@ -45,6 +45,20 @@ RSpec.describe 'Faml with Rails', type: :request do
|
|
45
45
|
expect(response.body).to include('<marquee>escape me</marquee>')
|
46
46
|
end
|
47
47
|
|
48
|
+
describe 'object reference' do
|
49
|
+
it 'works with new object' do
|
50
|
+
get '/books/object_ref'
|
51
|
+
expect(response).to be_ok
|
52
|
+
expect(response.body).to include("<div class='book' id='book_new'>")
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'works with id' do
|
56
|
+
get '/books/object_ref', id: 123
|
57
|
+
expect(response).to be_ok
|
58
|
+
expect(response.body).to include("<div class='book' id='book_123'>")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
48
62
|
describe 'preserve helper' do
|
49
63
|
it 'returns html_safe string' do
|
50
64
|
get '/books/preserve'
|
@@ -210,4 +210,18 @@ HAML
|
|
210
210
|
%span{key => val}
|
211
211
|
HAML
|
212
212
|
end
|
213
|
+
|
214
|
+
describe 'object reference' do
|
215
|
+
it 'renders id and class attribute' do
|
216
|
+
expect(render_string('%span[Faml::TestStruct.new(123)] hello')).to eq("<span class='faml_test_struct' id='faml_test_struct_123'>hello</span>\n")
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'renders id and class attribute with prefix' do
|
220
|
+
expect(render_string('%span[Faml::TestStruct.new(123), :hello] hello')).to eq("<span class='hello_faml_test_struct' id='hello_faml_test_struct_123'>hello</span>\n")
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'renders id and class attribute with haml_object_ref' do
|
224
|
+
expect(render_string('%span[Faml::TestRefStruct.new(123)] hello')).to eq("<span class='faml_test' id='faml_test_123'>hello</span>\n")
|
225
|
+
end
|
226
|
+
end
|
213
227
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -31,6 +31,15 @@ module RenderSpecHelper
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
module Faml
|
35
|
+
TestStruct = Struct.new(:id)
|
36
|
+
TestRefStruct = Struct.new(:id) do
|
37
|
+
def haml_object_ref
|
38
|
+
'faml_test'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
34
43
|
RSpec.configure do |config|
|
35
44
|
config.expect_with :rspec do |expectations|
|
36
45
|
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
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.
|
4
|
+
version: 0.5.0
|
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-11-
|
11
|
+
date: 2015-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: escape_utils
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.3.0
|
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.
|
40
|
+
version: 0.3.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: parser
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -371,6 +371,7 @@ files:
|
|
371
371
|
- lib/faml/helpers.rb
|
372
372
|
- lib/faml/html.rb
|
373
373
|
- lib/faml/newline.rb
|
374
|
+
- lib/faml/object_ref.rb
|
374
375
|
- lib/faml/rails_handler.rb
|
375
376
|
- lib/faml/rails_helpers.rb
|
376
377
|
- lib/faml/railtie.rb
|
@@ -400,6 +401,7 @@ files:
|
|
400
401
|
- spec/rails/app/views/books/hello.html.haml
|
401
402
|
- spec/rails/app/views/books/indent_error.html.haml
|
402
403
|
- spec/rails/app/views/books/invalid_interpolation.html.haml
|
404
|
+
- spec/rails/app/views/books/object_ref.html.haml
|
403
405
|
- spec/rails/app/views/books/preserve.html.haml
|
404
406
|
- spec/rails/app/views/books/syntax_error.html.haml
|
405
407
|
- spec/rails/app/views/books/unparsable.html.haml
|
@@ -557,6 +559,7 @@ test_files:
|
|
557
559
|
- spec/rails/app/views/books/hello.html.haml
|
558
560
|
- spec/rails/app/views/books/indent_error.html.haml
|
559
561
|
- spec/rails/app/views/books/invalid_interpolation.html.haml
|
562
|
+
- spec/rails/app/views/books/object_ref.html.haml
|
560
563
|
- spec/rails/app/views/books/preserve.html.haml
|
561
564
|
- spec/rails/app/views/books/syntax_error.html.haml
|
562
565
|
- spec/rails/app/views/books/unparsable.html.haml
|