class GithubMembers::CLI

Constants

EXIT_FAILURE
EXIT_SUCCESS

Attributes

argv[R]
options[R]

Public Class Methods

new(argv) click to toggle source
# File lib/github_members/cli.rb, line 11
def initialize(argv)
  @argv = argv
end

Public Instance Methods

run() click to toggle source
# File lib/github_members/cli.rb, line 15
def run
  begin
    @options = Options.new(argv)
  rescue Options::ParseError => e
    warn e.message
    return EXIT_FAILURE
  end

  case
   when options.help_shown
     puts options.help
     return EXIT_SUCCESS
  when options.version
    puts options.version
    return EXIT_SUCCESS
  when options.github_org.nil?
    warn "Error: Organization is missing"
    warn ""
    warn options.help
    return EXIT_FAILURE
  end

  org = Organization.new(client.fetch_organization(options.github_org))

  yaml_file = options.yaml_file
  members =
    begin
      read_members(yaml_file)
    rescue RequiredMemberAttributes => e
      warn e.message
      return EXIT_FAILURE
    end

  client.fetch_members(org.name).each do |new_member|
    github = new_member.fetch(:github)
    fullname = new_member.fetch(:fullname)
    avatar = new_member.fetch(:avatar)

    if members.key?(github)
      members[github].tap do |m|
        m.fullname = fullname
        m.avatar = avatar
        m.updated = true
      end
    else
      members[github] = member_class.new(
        github: github,
        fullname: fullname,
        avatar: avatar,
        updated: true
      )
    end
  end

  members.delete_if { |_, m| !m.updated }

  write_members(members.values, yaml_file)
  puts "Updated: #{yaml_file}"

  markdown_file = options.markdown_file
  MarkdownWriter.new.write(org: org, members: members.values, file: markdown_file)
  puts "Updated: #{markdown_file}"

  EXIT_SUCCESS
end

Private Instance Methods

client() click to toggle source
# File lib/github_members/cli.rb, line 83
def client
  @client ||= Client.new(options)
end
member_class() click to toggle source
# File lib/github_members/cli.rb, line 87
def member_class
  @member_class ||= Member.new.define_class(*options.fields)
end
read_members(file) click to toggle source
# File lib/github_members/cli.rb, line 91
def read_members(file)
  return {} unless file.exist?

  YAML.safe_load(File.read(file)).each_with_object({}) do |member_attrs, hash|
    member = member_class.new(updated: false)

    required_attrs = member_attrs.keys.map(&:to_sym) - member.members
    unless required_attrs.empty?
      raise RequiredMemberAttributes, "Needed to specify the option: --fields #{required_attrs.join(",")}"
    end

    member_attrs.each { |key, value| member[key] = value }
    hash[member.github] = member
  end
end
write_members(members, file) click to toggle source
# File lib/github_members/cli.rb, line 107
def write_members(members, file)
  file.write(members.map(&:to_h).to_yaml)
end