sourcify 0.1.2 → 0.2.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.
- data/.gitignore +1 -0
- data/HISTORY.txt +11 -0
- data/README.rdoc +52 -28
- data/VERSION +1 -1
- data/lib/sourcify.rb +13 -1
- data/lib/sourcify/proc.rb +7 -4
- data/lib/sourcify/proc/parser.rb +109 -40
- data/lib/sourcify/proc/scanner.rb +2140 -0
- data/lib/sourcify/proc/scanner.rl +285 -0
- data/lib/sourcify/proc/scanner/comment.rb +21 -0
- data/lib/sourcify/proc/scanner/counter.rb +44 -0
- data/lib/sourcify/proc/scanner/dstring.rb +58 -0
- data/lib/sourcify/proc/scanner/extensions.rb +135 -0
- data/lib/sourcify/proc/scanner/heredoc.rb +24 -0
- data/sourcify.gemspec +38 -9
- data/spec/dump_object_space_procs.rb +84 -0
- data/spec/proc/created_on_the_fly_proc_spec.rb +172 -0
- data/spec/proc/others_spec.rb +36 -0
- data/spec/proc/to_sexp_variables_spec.rb +6 -6
- data/spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb +2 -0
- data/spec/proc/to_source_from_multi_blocks_w_many_matches_spec.rb +105 -29
- data/spec/proc/to_source_from_multi_blocks_w_single_match_spec.rb +85 -17
- data/spec/proc_scanner/block_comment_spec.rb +59 -0
- data/spec/proc_scanner/double_colons_spec.rb +14 -0
- data/spec/proc_scanner/double_quote_str_w_interpolation_spec.rb +62 -0
- data/spec/proc_scanner/double_quote_str_wo_interpolation_spec.rb +75 -0
- data/spec/proc_scanner/heredoc_spec.rb +142 -0
- data/spec/proc_scanner/kw_do_alias1_spec.rb +87 -0
- data/spec/proc_scanner/kw_do_alias2_spec.rb +86 -0
- data/spec/proc_scanner/per_line_comment_spec.rb +34 -0
- data/spec/proc_scanner/single_quote_str_spec.rb +68 -0
- data/spec/proc_scanner/spec_helper.rb +33 -0
- data/spec/proc_scanner/to_proc_spec.rb +15 -0
- data/spec/spec_helper.rb +23 -0
- metadata +39 -10
- data/lib/sourcify/proc/counter.rb +0 -41
- data/lib/sourcify/proc/lexer.rb +0 -40
- data/lib/sourcify/proc/lexer18.rb +0 -237
- data/lib/sourcify/proc/lexer19.rb +0 -204
- data/spec/proc/misc_spec.rb +0 -16
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            module Sourcify
         | 
| 2 | 
            +
              module Proc
         | 
| 3 | 
            +
                module Scanner #:nodoc:all
         | 
| 4 | 
            +
                  class Heredoc < Struct.new(:tag, :indented)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                    def <<(content)
         | 
| 7 | 
            +
                      (@contents ||= []) << content
         | 
| 8 | 
            +
                    end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                    def to_s
         | 
| 11 | 
            +
                      @contents.join
         | 
| 12 | 
            +
                    end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                    def closed?(sealer)
         | 
| 15 | 
            +
                      return false unless sealer == "\n"
         | 
| 16 | 
            +
                      parts = @contents[-1].split("\n")
         | 
| 17 | 
            +
                      return true if parts[-1] == tag
         | 
| 18 | 
            +
                      indented && parts[-1].sub(/^\s*(.*)$/,'\1') == tag
         | 
| 19 | 
            +
                    end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
              end
         | 
| 24 | 
            +
            end
         | 
    
        data/sourcify.gemspec
    CHANGED
    
    | @@ -5,11 +5,11 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{sourcify}
         | 
| 8 | 
            -
              s.version = "0. | 
| 8 | 
            +
              s.version = "0.2.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["NgTzeYang"]
         | 
