Module: VagrantDockerCertificatesManager::UiHelpers

Defined in:
lib/vagrant-docker-certificates-manager/helpers.rb

Defined Under Namespace

Classes: MissingTranslationError, UnsupportedLocaleError

Constant Summary collapse

SUPPORTED =
[:en, :fr].freeze
NAMESPACE =
"vdcm".freeze
OUR_SPACES =
%w[messages. errors. usage. help. prompts. log. emoji. cli. add. remove. list. install.
uninstall.].freeze
EMOJI =
{
  success:  "โœ…",
  info:     "๐Ÿ”",
  ongoing:  "๐Ÿ”",
  warning:  "โš ๏ธ",
  error:    "โŒ",
  version:  "๐Ÿ’พ",
  broom:    "๐Ÿงน",
  question: "โ“",
  bug:      "๐Ÿ›"
}.freeze

Class Method Summary collapse

Class Method Details

.append_help_section(lines, label, body_lines) ⇒ Object



202
203
204
205
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 202

def append_help_section(lines, label, body_lines)
  lines << "  #{label}"
  body_lines.each { |line| lines << line }
end

.build_topic_help_lines(topic, fields, no_emoji) ⇒ Object



179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 179

def build_topic_help_lines(topic, fields, no_emoji)
  lines = []
  lines << "#{e(:info, no_emoji: no_emoji)} #{fields[:title] || t('help.topic_fallback_title', topic: topic)}"
  lines << "  #{t('help.usage_label')}"
  lines << "    #{fields[:usage] || 'vagrant certs help'}"

  desc = fields[:desc]
  append_help_section(lines, t("help.description_label"), ["    #{desc}"]) if desc && !desc.strip.empty?
  unless fields[:opts].empty?
    append_help_section(lines, t("help.options_label"), fields[:opts].values.map do |l|
      "    #{l}"
    end)
  end

  exs = fields[:exs]
  if exs.is_a?(Array) && !exs.empty?
    append_help_section(lines, t("help.examples_label"), exs.map do |ex|
      "    #{ex}"
    end)
  end
  lines
end

.debug(env_or_ui, msg) ⇒ Object



130
131
132
133
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 130

def debug(env_or_ui, msg)
  return unless debug_enabled?
  say(env_or_ui, :info, nil, raw: "#{e(:bug)} #{msg}")
end

.debug_enabled?Boolean

Returns:

  • (Boolean)


101
102
103
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 101

def debug_enabled?
  ENV["VDCM_DEBUG"].to_s == "1"
end

.e(key, no_emoji: false) ⇒ Object



64
65
66
67
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 64

def e(key, no_emoji: false)
  return "" if no_emoji || ENV["VDCM_NO_EMOJI"] == "1"
  EMOJI[key] || ""
end

.emit_lines(lines, ui) ⇒ Object



145
146
147
148
149
150
151
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 145

def emit_lines(lines, ui)
  if ui
    lines.each { |ln| ui.info(ln) }
  else
    lines.each { |ln| puts ln }
  end
end

.exists?(key) ⇒ Boolean

Returns:

  • (Boolean)


93
94
95
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 93

def exists?(key)
  ::I18n.exists?(ns_key(key), ::I18n.locale)
end

.level_to_emoji(level) ⇒ Object



105
106
107
108
109
110
111
112
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 105

def level_to_emoji(level)
  case level
  when :success then :success
  when :warn    then :warning
  when :error   then :error
  else               :info
  end
end

.ns_key(key) ⇒ Object



69
70
71
72
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 69

def ns_key(key)
  k = key.to_s
  k.start_with?("#{NAMESPACE}.") ? k : "#{NAMESPACE}.#{k}"
end

.our_key?(k) ⇒ Boolean

Returns:

  • (Boolean)


97
98
99
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 97

def our_key?(k)
  OUR_SPACES.any? { |ns| k.start_with?("#{NAMESPACE}.#{ns}") || k.start_with?(ns) }
end


135
136
137
138
139
140
141
142
143
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 135

def print_general_help(no_emoji: false, ui: nil)
  setup_i18n!
  lines = []
  lines << "#{e(:info, no_emoji: no_emoji)} #{t('help.general_title')}"
  lines << "  #{t('cli.usage')}"
  t_hash("help.commands").each_value { |line| lines << "  #{line}" }

  emit_lines(lines, ui)
