Class Commands::Discover
In: vendor/rails/railties/lib/commands/plugin.rb
Parent: Object

Methods

Public Class methods

[Source]

     # File vendor/rails/railties/lib/commands/plugin.rb, line 661
661:     def initialize(base_command)
662:       @base_command = base_command
663:       @list = false
664:       @prompt = true
665:     end

Public Instance methods

[Source]

     # File vendor/rails/railties/lib/commands/plugin.rb, line 728
728:     def extract_repository_uri(uri)
729:       uri.match(/(svn|https?):.*\/plugins\//i)[0]
730:     end

[Source]

     # File vendor/rails/railties/lib/commands/plugin.rb, line 667
667:     def options
668:       OptionParser.new do |o|
669:         o.set_summary_indent('  ')
670:         o.banner =    "Usage: #{@base_command.script_name} discover URI [URI [URI]...]"
671:         o.define_head "Discover repositories referenced on a page."
672:         o.separator   ""        
673:         o.separator   "Options:"
674:         o.separator   ""
675:         o.on(         "-l", "--list", 
676:                       "List but don't prompt or add discovered repositories.") { |@list| @prompt = !@list }
677:         o.on(         "-n", "--no-prompt", 
678:                       "Add all new repositories without prompting.") { |v| @prompt = !v }
679:       end
680:     end

[Source]

     # File vendor/rails/railties/lib/commands/plugin.rb, line 682
682:     def parse!(args)
683:       options.parse!(args)
684:       args = ['http://wiki.rubyonrails.org/rails/pages/Plugins'] if args.empty?
685:       args.each do |uri|
686:         scrape(uri) do |repo_uri|
687:           catch(:next_uri) do
688:             if @prompt
689:               begin
690:                 $stdout.print "Add #{repo_uri}? [Y/n] "
691:                 throw :next_uri if $stdin.gets !~ /^y?$/i
692:               rescue Interrupt
693:                 $stdout.puts
694:                 exit 1
695:               end
696:             elsif @list
697:               puts repo_uri
698:               throw :next_uri
699:             end
700:             Repositories.instance.add(repo_uri)
701:             puts "discovered: #{repo_uri}" if $verbose or !@prompt
702:           end
703:         end
704:       end
705:       Repositories.instance.save
706:     end

[Source]

     # File vendor/rails/railties/lib/commands/plugin.rb, line 708
708:     def scrape(uri)
709:       require 'open-uri'
710:       puts "Scraping #{uri}" if $verbose
711:       dupes = []
712:       content = open(uri).each do |line|
713:         begin
714:           if line =~ /<a[^>]*href=['"]([^'"]*)['"]/ || line =~ /(svn:\/\/[^<|\n]*)/
715:             uri = $1
716:             if uri =~ /^\w+:\/\// && uri =~ /\/plugins\// && uri !~ /\/browser\// && uri !~ /^http:\/\/wiki\.rubyonrails/ && uri !~ /http:\/\/instiki/
717:               uri = extract_repository_uri(uri)
718:               yield uri unless dupes.include?(uri) || Repositories.instance.exist?(uri)
719:               dupes << uri
720:             end
721:           end
722:         rescue
723:           puts "Problems scraping '#{uri}': #{$!.to_s}"
724:         end
725:       end
726:     end

[Validate]