rubyless 0.8.4 → 0.8.5

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.
@@ -1,3 +1,8 @@
1
+ == 0.8.5
2
+
3
+ * Minor enhancements
4
+ * Added support for append_args and multiple prepend arguments.
5
+
1
6
  == 0.8.4 2011-06-15
2
7
 
3
8
  * Minor enhancements
@@ -65,6 +65,19 @@ You can look at the tests for an idea of how to declare things. If you have more
65
65
 
66
66
  http://zenadmin.org/community
67
67
 
68
+ == TRICKS:
69
+
70
+ If you define your own 'safe_method_type' resolution methods, or you define a method by providing a symbol (method executed to get type), you can use the special :prepend_args and :append_args elements in the type response. You need to provide a TypedString or an array of TypedString and these elements will be inserted in the final method. This can be used to provide default values:
71
+
72
+ safe_method_type [:parse_date, String] => :get_parse_date
73
+
74
+ def get_parse_date(signature)
75
+ {:class => Time, :append_args => RubyLess::TypedString.new('visitor.tz', :class => TZInfo::Timezone)}
76
+ end
77
+
78
+ # parse_date('2003-12-01')
79
+ # ==> parse_date('2003-12-01', visitor.tz)
80
+
68
81
  == WARNING:
69
82
 
70
83
  Changing the safe methods during runtime removes the cache for all classes and
@@ -1,3 +1,3 @@
1
1
  module RubyLess
2
- VERSION = '0.8.4'
2
+ VERSION = '0.8.5'
3
3
  end
@@ -400,6 +400,9 @@ module RubyLess
400
400
 
401
401
  def args_with_prepend(args, opts)
402
402
  if prepend_args = opts[:prepend_args]
403
+ if prepend_args.kind_of?(Array)
404
+ prepend_args = array_to_arguments(prepend_args)
405
+ end
403
406
  if args
404
407
  prepend_args.append_argument(args)
405
408
  args = prepend_args
@@ -408,6 +411,17 @@ module RubyLess
408
411
  end
409
412
  end
410
413
 
414
+ if append_args = opts[:append_args]
415
+ if append_args.kind_of?(Array)
416
+ append_args = array_to_arguments(append_args)
417
+ end
418
+ if args
419
+ args.append_argument(append_args)
420
+ else
421
+ args = append_args
422
+ end
423
+ end
424
+
411
425
  if append_hash = opts[:append_hash]
412
426
  last_arg = args.list.last
413
427
  unless last_arg.klass.kind_of?(Hash)
@@ -422,5 +436,13 @@ module RubyLess
422
436
  end
423
437
  args
424
438
  end
439
+
440
+ def array_to_arguments(args)
441
+ code = t('')
442
+ args.each do |arg|
443
+ code.append_argument(arg)
444
+ end
445
+ code
446
+ end
425
447
  end
426
448
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rubyless}
8
- s.version = "0.8.4"
8
+ s.version = "0.8.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{2011-06-15}
12
+ s.date = %q{2011-07-11}
13
13
  s.description = %q{RubyLess is an interpreter for "safe ruby". The idea is to transform some "unsafe" ruby code into safe, type checked ruby, eventually rewriting some variables or methods.}
14
14
  s.email = %q{gaspard@teti.ch}
15
15
  s.extra_rdoc_files = [
@@ -118,10 +118,25 @@ instance_variable:
118
118
  tem: "node.mazette"
119
119
  res: "Mazette !"
120
120
 
121
- prepend_arg:
122
- src: "prepend_test(4)"
123
- tem: "add(10, 4)"
124
- res: "14"
121
+ prepend_one:
122
+ src: "prepend_one(4) + prepend_one"
123
+ tem: "(add(10, 4)+add(10))"
124
+ res: "24"
125
+
126
+ prepend_many:
127
+ src: "prepend_many(4) + prepend_many"
128
+ tem: "(add(10, 20, 4)+add(10, 20))"
129
+ res: "64"
130
+
131
+ append_one:
132
+ src: "append_one(4) + append_one"
133
+ tem: "(add(4, 10)+add(10))"
134
+ res: "24"
135
+
136
+ append_many:
137
+ src: "append_many(4) + append_many"
138
+ tem: "(add(4, 10, 20)+add(10, 20))"
139
+ res: "64"
125
140
 
126
141
  safe_property:
127
142
  src: "dog_name"
@@ -98,8 +98,14 @@ class RubyLessTest < Test::Unit::TestCase
98
98
  # Example to dynamically rewrite method calls during compilation
99
99
  def safe_method_type(signature, receiver = nil)
100
100
  unless res = super
101
- if signature == ['prepend_test', Number]
101
+ if signature == ['prepend_one'] || signature == ['prepend_one', Number]
102
102
  res ={:class => Number, :prepend_args => RubyLess::TypedString.new('10', :class => Number), :method => 'add'}
103
+ elsif signature == ['prepend_many'] || signature == ['prepend_many', Number]
104
+ res ={:class => Number, :prepend_args => [RubyLess::TypedString.new('10', :class => Number), RubyLess::TypedString.new('20', :class => Number)], :method => 'add'}
105
+ elsif signature == ['append_one'] || signature == ['append_one', Number]
106
+ res ={:class => Number, :append_args => RubyLess::TypedString.new('10', :class => Number), :method => 'add'}
107
+ elsif signature == ['append_many'] || signature == ['append_many', Number]
108
+ res ={:class => Number, :append_args => [RubyLess::TypedString.new('10', :class => Number), RubyLess::TypedString.new('20', :class => Number)], :method => 'add'}
103
109
  elsif context && res = context[:node_class].safe_method_type(signature)
104
110
  # try to execute method in the current var "var.method"
105
111
  res = res[:class].call(self, signature) if res[:class].kind_of?(Proc)
@@ -145,8 +151,8 @@ class RubyLessTest < Test::Unit::TestCase
145
151
  "str"
146
152
  end
147
153
 
148
- def add(a,b)
149
- a+b
154
+ def add(*args)
155
+ args.inject(0) {|s,a| s+a}
150
156
  end
151
157
 
152
158
  def vowel_count(str)
@@ -11,9 +11,16 @@ class TypedStringTest < Test::Unit::TestCase
11
11
  should 'render with name' do
12
12
  assert_equal 'foo', subject.to_s
13
13
  end
14
-
14
+
15
15
  should 'return class of content on klass' do
16
16
  assert_equal Number, subject.klass
17
17
  end
18
+
19
+ should 'maintain opts on dup' do
20
+ other = subject.dup
21
+ assert_equal TypedString, other.class
22
+ assert_equal subject.opts, other.opts
23
+ assert_equal subject.opts.object_id, other.opts.object_id
24
+ end
18
25
  end
19
26
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubyless
3
3
  version: !ruby/object:Gem::Version
4
- hash: 55
4
+ hash: 53
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 4
10
- version: 0.8.4
9
+ - 5
10
+ version: 0.8.5
11
11
  platform: ruby
12
12
  authors:
13
13
  - Gaspard Bucher
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-06-15 00:00:00 +02:00
18
+ date: 2011-07-11 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency