slim 1.3.9 → 2.0.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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -8
  3. data/.travis.yml +8 -7
  4. data/CHANGES +35 -0
  5. data/Gemfile +9 -9
  6. data/README.md +94 -176
  7. data/Rakefile +7 -14
  8. data/benchmarks/run-benchmarks.rb +9 -37
  9. data/doc/logic_less.md +140 -0
  10. data/doc/translator.md +31 -0
  11. data/lib/slim.rb +3 -1
  12. data/lib/slim/code_attributes.rb +20 -20
  13. data/lib/slim/command.rb +16 -6
  14. data/lib/slim/do_inserter.rb +33 -0
  15. data/lib/slim/embedded.rb +0 -6
  16. data/lib/slim/end_inserter.rb +2 -2
  17. data/lib/slim/engine.rb +9 -23
  18. data/lib/slim/erb_converter.rb +14 -0
  19. data/lib/slim/filter.rb +2 -2
  20. data/lib/slim/logic_less/context.rb +8 -0
  21. data/lib/slim/logic_less/filter.rb +12 -11
  22. data/lib/slim/parser.rb +57 -113
  23. data/lib/slim/splat/builder.rb +79 -0
  24. data/lib/slim/splat/filter.rb +93 -0
  25. data/lib/slim/version.rb +1 -1
  26. data/slim.gemspec +1 -1
  27. data/test/core/helper.rb +1 -3
  28. data/test/core/test_code_blocks.rb +51 -0
  29. data/test/core/test_code_evaluation.rb +4 -12
  30. data/test/core/test_embedded_engines.rb +18 -44
  31. data/test/core/test_encoding.rb +8 -1
  32. data/test/core/test_erb_converter.rb +67 -0
  33. data/test/core/test_html_attributes.rb +19 -25
  34. data/test/core/test_html_escaping.rb +10 -2
  35. data/test/core/test_html_structure.rb +6 -6
  36. data/test/core/test_parser_errors.rb +1 -1
  37. data/test/core/test_ruby_errors.rb +2 -6
  38. data/test/core/test_thread_options.rb +4 -4
  39. data/test/core/test_unicode.rb +18 -0
  40. data/test/literate/TESTS.md +193 -34
  41. data/test/logic_less/test_logic_less.rb +17 -0
  42. data/test/rails/app/controllers/application_controller.rb +0 -1
  43. data/test/rails/app/controllers/entries_controller.rb +5 -0
  44. data/test/rails/app/controllers/slim_controller.rb +3 -0
  45. data/test/rails/app/models/entry.rb +16 -0
  46. data/test/rails/app/views/entries/edit.html.slim +3 -0
  47. data/test/rails/app/views/slim/form_for.html.slim +2 -0
  48. data/test/rails/app/views/slim/xml.slim +1 -0
  49. data/test/rails/config/application.rb +2 -2
  50. data/test/rails/config/environments/test.rb +1 -1
  51. data/test/rails/config/routes.rb +1 -1
  52. data/test/rails/test/helper.rb +0 -3
  53. data/test/rails/test/test_slim.rb +13 -8
  54. data/test/translator/test_translator.rb +13 -2
  55. metadata +17 -14
  56. data/lib/slim/splat_attributes.rb +0 -113
  57. data/test/rails/app/controllers/parents_controller.rb +0 -85
  58. data/test/rails/app/models/child.rb +0 -3
  59. data/test/rails/app/models/parent.rb +0 -4
  60. data/test/rails/app/views/parents/_form.html.slim +0 -8
  61. data/test/rails/app/views/parents/edit.html.slim +0 -2
  62. data/test/rails/app/views/parents/new.html.slim +0 -2
  63. data/test/rails/app/views/parents/show.html.slim +0 -5
  64. data/test/rails/config/database.yml +0 -4
  65. data/test/rails/db/migrate/20101220223037_parents_and_children.rb +0 -17
@@ -133,6 +133,23 @@ p
133
133
  assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :scope => object, :dictionary_access => :instance_variable
