File: appraiser_command.rb

package info (click to toggle)
ruby-appraiser 0.2.0-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 176 kB
  • sloc: ruby: 261; makefile: 4
file content (96 lines) | stat: -rw-r--r-- 2,372 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# -*- coding: utf-8 -*-

require 'rubygems/command'
require 'rubygems/dependency'
require 'bundler'
require 'colored'
require 'json'
require 'open-uri'
require 'stringio'

require 'appraiser/version'

class Gem::Commands::AppraiserCommand < Gem::Command

  RUBY_GEMS_URL = 'http://rubygems.org/api/v1/gems/%s.json'

  LINE = '-' * 60


  def initialize
    super 'appraiser', 'Display gem information in ./Gemfile'

    add_option('-g', '--group=GROUP', 'Group') do |group, options|
      options[:group] = group
    end
  end

  def usage # :nodoc:
    "#{program_name} [-g group]"
  end

  def execute
    process($stdout)
  end


  private

  # @param [IO] output
  def process(output)
    group = (options[:group] || :default).to_sym

    dependencies_for(group).each do |dependency|
      json = load_json(dependency.name)

      if json.empty?
        output.puts dependency.name.green
        output.puts "Source   : #{dependency.source.to_s.cyan.underline}"
      else
        name = json['name']
        authors = json['authors']
        downloads = number_with_delimiter(json['downloads'])
        project_uri = json['project_uri']
        doc_uri = json['documentation_uri']
        src_uri = json['source_code_uri']
        info = json['info'].split("\n").first.strip

        output.puts "#{name.green} (by #{authors})"
        output.puts "Downloads: #{downloads.blue}"
        output.puts "Project  : #{project_uri.cyan.underline}" if project_uri
        output.puts "Document : #{doc_uri.cyan.underline}" if doc_uri
        output.puts "Source   : #{src_uri.cyan.underline}" if src_uri
        output.puts info
      end

      output.puts LINE
    end
  end

  # @param [String] gem_name
  # @return [Hash]
  def load_json(gem_name)
    JSON.parse(URI.open(RUBY_GEMS_URL % gem_name).read)
  rescue OpenURI::HTTPError => e
    {}
  end

  # @param [Symbol] group
  # @return [Array<Bundler::Dependency>]
  def dependencies_for(group)
    Bundler.definition.dependencies.select { |i| i.groups.include? group }
  end

  # @param [Integer] number
  # @param [String] delimiter
  # @param [String] separator
  # @return [String]
  def number_with_delimiter(number, delimiter = ',', separator = '.')
    parts = number.to_s.split('.')
    parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
    parts.join separator
  rescue
    number.to_s
  end

end