zafu 0.7.4 → 0.7.5

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 0.7.5 2011-01-15
2
+
3
+ * Enhancements
4
+ * Fixed double rendering of zafu block (store) and @var usage.
5
+ * Fixed security hole where include could be used to create erb.
6
+ * Fixed a bug where class conditional in [if] would not render correctly.
7
+ * Better handling of nested dom_id when used with ajax (draggable).
8
+ * Adapted RubyLess resolution to new Proc calls (RubyLess 0.8.1).
9
+ * Removed some Zena specific code.
10
+
1
11
  == 0.7.4 2010-09-25
2
12
 
3
13
  * Minor enhancement
data/lib/zafu/all.rb CHANGED
@@ -5,6 +5,7 @@ require 'zafu/process/ruby_less_processing'
5
5
  require 'zafu/process/context'
6
6
  require 'zafu/process/conditional'
7
7
  require 'zafu/process/forms'
8
+ require 'zafu/security'
8
9
 
9
10
  module Zafu
10
11
  All = [
@@ -15,5 +16,6 @@ module Zafu
15
16
  Zafu::Process::RubyLessProcessing,
16
17
  Zafu::Process::Ajax,
17
18
  Zafu::Process::Forms,
19
+ Zafu::Security,
18
20
  ]
19
21
  end
@@ -14,8 +14,6 @@ module Zafu
14
14
  t.previously_last_modified = nil
15
15
  # end
16
16
  render_for_text @template.render(:file => template_path, :locals => locals, :layout => layout), status
17
- rescue => err
18
- puts err.backtrace.join("\n")
19
17
  end
20
18
  alias_method_chain :render_for_file, :rebuild
21
19
  end
data/lib/zafu/info.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Zafu
2
- VERSION = '0.7.4'
2
+ VERSION = '0.7.5'
3
3
  end
4
4
 
data/lib/zafu/markup.rb CHANGED
@@ -100,9 +100,19 @@ module Zafu
100
100
  if value =~ /^(.*)\#\{(.*)\}(.*)$/
101
101
  @params.delete(key)
102
102
  if $1 == '' && $3 == ''
103
- append_dyn_param(key, "<%= #{RubyLess.translate(helper, $2)} %>")
103
+ code = RubyLess.translate(helper, $2)
104
+ if code.literal
105
+ append_dyn_param(key, helper.form_quote(code.literal.to_s))
106
+ else
107
+ append_dyn_param(key, "<%= #{code} %>")
108
+ end
104
109
  else
105
- append_dyn_param(key, "<%= #{RubyLess.translate_string(helper, value)} %>")
110
+ code = RubyLess.translate_string(helper, value)
111
+ if code.literal
112
+ append_dyn_param(key, helper.form_quote(code.literal.to_s))
113
+ else
114
+ append_dyn_param(key, "<%= #{code} %>")
115
+ end
106
116
  end
107
117
  end
108
118
  end
@@ -22,7 +22,7 @@ module Zafu
22
22
  end
23
23
 
24
24
  def move_to(name, klass, opts={})
25
- NodeContext.new(name, klass, self, opts)
25
+ self.class.new(name, klass, self, opts)
26
26
  end
27
27
 
28
28
  # Since the idiom to write the node context name is the main purpose of this class, it
@@ -38,7 +38,7 @@ module Zafu
38
38
  # Return true if the NodeContext represents an element of the given type. We use 'will_be' because
39
39
  # it is equivalent to 'is_a', but for future objects (during rendering).
40
40
  def will_be?(type)
41
- single_class.ancestors.include?(type)
41
+ single_class <= type
42
42
  end
43
43
 
44
44
  # Return a new node context that corresponds to the current object when rendered alone (in an ajax response or
@@ -48,7 +48,7 @@ module Zafu
48
48
  # ivar name (see #master_class).
49
49
  def as_main(after_class = nil)
50
50
  klass = after_class ? master_class(after_class) : single_class
51
- NodeContext.new("@#{klass.to_s.underscore}", single_class)
51
+ self.class.new("@#{klass.to_s.underscore}", single_class)
52
52
  end
53
53
 
54
54
  # Find the class just afer 'after_class' in the class hierarchy.
@@ -65,6 +65,7 @@ module Zafu
65
65
 
