curly-templates 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -7,4 +7,5 @@ platform :ruby do
7
7
  gem 'yard-tomdoc'
8
8
  gem 'redcarpet'
9
9
  gem 'github-markup'
10
+ gem 'coveralls', require: false
10
11
  end
data/README.md CHANGED
@@ -87,6 +87,13 @@ render collection: post.comments
87
87
  ```
88
88
 
89
89
 
90
+ Is it ready to use in production?
91
+ ---------------------------------
92
+
93
+ Yes! While still a young project, it's being used in a rather large Rails app
94
+ at Zendesk, where it performs admirably.
95
+
96
+
90
97
  Examples
91
98
  --------
92
99
 
@@ -256,6 +263,12 @@ Thanks
256
263
  Thanks to [Zendesk](http://zendesk.com/) for sponsoring the work on Curly.
257
264
 
258
265
 
266
+ Build Status
267
+ ------------
268
+
269
+ [![Build Status](https://travis-ci.org/zendesk/curly.png?branch=master)](https://travis-ci.org/zendesk/curly)
270
+
271
+
259
272
  Copyright and License
260
273
  ---------------------
261
274
 
@@ -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 = '0.7.0'
8
- s.date = '2013-05-03'
7
+ s.version = '0.8.0'
8
+ s.date = '2013-05-22'
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."
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 = "0.7.0"
29
+ VERSION = "0.8.0"
30
30
 
31
31
  # Compiles a Curly template to Ruby code.
32
32
  #
@@ -45,7 +45,13 @@ module Curly
45
45
  def initialize(context, options = {})
46
46
  @_context = context
47
47
  self.class.presented_names.each do |name|
48
- instance_variable_set("@#{name}", options.fetch(name))
48
+ value = options.fetch(name) do
49
+ default_values.fetch(name) do
50
+ raise ArgumentError.new("required parameter `#{name}` missing")
51
+ end
52
+ end
53
+
54
+ instance_variable_set("@#{name}", value)
49
55
  end
50
56
  end
51
57
 
@@ -209,14 +215,26 @@ module Curly
209
215
  end
210
216
 
211
217
  def presents(*args)
218
+ options = args.extract_options!
219
+
212
220
  self.presented_names += args
221
+
222
+ if options.key?(:default)
223
+ default_values = args.each_with_object(Hash.new) do |arg, hash|
224
+ hash[arg] = options.fetch(:default)
225
+ end
226
+
227
+ self.default_values = self.default_values.merge(default_values)
228
+ end
213
229
  end
214
230
  end
215
231
 
216
232
  private
217
233
 
218
- class_attribute :presented_names
234
+ class_attribute :presented_names, :default_values
235
+
219
236
  self.presented_names = [].freeze
237
+ self.default_values = {}.freeze
220
238
 
221
239
  # Delegates private method calls to the current view context.
222
240
  #
data/lib/curly/railtie.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'curly/dependency_tracker'
2
+
1
3
  module Curly
2
4
  class Railtie < Rails::Railtie
3
5
  config.app_generators.template_engine :curly
@@ -6,9 +8,12 @@ module Curly
6
8
  ActionView::Template.register_template_handler :curly, Curly::TemplateHandler
7
9
 
8
10
  if defined?(CacheDigests::DependencyTracker)
9
- require 'curly/dependency_tracker'
10
11
  CacheDigests::DependencyTracker.register_tracker :curly, Curly::DependencyTracker
11
12
  end
13
+
14
+ if defined?(ActionView::DependencyTracker)
15
+ ActionView::DependencyTracker.register_tracker :curly, Curly::DependencyTracker
16
+ end
12
17
  end
13
18
  end
14
19
  end
@@ -28,7 +28,6 @@ class Curly::TemplateHandler
28
28
  presenter_class = Curly::Presenter.presenter_for_path(path)
29
29
 
30
30
  source = Curly.compile(template.source, presenter_class)
31
- template_digest = Digest::MD5.hexdigest(template.source)
32
31
 
33
32
  <<-RUBY
34
33
  if local_assigns.empty?
@@ -46,8 +45,6 @@ class Curly::TemplateHandler
46
45
  if key = presenter.cache_key
47
46
  @output_buffer = ActiveSupport::SafeBuffer.new
48
47
 