134
134
  end
135
135
 
136
+ def test_to_s_access
137
+ source = %q{
138
+ p
139
+ - people
140
+ .name = self
141
+ }
142
+
143
+ hash = {
144
+ :people => [
145
+ 'Joe',
146
+ 'Jack'
147
+ ]
148
+ }
149
+
150
+ assert_html '<p><div class="name">Joe</div><div class="name">Jack</div></p>', source, :scope => hash, :dictionary_access => :symbol
151
+ end
152
+
136
153
  def test_string_hash
137
154
  source = %q{
138
155
  p
@@ -1,3 +1,2 @@
1
1
  class ApplicationController < ActionController::Base
2
- protect_from_forgery
3
2
  end
@@ -0,0 +1,5 @@
1
+ class EntriesController < ApplicationController
2
+ def edit
3
+ @entry = Entry.new
4
+ end
5
+ end
@@ -2,6 +2,9 @@ class SlimController < ApplicationController
2
2
  def normal
3
3
  end
4
4
 
5
+ def xml
6
+ end
7
+
5
8
  def no_layout
6
9
  render :layout => false
7
10
  end
@@ -0,0 +1,16 @@
1
+ class Entry
2
+ include ActiveModel::Conversion
3
+ extend ActiveModel::Naming
4
+
5
+ attr_accessor :name
6
+
7
+ def initialize(attributes = {})
8
+ attributes.each do |name, value|
9
+ send("#{name}=", value)
10
+ end
11
+ end
12
+
13
+ def persisted?
14
+ false
15
+ end
16
+ end
@@ -0,0 +1,3 @@
1
+ = form_for @entry do |f|
2
+ label: b Name
3
+ = f.text_field :name
@@ -0,0 +1,2 @@
1
+ = form_for @entry do |f|
2
+ = f.text_field :name
@@ -0,0 +1 @@
1
+ h1 Hello Slim!
@@ -1,10 +1,10 @@
1
1
  require File.expand_path('../boot', __FILE__)
2
2
 
3
3
  require 'active_model/railtie'
4
- require 'active_record/railtie'
5
4
  require 'action_controller/railtie'
6
5
  require 'action_view/railtie'
7
- require 'action_mailer/railtie'
6
+ #require 'active_record/railtie'
7
+ #require 'action_mailer/railtie'
8
8
 
9
9
  require 'slim'
10
10
 
@@ -20,7 +20,7 @@ Dummy::Application.configure do
20
20
  # Tell Action Mailer not to deliver emails to the real world.
21
21
  # The :test delivery method accumulates sent emails in the
22
22
  # ActionMailer::Base.deliveries array.
23
- config.action_mailer.delivery_method = :test
23
+ #config.action_mailer.delivery_method = :test
24
24
 
25
25
  # Use SQL instead of Active Record's schema dumper when creating the test database.
26
26
  # This is necessary if your schema can't be completely dumped by the schema dumper,
@@ -2,7 +2,7 @@ Dummy::Application.routes.draw do
2
2
  # The priority is based upon order of creation:
3
3
  # first created -> highest priority.
4
4
 
5
- resources :parents
5
+ resources :entries
6
6
 
7
7
  # Sample of regular route:
8
8
  # match 'products/:id' => 'catalog#view'
@@ -5,6 +5,3 @@ require File.expand_path("../../config/environment.rb", __FILE__)
5
5
  require "rails/test_help"
6
6
 
7
7
  Rails.backtrace_cleaner.remove_silencers!
8
-
9
- # Run any available migration
10
- ActiveRecord::Migrator.migrate File.expand_path("../../db/migrate/", __FILE__)
@@ -9,6 +9,14 @@ class TestSlim < ActionDispatch::IntegrationTest
9
9
  assert_html "<h1>Hello Slim!</h1>"
10
10
  end
11
11
 
12
+ test "xml view" do
13
+ get "slim/xml"
14
+ assert_response :success
15
+ assert_template "slim/xml"
16
+ assert_template "layouts/application"
17
+ assert_html "<h1>Hello Slim!</h1>"
18
+ end
19
+
12
20
  test "normal erb view" do
13
21
  get "slim/erb"
14
22
  assert_html "<h1>Hello Erb!</h1>"
@@ -58,14 +66,11 @@ class TestSlim < ActionDispatch::IntegrationTest
58
66
  assert_html "<p>Page content</p><h1><p>Hello Slim!</p></h1><h2><p>Hello Slim!</p></h2>", :heading => 'Heading set from a view'
59
67
  end
60
68
 
61
- test "nested_attributes_form" do
62
- post "parents", 'parent[name]' => "p1", 'parent[children_attributes][0][name]' => "c1"
63
- get "parents/1/edit"
64
-
65
- assert_match %r{action="/parents/1"}, @response.body
66
- assert_match %r{<input id="parent_name" name="parent\[name\]"}, @response.body
67
- assert_match %r{<input id="parent_children_attributes_0_name" name="parent\[children_attributes\]\[0\]\[name\]"}, @response.body
68
- assert_match %r{<input id="parent_children_attributes_0_id" name="parent\[children_attributes\]\[0\]\[id\]"}, @response.body
69
+ test "form_for" do
70
+ get "entries/edit/1"
71
+ assert_match %r{action="/entries"}, @response.body
72
+ assert_match %r{<label><b>Name</b></label>}, @response.body
73
+ assert_match %r{<input id="entry_name" name="entry\[name\]"}, @response.body
69
74
  end
70
75
 
71
76
  protected
@@ -26,8 +26,19 @@ markdown:
26
26
  * one
27
27
  * two
28
28
  }
