ruby2ruby 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
data/.autotest CHANGED
@@ -16,6 +16,8 @@ Autotest.add_hook :initialize do |at|
16
16
  end
17
17
  end
18
18
 
19
- require 'autotest/rcov'
20
- Autotest::RCov.command = 'rcov_info'
21
- Autotest::RCov.pattern = 'test/test_ruby2ruby.rb'
19
+ if ENV['RCOV'] then
20
+ require 'autotest/rcov'
21
+ Autotest::RCov.command = 'rcov_info'
22
+ Autotest::RCov.pattern = 'test/test_ruby2ruby.rb'
23
+ end
data/History.txt CHANGED
@@ -1,3 +1,18 @@
1
+ === 1.2.2 / 2009-01-20
2
+
3
+ * 3 minor enhancements:
4
+
5
+ * Added -s to display sexp before printing r2r
6
+ * Added a bunch of backslash and masgn tests.
7
+ * Refactored tests.
8
+
9
+ * 4 bug fixes:
10
+
11
+ * Fixed iters to deal with empty bodies.
12
+ * Fixed process_call for a number of cases incl [], []=, and args processing.
13
+ * Fixed process_hash to always generate braces if in arglist.
14
+ * Switched process_alias to producing alias again, needed for globals.
15
+
1
16
  === 1.2.1 / 2008-11-04
2
17
 
3
18
  * 1 bug fix:
data/bin/r2r_show CHANGED
@@ -1,15 +1,17 @@
1
- #!/usr/local/bin/ruby -ws
1
+ #!/usr/bin/ruby -ws
2
2
 
3
- begin require 'rubygems' rescue LoadError end
3
+ require 'rubygems'
4
4
  require 'ruby2ruby'
5
5
  require 'parse_tree'
6
6
 
7
7
  $h ||= false
8
+ $s ||= false
8
9
 
9
10
  if $h then
10
11
  puts "usage: #{File.basename $0} [options] [file...]"
11
12
  puts "options:"
12
- puts "-h : display usage"
13
+ puts "-h : display usage"
14
+ puts "-s : print the sexp before displaying the translated ruby"
13
15
 
14
16
  exit 1
15
17
  end
@@ -22,7 +24,9 @@ ruby2ruby = Ruby2Ruby.new
22
24
  ARGV.each do |file|
23
25
  ruby = file == "-" ? $stdin.read : File.read(file)
24
26
 
25
- sexp = parse_tree.parse_tree_for_string(ruby, file).first
27
+ sexp = parse_tree.process(ruby, nil, file)
28
+
29
+ p sexp if $s
26
30
 
27
31
  puts ruby2ruby.process(sexp)
28
32
  end
data/lib/ruby2ruby.rb CHANGED
@@ -5,7 +5,7 @@ require 'sexp_processor'
5
5
  require 'unified_ruby'
6
6
 
7
7
  class Ruby2Ruby < SexpProcessor
8
- VERSION = '1.2.1'
8
+ VERSION = '1.2.2'
9
9
  LINE_LENGTH = 78
10
10
 
11
11
  ##
@@ -54,7 +54,7 @@ class Ruby2Ruby < SexpProcessor
54
54
  # Processors
55
55
 
56
56
  def process_alias(exp)
57
- "alias_method #{process(exp.shift)}, #{process(exp.shift)}"
57
+ "alias #{process(exp.shift)} #{process(exp.shift)}"
58
58
  end
59
59
 
60
60
  def process_and(exp)
@@ -186,29 +186,29 @@ class Ruby2Ruby < SexpProcessor
186
186
  Ruby2Ruby::ASSIGN_NODES.include? receiver_node_type
187
187
 
188
188
  name = exp.shift
189
- args_exp = exp.shift rescue nil
190
- if args_exp && args_exp.first == :array # FIX
191
- args = "#{process(args_exp)[1..-2]}"
192
- else
193
- args = process args_exp
194
- args = nil if args.empty?
195
- end
189
+ args = exp.shift rescue nil
196
190
 
197
191
  case name
198
192
  when :<=>, :==, :<, :>, :<=, :>=, :-, :+, :*, :/, :%, :<<, :>>, :** then
