merbiful-release 0.1.2 → 0.2.1

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 (38) hide show
  1. data/Rakefile +1 -3
  2. data/lib/merbiful-release/admin.rb +15 -11
  3. data/lib/merbiful-release/admin.rb~ +3 -275
  4. data/lib/merbiful-release/body.rb +10 -2
  5. data/lib/merbiful-release/body.rb~ +6 -27
  6. data/lib/merbiful-release/controller.rb~ +12 -0
  7. data/lib/merbiful-release/css.rb~ +5 -20
  8. data/lib/merbiful-release/erubis.rb~ +2 -4
  9. data/lib/merbiful-release/eruby.rb~ +11 -0
  10. data/lib/merbiful-release/filters.rb +4 -9
  11. data/lib/merbiful-release/haml.rb~ +1 -13
  12. data/lib/merbiful-release/js.rb~ +11 -25
  13. data/lib/merbiful-release/layout.rb~ +18 -46
  14. data/lib/merbiful-release/merbiful.rb~ +8 -0
  15. data/lib/merbiful-release/page.rb~ +24 -76
  16. data/lib/merbiful-release/relative_time.rb~ +78 -0
  17. data/lib/merbiful-release/routes.rb~ +4 -0
  18. data/lib/merbiful-release/version.rb~ +45 -0
  19. data/lib/merbiful-release.rb +0 -4
  20. data/lib/merbiful-release.rb~ +1 -28
  21. data/templates/admin.css +5 -0
  22. data/templates/admin.css~ +2 -13
  23. data/templates/admin_layout.html.haml~ +5 -6
  24. data/templates/admin_layout.html.rhtml~ +10 -0
  25. data/templates/css.html.haml~ +7 -10
  26. data/templates/index.html.haml~ +2 -0
  27. data/templates/js.html.haml~ +22 -22
  28. data/templates/layouts.html.haml~ +0 -26
  29. data/templates/page_form.html.haml~ +1 -41
  30. data/templates/pages.html.haml~ +3 -0
  31. metadata +35 -52
  32. data/lib/merbiful-release/erubis.rb +0 -13
  33. data/lib/merbiful-release/filters.rb~ +0 -22
  34. data/lib/merbiful-release/haml.rb +0 -23
  35. data/lib/merbiful-release/images.rb~ +0 -14
  36. data/lib/merbiful-release/string.rb~ +0 -16
  37. data/templates/css.html.haml.orig +0 -28
  38. data/templates/images.html.haml~ +0 -17
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
5
5
 
6
6
  PLUGIN = "merbiful-release"
7
7
  NAME = "merbiful-release"
8
- GEM_VERSION = "0.1.2"
8
+ GEM_VERSION = "0.2.1"
9
9
  AUTHOR = "Martin Kihlgren"
10
10
  EMAIL = "martin@wemind.se"
11
11
  HOMEPAGE = ""
@@ -21,8 +21,6 @@ spec = Gem::Specification.new do |s|
21
21
  s.author = AUTHOR
22
22
  s.email = EMAIL
23
23
  s.homepage = HOMEPAGE
24
- s.add_dependency('merb-core', '>= 0.9.5')
25
- s.add_dependency('dm-core', '>= 0.9.5')
26
24
  s.require_path = 'lib'
27
25
  s.autorequire = PLUGIN
28
26
  s.files = %w(Rakefile LICENSE) + Dir.glob("{lib,specs,templates}/**/*")
@@ -88,18 +88,23 @@ module Merbiful
88
88
  @form_page = Page.get(params[:page_id])
89
89
  if request.post?
90
90
  params[:page][:cached] = !!params[:page][:cached]
91
+
91
92
  @form_page.update_attributes(params[:page])
93
+
94
+ version_csses = params[:version].delete(:css)
95
+ version_jses = params[:version].delete(:js)
96
+
97
+ @form_version = Page::Version.new(params[:version].merge(:page => @form_page))
98
+
99
+ version_csses.each do |css|
100
+ @form_version.add_css(Css.get(css))
101
+ end if version_csses
102
+ version_jses.each do |js|
103
+ @form_version.add_js(Js.get(js))
104
+ end if version_jses
105
+
92
106
  if @form_page.valid?
93
107
  @form_page.save
94
- version_csses = params[:version].delete(:css)
95
- version_jses = params[:version].delete(:js)
96
- @form_version = Page::Version.new(params[:version].merge(:page => @form_page))
97
- version_csses.each do |css|
98
- @form_version.add_css(Css.get(css))
99
- end if version_csses
100
- version_jses.each do |js|
101
- @form_version.add_js(Js.get(js))
102
- end if version_jses
103
108
  if @form_version.valid?
104
109
  @form_version.save
105
110
  redirect url(:merbiful_admin, :action => "pages", :page_id => @form_page.id)
@@ -224,9 +229,8 @@ module Merbiful
224
229
  end
225
230
 
226
231
  def errors(obj, meth)
227
- return ""
228
232
  if obj.errors.on(meth)
229
- obj.errors.on(meth).join(", ")
233
+ "<div class='error'>#{obj.errors.on(meth).join(", ")}</div>"
230
234
  else
231
235
  ""
232
236
  end
@@ -1,282 +1,10 @@
1
1
 
2
2
  module Merbiful
3
3
 
4
- class Admin < Merb::Controller
5
-
6
- include RelativeTimeHelpers
7
-
8
- def index
9
- render_template_with_layout("index.html.haml")
10
- end
11
-
12
- def layouts
13
- @form_layout = Layout.get(params[:layout_id])
14
- if request.post?
15
- @form_layout.update_attributes(params[:layout])
16
- if @form_layout.valid?
17
- @form_layout.save
18
- @form_version = Layout::Version.new(params[:version].merge(:layout => @form_layout))
19
- if @form_version.valid?
20
- @form_version.save
21
- redirect url(:merbiful_admin, :action => "layouts", :layout_id => @form_layout.id)
22
- end
23
- end
24
- else
25
- if @form_layout
26
- @form_version = Layout::Version.get(params[:version_id])
27
- @form_version = @form_layout.latest unless @form_version
28
- end
29
- end
30
- render_template_with_layout("layouts.html.haml")
31
- end
32
-
33
- def js
34
- @form_js = Js.get(params[:js_id])
35
- if request.post?
36
- params[:js][:cached] = !!params[:js][:cached]
37
- @form_js.update_attributes(params[:js])
38
- if @form_js.valid?
39
- @form_js.save
40
- @form_version = Js::Version.new(params[:version].merge(:js => @form_js))
41
- if @form_version.valid?
42
- @form_version.save
43
- redirect url(:merbiful_admin, :action => "js", :js_id => @form_js.id)
44
- end
45
- end
46
- else
47
- if @form_js
48
- @form_version = Js::Version.get(params[:version_id])
49
- @form_version = @form_js.latest unless @form_version
50
- end
51
- end
52
- render_template_with_layout("js.html.haml")
53
- end
54
-
55
- def images
56
- if request.post?
57
- end
58
- render_template_with_layout("images.html.haml")
59
- end
60
-
61
- def css
62
- @form_css = Css.get(params[:css_id])
63
- if request.post?
64
- params[:css][:cached] = !!params[:css][:cached]
65
- @form_css.update_attributes(params[:css])
66
- if @form_css.valid?
67
- @form_css.save
68
- @form_version = Css::Version.new(params[:version].merge(:css => @form_css))
69
- if @form_version.valid?
70
- @form_version.save
71
- redirect url(:merbiful_admin, :action => "css", :css_id => @form_css.id)
72
- end
73
- end
74
- else
75
- if @form_css
76
- @form_version = Css::Version.get(params[:version_id])
77
- @form_version = @form_css.latest unless @form_version
78
- end
79
- end
80
- render_template_with_layout("css.html.haml")
81
- end
82
-
83
- def pages
84
- if Page.count == 0
85
- new_root = Page.create(:path => "/")
86
- new_root_version = Page::Version.create(:page => new_root, :body => "Here be Dagon")
87
- end
88
- @form_page = Page.get(params[:page_id])
89
- if request.post?
90
- params[:page][:cached] = !!params[:page][:cached]
91
- @form_page.update_attributes(params[:page])
92
- if @form_page.valid?
93
- @form_page.save
94
- version_csses = params[:version].delete(:css)
95
- version_jses = params[:version].delete(:js)
96
- @form_version = Page::Version.new(params[:version].merge(:page => @form_page))
97
- version_csses.each do |css|
98
- @form_version.add_css(Css.get(css))
99
- end if version_csses
100
- version_jses.each do |js|
101
- @form_version.add_js(Js.get(js))
102
- end if version_jses
103
- if @form_version.valid?
104
- @form_version.save
105
- redirect url(:merbiful_admin, :action => "pages", :page_id => @form_page.id)
106
- end
107
- end
108
- else
109
- if @form_page
110
- @form_version = Page::Version.get(params[:version_id])
111
- @form_version = @form_page.latest unless @form_version
112
- end
113
- end
114
- render_with_layout(Page.all(:parent_id => nil).collect do |page|
115
- "<ul class='root'>\n#{render_page(page)}\n</ul>"
116
- end.join("\n"))
117
- end
118
-
119
- def render_css
120
- read_template("admin.css")
121
- end
122
-
123
- def destroy_page
124
- page = Page.get(params[:page_id])
125
- page.destroy
126
- redirect url(:merbiful_admin, :action => "pages")
127
- end
128
-
129
- def upload_image
130
- path = Pathname.new(File.join(Merb.root, "public", "images", File.basename(params[:image][:filename])))
131
- raise "H4xx0r" unless path.to_s.index(Pathname.new(Merb.root).expand_path.to_s) == 0
132
- Pathname.new(params[:image][:tempfile].path).rename(path)
133
- redirect url(:merbiful_admin, :action => "images")
134
- end
135
-
136
- def delete_image
137
- path = Pathname.new(File.join(Merb.root, "public", params[:path])).expand_path
138
- raise "H4xx0r" unless path.to_s.index(Pathname.new(Merb.root).expand_path.to_s) == 0
139
- path.unlink
140
- redirect url(:merbiful_admin, :action => "images")
141
- end
142
-
143
- def destroy_layout
144
- layout = Layout.get(params[:layout_id])
145
- layout.destroy
146
- redirect url(:merbiful_admin, :action => "layouts")
147
- end
148
-
149
- def destroy_css
150
- css = Css.get(params[:css_id])
151
- css.destroy
152
- redirect url(:merbiful_admin, :action => "css")
153
- end
154
-
155
- def destroy_js
156
- js = Js.get(params[:js_id])
157
- js.destroy
158
- redirect url(:merbiful_admin, :action => "js")
159
- end
160
-
161
- def create_page
162
- parent = Page.get(params[:parent_id])
163
- new_page = Page.create(:parent => parent, :path => next_path(parent.path))
164
- new_page_version = Page::Version.create(:page => new_page)
165
- redirect url(:merbiful_admin, :action => "pages", :page_id => new_page.id)
166
- end
167
-
168
- def create_css
169
- new_css = Css.create(:name => next_name(Css))
170
- new_css_version = Css::Version.create(:css => new_css)
171
- redirect url(:merbiful_admin, :action => 'css', :css_id => new_css.id)
172
- end
173
-
174
- def create_js
175
- new_js = Js.create(:name => next_name(Js))
176
- new_js_version = Js::Version.create(:js => new_js)
177
- redirect url(:merbiful_admin, :action => 'js', :js_id => new_js.id)
178
- end
179
-
180
- def create_layout
181
- new_layout = Layout.create(:name => next_name(Layout))
182
- new_layout_version = Layout::Version.create(:layout => new_layout)
183
- redirect url(:merbiful_admin, :action => 'layouts', :layout_id => new_layout.id)
184
- end
185
-
186
- def move_page_up
187
- page = Page.get(params[:page_id])
188
- page.position -= 1
189
- page.save
190
- redirect url(:merbiful_admin, :action => "pages")
191
- end
192
-
193
- def move_page_down
194
- page = Page.get(params[:page_id])
195
- page.position += 1
196
- page.save
197
- redirect url(:merbiful_admin, :action => "pages")
198
- end
199
-
200
- private
201
-
202
- def confirm(message)
203
- "return confirm('#{message}');"
204
- end
205
-
206
- def text_area_rows
207
- 20
208
- end
209
-
210
- def next_path(parent_path)
211
- index = 0
212
- while Page.first(:path => File.join(parent_path, index.to_s))
213
- index += 1
214
- end
215
- return File.join(parent_path, index.to_s)
216
- end
217
-
218
- def next_name(klass)
219
- index = 0
220
- while klass.first(:name => index.to_s)
221
- index += 1
222
- end
223
- return index.to_s
224
- end
225
-
226
- def errors(obj, meth)
227
- return ""
228
- if obj.errors.on(meth)
229
- obj.errors.on(meth).join(", ")
230
- else
231
- ""
232
- end
233
- end
234
-
235
- def render_children(page, ind = "")
236
- rval = []
237
- rval << "<ul class='children'>"
238
- page.children(:order => [:position, :id]).each do |child|
239
- rval << render_page(child, ind + " ")
240
- end
241
- rval << "</ul>"
242
- return rval.collect do |line| ind + line end.join("\n")
243
- end
4
+ class Controller < Merb::Controller
244
5
 