29
- assert_html "<h1 id=\"header\">Header</h1>\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n <li>one</li>\n <li>two</li>\n</ul>\n", source, :tr_mode => :dynamic
30
- assert_html "<h1 id=\"header\">Header</h1>\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n <li>one</li>\n <li>two</li>\n</ul>\n", source, :tr_mode => :static
29
+ if !Gem::Specification::find_all_by_name('redcarpet').empty?
30
+ # redcarpet
31
+ assert_html "<h1>Header</h1>\n\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n<li>one</li>\n<li>two</li>\n</ul>\n", source, :tr_mode => :dynamic
32
+ assert_html "<h1>Header</h1>\n\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n<li>one</li>\n<li>two</li>\n</ul>\n", source, :tr_mode => :static
33
+ elsif !Gem::Specification::find_all_by_name('rdiscount').empty?
34
+ # rdiscount
35
+ assert_html "<h1>Header</h1>\n\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n<li>one</li>\n<li>two</li>\n</ul>\n\n", source, :tr_mode => :dynamic
36
+ assert_html "<h1>Header</h1>\n\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n<li>one</li>\n<li>two</li>\n</ul>\n\n", source, :tr_mode => :static
37
+ else
38
+ # kramdown
39
+ assert_html "<h1 id=\"header\">Header</h1>\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n <li>one</li>\n <li>two</li>\n</ul>\n", source, :tr_mode => :dynamic
40
+ assert_html "<h1 id=\"header\">Header</h1>\n<p>Hello from Markdown!</p>\n\n<p>3</p>\n\n<ul>\n <li>one</li>\n <li>two</li>\n</ul>\n", source, :tr_mode => :static
41
+ end
31
42
  end
32
43
 
33
44
  def test_no_translation_of_attrs
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: slim
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.9
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Mendler
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-05-17 00:00:00.000000000 Z
13
+ date: 2013-05-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: temple
@@ -18,14 +18,14 @@ dependencies:
18
18
  requirements:
19
19
  - - ~>
20
20
  - !ruby/object:Gem::Version
21
- version: 0.6.3
21
+ version: 0.6.5
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
26
  - - ~>
27
27
  - !ruby/object:Gem::Version
28
- version: 0.6.3
28
+ version: 0.6.5
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: tilt
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -74,14 +74,18 @@ files:
74
74
  - benchmarks/view.haml
