File: label_provider.rb

package info (click to toggle)
puppet-agent 7.23.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 19,092 kB
  • sloc: ruby: 245,074; sh: 456; makefile: 38; xml: 33
file content (90 lines) | stat: -rw-r--r-- 2,287 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# Provides a label for an object.
# This simple implementation calls #to_s on the given object, and handles articles 'a/an/the'.
#
module Puppet::Pops::LabelProvider
  VOWELS = %w{a e i o u y}
  SKIPPED_CHARACTERS = %w{" '}
  A = "a"
  AN = "an"

  # Provides a label for the given object by calling `to_s` on the object.
  # The intent is for this method to be overridden in concrete label providers.
  def label o
    o.to_s
  end

  # Produces a label for the given text with indefinite article (a/an)
  def a_an o
    text = label(o)
    "#{article(text)} #{text}"
  end

  # Produces a label for the given text with indefinite article (A/An)
  def a_an_uc o
    text = label(o)
    "#{article(text).capitalize} #{text}"
  end

  # Produces a label for the given text with *definite article* (the).
  def the o
    "the #{label(o)}"
  end

  # Produces a label for the given text with *definite article* (The).
  def the_uc o
    "The #{label(o)}"
  end

  # Appends 's' to (optional) text if count != 1 else an empty string
  def plural_s(count, text = '')
    count == 1 ? text : "#{text}s"
  end

  # Combines several strings using commas and a final conjunction
  def combine_strings(strings, conjunction = 'or')
    case strings.size
    when 0
      ''
    when 1
      strings[0]
    when 2
      "#{strings[0]} #{conjunction} #{strings[1]}"
    else
      "#{strings[0...-1].join(', ')}, #{conjunction} #{strings.last}"
    end
  end

  # Produces an *indefinite article* (a/an) for the given text ('a' if
  # it starts with a vowel) This is obviously flawed in the general
  # sense as may labels have punctuation at the start and this method
  # does not translate punctuation to English words. Also, if a vowel is
  # pronounced as a consonant, the article should not be "an".
  #
  def article s
    article_for_letter(first_letter_of(s))
  end

  private

  def first_letter_of(string)
    char = string[0,1]
    if SKIPPED_CHARACTERS.include? char
      char = string[1,1]
    end

    if char == ""
      raise Puppet::DevError, _("<%{string}> does not appear to contain a word") % { string: string }
    end

    char
  end

  def article_for_letter(letter)
    downcased = letter.downcase
    if VOWELS.include? downcased
      AN
    else
      A
    end
  end
end