sourcify 0.6.0.rc1 → 0.6.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +12 -0
- data/Gemfile +5 -0
- data/HISTORY.txt +1 -0
- data/README.rdoc +10 -2
- data/Rakefile +9 -9
- data/lib/sourcify.rb +1 -1
- data/lib/sourcify/common/parser/raw_scanner/dstring.rb +7 -9
- data/lib/sourcify/common/parser/raw_scanner/extensions.rb +20 -4
- data/lib/sourcify/common/parser/raw_scanner/heredoc.rb +2 -2
- data/lib/sourcify/method/parser.rb +20 -14
- data/lib/sourcify/method/parser/raw_scanner_extensions.rb +7 -3
- data/lib/sourcify/method/parser/scanner.rb +11 -7
- data/lib/sourcify/{facets.rb → patches.rb} +35 -0
- data/lib/sourcify/proc/parser.rb +6 -4
- data/lib/sourcify/proc/parser/raw_scanner_extensions.rb +6 -4
- data/lib/sourcify/proc/parser/scanner.rb +5 -3
- data/lib/sourcify/version.rb +1 -1
- data/sourcify.gemspec +4 -4
- data/spec/method/encoding_from_def_end_block_spec.rb +32 -0
- data/spec/method/encoding_from_define_method_spec.rb +36 -0
- data/spec/method/others_from_define_method_spec.rb +1 -0
- data/spec/method/to_source_from_def_end_block_w_nested_if_spec.rb +11 -10
- data/spec/method/to_source_from_def_end_block_w_nested_unless_spec.rb +11 -10
- data/spec/proc/encoding_spec.rb +35 -0
- data/spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb +12 -11
- data/spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb +12 -11
- data/spec/run_build.sh +25 -0
- data/spec/spec_helper.rb +5 -3
- metadata +56 -26
- data/spec/run_spec.sh +0 -12
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/HISTORY.txt
CHANGED
data/README.rdoc
CHANGED
@@ -82,7 +82,7 @@ fluff like comments:
|
|
82
82
|
|
83
83
|
lambda do |i|
|
84
84
|
i+1 # (blah)
|
85
|
-
end.
|
85
|
+
end.to_raw_source
|
86
86
|
# >> "proc do |i|
|
87
87
|
# >> i+1 # (blah)
|
88
88
|
# >> end"
|
@@ -169,7 +169,7 @@ fetching of raw source returns the method's raw code, including fluff like comme
|
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
|
-
MyMath.method(:sum).
|
172
|
+
MyMath.method(:sum).to_raw_source
|
173
173
|
# >> "def sum(x, y)
|
174
174
|
# >> x + y # (blah)
|
175
175
|
# >> end"
|
@@ -288,6 +288,14 @@ Under the hood, sourcify relies on RubyParser to yield s-expression, and since R
|
|
288
288
|
does not yet fully handle 1.8.7 & 1.9.* syntax, you will get a nasty Racc::ParseError when
|
289
289
|
you have any code that is not compatible with 1.8.6.
|
290
290
|
|
291
|
+
=== 4. Lambda operator doesn't work
|
292
|
+
|
293
|
+
When a lambda has been created using the lambda operator "->", sourcify can't handle it:
|
294
|
+
|
295
|
+
x = ->{ :blah }
|
296
|
+
x.to_source
|
297
|
+
# >> Sourcify::NoMatchingProcError
|
298
|
+
|
291
299
|
|
292
300
|
== Is it really working ??
|
293
301
|
|
data/Rakefile
CHANGED
@@ -3,22 +3,22 @@ require 'rake'
|
|
3
3
|
require 'bundler'
|
4
4
|
Bundler::GemHelper.install_tasks
|
5
5
|
|
6
|
-
SPEC_SCRIPT = File.expand_path('../spec/
|
6
|
+
SPEC_SCRIPT = File.expand_path('../spec/run_build.sh', __FILE__)
|
7
7
|
task :default => :spec
|
8
8
|
|
9
9
|
RUBIES = {
|
10
10
|
:parsetree => [
|
11
11
|
[nil, 'ruby-1.8.6-p420@sourcify-parsetree'],
|
12
12
|
[nil, 'ruby-1.8.7-p334@sourcify-parsetree'],
|
13
|
-
[nil, 'ree-1.8.7
|
13
|
+
[nil, 'ree-1.8.7--2012.02@sourcify-parsetree']
|
14
14
|
],
|
15
15
|
:static => [
|
16
16
|
[nil, 'ruby-1.8.6-p420@sourcify'],
|
17
17
|
[nil, 'ruby-1.8.7-p334@sourcify'],
|
18
|
-
[nil, 'ree-1.8.7
|
18
|
+
[nil, 'ree-1.8.7--2012.02@sourcify'],
|
19
19
|
[nil, 'jruby-1.6.3@sourcify'],
|
20
|
-
[nil, 'ruby-1.9.
|
21
|
-
[
|
20
|
+
[nil, 'ruby-1.9.2-p320@sourcify'],
|
21
|
+
[nil, 'ruby-1.9.3-p194@sourcify'],
|
22
22
|
|
23
23
|
# NOTE: This doesn't support Method#to_source (& friends) yet yet due to
|
24
24
|
# jruby's Method#parameters bug, see http://jira.codehaus.org/browse/JRUBY-5954
|
@@ -27,7 +27,7 @@ RUBIES = {
|
|
27
27
|
]
|
28
28
|
}
|
29
29
|
|
30
|
-
def
|
30
|
+
def run_build_for(envs_and_rubies)
|
31
31
|
envs_and_rubies.group_by{|arry| arry[0..-2] }.each do |envs, arry|
|
32
32
|
rubies = arry.map(&:last)
|
33
33
|
declared_envs = ['export MUTE_BACON=true']
|
@@ -50,17 +50,17 @@ end
|
|
50
50
|
|
51
51
|
desc "Run specs in all rubies (both ParseTree & static scanner modes)"
|
52
52
|
task :'spec:all' do
|
53
|
-
|
53
|
+
run_build_for RUBIES.values.flatten(1)
|
54
54
|
end
|
55
55
|
|
56
56
|
desc "Run specs in rubies supporting ParseTree mode"
|
57
57
|
task :'spec:parsetree' do
|
58
|
-
|
58
|
+
run_build_for RUBIES[:parsetree]
|
59
59
|
end
|
60
60
|
|
61
61
|
desc "Run specs in rubies supporting static scanner mode"
|
62
62
|
task :'spec:static' do
|
63
|
-
|
63
|
+
run_build_for RUBIES[:static]
|
64
64
|
end
|
65
65
|
|
66
66
|
# ///////////////////////////////////////////////////////////
|
data/lib/sourcify.rb
CHANGED
@@ -2,7 +2,7 @@ module Sourcify
|
|
2
2
|
module Common
|
3
3
|
class Parser
|
4
4
|
module RawScanner #:nodoc:all
|
5
|
-
class DString < Struct.new(:tag)
|
5
|
+
class DString < Struct.new(:tag, :encoding)
|
6
6
|
|
7
7
|
# To suppress 'warning: Object#type is deprecated; use Object#class' when
|
8
8
|
# evaluating string
|
@@ -25,16 +25,14 @@ module Sourcify
|
|
25
25
|
CLOSING_TAGS = {'(' => ')', '[' => ']', '<' => '>', '{' => '}'}
|
26
26
|
|
27
27
|
def evaluable?
|
28
|
-
@contents
|
28
|
+
@contents.length >= 2 &&
|
29
|
+
@contents[-1][-1].chr == end_tag
|
29
30
|
end
|
30
31
|
|
31
32
|
def parsable?
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
rescue Exception
|
36
|
-
false
|
37
|
-
end
|
33
|
+
!!RubyParser.new.parse(safe_contents)
|
34
|
+
rescue SyntaxError, Racc::ParseError
|
35
|
+
false
|
38
36
|
end
|
39
37
|
|
40
38
|
def safe_contents
|
@@ -42,7 +40,7 @@ module Sourcify
|
|
42
40
|
# thus we convert them to normal strings 1st
|
43
41
|
to_s.gsub(/(%x)(\W|\_)/, '%Q\2').gsub(/.{0,2}(`)/) do |s|
|
44
42
|
s =~ /^(%Q|%W|%r|%x|.?%|.?\\)/ ? s : s.sub(/`$/,'%Q`')
|
45
|
-
end
|
43
|
+
end.force_encoding(encoding)
|
46
44
|
end
|
47
45
|
|
48
46
|
def start_tag
|
@@ -12,6 +12,7 @@ module Sourcify
|
|
12
12
|
|
13
13
|
def process(data, opts={})
|
14
14
|
begin
|
15
|
+
@encoding = data.encoding
|
15
16
|
@start_pattern = opts[:start_pattern] || /.*/
|
16
17
|
@body_matcher = opts[:body_matcher] || lambda{|_| true }
|
17
18
|
@stop_on_newline = opts[:stop_on_newline]
|
@@ -33,7 +34,7 @@ module Sourcify
|
|
33
34
|
|
34
35
|
def push_dstring(ts, te)
|
35
36
|
data = data_frag(ts .. te.pred)
|
36
|
-
@dstring ||= DString.new(data[%r{^("|`|/|%(?:Q|W|r|x|)(?:\W|_))},1])
|
37
|
+
@dstring ||= DString.new(data[%r{^("|`|/|%(?:Q|W|r|x|)(?:\W|_))},1], @encoding)
|
37
38
|
@dstring << data
|
38
39
|
return true unless @dstring.closed?
|
39
40
|
@tokens << [:dstring, @dstring.to_s]
|
@@ -53,7 +54,7 @@ module Sourcify
|
|
53
54
|
data = data_frag(ts .. te.pred)
|
54
55
|
unless @heredoc
|
55
56
|
indented, tag = data.match(/\<\<(\-?)['"]?(\w+)['"]?$/)[1..3]
|
56
|
-
@heredoc = Heredoc.new(tag, !indented.empty
|
57
|
+
@heredoc = Heredoc.new(tag, !indented.empty?, @encoding)
|
57
58
|
end
|
58
59
|
@heredoc << data
|
59
60
|
return true unless @heredoc.closed?(data_frag(te .. te))
|
@@ -80,8 +81,23 @@ module Sourcify
|
|
80
81
|
if @stop_on_newline || !@results.empty? || (@results.empty? && @rejecting_block)
|
81
82
|
end
|
82
83
|
|
83
|
-
def codified_tokens
|
84
|
-
|
84
|
+
def codified_tokens(fix_heredoc = false)
|
85
|
+
(
|
86
|
+
if fix_heredoc
|
87
|
+
@tokens.map do |key, val|
|
88
|
+
case key
|
89
|
+
when :heredoc
|
90
|
+
%(\n%"#{
|
91
|
+
val.sub(/^(?:[^\n]+\n)(.*\n)(?:[^\n]+)$/m, '\1').
|
92
|
+
gsub(/\\|"/) {|c| "\\#{c}" }
|
93
|
+
}")
|
94
|
+
else val
|
95
|
+
end
|
96
|
+
end
|
97
|
+
else
|
98
|
+
@tokens.map(&:last)
|
99
|
+
end
|
100
|
+
).join
|
85
101
|
end
|
86
102
|
|
87
103
|
def reset_attributes
|
@@ -2,14 +2,14 @@ module Sourcify
|
|
2
2
|
module Common
|
3
3
|
class Parser
|
4
4
|
module RawScanner #:nodoc:all
|
5
|
-
class Heredoc < Struct.new(:tag, :indented)
|
5
|
+
class Heredoc < Struct.new(:tag, :indented, :encoding)
|
6
6
|
|
7
7
|
def <<(content)
|
8
8
|
(@contents ||= []) << content
|
9
9
|
end
|
10
10
|
|
11
11
|
def to_s
|
12
|
-
@contents.join
|
12
|
+
@contents.join.force_encoding(encoding)
|
13
13
|
end
|
14
14
|
|
15
15
|
def closed?(sealer)
|
@@ -16,7 +16,7 @@ module Sourcify
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def raw_source(opts)
|
19
|
-
raw_source = extracted_source(opts).strip
|
19
|
+
raw_source = extracted_source(opts)[0].strip
|
20
20
|
opts[:strip_enclosure] ? strip_raw_enclosure(raw_source) : raw_source
|
21
21
|
end
|
22
22
|
|
@@ -26,7 +26,9 @@ module Sourcify
|
|
26
26
|
|
27
27
|
def sexp(opts)
|
28
28
|
(@sexps ||= {})[opts.hash] ||= (
|
29
|
-
|
29
|
+
extracted = extracted_source(opts)[1]
|
30
|
+
raw_code = (("\n" * @source_code.line) + extracted).same_encoding_as(extracted)
|
31
|
+
|
30
32
|
sexp = Converter.to_sexp(raw_code, @source_code.file)
|
31
33
|
opts[:strip_enclosure] ? Sexp.from_array(sexp.to_a[-1]) : sexp
|
32
34
|
)
|
@@ -60,20 +62,24 @@ module Sourcify
|
|
60
62
|
extracted_source_from_method(opts)
|
61
63
|
rescue ProbablyDefinedByProc
|
62
64
|
pattern = /^proc\s*(\{|do)\s*(\|[^\|]*\|)?(.+)(\}|end)$/m
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
65
|
+
extracted = extracted_source_from_proc(opts)
|
66
|
+
matches = extracted.map{|s| s.match(pattern) }
|
67
|
+
|
68
|
+
(
|
69
|
+
if @parameters.empty?
|
70
|
+
matches.map{|match| %Q(def #{@name}\n#{match[3]}\nend) }
|
71
|
+
else
|
72
|
+
args = matches[0][2].sub(/^\|([^\|]+)\|$/, '\1')
|
73
|
+
matches.map{|match| %Q(def #{@name}(#{args})\n#{match[3]}\nend) }
|
74
|
+
end
|
75
|
+
).map{|s| s.same_encoding_as(extracted[0]) }
|
70
76
|
end
|
71
77
|
end
|
72
78
|
|
73
79
|
def extracted_source_from_method(opts)
|
74
|
-
Scanner.process(@source_code, opts) do |
|
80
|
+
Scanner.process(@source_code, opts) do |(raw, normalized)|
|
75
81
|
begin
|
76
|
-
Object.new.instance_eval("#{
|
82
|
+
Object.new.instance_eval("#{raw}; self".same_encoding_as(raw)).
|
77
83
|
method(@name).parameters == @parameters
|
78
84
|
rescue NameError
|
79
85
|
false
|
@@ -84,13 +90,13 @@ module Sourcify
|
|
84
90
|
end
|
85
91
|
|
86
92
|
def extracted_source_from_proc(opts)
|
87
|
-
Proc::Parser::Scanner.process(@source_code, opts) do |
|
93
|
+
Proc::Parser::Scanner.process(@source_code, opts) do |raw|
|
88
94
|
begin
|
89
95
|
Object.new.instance_eval(%(
|
90
96
|
(class << self; self; end).class_eval do
|
91
|
-
define_method(:#{@name}, &(#{
|
97
|
+
define_method(:#{@name}, &(#{raw}))
|
92
98
|
end; self
|
93
|
-
)).method(@name).parameters == @parameters
|
99
|
+
).same_encoding_as(raw)).method(@name).parameters == @parameters
|
94
100
|
rescue NameError
|
95
101
|
false
|
96
102
|
rescue Exception
|
@@ -32,13 +32,17 @@ module Sourcify
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def construct_result_code
|
35
|
-
|
35
|
+
codes = [false, true].map do |fix_heredoc|
|
36
|
+
codified_tokens(fix_heredoc).force_encoding(@encoding)
|
37
|
+
end
|
36
38
|
|
37
39
|
begin
|
38
|
-
if valid?(
|
40
|
+
if valid?(codes[1]) && @body_matcher.call(codes[0])
|
39
41
|
# NOTE: Need to fix singleton method to avoid errors (eg. undefined object)
|
40
42
|
# downstream
|
41
|
-
@results <<
|
43
|
+
@results << codes.map do |s|
|
44
|
+
s.sub(%r{^(def\s+)(?:[^\.]+\.)?(#{@name}.*end)$}m, '\1\2')
|
45
|
+
end
|
42
46
|
raise Escape if @stop_on_newline or @lineno != 1
|
43
47
|
reset_attributes
|
44
48
|
end
|
@@ -12,7 +12,8 @@ module Sourcify
|
|
12
12
|
:body_matcher => opts[:body_matcher],
|
13
13
|
:ignore_nested => opts[:ignore_nested],
|
14
14
|
:stop_on_newline => false,
|
15
|
-
}).
|
15
|
+
}).select{|(raw, normalized)| matcher.call(raw) }
|
16
|
+
|
16
17
|
case results.size
|
17
18
|
when 0 then raise NoMatchingMethodError
|
18
19
|
when 1 then results[0]
|
@@ -31,14 +32,17 @@ module Sourcify
|
|
31
32
|
|
32
33
|
def rscan(str, opts)
|
33
34
|
results = RawScanner.process(str, opts) || []
|
35
|
+
inner_opts = opts.merge(:stop_on_newline => true)
|
34
36
|
return results if opts[:ignore_nested]
|
35
37
|
results.map do |outer|
|
36
|
-
|
37
|
-
outer
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
38
|
+
[
|
39
|
+
outer,
|
40
|
+
*rscan(
|
41
|
+
outer[0].sub(/^def(.*)end$/,'\1').sub(/^(?:.*?)(def.*)$/,'\1'),
|
42
|
+
inner_opts
|
43
|
+
)
|
44
|
+
]
|
45
|
+
end.flatten(1)
|
42
46
|
end
|
43
47
|
|
44
48
|
end
|
@@ -26,3 +26,38 @@ unless binding.respond_to?(:has_local_variable?)
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
29
|
+
|
30
|
+
# New way of adding new functionalities
|
31
|
+
module Sourcify
|
32
|
+
module Patches
|
33
|
+
|
34
|
+
module String
|
35
|
+
if ''.respond_to?(:force_encoding)
|
36
|
+
|
37
|
+
def same_encoding_as(other)
|
38
|
+
force_encoding(other.encoding)
|
39
|
+
end
|
40
|
+
|
41
|
+
else
|
42
|
+
|
43
|
+
def same_encoding_as(other)
|
44
|
+
self
|
45
|
+
end
|
46
|
+
|
47
|
+
def encoding
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
def force_encoding(dummy)
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
::String.class_eval do
|
59
|
+
include Sourcify::Patches::String
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/sourcify/proc/parser.rb
CHANGED
@@ -19,7 +19,9 @@ module Sourcify
|
|
19
19
|
|
20
20
|
def sexp(opts)
|
21
21
|
(@sexps ||= {})[opts.hash] ||= (
|
22
|
-
|
22
|
+
extracted = extracted_source(opts)[1]
|
23
|
+
raw_code = (("\n" * @source_code.line) + extracted).same_encoding_as(extracted)
|
24
|
+
|
23
25
|
raw_sexp = Converter.to_sexp(raw_code, @source_code.file)
|
24
26
|
sexp = Normalizer.process(raw_sexp, @binding)
|
25
27
|
opts[:strip_enclosure] ? Sexp.from_array(sexp.to_a.last) : sexp
|
@@ -27,7 +29,7 @@ module Sourcify
|
|
27
29
|
end
|
28
30
|
|
29
31
|
def raw_source(opts)
|
30
|
-
raw_code = extracted_source(opts).strip
|
32
|
+
raw_code = extracted_source(opts)[0].strip
|
31
33
|
opts[:strip_enclosure] ?
|
32
34
|
raw_code.sub(/^proc\s*(\{|do)\s*(\|[^\|]+\|)?(.*)(\}|end)$/m, '\3').strip : raw_code
|
33
35
|
end
|
@@ -35,9 +37,9 @@ module Sourcify
|
|
35
37
|
private
|
36
38
|
|
37
39
|
def extracted_source(opts)
|
38
|
-
Scanner.process(@source_code, opts) do |
|
40
|
+
Scanner.process(@source_code, opts) do |(raw, normalized)|
|
39
41
|
begin
|
40
|
-
eval(
|
42
|
+
eval(raw).arity == @arity
|
41
43
|
rescue Exception
|
42
44
|
raise ParserInternalError
|
43
45
|
end
|
@@ -42,11 +42,13 @@ module Sourcify
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def construct_result_code
|
45
|
-
|
45
|
+
codes = [false, true].map do |fix_heredoc|
|
46
|
+
%Q(proc #{codified_tokens(fix_heredoc)}).force_encoding(@encoding)
|
47
|
+
end
|
46
48
|
|
47
49
|
begin
|
48
|
-
if valid?(
|
49
|
-
@results <<
|
50
|
+
if valid?(codes[1]) && @body_matcher.call(codes[0])
|
51
|
+
@results << codes
|
50
52
|
raise Escape if @stop_on_newline or @lineno != 1
|
51
53
|
reset_attributes
|
52
54
|
end
|
@@ -56,7 +58,7 @@ module Sourcify
|
|
56
58
|
end
|
57
59
|
|
58
60
|
def really_false_started?
|
59
|
-
valid?(%Q(#{codified_tokens} 1}), :hash)
|
61
|
+
valid?(%Q(#{codified_tokens(true)} 1}), :hash)
|
60
62
|
end
|
61
63
|
|
62
64
|
def reset_attributes
|
@@ -12,7 +12,8 @@ module Sourcify
|
|
12
12
|
:body_matcher => opts[:body_matcher],
|
13
13
|
:ignore_nested => opts[:ignore_nested],
|
14
14
|
:stop_on_newline => false,
|
15
|
-
}).
|
15
|
+
}).select{|(raw, normalized)| matcher.call(raw) }
|
16
|
+
|
16
17
|
case results.size
|
17
18
|
when 0 then raise NoMatchingProcError
|
18
19
|
when 1 then results[0]
|
@@ -31,13 +32,14 @@ module Sourcify
|
|
31
32
|
|
32
33
|
def rscan(str, opts)
|
33
34
|
results = RawScanner.process(str, opts) || []
|
35
|
+
inner_opts = opts.merge(:stop_on_newline => true)
|
34
36
|
return results if opts[:ignore_nested]
|
35
37
|
results.map do |outer|
|
36
38
|
[
|
37
39
|
outer,
|
38
|
-
rscan(outer.sub(/^proc\s*(do|\{)/,''),
|
40
|
+
*rscan(outer[1].sub(/^proc\s*(do|\{)/,''), inner_opts)
|
39
41
|
]
|
40
|
-
end
|
42
|
+
end.flatten(1)
|
41
43
|
end
|
42
44
|
|
43
45
|
end
|
data/lib/sourcify/version.rb
CHANGED
data/sourcify.gemspec
CHANGED
@@ -12,10 +12,10 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.summary = %q{Workarounds before ruby-core officially supports Proc#to_source (& friends)}
|
13
13
|
s.description = %q{}
|
14
14
|
|
15
|
-
s.add_dependency 'ruby2ruby', '
|
16
|
-
s.add_dependency 'sexp_processor', '
|
17
|
-
s.add_dependency 'ruby_parser', '
|
18
|
-
s.add_dependency 'file-tail', '
|
15
|
+
s.add_dependency 'ruby2ruby', '~> 1.3.1'
|
16
|
+
s.add_dependency 'sexp_processor', '~> 3.2.0'
|
17
|
+
s.add_dependency 'ruby_parser', '~> 2.3.1'
|
18
|
+
s.add_dependency 'file-tail', '~> 1.0.10'
|
19
19
|
s.add_development_dependency 'bacon'
|
20
20
|
|
21
21
|
# ParseTree (better performance + dynamic goodness, but not supported on java & 1.9.*),
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
|
3
|
+
|
4
|
+
describe "Encoding (from def..end block)" do
|
5
|
+
|
6
|
+
should "handle body as UTF-8 string" do
|
7
|
+
def m1; "こんにちは"; end
|
8
|
+
method(:m1).should.be having_sexp(
|
9
|
+
s(:defn, :m1, s(:args), s(:scope, s(:block, s(:str, "こんにちは"))))
|
10
|
+
)
|
11
|
+
end
|
12
|
+
|
13
|
+
should "handle body with unicode regexp" do
|
14
|
+
# NOTE: This specifically addresses https://github.com/ngty/sourcify/issues/15
|
15
|
+
def m2; /\p{Lu}/ ; end
|
16
|
+
method(:m2).should.be having_sexp(
|
17
|
+
s(:defn, :m2, s(:args), s(:scope, s(:block, s(:lit, /\p{Lu}/))))
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
should "handle body with UTF-8 heredoc" do
|
22
|
+
def m3
|
23
|
+
<<-EOL
|
24
|
+
こんにちは
|
25
|
+
EOL
|
26
|
+
end
|
27
|
+
method(:m3).should.be having_sexp(
|
28
|
+
s(:defn, :m3, s(:args), s(:scope, s(:block, s(:str, " こんにちは\n"))))
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
|
3
|
+
|
4
|
+
describe "Encoding (from define_method)" do
|
5
|
+
|
6
|
+
before { @thing = Object.new }
|
7
|
+
|
8
|
+
should "handle body as UTF-8 string" do
|
9
|
+
b = lambda { "こんにちは" }
|
10
|
+
@thing.class.send(:define_method, :m1, &b)
|
11
|
+
@thing.method(:m1).should.be having_sexp(
|
12
|
+
s(:defn, :m1, s(:args), s(:scope, s(:block, s(:str, "こんにちは"))))
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "handle body with unicode regexp" do
|
17
|
+
# NOTE: This specifically addresses https://github.com/ngty/sourcify/issues/15
|
18
|
+
b = lambda { /\p{Lu}/ }
|
19
|
+
@thing.class.send(:define_method, :m2, &b)
|
20
|
+
@thing.method(:m2).should.be having_sexp(
|
21
|
+
s(:defn, :m2, s(:args), s(:scope, s(:block, s(:lit, /\p{Lu}/))))
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
should "handle body with UTF-8 heredoc" do
|
26
|
+
b = lambda do
|
27
|
+
<<-EOL
|
28
|
+
こんにちは
|
29
|
+
EOL
|
30
|
+
end
|
31
|
+
@thing.class.send(:define_method, :m3, &b)
|
32
|
+
@thing.method(:m3).should.be having_sexp(
|
33
|
+
s(:defn, :m3, s(:args), s(:scope, s(:block, s(:str, " こんにちは\n"))))
|
34
|
+
)
|
35
|
+
end
|
36
|
+
end
|
@@ -40,16 +40,17 @@ describe "Method#to_source (from def ... end block)" do
|
|
40
40
|
))
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
43
|
+
# NOTE: Syntatically correct, but the RubyParser-2.3.* can't handle it.
|
44
|
+
# should 'handle block within modifier' do
|
45
|
+
# def m4
|
46
|
+
# @x1 = 1 if (if @x1 then true end)
|
47
|
+
# end
|
48
|
+
# method(:m4).should.be having_source(%(
|
49
|
+
# def m4
|
50
|
+
# @x1 = 1 if (if @x1 then true end)
|
51
|
+
# end
|
52
|
+
# ))
|
53
|
+
# end
|
53
54
|
|
54
55
|
should 'handle modifier w trailing backslash' do
|
55
56
|
def m5
|
@@ -40,16 +40,17 @@ describe "Method#to_source (from def ... end block)" do
|
|
40
40
|
))
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
43
|
+
# NOTE: Syntatically correct, but the RubyParser-2.3.* can't handle it.
|
44
|
+
# should 'handle block within modifier' do
|
45
|
+
# def m4
|
46
|
+
# @x1 = 1 unless (unless @x1 then true end)
|
47
|
+
# end
|
48
|
+
# method(:m4).should.be having_source(%(
|
49
|
+
# def m4
|
50
|
+
# @x1 = 1 unless (unless @x1 then true end)
|
51
|
+
# end
|
52
|
+
# ))
|
53
|
+
# end
|
53
54
|
|
54
55
|
should 'handle modifier within block' do
|
55
56
|
def m5
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
#
|
3
|
+
# NOTE: The examples in this file are adapted from the original pull
|
4
|
+
# request submitted by tomykaira @ https://github.com/ngty/sourcify/pull/19.
|
5
|
+
#
|
6
|
+
require File.join(File.expand_path(File.dirname(__FILE__)), 'spec_helper')
|
7
|
+
|
8
|
+
describe "Encoding" do
|
9
|
+
|
10
|
+
should "handle proc with UTF-8 string" do
|
11
|
+
lambda { "こんにちは" }.should.be having_sexp(
|
12
|
+
s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:str, "こんにちは"))
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
should "handle proc with unicode regexp" do
|
17
|
+
# NOTE: This specifically addresses https://github.com/ngty/sourcify/issues/15
|
18
|
+
lambda { /\p{Lu}/ }.should.be having_sexp(
|
19
|
+
s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:lit, /\p{Lu}/))
|
20
|
+
)
|
21
|
+
end
|
22
|
+
|
23
|
+
should "handle proc with UTF-8 heredoc" do
|
24
|
+
(
|
25
|
+
lambda do
|
26
|
+
<<-EOL
|
27
|
+
こんにちは
|
28
|
+
EOL
|
29
|
+
end
|
30
|
+
).should.be having_sexp(
|
31
|
+
s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:str, " こんにちは\n"))
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -42,17 +42,18 @@ describe "Proc#to_source from do ... end block (w nested if)" do
|
|
42
42
|
\)
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
45
|
+
# NOTE: Syntatically correct, but the RubyParser-2.3.* can't handle it.
|
46
|
+
# should 'handle block within modifier' do
|
47
|
+
# (
|
48
|
+
# lambda do
|
49
|
+
# @x1 = 1 if (if @x1 then true end)
|
50
|
+
# end
|
51
|
+
# ).should.be having_source(%Q\
|
52
|
+
# proc do
|
53
|
+
# @x1 = 1 if (if @x1 then true end)
|
54
|
+
# end
|
55
|
+
# \)
|
56
|
+
# end
|
56
57
|
|
57
58
|
should 'handle modifier w trailing backslash' do
|
58
59
|
(
|
@@ -42,17 +42,18 @@ describe "Proc#to_source from do ... end block (w nested unless)" do
|
|
42
42
|
\)
|
43
43
|
end
|
44
44
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
45
|
+
# NOTE: Syntatically correct, but the RubyParser-2.3.* can't handle it.
|
46
|
+
# should 'handle block within modifier' do
|
47
|
+
# (
|
48
|
+
# lambda do
|
49
|
+
# @x1 = 1 unless (unless @x1 then true end)
|
50
|
+
# end
|
51
|
+
# ).should.be having_source(%Q\
|
52
|
+
# proc do
|
53
|
+
# @x1 = 1 unless (unless @x1 then true end)
|
54
|
+
# end
|
55
|
+
# \)
|
56
|
+
# end
|
56
57
|
|
57
58
|
should 'handle modifier within block' do
|
58
59
|
(
|
data/spec/run_build.sh
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
if [ -z "$TRAVIS" ]; then
|
3
|
+
echo ''
|
4
|
+
echo `gem env | grep 'INSTALLATION DIRECTORY' | sed 's/.*\/\(.*\)/\1:/'`
|
5
|
+
rm -rf ~/.ruby_inline/*ParseTree*
|
6
|
+
fi
|
7
|
+
|
8
|
+
SUPPORTS_METHOD_TO_SOURCE=`ruby -e '
|
9
|
+
begin
|
10
|
+
[:source_location, :parameters].each{|meth| 1.method(:to_s).send(meth) }
|
11
|
+
raise RuntimeError if RUBY_PLATFORM =~ /java/i
|
12
|
+
puts :true
|
13
|
+
rescue NoMethodError, RuntimeError
|
14
|
+
puts :false
|
15
|
+
end
|
16
|
+
'`
|
17
|
+
|
18
|
+
if [ "$SUPPORTS_METHOD_TO_SOURCE" == "true" ]; then
|
19
|
+
bundle exec bacon spec/{proc,method}/*/*_spec.rb spec/{proc,method}/*_spec.rb
|
20
|
+
else
|
21
|
+
echo "NOTE: This ruby doesn't support Method#to_source (& friends) !!"
|
22
|
+
bundle exec bacon spec/proc/*/*_spec.rb spec/{proc,no_method}/*_spec.rb
|
23
|
+
fi
|
24
|
+
|
25
|
+
# __END__
|
data/spec/spec_helper.rb
CHANGED
@@ -99,10 +99,12 @@ def irb_exec(stdin_str)
|
|
99
99
|
# See http://tyenglog.heroku.com/2010/9/how-to-test-irb-specific-support &
|
100
100
|
# http://tyenglog.heroku.com/2010/9/how-to-test-irb-specific-support-2-
|
101
101
|
sourcify_rb = File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib', 'sourcify.rb')
|
102
|
-
irb_feedback = /^
|
103
|
-
|
102
|
+
irb_feedback = /^ ?=> /
|
103
|
+
irb_opts = '--simple-prompt'
|
104
|
+
values = %x(echo "#{stdin_str}" | irb #{irb_opts} -r #{sourcify_rb}).split("\n").
|
104
105
|
grep(irb_feedback).map{|s| eval(s.sub(irb_feedback,'').strip) }
|
106
|
+
|
105
107
|
# IRB behaves slightly differently in 1.9.2 for appending newline
|
106
|
-
(values[-1].nil? && RUBY_VERSION
|
108
|
+
(values[-1].nil? && RUBY_VERSION =~ /1.9.(2|3)/) ? values[0 .. -2] : values
|
107
109
|
end
|
108
110
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sourcify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.0.
|
4
|
+
version: 0.6.0.rc2
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,56 +9,75 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
13
|
-
default_executable:
|
12
|
+
date: 2012-08-22 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: ruby2ruby
|
17
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
18
17
|
none: false
|
19
18
|
requirements:
|
20
|
-
- -
|
19
|
+
- - ~>
|
21
20
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.
|
21
|
+
version: 1.3.1
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.3.1
|
26
30
|
- !ruby/object:Gem::Dependency
|
27
31
|
name: sexp_processor
|
28
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
29
33
|
none: false
|
30
34
|
requirements:
|
31
|
-
- -
|
35
|
+
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
33
|
-
version: 3.0
|
37
|
+
version: 3.2.0
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 3.2.0
|
37
46
|
- !ruby/object:Gem::Dependency
|
38
47
|
name: ruby_parser
|
39
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
40
49
|
none: false
|
41
50
|
requirements:
|
42
|
-
- -
|
51
|
+
- - ~>
|
43
52
|
- !ruby/object:Gem::Version
|
44
|
-
version: 2.
|
53
|
+
version: 2.3.1
|
45
54
|
type: :runtime
|
46
55
|
prerelease: false
|
47
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.3.1
|
48
62
|
- !ruby/object:Gem::Dependency
|
49
63
|
name: file-tail
|
50
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
51
65
|
none: false
|
52
66
|
requirements:
|
53
|
-
- -
|
67
|
+
- - ~>
|
54
68
|
- !ruby/object:Gem::Version
|
55
|
-
version: 1.0.
|
69
|
+
version: 1.0.10
|
56
70
|
type: :runtime
|
57
71
|
prerelease: false
|
58
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.0.10
|
59
78
|
- !ruby/object:Gem::Dependency
|
60
79
|
name: bacon
|
61
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
62
81
|
none: false
|
63
82
|
requirements:
|
64
83
|
- - ! '>='
|
@@ -66,7 +85,12 @@ dependencies:
|
|
66
85
|
version: '0'
|
67
86
|
type: :development
|
68
87
|
prerelease: false
|
69
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
70
94
|
description: ''
|
71
95
|
email:
|
72
96
|
- ngty77@gmail.com
|
@@ -77,6 +101,7 @@ extra_rdoc_files:
|
|
77
101
|
files:
|
78
102
|
- .document
|
79
103
|
- .gitignore
|
104
|
+
- .travis.yml
|
80
105
|
- Gemfile
|
81
106
|
- HISTORY.txt
|
82
107
|
- LICENSE
|
@@ -94,7 +119,6 @@ files:
|
|
94
119
|
- lib/sourcify/common/ragel/expressions.rl
|
95
120
|
- lib/sourcify/common/ragel/machines.rl
|
96
121
|
- lib/sourcify/errors.rb
|
97
|
-
- lib/sourcify/facets.rb
|
98
122
|
- lib/sourcify/method.rb
|
99
123
|
- lib/sourcify/method/methods.rb
|
100
124
|
- lib/sourcify/method/methods/to_raw_source.rb
|
@@ -107,6 +131,7 @@ files:
|
|
107
131
|
- lib/sourcify/method/parser/raw_scanner_extensions.rb
|
108
132
|
- lib/sourcify/method/parser/scanner.rb
|
109
133
|
- lib/sourcify/method/parser/source_code.rb
|
134
|
+
- lib/sourcify/patches.rb
|
110
135
|
- lib/sourcify/proc.rb
|
111
136
|
- lib/sourcify/proc/methods.rb
|
112
137
|
- lib/sourcify/proc/methods/source_location.rb
|
@@ -124,6 +149,8 @@ files:
|
|
124
149
|
- lib/sourcify/version.rb
|
125
150
|
- sourcify.gemspec
|
126
151
|
- spec/dump_object_space_procs.rb
|
152
|
+
- spec/method/encoding_from_def_end_block_spec.rb
|
153
|
+
- spec/method/encoding_from_define_method_spec.rb
|
127
154
|
- spec/method/others_from_def_end_block_spec.rb
|
128
155
|
- spec/method/others_from_define_method_spec.rb
|
129
156
|
- spec/method/raw_scanner/block_comment_spec.rb
|
@@ -183,6 +210,7 @@ files:
|
|
183
210
|
- spec/no_method/unsupported_platform_spec.rb
|
184
211
|
- spec/proc/19x_extras.rb
|
185
212
|
- spec/proc/created_on_the_fly_proc_spec.rb
|
213
|
+
- spec/proc/encoding_spec.rb
|
186
214
|
- spec/proc/others_spec.rb
|
187
215
|
- spec/proc/raw_scanner/block_comment_spec.rb
|
188
216
|
- spec/proc/raw_scanner/double_colons_spec.rb
|
@@ -248,9 +276,8 @@ files:
|
|
248
276
|
- spec/raw_scanner/shared_specs.rb
|
249
277
|
- spec/raw_scanner/single_quote_str_shared_spec.rb
|
250
278
|
- spec/raw_scanner/slash_operator_shared_spec.rb
|
251
|
-
- spec/
|
279
|
+
- spec/run_build.sh
|
252
280
|
- spec/spec_helper.rb
|
253
|
-
has_rdoc: true
|
254
281
|
homepage: http://github.com/ngty/sourcify
|
255
282
|
licenses: []
|
256
283
|
post_install_message:
|
@@ -271,12 +298,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
298
|
version: 1.3.1
|
272
299
|
requirements: []
|
273
300
|
rubyforge_project:
|
274
|
-
rubygems_version: 1.
|
301
|
+
rubygems_version: 1.8.23
|
275
302
|
signing_key:
|
276
303
|
specification_version: 3
|
277
304
|
summary: Workarounds before ruby-core officially supports Proc#to_source (& friends)
|
278
305
|
test_files:
|
279
306
|
- spec/dump_object_space_procs.rb
|
307
|
+
- spec/method/encoding_from_def_end_block_spec.rb
|
308
|
+
- spec/method/encoding_from_define_method_spec.rb
|
280
309
|
- spec/method/others_from_def_end_block_spec.rb
|
281
310
|
- spec/method/others_from_define_method_spec.rb
|
282
311
|
- spec/method/raw_scanner/block_comment_spec.rb
|
@@ -336,6 +365,7 @@ test_files:
|
|
336
365
|
- spec/no_method/unsupported_platform_spec.rb
|
337
366
|
- spec/proc/19x_extras.rb
|
338
367
|
- spec/proc/created_on_the_fly_proc_spec.rb
|
368
|
+
- spec/proc/encoding_spec.rb
|
339
369
|
- spec/proc/others_spec.rb
|
340
370
|
- spec/proc/raw_scanner/block_comment_spec.rb
|
341
371
|
- spec/proc/raw_scanner/double_colons_spec.rb
|
@@ -401,5 +431,5 @@ test_files:
|
|
401
431
|
- spec/raw_scanner/shared_specs.rb
|
402
432
|
- spec/raw_scanner/single_quote_str_shared_spec.rb
|
403
433
|
- spec/raw_scanner/slash_operator_shared_spec.rb
|
404
|
-
- spec/
|
434
|
+
- spec/run_build.sh
|
405
435
|
- spec/spec_helper.rb
|
data/spec/run_spec.sh
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
echo ''
|
4
|
-
echo `gem env | grep 'INSTALLATION DIRECTORY' | sed 's/.*\/\(.*\)/\1:/'`
|
5
|
-
rm -rf ~/.ruby_inline/*ParseTree*
|
6
|
-
|
7
|
-
if [ "${METHOD_TO_SOURCE}" == "true" ]; then
|
8
|
-
bacon spec/{proc,method}/*/*_spec.rb spec/{proc,method}/*_spec.rb
|
9
|
-
else
|
10
|
-
echo "NOTE: This ruby doesn't support Method#to_source (& friends) !!"
|
11
|
-
bacon spec/proc/*/*_spec.rb spec/{proc,no_method}/*_spec.rb
|
12
|
-
fi
|