end


153
154
155
156
157
158
159
160
161
162
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 153

def print_topic_help(topic, no_emoji: false, ui: nil)
  setup_i18n!
  topic = (topic || "").to_s.strip.downcase
  return print_general_help(no_emoji: no_emoji, ui: ui) if topic.empty?

  fields = topic_help_fields("help.topic.#{topic}")
  return print_general_help(no_emoji: no_emoji, ui: ui) if topic_help_empty?(fields)

  emit_lines(build_topic_help_lines(topic, fields, no_emoji), ui)
end

.say(env_or_ui, level, key = nil, raw: nil, no_emoji: false, **kv) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 114

def say(env_or_ui, level, key = nil, raw: nil, no_emoji: false, **kv)
  setup_i18n!
  ui = (env_or_ui.respond_to?(:[]) ? (env_or_ui[:ui] || env_or_ui[:machine]&.ui) : env_or_ui)
  msg = raw || (key ? t(key, **kv) : nil)
  return if ui.nil? || msg.nil?

  prefix = e(level_to_emoji(level), no_emoji: no_emoji)
  line   = prefix.empty? ? msg : "#{prefix} #{msg}"

  case level
  when :warn  then ui.warn(line)
  when :error then ui.error(line)
  else             ui.info(line)
  end
end

.set_locale!(lang, strict: false) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 46

def set_locale!(lang, strict: false)
  setup_i18n!
  raw = (lang || ENV["VDCM_LANG"] || ENV["LANG"] || "en").to_s
  sym = raw[0, 2].to_s.downcase.to_sym
  sym = :en if sym.nil? || sym == :""
  unless SUPPORTED.include?(sym)
    if strict
      raise UnsupportedLocaleError,
            "#{e(:error)} Unsupported language: #{sym}. Available: #{SUPPORTED.join(', ')}"
    else
      sym = :en
    end
  end
  ::I18n.locale = sym
  ::I18n.backend.load_translations
  sym
end

.setup_i18n!Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 30

def setup_i18n!
  return if defined?(@i18n_setup) && @i18n_setup
  ::I18n.enforce_available_locales = false
  base  = File.expand_path("../../locales", __dir__)
  paths = Dir[File.join(base, "*.yml")]
  if paths.empty? && File.directory?(base)
    paths = Dir.children(base).grep(/\.ya?ml\z/).map { |file| File.join(base, file) }
  end
  ::I18n.load_path |= paths
  ::I18n.available_locales = SUPPORTED
  default = ((ENV["VDCM_LANG"] || ENV["LANG"] || "en")[0, 2] rescue "en").to_sym
  ::I18n.default_locale = SUPPORTED.include?(default) ? default : :en
  ::I18n.backend.load_translations
  @i18n_setup = true
end

.t(key, **opts) ⇒ Object



74
75
76
77
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 74

def t(key, **opts)
  setup_i18n!
  ::I18n.t(ns_key(key), **opts)
end

.t!(key, **opts) ⇒ Object



79
80
81
82
83
84
85
86
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 79

def t!(key, **opts)
  setup_i18n!
  k = ns_key(key)
  if our_key?(k) && !::I18n.exists?(k, ::I18n.locale)
    raise MissingTranslationError, "#{e(:error)} [#{::I18n.locale}] Missing translation for key: #{k}"
  end
  ::I18n.t(k, **opts)
end

.t_hash(key) ⇒ Object



88
89
90
91
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 88

def t_hash(key)
  v = t(key, default: {})
  v.is_a?(Hash) ? v : {}
end

.topic_help_empty?(fields) ⇒ Boolean

Returns:

  • (Boolean)


174
175
176
177
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 174

def topic_help_empty?(fields)
  fields[:title].nil? && fields[:usage].nil? && fields[:desc].nil? &&
    fields[:opts].empty? && fields[:exs].empty?
end

.topic_help_fields(base) ⇒ Object



164
165
166
167
168
169
170
171
172
# File 'lib/vagrant-docker-certificates-manager/helpers.rb', line 164

def topic_help_fields(base)
  {
    title: t("#{base}.title",       default: nil),
    usage: t("#{base}.usage",       default: nil),
    desc:  t("#{base}.description", default: nil),
    opts:  t_hash("#{base}.options"),
    exs:   ::I18n.t(ns_key("#{base}.examples"), default: [])
  }
end