sourcify 0.1.1 → 0.1.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/HISTORY.txt +6 -0
- data/README.rdoc +16 -0
- data/VERSION +1 -1
- data/lib/sourcify/proc.rb +3 -3
- data/lib/sourcify/proc/counter.rb +1 -1
- data/lib/sourcify/proc/lexer.rb +1 -1
- data/lib/sourcify/proc/lexer18.rb +18 -5
- data/lib/sourcify/proc/lexer19.rb +11 -2
- data/lib/sourcify/proc/parser.rb +17 -7
- data/sourcify.gemspec +3 -1
- data/spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb +101 -0
- metadata +5 -3
data/HISTORY.txt
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
=== 0.1.2 (Aug 30, 2010)
|
2
|
+
|
3
|
+
* introduced throwing of Sourcify::LexerInternalError when parser cannot handle
|
4
|
+
incorrectly lexed code fragments [#ngty]
|
5
|
+
* fixed bug in lexing keyword literals (represented as Symbol) [#ngty]
|
6
|
+
|
1
7
|
=== 0.1.1 (Aug 30, 2010)
|
2
8
|
|
3
9
|
* fixed empty return for Proc#to_sexp after calling of Proc#to_source [#ngty]
|
data/README.rdoc
CHANGED
@@ -139,6 +139,22 @@ following bug under 1.8.* may trip u over:
|
|
139
139
|
This is another reason to install ParseTree when u are on 1.8.*. On JRuby, where u don't
|
140
140
|
have the choice, just avoid multiple procs here line.
|
141
141
|
|
142
|
+
=== 3. Imperfect lexer
|
143
|
+
|
144
|
+
Nothing is perfect, bugs are always lurking somewhere. When the parser encounters
|
145
|
+
unexpected lexing error (which may be due to Ripper, RubyLex, or Sourcify's wrapper lexer),
|
146
|
+
Sourcify::LexerInternalError is thrown.
|
147
|
+
|
148
|
+
== Additional Resources
|
149
|
+
|
150
|
+
Sourcify is heavily inspired by many ideas gathered from the ruby community:
|
151
|
+
* http://www.justskins.com/forums/breaking-ruby-code-into-117453.html
|
152
|
+
* http://rubyquiz.com/quiz38.html (Florian Groß's solution)
|
153
|
+
* http://svenfuchs.com/2009/07/05/using-ruby-1-9-ripper.html
|
154
|
+
|
155
|
+
The sad fact that Proc#to_source wouldn't be available in the near future:
|
156
|
+
* http://redmine.ruby-lang.org/issues/show/2080
|
157
|
+
|
142
158
|
== Note on Patches/Pull Requests
|
143
159
|
|
144
160
|
* Fork the project.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/lib/sourcify/proc.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Sourcify
|
2
2
|
|
3
3
|
class MultipleMatchingProcsPerLineError < Exception ; end
|
4
|
+
class LexerInternalError < Exception ; end
|
4
5
|
|
5
6
|
module Proc
|
6
7
|
|
@@ -19,13 +20,12 @@ module Sourcify
|
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
|
-
# When ParseTree is available, we just make use of all the convenience it offers :)
|
23
23
|
if Object.const_defined?(:ParseTree)
|
24
|
-
|
24
|
+
# When ParseTree is available, we just make use of all the convenience it offers :)
|
25
25
|
alias_method :to_source, :to_ruby
|
26
26
|
|
27
|
-
# Otherwise, we are going to do abit of static text parsing :(
|
28
27
|
else
|
28
|
+
# Otherwise, we are going to do abit of static text parsing :(
|
29
29
|
|
30
30
|
unless meths.include?('to_source')
|
31
31
|
def to_source
|
data/lib/sourcify/proc/lexer.rb
CHANGED
@@ -3,11 +3,12 @@ require 'irb/ruby-token'
|
|
3
3
|
|
4
4
|
module Sourcify
|
5
5
|
module Proc
|
6
|
+
class Lexer18 #:nodoc:all
|
6
7
|
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
# http://
|
8
|
+
# NOTE: Implementation of this class has been heavily inspired by:
|
9
|
+
# * the discussion @ http://www.justskins.com/forums/breaking-ruby-code-into-117453.html
|
10
|
+
# * Florian Groß's solution for ruby quiz 'SerializableProc (#38)'
|
11
|
+
# @ http://rubyquiz.com/quiz38.html
|
11
12
|
|
12
13
|
include Lexer::Commons
|
13
14
|
|
@@ -26,8 +27,9 @@ module Sourcify
|
|
26
27
|
tkc = @tk.class.to_s.sub(/\ARubyToken::/, '').downcase.to_sym
|
27
28
|
@tokens << [@tk.line_no, @tk.char_no, tkc]
|
28
29
|
post_qstring if @qstring_data
|
29
|
-
send(:"on_#{tkc}") rescue NoMethodError
|
30
30
|
@lex.get_readed if tkc == :tknl
|
31
|
+
next if @do_end_counter.started? && @tokens.curr.symbolized_keyword?
|
32
|
+
send(:"on_#{tkc}") rescue NoMethodError
|
31
33
|
end
|
32
34
|
end
|
33
35
|
|
@@ -180,6 +182,17 @@ module Sourcify
|
|
180
182
|
end
|
181
183
|
|
182
184
|
def curr
|
185
|
+
(self[-1]).respond_to?(:symbolized_keyword?) ? self[-1] : (
|
186
|
+
preceding, current = self[-2 .. -1]
|
187
|
+
(class << current ; self ; end).class_eval do
|
188
|
+
define_method(:symbolized_keyword?) do
|
189
|
+
preceding[TYP] == :tksymbeg && %w{
|
190
|
+
class module def while until if unless for do begin case end
|
191
|
+
}.include?(current[TYP].to_s.sub('tk',''))
|
192
|
+
end
|
193
|
+
end
|
194
|
+
current
|
195
|
+
)
|
183
196
|
self[-1]
|
184
197
|
end
|
185
198
|
|
@@ -2,7 +2,7 @@ require 'ripper'
|
|
2
2
|
|
3
3
|
module Sourcify
|
4
4
|
module Proc
|
5
|
-
class Lexer19 < Ripper::Lexer
|
5
|
+
class Lexer19 < Ripper::Lexer #:nodoc:all
|
6
6
|
|
7
7
|
include Lexer::Commons
|
8
8
|
|
@@ -16,6 +16,7 @@ module Sourcify
|
|
16
16
|
|
17
17
|
def on_kw(token)
|
18
18
|
super.tap do |rs|
|
19
|
+
next if @do_end_counter.started? && rs.curr.symbolized_keyword?
|
19
20
|
send(:"on_kw_#{token}", rs) rescue NoMethodError
|
20
21
|
end
|
21
22
|
end
|
@@ -125,7 +126,15 @@ module Sourcify
|
|
125
126
|
end
|
126
127
|
|
127
128
|
def curr
|
128
|
-
self[-1]
|
129
|
+
(self[-1]).respond_to?(:symbolized_keyword?) ? self[-1] : (
|
130
|
+
preceding, current = self[-2 .. -1]
|
131
|
+
(class << current ; self ; end).class_eval do
|
132
|
+
define_method(:symbolized_keyword?) do
|
133
|
+
current[TYP] == :on_kw && preceding[TYP] == :on_symbeg
|
134
|
+
end
|
135
|
+
end
|
136
|
+
current
|
137
|
+
)
|
129
138
|
end
|
130
139
|
|
131
140
|
def same_line(line)
|
data/lib/sourcify/proc/parser.rb
CHANGED
@@ -3,7 +3,7 @@ require 'sourcify/proc/counter'
|
|
3
3
|
|
4
4
|
module Sourcify
|
5
5
|
module Proc
|
6
|
-
class Parser
|
6
|
+
class Parser #:nodoc:all
|
7
7
|
|
8
8
|
RUBY_PARSER = RubyParser.new
|
9
9
|
RUBY_2_RUBY = Ruby2Ruby.new
|
@@ -27,12 +27,22 @@ module Sourcify
|
|
27
27
|
private
|
28
28
|
|
29
29
|
def raw_source
|
30
|
-
@raw_source ||=
|
31
|
-
frags =
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
30
|
+
@raw_source ||=
|
31
|
+
if (frags = raw_source_frags).size > 1
|
32
|
+
raise MultipleMatchingProcsPerLineError
|
33
|
+
else
|
34
|
+
'proc %s' % frags[0]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def raw_source_frags
|
39
|
+
Sourcify::Proc::Lexer.new(raw_source_io, @file, @line).work.select do |frag|
|
40
|
+
begin
|
41
|
+
eval('proc ' + frag).arity == @arity
|
42
|
+
rescue SyntaxError, TypeError
|
43
|
+
raise LexerInternalError
|
44
|
+
end
|
45
|
+
end
|
36
46
|
end
|
37
47
|
|
38
48
|
def raw_source_io
|
data/sourcify.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{sourcify}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["NgTzeYang"]
|
@@ -45,6 +45,7 @@ Gem::Specification.new do |s|
|
|
45
45
|
"spec/proc/to_source_from_do_end_block_w_nested_do_end_block_spec.rb",
|
46
46
|
"spec/proc/to_source_from_do_end_block_w_nested_for_spec.rb",
|
47
47
|
"spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb",
|
48
|
+
"spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb",
|
48
49
|
"spec/proc/to_source_from_do_end_block_w_nested_method_spec.rb",
|
49
50
|
"spec/proc/to_source_from_do_end_block_w_nested_module_spec.rb",
|
50
51
|
"spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb",
|
@@ -79,6 +80,7 @@ Gem::Specification.new do |s|
|
|
79
80
|
"spec/proc/to_source_from_do_end_block_w_nested_class_spec.rb",
|
80
81
|
"spec/proc/to_source_from_do_end_block_w_nested_case_spec.rb",
|
81
82
|
"spec/proc/to_source_magic_line_var_spec.rb",
|
83
|
+
"spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb",
|
82
84
|
"spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb",
|
83
85
|
"spec/proc/19x_extras.rb",
|
84
86
|
"spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb",
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'spec_helper')
|
2
|
+
|
3
|
+
describe "Proc#to_source from do ... end block (w nested literal keyword)" do
|
4
|
+
|
5
|
+
should 'handle :class' do
|
6
|
+
(
|
7
|
+
lambda do
|
8
|
+
x = :class
|
9
|
+
end
|
10
|
+
).should.be having_source('proc { x = :class }')
|
11
|
+
end
|
12
|
+
|
13
|
+
should 'handle :module' do
|
14
|
+
(
|
15
|
+
lambda do
|
16
|
+
x = :module
|
17
|
+
end
|
18
|
+
).should.be having_source('proc { x = :module }')
|
19
|
+
end
|
20
|
+
|
21
|
+
should 'handle :def' do
|
22
|
+
(
|
23
|
+
lambda do
|
24
|
+
x = :def
|
25
|
+
end
|
26
|
+
).should.be having_source('proc { x = :def }')
|
27
|
+
end
|
28
|
+
|
29
|
+
should 'handle :if' do
|
30
|
+
(
|
31
|
+
lambda do
|
32
|
+
x = :if
|
33
|
+
end
|
34
|
+
).should.be having_source('proc { x = :if }')
|
35
|
+
end
|
36
|
+
|
37
|
+
should 'handle :unless' do
|
38
|
+
(
|
39
|
+
lambda do
|
40
|
+
x = :unless
|
41
|
+
end
|
42
|
+
).should.be having_source('proc { x = :unless }')
|
43
|
+
end
|
44
|
+
|
45
|
+
should 'handle :for' do
|
46
|
+
(
|
47
|
+
lambda do
|
48
|
+
x = :for
|
49
|
+
end
|
50
|
+
).should.be having_source('proc { x = :for }')
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'handle :while' do
|
54
|
+
(
|
55
|
+
lambda do
|
56
|
+
x = :while
|
57
|
+
end
|
58
|
+
).should.be having_source('proc { x = :while }')
|
59
|
+
end
|
60
|
+
|
61
|
+
should 'handle :until' do
|
62
|
+
(
|
63
|
+
lambda do
|
64
|
+
x = :until
|
65
|
+
end
|
66
|
+
).should.be having_source('proc { x = :until }')
|
67
|
+
end
|
68
|
+
|
69
|
+
should 'handle :begin' do
|
70
|
+
(
|
71
|
+
lambda do
|
72
|
+
x = :begin
|
73
|
+
end
|
74
|
+
).should.be having_source('proc { x = :begin }')
|
75
|
+
end
|
76
|
+
|
77
|
+
should 'handle :case' do
|
78
|
+
(
|
79
|
+
lambda do
|
80
|
+
x = :case
|
81
|
+
end
|
82
|
+
).should.be having_source('proc { x = :case }')
|
83
|
+
end
|
84
|
+
|
85
|
+
should 'handle :do' do
|
86
|
+
(
|
87
|
+
lambda do
|
88
|
+
x = :do
|
89
|
+
end
|
90
|
+
).should.be having_source('proc { x = :do }')
|
91
|
+
end
|
92
|
+
|
93
|
+
should 'handle :end' do
|
94
|
+
(
|
95
|
+
lambda do
|
96
|
+
x = :end
|
97
|
+
end
|
98
|
+
).should.be having_source('proc { x = :end }')
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sourcify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 31
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 1
|
9
|
-
-
|
10
|
-
version: 0.1.
|
9
|
+
- 2
|
10
|
+
version: 0.1.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- NgTzeYang
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- spec/proc/to_source_from_do_end_block_w_nested_do_end_block_spec.rb
|
87
87
|
- spec/proc/to_source_from_do_end_block_w_nested_for_spec.rb
|
88
88
|
- spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb
|
89
|
+
- spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb
|
89
90
|
- spec/proc/to_source_from_do_end_block_w_nested_method_spec.rb
|
90
91
|
- spec/proc/to_source_from_do_end_block_w_nested_module_spec.rb
|
91
92
|
- spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb
|
@@ -148,6 +149,7 @@ test_files:
|
|
148
149
|
- spec/proc/to_source_from_do_end_block_w_nested_class_spec.rb
|
149
150
|
- spec/proc/to_source_from_do_end_block_w_nested_case_spec.rb
|
150
151
|
- spec/proc/to_source_magic_line_var_spec.rb
|
152
|
+
- spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb
|
151
153
|
- spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb
|
152
154
|
- spec/proc/19x_extras.rb
|
153
155
|
- spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb
|