mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
ebf971f931
* Don't use getattr in _get_parent_attribute to avoid recursion issues Fixes #23609 * Move extend/prepend to field attribute Also removes _get_attr* methods that were basically just calling _get_parent_attribute because it needed to set those params. Also modifies _get_parent_attribute() to pull those values from the FieldAttributes instead of using the ones passed into the function. * Better fixes for _get_parent_attribute
114 lines
4.2 KiB
Python
114 lines
4.2 KiB
Python
# (c) 2012-2014, Michael DeHaan <michael.dehaan@gmail.com>
|
|
#
|
|
# This file is part of Ansible
|
|
#
|
|
# Ansible is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# Ansible is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Make coding more python3-ish
|
|
from __future__ import (absolute_import, division, print_function)
|
|
__metaclass__ = type
|
|
|
|
from copy import deepcopy
|
|
|
|
|
|
class Attribute:
|
|
|
|
def __init__(
|
|
self,
|
|
isa=None,
|
|
private=False,
|
|
default=None,
|
|
required=False,
|
|
listof=None,
|
|
priority=0,
|
|
class_type=None,
|
|
always_post_validate=False,
|
|
inherit=True,
|
|
alias=None,
|
|
extend=False,
|
|
prepend=False,
|
|
):
|
|
|
|
"""
|
|
:class:`Attribute` specifies constraints for attributes of objects which
|
|
derive from playbook data. The attributes of the object are basically
|
|
a schema for the yaml playbook.
|
|
|
|
:kwarg isa: The type of the attribute. Allowable values are a string
|
|
representation of any yaml basic datatype, python class, or percent.
|
|
(Enforced at post-validation time).
|
|
:kwarg private: (not used)
|
|
:kwarg default: Default value if unspecified in the YAML document.
|
|
:kwarg required: Whether or not the YAML document must contain this field.
|
|
If the attribute is None when post-validated, an error will be raised.
|
|
:kwarg listof: If isa is set to "list", this can optionally be set to
|
|
ensure that all elements in the list are of the given type. Valid
|
|
values here are the same as those for isa.
|
|
:kwarg priority: The order in which the fields should be parsed. Generally
|
|
this does not need to be set, it is for rare situations where another
|
|
field depends on the fact that another field was parsed first.
|
|
:kwarg class_type: If isa is set to "class", this can be optionally set to
|
|
a class (not a string name). The YAML data for this field will be
|
|
passed to the __init__ method of that class during post validation and
|
|
the field will be an instance of that class.
|
|
:kwarg always_post_validate: Controls whether a field should be post
|
|
validated or not (default: True).
|
|
:kwarg inherit: A boolean value, which controls whether the object
|
|
containing this field should attempt to inherit the value from its
|
|
parent object if the local value is None.
|
|
:kwarg alias: An alias to use for the attribute name, for situations where
|
|
the attribute name may conflict with a Python reserved word.
|
|
"""
|
|
|
|
self.isa = isa
|
|
self.private = private
|
|
self.default = default
|
|
self.required = required
|
|
self.listof = listof
|
|
self.priority = priority
|
|
self.class_type = class_type
|
|
self.always_post_validate = always_post_validate
|
|
self.inherit = inherit
|
|
self.alias = alias
|
|
self.extend = extend
|
|
self.prepend = prepend
|
|
|
|
if default is not None and self.isa in ('list', 'dict', 'set'):
|
|
self.default = deepcopy(default)
|
|
else:
|
|
self.default = default
|
|
|
|
def __eq__(self, other):
|
|
return other.priority == self.priority
|
|
|
|
def __ne__(self, other):
|
|
return other.priority != self.priority
|
|
|
|
# NB: higher priority numbers sort first
|
|
|
|
def __lt__(self, other):
|
|
return other.priority < self.priority
|
|
|
|
def __gt__(self, other):
|
|
return other.priority > self.priority
|
|
|
|
def __le__(self, other):
|
|
return other.priority <= self.priority
|
|
|
|
def __ge__(self, other):
|
|
return other.priority >= self.priority
|
|
|
|
|
|
class FieldAttribute(Attribute):
|
|
pass
|