75
75
  - benchmarks/view.slim
76
76
  - bin/slimrb
77
+ - doc/logic_less.md
78
+ - doc/translator.md
77
79
  - kill-travis.sh
78
80
  - lib/slim.rb
79
81
  - lib/slim/code_attributes.rb
80
82
  - lib/slim/command.rb
81
83
  - lib/slim/controls.rb
84
+ - lib/slim/do_inserter.rb
82
85
  - lib/slim/embedded.rb
83
86
  - lib/slim/end_inserter.rb
84
87
  - lib/slim/engine.rb
88
+ - lib/slim/erb_converter.rb
85
89
  - lib/slim/filter.rb
86
90
  - lib/slim/grammar.rb
87
91
  - lib/slim/interpolation.rb
@@ -89,7 +93,8 @@ files:
89
93
  - lib/slim/logic_less/context.rb
90
94
  - lib/slim/logic_less/filter.rb
91
95
  - lib/slim/parser.rb
92
- - lib/slim/splat_attributes.rb
96
+ - lib/slim/splat/builder.rb
97
+ - lib/slim/splat/filter.rb
93
98
  - lib/slim/template.rb
94
99
  - lib/slim/translator.rb
95
100
  - lib/slim/version.rb
@@ -102,6 +107,7 @@ files:
102
107
  - test/core/test_code_structure.rb
103
108
  - test/core/test_embedded_engines.rb
104
109
  - test/core/test_encoding.rb
110
+ - test/core/test_erb_converter.rb
105
111
  - test/core/test_html_attributes.rb
106
112
  - test/core/test_html_escaping.rb
107
113
  - test/core/test_html_structure.rb
@@ -112,35 +118,33 @@ files:
112
118
  - test/core/test_tabs.rb
113
119
  - test/core/test_text_interpolation.rb
114
120
  - test/core/test_thread_options.rb
121
+ - test/core/test_unicode.rb
115
122
  - test/literate/TESTS.md
116
123
  - test/literate/helper.rb
117
124
  - test/literate/run.rb
118
125
  - test/logic_less/test_logic_less.rb
119
126
  - test/rails/Rakefile
120
127
  - test/rails/app/controllers/application_controller.rb
121
- - test/rails/app/controllers/parents_controller.rb
128
+ - test/rails/app/controllers/entries_controller.rb
122
129
  - test/rails/app/controllers/slim_controller.rb
123
130
  - test/rails/app/helpers/application_helper.rb
124
- - test/rails/app/models/child.rb
125
- - test/rails/app/models/parent.rb
131
+ - test/rails/app/models/entry.rb
132
+ - test/rails/app/views/entries/edit.html.slim
126
133
  - test/rails/app/views/layouts/application.html.slim
127
- - test/rails/app/views/parents/_form.html.slim
128
- - test/rails/app/views/parents/edit.html.slim
129
- - test/rails/app/views/parents/new.html.slim
130
- - test/rails/app/views/parents/show.html.slim
131
134
  - test/rails/app/views/slim/_partial.html.slim
132
135
  - test/rails/app/views/slim/content_for.html.slim
133
136
  - test/rails/app/views/slim/erb.html.erb
137
+ - test/rails/app/views/slim/form_for.html.slim
134
138
  - test/rails/app/views/slim/integers.html.slim
135
139
  - test/rails/app/views/slim/no_layout.html.slim
136
140
  - test/rails/app/views/slim/normal.html.slim
137
141
  - test/rails/app/views/slim/partial.html.slim
138
142
  - test/rails/app/views/slim/thread_options.html.slim
139
143
  - test/rails/app/views/slim/variables.html.slim
144
+ - test/rails/app/views/slim/xml.slim
140
145
  - test/rails/config.ru
141
146
  - test/rails/config/application.rb
142
147
  - test/rails/config/boot.rb
143
- - test/rails/config/database.yml
144
148
  - test/rails/config/environment.rb
