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.



333
334
335
# File 'lib/cdnget.rb', line 333

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

Class Method Details

.main(args = nil) ⇒ Object



358
359
360
361
362
363
364
365
366
# File 'lib/cdnget.rb', line 358

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



517
518
519
520
521
# File 'lib/cdnget.rb', line 517

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



473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'lib/cdnget.rb', line 473

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



495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
# File 'lib/cdnget.rb', line 495

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 << "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



453
454
455
456
457
458
459
# File 'lib/cdnget.rb', line 453

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



461
462
463
464
# File 'lib/cdnget.rb', line 461

def do_list_libraries(cdn_code)
  cdn = find_cdn(cdn_code)
  return render_list(cdn.list)
end

#do_search_libraries(cdn_code, pattern) ⇒ Object



466
467
468
469
470
471
# File 'lib/cdnget.rb', line 466

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



439
440
441
442
443
# File 'lib/cdnget.rb', line 439

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



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
# File 'lib/cdnget.rb', line 337

def help_message
  script = @script
  return "\#{script}  -- download files from public CDN\n\nUsage: \#{script} [options] [CDN] [library] [version] [directory]\n\nOptions:\n  -h, --help        : help\n  -v, --version     : version\n  -q, --quiet       : minimal output\n\nExample:\n  $ \#{script}                                # list public CDN\n  $ \#{script} [-q] cdnjs                     # list libraries\n  $ \#{script} [-q] cdnjs jquery              # list versions\n  $ \#{script} [-q] cdnjs jquery 2.2.0        # list files\n  $ \#{script} [-q] cdnjs jquery 2.2.0 /tmp   # download files\n"
end

#parse_cmdopts(cmdargs, short_opts, long_opts) ⇒ Object



412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
# File 'lib/cdnget.rb', line 412

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



445
446
447
448
449
450
451
# File 'lib/cdnget.rb', line 445

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



368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
# File 'lib/cdnget.rb', line 368

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



401
402
403
404
405
406
407
408
409
410
# File 'lib/cdnget.rb', line 401

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