ripper2ruby 0.0.1 → 0.0.2
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/lib/ripper/ruby_builder.rb +20 -9
- data/lib/ruby/statements.rb +1 -1
- data/test/builder/source_test.rb +35 -0
- data/test/fixtures/template.iso-8859-1.html.erb +6 -0
- metadata +8 -8
- data/MIT-LICENSE +0 -20
- data/README.markdown +0 -10
data/lib/ripper/ruby_builder.rb
CHANGED
@@ -7,6 +7,8 @@ require 'core_ext/array/flush'
|
|
7
7
|
require 'ripper/ruby_builder/token'
|
8
8
|
require 'ripper/ruby_builder/stack'
|
9
9
|
|
10
|
+
require 'erb/stripper'
|
11
|
+
|
10
12
|
Dir[File.dirname(__FILE__) + '/ruby_builder/events/*.rb'].each { |file| require file }
|
11
13
|
|
12
14
|
# Ripper::RubyBuilder extends Ripper's SexpBuilder and builds a rich, object
|
@@ -25,10 +27,16 @@ class Ripper
|
|
25
27
|
class ParseError < RuntimeError
|
26
28
|
end
|
27
29
|
|
30
|
+
@@filters = [lambda { |src, file| file && File.extname(file) == '.erb' ? Erb::Stripper.new.to_ruby(src) : src }]
|
31
|
+
|
28
32
|
class << self
|
29
33
|
def build(src, filename = nil)
|
30
34
|
new(src, filename).parse
|
31
35
|
end
|
36
|
+
|
37
|
+
def filters
|
38
|
+
@@filters
|
39
|
+
end
|
32
40
|
end
|
33
41
|
|
34
42
|
NEWLINE = [:@nl, :@ignored_nl]
|
@@ -63,17 +71,27 @@ class Ripper
|
|
63
71
|
|
64
72
|
def initialize(src, filename = nil, lineno = nil)
|
65
73
|
@src = src ||= filename && File.read(filename) || ''
|
66
|
-
@src.gsub!(/([\s\n]*)\Z/) { |s| @trailing_whitespace = Ruby::Whitespace.new(s) and nil }
|
67
74
|
|
68
75
|
@filename = filename
|
69
76
|
@stack = []
|
70
77
|
@stack = Stack.new
|
71
78
|
@string_stack = []
|
72
79
|
|
80
|
+
src.gsub!(/([\s\n]*)\Z/) { |s| @trailing_whitespace = Ruby::Whitespace.new(s) and nil }
|
81
|
+
src = filter(src, filename)
|
82
|
+
|
73
83
|
super
|
84
|
+
rescue ArgumentError => e
|
85
|
+
p filename
|
86
|
+
raise e
|
74
87
|
end
|
75
88
|
|
76
89
|
protected
|
90
|
+
def filter(src, filename)
|
91
|
+
self.class.filters.each { |filter| src = filter.call(src, filename) }
|
92
|
+
src
|
93
|
+
end
|
94
|
+
|
77
95
|
def position
|
78
96
|
Ruby::Node::Position.new(lineno.to_i - 1, column)
|
79
97
|
end
|
@@ -129,7 +147,7 @@ class Ripper
|
|
129
147
|
def pop_assignment_operator(options = {})
|
130
148
|
pop_token(*ASSIGN_OPERATORS, options)
|
131
149
|
end
|
132
|
-
|
150
|
+
|
133
151
|
def pop_end_data
|
134
152
|
token = pop_token(:@__end__)
|
135
153
|
token.token = Ruby::Node::Text::Clip.new(src, token.position).to_s if token # TODO clean up
|
@@ -157,12 +175,5 @@ class Ripper
|
|
157
175
|
Ruby::ExecutableString.new(nil, build_token(token))
|
158
176
|
end
|
159
177
|
end
|
160
|
-
|
161
|
-
# def extract_src(from, to)
|
162
|
-
# lines = Ruby::Node::Text.split(src)
|
163
|
-
# lines[from.row] = lines[from.row][from.col..-1] # || ''
|
164
|
-
# lines[to.row] = lines[to.row][0, to.col]
|
165
|
-
# lines[from.row..to.row].join
|
166
|
-
# end
|
167
178
|
end
|
168
179
|
end
|
data/lib/ruby/statements.rb
CHANGED
@@ -10,7 +10,7 @@ module Ruby
|
|
10
10
|
attr_accessor :filename
|
11
11
|
attr_writer :src
|
12
12
|
|
13
|
-
def initialize(src, filename, statements, end_data)
|
13
|
+
def initialize(src, filename, statements = [], end_data = nil)
|
14
14
|
self.src = src
|
15
15
|
self.filename = filename if filename
|
16
16
|
self.end_data = end_data if end_data
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../test_helper'
|
2
|
+
|
3
|
+
class BuildSourceTest < Test::Unit::TestCase
|
4
|
+
include TestHelper
|
5
|
+
|
6
|
+
define_method :"test original erb source should be still available to the node" do
|
7
|
+
src = "<html>\n<body>\n<%= t(:foo) -%>\n</body>\n</html>"
|
8
|
+
node = build(src, 'foo.erb')
|
9
|
+
assert_equal src, node.src
|
10
|
+
assert_equal 't(:foo)', node.select(Ruby::Call).first.src
|
11
|
+
assert_equal 0, node.select(Ruby::Call).first.context(:width => 1).index('<body>')
|
12
|
+
end
|
13
|
+
|
14
|
+
define_method :"test ruby 1.9 encodings are confusing" do
|
15
|
+
filename = File.dirname(__FILE__) + '/../fixtures/template.iso-8859-1.html.erb'
|
16
|
+
src = File.read(filename)
|
17
|
+
|
18
|
+
assert_equal 'UTF-8', src.encoding.name
|
19
|
+
assert_equal false, src.valid_encoding?
|
20
|
+
|
21
|
+
# src = File.open('iso-8859-1.rb', 'rb:binary') { |f| f.read }
|
22
|
+
# p src.encoding.name
|
23
|
+
# p src.valid_encoding?
|
24
|
+
# puts src
|
25
|
+
|
26
|
+
# src.set_encoding('iso-8859-1')
|
27
|
+
# p src.encoding.name
|
28
|
+
# p src.valid_encoding?
|
29
|
+
# p src
|
30
|
+
|
31
|
+
# src = "<html>\n<body><h1>überschrift</h1>\n<%= t(:foo) -%>\n</body>\n</html>"
|
32
|
+
# src.force_encoding("iso-8859-1")
|
33
|
+
# build(src, 'foo.erb')
|
34
|
+
end
|
35
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ripper2ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Fuchs
|
@@ -29,7 +29,6 @@ files:
|
|
29
29
|
- lib/erb/stripper.rb
|
30
30
|
- lib/highlighters/ansi.rb
|
31
31
|
- lib/ripper/event_log.rb
|
32
|
-
- lib/ripper/ruby_builder.rb
|
33
32
|
- lib/ripper/ruby_builder/buffer.rb
|
34
33
|
- lib/ripper/ruby_builder/events/args.rb
|
35
34
|
- lib/ripper/ruby_builder/events/array.rb
|
@@ -53,8 +52,8 @@ files:
|
|
53
52
|
- lib/ripper/ruby_builder/queue.rb
|
54
53
|
- lib/ripper/ruby_builder/stack.rb
|
55
54
|
- lib/ripper/ruby_builder/token.rb
|
55
|
+
- lib/ripper/ruby_builder.rb
|
56
56
|
- lib/ripper2ruby.rb
|
57
|
-
- lib/ruby.rb
|
58
57
|
- lib/ruby/aggregate.rb
|
59
58
|
- lib/ruby/alternation/args.rb
|
60
59
|
- lib/ruby/alternation/hash.rb
|
@@ -73,13 +72,13 @@ files:
|
|
73
72
|
- lib/ruby/list.rb
|
74
73
|
- lib/ruby/literal.rb
|
75
74
|
- lib/ruby/method.rb
|
76
|
-
- lib/ruby/node.rb
|
77
75
|
- lib/ruby/node/composite.rb
|
78
76
|
- lib/ruby/node/conversions.rb
|
79
77
|
- lib/ruby/node/position.rb
|
80
78
|
- lib/ruby/node/source.rb
|
81
79
|
- lib/ruby/node/text.rb
|
82
80
|
- lib/ruby/node/traversal.rb
|
81
|
+
- lib/ruby/node.rb
|
83
82
|
- lib/ruby/operator.rb
|
84
83
|
- lib/ruby/params.rb
|
85
84
|
- lib/ruby/statements.rb
|
@@ -87,8 +86,7 @@ files:
|
|
87
86
|
- lib/ruby/symbol.rb
|
88
87
|
- lib/ruby/token.rb
|
89
88
|
- lib/ruby/while.rb
|
90
|
-
-
|
91
|
-
- README.markdown
|
89
|
+
- lib/ruby.rb
|
92
90
|
has_rdoc: false
|
93
91
|
homepage: http://github.com/svenfuchs/ripper2ruby
|
94
92
|
licenses: []
|
@@ -119,6 +117,7 @@ specification_version: 2
|
|
119
117
|
summary: Ripper2Ruby builds an object-oriented representation of Ruby code that you can modify and recompile back to Ruby
|
120
118
|
test_files:
|
121
119
|
- test/all.rb
|
120
|
+
- test/builder/source_test.rb
|
122
121
|
- test/builder/stack_test.rb
|
123
122
|
- test/builder/text_test.rb
|
124
123
|
- test/context_test.rb
|
@@ -128,10 +127,11 @@ test_files:
|
|
128
127
|
- test/fixtures/source_2.rb
|
129
128
|
- test/fixtures/stuff.rb
|
130
129
|
- test/fixtures/template.html.erb
|
130
|
+
- test/fixtures/template.iso-8859-1.html.erb
|
131
131
|
- test/fixtures/tmp.rb
|
132
|
-
- test/libs.txt
|
133
132
|
- test/lib_test.rb
|
134
133
|
- test/lib_test_helper.rb
|
134
|
+
- test/libs.txt
|
135
135
|
- test/nodes/args_test.rb
|
136
136
|
- test/nodes/array_test.rb
|
137
137
|
- test/nodes/assignment_test.rb
|
@@ -149,8 +149,8 @@ test_files:
|
|
149
149
|
- test/nodes/literals_test.rb
|
150
150
|
- test/nodes/method_test.rb
|
151
151
|
- test/nodes/namespaces_test.rb
|
152
|
-
- test/nodes/nodes_test.rb
|
153
152
|
- test/nodes/node_test.rb
|
153
|
+
- test/nodes/nodes_test.rb
|
154
154
|
- test/nodes/operator_test.rb
|
155
155
|
- test/nodes/separators_test.rb
|
156
156
|
- test/nodes/statements_test.rb
|
data/MIT-LICENSE
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
Copyright (c) 2009 Sven Fuchs <svenfuchs@artweb-design.de>
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
-
a copy of this software and associated documentation files (the
|
5
|
-
"Software"), to deal in the Software without restriction, including
|
6
|
-
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
-
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
-
permit persons to whom the Software is furnished to do so, subject to
|
9
|
-
the following conditions:
|
10
|
-
|
11
|
-
The above copyright notice and this permission notice shall be
|
12
|
-
included in all copies or substantial portions of the Software.
|
13
|
-
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
-
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
-
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
-
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
-
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
Ripper2Ruby
|
2
|
-
===========
|
3
|
-
|
4
|
-
Similar to ruby2ruby this library allows to parse Ruby code, modify and
|
5
|
-
recompile it back to Ruby.
|
6
|
-
|
7
|
-
Differences:
|
8
|
-
|
9
|
-
* uses Ripper for parsing (shipped with Ruby 1.9)
|
10
|
-
* produces a full object-oriented representation of the Ruby code
|