rascut 0.1.3 → 0.2.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/ChangeLog +5 -0
- data/README +3 -3
- data/Rakefile +9 -2
- data/bin/rascut +0 -0
- data/bin/rasdoc +25 -0
- data/lib/rascut.rb +1 -1
- data/lib/rascut/asdoc/data.rb +125 -0
- data/lib/rascut/asdoc/generator.rb +92 -0
- data/lib/rascut/asdoc/httpd.rb +124 -0
- data/lib/rascut/asdoc/parser.rb +69 -0
- data/lib/rascut/command.rb +9 -10
- data/lib/rascut/fcsh_wrapper.rb +11 -2
- data/lib/rascut/file_observer.rb +2 -1
- data/lib/rascut/httpd.rb +88 -103
- data/lib/rascut/plugin/generate_ctags.rb +23 -0
- data/lib/rascut/plugin/screen.rb +58 -0
- data/lib/rascut/utils.rb +65 -0
- metadata +81 -62
    
        data/ChangeLog
    CHANGED
    
    
    
        data/README
    CHANGED
    
    | @@ -16,14 +16,14 @@ Rascut is Ruby ActionSCript UTility :D | |
| 16 16 |  | 
| 17 17 | 
             
            == REQUIREMENTS:
         | 
| 18 18 |  | 
| 19 | 
            -
            * hoe
         | 
| 20 | 
            -
            * rack
         | 
| 21 19 | 
             
            * mongrel
         | 
| 22 20 | 
             
            * rake
         | 
| 23 21 |  | 
| 24 22 | 
             
            == INSTALL:
         | 
| 25 23 |  | 
| 26 24 | 
             
            * gem install rascut
         | 
| 25 | 
            +
             or
         | 
| 26 | 
            +
            * gem install hotchpotch-rascut
         | 
| 27 27 |  | 
| 28 28 | 
             
            == OTHER:
         | 
| 29 29 | 
             
            * vendor/js/swfobject.js is SWFObject by http://blog.deconcept.com/swfobject/
         | 
| @@ -56,4 +56,4 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| 56 56 | 
             
            == SPECIAL THANKS
         | 
| 57 57 | 
             
            Thank you feedback!
         | 
| 58 58 |  | 
| 59 | 
            -
            id:os0x, yugui, id:wanpark, saqoosha, id:ameema
         | 
| 59 | 
            +
            id:os0x, yugui, id:wanpark, saqoosha, id:ameema, id:cho45
         | 
    
        data/Rakefile
    CHANGED
    
    | @@ -9,7 +9,8 @@ require 'rake/contrib/rubyforgepublisher' | |
| 9 9 | 
             
            require 'fileutils'
         | 
| 10 10 | 
             
            include FileUtils
         | 
| 11 11 |  | 
| 12 | 
            -
             | 
| 12 | 
            +
            $LOAD_PATH.unshift "lib"
         | 
| 13 | 
            +
            require  'rascut'
         | 
| 13 14 |  | 
| 14 15 | 
             
            AUTHOR = "Yuichi Tateno"
         | 
| 15 16 | 
             
            EMAIL = "hotchpotch@nospam@gmail.com"
         | 
| @@ -62,7 +63,7 @@ spec = Gem::Specification.new do |s| | |
| 62 63 |  | 
| 63 64 | 
             
              s.add_dependency('rake')
         | 
| 64 65 | 
             
              s.add_dependency('mongrel')
         | 
