前回はリソースタイプを拡張し、
filesimpleタイプの定義は、
0001: module Puppet
0002:   newtype(:filesimple) do
0003:     @doc = "Manage a file (the simple version)."
0004:
0005:     ensurable
0006:
0007:     newparam(:name) do
0008:       desc "The full path to the file."
0009:     end
0010:
0011:     newproperty(:mode) do
0012:       desc "Manage the file's mode."
0013:       defaultto "640"
0014:     end
0015:
0016:   end
0017:
0018: end
1行目では、
2行目のnewtypeメソッドで、
3行目では@docというインスタンス変数に、
5行目のensurableというヘルパメソッドを実行することによって、
7行目のnewparamメソッドでは、
namevarをnameパラメータ以外にしたい場合には、
newparam(:path, :namevar => true) do
    ...
end
パラメータの値を決まったものの中から指定できるようにしたい場合には、
newparam(:color) do
    newvalues(:red, :green, :blue, :purple)
end
正規表現も指定できます。
newparam(:color) do
    newvalues(:blue, :red, /.+/)
end
この場合、
値のバリデーションも可能です。以下のコード例では、
newparam(:color) do
    desc "Your color, and stuff."
    newvalues(:blue, :red, /.+/)
    validate do |value|
        if value == "green"
            raise ArgumentError,
                "Everyone knows green databases don't have enough RAM"
        else
            super
        end
    end
end
ここで定義されたvalidateメソッドは、
値を変換することもできます。以下のコード例では、
newparam(:color) do
    desc "Your color, and stuff."
    newvalues(:blue, :red, /.+/)
    munge do |value|
        case value
        when :mauve, :violet # are these colors really any different?
            :purple
        else
            super
        end
    end
end
mungeメソッドもvalidateメソッドと同様、
8行目のdescではnameパラメータの説明を記述しています。これは@docと同様に、
11行目のnewpropertyでは、
例えばmodeプロパティであれば、
13行目のdefaulttoでは、
プロパティで指定される値のバリデーションを行うこともできます。以下のコード例では、
newproperty(:enable) do
    newvalue(:true)
    newvalue(:false)
end
正規表現でバリデーションすることもできます。
newproperty(:owner) do
    validate do |value|
        unless value =~ /^\w+/
            raise ArgumentError, "%s is not a valid user name" % value
        end
    end
end
次回はプロバイダのコードについて解説予定です。
- 参考リンク
 - URL:Creating Custom Types
 
