class GithubMembers::MarkdownWriter

Constants

TAG_BEGIN
TAG_END

Public Instance Methods

write(org:, members:, file:) click to toggle source
# File lib/github_members/markdown_writer.rb, line 8
    def write(org:, members:, file:)
      unless file.exist?
        file.write(<<~MARKDOWN)
          # Members

          #{TAG_BEGIN}
          #{TAG_END}
        MARKDOWN
      end

      table = render_table(members)
      write_file(table, members.size, org, file)
    end

Private Instance Methods

render_table(members) click to toggle source
# File lib/github_members/markdown_writer.rb, line 22
        def render_table(members)
  return "" if members.empty?

  fields = members.first.additional_fields
  labels = [" ", "GitHub", "Fullname"]
  align = ["c", "l", "l"]

  fields.each do |field|
    labels << field.capitalize
    align << "l"
  end

  data = members.map do |member|
    # NOTE: GitHub's default avatar doesn't support `&s=<size>`, so this uses the `<img>` tag.
    avatar_url = URI(member.avatar).tap { |u| u.query = "s=64" }.to_s
    avatar = %(<img src="#{avatar_url}" alt="@#{member.github}" width="32" height="32">)
    github = "[@#{member.github}](#{member.github_url})"
    fullname = member.fullname.to_s.then { |v| v.empty? ? "-" : v }

    [avatar, github, fullname].tap do |d|
      fields.each do |field|
        d << member[field].to_s.then { |v| v.empty? ? "-" : v }
      end
    end
  end

  MarkdownTables.make_table(labels, data, is_rows: true, align: align)
end
write_file(table, member_count, org, file) click to toggle source
# File lib/github_members/markdown_writer.rb, line 51
            def write_file(table, member_count, org, file)
      content = file.read

      unless content.include?(TAG_BEGIN)
        raise MissingTagInMarkdown, "#{file} must include `#{TAG_BEGIN}`"
      end

      unless content.include?(TAG_END)
        raise MissingTagInMarkdown, "#{file} must include `#{TAG_END}`"
      end

      content.sub!(/#{TAG_BEGIN}.+#{TAG_END}/mo, <<~MARKDOWN.strip)
        #{TAG_BEGIN}
        **#{member_count}** member#{member_count == 1 ? "" : "s"} of [#{org.name}](#{org.url})

        #{table}
        #{TAG_END}
      MARKDOWN

      file.write(content)
    end