| 12 | 
            -
              s.date = %q{2010- | 
| 12 | 
            +
              s.date = %q{2010-09-11}
         | 
| 13 13 | 
             
              s.description = %q{}
         | 
| 14 14 | 
             
              s.email = %q{ngty77@gmail.com}
         | 
| 15 15 | 
             
              s.extra_rdoc_files = [
         | 
| @@ -26,14 +26,19 @@ Gem::Specification.new do |s| | |
| 26 26 | 
             
                 "VERSION",
         | 
| 27 27 | 
             
                 "lib/sourcify.rb",
         | 
| 28 28 | 
             
                 "lib/sourcify/proc.rb",
         | 
| 29 | 
            -
                 "lib/sourcify/proc/counter.rb",
         | 
| 30 | 
            -
                 "lib/sourcify/proc/lexer.rb",
         | 
| 31 | 
            -
                 "lib/sourcify/proc/lexer18.rb",
         | 
| 32 | 
            -
                 "lib/sourcify/proc/lexer19.rb",
         | 
| 33 29 | 
             
                 "lib/sourcify/proc/parser.rb",
         | 
| 30 | 
            +
                 "lib/sourcify/proc/scanner.rb",
         | 
| 31 | 
            +
                 "lib/sourcify/proc/scanner.rl",
         | 
| 32 | 
            +
                 "lib/sourcify/proc/scanner/comment.rb",
         | 
| 33 | 
            +
                 "lib/sourcify/proc/scanner/counter.rb",
         | 
| 34 | 
            +
                 "lib/sourcify/proc/scanner/dstring.rb",
         | 
| 35 | 
            +
                 "lib/sourcify/proc/scanner/extensions.rb",
         | 
| 36 | 
            +
                 "lib/sourcify/proc/scanner/heredoc.rb",
         | 
| 34 37 | 
             
                 "sourcify.gemspec",
         | 
| 38 | 
            +
                 "spec/dump_object_space_procs.rb",
         | 
| 35 39 | 
             
                 "spec/proc/19x_extras.rb",
         | 
| 36 | 
            -
                 "spec/proc/ | 
| 40 | 
            +
                 "spec/proc/created_on_the_fly_proc_spec.rb",
         | 
| 41 | 
            +
                 "spec/proc/others_spec.rb",
         | 
| 37 42 | 
             
                 "spec/proc/readme",
         | 
| 38 43 | 
             
                 "spec/proc/to_sexp_variables_spec.rb",
         | 
| 39 44 | 
             
                 "spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb",
         | 
| @@ -58,6 +63,17 @@ Gem::Specification.new do |s| | |
| 58 63 | 
             
                 "spec/proc/to_source_magic_file_var_spec.rb",
         | 
| 59 64 | 
             
                 "spec/proc/to_source_magic_line_var_spec.rb",
         | 
| 60 65 | 
             
                 "spec/proc/to_source_variables_spec.rb",
         | 
| 66 | 
            +
                 "spec/proc_scanner/block_comment_spec.rb",
         | 
| 67 | 
            +
                 "spec/proc_scanner/double_colons_spec.rb",
         | 
| 68 | 
            +
                 "spec/proc_scanner/double_quote_str_w_interpolation_spec.rb",
         | 
| 69 | 
            +
                 "spec/proc_scanner/double_quote_str_wo_interpolation_spec.rb",
         | 
| 70 | 
            +
                 "spec/proc_scanner/heredoc_spec.rb",
         | 
| 71 | 
            +
                 "spec/proc_scanner/kw_do_alias1_spec.rb",
         | 
| 72 | 
            +
                 "spec/proc_scanner/kw_do_alias2_spec.rb",
         | 
| 73 | 
            +
                 "spec/proc_scanner/per_line_comment_spec.rb",
         | 
| 74 | 
            +
                 "spec/proc_scanner/single_quote_str_spec.rb",
         | 
| 75 | 
            +
                 "spec/proc_scanner/spec_helper.rb",
         | 
| 76 | 
            +
                 "spec/proc_scanner/to_proc_spec.rb",
         | 
| 61 77 | 
             
                 "spec/spec_helper.rb"
         | 
| 62 78 | 
             
              ]
         | 
| 63 79 | 
             
              s.homepage = %q{http://github.com/ngty/sourcify}
         | 
| @@ -66,9 +82,21 @@ Gem::Specification.new do |s| | |
| 66 82 | 
             
              s.rubygems_version = %q{1.3.7}
         | 
| 67 83 | 
             
              s.summary = %q{Workarounds before ruby-core officially supports Proc#to_source (& friends)}
         | 
| 68 84 | 
             
              s.test_files = [
         | 
| 69 | 
            -
                "spec/ | 
| 85 | 
            +
                "spec/proc_scanner/kw_do_alias1_spec.rb",
         | 
| 86 | 
            +
                 "spec/proc_scanner/single_quote_str_spec.rb",
         | 
| 87 | 
            +
                 "spec/proc_scanner/to_proc_spec.rb",
         | 
| 88 | 
            +
                 "spec/proc_scanner/kw_do_alias2_spec.rb",
         | 
| 89 | 
            +
                 "spec/proc_scanner/double_colons_spec.rb",
         | 
| 90 | 
            +
                 "spec/proc_scanner/block_comment_spec.rb",
         | 
| 91 | 
            +
                 "spec/proc_scanner/per_line_comment_spec.rb",
         | 
| 92 | 
            +
                 "spec/proc_scanner/heredoc_spec.rb",
         | 
| 93 | 
            +
                 "spec/proc_scanner/double_quote_str_w_interpolation_spec.rb",
         | 
| 94 | 
            +
                 "spec/proc_scanner/spec_helper.rb",
         | 
| 95 | 
            +
                 "spec/proc_scanner/double_quote_str_wo_interpolation_spec.rb",
         | 
| 96 | 
            +
                 "spec/proc/to_source_from_do_end_block_w_nested_until_spec.rb",
         | 
| 70 97 | 
             
                 "spec/proc/to_source_from_do_end_block_w_nested_begin_spec.rb",
         | 
| 71 98 | 
             
                 "spec/proc/to_source_from_braced_block_w_nested_hash_spec.rb",
         | 
| 99 | 
            +
                 "spec/proc/created_on_the_fly_proc_spec.rb",
         | 
| 72 100 | 
             
                 "spec/proc/to_source_from_braced_block_wo_nesting_complication_spec.rb",
         | 
| 73 101 | 
             
                 "spec/proc/to_source_from_do_end_block_w_nested_while_spec.rb",
         | 
| 74 102 | 
             
                 "spec/proc/to_source_from_multi_do_end_blocks_w_single_match_spec.rb",
         | 
| @@ -82,15 +110,16 @@ Gem::Specification.new do |s| | |
| 82 110 | 
             
                 "spec/proc/to_source_magic_line_var_spec.rb",
         | 
| 83 111 | 
             
                 "spec/proc/to_source_from_do_end_block_w_nested_literal_keyword_spec.rb",
         | 
| 84 112 | 
             
                 "spec/proc/to_source_from_do_end_block_w_nested_unless_spec.rb",
         | 
| 113 | 
            +
                 "spec/proc/others_spec.rb",
         | 
| 85 114 | 
             
                 "spec/proc/19x_extras.rb",
         | 
| 86 115 | 
             
                 "spec/proc/to_source_from_braced_block_w_nested_braced_block_spec.rb",
         | 
| 87 116 | 
             
                 "spec/proc/to_source_from_do_end_block_wo_nesting_complication_spec.rb",
         | 
| 88 117 | 
             
                 "spec/proc/to_source_variables_spec.rb",
         | 
| 89 118 | 
             
                 "spec/proc/to_sexp_variables_spec.rb",
         | 
| 90 119 | 
             
                 "spec/proc/to_source_magic_file_var_spec.rb",
         | 
| 91 | 
            -
                 "spec/proc/misc_spec.rb",
         | 
| 92 120 | 
             
                 "spec/proc/to_source_from_do_end_block_w_nested_if_spec.rb",
         | 
| 93 121 | 
             
                 "spec/proc/to_source_from_do_end_block_w_nested_for_spec.rb",
         | 
| 122 | 
            +
                 "spec/dump_object_space_procs.rb",
         | 
| 94 123 | 
             
                 "spec/spec_helper.rb"
         | 
| 95 124 | 
             
              ]
         | 
| 96 125 |  | 
| @@ -0,0 +1,84 @@ | |
| 1 | 
            +
            require File.join(File.dirname(File.expand_path(__FILE__)), '..', 'lib', 'sourcify')
         | 
| 2 | 
            +
            require 'benchmark'
         | 
| 3 | 
            +
            require 'pp'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            if RUBY_PLATFORM =~ /java/i
         | 
| 6 | 
            +
              require 'jruby'
         | 
| 7 | 
            +
              JRuby.objectspace = true
         | 
| 8 | 
            +
              reload! rescue nil
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            DUMPED_OBJECT_SPACE_PROCS = {:max => nil, :done => 0}
         | 
| 12 | 
            +
            DUMP_OBJECT_SPACE_PROCS_ERRORS = []
         | 
| 13 | 
            +
            class STOP_DUMPING_OBJECT_SPACE_PROCS < Exception; end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            def dump_object_space_procs(debug = false)
         | 
| 16 | 
            +
              # Determine working dir
         | 
| 17 | 
            +
              name = [
         | 
| 18 | 
            +
                RUBY_DESCRIPTION =~ /enterprise/i ? 'ree' : (RUBY_PLATFORM =~ /java/i ? 'jruby' : 'mri'),
         | 
| 19 | 
            +
                RUBY_VERSION,
         | 
| 20 | 
            +
                Object.const_defined?(:ParseTree) ? 'parsetree' : nil
         | 
| 21 | 
            +
              ].compact.join('~')
         | 
| 22 | 
            +
              dump_dir = File.join(File.dirname(File.expand_path(__FILE__)), '..', 'tmp', name)
         | 
| 23 | 
            +
              Dir.mkdir(dump_dir) unless File.exists?(dump_dir)
         | 
| 24 | 
            +
             | 
| 25 | 
            +
              puts '',
         | 
| 26 | 
            +
                '== NOTE: dump files can be found at %s' % dump_dir
         | 
| 27 | 
            +
             | 
| 28 | 
            +
              # Core processing
         | 
| 29 | 
            +
              ObjectSpace.each_object(Proc).to_a.
         | 
| 30 | 
            +
                group_by{|o| o.source_location[0] }.each do |ofile, objs|
         | 
| 31 | 
            +
                  nfile = File.join(dump_dir, ofile.gsub('/','~'))
         | 
| 32 | 
            +
                  File.open(nfile,'w') do |f|
         | 
| 33 | 
            +
                    objs.sort_by{|o| o.source_location[1] }.map do |o|
         | 
| 34 | 
            +
                      DUMPED_OBJECT_SPACE_PROCS[:done] += 1
         | 
| 35 | 
            +
                      begin
         | 
| 36 | 
            +
                        data = {
         | 
| 37 | 
            +
                          :location => o.source_location,
         | 
| 38 | 
            +
                          :sexp => o.to_sexp,
         | 
| 39 | 
            +
                          :source => o.to_source
         | 
| 40 | 
            +
                        }
         | 
| 41 | 
            +
                        f.puts(data.pretty_inspect)
         | 
| 42 | 
            +
                        print '.'
         | 
| 43 | 
            +
                      rescue Exception
         | 
| 44 | 
            +
                        data = {
         | 
| 45 | 
            +
                          :location => o.source_location,
         | 
| 46 | 
            +
                          :error => $!.inspect
         | 
| 47 | 
            +
                        }
         | 
| 48 | 
            +
                        DUMP_OBJECT_SPACE_PROCS_ERRORS << data
         | 
| 49 | 
            +
                        f.puts(data.pretty_inspect)
         | 
| 50 | 
            +
                        pp(data) if debug
         | 
| 51 | 
            +
                        print 'x'
         | 
| 52 | 
            +
                      ensure
         | 
| 53 | 
            +
                        raise STOP_DUMPING_OBJECT_SPACE_PROCS \
         | 
| 54 | 
            +
                          if DUMPED_OBJECT_SPACE_PROCS.values.uniq.size == 1
         | 
| 55 | 
            +
                      end
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
                  end
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
            end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            # Dumping in action
         | 
| 62 | 
            +
            figures = Benchmark.measure do
         | 
| 63 | 
            +
              begin
         | 
| 64 | 
            +
                dump_object_space_procs
         | 
| 65 | 
            +
              rescue STOP_DUMPING_OBJECT_SPACE_PROCS
         | 
| 66 | 
            +
              end
         | 
| 67 | 
            +
            end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            # Printout the failures/passes
         | 
| 70 | 
            +
            unless DUMP_OBJECT_SPACE_PROCS_ERRORS.empty?
         | 
| 71 | 
            +
              puts '', '== OOPS, we have some erorrs :('
         | 
| 72 | 
            +
              DUMP_OBJECT_SPACE_PROCS_ERRORS.each_with_index do |e, i|
         | 
| 73 | 
            +
                print "#{i}). %s" % e.pretty_inspect
         | 
| 74 | 
            +
              end
         | 
| 75 | 
            +
            else
         | 
| 76 | 
            +
              puts '', '== YEAH, no errors :)'
         | 
| 77 | 
            +
            end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            # Printout the benchmark results
         | 
| 80 | 
            +
            puts '',
         | 
| 81 | 
            +
              '== Benchmark results for processing %s procs:' % DUMPED_OBJECT_SPACE_PROCS[:done],
         | 
| 82 | 
            +
              figures.to_s, ''
         | 
| 83 | 
            +
             | 
| 84 | 
            +
            # __END__
         | 
| @@ -0,0 +1,172 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), '..', 'spec_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe "Created on the fly proc" do
         | 
| 4 | 
            +
              unless Object.const_defined?(:ParseTree)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                klass = Class.new do
         | 
| 7 | 
            +
                  def test(&block); block ; end
         | 
| 8 | 
            +
                  def blah; 1+2; end
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                describe 'Blah#to_proc raising Sourcify::CannotHandleCreatedOnTheFlyProcError' do
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  should "raise when created by :to_proc" do
         | 
| 14 | 
            +
                    lambda {
         | 
| 15 | 
            +
                      x, y = klass.new.method(:test).to_proc, lambda { 1+2 }
         | 
| 16 | 
            +
                      x.to_source
         | 
| 17 | 
            +
                    }.should.raise(Sourcify::CannotHandleCreatedOnTheFlyProcError)
         | 
| 18 | 
            +
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  should "not raise even with prepending :to_proc on the same line" do
         | 
| 21 | 
            +
                    x, y = klass.new.method(:test).to_proc, lambda { 1+2 }
         | 
| 22 | 
            +
                    y.to_source.should.not.be.nil
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  should "not raise even with appending :to_proc on the same line" do
         | 
| 26 | 
            +
                    x, y = lambda { 1+2 }, klass.new.method(:test).to_proc
         | 
| 27 | 
            +
                    x.to_source.should.not.be.nil
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  should "not raise even with nested :to_proc on the same line" do
         | 
| 31 | 
            +
                    x = lambda { klass.new.method(:test).to_proc }
         | 
| 32 | 
            +
                    x.to_source.should.not.be.nil
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                if RUBY_VERSION.include?('1.9.') or RUBY_PLATFORM =~ /java/i
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  describe '&:blah raising Sourcify::CannotHandleCreatedOnTheFlyProcError' do
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    should "raise when created by &:blah" do
         | 
| 42 | 
            +
                      lambda {
         | 
| 43 | 
            +
                        x, y = klass.new.test(&:blah), lambda { 1+2 }
         | 
| 44 | 
            +
                        x.to_source
         | 
| 45 | 
            +
                      }.should.raise(Sourcify::CannotHandleCreatedOnTheFlyProcError)
         | 
| 46 | 
            +
                    end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    should "not raise even with prepending &:blah on the same line" do
         | 
| 49 | 
            +
                      x, y = klass.new.test(&:blah), lambda { 1+2 }
         | 
| 50 | 
            +
                      y.to_source.should.not.be.nil
         | 
| 51 | 
            +
                    end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    should "not raise even with appending &:blah on the same line" do
         | 
| 54 | 
            +
                      x, y = lambda { 1+2 }, klass.new.test(&:blah)
         | 
| 55 | 
            +
                      x.to_source.should.not.be.nil
         | 
| 56 | 
            +
                    end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    should "not raise even with nested &:blah on the same line" do
         | 
| 59 | 
            +
                      x = lambda { klass.new.test(&:blah) }
         | 
| 60 | 
            +
                      x.to_source.should.not.be.nil
         | 
| 61 | 
            +
                    end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    should "not raise with nested &:blah on diff line" do
         | 
| 64 | 
            +
                      (
         | 
| 65 | 
            +
                        lambda do
         | 
| 66 | 
            +
                          klass.new.test(&:blah)
         | 
| 67 | 
            +
                        end
         | 
| 68 | 
            +
                      ).to_source.should.not.be.nil
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                  end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                else
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                  describe '&:blah raising Sourcify::CannotHandleCreatedOnTheFlyProcError' do
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                    should "raise w no other proc on the same line" do
         | 
| 78 | 
            +
                      lambda {
         | 
| 79 | 
            +
                        x = klass.new.test(&:blah)
         | 
| 80 | 
            +
                        x.to_source
         | 
| 81 | 
            +
                      }.should.raise(Sourcify::CannotHandleCreatedOnTheFlyProcError)
         | 
| 82 | 
            +
                    end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    should "raise w prepending proc of different arity on the same line" do
         | 
| 85 | 
            +
                      lambda {
         | 
| 86 | 
            +
                        y, x = lambda {|a| 1+2 }, klass.new.test(&:blah)
         | 
| 87 | 
            +
                        x.to_source
         | 
| 88 | 
            +
                      }.should.raise(Sourcify::CannotHandleCreatedOnTheFlyProcError)
         | 
| 89 | 
            +
                    end
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                    should "raise w appending proc of different arity on the same line" do
         | 
| 92 | 
            +
                      lambda {
         | 
| 93 | 
            +
                        x, y = klass.new.test(&:blah), lambda {|a| 1+2 }
         | 
| 94 | 
            +
                        x.to_source
         | 
| 95 | 
            +
                      }.should.raise(Sourcify::CannotHandleCreatedOnTheFlyProcError)
         | 
| 96 | 
            +
                    end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                    should "raise w nested proc of different arity on the same line" do
         | 
| 99 | 
            +
                      lambda {
         | 
| 100 | 
            +
                        y = lambda {|a| klass.new.test(&:blah) }
         | 
| 101 | 
            +
                        x = y.call(1).to_source
         | 
| 102 | 
            +
                      }.should.raise(Sourcify::CannotHandleCreatedOnTheFlyProcError)
         | 
| 103 | 
            +
                    end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    should "not raise with nested &:blah on diff line" do
         | 
| 106 | 
            +
                      (
         | 
| 107 | 
            +
                        lambda do
         | 
| 108 | 
            +
                          klass.new.test(&:blah)
         | 
| 109 | 
            +
                        end
         | 
| 110 | 
            +
                      ).to_source.should.not.be.nil
         | 
| 111 | 
            +
                    end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                  end
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                  describe '&:blah raising Sourcify::MultipleMatchingProcsPerLineError' do
         | 
| 116 | 
            +
             | 
| 117 | 
            +
                    should 'raise w prepending proc w zero arg (arity -1) on the same line' do
         | 
| 118 | 
            +
                      lambda {
         | 
| 119 | 
            +
                        y, x = lambda { 1+2 }, klass.new.test(&:blah)
         | 
| 120 | 
            +
                        x.to_source
         | 
| 121 | 
            +
                      }.should.raise(Sourcify::MultipleMatchingProcsPerLineError)
         | 
| 122 | 
            +
                    end
         | 
| 123 | 
            +
             | 
| 124 | 
            +
                    should 'raise w appending proc w zero arg (arity -1) on the same line' do
         | 
| 125 | 
            +
                      lambda {
         | 
| 126 | 
            +
                        x, y = klass.new.test(&:blah), lambda { 1+2 }
         | 
| 127 | 
            +
                        x.to_source
         | 
| 128 | 
            +
                      }.should.raise(Sourcify::MultipleMatchingProcsPerLineError)
         | 
| 129 | 
            +
                    end
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    should 'raise w nested proc w zero arg (arity -1) on the same line' do
         | 
| 132 | 
            +
                      lambda {
         | 
| 133 | 
            +
                        x = lambda { klass.new.test(&:blah) }
         | 
| 134 | 
            +
                        x.call.to_source
         | 
| 135 | 
            +
                      }.should.raise(Sourcify::MultipleMatchingProcsPerLineError)
         | 
| 136 | 
            +
                    end
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    should 'raise w prepending proc w single optional arg (arity -1) on the same line' do
         | 
| 139 | 
            +
                      lambda {
         | 
| 140 | 
            +
                        y, x = lambda {|*a| 1+2 }, klass.new.test(&:blah)
         | 
| 141 | 
            +
                        x.to_source
         | 
| 142 | 
            +
                      }.should.raise(Sourcify::MultipleMatchingProcsPerLineError)
         | 
| 143 | 
            +
                    end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                    should 'raise w appending proc w single optional arg (arity -1) on the same line' do
         | 
| 146 | 
            +
                      lambda {
         | 
| 147 | 
            +
                        x, y = klass.new.test(&:blah), lambda {|*a| 1+2 }
         | 
| 148 | 
            +
                        x.to_source
         | 
| 149 | 
            +
                      }.should.raise(Sourcify::MultipleMatchingProcsPerLineError)
         | 
| 150 | 
            +
                    end
         | 
| 151 | 
            +
             | 
| 152 | 
            +
                    should 'raise w nested proc w single optional arg (arity -1) on the same line' do
         | 
| 153 | 
            +
                      lambda {
         | 
| 154 | 
            +
                        x = lambda {|*a| klass.new.test(&:blah) }
         | 
| 155 | 
            +
                        x.call.to_source
         | 
| 156 | 
            +
                      }.should.raise(Sourcify::MultipleMatchingProcsPerLineError)
         | 
| 157 | 
            +
                    end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    should "not raise with nested &:blah on diff line" do
         | 
| 160 | 
            +
                      (
         | 
| 161 | 
            +
                        lambda do
         | 
| 162 | 
            +
                          x = klass.new.test(&:blah)
         | 
| 163 | 
            +
                        end
         | 
| 164 | 
            +
                      ).to_source.should.not.be.nil
         | 
| 165 | 
            +
                    end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                  end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                end
         | 
| 170 | 
            +
             | 
| 171 | 
            +
              end
         | 
| 172 | 
            +
            end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            require File.join(File.dirname(__FILE__), '..', 'spec_helper')
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            describe "Misc" do
         | 
| 4 | 
            +
             | 
| 5 | 
            +
              should 'handle accessing #to_sexp after #to_source' do
         | 
| 6 | 
            +
                (s_proc = lambda { :test }).to_source
         | 
| 7 | 
            +
                s_proc.should.be having_sexp(s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:lit, :test)))
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              should 'handle accessing #to_source after #to_sexp' do
         | 
