Class: Puppet::Interface::Option

Inherits:
Object
  • Object
show all
Includes:
TinyDocs
Defined in:
lib/puppet/interface/option.rb

Overview

This represents an option on an action or face (to be globally applied to its actions). Options should be constructed by calling Puppet::Interface::OptionManager#option, which is available on Puppet::Interface, and then calling methods of OptionBuilder in the supplied block.

Instance Method Summary (collapse)

Methods included from TinyDocs

#build_synopsis, #description, #summary

Methods included from DocGen

#attr_doc, strip_whitespace

Constructor Details

- (Option) initialize(parent, *declaration, &block)  private

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

A new instance of Option



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
# File 'lib/puppet/interface/option.rb', line 13

def initialize(parent, *declaration, &block)
  @parent   = parent
  @optparse = []
  @default  = nil

  # Collect and sort the arguments in the declaration.
  dups = {}
  declaration.each do |item|
    if item.is_a? String and item.to_s =~ /^-/ then
      unless item =~ /^-[a-z]\b/ or item =~ /^--[^-]/ then
        raise ArgumentError, "#{item.inspect}: long options need two dashes (--)"
      end
      @optparse << item

      # Duplicate checking...
      # for our duplicate checking purpose, we don't make a check with the
      # translated '-' -> '_'. Right now, we do that on purpose because of
      # a duplicated option made publicly available on certificate and ca
      # faces for dns alt names. Puppet defines 'dns_alt_names', those
      # faces include 'dns-alt-names'.  We can't get rid of 'dns-alt-names'
      # yet, so we need to do our duplicate checking on the untranslated
      # version of the option.
      # jeffweiss 17 april 2012
      name = optparse_to_optionname(item)
      if Puppet.settings.include? name then
        raise ArgumentError, "#{item.inspect}: already defined in puppet"
      end
      if dup = dups[name] then
        raise ArgumentError, "#{item.inspect}: duplicates existing alias #{dup.inspect} in #{@parent}"
      else
        dups[name] = item
      end
    else
      raise ArgumentError, "#{item.inspect} is not valid for an option argument"
    end
  end

  if @optparse.empty? then
    raise ArgumentError, "No option declarations found while building"
  end

  # Now, infer the name from the options; we prefer the first long option as
  # the name, rather than just the first option.
  @name = optparse_to_name(@optparse.find do |a| a =~ /^--/ end || @optparse.first)
  @aliases = @optparse.map { |o| optparse_to_name(o) }

  # Do we take an argument?  If so, are we consistent about it, because
  # incoherence here makes our life super-difficult, and we can more easily
  # relax this rule later if we find a valid use case for it. --daniel 2011-03-30
  @argument = @optparse.any? { |o| o =~ /[ =]/ }
  if @argument and not @optparse.all? { |o| o =~ /[ =]/ } then
    raise ArgumentError, "Option #{@name} is inconsistent about taking an argument"
  end

  # Is our argument optional?  The rules about consistency apply here, also,
  # just like they do to taking arguments at all. --daniel 2011-03-30
  @optional_argument = @optparse.any? { |o| o=~/[ =]\[/ }
  @optional_argument and raise ArgumentError, "Options with optional arguments are not supported"
  if @optional_argument and not @optparse.all? { |o| o=~/[ =]\[/ } then
    raise ArgumentError, "Option #{@name} is inconsistent about the argument being optional"
  end
end

Instance Method Details

- (Object) optparse_to_name(declaration)  private

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



93
94
95
96
97
# File 'lib/puppet/interface/option.rb', line 93

def optparse_to_name(declaration)
  name = optparse_to_optionname(declaration).tr('-', '_')
  raise "#{name.inspect} is an invalid option name" unless name.to_s =~ /^[a-z]\w*$/
  name.to_sym
end

- (Object) optparse_to_optionname(declaration)  private

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



85
86
87
88
89
90
# File 'lib/puppet/interface/option.rb', line 85

def optparse_to_optionname(declaration)
  unless found = declaration.match(/^-+(?:\[no-\])?([^ =]+)/) then
    raise ArgumentError, "Can't find a name in the declaration #{declaration.inspect}"
  end
  name = found.captures.first
end