class CDNGet::Main

Public Class Methods

main(args=nil) click to toggle source
# File lib/cdnget.rb, line 349
def self.main(args=nil)
  args ||= ARGV
  s = self.new().run(*args)
  puts s if s
  exit 0
rescue CommandError => ex
  $stderr.puts ex.message
  exit 1
end
new(script=nil) click to toggle source
# File lib/cdnget.rb, line 324
def initialize(script=nil)
  @script = script || File.basename($0)
end

Public Instance Methods

do_download_library(cdn_code, library, version, basedir) click to toggle source
# File lib/cdnget.rb, line 509
def do_download_library(cdn_code, library, version, basedir)
  cdn = find_cdn(cdn_code)
  cdn.download(library, version, basedir, quiet: @quiet)
  return nil
end
do_find_library(cdn_code, library) click to toggle source
# File lib/cdnget.rb, line 464
def do_find_library(cdn_code, library)
  cdn = find_cdn(cdn_code)
  d = cdn.find(library)
  s = ""
  if @quiet
    d[:versions].each do |ver|
      s << "#{ver}\n"
    end if d[:versions]
  else
    s << "name:  #{d[:name]}\n"
    s << "desc:  #{d[:desc]}\n" if d[:desc]
    s << "tags:  #{d[:tags]}\n" if d[:tags]
    s << "site:  #{d[:site]}\n" if d[:site]
    s << "snippet: |\n" << d[:snippet].gsub(/^/, '    ') if d[:snippet]
    s << "versions:\n"
    d[:versions].each do |ver|
      s << "  - #{ver}\n"
    end if d[:versions]
  end
  return s
end
do_get_library(cdn_code, library, version) click to toggle source
# File lib/cdnget.rb, line 486
def do_get_library(cdn_code, library, version)
  cdn = find_cdn(cdn_code)
  d = cdn.get(library, version)
  s = ""
  if @quiet
    d[:urls].each do |url|
      s << "#{url}\n"
    end if d[:urls]
  else
    s << "name:     #{d[:name]}\n"
    s << "version:  #{d[:version]}\n"
    s << "desc:     #{d[:desc]}\n" if d[:desc]
    s << "tags:     #{d[:tags]}\n" if d[:tags]
    s << "site:     #{d[:site]}\n" if d[:site]
    s << "snippet: |\n" << d[:snippet].gsub(/^/, '    ') if d[:snippet]
    s << "urls:\n"  if d[:urls]
    d[:urls].each do |url|
      s << "  - #{url}\n"
    end if d[:urls]
  end
  return s
end
do_list_cdns() click to toggle source
# File lib/cdnget.rb, line 444
def do_list_cdns
  if @quiet
    return CLASSES.map {|c| "#{c::CODE}\n" }.join()
  else
    return CLASSES.map {|c| "%-10s  # %s\n" % [c::CODE, c::SITE_URL] }.join()
  end
end
do_list_libraries(cdn_code) click to toggle source
# File lib/cdnget.rb, line 452
def do_list_libraries(cdn_code)
  cdn = find_cdn(cdn_code)
  return render_list(cdn.list)
end
do_search_libraries(cdn_code, pattern) click to toggle source
# File lib/cdnget.rb, line 457
def do_search_libraries(cdn_code, pattern)
  cdn = find_cdn(cdn_code)
  rexp_str = pattern.split('*', -1).collect {|x| Regexp.escape(x) }.join('.*')
  rexp = Regexp.compile("\\A#{rexp_str}\\z", Regexp::IGNORECASE)
  return render_list(cdn.list.select {|a| a[:name] =~ rexp })
end
find_cdn(cdn_code) click to toggle source
# File lib/cdnget.rb, line 430
def find_cdn(cdn_code)
  klass = CLASSES.find {|c| c::CODE == cdn_code }  or
    raise CommandError.new("#{cdn_code}: no such CDN.")
  return klass.new
end
help_message() click to toggle source
# File lib/cdnget.rb, line 328
    def help_message
      script = @script
      return <<END
#{script}  -- download files from public CDN

Usage: #{script} [options] [CDN] [library] [version] [directory]

Options:
  -h, --help        : help
  -v, --version     : version
  -q, --quiet       : minimal output

Example:
  $ #{script}                                # list public CDN
  $ #{script} [-q] cdnjs                     # list libraries
  $ #{script} [-q] cdnjs jquery              # list versions
  $ #{script} [-q] cdnjs jquery 2.2.0        # list files
  $ #{script} [-q] cdnjs jquery 2.2.0 /tmp   # download files
END
    end
parse_cmdopts(cmdargs, short_opts, long_opts) click to toggle source
# File lib/cdnget.rb, line 403
def parse_cmdopts(cmdargs, short_opts, long_opts)
  cmdopts = {}
  while cmdargs[0] && cmdargs[0].start_with?('-')
    cmdarg = cmdargs.shift
    if cmdarg == '--'
      break
    elsif cmdarg.start_with?('--')
      cmdarg =~ /\A--(\w[-\w]+)(=.*?)?/  or
        raise CommandError.new("#{cmdarg}: invalid command option.")
      name  = $1
      value = $2 ? $2[1..-1] : true
      long_opts.include?(name)  or
        raise CommandError.new("#{cmdarg}: unknown command option.")
      cmdopts[name] = value
    elsif cmdarg.start_with?('-')
      cmdarg[1..-1].each_char do |c|
        short_opts.include?(c)  or
          raise CommandError.new("-#{c}: unknown command option.")
        cmdopts[c] = true
      end
    else
      raise "unreachable"
    end
  end
  return cmdopts
end
render_list(list) click to toggle source
# File lib/cdnget.rb, line 436
def render_list(list)
  if @quiet
    return list.collect {|d| "#{d[:name]}\n" }.join()
  else
    return list.collect {|d| "%-20s  # %s\n" % [d[:name], d[:desc]] }.join()
  end
end
run(*args) click to toggle source
# File lib/cdnget.rb, line 359
def run(*args)
  cmdopts = parse_cmdopts(args, "hvq", ["help", "version", "quiet"])
  return help_message() if cmdopts['h'] || cmdopts['help']
  return RELEASE + "\n" if cmdopts['v'] || cmdopts['version']
  @quiet = cmdopts['quiet'] || cmdopts['q']
  #
  validate(args[1], args[2])
  #
  case args.length
  when 0
    return do_list_cdns()
  when 1
    cdn_code = args[0]
    return do_list_libraries(cdn_code)
  when 2
    cdn_code, library = args
    if library.include?('*')
      return do_search_libraries(cdn_code, library)
    else
      return do_find_library(cdn_code, library)
    end
  when 3
    cdn_code, library, version = args
    return do_get_library(cdn_code, library, version)
  when 4
    cdn_code, library, version, basedir = args
    do_download_library(cdn_code, library, version, basedir)
    return ""
  else
    raise CommandError.new("'#{args[4]}': Too many arguments.")
  end
end
validate(library, version) click to toggle source
# File lib/cdnget.rb, line 392
def validate(library, version)
  if library && ! library.include?('*')
    library =~ /\A[-.\w]+\z/  or
      raise CommandError.new("#{library}: Unexpected library name.")
  end
  if version
    version =~ /\A[-.\w]+\z/  or
      raise CommandError.new("#{version}: Unexpected version number.")
  end
end