class Milestoner::Syndication::Builder

Builds feed in Atom format. :reek: DataClump

Attributes

client[R]
view[R]

Public Class Methods

authors_for(tags) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 17
def self.authors_for tags
  tags.flat_map { |tag| tag.commits.map(&:author) }
      .then { |users| users.any? ? users : tags.map(&:author) }
      .uniq
end
new(client: RSS::Maker, view: Views::Milestones::Show.new, **) click to toggle source
Calls superclass method
# File lib/milestoner/syndication/builder.rb, line 23
def initialize(client: RSS::Maker, view: Views::Milestones::Show.new, **)
  super(**)
  @client = client
  @view = view
end

Public Instance Methods

call(tags) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 29
def call tags
  return Failure "No tags or commits." if tags.empty?

  Success build_feed(tags).to_s
rescue NoMethodError, RSS::Error => error
  Failure "#{self.class}: #{error.message.capitalize}."
end

Private Instance Methods

build_authors(node, users = Core::EMPTY_ARRAY) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 116
def build_authors node, users = Core::EMPTY_ARRAY
  users.each do |user|
    node.authors.build name: user.name, uri: format(settings.profile_uri, id: user.handle)
  end
end
build_channel(node, tags) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 48
def build_channel node, tags
  at = tags.first.committed_at

  node.merge id: settings.project_uri_home,
             title: settings.syndication_label,
             subtitle: settings.project_description,
             icon: settings.project_uri_icon,
             logo: settings.project_uri_logo,
             rights: at.strftime("%Y"),
             updated: at

  build_channel_elements node, tags
end
build_channel_elements(node, tags) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 62
def build_channel_elements node, tags
  build_links node
  build_generator node
  build_authors node, self.class.authors_for(tags)

  node.categories.build label: settings.project_label, term: settings.project_name
end
build_feed(tags) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 41
def build_feed tags
  client.make "atom" do |node|
    build_channel node.channel, tags
    build_tags node, tags
  end
end
build_generator(node) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 78
def build_generator node
  node.generator do |generator|
    generator.merge content: settings.generator_label,
                    version: settings.generator_version,
                    uri: settings.generator_uri
  end
end
build_item(node, tag) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 90
def build_item node, tag
  node.new_item do |item|
    build_item_metadata item, tag
    build_item_content item.content, tag
    build_authors item, tag.commits.map(&:author).uniq.select(&:name)
    item.categories.build_for settings.syndication_categories, label: :label, name: :term
  end
end
build_item_content(node, tag) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 111
def build_item_content node, tag
  content = view.call tag:, layout: settings.build_layout, format: :xml
  node.merge content:, type: :html
end
build_item_metadata(node, tag) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 99
def build_item_metadata node, tag
  committed_at = tag.committed_at
  version = tag.version

  node.merge id: format(settings.syndication_id, id: version),
             title: format(settings.syndication_entry_label, id: version),
             link: format(settings.syndication_entry_uri, id: version),
             rights: committed_at.strftime("%Y"),
             published: committed_at,
             updated: committed_at
end
build_tags(node, tags = Core::EMPTY_ARRAY) click to toggle source
# File lib/milestoner/syndication/builder.rb, line 86
def build_tags node, tags = Core::EMPTY_ARRAY
  tags.each { |tag| build_item node.items, tag }
end