lib/gdk/announcement.rb (78 lines of code) (raw):
# frozen_string_literal: true
require 'yaml'
begin
require 'tty-markdown'
rescue LoadError
end
module GDK
class Announcement
VALID_FILENAME_REGEX = /\A\d{4}_\w+\.yml/
attr_reader :header, :body
FilenameInvalidError = Class.new(StandardError)
def self.from_file(filepath)
yaml = YAML.safe_load(filepath.read)
new(filepath, yaml['header'], yaml['body'])
end
def initialize(filepath, header, body)
@filepath = Pathname.new(filepath)
raise FilenameInvalidError unless filename_valid?
@header = header
@body = body
read_cache_file_contents!
end
def cache_announcement_rendered
read_cache_file_contents!
cache_file_contents[announcement_unique_identifier] = true
update_cached_file
end
def render?
cache_file_contents[announcement_unique_identifier] != true
end
def render
return unless render?
display
cache_announcement_rendered
end
private
attr_reader :filepath
attr_accessor :cache_file_contents
def filename_valid?
filepath.basename.to_s.match?(VALID_FILENAME_REGEX)
end
def config
GDK.config
end
def display
if defined?(TTY::Markdown)
options = { width: 80, color: GDK::Output.colorize? ? :always : :never }
GDK::Output.puts TTY::Markdown.parse("**#{header}**", **options)
GDK::Output.puts TTY::Markdown.parse("***", **options)
GDK::Output.puts TTY::Markdown.parse(body, **options)
return
end
GDK::Output.info(header)
GDK::Output.divider
GDK::Output.puts(body)
end
def update_cached_file
config.__cache_dir.mkpath
cache_file.open('w') { |f| f.write(cache_file_contents.to_yaml) }
end
def announcement_unique_identifier
@announcement_unique_identifier ||= filepath.basename.to_s[0..3]
end
def cache_file
@cache_file ||= config.__cache_dir.join('.gdk-announcements.yml')
end
def read_cache_file_contents!
@cache_file_contents = cache_file.exist? ? YAML.safe_load(cache_file.read) : {}
end
end
end
if defined?(TTY::Markdown)
module GDKMarkdown
# Always use blue color instead to account for contrast issues in highlighted code.
# https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/2301
def convert_codespan(element, _opts)
@pastel.blue(element.value)
end
end
TTY::Markdown::Converter.prepend(GDKMarkdown)
end