sourcerer 0.5.2 → 0.6.0
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.
- checksums.yaml +5 -13
- data/README.md +80 -1
- data/VERSION +1 -1
- data/examples/simple_test.rb +1 -6
- data/examples/test.rb +16 -0
- data/files.rb +8 -2
- data/lib/sourcerer.rb +4 -15
- data/lib/sourcerer/cache.rb +0 -2
- data/lib/sourcerer/functions.rb +67 -0
- data/lib/sourcerer/helpers.rb +9 -35
- data/lib/sourcerer/source_code.rb +0 -44
- data/sourcerer.gemspec +1 -1
- data/test/test.rb +65 -0
- metadata +9 -15
- data/lib/source.rb +0 -4
- data/lib/sourcerer/file.rb +0 -27
- data/lib/sourcerer/method.rb +0 -23
- data/lib/sourcerer/proc.rb +0 -13
- data/lib/sourcerer/proc_source.rb +0 -102
- data/lib/sourcerer/proc_source_body.rb +0 -14
- data/lib/sourcerer/proc_source_params.rb +0 -37
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
MmQ1ZDgwZjcxNWEyZjIzYTNmOTI0NmYwMzljYWUzMDY2MWQ4Yjc5MA==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 444e4835573de25b1219563310d1e80fd6342458
|
4
|
+
data.tar.gz: 8dc550d20dd3c1f9a12b2c913ad64a9a44a8339a
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
MjlkYzFkNzU4ZDhkZjQwMzNjNjg3N2MxYTNkYzRkZmExOWY5MTgxMTA0NWU5
|
11
|
-
YWRmZjlkMzg3YWIzNDYxMDJlMjA3OWFjMWJiODExNDIyOWJkNTM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
YzcxNmE2ZmUyMjE2ZWRmOGI5MjNmNjUyMzljZmNmZGZmMjlmNjI5NmQ2YThl
|
14
|
-
MjIzMmQ0YzY1YjY3Y2M2ZDU5YzdjYTM1N2M3NDJmOTI5NGYzMGIxZDQ0MTQy
|
15
|
-
MzA5ZDgyNzg3MGU3NjYxNjZmNjAzMjY2OTYzODViMDMxMGU1OGY=
|
6
|
+
metadata.gz: 65a5891322114fb8c6cc8e8cbbe4d2b11eff6d6a3f2e77a84990d6961f5b311876834183874e4974988c76d6725e1bf3503a5b0b8c8efe5e56560fd8ace0a937
|
7
|
+
data.tar.gz: adea9759f5886b3e00df60f4e014925df78ece5a25a436d7aa47d70efe1ac1c3ac85251b87921ae9fe4f99b63a16f9b5001f5bbf8176bc3e6bcbee1ee19cb9d6
|
data/README.md
CHANGED
@@ -1,4 +1,83 @@
|
|
1
1
|
sourcerer
|
2
2
|
=========
|
3
3
|
|
4
|
-
Source code reader to make eval able proc source codes from methods , unbound methods, and processes
|
4
|
+
Source code reader to make eval able proc source codes from methods , unbound methods, and processes (+ lambda)
|
5
|
+
|
6
|
+
it will always return a proc code like "Proc.new { super_code_here }"
|
7
|
+
check examples how easy to get source code.
|
8
|
+
|
9
|
+
### Install
|
10
|
+
|
11
|
+
bash:
|
12
|
+
|
13
|
+
$ gem install sourcerer
|
14
|
+
|
15
|
+
Gemfile:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
|
19
|
+
gem 'sourcerer'
|
20
|
+
|
21
|
+
```
|
22
|
+
|
23
|
+
### Example
|
24
|
+
|
25
|
+
```ruby
|
26
|
+
|
27
|
+
require "sourcerer"
|
28
|
+
|
29
|
+
#> input
|
30
|
+
def test var, opts={}, *args, &block
|
31
|
+
puts var
|
32
|
+
if true
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
asdf= lambda{
|
38
|
+
|
39
|
+
puts "hy"
|
40
|
+
|
41
|
+
}
|
42
|
+
|
43
|
+
asd = Proc.new { |var, opts={}, *args, &block|
|
44
|
+
|
45
|
+
puts "WHAAAAAAAAAT?"
|
46
|
+
|
47
|
+
puts opts.inspect
|
48
|
+
|
49
|
+
}
|
50
|
+
|
51
|
+
puts asdf.source
|
52
|
+
puts asd.source
|
53
|
+
puts method(:test).source
|
54
|
+
|
55
|
+
#> output
|
56
|
+
|
57
|
+
# Proc.new {
|
58
|
+
#
|
59
|
+
# puts "hy"
|
60
|
+
#
|
61
|
+
# }
|
62
|
+
#
|
63
|
+
# Proc.new { |var, opts={}, *args, &block|
|
64
|
+
#
|
65
|
+
# puts "WHAAAAAAAAAT?"
|
66
|
+
#
|
67
|
+
# puts opts.inspect
|
68
|
+
#
|
69
|
+
# }
|
70
|
+
#
|
71
|
+
# Proc.new { |var, opts={}, *args, &block|
|
72
|
+
# puts var
|
73
|
+
# if true
|
74
|
+
#
|
75
|
+
# end
|
76
|
+
# }
|
77
|
+
#
|
78
|
+
|
79
|
+
```
|
80
|
+
|
81
|
+
### after words
|
82
|
+
|
83
|
+
if you find any bug please report to me :)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/examples/simple_test.rb
CHANGED
@@ -7,8 +7,7 @@ test= Proc.new do |sym,options={},*params,&block|
|
|
7
7
|
|
8
8
|
end # Proc
|
9
9
|
|
10
|
-
|
11
|
-
#puts test.source
|
10
|
+
puts test.source
|
12
11
|
|
13
12
|
class HelloWorld
|
14
13
|
|
@@ -26,8 +25,4 @@ class HelloWorld
|
|
26
25
|
|
27
26
|
end
|
28
27
|
|
29
|
-
require 'debugger'
|
30
|
-
#debugger
|
31
|
-
|
32
|
-
#TODO finish up method reader
|
33
28
|
puts HelloWorld.method(:hello).source
|
data/examples/test.rb
ADDED
data/files.rb
CHANGED
@@ -3,7 +3,10 @@ begin
|
|
3
3
|
|
4
4
|
files_to_be_loaded = %w[version.rb]
|
5
5
|
|
6
|
-
|
6
|
+
module Sourcerer
|
7
|
+
SpecFiles= Array.new
|
8
|
+
end
|
9
|
+
|
7
10
|
|
8
11
|
Dir[File.expand_path(File.join(File.dirname(__FILE__),"**","*"))].sort.uniq.each do |one_file_name|
|
9
12
|
one_file_name = File.expand_path one_file_name
|
@@ -11,11 +14,14 @@ begin
|
|
11
14
|
|
12
15
|
if !one_file_name.include?("pkg")
|
13
16
|
if !File.directory? file_name
|
14
|
-
|
17
|
+
|
18
|
+
Sourcerer::SpecFiles.push file_name
|
19
|
+
|
15
20
|
STDOUT.puts file_name if $DEBUG
|
16
21
|
if files_to_be_loaded.include? one_file_name.split(File::SEPARATOR).last
|
17
22
|
load one_file_name
|
18
23
|
end
|
24
|
+
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
data/lib/sourcerer.rb
CHANGED
@@ -1,17 +1,6 @@
|
|
1
1
|
#encoding: UTF-8
|
2
|
-
module Sourcerer
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
require File.join(File.dirname(__FILE__),"sourcerer","file")
|
9
|
-
|
10
|
-
require File.join(File.dirname(__FILE__),"sourcerer","proc_source")
|
11
|
-
require File.join(File.dirname(__FILE__),"sourcerer","proc_source_body")
|
12
|
-
require File.join(File.dirname(__FILE__),"sourcerer","proc_source_params")
|
13
|
-
|
14
|
-
require File.join(File.dirname(__FILE__),"sourcerer","method")
|
15
|
-
require File.join(File.dirname(__FILE__),"sourcerer","proc")
|
16
|
-
|
17
|
-
end
|
3
|
+
require "sourcerer/helpers"
|
4
|
+
require "sourcerer/cache"
|
5
|
+
require "sourcerer/source_code"
|
6
|
+
require "sourcerer/functions"
|
data/lib/sourcerer/cache.rb
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
module Sourcerer
|
2
|
+
|
3
|
+
EXT= Module.new
|
4
|
+
module EXT::SourceLocation
|
5
|
+
|
6
|
+
#> return a proc source code
|
7
|
+
def source
|
8
|
+
|
9
|
+
var= self.source_location.map{|obj| obj.class <= String ? File.absolute_path(obj) : obj }
|
10
|
+
|
11
|
+
file_obj= File.open(var[0],"r")
|
12
|
+
file_data= [] #> [*File.open(var[0],"r")]
|
13
|
+
(var[1] - 1).times{ file_obj.gets }
|
14
|
+
|
15
|
+
tags= 0
|
16
|
+
loop {
|
17
|
+
|
18
|
+
file_data.push(file_obj.gets.chomp)
|
19
|
+
new_string_line= file_data.last
|
20
|
+
|
21
|
+
tags += ::Sourcerer::Helpers.scan_count_by new_string_line, /\{/,:def,:do,:if,:unless,:loop,:while,:until
|
22
|
+
tags -= ::Sourcerer::Helpers.scan_count_by new_string_line, /\}/,:end
|
23
|
+
|
24
|
+
break if tags <= 0
|
25
|
+
break if file_data.last.nil?
|
26
|
+
|
27
|
+
}
|
28
|
+
|
29
|
+
self_obj= file_data.join("\n")
|
30
|
+
self_obj.gsub!(";","\n") unless %W[ ' " ].map!{|str| self_obj.include?(str) }.include?(true)
|
31
|
+
|
32
|
+
first_line= self_obj
|
33
|
+
case true
|
34
|
+
|
35
|
+
when first_line.include?('Proc')
|
36
|
+
self_obj.sub!(/^[\w =]*Proc.new\s*{ */,'Proc.new { ')
|
37
|
+
|
38
|
+
when first_line.include?('lambda')
|
39
|
+
self_obj.sub!(/^[\w =]*lambda\s*{ */,'Proc.new { ')
|
40
|
+
|
41
|
+
when first_line.include?('def'),first_line.include?('Method')
|
42
|
+
the_params= self_obj.scan(/ *def *[\w\.]*[\( ] *(.*)/)[0][0]
|
43
|
+
self_obj.sub!(
|
44
|
+
self_obj.split("\n")[0],
|
45
|
+
"Proc.new { |#{the_params}|"
|
46
|
+
)
|
47
|
+
|
48
|
+
replace_obj= self_obj.split("\n")
|
49
|
+
var= replace_obj.last.reverse.sub( /\bdne\b/,"-AAAAAAAAAAAA-").reverse.sub("-AAAAAAAAAAAA-","}")
|
50
|
+
replace_obj.pop
|
51
|
+
replace_obj.push(var)
|
52
|
+
self_obj.replace replace_obj.join("\n")
|
53
|
+
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
return ::Sourcerer::SourceCode.new(self_obj)
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
[Method,UnboundMethod,Proc].each{ |cls| cls.__send__(:include,Sourcerer::EXT::SourceLocation) }
|
data/lib/sourcerer/helpers.rb
CHANGED
@@ -1,44 +1,18 @@
|
|
1
1
|
module Sourcerer
|
2
|
-
|
2
|
+
module Helpers
|
3
|
+
class << self
|
3
4
|
|
4
|
-
|
5
|
+
def scan_count_by str,*args
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
case RUBY_VERSION
|
13
|
-
|
14
|
-
when "1.9.3"
|
15
|
-
begin
|
16
|
-
|
17
|
-
if obj.source_location.nil?
|
18
|
-
puts "WARN: Native Ruby 1.9.3 can't return sourceless code sources"
|
19
|
-
return "Proc.new { }"
|
20
|
-
end
|
21
|
-
|
22
|
-
SourceFile.open(File.expand_path(obj.source_location[0])
|
23
|
-
).each_line_from obj.source_location[1] do |line|
|
24
|
-
line = SourceCode.new(line)
|
25
|
-
block += line.source_formater_for_line_sub
|
26
|
-
return_string.concat(line)
|
27
|
-
break if block == 0
|
28
|
-
end
|
29
|
-
|
30
|
-
return return_string
|
31
|
-
|
32
|
-
end
|
7
|
+
counter= 0
|
8
|
+
args.each do |sym|
|
9
|
+
sym= /\b#{sym}\b/ unless sym.class <= Regexp
|
10
|
+
counter += str.scan(sym).count
|
11
|
+
end
|
12
|
+
return counter
|
33
13
|
|
34
14
|
end
|
35
15
|
|
36
|
-
return nil
|
37
16
|
end
|
38
|
-
|
39
|
-
def cache
|
40
|
-
Cache
|
41
|
-
end
|
42
|
-
|
43
17
|
end
|
44
18
|
end
|
@@ -1,51 +1,7 @@
|
|
1
1
|
module Sourcerer
|
2
2
|
class SourceCode < String
|
3
3
|
|
4
|
-
# return the number how often the str is with in the self
|
5
|
-
# by default with \b regex border
|
6
|
-
def frequency(str)
|
7
|
-
begin
|
8
|
-
if str.class == String
|
9
|
-
str= '\b'+str+'\b'
|
10
|
-
end
|
11
|
-
end
|
12
|
-
self.scan(/#{str}/).count
|
13
|
-
end
|
14
4
|
|
15
|
-
# this is a helper to create source strings from procs
|
16
|
-
def source_formater_for_line_sub trim_comment_out= true
|
17
5
|
|
18
|
-
if trim_comment_out == true
|
19
|
-
trim_comment= self.match(/^.*#/)
|
20
|
-
unless trim_comment.nil?
|
21
|
-
self.replace trim_comment[0][0..(trim_comment[0].length-2)].concat("\n")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
self.frequency(/{/)+
|
26
|
-
self.frequency(/def/)-
|
27
|
-
self.frequency(/}/)
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def convert_from_proc!
|
32
|
-
|
33
|
-
self.sub!(/^[\w =]*Proc.new\s*{ */,'Proc.new { ')
|
34
|
-
|
35
|
-
return self
|
36
|
-
end
|
37
|
-
|
38
|
-
def convert_from_method!
|
39
|
-
|
40
|
-
the_params= self.scan(/ *def *[\w\.]*[\( ] *(.*)/)[0][0]
|
41
|
-
|
42
|
-
self.sub!(
|
43
|
-
self.split("\n")[0],
|
44
|
-
"Proc.new { |#{the_params}|"
|
45
|
-
)
|
46
|
-
|
47
|
-
return self
|
48
|
-
|
49
|
-
end
|
50
6
|
end
|
51
7
|
end
|
data/sourcerer.gemspec
CHANGED
@@ -14,7 +14,7 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.homepage = "https://github.com/adamluzsi/sourcerer"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
|
-
spec.files = SpecFiles
|
17
|
+
spec.files = Sourcerer::SpecFiles
|
18
18
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
19
19
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
20
20
|
spec.require_paths = ["lib"]
|
data/test/test.rb
CHANGED
@@ -0,0 +1,65 @@
|
|
1
|
+
|
2
|
+
require "sourcerer"
|
3
|
+
|
4
|
+
def test var, opts={}, *args, &block
|
5
|
+
puts var
|
6
|
+
if true
|
7
|
+
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
asdf= lambda{
|
12
|
+
|
13
|
+
puts "hy"
|
14
|
+
|
15
|
+
}
|
16
|
+
|
17
|
+
asd = Proc.new { |var, opts={}, *args, &block|
|
18
|
+
|
19
|
+
puts "WHAAAAAAAAAT?"
|
20
|
+
|
21
|
+
puts opts.inspect
|
22
|
+
|
23
|
+
}
|
24
|
+
|
25
|
+
puts asdf.source
|
26
|
+
puts asd.source
|
27
|
+
puts method(:test).source
|
28
|
+
|
29
|
+
|
30
|
+
#> output
|
31
|
+
test= Proc.new do |sym,options={},*params,&block|
|
32
|
+
|
33
|
+
puts "some awsome code here" # comment
|
34
|
+
puts "yo"
|
35
|
+
|
36
|
+
end # Proc
|
37
|
+
|
38
|
+
puts test.source
|
39
|
+
# Proc.new { |sym,options={},*params,&block|
|
40
|
+
#
|
41
|
+
# puts "some awsome code here"
|
42
|
+
# puts "yo"
|
43
|
+
#
|
44
|
+
# }
|
45
|
+
|
46
|
+
|
47
|
+
class HelloWorld
|
48
|
+
|
49
|
+
#> TODO: comment remove from args
|
50
|
+
def self.hello sym,sym2= "#{sym}", options={},*params,&block
|
51
|
+
|
52
|
+
[1,2,3].each do |do_|
|
53
|
+
|
54
|
+
puts do_ # comment
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
puts "some code" # some comment
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
puts HelloWorld.method(:hello).source
|
65
|
+
|
metadata
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sourcerer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Luzsi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description:
|
13
|
+
description: " DSL for for simple to use proc source generating from methods, unbound
|
14
14
|
methods and of course Proc/lambda. It will allow you to play with the source or
|
15
|
-
even fuse two source code to make a new one and generate a proc from that.
|
15
|
+
even fuse two source code to make a new one and generate a proc from that. "
|
16
16
|
email:
|
17
17
|
- adamluzsi@gmail.com
|
18
18
|
executables: []
|
@@ -27,17 +27,12 @@ files:
|
|
27
27
|
- VERSION
|
28
28
|
- examples/fun_with_procs_and_methods.rb
|
29
29
|
- examples/simple_test.rb
|
30
|
+
- examples/test.rb
|
30
31
|
- files.rb
|
31
|
-
- lib/source.rb
|
32
32
|
- lib/sourcerer.rb
|
33
33
|
- lib/sourcerer/cache.rb
|
34
|
-
- lib/sourcerer/
|
34
|
+
- lib/sourcerer/functions.rb
|
35
35
|
- lib/sourcerer/helpers.rb
|
36
|
-
- lib/sourcerer/method.rb
|
37
|
-
- lib/sourcerer/proc.rb
|
38
|
-
- lib/sourcerer/proc_source.rb
|
39
|
-
- lib/sourcerer/proc_source_body.rb
|
40
|
-
- lib/sourcerer/proc_source_params.rb
|
41
36
|
- lib/sourcerer/source_code.rb
|
42
37
|
- sourcerer.gemspec
|
43
38
|
- test/test.rb
|
@@ -51,20 +46,19 @@ require_paths:
|
|
51
46
|
- lib
|
52
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
53
48
|
requirements:
|
54
|
-
- -
|
49
|
+
- - ">="
|
55
50
|
- !ruby/object:Gem::Version
|
56
51
|
version: '0'
|
57
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
53
|
requirements:
|
59
|
-
- -
|
54
|
+
- - ">="
|
60
55
|
- !ruby/object:Gem::Version
|
61
56
|
version: '0'
|
62
57
|
requirements: []
|
63
58
|
rubyforge_project:
|
64
|
-
rubygems_version: 2.2.
|
59
|
+
rubygems_version: 2.2.2
|
65
60
|
signing_key:
|
66
61
|
specification_version: 4
|
67
62
|
summary: Simple source extractor Based on standard CRuby
|
68
63
|
test_files:
|
69
64
|
- test/test.rb
|
70
|
-
has_rdoc:
|
data/lib/source.rb
DELETED
data/lib/sourcerer/file.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
class SourceFile < File
|
2
|
-
|
3
|
-
# start read the file object on each line
|
4
|
-
# optionable an integer value to start read line at
|
5
|
-
# compatible with mac (i am linux user, so not tested)
|
6
|
-
def each_line_from(start_at=1,&block)
|
7
|
-
unless [Integer,Fixnum,Bignum].include?(start_at.class)
|
8
|
-
raise ArgumentError, "invalid line index"
|
9
|
-
end
|
10
|
-
begin
|
11
|
-
|
12
|
-
line_num= 1
|
13
|
-
text= self.read
|
14
|
-
text.gsub!(/\r\n?/, "\n")
|
15
|
-
text.gsub!(';',"\n")
|
16
|
-
text.gsub!(/\bdo\b/,'{')
|
17
|
-
text.gsub!(/\bend\b/,'}')
|
18
|
-
text.each_line do |*line|
|
19
|
-
if line_num >= start_at
|
20
|
-
block.call *line
|
21
|
-
end
|
22
|
-
line_num += 1
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
end
|
data/lib/sourcerer/method.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Sourcerer
|
2
|
-
module MethodDSL
|
3
|
-
|
4
|
-
# creatue a raw eval-able process source, so you can set
|
5
|
-
# the right bindings using the .to_proc call from String methods
|
6
|
-
def source
|
7
|
-
|
8
|
-
return_string= Sourcerer.raw_source(self).convert_from_method!
|
9
|
-
return return_string
|
10
|
-
|
11
|
-
end
|
12
|
-
alias :source_string :source
|
13
|
-
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
class Method
|
18
|
-
include Sourcerer::MethodDSL
|
19
|
-
end
|
20
|
-
|
21
|
-
class UnboundMethod
|
22
|
-
include Sourcerer::MethodDSL
|
23
|
-
end
|
data/lib/sourcerer/proc.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
class Proc
|
2
|
-
|
3
|
-
# create a raw eval-able process source, so you can set
|
4
|
-
# the right bindings using the .to_proc call from String methods
|
5
|
-
def source # trim_comment= true
|
6
|
-
|
7
|
-
return_string= Sourcerer.raw_source(self).convert_from_proc!
|
8
|
-
return return_string
|
9
|
-
|
10
|
-
end
|
11
|
-
alias :source_string :source
|
12
|
-
|
13
|
-
end
|
@@ -1,102 +0,0 @@
|
|
1
|
-
module Sourcerer
|
2
|
-
class ProcSource < SourceCode
|
3
|
-
|
4
|
-
class << self
|
5
|
-
attr_accessor :source_cache
|
6
|
-
attr_accessor :eval_keys
|
7
|
-
end
|
8
|
-
self.source_cache= Hash.new
|
9
|
-
self.eval_keys= Array.new
|
10
|
-
|
11
|
-
def self.build(source_code_to_be_wrappered,*params_obj_array)
|
12
|
-
self.new(source_code_to_be_wrappered).wrapper_around!(*params_obj_array)
|
13
|
-
end
|
14
|
-
|
15
|
-
def wrapper_around!(*params)
|
16
|
-
if !params.nil?
|
17
|
-
params= params.join(',')
|
18
|
-
params.prepend(' |')
|
19
|
-
params.concat('|')
|
20
|
-
end
|
21
|
-
self.prepend("Proc.new{#{params}\n")
|
22
|
-
self.concat("\n}")
|
23
|
-
end
|
24
|
-
|
25
|
-
# create process object from valid process string
|
26
|
-
def to_proc(binding=nil)
|
27
|
-
begin
|
28
|
-
|
29
|
-
unless self.split("\n")[0].include?('Proc.new')
|
30
|
-
raise ArgumentError, "string obj is not a valid process source"
|
31
|
-
end
|
32
|
-
|
33
|
-
return_proc= nil
|
34
|
-
if binding.nil?
|
35
|
-
return_proc= eval(self)
|
36
|
-
else
|
37
|
-
return_proc= eval(self,binding)
|
38
|
-
end
|
39
|
-
|
40
|
-
if ProcSource.eval_keys.count > 1000
|
41
|
-
ProcSource.eval_keys.each {|e| ProcSource.source_cache.delete(e) }
|
42
|
-
ProcSource.eval_keys.clear
|
43
|
-
end
|
44
|
-
ProcSource.source_cache[return_proc.inspect]= self
|
45
|
-
ProcSource.eval_keys.push return_proc.inspect
|
46
|
-
|
47
|
-
return return_proc
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def body
|
52
|
-
|
53
|
-
body= ProcSourceBody.new(self.dup.to_s)
|
54
|
-
body.sub!(/.*Proc\.new *{ *(\|.*\|)?/,String.new)
|
55
|
-
body.gsub!(/^$\n/, String.new)
|
56
|
-
body.sub!(/\s*}\s*$/,String.new)
|
57
|
-
|
58
|
-
return body
|
59
|
-
end
|
60
|
-
|
61
|
-
def params
|
62
|
-
#SystemStackError
|
63
|
-
params= self.dup
|
64
|
-
params.sub!(params.split("\n")[0].scan(/\s*Proc.new\s*{/)[0],String.new)
|
65
|
-
params.sub!(' ','')
|
66
|
-
params= params.split("\n")[0].scan(/^\s*{?\s*(.*)/)[0][0].gsub!('|','')
|
67
|
-
if params.nil?
|
68
|
-
return nil
|
69
|
-
end
|
70
|
-
return ProcSourceParams[*params.split(',')]
|
71
|
-
end
|
72
|
-
|
73
|
-
def parameters
|
74
|
-
|
75
|
-
return_array= Array.new
|
76
|
-
params= self.params
|
77
|
-
params.each do |one_raw_parameter|
|
78
|
-
case true
|
79
|
-
when one_raw_parameter.include?('=')
|
80
|
-
begin
|
81
|
-
return_array.push Array.new.push(:opt).push(
|
82
|
-
one_raw_parameter.split('=')[0].to_sym)
|
83
|
-
end
|
84
|
-
when one_raw_parameter[0] == '*'
|
85
|
-
begin
|
86
|
-
one_raw_parameter[0]= ''
|
87
|
-
return_array.push Array.new.push(:rest).push(
|
88
|
-
one_raw_parameter.to_sym)
|
89
|
-
end
|
90
|
-
else
|
91
|
-
begin
|
92
|
-
return_array.push Array.new.push(:req).push(
|
93
|
-
one_raw_parameter.to_sym)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
return return_array
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Sourcerer
|
2
|
-
class ProcSourceParams < Array
|
3
|
-
|
4
|
-
# merge two proc params obj
|
5
|
-
# if multiple rest obj found
|
6
|
-
# it will remove and make an *args obj as last element
|
7
|
-
# if they are not equal ,
|
8
|
-
# else it makes it the last element only
|
9
|
-
def +(oth_ary)
|
10
|
-
|
11
|
-
merged_array= (Array[*self]+Array[*oth_ary])
|
12
|
-
|
13
|
-
rest_state= nil
|
14
|
-
rest_elements= Array.new
|
15
|
-
merged_array.dup.each do |element|
|
16
|
-
if element.include? '*'
|
17
|
-
merged_array.delete(element)
|
18
|
-
rest_state ||= true
|
19
|
-
rest_elements.push(element)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
rest_elements.uniq!
|
24
|
-
if rest_elements.count == 1 && !rest_elements.empty?
|
25
|
-
merged_array.push(rest_elements[0])
|
26
|
-
rest_state= nil
|
27
|
-
end
|
28
|
-
|
29
|
-
unless rest_state.nil?
|
30
|
-
merged_array.push('*args')
|
31
|
-
end
|
32
|
-
|
33
|
-
return ProcSourceParams[*merged_array]
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|