49
- template_digest = #{template_digest.inspect}
50
-
51
48
  if #{presenter_class}.respond_to?(:cache_key)
52
49
  presenter_key = #{presenter_class}.cache_key
53
50
  else
@@ -58,7 +55,7 @@ class Curly::TemplateHandler
58
55
  expires_in: presenter.cache_duration
59
56
  }
60
57
 
61
- cache([template_digest, key, presenter_key].compact, options) do
58
+ cache([key, presenter_key].compact, options) do
62
59
  safe_concat(view_function.call)
63
60
  end
64
61
 
@@ -9,8 +9,14 @@ describe Curly::Presenter do
9
9
 
10
10
  include MonkeyComponents
11
11
 
12
- presents :midget, :clown
13
- attr_reader :midget, :clown
12
+ presents :midget, :clown, default: nil
13
+ presents :elephant, default: "Dumbo"
14
+
15
+ attr_reader :midget, :clown, :elephant
16
+ end
17
+
18
+ class FrenchCircusPresenter < CircusPresenter
19
+ presents :elephant, default: "Babar"
14
20
  end
15
21
 
16
22
  it "sets the presented parameters as instance variables" do
@@ -25,6 +31,18 @@ describe Curly::Presenter do
25
31
  presenter.clown.should == "Bubbles"
26
32
  end
27
33
 
34
+ it "allows specifying default values for parameters" do
35
+ context = double("context")
36
+
37
+ # Make sure subclasses can change default values.
38
+ french_presenter = FrenchCircusPresenter.new(context)
39
+ french_presenter.elephant.should == "Babar"
40
+
41
+ # The subclass shouldn't change the superclass' defaults, though.
42
+ presenter = CircusPresenter.new(context)
43
+ presenter.elephant.should == "Dumbo"
44
+ end
45
+
28
46
  describe ".presenter_for_path" do
29
47
  it "returns the presenter class for the given path" do
30
48
  presenter = double("presenter")
@@ -47,6 +65,26 @@ describe Curly::Presenter do
47
65
  end
48
66
  end
49
67
 
68
+ describe ".available_methods" do
69
+ it "includes the methods on the presenter" do
70
+ CircusPresenter.available_methods.should include(:midget)
71
+ end
72
+
73
+ it "does not include methods on the Curly::Presenter base class" do
74
+ CircusPresenter.available_methods.should_not include(:cache_key)
75
+ end
76
+ end
77
+
78
+ describe ".method_available?" do
79
+ it "returns true if the method is available" do
80
+ CircusPresenter.method_available?(:midget).should be_true
81
+ end
82
+
83
+ it "returns false if the method is not available" do
84
+ CircusPresenter.method_available?(:bear).should be_false
85
+ end
86
+ end
87
+
50
88
  describe ".version" do
51
89
  it "sets the version of the presenter" do
52
90
  presenter1 = Class.new(Curly::Presenter) do
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,12 @@
1
1
  require 'active_support/all'
2
+
3
+ if ENV['CI']
4
+ begin
5
+ require 'coveralls'
6
+ Coveralls.wear!
7
+ rescue LoadError
8
+ STDERR.puts "Failed to load Coveralls"
9
+ end
10
+ end
11
+
2
12
  require 'curly'
@@ -123,16 +123,6 @@ describe Curly::TemplateHandler do
123
123
  output.should == "BAZ"
124
124
  end
125
125
 
126
- it "adds a digest of the template source to the cache key" do
127
- context.assigns[:cache_key] = "x"
128
-
129
- template.stub(:source) { "{{bar}}" }
130
- output.should == "BAR"
131
-
132
- template.stub(:source) { "FOO{{bar}}" }
133
- output.should == "FOOBAR"
134
- end
135
-
136
126
  it "adds the presenter class' cache key to the instance's cache key" do
137
127
  # Make sure caching is enabled
138
128
  context.assigns[:cache_key] = "x"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curly-templates
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-05-03 00:00:00.000000000 Z
12
+ date: 2013-05-22 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionpack
@@ -145,7 +145,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
145
145
  version: '0'
146
146
  segments:
147
147
  - 0
148
- hash: -1185334728510665354
148
+ hash: 2436310145351861333
149
149
  required_rubygems_version: !ruby/object:Gem::Requirement
150
150
  none: false
151
151
  requirements: