curly-templates 2.0.0.beta1 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f70027aee738dbd7ac5cc496cce7017943304833
4
- data.tar.gz: 68947fc8e15e97945fcba195b0c278e14930d9dd
3
+ metadata.gz: 2818caa59f5bef7c626637f7836e1af656b7e80f
4
+ data.tar.gz: 4ca1146d648950e76512b621161f83b4af455829
5
5
  SHA512:
6
- metadata.gz: d3d6816a0d6fb0e6125cc89845bea00ef363e03012f9bc96e083d0d0951febb032b31472a8bcb23271c16333a470a881e2bf0c4129b8712f06e4f5c24aa86c4b
7
- data.tar.gz: 141f19f518dc381ecde8ac6d451bde20551bdcc711c4a9d1a7aa0f981cb100e1e840feb603a01eed956d5e865c3e6c7ef95d736f6302921fb29d3ad858c3150b
6
+ metadata.gz: 80c963f1466c87b64c3a34af2a60c1a9be706623513688226ce2c3cb62aedae3abcaf8947d39620966960570aed0b3867d3fd4e5c72140405c061d4b62892bc8
7
+ data.tar.gz: 8fbbaf7cf446034b96343ee77f766bafc473d62e01a4010fa412fe4806538505929ee30843685f46b969a2fade65d2b43ad303aa9ace72d0cf0d64627229aa3a
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ### Unreleased
2
2
 
3
+ ### Curly 2.0.0 (July 1, 2014)
4
+
5
+ * Rename Curly::CompilationError to Curly::PresenterNotFound.
6
+
7
+ *Daniel Schierbeck*
8
+
3
9
  ### Curly 2.0.0.beta1 (June 27, 2014)
4
10
 
5
11
  * Add support for collection blocks.
@@ -4,8 +4,8 @@ Gem::Specification.new do |s|
4
4
  s.rubygems_version = '1.3.5'
5
5
 
6
6
  s.name = 'curly-templates'
7
- s.version = '2.0.0.beta1'
8
- s.date = '2014-06-27'
7
+ s.version = '2.0.0'
8
+ s.date = '2014-07-01'
9
9
 
10
10
  s.summary = "Free your views!"
11
11
  s.description = "A view layer for your Rails apps that separates structure and logic."
@@ -37,7 +37,6 @@ Gem::Specification.new do |s|
37
37
  lib/curly-templates.rb
38
38
  lib/curly.rb
39
39
  lib/curly/attribute_parser.rb
40
- lib/curly/compilation_error.rb
41
40
  lib/curly/compiler.rb
42
41
  lib/curly/component_compiler.rb
43
42
  lib/curly/component_parser.rb
@@ -47,6 +46,7 @@ Gem::Specification.new do |s|
47
46
  lib/curly/incorrect_ending_error.rb
48
47
  lib/curly/invalid_component.rb
49
48
  lib/curly/presenter.rb
49
+ lib/curly/presenter_not_found.rb
50
50
  lib/curly/railtie.rb
51
51
  lib/curly/scanner.rb
52
52
  lib/curly/syntax_error.rb
@@ -61,6 +61,9 @@ Gem::Specification.new do |s|
61
61
  spec/component_compiler_spec.rb
62
62
  spec/generators/controller_generator_spec.rb
63
63
  spec/incorrect_ending_error_spec.rb
64
+ spec/integration/collection_blocks_spec.rb
65
+ spec/integration/components_spec.rb
66
+ spec/integration/conditional_blocks_spec.rb
64
67
  spec/presenter_spec.rb
65
68
  spec/scanner_spec.rb
66
69
  spec/spec_helper.rb
data/lib/curly.rb CHANGED
@@ -26,7 +26,7 @@
26
26
  # See Curly::Presenter for more information on presenters.
27
27
  #
28
28
  module Curly
29
- VERSION = "2.0.0.beta1"
29
+ VERSION = "2.0.0"
30
30
 
31
31
  # Compiles a Curly template to Ruby code.
32
32
  #
@@ -165,6 +165,10 @@ module Curly
165
165
  name, identifier, attributes = ComponentParser.parse(component)
166
166
  last_block = @blocks.pop
167
167
 
168
+ if last_block.nil?
169
+ raise Curly::Error, "block ending not expected"
170
+ end
171
+
168
172
  unless last_block == [name, identifier]
169
173
  raise Curly::IncorrectEndingError.new([name, identifier], last_block)
170
174
  end
@@ -1,7 +1,7 @@
1
1
  require 'curly/error'
2
2
 
3
3
  module Curly
4
- class CompilationError < Error
4
+ class PresenterNotFound < Error
5
5
  attr_reader :path
6
6
 
7
7
  def initialize(path)