66
66
  # Generate a unique DOM id for this element based on dom_scopes defined in parent contexts.
67
67
  def dom_id(opts = {})
68
+ dom_prefix = opts[:dom_prefix] || self.dom_prefix
68
69
  options = {:list => true, :erb => true}.merge(opts)
69
70
 
70
71
  if options[:erb]
@@ -129,14 +130,16 @@ module Zafu
129
130
  class_name.to_s.underscore
130
131
  end
131
132
 
132
- # Return the class name or the superclass name if the current class is an anonymous class.
133
- # FIXME: just use klass.to_s (so that we can do clever things with 'to_s')
133
+ # Return the 'real' class name or the superclass name if the current class is an anonymous class.
134
134
  def class_name
135
+ klass = single_class
136
+ while klass.name == ''
137
+ klass = klass.superclass
138
+ end
135
139
  if list_context?
136
- klass = single_class
137
- "[#{(klass.name.blank? ? klass.superclass : klass).name}]"
140
+ "[#{klass}]"
138
141
  else
139
- (@klass.name.blank? ? @klass.superclass : @klass).name
142
+ klass.name
140
143
  end
141
144
  end
142
145
 
data/lib/zafu/parser.rb CHANGED
@@ -121,6 +121,7 @@ module Zafu
121
121
  :@out_post => @out_post,
122
122
  :@params => @params.dup,
123
123
  :@method => @method,
124
+ :@var => @var,
124
125
  }
125
126
  end
126
127
 
@@ -237,6 +238,7 @@ module Zafu
237
238
  else
238
239
  @context = context
239
240
  end
241
+ # FIXME: replace with array and join (faster)
240
242
  @result = ""
241
243
  @out_post = ""
242
244
 
@@ -92,7 +92,7 @@ module Zafu
92
92
  end
93
93
 
94
94
  def remove_erb(text)
95
- text.gsub('<%', '&lt;%').gsub('%>', '%&gt;')
95
+ text.gsub('<%', '&lt;%').gsub('%>', '%&gt;').gsub(/<\Z/, '&lt;')
96
96
  end
97
97
 
98
98
  def unescape_ruby
@@ -186,17 +186,18 @@ module Zafu
186
186
 
187
187
  def scan_tag(opts={})
188
188
  #puts "TAG(#{@method}): [#{@text}]"
189
- if @text =~ /\A<r:([\w_]+)([^>]*?)(\/?)>/
189
+ if @text =~ /\A<r:([\w_]+\??)([^>]*?)(\/?)>/
190
190
  #puts "RTAG:#{$~.to_a.inspect}" # ztag
191
191
  eat $&
192
192
  opts.merge!(:method=>$1, :params=>$2)
193
193
  opts.merge!(:text=>'') if $3 != ''
194
194
  make(:void, opts)