| 11 | 
            +
                (s_proc = lambda { :test }).to_sexp
         | 
| 12 | 
            +
                s_proc.should.be having_source('proc { :test }')
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              should "handle lexer bug in missing trailing chars after '=>' operator" do
         | 
| 16 | 
            +
                # This example addresses bug @ http://redmine.ruby-lang.org/issues/show/3765
         | 
| 17 | 
            +
                {
         | 
| 18 | 
            +
                  __LINE__ => lambda { :test }
         | 
| 19 | 
            +
                }.values.last.should.be having_source('proc { :test }')
         | 
| 20 | 
            +
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              should "handle lexer bug in missing trailing chars after '=>' operator" do
         | 
| 23 | 
            +
                # This example addresses bug @ http://redmine.ruby-lang.org/issues/show/3765
         | 
| 24 | 
            +
                {
         | 
| 25 | 
            +
                  __LINE__ => lambda do :test end
         | 
| 26 | 
            +
                }.values.last.should.be having_source('proc { :test }')
         | 
| 27 | 
            +
              end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
              unless Object.const_defined?(:ParseTree)
         | 
| 30 | 
            +
                should "raise Sourcify::CannotParseEvalCodeError when proc is created from eval" do
         | 
| 31 | 
            +
                  lambda { eval("proc {:test }").to_source }.should.
         | 
| 32 | 
            +
                    raise(Sourcify::CannotParseEvalCodeError)
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            end
         | 
| @@ -30,14 +30,14 @@ describe "Proc#to_sexp (variables)" do | |
| 30 30 | 
             
              should 'handle class_eval scoped local var' do
         | 
| 31 31 | 
             
                (
         | 
| 32 32 | 
             
                  x = 1
         | 
| 33 | 
            -
                  lambda { Object.class_eval { y = x } }
         | 
| 33 | 
            +
                  lambda { Object.class_eval {|x| y = x } }
         | 
| 34 34 | 
             
                ).should.be having_sexp(
         | 
| 35 35 | 
             
                  s(:iter,
         | 
| 36 36 | 
             
                    s(:call, nil, :proc, s(:arglist)),
         | 
| 37 37 | 
             
                    nil,
         | 
| 38 38 | 
             
                    s(:iter,
         | 
| 39 39 | 
             
                      s(:call, s(:const, :Object), :class_eval, s(:arglist)),
         | 
| 40 | 
            -
                       | 
| 40 | 
            +
                      s(:lasgn, :x),
         | 
| 41 41 | 
             
                      s(:lasgn, :y, s(:lvar, :x))))
         | 
| 42 42 | 
             
                )
         | 
| 43 43 | 
             
              end
         | 