| 65 | 
            -
              s.add_dependency(' | 
| 66 | 
            +
              s.add_dependency('json_pure')
         | 
| 66 67 | 
             
              s.required_ruby_version = '>= 1.8.2'
         | 
| 67 68 |  | 
| 68 69 | 
             
              s.files = %w(README ChangeLog Rakefile) +
         | 
| @@ -135,3 +136,9 @@ task :release => [:clean, :package] do |t| | |
| 135 136 | 
             
              puts "Releasing #{NAME} v. #{VERS}"
         | 
| 136 137 | 
             
              rf.add_release RUBYFORGE_PROJECT, NAME, VERS, *files
         | 
| 137 138 | 
             
            end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            desc 'Show information about the gem.'
         | 
| 141 | 
            +
            task :debug_gem do
         | 
| 142 | 
            +
              puts spec.to_ruby
         | 
| 143 | 
            +
            end
         | 
| 144 | 
            +
             | 
    
        data/bin/rascut
    CHANGED
    
    | 
            File without changes
         | 
    
        data/bin/rasdoc
    ADDED
    
    | @@ -0,0 +1,25 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            begin
         | 
| 4 | 
            +
              require 'rascut/asdoc/data'
         | 
| 5 | 
            +
              require 'rascut/asdoc/generator'
         | 
| 6 | 
            +
            rescue LoadError
         | 
| 7 | 
            +
              require 'rubygems'
         | 
| 8 | 
            +
              require 'rascut/asdoc/generator'
         | 
| 9 | 
            +
            end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            c = ARGV.shift
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            case c
         | 
| 14 | 
            +
            when 'dict'
         | 
| 15 | 
            +
              puts Rascut::Asdoc::Data.asdoc_dict
         | 
| 16 | 
            +
            when 'import_dict'
         | 
| 17 | 
            +
              puts Rascut::Asdoc::Data.asdoc_import_dict
         | 
| 18 | 
            +
            when 'generate'
         | 
| 19 | 
            +
              g = Rascut::Asdoc::Generator.new
         | 
| 20 | 
            +
              g.asdoc = '/home/gorou/local/flex3/bin/asdoc'
         | 
| 21 | 
            +
              g.generate_asdoc ARGV.shift
         | 
| 22 | 
            +
            else
         | 
| 23 | 
            +
              puts 'rasdoc [dict import_dict generate]'
         | 
| 24 | 
            +
              exit 1
         | 
| 25 | 
            +
            end
         | 
    
        data/lib/rascut.rb
    CHANGED
    
    
| @@ -0,0 +1,125 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            require 'rubygems'
         | 
| 3 | 
            +
            require 'logger'
         | 
| 4 | 
            +
            require 'rascut/utils'
         | 
| 5 | 
            +
            require 'json'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            class Array
         | 
| 8 | 
            +
              def uniq_by
         | 
| 9 | 
            +
                inject({}) do |hash, item|
         | 
| 10 | 
            +
                  hash[yield(item)] ||= item
         | 
| 11 | 
            +
                  hash
         | 
| 12 | 
            +
                end.values
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
             | 
| 17 | 
            +
            module Rascut
         | 
| 18 | 
            +
              module Asdoc
         | 
| 19 | 
            +
                class Data
         | 
| 20 | 
            +
                  class <<
         | 
| 21 | 
            +
                    include Utils
         | 
| 22 | 
            +
                    def asdoc_json
         | 
| 23 | 
            +
                      asdoc_data.to_json
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def asdoc_import_dict
         | 
| 27 | 
            +
                      res = []
         | 
| 28 | 
            +
                      Utils.rascut_db_read do |db|
         | 
| 29 | 
            +
                        db[:asdoc].each do |key, val|
         | 
| 30 | 
            +
                          val.each {|v| 
         | 
| 31 | 
            +
                            next if v[:classname][0..0].match(/[a-z]/)
         | 
| 32 | 
            +
                            res << "#{v[:classname]} #{v[:package]}.#{v[:classname]}"
         | 
| 33 | 
            +
                          }
         | 
| 34 | 
            +
                        end
         | 
| 35 | 
            +
                      end
         | 
| 36 | 
            +
                      res.sort.uniq.join("\n")
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                    def asdoc_dict
         | 
| 40 | 
            +
                      res = []
         | 
| 41 | 
            +
                      Utils.rascut_db_read do |db|
         | 
| 42 | 
            +
                        db[:asdoc].each do |key, val|
         | 
| 43 | 
            +
                          val.each {|v| 
         | 
| 44 | 
            +
                            res << v[:classname] if v[:classname].length >= 4
         | 
| 45 | 
            +
                            v[:methods].each {|met|
         | 
| 46 | 
            +
                              res << met[:name] if met[:name].length >= 4
         | 
| 47 | 
            +
                            }
         | 
| 48 | 
            +
                          }
         | 
| 49 | 
            +
                        end
         | 
| 50 | 
            +
                      end
         | 
| 51 | 
            +
                      res.sort.uniq.join("\n")
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    def asdoc_data
         | 
| 55 | 
            +
                      classes = []
         | 
| 56 | 
            +
                      packages = []
         | 
| 57 | 
            +
                      methods = []
         | 
| 58 | 
            +
                      Utils.rascut_db_read do |db|
         | 
| 59 | 
            +
                        db[:asdoc].each do |key, val|
         | 
| 60 | 
            +
                          val.each {|v|
         | 
| 61 | 
            +
                            classes << {
         | 
| 62 | 
            +
                              :classname => v[:classname],
         | 
| 63 | 
            +
                              :package => v[:package],
         | 
| 64 | 
            +
                              :asdoc_dir => v[:asdoc_dir]
         | 
| 65 | 
            +
                            }
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                            packages << {
         | 
| 68 | 
            +
                              :package => v[:package],
         | 
| 69 | 
            +
                              :asdoc_dir => v[:asdoc_dir]
         | 
| 70 | 
            +
                            }
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                            v[:methods].each {|met|
         | 
| 73 | 
            +
                              met.delete :code
         | 
| 74 | 
            +
                              met.delete :summary
         | 
| 75 | 
            +
                              met[:package] = v[:package]
         | 
| 76 | 
            +
                              met[:classname] = v[:classname]
         | 
| 77 | 
            +
                              met[:href] = "#{v[:asdoc_dir]}/#{v[:filename]}#{met[:href]}"
         | 
| 78 | 
            +
                              methods << met
         | 
| 79 | 
            +
                            }
         | 
| 80 | 
            +
                          }
         | 
| 81 | 
            +
                        end
         | 
| 82 | 
            +
                      end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                      packages = packages.uniq_by {|s| s.to_a.join('_')}.sort_by {|a| a[:package]}
         | 
| 85 | 
            +
                      classes = classes.uniq_by {|s| s.to_a.join('_')}.sort_by {|a| a[:classname]}
         | 
| 86 | 
            +
                      {
         | 
| 87 | 
            +
                        :methods => methods.sort_by {|a| a[:name]},
         | 
| 88 | 
            +
                        :classes => classes,
         | 
| 89 | 
            +
                        :packages => packages
         | 
| 90 | 
            +
                      }
         | 
| 91 | 
            +
                    end
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                  end
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
            end
         | 
| 97 | 
            +
             | 
| 98 | 
            +
            if __FILE__ == $0
         | 
| 99 | 
            +
              require 'benchmark'
         | 
| 100 | 
            +
              puts Rascut::Asdoc::Data.asdoc_dict
         | 
| 101 | 
            +
             | 
| 102 | 
            +
              #exit
         | 
| 103 | 
            +
              #p res.select{|i| i[:name].index('draw') == 0 }.length
         | 
| 104 | 
            +
             | 
| 105 | 
            +
              #Benchmark.bm do |x|
         | 
| 106 | 
            +
              #  x.report {
         | 
| 107 | 
            +
              #    100.times {
         | 
| 108 | 
            +
              #       p = []
         | 
| 109 | 
            +
              #       res.select{|i| i[:name].index('draw') == 0 }
         | 
| 110 | 
            +
              #   }
         | 
| 111 | 
            +
              #  }
         | 
| 112 | 
            +
              #  x.report {
         | 
| 113 | 
            +
              #    100.times {
         | 
| 114 | 
            +
              #    res.select{|i| i[:name].match(/^draw/) }
         | 
| 115 | 
            +
              #   }
         | 
| 116 | 
            +
              #  }
         | 
| 117 | 
            +
              #  x.report {
         | 
| 118 | 
            +
              #    100.times {
         | 
| 119 | 
            +
              #    res.select{|i| i[:name][0..3] == 'draw' }
         | 
| 120 | 
            +
              #   }
         | 
| 121 | 
            +
              #  }
         | 
| 122 | 
            +
              #end
         | 
| 123 | 
            +
            end
         | 
| 124 | 
            +
             | 
| 125 | 
            +
             | 
| @@ -0,0 +1,92 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            require 'rubygems'
         | 
| 3 | 
            +
            require 'hpricot'
         | 
| 4 | 
            +
            require 'pp'
         | 
| 5 | 
            +
            require 'nkf'
         | 
| 6 | 
            +
            require 'logger'
         | 
| 7 | 
            +
            require 'pathname'
         | 
| 8 | 
            +
            require 'uri'
         | 
| 9 | 
            +
            require 'rascut/utils'
         | 
| 10 | 
            +
            require 'rascut/asdoc/parser'
         | 
| 11 | 
            +
            require 'rascut/asdoc/data'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module Rascut
         | 
| 14 | 
            +
              module Asdoc
         | 
| 15 | 
            +
                class Generator 
         | 
| 16 | 
            +
                  include Utils
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def initialize(logger = nil)
         | 
| 19 | 
            +
                    @logger = Logger.new(STDOUT)
         | 
| 20 | 
            +
                    @logger.level = Logger::DEBUG
         | 
| 21 | 
            +
                    @asdoc = 'asdoc'
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  attr_accessor :asdoc
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def generate_asdoc(source_path)
         | 
| 26 | 
            +
                      @logger.info "generate documents: #{source_path}"
         | 
| 27 | 
            +
                      cmd = "#{asdoc} -doc-sources '#{source_path}' -output '#{asdoc_home.join(path_escape(source_path.to_s))}'"
         | 
| 28 | 
            +
                      @logger.debug cmd
         | 
| 29 | 
            +
                      `#{cmd}`
         | 
| 30 | 
            +
                      generate_list_by_source_path(source_path)
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                  def generate_asdoc_by_config(flex_config)
         | 
| 34 | 
            +
                    source = Hpricot(flex_config)
         | 
| 35 | 
            +
                    files = source.search('source-path path-element').map {|el| Pathname.new(el.inner_text) }
         | 
| 36 | 
            +
                    files.each do |file|
         | 
| 37 | 
            +
                      generate_asdoc file.realpath
         | 
| 38 | 
            +
                    end
         | 
| 39 | 
            +
                  end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def generate_list_by_source_path(source_path)
         | 
| 42 | 
            +
                      generate_list(path_escape(source_path.to_s))
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  def generate_list(path)
         | 
| 46 | 
            +
                    @logger.info "generate list"
         | 
| 47 | 
            +
                    #Pathname.glob("#{asdoc_home}/#{asdoc_dir}").each do |asdoc|
         | 
| 48 | 
            +
                    asdoc = asdoc_home.join(path)
         | 
| 49 | 
            +
                      @logger.info "#{asdoc}"
         | 
| 50 | 
            +
                      Pathname.glob("#{asdoc}/*/**/*.html") do |file|
         | 
| 51 | 
            +
                        next if file.to_s.match(/((class-list.html)|(package-detail.html))$/)
         | 
| 52 | 
            +
                        r = Rascut::Asdoc::Parser.new(file.read, @logger)
         | 
| 53 | 
            +
                        r.parse
         | 
| 54 | 
            +
                        #pp file.to_s, r.package, r.classname#, r.methods
         | 
| 55 | 
            +
                        list = {
         | 
| 56 | 
            +
                          :package => r.package,
         | 
| 57 | 
            +
                          :classname => r.classname,
         | 
| 58 | 
            +
                          :methods => r.methods,
         | 
| 59 | 
            +
                          :filename => file.relative_path_from(asdoc).to_s,
         | 
| 60 | 
            +
                          :asdoc_dir => asdoc.basename.to_s,
         | 
| 61 | 
            +
                        }
         | 
| 62 | 
            +
                        rascut_db do |db|
         | 
| 63 | 
            +
                          db[:asdoc] ||= {}
         | 
| 64 | 
            +
                          db[:asdoc][list[:asdoc_dir]] ||= []
         | 
| 65 | 
            +
                          db[:asdoc][list[:asdoc_dir]] << list
         | 
| 66 | 
            +
                        end
         | 
| 67 | 
            +
                      end
         | 
| 68 | 
            +
                    #end
         | 
| 69 | 
            +
                    #generate_json
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  def generate_json
         | 
| 73 | 
            +
                    @logger.info "generate asdoc's index(json)."
         | 
| 74 | 
            +
                    json = Rascut::Asdoc::Data.asdoc_json
         | 
| 75 | 
            +
                    asdoc_home.join('asdoc.json').open('w') {|f| f.puts json }
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
              end
         | 
| 79 | 
            +
            end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
            if __FILE__ == $0
         | 
| 82 | 
            +
              include Rascut::Asdoc
         | 
| 83 | 
            +
              flex_config = '/home/gorou/local/flex2/frameworks/flex-config.xml'
         | 
| 84 | 
            +
              g = Generator.new #
         | 
| 85 | 
            +
              g.asdoc = '/home/gorou/local/flex3/bin/asdoc'
         | 
| 86 | 
            +
              #g.generate_asdoc_by_config(open(flex_config).read)
         | 
| 87 | 
            +
              #asdoc_dir = '/home/gorou/svn/as3/swfassist/src'
         | 
| 88 | 
            +
              asdoc_dir = '/home/gorou/svn/as3rails2u/trunk/src'
         | 
| 89 | 
            +
              #g.generate_asdoc(asdoc_dir)
         | 
| 90 | 
            +
              g.generate_list_by_source_path asdoc_dir
         | 
| 91 | 
            +
            end
         | 
| 92 | 
            +
             | 
| @@ -0,0 +1,124 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            require 'rubygems'
         | 
| 3 | 
            +
            require 'mongrel'
         | 
| 4 | 
            +
            require 'mongrel/handlers'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            require 'rascut/utils'
         | 
| 7 | 
            +
            require 'rascut/asdoc/data'
         | 
| 8 | 
            +
            require 'thread'
         | 
| 9 | 
            +
            require 'logger'
         | 
| 10 | 
            +
            require 'pathname'
         | 
| 11 | 
            +
            require 'json'
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            module Rascut
         | 
| 14 | 
            +
              module Asdoc
         | 
| 15 | 
            +
                class Httpd
         | 
| 16 | 
            +
                  include Utils
         | 
| 17 | 
            +
                  def initialize
         | 
| 18 | 
            +
                    @logger = Logger.new(STDOUT)
         | 
| 19 | 
            +
                    @threads = []
         | 
| 20 | 
            +
                    @data = Rascut::Asdoc::Data.asdoc_data
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
                  attr_reader :command
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  def run 
         | 
| 25 | 
            +
                    port = config[:port] || 3002
         | 
| 26 | 
            +
                    host = config[:bind_address] || '0.0.0.0'
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    @http_server = Mongrel::HttpServer.new(host, port)
         | 
| 29 | 
            +
                    @http_server.register('/', Mongrel::DirHandler.new(asdoc_home.to_s))
         | 
| 30 | 
            +
                    @http_server.register('/json', json_handler)
         | 
| 31 | 
            +
                    @http_server.run
         | 
| 32 | 
            +
                    logger.info "Start Mongrel: http://#{host}:#{port}/"
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                  attr_reader :data
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def json_handler
         | 
| 37 | 
            +
                    ProcHandler.new do |req, res|
         | 
| 38 | 
            +
                      ary = []
         | 
| 39 | 
            +
                      params = Mongrel::HttpRequest.query_parse(req.params['QUERY_STRING'])
         | 
| 40 | 
            +
                      if word = params['word']
         | 
| 41 | 
            +
                        method_re, class_re, package_re = *search_regexes(word.strip)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                        c = 0
         | 
| 44 | 
            +
                        if method_re
         | 
| 45 | 
            +
                          @data[:methods].each do |i| 
         | 
| 46 | 
            +
                            if i[:name].match method_re
         | 
| 47 | 
            +
                              next if class_re && !i[:classname].match(class_re)
         | 
| 48 | 
            +
                              next if package_re && !i[:package].match(package_re)
         | 
| 49 | 
            +
                              ary << i
         | 
| 50 | 
            +
                              c += 1
         | 
| 51 | 
            +
                              break if c >= 20
         | 
| 52 | 
            +
                            end
         | 
| 53 | 
            +
                          end
         | 
| 54 | 
            +
                        elsif class_re
         | 
| 55 | 
            +
                          @data[:classes].each do |i| 
         | 
| 56 | 
            +
                            if i[:classname].match class_re
         | 
| 57 | 
            +
                              next if package_re && !i[:package].match(package_re)
         | 
| 58 | 
            +
                              ary << i
         | 
| 59 | 
            +
                              c += 1
         | 
| 60 | 
            +
                              break if c >= 20
         | 
| 61 | 
            +
                            end
         | 
| 62 | 
            +
                          end
         | 
| 63 | 
            +
                        elsif package_re
         | 
| 64 | 
            +
                          @data[:packages].each do |i| 
         | 
| 65 | 
            +
                            if i[:package].match package_re
         | 
| 66 | 
            +
                              ary << i
         | 
| 67 | 
            +
                              c += 1
         | 
| 68 | 
            +
                              break if c >= 20
         | 
| 69 | 
            +
                            end
         | 
| 70 | 
            +
                          end
         | 
| 71 | 
            +
                        end
         | 
| 72 | 
            +
                      end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                      res.start do |head, out|
         | 
| 75 | 
            +
                        head['Content-Type'] = 'application/json'
         | 
| 76 | 
            +
                        out << ary.to_json
         | 
| 77 | 
            +
                      end
         | 
| 78 | 
            +
                    end
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  def search_regexes(w)
         | 
| 82 | 
            +
                    method_re = class_re = package_re = nil
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                    words = w.split(/\s+/)
         | 
| 85 | 
            +
                    words.each do |word|
         | 
| 86 | 
            +
                      case word[0..0]
         | 
| 87 | 
            +
                      when '.'
         | 
| 88 | 
            +
                        #package
         | 
| 89 | 
            +
                        package_re = /#{Regexp.escape(word[1..-1])}/
         | 
| 90 | 
            +
                      when /[A-Z]/
         | 
| 91 | 
            +
                        # class
         | 
| 92 | 
            +
                        class_re = /#{Regexp.escape(word)}/
         | 
| 93 | 
            +
                        #when '#'
         | 
| 94 | 
            +
                      else
         | 
| 95 | 
            +
                        # method
         | 
| 96 | 
            +
                        method_re = /^#{Regexp.escape(word.sub('#', ''))}/
         | 
| 97 | 
            +
                      end
         | 
| 98 | 
            +
                    end
         | 
| 99 | 
            +
                    [method_re, class_re, package_re]
         | 
| 100 | 
            +
                  end
         | 
| 101 | 
            +
             | 
| 102 | 
            +
             | 
| 103 | 
            +
                  def stop
         | 
| 104 | 
            +
                    # XXX
         | 
| 105 | 
            +
                    # @http_server.stop
         | 
| 106 | 
            +
                  end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                  def config
         | 
| 109 | 
            +
                    #command.config
         | 
| 110 | 
            +
                    {}
         | 
| 111 | 
            +
                  end
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                  def logger
         | 
| 114 | 
            +
                    @logger
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
              end
         | 
| 118 | 
            +
            end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
            if __FILE__ == $0
         | 
| 121 | 
            +
              Rascut::Asdoc::Httpd.new.run
         | 
| 122 | 
            +
              Thread.stop
         | 
| 123 | 
            +
            end
         | 
| 124 | 
            +
             | 
| @@ -0,0 +1,69 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            require 'rubygems'
         | 
| 3 | 
            +
            require 'hpricot'
         | 
| 4 | 
            +
            require 'pp'
         | 
| 5 | 
            +
            require 'nkf'
         | 
| 6 | 
            +
            require 'logger'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            module Rascut
         | 
| 9 | 
            +
              module Asdoc
         | 
| 10 | 
            +
                class Parser
         | 
| 11 | 
            +
                  def initialize(source, logger = nil)
         | 
| 12 | 
            +
                    source = NKF::nkf('-m0 -w', source)
         | 
| 13 | 
            +
                    @logger = logger || Logger.new(STDOUT)
         | 
| 14 | 
            +
                    @logger.level = Logger::DEBUG
         | 
| 15 | 
            +
                    @source = Hpricot(source)
         | 
| 16 | 
            +
                    @methods = []
         | 
| 17 | 
            +
                    @package = nil
         | 
| 18 | 
            +
                    @classname = nil
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
                  attr_reader :methods, :package, :classname
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  def parse
         | 
| 23 | 
            +
                    title = @source.at('title').inner_text
         | 
| 24 | 
            +
                    @package = title.split('.')[0..-2].join('.')
         | 
| 25 | 
            +
                    @classname = title.split('.')[-1].split(/\s/)[0]
         | 
| 26 | 
            +
                    @logger.debug "parse: #{@package} #{@classname}"
         | 
| 27 | 
            +
                    @source.search('td.summaryTableSignatureCol').each {|el| 
         | 
| 28 | 
            +
                      next if el.at('td.summaryTableInheritanceCol') || !el.at('a')
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                      begin
         | 
| 31 | 
            +
                        method = {
         | 
| 32 | 
            +
                          :href => el.at('a')['href'],
         | 
| 33 | 
            +
                          :name => el.at('a').inner_text.strip,
         | 
| 34 | 
            +
                          :code => el.search('div:not(.summaryTableDescription)').inner_text.strip.gsub("\n", ' '),
         | 
| 35 | 
            +
                        }
         | 
| 36 | 
            +
                        if summary = el.at('div.summaryTableDescription')
         | 
| 37 | 
            +
                          s = summary.inner_text.strip.gsub("\n", ' ')
         | 
| 38 | 
            +
                          if s[0..0] == '[' && s[-1..-1] == ']'
         | 
| 39 | 
            +
                            method[:code] << " #{s}"
         | 
| 40 | 
            +
                            method[:code].strip!
         | 
| 41 | 
            +
                          else
         | 
| 42 | 
            +
                            method[:summary] = s
         | 
| 43 | 
            +
                          end
         | 
| 44 | 
            +
                        end
         | 
| 45 | 
            +
                        @methods << method
         | 
| 46 | 
            +
                      rescue NoMethodError => e
         | 
| 47 | 
            +
                        @logger.debug e.message
         | 
| 48 | 
            +
                        @logger.debug el.inner_text.strip.gsub("\n", ' ')
         | 
| 49 | 
            +
                      end
         | 
| 50 | 
            +
                    }
         | 
| 51 | 
            +
                    @logger.debug "parse: #{@methods.length} methods found"
         | 
| 52 | 
            +
                  end
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
              end
         | 
| 55 | 
            +
            end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
            if __FILE__ == $0
         | 
| 58 | 
            +
              require 'pathname'
         | 
| 59 | 
            +
              #Pathname.glob('/home/gorou/local/docs/flex201_documentation/langref/**/*.html') do |file|
         | 
| 60 | 
            +
              Pathname.glob('/home/gorou/svn/as3rails2u/trunk/asdoc-output/*/**/*.html') do |file|
         | 
| 61 | 
            +
                puts file.to_s
         | 
| 62 | 
            +
                r = Rascut::Asdoc::Parser.new(file.read)
         | 
| 63 | 
            +
                r.parse
         | 
| 64 | 
            +
                pp r.package, r.classname#, r.methods
         | 
| 65 | 
            +
              end
         | 
| 66 | 
            +
              #Rascut::AsdocParser.new(open('/home/gorou/local/docs/flex201_documentation/langref/flash/display/Sprite.html').read).parse
         | 
| 67 | 
            +
              #Rascut::AsdocParser.new(open('/home/gorou/svn/as3rails2u/trunk/asdoc-output/com/rails2u/net/JSONPLoader.html').read).parse
         | 
| 68 | 
            +
            end
         | 
| 69 | 
            +
             | 
    
        data/lib/rascut/command.rb
    CHANGED
    
    | @@ -2,31 +2,29 @@ require 'optparse' | |
| 2 2 | 
             
            require 'rascut/fcsh_wrapper'
         | 
| 3 3 | 
             
            require 'rascut/logger'
         | 
| 4 4 | 
             
            require 'rascut/config'
         | 
| 5 | 
            +
            require 'rascut/utils'
         | 
| 5 6 | 
             
            require 'pathname'
         | 
| 6 7 | 
             
            require 'yaml'
         | 
| 7 8 |  | 
| 8 9 | 
             
            module Rascut
         | 
| 9 10 | 
             
              class Command
         | 
| 11 | 
            +
                include Utils
         | 
| 12 | 
            +
             | 
| 10 13 | 
             
                def initialize
         | 
| 11 14 | 
             
                  @logger = Logger.new(STDOUT)
         | 
| 15 | 
            +
                  @httpd = nil
         | 
| 12 16 | 
             
                end
         | 
| 13 17 | 
             
                attr_accessor :logger
         | 
| 14 18 |  | 
| 15 19 | 
             
                def run(argv)
         | 
| 16 20 | 
             
                  @config = Config.new
         | 
| 17 21 |  | 
| 18 | 
            -
                  if  | 
| 19 | 
            -
                    home | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  home.join('.rascut').mkpath if home
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  if home && home.join('.rascutrc').readable?
         | 
| 25 | 
            -
                    @config.merge_config home.join('.rascutrc')
         | 
| 22 | 
            +
                  if home.parent && home.parent.join('.rascutrc').readable?
         | 
| 23 | 
            +
                    @config.merge_config home.parent.join('.rascutrc')
         | 
| 26 24 | 
             
                  end
         | 
| 27 25 |  | 
| 28 26 | 
             
                  if File.readable?('.rascut') && File.file?('.rascut') 
         | 
| 29 | 
            -
                     | 
| 27 | 
            +
                    config.merge_config('.rascut')
         | 
| 30 28 | 
             
                  end
         | 
| 31 29 |  | 
| 32 30 | 
             
                  @config.parse_argv!(argv)
         | 
| @@ -111,7 +109,7 @@ module Rascut | |
| 111 109 | 
             
                def start_server
         | 
| 112 110 | 
             
                  require 'rascut/httpd'
         | 
| 113 111 | 
             
                  @httpd = Httpd.new(self)
         | 
| 114 | 
            -
                  @httpd. | 
| 112 | 
            +
                  @httpd.run
         | 
| 115 113 | 
             
                end
         | 
| 116 114 |  | 
| 117 115 | 
             
                def setting_signals
         | 
| @@ -139,6 +137,7 @@ module Rascut | |
| 139 137 | 
             
                  logger.info 'exiting...'
         | 
| 140 138 | 
             
                  begin
         | 
| 141 139 | 
             
                    @wrapper.close 
         | 
| 140 | 
            +
                    @httpd.stop if @httpd
         | 
| 142 141 | 
             
                  rescue Exception => e
         | 
| 143 142 | 
             
                    logger.error e.inspect
         | 
| 144 143 | 
             
                  end
         | 
    
        data/lib/rascut/fcsh_wrapper.rb
    CHANGED
    
    | @@ -62,8 +62,11 @@ module Rascut | |
| 62 62 | 
             
                  unless @process
         | 
| 63 63 | 
             
                    orig_lang = ENV['LANG']
         | 
| 64 64 | 
             
                    ENV['LANG'] = 'C' # for flex3 sdk beta locale
         | 
| 65 | 
            +
                    orig_java_options = ENV['_JAVA_OPTIONS']
         | 
| 66 | 
            +
                    ENV['_JAVA_OPTIONS'] = orig_java_options.to_s + ' -Duser.language=en'
         | 
| 65 67 | 
             
                    @process = IO.popen(@config[:fcsh_cmd] + ' 2>&1', 'r+') unless @process
         | 
| 66 68 | 
             
                    ENV['LANG'] = orig_lang
         | 
| 69 | 
            +
                    ENV['_JAVA_OPTIONS'] = orig_java_options
         | 
| 67 70 | 
             
                  end
         | 
| 68 71 | 
             
                  @process
         | 
| 69 72 | 
             
                end
         | 
| @@ -73,6 +76,7 @@ module Rascut | |
| 73 76 |  | 
| 74 77 | 
             
                  @compile_mutex.synchronize do
         | 
| 75 78 | 
             
                    logger.info "Compile Start"
         | 
| 79 | 
            +
                    call_hook :compile_start
         | 
| 76 80 | 
             
                    out = nil
         | 
| 77 81 | 
             
                    if @compile_id
         | 
| 78 82 | 
             
                      out = process_sync_exec "compile #{@compile_id}"
         | 
| @@ -90,7 +94,7 @@ module Rascut | |
| 90 94 | 
             
                    else
         | 
| 91 95 | 
             
                      call_hook :compile_error, out
         | 
| 92 96 | 
             
                    end
         | 
| 93 | 
            -
                    call_hook : | 
| 97 | 
            +
                    call_hook :compile_finish
         | 
| 94 98 | 
             
                  end
         | 
| 95 99 | 
             
                end
         | 
| 96 100 |  | 
| @@ -107,7 +111,12 @@ module Rascut | |
| 107 111 | 
             
                def read_result(process)
         | 
| 108 112 | 
             
                  unless @not_first_read 
         | 
| 109 113 | 
             
                    # first_time, FIXME uncool...
         | 
| 110 | 
            -
                     | 
| 114 | 
            +
                    begin
         | 
| 115 | 
            +
                      process.expect(FCSH_WAIT_RE)
         | 
| 116 | 
            +
                    rescue NoMethodError => e
         | 
| 117 | 
            +
                      warn 'mxmlc not found. (check PATH)'
         | 
| 118 | 
            +
                      raise e
         | 
| 119 | 
            +
                    end
         | 
| 111 120 | 
             
                    @not_first_read = true
         | 
| 112 121 | 
             
                  end
         | 
| 113 122 |  | 
    
        data/lib/rascut/file_observer.rb
    CHANGED
    
    | @@ -29,6 +29,7 @@ module Rascut | |
| 29 29 | 
             
                  observe files
         | 
| 30 30 | 
             
                end
         | 
| 31 31 | 
             
                attr_accessor :options
         | 
| 32 | 
            +
                attr_reader :files, :dirs
         | 
| 32 33 |  | 
| 33 34 | 
             
                def logger
         | 
| 34 35 | 
             
                  options[:logger]
         | 
| @@ -125,7 +126,7 @@ module Rascut | |
| 125 126 |  | 
| 126 127 | 
             
                    if !dir.directory?
         | 
| 127 128 | 
             
                      @dirs.delete dir
         | 
| 128 | 
            -
                    elsif dir.to_s.match %r{/\.svn|/CVS}
         | 
| 129 | 
            +
                    elsif dir.to_s.match %r{/\.svn|/CVS|\.git}
         | 
| 129 130 | 
             
                      @dirs.delete dir
         | 
| 130 131 | 
             
                    elsif dir.mtime > mtime
         | 
| 131 132 | 
             
                      @dirs[dir] = dir.mtime
         | 
    
        data/lib/rascut/httpd.rb
    CHANGED
    
    | @@ -1,16 +1,10 @@ | |
| 1 1 |  | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
              require 'rubygems'
         | 
| 6 | 
            -
              gem 'rack'
         | 
| 7 | 
            -
            end
         | 
| 2 | 
            +
            require 'rubygems'
         | 
| 3 | 
            +
            require 'mongrel'
         | 
| 4 | 
            +
            require 'mongrel/handlers'
         | 
| 8 5 |  | 
| 9 | 
            -
            require ' | 
| 10 | 
            -
            require ' | 
| 11 | 
            -
            require 'rack/file'
         | 
| 12 | 
            -
            require 'rack/request'
         | 
| 13 | 
            -
            require 'rack/response'
         | 
| 6 | 
            +
            require 'rascut/utils'
         | 
| 7 | 
            +
            require 'rascut/asdoc/data'
         | 
| 14 8 | 
             
            require 'thread'
         | 
| 15 9 | 
             
            require 'logger'
         | 
| 16 10 | 
             
            require 'pathname'
         | 
| @@ -18,69 +12,49 @@ require 'open-uri' | |
| 18 12 |  | 
| 19 13 | 
             
            module Rascut
         | 
| 20 14 | 
             
              class Httpd
         | 
| 21 | 
            -
                 | 
| 22 | 
            -
                  def _call(env)
         | 
| 23 | 
            -
                    if env["PATH_INFO"].include? ".."
         | 
| 24 | 
            -
                      return [403, {"Content-Type" => "text/plain"}, ["Forbidden\n"]]
         | 
| 25 | 
            -
                    end
         | 
| 26 | 
            -
             | 
| 27 | 
            -
                    @path = env["PATH_INFO"] == '/' ? @root : F.join(@root, env['PATH_INFO'])
         | 
| 28 | 
            -
                    ext = F.extname(@path)[1..-1]
         | 
| 29 | 
            -
             | 
| 30 | 
            -
                    if F.file?(@path) && F.readable?(@path)
         | 
| 31 | 
            -
                      [200, {
         | 
| 32 | 
            -
                        "Content-Type"   => MIME_TYPES[ext] || "text/plain",
         | 
| 33 | 
            -
                        "Content-Length" => F.size(@path).to_s
         | 
| 34 | 
            -
                      }, self]
         | 
| 35 | 
            -
                    else
         | 
| 36 | 
            -
                      return [404, {"Content-Type" => "text/plain"},
         | 
| 37 | 
            -
                        ["File not found: #{env["PATH_INFO"]}\n"]]
         | 
| 38 | 
            -
                    end
         | 
| 39 | 
            -
                  end
         | 
| 40 | 
            -
                end
         | 
| 15 | 
            +
                include Utils
         | 
| 41 16 |  | 
| 42 17 | 
             
                def initialize(command)
         | 
| 43 18 | 
             
                  @command = command
         | 
| 19 | 
            +
                  @http_servet = 
         | 
| 44 20 | 
             
                  @threads = []
         | 
| 45 21 | 
             
                end
         | 
| 46 22 | 
             
                attr_reader :command
         | 
| 47 23 |  | 
| 48 | 
            -
                def  | 
| 24 | 
            +
                def run 
         | 
| 49 25 | 
             
                  swf_path = command.root.to_s
         | 
| 50 26 | 
             
                  logger.debug "swf_path: #{swf_path}"
         | 
| 51 27 | 
             
                  vendor = Pathname.new(__FILE__).parent.parent.parent.join('vendor')
         | 
| 52 28 | 
             
                  logger.debug "vendor_path: #{vendor}"
         | 
| 53 | 
            -
                  reload = reload_handler
         | 
| 54 | 
            -
                  index = index_handler
         | 
| 55 29 |  | 
| 56 | 
            -
                   | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
                   | 
| 60 | 
            -
                   | 
| 61 | 
            -
                   | 
| 30 | 
            +
                  file_mappings = [
         | 
| 31 | 
            +
                    ['/js/swfobject.js', vendor.join('js/swfobject.js').to_s],
         | 
| 32 | 
            +
                    ['/swf', swf_path]
         | 
| 33 | 
            +
                  ]
         | 
| 34 | 
            +
                  file_mappings.concat(config_url_mapping) if config[:mapping]
         | 
| 35 | 
            +
                  logger.debug 'url mappings: ' + file_mappings.inspect
         | 
| 62 36 |  | 
| 63 | 
            -
                  urls = []
         | 
| 64 | 
            -
                  urls.concat(config_url_mapping) if config[:mapping]
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                  urls.concat([
         | 
| 67 | 
            -
                    ['/js/swfobject.js', Rack::ShowExceptions.new(Httpd::FileOnly.new(vendor.join('js/swfobject.js').to_s))],
         | 
| 68 | 
            -
                    ['/swf', Rack::ShowExceptions.new(Rack::File.new(swf_path))],
         | 
| 69 | 
            -
                    ['/reload', Rack::ShowExceptions.new(reload_handler)],
         | 
| 70 | 
            -
                    ['/proxy', Rack::ShowExceptions.new(proxy_handler)],
         | 
| 71 | 
            -
                    ['/', Rack::ShowExceptions.new(index_handler)]
         | 
| 72 | 
            -
                  ])
         | 
| 73 | 
            -
                  logger.debug 'url mappings: ' + urls.map{|u| u.first}.inspect
         | 
| 74 | 
            -
                  app = Rack::URLMap.new(urls)
         | 
| 75 37 | 
             
                  port = config[:port] || 3001
         | 
| 76 38 | 
             
                  host = config[:bind_address] || '0.0.0.0'
         | 
| 77 39 |  | 
| 78 | 
            -
                   | 
| 79 | 
            -
                   | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 40 | 
            +
                  reload = reload_handler
         | 
| 41 | 
            +
                  index = index_handler
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  @http_server = Mongrel::HttpServer.new(host, port)
         | 
| 44 | 
            +
                  file_mappings.each do |mapping|
         | 
| 45 | 
            +
                    @http_server.register(mapping[0], Mongrel::DirHandler.new(mapping[1]))
         | 
| 82 46 | 
             
                  end
         | 
| 83 | 
            -
                   | 
| 47 | 
            +
                  @http_server.register('/proxy', proxy_handler)
         | 
| 48 | 
            +
                  @http_server.register('/save', save_handler)
         | 
| 49 | 
            +
                  @http_server.register('/reload', reload_handler)
         | 
| 50 | 
            +
                  @http_server.register('/', index_handler)
         | 
| 51 | 
            +
                  @http_server.run
         | 
| 52 | 
            +
                  logger.info "Start Mongrel: http://#{host}:#{port}/"
         | 
| 53 | 
            +
                end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def stop
         | 
| 56 | 
            +
                  # XXX
         | 
| 57 | 
            +
                  # @http_server.stop
         | 
| 84 58 | 
             
                end
         | 
| 85 59 |  | 
| 86 60 | 
             
                def config
         | 
| @@ -104,52 +78,34 @@ module Rascut | |
| 104 78 | 
             
                    filepath = m[0]
         | 
| 105 79 | 
             
                    mappath = m[1]
         | 
| 106 80 | 
             
                    mappath = '/' + mappath if mappath[0..0] != '/'
         | 
| 107 | 
            -
                    urls << [mappath,  | 
| 81 | 
            +
                    urls << [mappath, command.root.join(filepath).to_s]
         | 
| 108 82 | 
             
                  end
         | 
| 109 83 | 
             
                  urls
         | 
| 110 84 | 
             
                end
         | 
| 111 85 |  | 
| 112 | 
            -
                def  | 
| 113 | 
            -
             | 
| 114 | 
            -
             | 
| 115 | 
            -
             | 
| 116 | 
            -
             | 
| 117 | 
            -
             | 
| 118 | 
            -
             | 
| 119 | 
            -
             | 
| 120 | 
            -
                      require_mongrel_handler
         | 
| 121 | 
            -
                    end
         | 
| 122 | 
            -
                  rescue Exception => e
         | 
| 123 | 
            -
                    require_webrick_handler
         | 
| 124 | 
            -
                  end
         | 
| 125 | 
            -
                end
         | 
| 126 | 
            -
             | 
| 127 | 
            -
                def require_mongrel_handler
         | 
| 128 | 
            -
                  begin
         | 
| 129 | 
            -
                    require 'mongrel'
         | 
| 130 | 
            -
                  rescue LoadError
         | 
| 131 | 
            -
                    require 'rubygems'
         | 
| 132 | 
            -
                    gem 'mongrel', '> 1.0'
         | 
| 133 | 
            -
                  end
         | 
| 134 | 
            -
                  require 'rack/handler/mongrel'
         | 
| 135 | 
            -
                  Rack::Handler::Mongrel
         | 
| 136 | 
            -
                end
         | 
| 137 | 
            -
             | 
| 138 | 
            -
                def require_webrick_handler
         | 
| 139 | 
            -
                  require 'webrick'
         | 
| 140 | 
            -
                  require 'rack/handler/webrick'
         | 
| 141 | 
            -
                  Rack::Handler::WEBrick
         | 
| 142 | 
            -
                end
         | 
| 86 | 
            +
                #def asdoc_mapping
         | 
| 87 | 
            +
                #  urls = []
         | 
| 88 | 
            +
                #  Pathname.glob(asdoc_home.to_s + '/*').each do |file|
         | 
| 89 | 
            +
                #    urls << ["/asdoc/#{file.basename}", Rack::ShowExceptions.new(FileIndex.new(file.to_s))]
         | 
| 90 | 
            +
                #  end
         | 
| 91 | 
            +
                #  urls << ["/asdoc/", Rack::ShowExceptions.new(FileIndex.new(asdoc_home.to_s))]
         | 
| 92 | 
            +
                #  urls
         | 
| 93 | 
            +
                #end
         | 
| 143 94 |  | 
| 144 95 | 
             
                def reload_handler
         | 
| 145 | 
            -
                  Proc.new do |env|
         | 
| 96 | 
            +
                  #Proc.new do |env|
         | 
| 97 | 
            +
                  ProcHandler.new do |req, res|
         | 
| 146 98 | 
             
                    @threads << Thread.current
         | 
| 147 99 | 
             
                    Thread.stop
         | 
| 148 100 |  | 
| 149 101 | 
             
                    logger.debug 'httpd /reload reloading now'
         | 
| 150 | 
            -
                     | 
| 151 | 
            -
                       | 
| 102 | 
            +
                    res.start do |head, out|
         | 
| 103 | 
            +
                      head["Content-Type"] = "text/plain"
         | 
| 104 | 
            +
                      out << 1
         | 
| 152 105 | 
             
                    end
         | 
| 106 | 
            +
                    #Rack::Response.new.finish do |r|
         | 
| 107 | 
            +
                    #  r.write '1'
         | 
| 108 | 
            +
                    #end
         | 
| 153 109 | 
             
                  end
         | 
| 154 110 | 
             
                end
         | 
| 155 111 |  | 
| @@ -160,33 +116,60 @@ module Rascut | |
| 160 116 | 
             
                    res = INDEX.sub('__SWFOBJECT__', swftag(command.target_script, config)).sub('<!--__RELOAD__-->', RELOAD_SCRIPT)
         | 
| 161 117 | 
             
                  end
         | 
| 162 118 |  | 
| 163 | 
            -
                   | 
| 164 | 
            -
             | 
| 165 | 
            -
             | 
| 166 | 
            -
                     | 
| 167 | 
            -
             | 
| 119 | 
            +
                  ProcHandler.new do |req, response|
         | 
| 120 | 
            +
                  #Proc.new do |env|
         | 
| 121 | 
            +
                  #req = Rack::Request.new(env)
         | 
| 122 | 
            +
                    r = res.sub('__SWF_VARS__', swfvars(Mongrel::HttpRequest.query_parse(req.params['QUERY_STRING'])))
         | 
| 123 | 
            +
                    response.start do |head, out|
         | 
| 124 | 
            +
                      out << r
         | 
| 168 125 | 
             
                    end
         | 
| 126 | 
            +
                    #Rack::Response.new.finish do |r|
         | 
| 127 | 
            +
                    #  r.write res
         | 
| 128 | 
            +
                    #end
         | 
| 169 129 | 
             
                  end
         | 
| 170 130 | 
             
                end
         | 
| 171 131 |  | 
| 172 132 | 
             
                def proxy_handler
         | 
| 173 | 
            -
                   | 
| 174 | 
            -
                     | 
| 175 | 
            -
                    url = req.query_string
         | 
| 133 | 
            +
                  ProcHandler.new do |req, res|
         | 
| 134 | 
            +
                    url = req.params['QUERY_STRING'].to_s.strip
         | 
| 176 135 | 
             
                    if url.empty?
         | 
| 177 136 | 
             
                      url = req.path_info[1..-1].gsub(%r{^(https?:/)/?}, '\\1/')
         | 
| 178 137 | 
             
                    end
         | 
| 179 | 
            -
                     | 
| 138 | 
            +
                    res.start do |head, out|
         | 
| 180 139 | 
             
                      open(url) { |io|
         | 
| 181 | 
            -
                         | 
| 140 | 
            +
                        head['Content-Type'] = io.content_type
         | 
| 182 141 | 
             
                        while part = io.read(8192)
         | 
| 183 | 
            -
                           | 
| 142 | 
            +
                          out << part
         | 
| 184 143 | 
             
                        end
         | 
| 185 144 | 
             
                      }
         | 
| 186 145 | 
             
                    end
         | 
| 187 146 | 
             
                  end
         | 
| 188 147 | 
             
                end
         | 
| 189 148 |  | 
| 149 | 
            +
                def save_handler
         | 
| 150 | 
            +
                  ProcHandler.new do |req, res|
         | 
| 151 | 
            +
                    name = req.params['QUERY_STRING'].to_s.strip
         | 
| 152 | 
            +
                    path = command.root.join(name)
         | 
| 153 | 
            +
                    req.body.rewind
         | 
| 154 | 
            +
                    body = req.body.read
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                    if name.empty? || body.length == 0
         | 
| 157 | 
            +
                      res.start do |head, out|
         | 
| 158 | 
            +
                        head['Content-Type'] = 'text/plain'
         | 
| 159 | 
            +
                        out << "don't save"
         | 
| 160 | 
            +
                      end
         | 
| 161 | 
            +
                    else
         | 
| 162 | 
            +
                      path.open('w') {|f| f.puts body }
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                      res.start do |head, out|
         | 
| 165 | 
            +
                        head['Content-Type'] = 'text/plain'
         | 
| 166 | 
            +
                        out << "saved: #{path}"
         | 
| 167 | 
            +
                      end
         | 
| 168 | 
            +
                    end
         | 
| 169 | 
            +
             | 
| 170 | 
            +
                  end
         | 
| 171 | 
            +
                end
         | 
| 172 | 
            +
             | 
| 190 173 | 
             
                def swfvars(vars)
         | 
| 191 174 | 
             
                  res = []
         | 
| 192 175 | 
             
                  vars.each do |key, value|
         | 
| @@ -253,6 +236,8 @@ module Rascut | |
| 253 236 | 
             
                   window.onload = function() {
         | 
| 254 237 | 
             
                     __SWF_VARS__
         | 
| 255 238 | 
             
                     so.addVariable('rascut', 'true');
         | 
| 239 | 
            +
                     so.addParam('allowFullScreen', 'true');
         | 
| 240 | 
            +
                     so.addParam('allowScriptAccess', 'always');
         | 
| 256 241 | 
             
                     so.write("content");
         | 
| 257 242 | 
             
                   }
         | 
| 258 243 | 
             
                  </script>
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            # append your ~/.ctags 
         | 
| 2 | 
            +
            # --langdef=actionscript
         | 
| 3 | 
            +
            # --langmap=actionscript:.as
         | 
| 4 | 
            +
            # --regex-actionscript=/^.*function[\t ]+([gs]et[\t ]+)?([A-Za-z0-9_]+)[\t ]*\(/\2/F,function/i
         | 
| 5 | 
            +
            # --regex-actionscript=/^.*class[\t ]+([A-Za-z0-9_]+)/\1/C,class/i
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            require 'rascut/plugin/base'
         | 
| 8 | 
            +
            require 'pathname'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            module Rascut
         | 
| 11 | 
            +
              module Plugin
         | 
| 12 | 
            +
                class GenerateCtags < Base
         | 
| 13 | 
            +
                  def run
         | 
| 14 | 
            +
                    @ctags_cmd = config[:ctags] || 'ctags'
         | 
| 15 | 
            +
                    @command.file_observer.add_update_handler method(:generate_ctags)
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def generate_ctags
         | 
| 19 | 
            +
                    `#{@ctags_cmd} -R --langmap=actionscript:.as -f #{@command.root.join('tags')}`
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
             | 
| 2 | 
            +
            require 'rascut/plugin/base'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            module Rascut
         | 
| 5 | 
            +
              module Plugin
         | 
| 6 | 
            +
                class Screen < Base
         | 
| 7 | 
            +
                  STATUS = %q[%H %`%-w%{=b bw}%n %t%{-}%+w %=]
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  SCREEN_CMD = 'screen'
         | 
| 10 | 
            +
                  SCREEN_COLOR = {
         | 
| 11 | 
            +
                    :black => 'dd',
         | 
| 12 | 
            +
                    :blue  => 'bk',
         | 
| 13 | 
            +
                    :green => 'gk',
         | 
| 14 | 
            +
                    :red   => 'rw',
         | 
| 15 | 
            +
                  }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def run
         | 
| 18 | 
            +
                    @command.wrapper.hooks[:compile_start] << method(:start)
         | 
| 19 | 
            +
                    @command.wrapper.hooks[:compile_error] << method(:error)
         | 
| 20 | 
            +
                    @command.wrapper.hooks[:compile_success] << method(:success)
         | 
| 21 | 
            +
                  end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  def start
         | 
| 24 | 
            +
                    message 'C'
         | 
| 25 | 
            +
                  end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                  def error
         | 
| 28 | 
            +
                    message 'E', :red
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def success
         | 
| 32 | 
            +
                    message 'S', :blue
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  def message(msg, color = :black)
         | 
| 36 | 
            +
                    if run_screen_session?
         | 
| 37 | 
            +
                      col = SCREEN_COLOR[color]
         | 
| 38 | 
            +
                      msg = %Q[ %{=b #{col}} #{msg} %{-}]
         | 
| 39 | 
            +
                      send_cmd(msg)
         | 
| 40 | 
            +
                    end
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                  def clear
         | 
| 44 | 
            +
                    send_cmd('')
         | 
| 45 | 
            +
                  end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                  def run_screen_session?
         | 
| 48 | 
            +
                    str = `#{SCREEN_CMD} -ls`
         | 
| 49 | 
            +
                    str.match(/(\d+) Socket/) && ($1.to_i > 0)
         | 
| 50 | 
            +
                  end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                  def send_cmd(msg)
         | 
| 53 | 
            +
                    cmd = %Q[#{SCREEN_CMD} -X eval 'hardstatus alwayslastline "#{(STATUS + msg).gsub('"', '\"')}"']
         | 
| 54 | 
            +
                    system cmd
         | 
| 55 | 
            +
                  end
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
              end
         | 
| 58 | 
            +
            end
         | 
    
        data/lib/rascut/utils.rb
    ADDED
    
    | @@ -0,0 +1,65 @@ | |
| 1 | 
            +
            require 'pathname'
         | 
| 2 | 
            +
            require 'uri'
         | 
| 3 | 
            +
            require 'pstore'
         | 
| 4 | 
            +
            require 'rubygems'
         | 
| 5 | 
            +
            require 'mongrel/handlers'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Rascut
         | 
| 8 | 
            +
              module Utils
         | 
| 9 | 
            +
                def home
         | 
| 10 | 
            +
                  if ENV['HOME']
         | 
| 11 | 
            +
                    home = Pathname.new ENV['HOME']
         | 
| 12 | 
            +
                  elsif ENV['USERPROFILE']
         | 
| 13 | 
            +
                    # win32
         | 
| 14 | 
            +
                    home = Pathname.new ENV['USERPROFILE']
         | 
| 15 | 
            +
                  else
         | 
| 16 | 
            +
                    raise 'HOME dir not found.'
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  home = home.join('.rascut')
         | 
| 20 | 
            +
                  home.mkpath
         | 
| 21 | 
            +
                  home
         | 
| 22 | 
            +
                end
         | 
| 23 | 
            +
                module_function :home
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def asdoc_home
         | 
| 26 | 
            +
                  path = home.join('asdoc')
         | 
| 27 | 
            +
                  path.mkpath
         | 
| 28 | 
            +
                  path
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
                module_function :asdoc_home
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def rascut_db_path
         | 
| 33 | 
            +
                  home.join('rascut.db')
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
                module_function :rascut_db_path
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                def rascut_db(readonly = false)
         | 
| 38 | 
            +
                  db = PStore.new home.join('rascut.db').to_s
         | 
| 39 | 
            +
                  db.transaction(readonly) do 
         | 
| 40 | 
            +
                    yield db
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                module_function :rascut_db
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                def rascut_db_read(&block)
         | 
| 46 | 
            +
                  rascut_db(true, &block)
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
                module_function :rascut_db_read
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                def path_escape(name)
         | 
| 51 | 
            +
                  URI.encode(name.to_s.gsub('/', '_'), /[^\w_\-]/)
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
                module_function :path_escape
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                class ProcHandler < Mongrel::HttpHandler
         | 
| 56 | 
            +
                  def initialize(&block)
         | 
| 57 | 
            +
                    @proc = block
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  def process(req, res)
         | 
| 61 | 
            +
                    @proc.call(req, res)
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
                end
         | 
| 64 | 
            +
              end
         | 
| 65 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,58 +1,90 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 | 
            -
            rubygems_version: 0.9.1
         | 
| 3 | 
            -
            specification_version: 1
         | 
| 4 2 | 
             
            name: rascut
         | 
| 5 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 6 | 
            -
              version: 0.1 | 
| 7 | 
            -
            date: 2007-10-09 00:00:00 +09:00
         | 
| 8 | 
            -
            summary: Ruby ActionSCript UTility
         | 
| 9 | 
            -
            require_paths: 
         | 
| 10 | 
            -
            - lib
         | 
| 11 | 
            -
            email: hotchpotch@nospam@gmail.com
         | 
| 12 | 
            -
            homepage: http://hotchpotch.rubyforge.org/rascut/
         | 
| 13 | 
            -
            rubyforge_project: hotchpotch
         | 
| 14 | 
            -
            description: Ruby ActionSCript UTility
         | 
| 15 | 
            -
            autorequire: ""
         | 
| 16 | 
            -
            default_executable: 
         | 
| 17 | 
            -
            bindir: bin
         | 
| 18 | 
            -
            has_rdoc: true
         | 
| 19 | 
            -
            required_ruby_version: !ruby/object:Gem::Version::Requirement 
         | 
| 20 | 
            -
              requirements: 
         | 
| 21 | 
            -
              - - ">="
         | 
| 22 | 
            -
                - !ruby/object:Gem::Version 
         | 
| 23 | 
            -
                  version: 1.8.2
         | 
| 24 | 
            -
              version: 
         | 
| 4 | 
            +
              version: 0.2.1
         | 
| 25 5 | 
             
            platform: ruby
         | 
| 26 | 
            -
            signing_key: 
         | 
| 27 | 
            -
            cert_chain: 
         | 
| 28 | 
            -
            post_install_message: 
         | 
| 29 6 | 
             
            authors: 
         | 
| 30 7 | 
             
            - Yuichi Tateno
         | 
| 8 | 
            +
            autorequire: ""
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            date: 2009-03-03 00:00:00 +09:00
         | 
| 13 | 
            +
            default_executable: 
         | 
| 14 | 
            +
            dependencies: 
         | 
| 15 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 16 | 
            +
              name: rake
         | 
| 17 | 
            +
              type: :runtime
         | 
| 18 | 
            +
              version_requirement: 
         | 
| 19 | 
            +
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 20 | 
            +
                requirements: 
         | 
| 21 | 
            +
                - - ">="
         | 
| 22 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 23 | 
            +
                    version: "0"
         | 
| 24 | 
            +
                version: 
         | 
| 25 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 26 | 
            +
              name: mongrel
         | 
| 27 | 
            +
              type: :runtime
         | 
| 28 | 
            +
              version_requirement: 
         | 
| 29 | 
            +
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 30 | 
            +
                requirements: 
         | 
| 31 | 
            +
                - - ">="
         | 
| 32 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 33 | 
            +
                    version: "0"
         | 
| 34 | 
            +
                version: 
         | 
| 35 | 
            +
            - !ruby/object:Gem::Dependency 
         | 
| 36 | 
            +
              name: json_pure
         | 
| 37 | 
            +
              type: :runtime
         | 
| 38 | 
            +
              version_requirement: 
         | 
| 39 | 
            +
              version_requirements: !ruby/object:Gem::Requirement 
         | 
| 40 | 
            +
                requirements: 
         | 
| 41 | 
            +
                - - ">="
         | 
| 42 | 
            +
                  - !ruby/object:Gem::Version 
         | 
| 43 | 
            +
                    version: "0"
         | 
| 44 | 
            +
                version: 
         | 
| 45 | 
            +
            description: Ruby ActionSCript UTility
         | 
| 46 | 
            +
            email: hotchpotch@nospam@gmail.com
         | 
| 47 | 
            +
            executables: 
         | 
| 48 | 
            +
            - rascut
         | 
| 49 | 
            +
            extensions: []
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            extra_rdoc_files: 
         | 
| 52 | 
            +
            - README
         | 
| 53 | 
            +
            - ChangeLog
         | 
| 31 54 | 
             
            files: 
         | 
| 32 55 | 
             
            - README
         | 
| 33 56 | 
             
            - ChangeLog
         | 
| 34 57 | 
             
            - Rakefile
         | 
| 35 58 | 
             
            - bin/rascut
         | 
| 59 | 
            +
            - bin/rasdoc
         | 
| 36 60 | 
             
            - test/test_rascut.rb
         | 
| 37 61 | 
             
            - test/test_file_observer.rb
         | 
| 38 62 | 
             
            - lib/rascut.rb
         | 
| 39 63 | 
             
            - lib/rascut
         | 
| 40 64 | 
             
            - lib/rascut/file_observer.rb
         | 
| 65 | 
            +
            - lib/rascut/asdoc
         | 
| 66 | 
            +
            - lib/rascut/asdoc/data.rb
         | 
| 67 | 
            +
            - lib/rascut/asdoc/parser.rb
         | 
| 68 | 
            +
            - lib/rascut/asdoc/httpd.rb
         | 
| 69 | 
            +
            - lib/rascut/asdoc/generator.rb
         | 
| 41 70 | 
             
            - lib/rascut/config.rb
         | 
| 42 71 | 
             
            - lib/rascut/httpd.rb
         | 
| 43 72 | 
             
            - lib/rascut/logger.rb
         | 
| 44 73 | 
             
            - lib/rascut/plugin
         | 
| 45 74 | 
             
            - lib/rascut/plugin/write_fcsh_error_output.rb
         | 
| 46 75 | 
             
            - lib/rascut/plugin/base.rb
         | 
| 76 | 
            +
            - lib/rascut/plugin/screen.rb
         | 
| 77 | 
            +
            - lib/rascut/plugin/generate_ctags.rb
         | 
| 47 78 | 
             
            - lib/rascut/command.rb
         | 
| 48 79 | 
             
            - lib/rascut/fcsh_wrapper.rb
         | 
| 80 | 
            +
            - lib/rascut/utils.rb
         | 
| 49 81 | 
             
            - vendor/js
         | 
| 50 82 | 
             
            - vendor/ruby
         | 
| 51 83 | 
             
            - vendor/js/swfobject.js
         | 
| 52 84 | 
             
            - vendor/ruby/expect.rb
         | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 85 | 
            +
            has_rdoc: true
         | 
| 86 | 
            +
            homepage: http://hotchpotch.rubyforge.org/rascut/
         | 
| 87 | 
            +
            post_install_message: 
         | 
| 56 88 | 
             
            rdoc_options: 
         | 
| 57 89 | 
             
            - --title
         | 
| 58 90 | 
             
            - rascut documentation
         | 
| @@ -66,40 +98,27 @@ rdoc_options: | |
| 66 98 | 
             
            - --inline-source
         | 
| 67 99 | 
             
            - --exclude
         | 
| 68 100 | 
             
            - ^(examples|extras)/
         | 
| 69 | 
            -
             | 
| 70 | 
            -
            -  | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
            -  | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 101 | 
            +
            require_paths: 
         | 
| 102 | 
            +
            - lib
         | 
| 103 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 104 | 
            +
              requirements: 
         | 
| 105 | 
            +
              - - ">="
         | 
| 106 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 107 | 
            +
                  version: 1.8.2
         | 
| 108 | 
            +
              version: 
         | 
| 109 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 110 | 
            +
              requirements: 
         | 
| 111 | 
            +
              - - ">="
         | 
| 112 | 
            +
                - !ruby/object:Gem::Version 
         | 
| 113 | 
            +
                  version: "0"
         | 
| 114 | 
            +
              version: 
         | 
| 76 115 | 
             
            requirements: []
         | 
| 77 116 |  | 
| 78 | 
            -
             | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 85 | 
            -
             | 
| 86 | 
            -
                    version: 0.0.0
         | 
| 87 | 
            -
                version: 
         | 
| 88 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 89 | 
            -
              name: mongrel
         | 
| 90 | 
            -
              version_requirement: 
         | 
| 91 | 
            -
              version_requirements: !ruby/object:Gem::Version::Requirement 
         | 
| 92 | 
            -
                requirements: 
         | 
| 93 | 
            -
                - - ">"
         | 
| 94 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 95 | 
            -
                    version: 0.0.0
         | 
| 96 | 
            -
                version: 
         | 
| 97 | 
            -
            - !ruby/object:Gem::Dependency 
         | 
| 98 | 
            -
              name: rack
         | 
| 99 | 
            -
              version_requirement: 
         | 
| 100 | 
            -
              version_requirements: !ruby/object:Gem::Version::Requirement 
         | 
| 101 | 
            -
                requirements: 
         | 
| 102 | 
            -
                - - ">"
         | 
| 103 | 
            -
                  - !ruby/object:Gem::Version 
         | 
| 104 | 
            -
                    version: 0.0.0
         | 
| 105 | 
            -
                version: 
         | 
| 117 | 
            +
            rubyforge_project: hotchpotch
         | 
| 118 | 
            +
            rubygems_version: 1.2.0
         | 
| 119 | 
            +
            signing_key: 
         | 
| 120 | 
            +
            specification_version: 2
         | 
| 121 | 
            +
            summary: Ruby ActionSCript UTility
         | 
| 122 | 
            +
            test_files: 
         | 
| 123 | 
            +
            - test/test_rascut.rb
         | 
| 124 | 
            +
            - test/test_file_observer.rb
         |