245
- def render_page(page, ind = "")
246
- rval = []
247
- rval << "<li class='page'>"
248
- rval << "<ul class='page_info info'>"
249
- rval << "<a href='#{url(:merbiful_admin, :action => 'pages', :page_id => page.id)}'>"
250
- rval << "<li class='page_path'>#{page.path}</li>"
251
- rval << "<li class='page_title'>#{page.title || "untitled"}</li>"
252
- rval << "<li class='page_version'>ver##{page.latest.id} (#{time_ago_in_words(page.latest.created_at)} ago)</li>"
253
- rval << "</a>"
254
- rval << "<li class='up'><a href='#{url(:merbiful_admin, :action => 'move_page_up', :page_id => page.id)}'>&uarr;</a></li>"
255
- rval << "<li class='down'><a href='#{url(:merbiful_admin, :action => 'move_page_down', :page_id => page.id)}'>&darr;</a></li>"
256
- rval << "<li class='remove'><a href='#{url(:merbiful_admin, :action => 'destroy_page', :page_id => page.id)}' onclick=\"#{confirm("Are you absolutely certain that you want to destroy the page at #{page.path}? All versions will be irreversibly destroyed.")}\">-</a></li>" unless page.parent_id.nil?
257
- rval << "<li class='append'><a href='#{url(:merbiful_admin, :action => 'create_page', :parent_id => page.id)}'>+</a></li>"
258
- rval << "</ul>"
259
- rval << render_template_without_layout("page_form.html.haml") if params[:page_id].to_s == page.id.to_s
260
- rval << render_children(page, ind) unless page.children.empty?
261
- rval << "</li>"
262
- return rval.collect do |line| ind + line end.join("\n")
263
- end
264
-
265
- def read_template(template)
266
- Pathname.new(__FILE__).parent.parent.parent.join("templates").join(template).read
267
- end
268
-
269
- def render_with_layout(text)
270
- throw_content :for_layout, text
271
- ::Haml::Engine.new(read_template("admin_layout.html.haml")).render(self)
272
- end
273
-
274
- def render_template_with_layout(template)
275
- render_with_layout(::Haml::Engine.new(read_template(template)).render(self))
276
- end
277
-
278
- def render_template_without_layout(template)
279
- ::Haml::Engine.new(read_template(template)).render(self)
6
+ def display(what)
7
+ render what.inspect
280
8
  end