199
- "(#{receiver} #{name} #{args})"
193
+ "(#{receiver} #{name} #{process args})"
200
194
  when :[] then
201
- "#{receiver}[#{args}]"
195
+ receiver = "self" if receiver.nil?
196
+ "#{receiver}[#{process args}]"
197
+ when :[]= then
198
+ receiver = "self" if receiver.nil?
199
+ lhs = args.pop
200
+ "#{receiver}[#{process args}] = #{process lhs}"
202
201
  when :"-@" then
203
202
  "-#{receiver}"
204
203
  when :"+@" then
205
204
  "+#{receiver}"
206
205
  else
207
- unless receiver.nil? then
208
- "#{receiver}.#{name}#{args ? "(#{args})" : args}"
209
- else
210
- "#{name}#{args ? "(#{args})" : args}"
211
- end
206
+ args = process args
207
+ args = nil if args.empty?
208
+ args = "(#{args})" if args
209
+ receiver = "#{receiver}." if receiver
210
+
211
+ "#{receiver}#{name}#{args}"
212
212
  end
213
213
  end
214
214
 
@@ -408,7 +408,11 @@ class Ruby2Ruby < SexpProcessor
408
408
 
409
409
  case self.context[1]
410
410
  when :arglist, :argscat then
411
- return "#{result.join(', ')}" # HACK - this will break w/ 2 hashes as args
411
+ unless result.empty? then
412
+ return "#{result.join(', ')}" # HACK - this will break w/ 2 hashes as args
413
+ else
414
+ return "{}"
415
+ end
412
416
  else
413
417
  return "{ #{result.join(', ')} }"
414
418
  end
@@ -487,8 +491,10 @@ class Ruby2Ruby < SexpProcessor
487
491
  result << "#{iter} #{b}"
488
492
  result << " |#{args}|" if args
489
493
  result << "\n"
490
- result << indent(body.strip)
491
- result << "\n"
494
+ if body then
495
+ result << indent(body.strip)
496
+ result << "\n"
497
+ end
492
498
  result << e
493
499
  result.join
494
500
  end
@@ -525,12 +531,6 @@ class Ruby2Ruby < SexpProcessor
525
531
  lhs = exp.shift
526
532
  rhs = exp.empty? ? nil : exp.shift
527
533
 
528
- unless exp.empty? then
529
- rhs[1] = splat(rhs[1]) unless rhs == s(:splat)
530
- lhs << rhs
531
- rhs = exp.shift
532
- end
533
-
534
534
  case lhs.first
535
535
  when :array then
536
536
  lhs.shift
@@ -558,12 +558,11 @@ class Ruby2Ruby < SexpProcessor
558
558
  unless rhs.nil? then
559
559
  t = rhs.first
560
560
  rhs = process rhs
561
- rhs = rhs[1..-2] if t != :to_ary
561
+ rhs = rhs[1..-2] if t == :array # FIX: bad? I dunno
562
562
  return "#{lhs.join(", ")} = #{rhs}"
563
563
  else
564
564
  return lhs.join(", ")
565
565
  end
566
-
567
566
  end
568
567
 
569
568
  def process_match(exp)
@@ -54,41 +54,85 @@ class TestRuby2Ruby < R2RTestCase
54
54
  def test_dregx_slash
55
55
  inn = util_thingy(:dregx)
56
56
  out = "/blah\\\"blah#\{(1 + 1)}blah\\\"blah\\/blah/"
57
-
58
- assert_equal out, @processor.process(inn)
59
-
60
- r = eval(out)
61
- assert_equal(/blah\"blah2blah\"blah\/blah/, r)
57
+ util_compare inn, out, /blah\"blah2blah\"blah\/blah/
62
58
  end
63
59
 
64
60
  def test_dstr_quote
65
61
  inn = util_thingy(:dstr)
66
62
  out = "\"blah\\\"blah#\{(1 + 1)}blah\\\"blah/blah\""
67
-
68
- assert_equal out, @processor.process(inn)
69
-
70
- r = eval(out)
71
- assert_equal "blah\"blah2blah\"blah/blah", r
63
+ util_compare inn, out, "blah\"blah2blah\"blah/blah"
72
64
  end
73
65
 
74
66
  def test_dsym_quote
75
67
  inn = util_thingy(:dsym)
76
68
  out = ":\"blah\\\"blah#\{(1 + 1)}blah\\\"blah/blah\""
69
+ util_compare inn, out, :"blah\"blah2blah\"blah/blah"
70
+ end
77
71
 
78
- assert_equal out, @processor.process(inn)
72
+ def test_lit_regexp_slash
73
+ util_compare s(:lit, /blah\/blah/), '/blah\/blah/', /blah\/blah/
74
+ end
79
75
 
80
- r = eval(out)
81
- assert_equal :"blah\"blah2blah\"blah/blah", r
76
+ def test_call_self_index
77
+ util_compare s(:call, nil, :[], s(:arglist, s(:lit, 42))), "self[42]"
78
+ end
79
+
80
+ def test_call_self_index_equals
81
+ util_compare(s(:call, nil, :[]=, s(:arglist, s(:lit, 42), s(:lit, 24))),
82
+ "self[42] = 24")
83
+ end
84
+
85
+ def test_masgn_wtf
86
+ inn = s(:block,
87
+ s(:masgn,
88
+ s(:array, s(:lasgn, :k), s(:lasgn, :v)),
89
+ s(:array,
90
+ s(:splat,
91
+ s(:call,
92
+ s(:call, nil, :line, s(:arglist)),
93
+ :split,
94
+ s(:arglist, s(:lit, /\=/), s(:lit, 2)))))),
95
+ s(:attrasgn,
96
+ s(:self),
97
+ :[]=,
98
+ s(:arglist, s(:lvar, :k),
99
+ s(:call, s(:lvar, :v), :strip, s(:arglist)))))
100
+
101
+ out = "k, v = *line.split(/\\=/, 2)\nself[k] = v.strip\n"
102
+
103
+ util_compare inn, out
82
104
  end
83
105
 
84
- def test_lit_regexp_slash
85
- inn = s(:lit, /blah\/blah/)
86
- out = '/blah\/blah/'
87
106
 
88
- assert_equal out, @processor.process(inn)
107
+ def test_masgn_splat_wtf
108
+ inn = s(:masgn,
109
+ s(:array, s(:lasgn, :k), s(:lasgn, :v)),
110
+ s(:array,
111
+ s(:splat,
112
+ s(:call,
113
+ s(:call, nil, :line, s(:arglist)),
114
+ :split,
115
+ s(:arglist, s(:lit, /\=/), s(:lit, 2))))))
116
+ out = 'k, v = *line.split(/\\=/, 2)'
117
+ util_compare inn, out
118
+ end
119
+
120
+ def test_splat_call
121
+ inn = s(:call, nil, :x,
122
+ s(:arglist,
123
+ s(:splat,
124
+ s(:call,
125
+ s(:call, nil, :line, s(:arglist)),
126
+ :split,
127
+ s(:arglist, s(:lit, /=/), s(:lit, 2))))))
128
+
129
+ out = 'x(*line.split(/=/, 2))'
130
+ util_compare inn, out
131
+ end
89
132
 
90
- r = eval(out)
91
- assert_equal(/blah\/blah/, r)
133
+ def util_compare sexp, expected_ruby, expected_eval = nil
134
+ assert_equal expected_ruby, @processor.process(sexp)
135
+ assert_equal expected_eval, eval(expected_ruby) if expected_eval
92
136
  end
93
137
 
94
138
  def util_setup_inline
@@ -100,7 +144,7 @@ class TestRuby2Ruby < R2RTestCase
100
144
  def util_thingy(type)
101
145
  s(type,
102
146
  'blah"blah',
103
- s(:call, s(:lit, 1), :+, s(:array, s(:lit, 1))),
147
+ s(:call, s(:lit, 1), :+, s(:arglist, s(:lit, 1))),
104
148
  s(:str, 'blah"blah/blah'))
105
149
  end
106
150
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby2ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.1
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Davis
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-11-04 00:00:00 -08:00
12
+ date: 2009-01-20 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.8.0
33
+ version: 1.8.2
34
34
  version:
35
35
  description: ruby2ruby provides a means of generating pure ruby code easily from ParseTree's Sexps. This makes making dynamic language processors much easier in ruby than ever before.
36
36
  email: