lib/yard/rubygems/hook.rb in yard-0.9.18 vs lib/yard/rubygems/hook.rb in yard-0.9.19

- old
+ new

@@ -1,197 +1,197 @@ -# frozen_string_literal: true -require 'rubygems' -require 'rubygems/user_interaction' -require 'fileutils' - -## -# Gem::YARDoc provides methods to generate YARDoc and yri data for installed gems -# upon gem installation. -# -# This file is automatically required by RubyGems 1.9 and newer. - -module YARD - class RubygemsHook - include Gem::UserInteraction - extend Gem::UserInteraction - - @yard_version = nil - - ## - # Force installation of documentation? - - attr_accessor :force - - ## - # Generate yard? - - attr_accessor :generate_yard - - ## - # Generate yri data? - - attr_accessor :generate_yri - - class << self - ## - # Loaded version of YARD. Set by ::load_yard - - attr_reader :yard_version - end - - ## - # Post installs hook that generates documentation for each specification in - # +specs+ - - def self.generation_hook(installer, specs) - start = Time.now - types = installer.document - - generate_yard = types.include?('yardoc') || types.include?('yard') - generate_yri = types.include? 'yri' - - specs.each do |spec| - gen_yard = generate_yard - gen_yri = generate_yri - gen_yri = false if gen_yard # never generate both, no need - unless types.empty? # --no-document is not in effect - # look at spec.metadata['yard.run'] for override - run_yard = spec.metadata['yard.run'] - gen_yard = true if run_yard && run_yard != 'yri' - gen_yri = true if run_yard == 'yri' - end - - new(spec, gen_yard, gen_yri).generate - end - - return unless generate_yard || generate_yri - - duration = (Time.now - start).to_i - names = specs.map(&:name).join ', ' - - say "Done installing documentation for #{names} after #{duration} seconds" - end - - ## - # Pre uninstalls hook that removes documentation - # - - def self.removal_hook(uninstaller) - new(uninstaller.spec).remove - end - - ## - # Loads the YARD generator - - def self.load_yard - return if @yard_version - - require 'yard' - - @yard_version = Gem::Version.new ::YARD::VERSION - end - - def initialize(spec, generate_yard = false, generate_yri = true) - @doc_dir = spec.doc_dir - @force = false - @spec = spec - - @generate_yard = generate_yard - @generate_yri = generate_yri - - @yard_dir = spec.doc_dir('yard') - @yri_dir = spec.doc_dir('.yardoc') - end - - def run_yardoc(*args) - args << '--quiet' unless Gem.configuration.really_verbose - args << '--backtrace' if Gem.configuration.backtrace - unless File.file?(File.join(@spec.full_gem_path, '.yardopts')) - args << @spec.require_paths - unless @spec.extra_rdoc_files.empty? - args << '-' - args += @spec.extra_rdoc_files - end - end - args = args.flatten.map(&:to_s) - - Dir.chdir(@spec.full_gem_path) do - YARD::CLI::Yardoc.run(*args) - end - rescue Errno::EACCES => e - dirname = File.dirname e.message.split("-")[1].strip - raise Gem::FilePermissionError, dirname - rescue => ex - alert_error "While generating documentation for #{@spec.full_name}" - ui.errs.puts "... MESSAGE: #{ex}" - ui.errs.puts "... YARDOC args: #{args.join(' ')}" - ui.errs.puts "\t#{ex.backtrace.join("\n\t")}" if Gem.configuration.backtrace - ui.errs.puts "(continuing with the rest of the installation)" - end - - def install_yard - FileUtils.rm_rf @yard_dir - - say "Installing YARD documentation for #{@spec.full_name}..." - run_yardoc '--no-progress', '--db', @yri_dir, '-o', @yard_dir - end - - def install_yri - FileUtils.rm_rf @yri_dir - - say "Building YARD (yri) index for #{@spec.full_name}..." - run_yardoc '--no-progress', '-c', '-n', '--db', @yri_dir - end - - ## - # Generates YARD and yri data - - def generate - return if @spec.default_gem? - return unless @generate_yri || @generate_yard - - setup - - install_yri if @generate_yri && (@force || !File.exist?(@yri_dir)) - - install_yard if @generate_yard && (@force || !File.exist?(@yard_dir)) - end - - ## - # Prepares the spec for documentation generation - - def setup - self.class.load_yard - - if File.exist?(@doc_dir) - raise Gem::FilePermissionError, @doc_dir unless File.writable?(@doc_dir) - else - FileUtils.mkdir_p @doc_dir - end - end - - def uninstall_yard - if File.exist?(@yard_dir) - raise Gem::FilePermissionError, @yard_dir unless File.writable?(@yard_dir) - FileUtils.rm_rf @yard_dir - end - end - - def uninstall_yri - if File.exist?(@yri_dir) - raise Gem::FilePermissionError, @yri_dir unless File.writable?(@yri_dir) - FileUtils.rm_rf @yri_dir - end - end - - ## - # Removes YARD and yri data - - def remove - uninstall_yri - uninstall_yard - end - end -end - -Gem.done_installing(&YARD::RubygemsHook.method(:generation_hook)) -Gem.pre_uninstall(&YARD::RubygemsHook.method(:removal_hook)) +# frozen_string_literal: true +require 'rubygems' +require 'rubygems/user_interaction' +require 'fileutils' + +## +# Gem::YARDoc provides methods to generate YARDoc and yri data for installed gems +# upon gem installation. +# +# This file is automatically required by RubyGems 1.9 and newer. + +module YARD + class RubygemsHook + include Gem::UserInteraction + extend Gem::UserInteraction + + @yard_version = nil + + ## + # Force installation of documentation? + + attr_accessor :force + + ## + # Generate yard? + + attr_accessor :generate_yard + + ## + # Generate yri data? + + attr_accessor :generate_yri + + class << self + ## + # Loaded version of YARD. Set by ::load_yard + + attr_reader :yard_version + end + + ## + # Post installs hook that generates documentation for each specification in + # +specs+ + + def self.generation_hook(installer, specs) + start = Time.now + types = installer.document + + generate_yard = types.include?('yardoc') || types.include?('yard') + generate_yri = types.include? 'yri' + + specs.each do |spec| + gen_yard = generate_yard + gen_yri = generate_yri + gen_yri = false if gen_yard # never generate both, no need + unless types.empty? # --no-document is not in effect + # look at spec.metadata['yard.run'] for override + run_yard = spec.metadata['yard.run'] + gen_yard = true if run_yard && run_yard != 'yri' + gen_yri = true if run_yard == 'yri' + end + + new(spec, gen_yard, gen_yri).generate + end + + return unless generate_yard || generate_yri + + duration = (Time.now - start).to_i + names = specs.map(&:name).join ', ' + + say "Done installing documentation for #{names} after #{duration} seconds" + end + + ## + # Pre uninstalls hook that removes documentation + # + + def self.removal_hook(uninstaller) + new(uninstaller.spec).remove + end + + ## + # Loads the YARD generator + + def self.load_yard + return if @yard_version + + require 'yard' + + @yard_version = Gem::Version.new ::YARD::VERSION + end + + def initialize(spec, generate_yard = false, generate_yri = true) + @doc_dir = spec.doc_dir + @force = false + @spec = spec + + @generate_yard = generate_yard + @generate_yri = generate_yri + + @yard_dir = spec.doc_dir('yard') + @yri_dir = spec.doc_dir('.yardoc') + end + + def run_yardoc(*args) + args << '--quiet' unless Gem.configuration.really_verbose + args << '--backtrace' if Gem.configuration.backtrace + unless File.file?(File.join(@spec.full_gem_path, '.yardopts')) + args << @spec.require_paths + unless @spec.extra_rdoc_files.empty? + args << '-' + args += @spec.extra_rdoc_files + end + end + args = args.flatten.map(&:to_s) + + Dir.chdir(@spec.full_gem_path) do + YARD::CLI::Yardoc.run(*args) + end + rescue Errno::EACCES => e + dirname = File.dirname e.message.split("-")[1].strip + raise Gem::FilePermissionError, dirname + rescue => ex + alert_error "While generating documentation for #{@spec.full_name}" + ui.errs.puts "... MESSAGE: #{ex}" + ui.errs.puts "... YARDOC args: #{args.join(' ')}" + ui.errs.puts "\t#{ex.backtrace.join("\n\t")}" if Gem.configuration.backtrace + ui.errs.puts "(continuing with the rest of the installation)" + end + + def install_yard + FileUtils.rm_rf @yard_dir + + say "Installing YARD documentation for #{@spec.full_name}..." + run_yardoc '--no-progress', '--db', @yri_dir, '-o', @yard_dir + end + + def install_yri + FileUtils.rm_rf @yri_dir + + say "Building YARD (yri) index for #{@spec.full_name}..." + run_yardoc '--no-progress', '-c', '-n', '--db', @yri_dir + end + + ## + # Generates YARD and yri data + + def generate + return if @spec.default_gem? + return unless @generate_yri || @generate_yard + + setup + + install_yri if @generate_yri && (@force || !File.exist?(@yri_dir)) + + install_yard if @generate_yard && (@force || !File.exist?(@yard_dir)) + end + + ## + # Prepares the spec for documentation generation + + def setup + self.class.load_yard + + if File.exist?(@doc_dir) + raise Gem::FilePermissionError, @doc_dir unless File.writable?(@doc_dir) + else + FileUtils.mkdir_p @doc_dir + end + end + + def uninstall_yard + if File.exist?(@yard_dir) + raise Gem::FilePermissionError, @yard_dir unless File.writable?(@yard_dir) + FileUtils.rm_rf @yard_dir + end + end + + def uninstall_yri + if File.exist?(@yri_dir) + raise Gem::FilePermissionError, @yri_dir unless File.writable?(@yri_dir) + FileUtils.rm_rf @yri_dir + end + end + + ## + # Removes YARD and yri data + + def remove + uninstall_yri + uninstall_yard + end + end +end + +Gem.done_installing(&YARD::RubygemsHook.method(:generation_hook)) +Gem.pre_uninstall(&YARD::RubygemsHook.method(:removal_hook))