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.



581
582
583
# File 'lib/cdnget.rb', line 581

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

Class Method Details

.main(args = nil) ⇒ Object



610
611
612
613
614
615
616
617
618
# File 'lib/cdnget.rb', line 610

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



770
771
772
773
774
775
# File 'lib/cdnget.rb', line 770

def do_download_library(cdn_code, library, version, basedir)
  cdn = find_cdn(cdn_code)
  version = _latest_version(cdn, library) if version == 'latest'
  cdn.download(library, version, basedir, quiet: @quiet)
  return nil
end

#do_find_library(cdn_code, library) ⇒ Object



718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
# File 'lib/cdnget.rb', line 718

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 << "info:     #{d[:info]}\n"    if d[:info]
    s << "license:  #{d[:license]}\n" if d[:license]
    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



742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
# File 'lib/cdnget.rb', line 742

def do_get_library(cdn_code, library, version)
  cdn = find_cdn(cdn_code)
  version = _latest_version(cdn, library) if version == 'latest'
  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 << "info:     #{d[:info]}\n"    if d[:info]
    s << "npmpkg:   #{d[:npmpkg]}\n"  if d[:npmpkg]
    s << "default:  #{d[:default]}\n" if d[:default]
    s << "license:  #{d[:license]}\n" if d[:license]
    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



701
702
703
704
# File 'lib/cdnget.rb', line 701

def do_list_cdns()
  return CLASSES.map {|c| "#{c::CODE}\n" }.join() if @quiet
  return CLASSES.map {|c| "%-10s  # %s\n" % [c::CODE, c::SITE_URL] }.join()
end

#do_list_libraries(cdn_code) ⇒ Object



706
707
708
709
710
711
# File 'lib/cdnget.rb', line 706

def do_list_libraries(cdn_code)
  cdn = find_cdn(cdn_code)
  list = cdn.list()  or
    raise CommandError.new("#{cdn_code}: cannot list libraries; please specify pattern such as 'jquery*'.")
  return render_list(list)
end

#do_search_libraries(cdn_code, pattern) ⇒ Object



713
714
715
716
# File 'lib/cdnget.rb', line 713

def do_search_libraries(cdn_code, pattern)
  cdn = find_cdn(cdn_code)
  return render_list(cdn.search(pattern))
end

#find_cdn(cdn_code) ⇒ Object



690
691
692
693
694
# File 'lib/cdnget.rb', line 690

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(debug_mode: @debug_mode)
end

#help_messageObject



585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
# File 'lib/cdnget.rb', line 585

def help_message()
  script = @script
  return <<END
#{script}  -- download files from public CDN (cdnjs/jsdelivr/unpkg/google)

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

Options:
  -h, --help        : help
  -v, --version     : version
  -q, --quiet       : minimal output
  --debug       : (debug mode)

Example:
  $ #{script}                                # list public CDN names
  $ #{script} [-q] cdnjs                     # list libraries
  $ #{script} [-q] cdnjs 'jquery*'           # search libraries
  $ #{script} [-q] cdnjs jquery              # list versions
  $ #{script} [-q] cdnjs jquery latest       # show latest version
  $ #{script} [-q] cdnjs jquery 3.6.0        # list files
  $ #{script} [-q] cdnjs jquery 3.6.0 /tmp   # download files into directory

END
end

#parse_cmdopts(cmdargs, short_opts, long_opts) ⇒ Object



663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
# File 'lib/cdnget.rb', line 663

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



696
697
698
699
# File 'lib/cdnget.rb', line 696

def render_list(list)
  return list.collect {|d| "#{d[:name]}\n" }.join() if @quiet
  return list.collect {|d| "%-20s  # %s\n" % [d[:name], d[:desc]] }.join()
end

#run(*args) ⇒ Object



620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
# File 'lib/cdnget.rb', line 620

def run(*args)
  cmdopts = parse_cmdopts(args, "hvq", ["help", "version", "quiet", "debug"])
  return help_message() if cmdopts['h'] || cmdopts['help']
  return RELEASE + "\n" if cmdopts['v'] || cmdopts['version']
  @quiet = cmdopts['quiet'] || cmdopts['q']
  @debug_mode = cmdopts['debug']
  #
  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
    return library.include?('*') \
           ? do_search_libraries(cdn_code, library) \
           : do_find_library(cdn_code, library)
  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



652
653
654
655
656
657
658
659
660
661
# File 'lib/cdnget.rb', line 652

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