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.
- data/History.txt +5 -0
- data/README.rdoc +13 -0
- data/lib/ruby_less/info.rb +1 -1
- data/lib/ruby_less/processor.rb +22 -0
- data/rubyless.gemspec +2 -2
- data/test/RubyLess/basic.yml +19 -4
- data/test/RubyLess_test.rb +9 -3
- data/test/typed_string_test.rb +8 -1
- metadata +4 -4
data/History.txt
CHANGED
data/README.rdoc
CHANGED
@@ -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
|
data/lib/ruby_less/info.rb
CHANGED
data/lib/ruby_less/processor.rb
CHANGED
@@ -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
|
data/rubyless.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rubyless}
|
8
|
-
s.version = "0.8.
|
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-
|
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 = [
|
data/test/RubyLess/basic.yml
CHANGED
@@ -118,10 +118,25 @@ instance_variable:
|
|
118
118
|
tem: "node.mazette"
|
119
119
|
res: "Mazette !"
|
120
120
|
|
121
|
-
|
122
|
-
src: "
|
123
|
-
tem: "add(10, 4)"
|
124
|
-
res: "
|
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"
|
data/test/RubyLess_test.rb
CHANGED
@@ -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 == ['
|
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(
|
149
|
-
a+
|
154
|
+
def add(*args)
|
155
|
+
args.inject(0) {|s,a| s+a}
|
150
156
|
end
|
151
157
|
|
152
158
|
def vowel_count(str)
|
data/test/typed_string_test.rb
CHANGED
@@ -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:
|
4
|
+
hash: 53
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 8
|
9
|
-
-
|
10
|
-
version: 0.8.
|
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-
|
18
|
+
date: 2011-07-11 00:00:00 +02:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|