281
9
 
282
10
  end
@@ -3,12 +3,20 @@ module Merbiful
3
3
 
4
4
  module Body
5
5
 
6
+ FAKE_IO_CLASS = Struct.new(:read, :path)
7
+
8
+ def render_id
9
+ Merb::Template.template_name("#{self.class}##{self.id}")
10
+ end
11
+
6
12
  def render(controller, caches = {})
7
13
  rval = if self.filter.blank?
8
14
  self.body
9
15
  else
10
- filter_class = Merbiful.const_get(self.filter.to_sym)
11
- filter_class.new.render(self.body, controller)
16
+ controller.send(Merb::Template::METHOD_LIST[render_id] ||=
17
+ Merb::Template::EXTENSIONS[self.filter].compile_template(FAKE_IO_CLASS.new(self.body, render_id),
18
+ render_id,
19
+ Merb::InlineTemplates))
12
20
  end
13
21
  unless Merb.environment == "development"
14
22
  caches.each do |destination, to_cache|
@@ -2,35 +2,14 @@
2
2
  module Merbiful
3
3
 
4
4
  module Body
5
-
6
- def render(controller, caches = {})
7
- rval = if self.filter.blank?
8
- self.body
9
- else
10
- filter_class = Merbiful.const_get(self.filter.to_sym)
11
- filter_class.new.render(self.body, controller)
12
- end
13
- unless Merb.environment == "development"
14
- caches.each do |destination, to_cache|
15
- if to_cache
16
- path = Pathname.new(File.join(Merb.root, "public", destination))
17
- Merb.logger.info("Flushing to #{path.inspect}")
18
- path.parent.mkpath
19
- path.open("w") do |out|
20
- out.write(rval)
21
- end
22
- end
23
- end
5
+ def to_html(controller)
6
+ if self.filter.nil?
7
+ self.body
8
+ else
9
+ filter_class = Merbiful.const_get(self.filter.to_sym)
10
+ filter_class.new.render(self.body, controller)
24
11
  end
25
- return rval
26
- end
27
-
28
- def clear_cache(target)
29
- return if target == "/"
30
- path = Pathname.new(File.join(Merb.root, "public", target))
31
- path.unlink if path.exist?
32
12
  end
33
-
34
13
  end
35
14
 
36
15
  end
@@ -0,0 +1,12 @@
1
+
2
+ module Merbiful
3
+
4
+ class Controller < Merb::Controller
5
+
6
+ def display(what)
7
+ render what.inspect
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -17,34 +17,23 @@ module Merbiful
17
17
  property :updated_at, DateTime
18
18
 
19
19
  has n, :css_nesses, :class_name => "Merbiful::Css::Ness"
20
- has n, :page_versions, :through => :css_nesses, :class_name => "Merbiful::Page::Version", :child_key => [:css_id]
20
+ has n, :page_versions, :through => :css_nesses, :class_name => "Merbiful::Page::Version"
21
21
  has n, :css_versions, :class_name => "Merbiful::Css::Version"
22
22
 
23
- before :destroy do
24
- css_nesses.destroy!
25
- css_versions.destroy!
26
- end
27
-
28
23
  def latest
29
- css_versions.first(:css_id => self.id, :order => [:id.desc])
24
+ css_versions.first(:order => [:id.desc])
30
25
  end
31
26
 
32
- def_delegators :latest, :render, :body, :filter
33
-
34
- def path
35
- "/stylesheets/#{latest.id}"
36
- end
27
+ def_delegators :latest, :render
37
28
 
38
29
  class Ness
39
30
  include DataMapper::Resource
40
31
  include DataMapper::Validate
41
32
 
42
33
  property :id, Serial
43
- property :page_version_id, Integer
44
- property :css_id, Integer
45
34
 
46
- belongs_to :css, :class_name => "Merbiful::Css", :child_key => [:css_id]
47
- belongs_to :page_version, :class_name => "Merbiful::Page::Version", :child_key => [:page_version_id]
35
+ belongs_to :css, :class_name => "Merbiful::Css"
36
+ belongs_to :page_version, :class_name => "Merbiful::Page::Version"
48
37
  end
49
38
 
50
39
  class Version
@@ -65,10 +54,6 @@ module Merbiful
65
54
 
66
55
  belongs_to :css, :class_name => "Merbiful::Css"
67
56
 
68
- before :save do
69
- clear_cache(css.path) if css.latest
70
- end
71
-
72
57
  end
73
58
 
74
59
  end
@@ -1,13 +1,11 @@
1
1
  module Merbiful
2
2
 
3
- class Erubis
3
+ class Eruby
4
4
 
5
5
  def render(text, scope)
6
- ::Erubis::Eruby.new(text).result(scope.instance_eval do binding end)
6
+ ERB.new(text).result(scope)
7
7
  end
8
8
 
9
9
  end
10
10
 
11
- FILTERS << Erubis
12
-
13
11
  end
@@ -0,0 +1,11 @@
1
+ module Merbiful
2
+
3
+ class Eruby
4
+
5
+ def render(text, scope)
6
+ ::Haml::Engine.new(text).render(scope)
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -3,17 +3,12 @@ module Merbiful
3
3
 
4
4
  module Filter
5
5
 
