method_source 0.7.1 → 0.8.pre.1
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/Rakefile +3 -0
- data/lib/method_source.rb +52 -74
- data/lib/method_source/code_helpers.rb +125 -0
- data/lib/method_source/source_location.rb +1 -1
- data/lib/method_source/version.rb +1 -1
- data/method_source.gemspec +5 -5
- data/test/test.rb +19 -3
- data/test/test_helper.rb +48 -0
- metadata +45 -61
data/Rakefile
CHANGED
data/lib/method_source.rb
CHANGED
@@ -5,74 +5,66 @@ direc = File.dirname(__FILE__)
|
|
5
5
|
|
6
6
|
require "#{direc}/method_source/version"
|
7
7
|
require "#{direc}/method_source/source_location"
|
8
|
+
require "#{direc}/method_source/code_helpers"
|
8
9
|
|
9
10
|
module MethodSource
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
#
|
14
|
-
#
|
15
|
-
|
16
|
-
def self.valid_expression?(str)
|
17
|
-
if defined?(Rubinius::Melbourne19) && RUBY_VERSION =~ /^1\.9/
|
18
|
-
Rubinius::Melbourne19.parse_string(str)
|
19
|
-
elsif defined?(Rubinius::Melbourne)
|
20
|
-
Rubinius::Melbourne.parse_string(str)
|
21
|
-
else
|
22
|
-
catch(:valid) {
|
23
|
-
eval("BEGIN{throw :valid}\n#{str}")
|
24
|
-
}
|
25
|
-
end
|
26
|
-
true
|
27
|
-
rescue SyntaxError
|
28
|
-
false
|
29
|
-
end
|
11
|
+
extend MethodSource::CodeHelpers
|
12
|
+
|
13
|
+
# An Exception to mark errors that were raised trying to find the source from
|
14
|
+
# a given source_location.
|
15
|
+
#
|
16
|
+
class SourceNotFoundError < StandardError; end
|
30
17
|
|
31
18
|
# Helper method responsible for extracting method body.
|
32
19
|
# Defined here to avoid polluting `Method` class.
|
33
20
|
# @param [Array] source_location The array returned by Method#source_location
|
34
|
-
# @
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
loop do
|
44
|
-
val = file.readline
|
45
|
-
code << val
|
46
|
-
|
47
|
-
return code if valid_expression?(code)
|
48
|
-
end
|
49
|
-
end
|
21
|
+
# @param [String] method_name
|
22
|
+
# @return [String] The method body
|
23
|
+
def self.source_helper(source_location, name=nil)
|
24
|
+
raise SourceNotFoundError, "Could not locate source for #{name}!" unless source_location
|
25
|
+
file, line = *source_location
|
26
|
+
|
27
|
+
expression_at(lines_for(file), line)
|
28
|
+
rescue SyntaxError => e
|
29
|
+
raise SourceNotFoundError, "Could not parse source for #{name}: #{e.message}"
|
50
30
|
end
|
51
31
|
|
52
32
|
# Helper method responsible for opening source file and buffering up
|
53
33
|
# the comments for a specified method. Defined here to avoid polluting
|
54
34
|
# `Method` class.
|
55
35
|
# @param [Array] source_location The array returned by Method#source_location
|
36
|
+
# @param [String] method_name
|
56
37
|
# @return [String] The comments up to the point of the method.
|
57
|
-
def self.comment_helper(source_location)
|
58
|
-
|
59
|
-
|
60
|
-
file_name, line = source_location
|
61
|
-
File.open(file_name) do |file|
|
62
|
-
buffer = ""
|
63
|
-
(line - 1).times do
|
64
|
-
line = file.readline
|
65
|
-
# Add any line that is a valid ruby comment,
|
66
|
-
# but clear as soon as we hit a non comment line.
|
67
|
-
if (line =~ /^\s*#/) || (line =~ /^\s*$/)
|
68
|
-
buffer << line.lstrip
|
69
|
-
else
|
70
|
-
buffer.replace("")
|
71
|
-
end
|
72
|
-
end
|
38
|
+
def self.comment_helper(source_location, name=nil)
|
39
|
+
raise SourceNotFoundError, "Could not locate source for #{name}!" unless source_location
|
40
|
+
file, line = *source_location
|
73
41
|
|
74
|
-
|
75
|
-
|
42
|
+
comment_describing(lines_for(file), line)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Load a memoized copy of the lines in a file.
|
46
|
+
#
|
47
|
+
# @param [String] file_name
|
48
|
+
# @param [String] method_name
|
49
|
+
# @return [Array<String>] the contents of the file
|
50
|
+
# @raise [SourceNotFoundError]
|
51
|
+
def self.lines_for(file_name, name=nil)
|
52
|
+
@lines_for_file ||= {}
|
53
|
+
@lines_for_file[file_name] ||= File.readlines(file_name)
|
54
|
+
rescue Errno::ENOENT => e
|
55
|
+
raise SourceNotFoundError, "Could not load source for #{name}: #{e.message}"
|
56
|
+
end
|
57
|
+
|
58
|
+
# @deprecated — use MethodSource::CodeHelpers#complete_expression?
|
59
|
+
def self.valid_expression?(str)
|
60
|
+
complete_expression?(str)
|
61
|
+
rescue SyntaxError
|
62
|
+
false
|
63
|
+
end
|
64
|
+
|
65
|
+
# @deprecated — use MethodSource::CodeHelpers#expression_at
|
66
|
+
def self.extract_code(source_location)
|
67
|
+
source_helper(source_location)
|
76
68
|
end
|
77
69
|
|
78
70
|
# This module is to be included by `Method` and `UnboundMethod` and
|
@@ -104,8 +96,9 @@ module MethodSource
|
|
104
96
|
end
|
105
97
|
|
106
98
|
# Return the sourcecode for the method as a string
|
107
|
-
# (This functionality is only supported in Ruby 1.9 and above)
|
108
99
|
# @return [String] The method sourcecode as a string
|
100
|
+
# @raise SourceNotFoundException
|
101
|
+
#
|
109
102
|
# @example
|
110
103
|
# Set.instance_method(:clear).source.display
|
111
104
|
# =>
|
@@ -114,34 +107,19 @@ module MethodSource
|
|
114
107
|
# self
|
115
108
|
# end
|
116
109
|
def source
|
117
|
-
|
118
|
-
source = MethodSource.source_helper(source_location)
|
119
|
-
|
120
|
-
raise "Cannot locate source for this method: #{name}" if !source
|
121
|
-
else
|
122
|
-
raise "#{self.class}#source not supported by this Ruby version (#{RUBY_VERSION})"
|
123
|
-
end
|
124
|
-
|
125
|
-
source
|
110
|
+
MethodSource.source_helper(source_location, name)
|
126
111
|
end
|
127
112
|
|
128
113
|
# Return the comments associated with the method as a string.
|
129
|
-
# (This functionality is only supported in Ruby 1.9 and above)
|
130
114
|
# @return [String] The method's comments as a string
|
115
|
+
# @raise SourceNotFoundException
|
116
|
+
#
|
131
117
|
# @example
|
132
118
|
# Set.instance_method(:clear).comment.display
|
133
119
|
# =>
|
134
120
|
# # Removes all elements and returns self.
|
135
121
|
def comment
|
136
|
-
|
137
|
-
comment = MethodSource.comment_helper(source_location)
|
138
|
-
|
139
|
-
raise "Cannot locate source for this method: #{name}" if !comment
|
140
|
-
else
|
141
|
-
raise "#{self.class}#comment not supported by this Ruby version (#{RUBY_VERSION})"
|
142
|
-
end
|
143
|
-
|
144
|
-
comment
|
122
|
+
MethodSource.comment_helper(source_location, name)
|
145
123
|
end
|
146
124
|
end
|
147
125
|
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module MethodSource
|
2
|
+
|
3
|
+
module CodeHelpers
|
4
|
+
# Retrieve the first expression starting on the given line of the given file.
|
5
|
+
#
|
6
|
+
# This is useful to get module or method source code.
|
7
|
+
#
|
8
|
+
# @param [Array<String>, File, String] file The file to parse, either as a File or as
|
9
|
+
# @param [Fixnum] line_number The line number at which to look.
|
10
|
+
# NOTE: The first line in a file is line 1!
|
11
|
+
# @param [Boolean] strict If set to true, then only completely valid expressions are
|
12
|
+
# returned. Otherwise heuristics are used to extract
|
13
|
+
# expressions that may have been valid inside an eval.
|
14
|
+
# @return [String] The first complete expression
|
15
|
+
# @raise [SyntaxError] If the first complete expression can't be identified
|
16
|
+
def expression_at(file, line_number, strict=false)
|
17
|
+
lines = file.is_a?(Array) ? file : file.each_line.to_a
|
18
|
+
|
19
|
+
relevant_lines = lines[(line_number - 1)..-1] || []
|
20
|
+
|
21
|
+
extract_first_expression(relevant_lines)
|
22
|
+
rescue SyntaxError => e
|
23
|
+
raise if strict
|
24
|
+
|
25
|
+
begin
|
26
|
+
extract_first_expression(relevant_lines) do |code|
|
27
|
+
code.gsub(/\#\{.*?\}/, "temp")
|
28
|
+
end
|
29
|
+
rescue SyntaxError => e2
|
30
|
+
raise e
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Retrieve the comment describing the expression on the given line of the given file.
|
35
|
+
#
|
36
|
+
# This is useful to get module or method documentation.
|
37
|
+
#
|
38
|
+
# @param [Array<String>, File, String] file The file to parse, either as a File or as
|
39
|
+
# a String or an Array of lines.
|
40
|
+
# @param [Fixnum] line_number The line number at which to look.
|
41
|
+
# NOTE: The first line in a file is line 1!
|
42
|
+
# @return [String] The comment
|
43
|
+
def comment_describing(file, line_number)
|
44
|
+
lines = file.is_a?(Array) ? file : file.each_line.to_a
|
45
|
+
|
46
|
+
extract_last_comment(lines[0..(line_number - 2)])
|
47
|
+
end
|
48
|
+
|
49
|
+
# Determine if a string of code is a complete Ruby expression.
|
50
|
+
# @param [String] code The code to validate.
|
51
|
+
# @return [Boolean] Whether or not the code is a complete Ruby expression.
|
52
|
+
# @raise [SyntaxError] Any SyntaxError that does not represent incompleteness.
|
53
|
+
# @example
|
54
|
+
# complete_expression?("class Hello") #=> false
|
55
|
+
# complete_expression?("class Hello; end") #=> true
|
56
|
+
# complete_expression?("class 123") #=> SyntaxError: unexpected tINTEGER
|
57
|
+
def complete_expression?(str)
|
58
|
+
old_verbose = $VERBOSE
|
59
|
+
$VERBOSE = nil
|
60
|
+
|
61
|
+
catch(:valid) do
|
62
|
+
eval("BEGIN{throw :valid}\n#{str}")
|
63
|
+
end
|
64
|
+
|
65
|
+
# Assert that a line which ends with a , or \ is incomplete.
|
66
|
+
str !~ /[,\\]\s*\z/
|
67
|
+
rescue IncompleteExpression
|
68
|
+
false
|
69
|
+
ensure
|
70
|
+
$VERBOSE = old_verbose
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
# Get the first expression from the input.
|
76
|
+
#
|
77
|
+
# @param [Array<String>] lines
|
78
|
+
# @param [&Block] a clean-up function to run before checking for complete_expression
|
79
|
+
# @return [String] a valid ruby expression
|
80
|
+
# @raise [SyntaxError]
|
81
|
+
def extract_first_expression(lines, &block)
|
82
|
+
code = ""
|
83
|
+
lines.each do |v|
|
84
|
+
code << v
|
85
|
+
return code if complete_expression?(block ? block.call(code) : code)
|
86
|
+
end
|
87
|
+
raise SyntaxError, "unexpected $end"
|
88
|
+
end
|
89
|
+
|
90
|
+
# Get the last comment from the input.
|
91
|
+
#
|
92
|
+
# @param [Array<String>] lines
|
93
|
+
# @return [String]
|
94
|
+
def extract_last_comment(lines)
|
95
|
+
buffer = ""
|
96
|
+
|
97
|
+
lines.each do |line|
|
98
|
+
# Add any line that is a valid ruby comment,
|
99
|
+
# but clear as soon as we hit a non comment line.
|
100
|
+
if (line =~ /^\s*#/) || (line =~ /^\s*$/)
|
101
|
+
buffer << line.lstrip
|
102
|
+
else
|
103
|
+
buffer.replace("")
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
buffer
|
108
|
+
end
|
109
|
+
|
110
|
+
# An exception matcher that matches only subsets of SyntaxErrors that can be
|
111
|
+
# fixed by adding more input to the buffer.
|
112
|
+
module IncompleteExpression
|
113
|
+
def self.===(ex)
|
114
|
+
case ex.message
|
115
|
+
when /unexpected (\$end|end-of-file|END_OF_FILE)/, # mri, jruby, ironruby
|
116
|
+
/unterminated (quoted string|string|regexp) meets end of file/, # "quoted string" is ironruby
|
117
|
+
/missing 'end' for/, /: expecting '[})\]]'$/, /can't find string ".*" anywhere before EOF/, /: expecting keyword_end/, /expecting kWHEN/ # rbx
|
118
|
+
true
|
119
|
+
else
|
120
|
+
false
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
data/method_source.gemspec
CHANGED
@@ -2,17 +2,17 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "method_source"
|
5
|
-
s.version = "0.
|
5
|
+
s.version = "0.8.pre.1"
|
6
6
|
|
7
|
-
s.required_rubygems_version = Gem::Requirement.new("
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["John Mair (banisterfiend)"]
|
9
|
-
s.date = "2012-
|
9
|
+
s.date = "2012-06-03"
|
10
10
|
s.description = "retrieve the sourcecode for a method"
|
11
11
|
s.email = "jrmair@gmail.com"
|
12
|
-
s.files = [".gemtest", ".travis.yml", ".yardopts", "Gemfile", "LICENSE", "README.markdown", "Rakefile", "lib/method_source.rb", "lib/method_source/source_location.rb", "lib/method_source/version.rb", "method_source.gemspec", "test/test.rb", "test/test_helper.rb"]
|
12
|
+
s.files = [".gemtest", ".travis.yml", ".yardopts", "Gemfile", "LICENSE", "README.markdown", "Rakefile", "lib/method_source.rb", "lib/method_source/code_helpers.rb", "lib/method_source/source_location.rb", "lib/method_source/version.rb", "method_source.gemspec", "test/test.rb", "test/test_helper.rb"]
|
13
13
|
s.homepage = "http://banisterfiend.wordpress.com"
|
14
14
|
s.require_paths = ["lib"]
|
15
|
-
s.rubygems_version = "1.8.
|
15
|
+
s.rubygems_version = "1.8.24"
|
16
16
|
s.summary = "retrieve the sourcecode for a method"
|
17
17
|
s.test_files = ["test/test.rb", "test/test_helper.rb"]
|
18
18
|
|
data/test/test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
direc = File.dirname(__FILE__)
|
1
|
+
direc = File.expand_path(File.dirname(__FILE__))
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bacon'
|
@@ -33,6 +33,10 @@ describe MethodSource do
|
|
33
33
|
@lambda_comment = "# This is a comment for MyLambda\n"
|
34
34
|
@lambda_source = "MyLambda = lambda { :lambda }\n"
|
35
35
|
@proc_source = "MyProc = Proc.new { :proc }\n"
|
36
|
+
@hello_instance_evaled_source = " def hello_\#{name}(*args)\n send_mesg(:\#{name}, *args)\n end\n"
|
37
|
+
@hello_instance_evaled_source_2 = " def \#{name}_two()\n if 44\n 45\n end\n end\n"
|
38
|
+
@hello_class_evaled_source = " def hello_\#{name}(*args)\n send_mesg(:\#{name}, *args)\n end\n"
|
39
|
+
@hi_module_evaled_source = " def hi_\#{name}\n @var = \#{name}\n end\n"
|
36
40
|
end
|
37
41
|
|
38
42
|
it 'should define methods on Method and UnboundMethod and Proc' do
|
@@ -58,15 +62,27 @@ describe MethodSource do
|
|
58
62
|
$o.method(:hello).source.should == @hello_singleton_source
|
59
63
|
end
|
60
64
|
|
61
|
-
|
62
65
|
it 'should return a comment for method' do
|
63
66
|
method(:hello).comment.should == @hello_comment
|
64
67
|
end
|
65
68
|
|
69
|
+
# These tests fail because of http://jira.codehaus.org/browse/JRUBY-4576
|
70
|
+
unless defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby"
|
71
|
+
it 'should return source for an *_evaled method' do
|
72
|
+
M.method(:hello_name).source.should == @hello_instance_evaled_source
|
73
|
+
M.method(:name_two).source.should == @hello_instance_evaled_source_2
|
74
|
+
M.instance_method(:hello_name).source.should == @hello_class_evaled_source
|
75
|
+
M.instance_method(:hi_name).source.should == @hi_module_evaled_source
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should raise error for evaled methods that do not pass __FILE__ and __LINE__ + 1 as its arguments" do
|
80
|
+
lambda { M.instance_method(:name_three).source }.should.raise MethodSource::SourceNotFoundError
|
81
|
+
end
|
66
82
|
|
67
83
|
if !is_rbx?
|
68
84
|
it 'should raise for C methods' do
|
69
|
-
lambda { method(:puts).source }.should.raise
|
85
|
+
lambda { method(:puts).source }.should.raise MethodSource::SourceNotFoundError
|
70
86
|
end
|
71
87
|
end
|
72
88
|
end
|
data/test/test_helper.rb
CHANGED
@@ -48,3 +48,51 @@ def comment_test5; end
|
|
48
48
|
MyLambda = lambda { :lambda }
|
49
49
|
MyProc = Proc.new { :proc }
|
50
50
|
|
51
|
+
|
52
|
+
name = "name"
|
53
|
+
|
54
|
+
M.instance_eval <<-METHOD, __FILE__, __LINE__ + 1
|
55
|
+
def hello_#{name}(*args)
|
56
|
+
send_mesg(:#{name}, *args)
|
57
|
+
end
|
58
|
+
METHOD
|
59
|
+
|
60
|
+
M.class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
61
|
+
def hello_#{name}(*args)
|
62
|
+
send_mesg(:#{name}, *args)
|
63
|
+
end
|
64
|
+
METHOD
|
65
|
+
|
66
|
+
# module_eval to DRY code up
|
67
|
+
#
|
68
|
+
M.module_eval <<-METHOD, __FILE__, __LINE__ + 1
|
69
|
+
|
70
|
+
# module_eval is used here
|
71
|
+
#
|
72
|
+
def hi_#{name}
|
73
|
+
@var = #{name}
|
74
|
+
end
|
75
|
+
METHOD
|
76
|
+
|
77
|
+
# case where 2 methods are defined inside an _eval block
|
78
|
+
#
|
79
|
+
M.instance_eval <<EOF, __FILE__, __LINE__ + 1
|
80
|
+
|
81
|
+
def #{name}_one()
|
82
|
+
if 43
|
83
|
+
44
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
def #{name}_two()
|
89
|
+
if 44
|
90
|
+
45
|
91
|
+
end
|
92
|
+
end
|
93
|
+
EOF
|
94
|
+
|
95
|
+
# class_eval without filename and lineno + 1 parameter
|
96
|
+
|
97
|
+
M.class_eval "def #{name}_three; @tempfile.#{name}; end"
|
98
|
+
|
metadata
CHANGED
@@ -1,62 +1,54 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: method_source
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 7
|
9
|
-
- 1
|
10
|
-
version: 0.7.1
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.pre.1
|
5
|
+
prerelease: 4
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- John Mair (banisterfiend)
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-06-03 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: bacon
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
18
|
+
requirements:
|
26
19
|
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 3461773182973075480
|
29
|
-
segments:
|
30
|
-
- 1
|
31
|
-
- 1
|
32
|
-
- 0
|
20
|
+
- !ruby/object:Gem::Version
|
33
21
|
version: 1.1.0
|
34
22
|
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: rake
|
38
23
|
prerelease: false
|
39
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
25
|
none: false
|
41
|
-
requirements:
|
26
|
+
requirements:
|
42
27
|
- - ~>
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.1.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0.9'
|
49
38
|
type: :development
|
50
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0.9'
|
51
46
|
description: retrieve the sourcecode for a method
|
52
47
|
email: jrmair@gmail.com
|
53
48
|
executables: []
|
54
|
-
|
55
49
|
extensions: []
|
56
|
-
|
57
50
|
extra_rdoc_files: []
|
58
|
-
|
59
|
-
files:
|
51
|
+
files:
|
60
52
|
- .gemtest
|
61
53
|
- .travis.yml
|
62
54
|
- .yardopts
|
@@ -65,6 +57,7 @@ files:
|
|
65
57
|
- README.markdown
|
66
58
|
- Rakefile
|
67
59
|
- lib/method_source.rb
|
60
|
+
- lib/method_source/code_helpers.rb
|
68
61
|
- lib/method_source/source_location.rb
|
69
62
|
- lib/method_source/version.rb
|
70
63
|
- method_source.gemspec
|
@@ -72,37 +65,28 @@ files:
|
|
72
65
|
- test/test_helper.rb
|
73
66
|
homepage: http://banisterfiend.wordpress.com
|
74
67
|
licenses: []
|
75
|
-
|
76
68
|
post_install_message:
|
77
69
|
rdoc_options: []
|
78
|
-
|
79
|
-
require_paths:
|
70
|
+
require_paths:
|
80
71
|
- lib
|
81
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
82
73
|
none: false
|
83
|
-
requirements:
|
84
|
-
- -
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
|
87
|
-
|
88
|
-
- 0
|
89
|
-
version: "0"
|
90
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
79
|
none: false
|
92
|
-
requirements:
|
93
|
-
- -
|
94
|
-
- !ruby/object:Gem::Version
|
95
|
-
|
96
|
-
segments:
|
97
|
-
- 0
|
98
|
-
version: "0"
|
80
|
+
requirements:
|
81
|
+
- - ! '>'
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: 1.3.1
|
99
84
|
requirements: []
|
100
|
-
|
101
85
|
rubyforge_project:
|
102
|
-
rubygems_version: 1.8.
|
86
|
+
rubygems_version: 1.8.24
|
103
87
|
signing_key:
|
104
88
|
specification_version: 3
|
105
89
|
summary: retrieve the sourcecode for a method
|
106
|
-
test_files:
|
90
|
+
test_files:
|
107
91
|
- test/test.rb
|
108
92
|
- test/test_helper.rb
|