Class: CDNGet::Main

Inherits:
Object
  • Object
show all
Defined in:
lib/cdnget.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(script = nil) ⇒ Main

Returns a new instance of Main.



324
325
326
# File 'lib/cdnget.rb', line 324

def initialize(script=nil)
  @script = script || File.basename($0)
end

Class Method Details

.main(args = nil) ⇒ Object



349
350
351
352
353
354
355
356
357
# 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

Instance Method Details

#do_download_library(cdn_code, library, version, basedir) ⇒ Object



509
510
511
512
513
# 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) ⇒ Object



464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
# 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) ⇒ Object



486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
# 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_cdnsObject



444
445
446
447
448
449
450
# 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) ⇒ Object



452
453
454
455
# 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) ⇒ Object



457
458
459
460
461
462
# 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) ⇒ Object



430
431
432
433
434
# 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_messageObject



328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
# 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) ⇒ Object



403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
# 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) ⇒ Object



436
437
438
439
440
441
442
# 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) ⇒ Object



359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
# 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) ⇒ Object



392
393
394
395
396
397
398
399
400
401
# 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