1
0

updates.thor 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. class UpdatesCLI < Thor
  2. def self.to_s
  3. 'Updates'
  4. end
  5. def initialize(*args)
  6. require 'docs'
  7. require 'progress_bar'
  8. super
  9. end
  10. desc 'check [--verbose] [doc]...', 'Check for outdated documentations'
  11. option :verbose, :type => :boolean
  12. def check(*names)
  13. # Convert names to a list of Scraper instances
  14. # Versions are omitted, if v10 is outdated than v8 is aswell
  15. docs = names.map {|name| Docs.find(name.split(/@|~/)[0], false)}.uniq
  16. # Check all documentations for updates when no arguments are given
  17. docs = Docs.all if docs.empty?
  18. progress_bar = ::ProgressBar.new docs.length
  19. progress_bar.write
  20. results = docs.map do |doc|
  21. result = check_doc(doc)
  22. progress_bar.increment!
  23. result
  24. end
  25. valid_results = results.select {|result| result.is_a?(Hash)}
  26. up_to_date_results = valid_results.select {|result| !result[:is_outdated]}
  27. outdated_results = valid_results.select {|result| result[:is_outdated]}
  28. log_results('Up-to-date', up_to_date_results) if options[:verbose] and !up_to_date_results.empty?
  29. logger.info("") if options[:verbose] and !up_to_date_results.empty? and !outdated_results.empty?
  30. log_results('Outdated', outdated_results) unless outdated_results.empty?
  31. rescue Docs::DocNotFound => error
  32. logger.error(error)
  33. logger.info('Run "thor docs:list" to see the list of docs.')
  34. end
  35. private
  36. def check_doc(doc)
  37. # Newer scraper versions always come before older scraper versions
  38. # Therefore, the first item's release value is the latest current scraper version
  39. #
  40. # For example, a scraper could scrape 3 versions: 10, 11 and 12
  41. # doc.versions.first would be the scraper for version 12
  42. instance = doc.versions.first.new
  43. return nil unless instance.class.method_defined?(:options)
  44. current_version = instance.options[:release]
  45. return nil if current_version.nil?
  46. logger.debug("Checking #{doc.name}")
  47. instance.get_latest_version do |latest_version|
  48. return {
  49. name: doc.name,
  50. current_version: current_version,
  51. latest_version: latest_version,
  52. is_outdated: instance.is_outdated(current_version, latest_version)
  53. }
  54. end
  55. return nil
  56. rescue NotImplementedError
  57. logger.warn("Couldn't check #{doc.name}, get_latest_version is not implemented")
  58. rescue
  59. logger.error("Error while checking #{doc.name}")
  60. raise
  61. end
  62. def log_results(label, results)
  63. logger.info("#{label} documentations (#{results.length}):")
  64. results.each do |result|
  65. logger.info("#{result[:name]}: #{result[:current_version]} -> #{result[:latest_version]}")
  66. end
  67. end
  68. def logger
  69. @logger ||= Logger.new($stdout).tap do |logger|
  70. logger.level = options[:verbose] ? Logger::DEBUG : Logger::INFO
  71. logger.formatter = proc do |severity, datetime, progname, msg|
  72. prefix = severity != "INFO" ? "[#{severity}] " : ""
  73. "#{prefix}#{msg}\n"
  74. end
  75. end
  76. end
  77. end