discourse/lib/plugin/metadata.rb
Sam Saffron 30990006a9 DEV: enable frozen string literal on all files
This reduces chances of errors where consumers of strings mutate inputs
and reduces memory usage of the app.

Test suite passes now, but there may be some stuff left, so we will run
a few sites on a branch prior to merging
2019-05-13 09:31:32 +08:00

107 lines
2.7 KiB
Ruby

# frozen_string_literal: true
# loaded really early
module Plugin; end
class Plugin::Metadata
OFFICIAL_PLUGINS ||= Set.new([
# TODO: Remove this after everyone upgraded `discourse-canned-replies`
# to the renamed version.
"Canned Replies",
"customer-flair",
"discourse-adplugin",
"discourse-affiliate",
"discourse-akismet",
"discourse-assign",
"discourse-auto-deactivate",
"discourse-backup-uploads-to-s3",
"discourse-bbcode",
"discourse-bbcode-color",
"discourse-cakeday",
"discourse-canned-replies",
"discourse-calendar",
"discourse-characters-required",
"discourse-chat-integration",
"discourse-checklist",
"discourse-code-review",
"discourse-crowd",
"discourse-data-explorer",
"discourse-details",
"discourse-footnote",
"discourse-github",
"discourse-gradle-issue",
"discourse-graphviz",
"discourse-invite-tokens",
"discourse-local-dates",
"discourse-logster-rate-limit-checker",
"discourse-logster-transporter",
"discourse-math",
"discourse-moderator-attention",
"discourse-narrative-bot",
"discourse-nginx-performance-report",
"discourse-no-bump",
"discourse-oauth2-basic",
"discourse-patreon",
"discourse-perspective",
"discourse-plugin-discord-auth",
"discourse-plugin-linkedin-auth",
"discourse-plugin-office365-auth",
"discourse-policy",
"discourse-presence",
"discourse-prometheus",
"discourse-prometheus-alert-receiver",
"discourse-push-notifications",
"discourse-saved-searches",
"discourse-signatures",
"discourse-sitemap",
"discourse-solved",
"discourse-spoiler-alert",
"discourse-staff-notes",
"discourse-styleguide",
"discourse-tooltips",
"discourse-translator",
"discourse-user-card-badges",
"discourse-voting",
"discourse-yearly-review",
"discourse-openid-connect",
"discourse-yearly-review",
"docker_manager",
"lazyYT",
"poll"
])
FIELDS ||= [:name, :about, :version, :authors, :url, :required_version]
attr_accessor(*FIELDS)
def self.parse(text)
metadata = self.new
text.each_line do |line|
break unless metadata.parse_line(line)
end
metadata
end
def official?
OFFICIAL_PLUGINS.include?(name)
end
def parse_line(line)
line = line.strip
unless line.empty?
return false unless line[0] == "#"
attribute, *description = line[1..-1].split(":")
description = description.join(":")
attribute = attribute.strip.gsub(/ /, '_').to_sym
if FIELDS.include?(attribute)
self.public_send("#{attribute}=", description.strip)
end
end
true
end
end