Sha256: 7b9189fa8c4cf522c0a32228ec1b02d0f36f1a81d288e66736f8e734ac6da074

Contents?: true

Size: 1.43 KB

Versions: 1

Compression:

Stored size: 1.43 KB

Contents

require 'contributors_stats/reader'
require 'contributors_stats/formatter'

module ContributorsStats

  # Placeholder for user details resolution plugins
  module UserData
  end

  # Calculates statistics gathered from multiple sources
  class Calculator < Reader
    attr_accessor :user_data_type

    def initialize(options = {})
      @user_data_type = options.delete(:user_data) if options[:user_data]
      super(options)
    end

    # transform calculated data into asked format
    # @param type [String] name of plugin to use for formatting
    # @param options [Hash] list of options for the plugin to use
    # @return [ContributorsStats::Formatter]
    def format(type = :html, options = {})
      ContributorsStats::Formatter.new(calculated_data, type, options)
    end

  private

    # group data, calculate contributions, sort by contributions
    def calculated_data
      @data ||= @raw_data.group_by { |contributor|
        contributor['login']
      }.map {|login, data|
        log "user: #{login}"
        [login, user_data(login, data)]
      }.sort_by{|login, data|
        [1000000/data['contributions'], login]
      }
    end

    def contributions(data)
      data.map{|repo| repo['contributions'].to_i}.inject(&:+)
    end

    def user_data(login, data)
      @user_data_plugin ||= plugins.first_class!("user_data", user_data_type || :simple)
      @user_data_plugin.load(login, data.first, contributions(data))
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
contributors_stats-1.0.0 lib/contributors_stats/calculator.rb