195
- elsif @text =~ /\A<(\w+)([^>]*?)do\s*=('([^>]*?[^\\]|)'|"([^>]*?[^\\]|)")([^>]*?)(\/?)>/
196
- #puts "DO:#{($4||$5).inspect}" # do tag
195
+ #elsif @text =~ /\A<(\w+)([^>]*?)do\s*=('([^>]*?[^\\]|)'|"([^>]*?[^\\]|)")([^>]*?)(\/?)>/
196
+ elsif @text =~ /\A<(\w+)([^>]*?)do\s*=('|")([^\3]*?[^\\])\3([^>]*?)(\/?)>/
197
+ #puts "DO:#{$~.to_a.inspect}" # do tag
197
198
  eat $&
198
- opts.merge!(:method=>($4||$5), :html_tag=>$1, :html_tag_params=>$2, :params=>$6)
199
- opts.merge!(:text=>'') if $7 != ''
199
+ opts.merge!(:method=> $4, :html_tag=>$1, :html_tag_params=>$2, :params=>$5)
200
+ opts.merge!(:text=>'') if $6 != ''
200
201
  make(:void, opts)
201
202
  elsif @options[:form] && @text =~ /\A<(input|select|textarea|form)([^>]*?)(\/?)>/
202
203
  eat $&
@@ -219,7 +220,7 @@ module Zafu
219
220
  opts.merge!(:method=>'void', :html_tag=>$1, :params=>{:id => $3[1..-2]}, :html_tag_params=>"#{$2}id=#{$3}#{$4}")
220
221
  opts.merge!(:text=>'') if $5 != ''
221
222
  make(:void, opts)
222
- elsif @end_tag && @text =~ /\A<#{@end_tag}([^>]*?)(\/?)>/
223
+ elsif @end_tag && @text =~ /\A<#{@end_tag.gsub('?', '\\?')}([^>]*?)(\/?)>/
223
224
  #puts "SAME:#{$~.to_a.inspect}" # simple html tag same as end_tag
224
225
  flush $&
225
226
  @end_tag_count += 1 unless $2 == '/'
@@ -242,10 +243,11 @@ module Zafu
242
243
 
243
244
  def scan_asset
244
245
  # puts "ASSET(#{object_id}) [#{@text}]"
245
- if @text =~ /\A<(\w*)([^>]*?)(\/?)>/
246
+ if @text =~ /\A<(\w+)([^>]*?)(\/?)>/
246
247
  eat $&
247
248
  @method = 'rename_asset'
248
- @markup.tag = @end_tag = $1
249
+ @markup.tag = $1
250
+ @end_tag = $1
249
251
  closed = ($3 != '')
250
252
  @params = Markup.parse_params($2)
251
253
  if closed
@@ -263,7 +265,7 @@ module Zafu
263
265
  end
264
266
 
265
267
  def scan_inside_asset
266
- if @text =~ /\A(.*?)<\/#{@end_tag}>/m
268
+ if @text =~ /\A(.*?)<\/#{@end_tag.gsub('?', '\\?')}>/m
267
269
  eat $&
268
270
  store $1
269
271
  leave(:asset)
@@ -208,14 +208,15 @@ module Zafu
208
208
  out wrap("#{expand_with(:onclick=>"[\"#{node.dom_prefix}_add\", \"#{node.dom_prefix}_form\"].each(Element.toggle);#{focus}return false;")}")
209
209
 
210
210
  # New object to render form.
211
+
211
212
  # FIXME: use 'klass' param in r_add or r_form instead of current list content.
212
- new_node = node.move_to("#{var}_new", [node.klass].flatten.first)
213
+ new_node = node.move_to("#{var}_new", [node.klass].flatten.first, :new_record => true)
213
214
 
214
215
  if new_node.will_be?(Node)
215
216
  # FIXME: BUG if we set <r:form klass='Post'/> the user cannot select class with menu...
216
217
 
217
218
  # FIXME: inspect '@context[:form]' to see if it contains v_klass ?
218
- out "<% if #{new_node} = secure(Node) { Node.new_from_class('#{new_node.class_name}') } -%>"
219
+ out "<% if #{new_node} = secure(Node) { Node.new_node('class' => '#{new_node.klass}') } -%>"
219
220
  else
220
221
  out "<% if #{new_node} = #{new_node.class_name}.new -%>"
221
222
  end
@@ -266,12 +267,13 @@ module Zafu
266
267
  # Block visibility of descendance with 'do_list'.
267
268
  def public_descendants
268
269
  all = super
269
- if ['context', 'each', 'block'].include?(self.method)
270
+ if ['context', 'each', 'block'].include?(method)
270
271
  # do not propagate 'form',etc up
271
272
  all.reject do |k,v|
272
273
  ['form','unlink'].include?(k)
273
274
  end
274
- elsif ['if', 'case'].include?(self.method)
275
+ elsif ['if', 'case'].include?(method) || (method =~ /^[A-Z]/)
276
+ # conditional
275
277
  all.reject do |k,v|
276
278
  ['else', 'elsif', 'when'].include?(k)
277
279
  end
@@ -63,7 +63,8 @@ module Zafu
63
63
  res << wrap(expand_with)
64
64
  end
65
65
 
66
- res << expand_with(:in_if => true, :only => /^[A-Z]|else|elsif|when/, :markup => alt_markup)
66
+ only = method == 'case' ? %r{^[A-Z]|else|elsif|when} : %w{else elsif when}
67
+ res << expand_with(:in_if => true, :only => only, :markup => alt_markup)
67
68
  res << "<% end -%>"
68
69
  res
69
70
  end
@@ -28,8 +28,8 @@ module Zafu
28
28
  # Resolve unknown methods by using RubyLess in the current compilation context (the
29
29
  # translate method in RubyLess will call 'safe_method_type' in this module).
30
30
  def rubyless_eval(params = @params)
31
- if @method =~ /^[A-Z]\w+$/
32
- return rubyless_class_scope(@method)
31
+ if @method =~ /^([A-Z]\w+?)\?$/
32
+ return rubyless_class_scope($1)
33
33
  end
34
34
 
35
35
  rubyless_render(@method, params)
@@ -78,7 +78,7 @@ module Zafu
78
78
  def set_markup_attr(markup, key, value)
79
79
  value = value.kind_of?(RubyLess::TypedString) ? value : RubyLess.translate_string(self, value)
80
80
  if value.literal
81
- markup.set_param(key, value.literal)
81
+ markup.set_param(key, form_quote(value.literal))
82
82
  else
83
83
  markup.set_dyn_param(key, "<%= #{value} %>")
84
84
  end
@@ -87,7 +87,7 @@ module Zafu
87
87
  def append_markup_attr(markup, key, value)
88
88
  value = RubyLess.translate_string(self, value)
89
89
  if value.literal
90
- markup.append_param(key, value.literal)
90
+ markup.append_param(key, form_quote(value.literal))
91
91
  else
92
92
  markup.append_dyn_param(key, "<%= #{value} %>")
93
93
  end
@@ -132,7 +132,6 @@ module Zafu
132
132
  # 6. append block as argument (restart 1-5 with xxx(block_string))
133
133
  def get_method_type(signature, added_options = false)
134
134
  node = self.node
135
- raise "#{node.klass.class}" unless node.klass.kind_of?(Array) || node.klass.kind_of?(Class)
136
135
 
137
136
  if type = node_context_from_signature(signature)
138
137
  # Resolve self, @page, @node
@@ -149,11 +148,15 @@ module Zafu
149
148
  elsif node && !node.list_context? && type = safe_method_from(node.klass, signature, node)
150
149
  # not a list_contex
151
150
  # Resolve node context methods: xxx.foo, xxx.bar
152
- type = type[:class].call(self, signature) if type[:class].kind_of?(Proc)
153
- type.merge(:method => "#{node.name}.#{type[:method]}")
151
+ type = type[:class].call(self, node.klass, signature) if type[:class].kind_of?(Proc)
152
+ type.merge(:receiver => RubyLess::TypedString.new(node.name, :class => node.klass))
153
+ elsif node && node.list_context? && type = safe_method_from(Array, signature, node)
154
+ # FIXME: why do we need this here ? Remove with related code in zafu_safe_definitions ?
155
+ type = type[:class].call(self, node.klass, signature) if type[:class].kind_of?(Proc)
156
+ type.merge(:receiver => RubyLess::TypedString.new(node.name, :class => Array, :elem => node.klass.first))
154
157
  elsif node && node.list_context? && type = safe_method_from(node.klass.first, signature, node)
155
- type = type[:class].call(self, signature) if type[:class].kind_of?(Proc)
156
- type.merge(:method => "#{node.name}.first.#{type[:method]}")
158
+ type = type[:class].call(self, node.klass, signature) if type[:class].kind_of?(Proc)
159
+ type.merge(:receiver => RubyLess::TypedString.new("#{node.name}.first", :class => node.klass.first))
157
160
  elsif @rendering_block_owner && @blocks.first.kind_of?(String) && !added_options
158
161
  # Insert the block content into the method: <r:trans>blah</r:trans> becomes trans("blah")
159
162
  signature_with_block = signature.dup
@@ -166,8 +169,8 @@ module Zafu
166
169
  elsif node && !added_options
167
170
  # Try prepending current node before arguments: link("foo") becomes link(var1, "foo")
168
171
  signature_with_node = signature.dup
169
- signature_with_node.insert(1, node.klass)
170
- if type = get_method_type(signature_with_node, added_options = true)
172
+ signature_with_node.insert(1, node.real_class) # node.klass ?
173
+ if type = get_method_type(signature_with_node, true)
171
174
  type.merge(:prepend_args => RubyLess::TypedString.new(node.name, :class => node.klass))
172
175
  else
173
176
  nil
@@ -210,7 +213,7 @@ module Zafu
210
213
  def rubyless_expand(res)
211
214
  if res.klass == String && !@blocks.detect {|b| !b.kind_of?(String)}
212
215
  if lit = res.literal
213
- out lit
216
+ out erb_escape(lit)
214
217
  else
215
218
  out "<%= #{res} %>"
216
219
  end
@@ -224,6 +227,8 @@ module Zafu
224
227
  end
225
228
 
226
229
  def rubyless_class_scope(class_name)
230
+ return parser_error("Cannot scope class in list (use each before filtering).") if node.list_context?
231
+
227
232
  # capital letter ==> class conditional
228
233
  klass = Module.const_get(class_name)
229
234
  if klass.ancestors.include?(node.klass)
@@ -0,0 +1,15 @@
1
+ module Zafu
2
+ module Security
3
+ SECURE_REGEXP = %r{<%|%>|<\Z}
4
+ SAFE_CODE = {'<%' => '&lt;%', '%>' => '%&gt;', '<' => '&lt;'}
5
+ # Make sure translations and other literal values cannot be used to build erb.
6
+ def erb_escape(text)
7
+ # Do not only replace '<%' ! or <r:t>min</r:t>% ==> <% ...
8
+ text.gsub(SECURE_REGEXP) {|code| SAFE_CODE[code]}
9
+ end
10
+
11
+ def form_quote(text)
12
+ erb_escape(text).gsub("'", "&apos;")
13
+ end
14
+ end # Security
15
+ end # Zafu
@@ -121,7 +121,7 @@ class NodeContextTest < Test::Unit::TestCase
121
121
  end
122
122
  end # with a sub-class
123
123
 
124
- context 'with an anonymoys sub-class' do
124
+ context 'with an anonymous sub-class' do
125
125
  subject do
126
126
  NodeContext.new('@node', Class.new(Page))
127
127
  end
@@ -129,7 +129,7 @@ class NodeContextTest < Test::Unit::TestCase
129
129
  should 'return class on class_name' do
130
130
  assert_equal 'Page', subject.class_name
131
131
  end
132
- end # with an anonymoys sub-class
132
+ end # with an anonymous sub-class
133
133
  end
134
134
 
135
135
  context 'In a sub-context' do
@@ -3,6 +3,7 @@ require 'test_helper'
3
3
  class ZafuRubyLessTest < Test::Unit::TestCase
4
4
  include RubyLess
5
5
  def self.process_unknown(callback); end;
6
+ include Zafu::Security
6
7
  include Zafu::Process::RubyLessProcessing
7
8
  def helper; self.class; end
8
9
  safe_method :one => {:class => String, :method => "main_one"}
data/test/zafu/meta.yml CHANGED
@@ -7,6 +7,11 @@ include_with_part:
7
7
  src: "<r:include template='/some/template'><r:with part='a'/><r:with part='b'>new b:<r:include template='/some/template' part='a'/></r:with></r:include>"
8
8
  tem: "<div id='b'>new b:<div id='a'>a</div></div>"
9
9
 
10
+ include_missing_part:
11
+ # part 'a' is moved around
12
+ src: "<r:include template='/some/template' part='bad'/>"
13
+ tem: "<span class='parser_error'><span class='method'>include</span> <span class='message'>'bad' not found in template '/some/template'</span></span>"
14
+
10
15
  missing_template:
11
16
  src: "<r:include template='Foo'/>"
12
17
  tem: "/template 'Foo' not found/"
@@ -17,3 +17,7 @@ trick_erb:
17
17
  include_erb:
18
18
  src: "include: <r:include template='/nasty_erb'/>"
19
19
  tem: "include: this &lt;% puts \"could be\" %&gt; nasty"
20
+
21
+ rubyless_make_erb:
22
+ src: "<p foo='#{\"<\"}%= xx'/>"
23
+ tem: "<p foo='&lt;%= xx'></p>"
data/zafu.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{zafu}
8
- s.version = "0.7.4"
8
+ s.version = "0.7.5"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Gaspard Bucher"]
12
- s.date = %q{2010-09-25}
12
+ s.date = %q{2011-01-15}
13
13
  s.description = %q{Provides a powerful templating language based on xhtml for rails}
14
14
  s.email = %q{gaspard@teti.ch}
15
15
  s.extra_rdoc_files = [
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
38
38
  "lib/zafu/process/forms.rb",
39
39
  "lib/zafu/process/html.rb",
40
40
  "lib/zafu/process/ruby_less_processing.rb",
41
+ "lib/zafu/security.rb",
41
42
  "lib/zafu/template.rb",
42
43
  "lib/zafu/test_helper.rb",
43
44
  "lib/zafu/view_methods.rb",
@@ -67,7 +68,7 @@ Gem::Specification.new do |s|
67
68
  s.homepage = %q{http://zenadmin.org/zafu}
68
69
  s.rdoc_options = ["--charset=UTF-8"]
69
70
  s.require_paths = ["lib"]
70
- s.rubygems_version = %q{1.3.6}
71
+ s.rubygems_version = %q{1.3.7}
71
72
  s.summary = %q{Provides a powerful templating language based on xhtml for rails}
72
73
  s.test_files = [
73
74
  "test/markup_test.rb",
@@ -87,7 +88,7 @@ Gem::Specification.new do |s|
87
88
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
88
89
  s.specification_version = 3
89
90
 
90
- if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
91
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
91
92
  s.add_development_dependency(%q<shoulda>, [">= 0"])
92
93
  s.add_development_dependency(%q<yamltest>, [">= 0.5.0"])
93
94
  s.add_runtime_dependency(%q<rubyless>, [">= 0.7.0"])
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zafu
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 9
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 7
8
- - 4
9
- version: 0.7.4
9
+ - 5
10
+ version: 0.7.5
10
11
  platform: ruby
11
12
  authors:
12
13
  - Gaspard Bucher
@@ -14,16 +15,18 @@ autorequire:
14
15
  bindir: bin
15
16
  cert_chain: []
16
17
 
17
- date: 2010-09-25 00:00:00 +02:00
18
+ date: 2011-01-15 00:00:00 +01:00
18
19
  default_executable:
19
20
  dependencies:
20
21
  - !ruby/object:Gem::Dependency
21
22
  name: shoulda
22
23
  prerelease: false
23
24
  requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
24
26
  requirements:
25
27
  - - ">="
26
28
  - !ruby/object:Gem::Version
29
+ hash: 3
27
30
  segments:
28
31
  - 0
29
32
  version: "0"
@@ -33,9 +36,11 @@ dependencies:
33
36
  name: yamltest
34
37
  prerelease: false
35
38
  requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
36
40
  requirements:
37
41
  - - ">="
38
42
  - !ruby/object:Gem::Version
43
+ hash: 11
39
44
  segments:
40
45
  - 0
41
46
  - 5
@@ -47,9 +52,11 @@ dependencies:
47
52
  name: rubyless
48
53
  prerelease: false
49
54
  requirement: &id003 !ruby/object:Gem::Requirement
55
+ none: false
50
56
  requirements:
51
57
  - - ">="
52
58
  - !ruby/object:Gem::Version
59
+ hash: 3
53
60
  segments:
54
61
  - 0
55
62
  - 7
@@ -88,6 +95,7 @@ files:
88
95
  - lib/zafu/process/forms.rb
89
96
  - lib/zafu/process/html.rb
90
97
  - lib/zafu/process/ruby_less_processing.rb
98
+ - lib/zafu/security.rb
91
99
  - lib/zafu/template.rb
92
100
  - lib/zafu/test_helper.rb
93
101
  - lib/zafu/view_methods.rb
@@ -123,23 +131,27 @@ rdoc_options:
123
131
  require_paths:
124
132
  - lib
125
133
  required_ruby_version: !ruby/object:Gem::Requirement
134
+ none: false
126
135
  requirements:
127
136
  - - ">="
128
137
  - !ruby/object:Gem::Version
138
+ hash: 3
129
139
  segments:
130
140
  - 0
131
141
  version: "0"
132
142
  required_rubygems_version: !ruby/object:Gem::Requirement
143
+ none: false
133
144
  requirements:
134
145
  - - ">="
135
146
  - !ruby/object:Gem::Version
147
+ hash: 3
136
148
  segments:
137
149
  - 0
138
150
  version: "0"
139
151
  requirements: []
140
152
 
141
153
  rubyforge_project:
142
- rubygems_version: 1.3.6
154
+ rubygems_version: 1.3.7
143
155
  signing_key:
144
156
  specification_version: 3
145
157
  summary: Provides a powerful templating language based on xhtml for rails