145
149
  - test/rails/config/environments/test.rb
146
150
  - test/rails/config/initializers/backtrace_silencers.rb
@@ -150,7 +154,6 @@ files:
150
154
  - test/rails/config/initializers/session_store.rb
151
155
  - test/rails/config/locales/en.yml
152
156
  - test/rails/config/routes.rb
153
- - test/rails/db/migrate/20101220223037_parents_and_children.rb
154
157
  - test/rails/script/rails
155
158
  - test/rails/test/helper.rb
156
159
  - test/rails/test/test_slim.rb
@@ -1,113 +0,0 @@
1
- module Slim
2
- # @api private
3
- class SplatAttributes < Filter
4
- define_options :sort_attrs, :default_tag, :merge_attrs, :attr_quote
5
-
6
- def call(exp)
7
- @merge_attrs, @splat_used = unique_name, false
8
- exp = compile(exp)
9
- if @splat_used
10
- [:multi, [:code, "#{@merge_attrs} = #{@options[:merge_attrs].inspect}"], exp]
11
- else
12
- exp
13
- end
14
- end
15
-
16
- # Handle tag expression `[:html, :tag, name, attrs, content]`
17
- #
18
- # @param [String] name Tag name
19
- # @param [Array] attrs Temple expression
20
- # @param [Array] content Temple expression
21
- # @return [Array] Compiled temple expression
22
- def on_html_tag(name, attrs, content = nil)
23
- return super if name != '*'
24
- hash, merger, formatter = splat_attributes(attrs[2..-1])
25
- tmp = unique_name
26
- tag = [:multi,
27
- merger,
28
- [:code, "#{tmp} = #{hash}.delete('tag').to_s"],
29
- [:if, "#{tmp}.empty?",
30
- [:code, "#{tmp} = #{@options[:default_tag].inspect}"]],
31
- [:static, '<'],
32
- [:dynamic, "#{tmp}"],
33
- formatter]
34
- tag << if content
35
- [:multi,
36
- [:static, '>'],
37
- compile(content),
38
- [:static, '</'],
39
- [:dynamic, "#{tmp}"],
40
- [:static, '>']]
41
- else
42
- [:static, '/>']
43
- end
44
- end
45
-
46
- # Handle attributes expression `[:html, :attrs, *attrs]`
47
- #
48
- # @param [Array] attrs Array of temple expressions
49
- # @return [Array] Compiled temple expression
50
- def on_html_attrs(*attrs)
51
- return super if attrs.all? {|attr| attr[1] != :splat}
52
- hash, merger, formatter = splat_attributes(attrs)
53
- [:multi, merger, formatter]
54
- end
55
-
56
- protected
57
-
58
- def splat_attributes(attrs)
59
- @splat_used = true
60
-
61
- hash, name, value, tmp = unique_name, unique_name, unique_name, unique_name
62
-
63
- merger = [:multi, [:code, "#{hash} = {}"]]
64
- attrs.each do |attr|
65
- merger << if attr[0] == :html && attr[1] == :attr
66
- [:multi,
67
- [:capture, tmp, compile(attr[3])],
68
- [:code, "(#{hash}[#{attr[2].inspect}] ||= []) << #{tmp}"]]
69
- elsif attr[0] == :slim
70
- if attr[1] == :attr
71
- [:code, "(#{hash}[#{attr[2].inspect}] ||= []) << (#{attr[4]})"]
72
- elsif attr[1] == :splat
73
- [:code, "(#{attr[2]}).each {|#{name},#{value}| (#{hash}[#{name}.to_s] ||= []) << (#{value}) }"]
74
- else
75
- attr
76
- end
77
- else
78
- attr
79
- end
80
- end
81
-
82
- merger << [:block, "#{hash}.keys.each do |#{name}|",
83
- [:multi,
84
- [:code, "#{value} = #{hash}[#{name}]"],
85
- [:if, "#{@merge_attrs}[#{name}]",
86
- [:multi,
87
- [:code, "#{value}.flatten!"],
88
- [:code, "#{value}.map!(&:to_s)"],
89
- [:code, "#{value}.reject!(&:empty?)"],
90
- [:if, "#{value}.empty?",
91
- [:code, "#{hash}.delete(#{name})"],
92
- [:code, "#{hash}[#{name}] = #{value}.join(#{@merge_attrs}[#{name}].to_s)"]]],
93
- [:multi,
94
- [:if, "#{value}.size > 1",
95
- [:code, %{raise("Multiple #\{#{name}\} attributes specified")}]],
96
- [:case, "#{value}.first",
97
- ['true', [:code, "#{hash}[#{name}] = #{name}"]],
98
- ['false, nil', [:code, "#{hash}.delete(#{name})"]],
99
- [:else, [:code, "#{hash}[#{name}] = #{value}.first"]]]]]]]
100
-
101
- attr = [:multi,
102
- [:static, ' '],
103
- [:dynamic, name],
104
- [:static, "=#{options[:attr_quote]}"],
105
- [:escape, true, [:dynamic, value]],
106
- [:static, options[:attr_quote]]]
107
- enumerator = options[:sort_attrs] ? "#{hash}.sort_by {|#{name},#{value}| #{name} }" : hash
108
- formatter = [:block, "#{enumerator}.each do |#{name},#{value}|", attr]
109
-
110
- return hash, merger, formatter
111
- end
112
- end
113
- end
@@ -1,85 +0,0 @@
1
- class ParentsController < ApplicationController
2
- # GET /parents
3
- # GET /parents.xml
4
- def index
5
- @parents = Parent.all
6
-
7
- respond_to do |format|
8
- format.html # index.html.erb
9
- format.xml { render :xml => @parents }
10
- end
11
- end
12
-
13
- # GET /parents/1
14
- # GET /parents/1.xml
15
- def show
16
- @parent = Parent.find(params[:id])
17
-
18
- respond_to do |format|
19
- format.html # show.html.erb
20
- format.xml { render :xml => @parent }
21
- end
22
- end
23
-
24
- # GET /parents/new
25
- # GET /parents/new.xml
26
- def new
27
- @parent = Parent.new
28
- @parent.children.build
29
-
30
- respond_to do |format|
31
- format.html # new.html.erb
32
- format.xml { render :xml => @parent }
33
- end
34
- end
35
-
36
- # GET /parents/1/edit
37
- def edit
38
- @parent = Parent.find(params[:id])
39
- end
40
-
41
- # POST /parents
42
- # POST /parents.xml
43
- def create
44
- params.permit! if params.respond_to? :permit!
45
- @parent = Parent.new(params[:parent])
46
-
47
- respond_to do |format|
48
- if @parent.save
49
- format.html { redirect_to(@parent, :notice => 'Parent was successfully created.') }
50
- format.xml { render :xml => @parent, :status => :created, :location => @parent }
51
- else
52
- format.html { render :action => "new" }
53
- format.xml { render :xml => @parent.errors, :status => :unprocessable_entity }
54
- end
55
- end
56
- end
57
-
58
- # PUT /parents/1
59
- # PUT /parents/1.xml
60
- def update
61
- @parent = Parent.find(params[:id])
62
-
63
- respond_to do |format|
64
- if @parent.update_attributes(params[:parent])
65
- format.html { redirect_to(@parent, :notice => 'Parent was successfully updated.') }
66
- format.xml { head :ok }
67
- else
68
- format.html { render :action => "edit" }
69
- format.xml { render :xml => @parent.errors, :status => :unprocessable_entity }
70
- end
71
- end
72
- end
73
-
74
- # DELETE /parents/1
75
- # DELETE /parents/1.xml
76
- def destroy
77
- @parent = Parent.find(params[:id])
78
- @parent.destroy
79
-
80
- respond_to do |format|
81
- format.html { redirect_to(parents_url) }
82
- format.xml { head :ok }
83
- end
84
- end
85
- end