6
- @filters = []
7
-
8
- def self.register_filter(filter)
9
- @filters << filter
10
- end
11
-
12
6
  def self.filters
13
- @filters.inject([[nil, "No filter"]]) do |sum, filter|
14
- filter_name = filter.name.gsub(/^Merbiful::/, "")
15
- sum + [[filter_name, filter_name]]
7
+ rval = [[nil, "No filter"]]
8
+ Merb::Template::EXTENSIONS.each do |name, klass|
9
+ rval << [name, klass.name]
16
10
  end
11
+ rval
17
12
  end
18
13
 
19
14
  end
@@ -3,21 +3,9 @@ module Merbiful
3
3
 
4
4
  class Haml
5
5
 
6
- def render(text, scope)
7
- ::Haml::Engine.new(text).render(scope)
6
+ def render(text)
8
7
  end
9
8
 
10
9
  end
11
10
 
12
- class Sass
13
-
14
- def render(text, scope)
15
- ::Sass::Engine.new(text).render
16
- end
17
-
18
- end
19
-
20
- FILTERS << Haml
21
- FILTERS << Sass
22
-
23
11
  end
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Merbiful
3
3
 
4
- class Js
4
+ class Css
5
5
 
6
6
  include DataMapper::Resource
7
7
  include DataMapper::Validate
@@ -10,40 +10,30 @@ module Merbiful
10
10
  property :id, Serial
11
11
 
12
12
  property :name, DataMapper::Types::Text, :nullable => false
13
+ property :media, DataMapper::Types::Text
13
14
  property :cached, Boolean, :default => true, :nullable => false
14
15
 
15
16
  property :created_at, DateTime
16
17
  property :updated_at, DateTime
17
18
 
18
- has n, :js_nesses, :class_name => "Merbiful::Js::Ness"
19
- has n, :page_versions, :through => :js_nesses, :class_name => "Merbiful::Page::Version", :child_key => [:js_id]
20
- has n, :js_versions, :class_name => "Merbiful::Js::Version"
21
-
22
- before :destroy do
23
- js_nesses.destroy!
24
- js_versions.destroy!
25
- end
19
+ has n, :css_nesses, :class_name => "Merbiful::Css::Ness"
20
+ has n, :page_versions, :through => :css_nesses, :class_name => "Merbiful::Page::Version"
21
+ has n, :css_versions, :class_name => "Merbiful::Css::Version"
26
22
 
27
23
  def latest
28
- js_versions.first(:js_id => self.id, :order => [:id.desc])
24
+ css_versions.first(:order => [:id.desc])
29
25
  end
30
26
 
31
- def_delegators :latest, :render, :body, :filter
32
-
33
- def path
34
- "/javascripts/#{latest.id}"
35
- end
27
+ def_delegators :latest, :render
36
28
 
37
29
  class Ness
38
30
  include DataMapper::Resource
39
31
  include DataMapper::Validate
40
32
 
41
33
  property :id, Serial
42
- property :page_version_id, Integer
43
- property :js_id, Integer
44
34
 
45
- belongs_to :js, :class_name => "Merbiful::Js", :child_key => [:js_id]
46
- belongs_to :page_version, :class_name => "Merbiful::Page::Version", :child_key => [:page_version_id]
35
+ belongs_to :css, :class_name => "Merbiful::Css"
36
+ belongs_to :page_version, :class_name => "Merbiful::Page::Version"
47
37
  end
48
38
 
49
39
  class Version
@@ -54,7 +44,7 @@ module Merbiful
54
44
 
55
45
  property :id, Serial
56
46
 
57
- property :js_id, Integer, :index => true, :nullable => false
47
+ property :css_id, Integer, :index => true, :nullable => false
58
48
 
59
49
  property :body, DataMapper::Types::Text
60
50
  property :filter, DataMapper::Types::Text
@@ -62,12 +52,8 @@ module Merbiful
62
52
  property :created_at, DateTime
63
53
  property :updated_at, DateTime
64
54
 
65
- belongs_to :js, :class_name => "Merbiful::Js"
55
+ belongs_to :css, :class_name => "Merbiful::Css"
66
56
 
67
- before :save do
68
- clear_cache(js.path) if js.latest
69
- end
70
-
71
57
  end
72
58
 
73
59
  end