| @@ -45,14 +45,14 @@ describe "Proc#to_sexp (variables)" do | |
| 45 45 | 
             
              should 'handle instance_eval scoped local var' do
         | 
| 46 46 | 
             
                (
         | 
| 47 47 | 
             
                  x = 1
         | 
| 48 | 
            -
                  lambda { 'aa'.instance_eval { y = x } }
         | 
| 48 | 
            +
                  lambda { 'aa'.instance_eval {|x| y = x } }
         | 
| 49 49 | 
             
                ).should.be having_sexp(
         | 
| 50 50 | 
             
                  s(:iter,
         | 
| 51 51 | 
             
                    s(:call, nil, :proc, s(:arglist)),
         | 
| 52 52 | 
             
                    nil,
         | 
| 53 53 | 
             
                    s(:iter,
         | 
| 54 54 | 
             
                      s(:call, s(:str, "aa"), :instance_eval, s(:arglist)),
         | 
| 55 | 
            -
                       | 
| 55 | 
            +
                      s(:lasgn, :x),
         | 
| 56 56 | 
             
                      s(:lasgn, :y, s(:lvar, :x))))
         | 
| 57 57 | 
             
                )
         | 
| 58 58 | 
             
              end
         | 
| @@ -60,7 +60,7 @@ describe "Proc#to_sexp (variables)" do | |
| 60 60 | 
             
              should 'handle define_method scoped local var' do
         | 
| 61 61 | 
             
                (
         | 
| 62 62 | 
             
                  x = 1
         | 
| 63 | 
            -
                  lambda { Object.send(:define_method, :aa) { y = x } }
         | 
| 63 | 
            +
                  lambda { Object.send(:define_method, :aa) {|x| y = x } }
         | 
| 64 64 | 
             
                ).should.be having_sexp(
         | 
| 65 65 | 
             
                  s(:iter,
         | 
| 66 66 | 
             
                    s(:call, nil, :proc, s(:arglist)),
         | 
| @@ -70,7 +70,7 @@ describe "Proc#to_sexp (variables)" do | |
| 70 70 | 
             
                        s(:const, :Object),
         | 
| 71 71 | 
             
                        :send,
         | 
| 72 72 | 
             
                        s(:arglist, s(:lit, :define_method), s(:lit, :aa))),
         | 
| 73 | 
            -
                         | 
| 73 | 
            +
                        s(:lasgn, :x),
         | 
| 74 74 | 
             
                        s(:lasgn, :y, s(:lvar, :x))))
         | 
| 75 75 | 
             
                )
         | 
| 76 76 | 
             
              end
         |