@@ -1,7 +1,7 @@
1
1
  require 'active_support'
2
2
  require 'action_view'
3
3
  require 'curly'
4
- require 'curly/compilation_error'
4
+ require 'curly/presenter_not_found'
5
5
 
6
6
  class Curly::TemplateHandler
7
7
  class << self
@@ -48,7 +48,7 @@ class Curly::TemplateHandler
48
48
  path = template.virtual_path
49
49
  presenter_class = Curly::Presenter.presenter_for_path(path)
50
50
 
51
- raise Curly::CompilationError.new(path) if presenter_class.nil?
51
+ raise Curly::PresenterNotFound.new(path) if presenter_class.nil?
52
52
 
53
53
  source = Curly.compile(template.source, presenter_class)
54
54
 
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Collection block components" do
4
+ include RenderingSupport
5
+
6
+ before do
7
+ item_presenter do
8
+ presents :item
9
+
10
+ def name
11
+ @item
12
+ end
13
+ end
14
+ end
15
+
16
+ example "with neither identifier nor attributes" do
17
+ presenter do
18
+ def items
19
+ ["one", "two", "three"]
20
+ end
21
+ end
22
+
23
+ render("{{*items}}<{{name}}>{{/items}}").should == "<one><two><three>"
24
+ end
25
+
26
+ example "with an identifier" do
27
+ presenter do
28
+ def items(filter = nil)
29
+ if filter == "even"
30
+ ["two"]
31
+ elsif filter == "odd"
32
+ ["one", "three"]
33
+ else
34
+ ["one", "two", "three"]
35
+ end
36
+ end
37
+ end
38
+
39
+ render("{{*items.even}}<{{name}}>{{/items.even}}").should == "<two>"
40
+ render("{{*items.odd}}<{{name}}>{{/items.odd}}").should == "<one><three>"
41
+ render("{{*items}}<{{name}}>{{/items}}").should == "<one><two><three>"
42
+ end
43
+
44
+ example "with attributes" do
45
+ presenter do
46
+ def items(length: "1")
47
+ ["x"] * length.to_i
48
+ end
49
+ end
50
+
51
+ render("{{*items length=3}}<{{name}}>{{/items}}").should == "<x><x><x>"
52
+ render("{{*items}}<{{name}}>{{/items}}").should == "<x>"
53
+ end
54
+
55
+ example "with nested collection blocks" do
56
+ presenter do
57
+ def items
58
+ [{ parts: [1, 2] }, { parts: [3, 4] }]
59
+ end
60
+ end
61
+
62
+ item_presenter do
63
+ presents :item
64
+
65
+ def parts
66
+ @item[:parts]
67
+ end
68
+ end
69
+
70
+ part_presenter do
71
+ presents :part
72
+
73
+ def number
74
+ @part
75
+ end
76
+ end
77
+
78
+ render("{{*items}}<{{*parts}}[{{number}}]{{/parts}}>{{/items}}").should == "<[1][2]><[3][4]>"
79
+ end
80
+
81
+ def item_presenter(&block)
82
+ stub_const("ItemPresenter", Class.new(Curly::Presenter, &block))
83
+ end
84
+
85
+ def part_presenter(&block)
86
+ stub_const("ItemPresenter::PartPresenter", Class.new(Curly::Presenter, &block))
87
+ end
88
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Components" do
4
+ include RenderingSupport
5
+
6
+ example "with neither identifier nor attributes" do
7
+ presenter do
8
+ def title
9
+ "A Clockwork Orange"
10
+ end
11
+ end
12
+
13
+ render("{{title}}").should == "A Clockwork Orange"
14
+ end
15
+
16
+ example "with an identifier" do
17
+ presenter do
18
+ def reverse(str)
19
+ str.reverse
20
+ end
21
+ end
22
+
23
+ render("{{reverse.123}}").should == "321"
24
+ end
25
+
26
+ example "with attributes" do
27
+ presenter do
28
+ def double(number:)
29
+ number.to_i * 2
30
+ end
31
+ end
32
+
33
+ render("{{double number=3}}").should == "6"
34
+ end
35
+
36
+ example "with both identifier and attributes" do
37
+ presenter do
38
+ def a(href:, title:)
39
+ content_tag :a, nil, href: href, title: title
40
+ end
41
+ end
42
+
43
+ render(%({{a href="/welcome.html" title="Welcome!"}})).should == %(<a href="/welcome.html" title="Welcome!"></a>)
44
+ end
45
+ end
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Conditional block components" do
4
+ include RenderingSupport
5
+
6
+ example "with neither identifier nor attributes" do
7
+ presenter do
8
+ def high?
9
+ true
10
+ end
11
+
12
+ def low?
13
+ false
14
+ end
15
+ end
16
+
17
+ render("{{#high?}}yup{{/high?}}").should == "yup"
18
+ render("{{#low?}}nah{{/low?}}").should == ""
19
+ end
20
+
21
+ example "with an identifier" do
22
+ presenter do
23
+ def even?(number)
24
+ number.to_i % 2 == 0
25
+ end
26
+ end
27
+
28
+ render("{{#even.42?}}even{{/even.42?}}").should == "even"
29
+ render("{{#even.13?}}even{{/even.13?}}").should == ""
30
+ end
31
+
32
+ example "with attributes" do
33
+ presenter do
34
+ def square?(width:, height:)
35
+ width.to_i == height.to_i
36
+ end
37
+ end
38
+
39
+ render("{{#square? width=2 height=2}}square{{/square?}}").should == "square"
40
+ render("{{#square? width=3 height=2}}square{{/square?}}").should == ""
41
+ end
42
+ end
data/spec/spec_helper.rb CHANGED
@@ -11,6 +11,24 @@ end
11
11
 
12
12
  require 'curly'
13
13
 
14
+ module RenderingSupport
15
+ def presenter(&block)
16
+ @presenter = block
17
+ end
18
+
19
+ def render(source)
20
+ stub_const("TestPresenter", Class.new(Curly::Presenter, &@presenter))
21
+ identifier = "test"
22
+ handler = Curly::TemplateHandler
23
+ details = { virtual_path: 'test' }
24
+ template = ActionView::Template.new(source, identifier, handler, details)
25
+ locals = {}
26
+ view = ActionView::Base.new
27
+
28
+ template.render(view, locals)
29
+ end
30
+ end
31
+
14
32
  module CompilationSupport
15
33
  def evaluate(template, options = {}, &block)
16
34
  code = Curly::Compiler.compile(template, presenter_class)
@@ -105,7 +105,7 @@ describe Curly::TemplateHandler do
105
105
  it "should fail if there's no matching presenter class" do
106
106
  template.stub(:virtual_path) { "missing" }
107
107
  template.stub(:source) { " FOO " }
108
- expect { output }.to raise_exception(Curly::CompilationError)
108
+ expect { output }.to raise_exception(Curly::PresenterNotFound)
109
109
  end
110
110
 
111
111
  it "allows calling public methods on the presenter" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curly-templates
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.beta1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Schierbeck
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-27 00:00:00.000000000 Z
11
+ date: 2014-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -107,7 +107,6 @@ files:
107
107
  - lib/curly-templates.rb
108
108
  - lib/curly.rb
109
109
  - lib/curly/attribute_parser.rb
110
- - lib/curly/compilation_error.rb
111
110
  - lib/curly/compiler.rb
112
111
  - lib/curly/component_compiler.rb
113
112
  - lib/curly/component_parser.rb
@@ -117,6 +116,7 @@ files:
117
116
  - lib/curly/incorrect_ending_error.rb
118
117
  - lib/curly/invalid_component.rb
119
118
  - lib/curly/presenter.rb
119
+ - lib/curly/presenter_not_found.rb
120
120
  - lib/curly/railtie.rb
121
121
  - lib/curly/scanner.rb
122
122
  - lib/curly/syntax_error.rb
@@ -131,6 +131,9 @@ files:
131
131
  - spec/component_compiler_spec.rb
132
132
  - spec/generators/controller_generator_spec.rb
133
133
  - spec/incorrect_ending_error_spec.rb
134
+ - spec/integration/collection_blocks_spec.rb
135
+ - spec/integration/components_spec.rb
136
+ - spec/integration/conditional_blocks_spec.rb
134
137
  - spec/presenter_spec.rb
135
138
  - spec/scanner_spec.rb
136
139
  - spec/spec_helper.rb
@@ -152,9 +155,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
152
155
  version: '0'
153
156
  required_rubygems_version: !ruby/object:Gem::Requirement
154
157
  requirements:
155
- - - ">"
158
+ - - ">="
156
159
  - !ruby/object:Gem::Version
157
- version: 1.3.1
160
+ version: '0'
158
161
  requirements: []
159
162
  rubyforge_project:
160
163
  rubygems_version: 2.2.2
@@ -168,6 +171,9 @@ test_files:
168
171
  - spec/component_compiler_spec.rb
169
172
  - spec/generators/controller_generator_spec.rb
170
173
  - spec/incorrect_ending_error_spec.rb
174
+ - spec/integration/collection_blocks_spec.rb
175
+ - spec/integration/components_spec.rb
176
+ - spec/integration/conditional_blocks_spec.rb
171
177
  - spec/presenter_spec.rb
172
178
  - spec/scanner_spec.rb
173
179
  - spec/syntax_error_spec.rb