sourcerer 0.5.0.pre.beta

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ MzY4ZWNjZDY5OWY5NzM0MDFmNzZmMjQ4ODA5MDY4YjM1Mzg1ODhiMQ==
5
+ data.tar.gz: !binary |-
6
+ ODZkMTk1Zjg1NWRlY2RkOTA0ZmE0ZDljMDg3MjRjZDYzZTQ4N2VmOA==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ YzkxNTJlOWM0MTRjN2MwY2FhNGU4NmU5NGFlMzMzNmYxZjhiNjk2MWI1ZGU1
10
+ MGJkNTk0MTdlMWYyMzg3NTIwYzkwODBhMjNhNWRiZGQxZGM0MDQ0YmM4ZjJm
11
+ MTJkMTkyYTNiNDUyZTgyYTYyZGNjMTAzMzZlZmEwNTIwYmQxNjg=
12
+ data.tar.gz: !binary |-
13
+ YjJjNjlkYWViMjE5MGRhZTkwNTA3MDk5MTY5ZjliNzEyNGQ3YTdhMzIwOTQ5
14
+ MGE1NGJkMTE0NzFkN2JkMTc0YmQ3ZmFiMWU5YWZiOWIwNjYxNWU0MDAyNzJk
15
+ NjcyZmEzMDUyNzQ3NWU1M2NlYjEzZTBjODQ4MWQzOTAwNDFlNDY=
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "shoulda", ">= 0"
10
+ gem "rdoc", "~> 3.12"
11
+ gem "bundler", "~> 1.0"
12
+ gem "jeweler", "~> 1.8.7"
13
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,72 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (4.0.0)
5
+ i18n (~> 0.6, >= 0.6.4)
6
+ minitest (~> 4.2)
7
+ multi_json (~> 1.3)
8
+ thread_safe (~> 0.1)
9
+ tzinfo (~> 0.3.37)
10
+ addressable (2.3.5)
11
+ atomic (1.1.14)
12
+ builder (3.2.2)
13
+ faraday (0.8.8)
14
+ multipart-post (~> 1.2.0)
15
+ git (1.2.6)
16
+ github_api (0.10.1)
17
+ addressable
18
+ faraday (~> 0.8.1)
19
+ hashie (>= 1.2)
20
+ multi_json (~> 1.4)
21
+ nokogiri (~> 1.5.2)
22
+ oauth2
23
+ hashie (2.0.5)
24
+ highline (1.6.20)
25
+ httpauth (0.2.0)
26
+ i18n (0.6.5)
27
+ jeweler (1.8.8)
28
+ builder
29
+ bundler (~> 1.0)
30
+ git (>= 1.2.5)
31
+ github_api (= 0.10.1)
32
+ highline (>= 1.6.15)
33
+ nokogiri (= 1.5.10)
34
+ rake
35
+ rdoc
36
+ json (1.8.1)
37
+ jwt (0.1.8)
38
+ multi_json (>= 1.5)
39
+ minitest (4.7.5)
40
+ multi_json (1.8.2)
41
+ multi_xml (0.5.5)
42
+ multipart-post (1.2.0)
43
+ nokogiri (1.5.10)
44
+ oauth2 (0.9.2)
45
+ faraday (~> 0.8)
46
+ httpauth (~> 0.2)
47
+ jwt (~> 0.1.4)
48
+ multi_json (~> 1.0)
49
+ multi_xml (~> 0.5)
50
+ rack (~> 1.2)
51
+ rack (1.5.2)
52
+ rake (10.1.0)
53
+ rdoc (3.12.2)
54
+ json (~> 1.4)
55
+ shoulda (3.5.0)
56
+ shoulda-context (~> 1.0, >= 1.0.1)
57
+ shoulda-matchers (>= 1.4.1, < 3.0)
58
+ shoulda-context (1.1.5)
59
+ shoulda-matchers (2.4.0)
60
+ activesupport (>= 3.0.0)
61
+ thread_safe (0.1.3)
62
+ atomic
63
+ tzinfo (0.3.38)
64
+
65
+ PLATFORMS
66
+ ruby
67
+
68
+ DEPENDENCIES
69
+ bundler (~> 1.0)
70
+ jeweler (~> 1.8.7)
71
+ rdoc (~> 3.12)
72
+ shoulda
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Adam Luzsi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,4 @@
1
+ sourcerer
2
+ =========
3
+
4
+ Source code reader to make eval able proc source codes from methods , unbound methods, and processes
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require File.join "bundler","gem_tasks"
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.5.0-beta
@@ -0,0 +1,74 @@
1
+ require_relative "../lib/sourcerer.rb"
2
+
3
+ test= Proc.new do |*params|
4
+
5
+ puts "some awsome code here"
6
+
7
+ end
8
+
9
+ def hello_this sym
10
+ puts "this is the Body!"
11
+ end
12
+
13
+ # todo -> more advanced regex for params
14
+ # ,options={},*args, &block
15
+
16
+
17
+ method_source= method(:hello_this).source
18
+ #Proc.new{ |sup,yo,lazy=nil,*params|
19
+ #
20
+ # puts "this is the Body!"
21
+ #
22
+ #}
23
+
24
+ proc_source= test.source
25
+ #Proc.new{ |*params|
26
+ #
27
+ # puts "some awsome code here"
28
+ #
29
+ #}
30
+
31
+ # example for terminal run
32
+ puts method_source,"---"
33
+ puts method_source.body,"---"
34
+ puts method_source.params,"---"
35
+ puts method_source.parameters.inspect,"---"
36
+
37
+ puts "\n"
38
+
39
+ merged_proc= ( method_source.body +
40
+ proc_source.body
41
+ ).build(*(method_source.params+proc_source.params))
42
+ puts merged_proc
43
+ puts merged_proc.to_proc
44
+ puts merged_proc.to_proc.source
45
+
46
+
47
+ #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
48
+
49
+ class A
50
+
51
+ class << self
52
+
53
+ def hello test=nil
54
+ puts "world!"
55
+ end
56
+
57
+ end
58
+
59
+ def self.singleton test=nil
60
+ puts "singleton"
61
+ end
62
+
63
+ def instance hello= "wolrd"
64
+ puts "instance"
65
+ end
66
+
67
+ end
68
+
69
+ puts A.instance_method(:instance).source
70
+
71
+ puts A.method(:singleton).source
72
+
73
+
74
+ #>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
data/files.rb ADDED
@@ -0,0 +1,24 @@
1
+ ### Get Files from dir
2
+ begin
3
+
4
+ files_to_be_loaded = %w[version.rb]
5
+
6
+ SpecFiles= Array.new
7
+
8
+ Dir[File.expand_path(File.join(File.dirname(__FILE__),"**","*"))].sort.uniq.each do |one_file_name|
9
+ one_file_name = File.expand_path one_file_name
10
+ file_name = one_file_name[(File.expand_path(File.dirname(__FILE__)).to_s.length+1)..(one_file_name.length-1)]
11
+
12
+ if !one_file_name.include?("pkg")
13
+ if !File.directory? file_name
14
+ SpecFiles.push file_name
15
+ STDOUT.puts file_name if $DEBUG
16
+ if files_to_be_loaded.include? one_file_name.split(File::SEPARATOR).last
17
+ load one_file_name
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+
24
+ end
data/lib/source.rb ADDED
@@ -0,0 +1,4 @@
1
+ #encoding: UTF-8
2
+ module Sourcerer
3
+ require 'sourcerer'
4
+ end
data/lib/sourcerer.rb ADDED
@@ -0,0 +1,14 @@
1
+ #encoding: UTF-8
2
+ module Sourcerer
3
+
4
+ require File.join(File.dirname(__FILE__),"sourcerer","proc_source")
5
+ require File.join(File.dirname(__FILE__),"sourcerer","proc_source_body")
6
+ require File.join(File.dirname(__FILE__),"sourcerer","proc_source_params")
7
+
8
+ require File.join(File.dirname(__FILE__),"sourcerer","string")
9
+ require File.join(File.dirname(__FILE__),"sourcerer","file")
10
+
11
+ require File.join(File.dirname(__FILE__),"sourcerer","method")
12
+ require File.join(File.dirname(__FILE__),"sourcerer","proc")
13
+
14
+ end
@@ -0,0 +1,23 @@
1
+ class 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
+ line_num= 1
12
+ text= self.read
13
+ text.gsub!(/\r\n?/, "\n")
14
+ text.each_line do |*line|
15
+ if line_num >= start_at
16
+ block.call *line
17
+ end
18
+ line_num += 1
19
+ end
20
+ end
21
+ end
22
+
23
+ end
@@ -0,0 +1,77 @@
1
+ module Sourcerer
2
+
3
+ module MethodDSL
4
+
5
+
6
+ # creatue a raw eval-able process source, so you can set
7
+ # the right bindings using the .to_proc call from String methods
8
+ def source
9
+
10
+ # defaults
11
+ begin
12
+ return_string= Sourcerer::ProcSource.new
13
+ block= 0
14
+ end
15
+
16
+ unless Sourcerer::ProcSource.source_cache[self.inspect].nil?
17
+ return Sourcerer::ProcSource.source_cache[self.inspect]
18
+ else
19
+
20
+ if self.source_location.nil?
21
+ return nil
22
+ end
23
+
24
+ File.open(File.expand_path(self.source_location[0])
25
+ ).each_line_from self.source_location[1] do |line|
26
+ block += line.source_formater_for_line_sub
27
+ return_string.concat(line)
28
+ break if block == 0
29
+ end
30
+
31
+ begin
32
+
33
+ if return_string.split("\n")[0].include? '('
34
+ return_string.sub!('(',' ')
35
+ return_string.sub!(')',' ')
36
+ end
37
+
38
+ args_to_replace = return_string.split("\n")[0].match(/\s*def\s*\S*\s*(.*)/).captures[0]
39
+
40
+ if args_to_replace != String.new
41
+ return_string.sub!(args_to_replace,"|#{args_to_replace}|")
42
+ end
43
+
44
+ rescue TypeError,NoMethodError
45
+ return nil
46
+ end
47
+
48
+ return_string.sub!(/\s*\bdef\s*[\w\S]*/,'Proc.new{')
49
+ return_string.sub!(/}[^}]*$/,"}")
50
+
51
+ if !return_string.include?('Proc.new')
52
+ return_string.sub!(/^[^{]*(?!={)/,'Proc.new')
53
+ end
54
+
55
+ if !self.source_location.nil?
56
+ Sourcerer::ProcSource.source_cache[self.inspect]= return_string
57
+ end
58
+
59
+ return return_string
60
+ end
61
+ end
62
+
63
+ alias :source_string :source
64
+ alias :proc_source :source
65
+
66
+ end
67
+
68
+ end
69
+
70
+
71
+ class Method
72
+ include Sourcerer::MethodDSL
73
+ end
74
+
75
+ class UnboundMethod
76
+ include Sourcerer::MethodDSL
77
+ end
@@ -0,0 +1,44 @@
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
6
+
7
+ # defaults
8
+ begin
9
+ return_string= Sourcerer::ProcSource.new
10
+ block= 0
11
+ end
12
+
13
+ unless Sourcerer::ProcSource.source_cache[self.inspect].nil?
14
+ return Sourcerer::ProcSource.source_cache[self.inspect]
15
+ else
16
+
17
+ if self.source_location.nil?
18
+ return "Proc.new { }"
19
+ end
20
+
21
+ File.open(File.expand_path(self.source_location[0])
22
+ ).each_line_from self.source_location[1] do |line|
23
+ block += line.source_formater_for_line_sub
24
+ return_string.concat(line)
25
+ break if block == 0
26
+ end
27
+
28
+ return_string.sub!(/^[\w\W]*Proc.new\s*{/,'Proc.new{')
29
+ return_string.sub!(/}[^}]*$/,"}")
30
+
31
+ if !return_string.include?('Proc.new')
32
+ return_string.sub!(/^[^{]*(?!={)/,'Proc.new')
33
+ end
34
+
35
+ if !self.source_location.nil?
36
+ Sourcerer::ProcSource.source_cache[self.inspect]= return_string
37
+ end
38
+
39
+ return return_string
40
+ end
41
+ end
42
+ alias :source_string :source
43
+
44
+ end
@@ -0,0 +1,103 @@
1
+ module Sourcerer
2
+ class ProcSource < String
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
+
12
+ def self.build(source_code_to_be_wrappered,*params_obj_array)
13
+ self.new(source_code_to_be_wrappered).wrapper_around!(*params_obj_array)
14
+ end
15
+
16
+ def wrapper_around!(*params)
17
+ if !params.nil?
18
+ params= params.join(',')
19
+ params.prepend(' |')
20
+ params.concat('|')
21
+ end
22
+ self.prepend("Proc.new{#{params}\n")
23
+ self.concat("\n}")
24
+ end
25
+
26
+ # create process object from valid process string
27
+ def to_proc(binding=nil)
28
+ begin
29
+
30
+ unless self.split("\n")[0].include?('Proc.new')
31
+ raise ArgumentError, "string obj is not a valid process source"
32
+ end
33
+
34
+ return_proc= nil
35
+ if binding.nil?
36
+ return_proc= eval(self)
37
+ else
38
+ return_proc= eval(self,binding)
39
+ end
40
+
41
+ if ProcSource.eval_keys.count > 1000
42
+ ProcSource.eval_keys.each {|e| ProcSource.source_cache.delete(e) }
43
+ ProcSource.eval_keys.clear
44
+ end
45
+ ProcSource.source_cache[return_proc.inspect]= self
46
+ ProcSource.eval_keys.push return_proc.inspect
47
+
48
+ return return_proc
49
+ end
50
+ end
51
+
52
+ def body
53
+
54
+ body= ProcSourceBody.new(self.dup.to_s)
55
+ body.sub!(/.*Proc\.new *{ *(\|.*\|)?/,String.new)
56
+ body.gsub!(/^$\n/, String.new)
57
+ body.sub!(/\s*}\s*$/,String.new)
58
+
59
+ return body
60
+ end
61
+
62
+ def params
63
+ #SystemStackError
64
+ params= self.dup
65
+ params.sub!(params.split("\n")[0].scan(/\s*Proc.new\s*{/)[0],String.new)
66
+ params.sub!(' ','')
67
+ params= params.split("\n")[0].scan(/^\s*{?\s*(.*)/)[0][0].gsub!('|','')
68
+ if params.nil?
69
+ return nil
70
+ end
71
+ return ProcSourceParams[*params.split(',')]
72
+ end
73
+
74
+ def parameters
75
+
76
+ return_array= Array.new
77
+ params= self.params
78
+ params.each do |one_raw_parameter|
79
+ case true
80
+ when one_raw_parameter.include?('=')
81
+ begin
82
+ return_array.push Array.new.push(:opt).push(
83
+ one_raw_parameter.split('=')[0].to_sym)
84
+ end
85
+ when one_raw_parameter[0] == '*'
86
+ begin
87
+ one_raw_parameter[0]= ''
88
+ return_array.push Array.new.push(:rest).push(
89
+ one_raw_parameter.to_sym)
90
+ end
91
+ else
92
+ begin
93
+ return_array.push Array.new.push(:req).push(
94
+ one_raw_parameter.to_sym)
95
+ end
96
+ end
97
+ end
98
+
99
+ return return_array
100
+ end
101
+
102
+ end
103
+ end
@@ -0,0 +1,14 @@
1
+ module Sourcerer
2
+ class ProcSourceBody < String
3
+
4
+ def +(oth_str)
5
+ ProcSourceBody.new(self.dup.concat("\n").concat(oth_str.to_s))
6
+ end
7
+
8
+ # build proc source
9
+ def build(*params)
10
+ ProcSource.build(self.to_s,*params)
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,37 @@
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
@@ -0,0 +1,25 @@
1
+ class String
2
+
3
+ # return the number how often the str is with in the self
4
+ # by default with \b regex border
5
+ def frequency(str)
6
+ begin
7
+ if str.class == String
8
+ str= '\b'+str+'\b'
9
+ end
10
+ end
11
+ self.scan(/#{str}/).count
12
+ end
13
+
14
+ # this is a helper to create source strings from procs
15
+ def source_formater_for_line_sub
16
+ self.gsub!(';',"\n")
17
+ self.gsub!(/\bdo\b/,'{')
18
+ self.gsub!(/\bend\b/,'}')
19
+
20
+ self.frequency(/{/)+
21
+ self.frequency(/def/)-
22
+ self.frequency(/}/)
23
+ end
24
+
25
+ end
data/sourcerer.gemspec ADDED
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+
3
+ require File.expand_path(File.join(File.dirname(__FILE__),"files.rb"))
4
+
5
+ ### Specification for the new Gem
6
+ Gem::Specification.new do |spec|
7
+
8
+ spec.name = "sourcerer"
9
+ spec.version = File.open(File.join(File.dirname(__FILE__),"VERSION")).read.split("\n")[0].chomp.gsub(' ','')
10
+ spec.authors = ["Adam Luzsi"]
11
+ spec.email = ["adamluzsi@gmail.com"]
12
+ spec.description = %q{ DSL for for simple to use proc source generating from methods, unbound methods and of course Proc/lambda. It will allow you to play with the source or even fuse two source code to make a new one and generate a proc from that. }
13
+ spec.summary = %q{Simple source extractor Based on standard CRuby}
14
+ spec.homepage = "https://github.com/adamluzsi/sourcerer"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = SpecFiles
18
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.require_paths = ["lib"]
21
+
22
+ ##=======Runtime-ENV================##
23
+ #spec.add_runtime_dependency "asdf", ['~>4.1.3']
24
+
25
+ ##=======Development-ENV============##
26
+ #spec.add_development_dependency "asdf",['~>4.1.3']
27
+
28
+ end
data/test/test.rb ADDED
File without changes
metadata ADDED
@@ -0,0 +1,67 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sourcerer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.0.pre.beta
5
+ platform: ruby
6
+ authors:
7
+ - Adam Luzsi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-25 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: ! ' DSL for for simple to use proc source generating from methods, unbound
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. '
16
+ email:
17
+ - adamluzsi@gmail.com
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - Gemfile
23
+ - Gemfile.lock
24
+ - LICENSE
25
+ - README.md
26
+ - Rakefile
27
+ - VERSION
28
+ - examples/fun_with_procs_and_methods.rb
29
+ - files.rb
30
+ - lib/source.rb
31
+ - lib/sourcerer.rb
32
+ - lib/sourcerer/file.rb
33
+ - lib/sourcerer/method.rb
34
+ - lib/sourcerer/proc.rb
35
+ - lib/sourcerer/proc_source.rb
36
+ - lib/sourcerer/proc_source_body.rb
37
+ - lib/sourcerer/proc_source_params.rb
38
+ - lib/sourcerer/string.rb
39
+ - sourcerer.gemspec
40
+ - test/test.rb
41
+ homepage: https://github.com/adamluzsi/sourcerer
42
+ licenses:
43
+ - MIT
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ! '>'
57
+ - !ruby/object:Gem::Version
58
+ version: 1.3.1
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.2.1
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: Simple source extractor Based on standard CRuby
65
+ test_files:
66
+ - test/test.rb
67
+ has_rdoc: