Xc@sdZddkZddkZddkZddkZddklZlZddkl Z ddk l Z ddk lZlZlZddklZlZlZddklZlZdd klZlZlZdd k lZlZdd klZdd kl Z d efdYZ!dZ"e#Z$dZ defdYZ%de%fdYZ&de&fdYZ'de%fdYZ(de(fdYZ)de(fdYZ*de%fdYZ+de+fd YZ,d!e+fd"YZ-d#e-fd$YZ.d%e-fd&YZ/d'e%fd(YZ0d)e0fd*YZ1d+e0fd,YZ2d-e%fd.YZ3d/e-fd0YZ4d1e-fd2YZ5d3e%fd4YZ6d5e3fd6YZ7d7Z8dS(8s7 Parameter system for command plugins. A `Param` instance can be used to describe an argument or option that a command takes, or an attribute that a command returns. The `Param` base class is not used directly, but there are many subclasses for specific Python data types (like `Str` or `Int`) and specific properties (like `Password`). To create a `Param` instance, you must always provide the parameter *name*, which should be the LDAP attribute name if the parameter describes the attribute of an LDAP entry. For example, we could create an `Str` instance describing the user's last-name attribute like this: >>> from ipalib import Str >>> sn = Str('sn') >>> sn.name 'sn' When creating a `Param`, there are also a number of optional kwargs which which can provide additional meta-data and functionality. For example, every parameter has a *cli_name*, the name used on the command-line-interface. By default the *cli_name* is the same as the *name*: >>> sn.cli_name 'sn' But often the LDAP attribute name isn't user friendly for the command-line, so you can override this with the *cli_name* kwarg: >>> sn = Str('sn', cli_name='last') >>> sn.name 'sn' >>> sn.cli_name 'last' Note that the RPC interfaces (and the internal processing pipeline) always use the parameter *name*, regardless of what the *cli_name* might be. A `Param` also has two translatable kwargs: *label* and *doc*. These must both be `Gettext` instances. They both default to a place-holder `FixMe` instance, a subclass of `Gettext` used to mark a missing translatable string: >>> sn.label FixMe('sn') >>> sn.doc FixMe('sn') The *label* is a short phrase describing the parameter. It's used on the CLI when interactively prompting for values, and as a label for form inputs in the web-UI. The *label* should start with an initial capital. For example: >>> from ipalib import _ >>> sn = Str('sn', ... cli_name='last', ... label=_('Last name'), ... ) >>> sn.label Gettext('Last name', domain='ipa', localedir=None) The *doc* is a longer description of the parameter. It's used on the CLI when displaying the help information for a command, and as extra instruction for a form input on the web-UI. By default the *doc* is the same as the *label*: >>> sn.doc Gettext('Last name', domain='ipa', localedir=None) But you can override this with the *doc* kwarg. Like the *label*, the *doc* should also start with an initial capital and should not end with any punctuation. For example: >>> sn = Str('sn', ... cli_name='last', ... label=_('Last name'), ... doc=_("The user's last name"), ... ) >>> sn.doc Gettext("The user's last name", domain='ipa', localedir=None) Demonstration aside, you should always provide at least the *label* so the various UIs are translatable. Only provide the *doc* if the parameter needs a more detailed description for clarity. iN(tMAXINTtMININT(tNoneType(t_(tReadOnlytlockt check_name(tConversionErrortRequirementErrortValidationError(tPasswordMismatchtBase64DecodeError(tNULLSt TYPE_ERRORtCALLABLE_ERROR(tGettexttFixMe(tjson_serialize(tDNt DefaultFromcBs)eZdZdZdZdZRS(s Derive a default value from other supplied values. For example, say you wanted to create a default for the user's login from the user's first and last names. It could be implemented like this: >>> login = DefaultFrom(lambda first, last: first[0] + last) >>> login(first='John', last='Doe') 'JDoe' If you do not explicitly provide keys when you create a `DefaultFrom` instance, the keys are implicitly derived from your callback by inspecting ``callback.func_code.co_varnames``. The keys are available through the ``DefaultFrom.keys`` instance attribute, like this: >>> login.keys ('first', 'last') The callback is available through the ``DefaultFrom.callback`` instance attribute, like this: >>> login.callback # doctest:+ELLIPSIS at 0x...> >>> login.callback.func_code.co_varnames # The keys ('first', 'last') The keys can be explicitly provided as optional positional arguments after the callback. For example, this is equivalent to the ``login`` instance above: >>> login2 = DefaultFrom(lambda a, b: a[0] + b, 'first', 'last') >>> login2.keys ('first', 'last') >>> login2.callback.func_code.co_varnames # Not the keys ('a', 'b') >>> login2(first='John', last='Doe') 'JDoe' If any keys are missing when calling your `DefaultFrom` instance, your callback is not called and ``None`` is returned. For example: >>> login(first='John', lastname='Doe') is None True >>> login() is None True Any additional keys are simply ignored, like this: >>> login(last='Doe', first='John', middle='Whatever') 'JDoe' As above, because `DefaultFrom.__call__` takes only pure keyword arguments, they can be supplied in any order. Of course, the callback need not be a ``lambda`` expression. This third example is equivalent to both the ``login`` and ``login2`` instances above: >>> def get_login(first, last): ... return first[0] + last ... >>> login3 = DefaultFrom(get_login) >>> login3.keys ('first', 'last') >>> login3.callback.func_code.co_varnames ('first', 'last') >>> login3(first='John', last='Doe') 'JDoe' c Gst|p#ttd|t|fn||_t|djo>|i}|id@otdn|i |i |_ n ||_ xJ|i D]?}t|t j o&tt dt |t|fqqWt|dS(s :param callback: The callable to call when all keys are present. :param keys: Optional keys used for source values. tcallbackii s3callback: variable-length argument list not allowedtkeysN(tcallablet TypeErrorRttypeRtlent func_codetco_flagst ValueErrort co_varnamest co_argcountRtstrR R(tselfRRtfctkey((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt__init__s       'cCsC|iiftd|iD}d|iidi|fS(Ncssx|]}t|VqWdS(N(trepr(t.0tk((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys s s%s(%s)s, (Rt__name__ttupleRt __class__tjoin(R targs((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt__repr__s& c s\tfd|iD}d|jodSy|i|SWntj onXdS(s Call the callback if all keys are present. If all keys are present, the callback is called and its return value is returned. If any keys are missing, ``None`` is returned. :param kw: The keyword arguments. c3s%x|]}i|dVqWdS(N(tgettNone(R%R&(tkw(s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys s N(R(RR.Rt StandardError(R R/tvals((R/s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt__call__s  (R't __module__t__doc__R#R,R2(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRvsE  cCst|tj o&ttdt|t|fnhtdtdtd6tdtdtd6tdtdtd6}|d}||jo|d ||fS|tdtdtfS(s Parse shorthand ``spec`` into to ``(name, kw)``. The ``spec`` string determines the parameter name, whether the parameter is required, and whether the parameter is multivalue according the following syntax: ====== ===== ======== ========== Spec Name Required Multivalue ====== ===== ======== ========== 'var' 'var' True False 'var?' 'var' False False 'var*' 'var' False True 'var+' 'var' True True ====== ===== ======== ========== For example, >>> parse_param_spec('login') ('login', {'required': True, 'multivalue': False}) >>> parse_param_spec('gecos?') ('gecos', {'required': False, 'multivalue': False}) >>> parse_param_spec('telephone_numbers*') ('telephone_numbers', {'required': False, 'multivalue': True}) >>> parse_param_spec('group+') ('group', {'required': True, 'multivalue': True}) :param spec: A spec string. tspectrequiredt multivaluet?t*t+i(RRRR tdicttFalsetTrue(R5t_maptend((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pytparse_param_specs#  cCsti||S(N(t __messagestadd(tmessage((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs tParamcBs-eZdZeZedZedZded4fded4fde e fd4fde e fd4fde e fde efd e efd ed4fd ed4fd e efd e efde efded4fded4fdeefdee fd4fde efdedfde efdedfde e fded4ffZdZdZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Z e!i"d'Z#d(Z$d)Z%d*Z&d+Z'd4d,Z(d4d4d-Z)d4d.Z*d/Z+d5Z,d3Z-RS(6su Base class for all parameters. Param attributes: ================= The behavior of Param class and subclasses can be controlled using the following set of attributes: - cli_name: option name in CLI - cli_short_name: one character version of cli_name - label: very short description of the parameter. This value is used in when the Command output is printed to CLI or in a Command help - doc: parameter long description used in help - required: the parameter is marked as required for given Command - multivalue: indicates if the attribute is multivalued - primary_key: Command's parameter primary key is used for unique identification of an LDAP object and for sorting - normalizer: a custom function for Param value normalization - default_from: a custom function for generating default values of parameter instance - autofill: by default, only `required` parameters get a default value from the default_from function. When autofill is enabled, optional attributes get the default value filled too - query: this attribute is controlled by framework. When the `query` is enabled, framework assumes that the value is only queried and not inserted in the LDAP. Validation is then relaxed - custom parameter validators are skipped and only basic class validators are executed to check the parameter value - attribute: this attribute is controlled by framework and enabled for all LDAP objects parameters (unless parameter has "virtual_attribute" flag). All parameters with enabled `attribute` are being encoded and placed to an entry passed to LDAP Create/Update calls - include: a list of contexts where this parameter should be included. `Param.use_in_context()` provides further information. - exclude: a list of contexts where this parameter should be excluded. `Param.use_in_context()` provides further information. - flags: there are several flags that can be used to further tune the parameter behavior: * no_display (Output parameters only): do not display the parameter * no_create: do not include the parameter for crud.Create based commands * no_update: do not include the parameter for crud.update based commands * no_option: this attribute is not displayed in the CLI, usually because there's a better way of setting it (for example, a separate command) * virtual_attribute: the parameter is not stored physically in the LDAP and thus attribute `attribute` is not enabled * suppress_empty (Output parameters only): do not display parameter value when empty * ask_create: CLI asks for parameter value even when the parameter is not `required`. Applied for all crud.Create based commands * ask_update: CLI asks for parameter value even when the parameter is not `required`. Applied for all crud.Update based commands * req_update: The parameter is `required` in all crud.Update based commands * nonempty: This is an internal flag; a required attribute should be used instead of it. The value of this parameter must not be empty, but it may not be given at all. All crud.Update commands automatically convert required parameters to `nonempty` ones, so the value can be unspecified (unchanged) but cannot be deleted. - hint: this attribute is currently not used - alwaysask: when enabled, CLI asks for parameter value even when the parameter is not `required` - sortorder: used to sort a list of parameters for Command. See `Command.finalize()` for further information - csv: this multivalue attribute is given in CSV format - csv_separator: character that separates values in CSV (comma by default) - csv_skipspace: if true, leading whitespace will be ignored in individual CSV values sincorrect typesOnly one value is allowedtcli_nametcli_short_nametlabeltdocR6R7t primary_keyt normalizert default_fromtautofilltqueryt attributetincludetexcludetflagsthintt alwaysaskt sortorderitcsvt csv_separatort,t csv_skipspacet option_groupc Osv||_t||_t|to t|_n t|_t|\}}d|jo|d|ds cssx|]}|dVqWdS(iN((R%R[((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys s s%s: takes no such kwargs: %ss, cssx|]}t|VqWdS(N(R$(R%R&((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys s RERGRHRKs'kwarg %r conflicts with attribute on %ss_rule_%ss$%s: cannot have both %s=%r and %s=%rRORPs&%s: cannot have csv without multivalues"%s: rules must be callable; got %ris5%s: cli_short_name can only be a single character: %s((2t param_specR;t _Param__kwt isinstancetPasswordR=tpasswordR<R@RtnameR)R'tniceR-tkwargsR(R.Rtsett issupersetRR*tsortedRRRt_Param__clonekwt frozensettlistRR RthasattrRtsetattrtappendtgetattrRERORPRUR7t class_rulestrulesRMt all_rulesRFRR(R RaRoR/t kw_from_spectextratdfRnR"tkindRZtvaluet rule_nametrule((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#s     &# *    $$#$        &cCs#d|iidi|ifS(sQ Return an expresion that could construct this `Param` instance. s%s(%s)s, (R)R'R*t_Param__repr_iter(R ((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR, s ccst|iVx|iD]}|iVqWxit|iD]X}|i|}t|ot|do |i}n t|}d||fVq:WdS(NR's%s=%s(R$R\RoR'RfR]RRj(R RwR"Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt __repr_iters     cKs|tjo|i|}n|i|i|}t|do)|i||iid|i|jn|i|d|i|j|S(s$ One stop shopping. tenvtsupplied( R t get_defaulttconvertt normalizeRjtvalidateRztcontextRa(R RuR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR2"s )cCs!|i}|p |i}n|S(s Return the right name of an attribute depending on usage. Normally errors should use cli_name, our "friendly" name. When using the API directly or *attr return the real name. (RERa(R Ra((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pytget_param_name0s  ccs`xYt|iD]H}|i|}t|ot|do |i}n||fVqWdS(sW Iterate through ``(key,value)`` for all kwargs passed to constructor. R'N(RfR]RRjR'(R R"Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR/<s   cCsF|idj o|i|ijS|idj o|i|ijStS(s Return ``True`` if this parameter should be used in ``env.context``. If a parameter is created with niether the ``include`` nor the ``exclude`` kwarg, this method will always return ``True``. For example: >>> from ipalib.config import Env >>> param = Param('my_param') >>> param.use_in_context(Env(context='foo')) True >>> param.use_in_context(Env(context='bar')) True If a parameter is created with an ``include`` kwarg, this method will only return ``True`` if ``env.context`` is in ``include``. For example: >>> param = Param('my_param', include=['foo', 'whatever']) >>> param.include frozenset(['foo', 'whatever']) >>> param.use_in_context(Env(context='foo')) True >>> param.use_in_context(Env(context='bar')) False If a paremeter is created with an ``exclude`` kwarg, this method will only return ``True`` if ``env.context`` is not in ``exclude``. For example: >>> param = Param('my_param', exclude=['foo', 'whatever']) >>> param.exclude frozenset(['foo', 'whatever']) >>> param.use_in_context(Env(context='foo')) False >>> param.use_in_context(Env(context='bar')) True Note that the ``include`` and ``exclude`` kwargs are mutually exclusive and that at most one can be suppelied to `Param.__init__()`. For example: >>> param = Param('nope', include=['foo'], exclude=['bar']) Traceback (most recent call last): ... ValueError: Param('nope'): cannot have both include=frozenset(['foo']) and exclude=frozenset(['bar']) So that subclasses can add additional logic based on other environment variables, the entire `config.Env` instance is passed in rather than just the value of ``env.context``. N(ROR.RRPR=(R Rz((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pytuse_in_contextFs 3cCs |io|dj odS|S(sk Return a value safe for logging. This is used so that passwords don't get logged. If this is a `Password` instance and ``value`` is not ``None``, a constant ``u'********'`` is returned. For example: >>> p = Password('my_password') >>> p.safe_value(u'This is my password') u'********' >>> p.safe_value(None) is None True If this is not a `Password` instance, ``value`` is returned unchanged. For example: >>> s = Str('my_str') >>> s.safe_value(u'Some arbitrary value') u'Some arbitrary value' u********N(R`R.(R Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt safe_valuescKs|i|i|S(sD Return a new `Param` instance similar to this one. (t clone_renameRa(R t overrides((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pytclonescKs|i||i|S(sZ Return a new `Param` instance similar to this one, but named differently (t clone_retypeR)(R RaR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRscKs/t|i}|i||||i|S(s\ Return a new `Param` instance similar to this one, but of a different type (R;RgtupdateRo(R RatklassRR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs ccs#x|D]}|idVqWdS(Nsutf-8(tencode(R tunicode_csv_datatline((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt__utf_8_encodersc kswti|i|d|d|iddd|i|}x7|D]/}g}|D]}|t|dqQ~Vq@WdS(Ntdialectt delimitert quotechart"tskipinitialspacesutf-8(RUtreadert_Param__utf_8_encoderRVRXtunicode(R RRRct csv_readertrowt_[1]tcell((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt__unicode_csv_readers cCs|iot|ttfjo |f}ng}xh|D]`}t|to=t|i}x5|i|D]}|i |quWq=|i |q=Wt|S|SdS(sSplit CSV strings into individual values. For CSV params, ``value`` is a tuple of strings. Each of these is split on commas, and the results are concatenated into one tuple. For example:: >>> param = Param('telephones', multivalue=True, csv=True) >>> param.split_csv((u'1, 2', u'3', u'4, 5, 6')) (u'1', u'2', u'3', u'4', u'5', u'6') If ``value`` is not a tuple (or list), it is only split:: >>> param = Param('telephones', multivalue=True, csv=True) >>> param.split_csv(u'1, 2, 3') (u'1', u'2', u'3') For non-CSV params, return the value unchanged. N( RURR(RiR^t basestringRt splitlinest_Param__unicode_csv_readertextendRl(R RutnewvaltvtlinesR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt split_csvs   csjio*t|ttfjo |f}q4niotfd|DSi|SdS(s Normalize ``value`` using normalizer callback. For example: >>> param = Param('telephone', ... normalizer=lambda value: value.replace('.', '-') ... ) >>> param.normalize(u'800.123.4567') u'800-123-4567' If this `Param` instance was created with a normalizer callback and ``value`` is a unicode instance, the normalizer callback is called and *its* return value is returned. On the other hand, if this `Param` instance was *not* created with a normalizer callback, if ``value`` is *not* a unicode instance, or if an exception is caught when calling the normalizer callback, ``value`` is returned unchanged. :param value: A proposed value for this parameter. c3s"x|]}i|VqWdS(N(t_normalize_scalar(R%R(R (s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys s N(R7RR(RiR(R Ru((R s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR~s  cCsA|idjo|Sy|i|SWntj o|SXdS(so Normalize a scalar value. This method is called once for each value in a multivalue. N(RJR.R0(R Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs cs|tjodSioqt|ttfjo |f}ntfdtdt|D}t|djodS|Si|S(s Convert ``value`` to the Python type required by this parameter. For example: >>> scalar = Str('my_scalar') >>> scalar.type >>> scalar.convert(43.2) u'43.2' (Note that `Str` is a subclass of `Param`.) All values in `constants.NULLS` will be converted to ``None``. For example: >>> scalar.convert(u'') is None # An empty string True >>> scalar.convert([]) is None # An empty list True Likewise, values in `constants.NULLS` will be filtered out of a multivalue parameter. For example: >>> multi = Str('my_multi', multivalue=True) >>> multi.convert([1.5, '', 17, None, u'Hello']) (u'1.5', u'17', u'Hello') >>> multi.convert([None, u'']) is None # Filters to an empty list True Lastly, multivalue parameters will always return a ``tuple`` (assuming they don't return ``None`` as in the last example above). For example: >>> multi.convert(42) # Called with a scalar value (u'42',) >>> multi.convert([0, 1]) # Called with a list value (u'0', u'1') Note that how values are converted (and from what types they will be converted) completely depends upon how a subclass implements its `Param._convert_scalar()` method. For example, see `Str._convert_scalar()`. :param value: A proposed value for this parameter. Nc3s+x$|]\}}i||VqWdS(N(t_convert_scalar(R%tiR(R (s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys Bs cSs|dtjS(i(R (tiv((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pytCsi( R R7RR(Ritfiltert enumerateRR(R Rutvalues((R s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR}s.   cCsFt||ijo|Std|id|dt|idS(s0 Convert a single scalar value. RatindexterrorN(RRRatugettextt type_error(R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRKscCs|djo_|ip|oId|ijo9|djotd|iqgtd|indS|iot|tj o&t t dt|t|fnt |djot dnx;t |D]\}}|i||qWn|i|dS(s Check validity of ``value``. :param value: A proposed value for this parameter. :param context: The context we are running in. :param supplied: True if this parameter was supplied explicitly. tnonemptytcliRaNRuis,value: empty tuple must be converted to None(R.R6RQRRERaR7RR(RR RRRt_validate_scalar(R RuRR{RR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRUs  !  # c Cst||ij o2td|idd|i|t|fn|dj o9t|tj o&ttdt|t|fnx^|iD]S}|t|}|dj o1td|i d|d|d|d|qqWdS(NRaRsneed a %r; got %r (a %r)RRuRw( RR RaR.tintRR RpRR(R RuRRwR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRps"  #   cKsk|idj oT|i|}|dj o4y|i|i|SWq`tj oq`Xqdn|iS(s/ Return the static default or construct and return a dynamic default. (In these examples, we will use the `Str` and `Bytes` classes, which both subclass from `Param`.) The *default* static default is ``None``. For example: >>> s = Str('my_str') >>> s.default is None True >>> s.get_default() is None True However, you can provide your own static default via the ``default`` keyword argument when you create your `Param` instance. For example: >>> s = Str('my_str', default=u'My Static Default') >>> s.default u'My Static Default' >>> s.get_default() u'My Static Default' If you need to generate a dynamic default from other supplied parameter values, provide a callback via the ``default_from`` keyword argument. This callback will be automatically wrapped in a `DefaultFrom` instance if it isn't one already (see the `DefaultFrom` class for all the gory details). For example: >>> login = Str('login', default=u'my-static-login-default', ... default_from=lambda first, last: (first[0] + last).lower(), ... ) >>> isinstance(login.default_from, DefaultFrom) True >>> login.default_from.keys ('first', 'last') Then when all the keys needed by the `DefaultFrom` instance are present, the dynamic default is constructed and returned. For example: >>> kw = dict(last=u'Doe', first=u'John') >>> login.get_default(**kw) u'jdoe' Or if any keys are missing, your *static* default is returned. For example: >>> kw = dict(first=u'John', department=u'Engineering') >>> login.get_default(**kw) u'my-static-login-default' N(RKR.R}R~R0RZ(R R/RZ((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR|s4  t falsehoodsttruthstversioncCsh}x|iD]\}}}||ijoqn|ttfjoqqtt||to5g}t||gD] }||q~||tBoolc Bs{eZdZeZedZeide e dde ddgfde e dd e d d gffZd d Z RS(sG A parameter for boolean values (stored in the ``bool`` type). smust be True or FalseRiu1utrueuTRUERiu0ufalseuFALSEcCst||ijo|St|to|i}n||ijotS||ijotSt|tt fjo+t d|i d|dt |i nt d|i d|dt |idS(s0 Convert a single scalar value. RaRRN(RR^RtlowerRR=RR<R(RiRRaRRR(R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRsN(R'R3R4RRRRRDRcRhR=R<R.R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs !(tFlagcBseZdZdZRS(sR A boolean parameter that always gets filled in with a default value. This `Bool` subclass forces ``autofill=True`` in `Flag.__init__()`. If no default is provided, it also fills in a default value of ``False``. Lastly, unlike the `Bool` class, the default must be either ``True`` or ``False`` and cannot be ``None``. For example: >>> flag = Flag('my_flag') >>> (flag.autofill, flag.default) (True, False) To have a default value of ``True``, create your `Flag` intance with ``default=True``. For example: >>> flag = Flag('my_flag', default=True) >>> (flag.autofill, flag.default) (True, True) Also note that creating a `Flag` instance with ``autofill=False`` will have no effect. For example: >>> flag = Flag('my_flag', autofill=False) >>> flag.autofill True cOst|d maxvalue (minvalue=%r, maxvalue=%r)(RRR#RRR.RRb(R RaRoR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#Qs 3cCs t|ttfjo|St|tjoo|iddjo.ytt|SWqtj oqXqyt|dSWqtj oqXnt|tjo(yt|SWqtj oqXntd|id|dt |i dS(s0 Convert a single scalar value. u.iRaRRN( RRRRtfindRRRRRR(R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR[s&   cCs/||ijo|dtd|iSdS(s' Check min constraint. smust be at least %(minvalue)dRN(RR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_rule_minvaluexscCs/||ijo|dtd|iSdS(s' Check max constraint. scan be at most %(maxvalue)dRN(RR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_rule_maxvaluesc Cst|ttfjo2td|idd|i|t|fn|dj o9t|tj o&ttdt|t|fnx^|iD]S}|t |}|dj o1td|i d|d|d|d|qqWdS(s This duplicates _validate_scalar in the Param class with the exception that it allows both int and long types. The min/max rules handle size enforcement. RaRsneed a %r; got %r (a %r)RRuRwN( RRRR RaR.RR RpRR(R RuRRwR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs"  #   N(R'R3R4RRRRRDRcRRRR#R.RRRR(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRDs   tDecimalc BseZdZeiZedZei deidfdeidfde dfde e fdedffZ d Zd Zd Zd ZdZdZdZddZdZRS(sj A parameter for floating-point values (stored in the ``Decimal`` type). Python Decimal type helps overcome problems tied to plain "float" type, e.g. problem with representation or value comparison. In order to safely transfer the value over RPC libraries, it is being converted to string which is then converted back to Decimal number. smust be a decimal numberRRt precisiont exponentialt numberclasss-Normals+Zeros+NormalcOsRxdD]}|i|}|djoqnt|ttfoXyti|}Wn4tj o(}td||t |fnX||| maxvalue (minvalue=%s, maxvalue=%s)is %s: precision must be at least 0(sminvaluesmaxvaluesdefault(R-R.R^RRtdecimalRt ExceptionRRRR#RRRbR(R RaRoR/tkwparamRute((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#s,   cCs/||ijo|dtd|iSdS(s' Check min constraint. smust be at least %(minvalue)sRN(RR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRscCs/||ijo|dtd|iSdS(s' Check max constraint. scan be at most %(maxvalue)sRN(RR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRsc Csd|i}||ijoDtd|idtdtd|ddi|indS(NRaRsWnumber class '%(cls)s' is not included in a list of allowed number classes: %(allowed)stclstallowedu, (t number_classRR RRR;R*(R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_enforce_numberclasss    cCs~|idj ojtid|i }y|i|}Wqztij o*}td|idt|qzXn|S(Ni RaR( RR.RRtquantizetDecimalExceptionRRR(R Rut quantize_expR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_enforce_precisionscCs|ip|y<||ijo|itidn |i}Wqtij o*}td|idt |qXn|S(NiRaR( Rt to_integralRRRR~RRRR(R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_remove_exponents ,cCs/|i||i|}|i|}|S(s This method is run in conversion and normalization methods to test that the Decimal number conforms to Parameter boundaries and then normalizes the value. (RRR(R Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_test_and_normalizes cCst|ttfoYyti|}Wqotij o0}td|id|dt|qoXnt|tio|i |St t|i ||S(NRaRR( R^RRRRRRRRRRR(R RuRR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRscCs7t|tio|i|Stt|i|S(N(R^RRRRR(R Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR,sN(s-Normals+Zeros+Normal(R'R3R4RRRRRRDRcR.RRR<R(R#RRRRRRRR(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs$       tDatacBs{eZdZeidedfdedfdedfdefdfdefdffZdZdZ dZ dZ RS( s+ Base class for the `Bytes` and `Str` parameters. Previously `Str` was as subclass of `Bytes`. Now the common functionality has been split into this base class so that ``isinstance(foo, Bytes)`` wont be ``True`` when ``foo`` is actually an `Str` instance (which is confusing). t minlengtht maxlengthtlengthtpatterntpattern_errmsgcOsptt|i||||idjp|idjo |idjptd|in|idj o0|idjo td|i|ifn|idj o0|idjo td|i|ifnd|i|ifjop|i|ijo&td|i|i|ifql|i|ijo td|i|ifqlndS(Ns1%s: cannot mix length with minlength or maxlengthis"%s: minlength must be >= 1; got %rs"%s: maxlength must be >= 1; got %rs6%s: minlength > maxlength (minlength=%r, maxlength=%r)s1%s: minlength == maxlength; use length=%d instead( RRR#RR.RRRRb(R RaRoR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#Fs(    cCs]|ii|djo@|io|itd|iS|dtd|iSndS(s2 Check pattern (regex) contraint. Rs must match pattern "%(pattern)s"N(tretmatchR.t re_errmsgR;R(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _rule_patterngs  N( R'R3R4RDRcRR.RRRR#R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR2s    !tBytescBsPeZdZeZedZdZdZdZ dZ ddZ RS(s( A parameter for binary data (stored in the ``str`` type). This class is named *Bytes* instead of *Str* so it's aligned with the Python v3 ``(str, unicode) => (bytes, str)`` clean-up. See: http://docs.python.org/3.0/whatsnew/3.0.html Also see the `Str` parameter. smust be binary datacOsq|idddjo d|_nti|d|_|idd|_tt|i|||dS(NRR(R-R.RtcompileRRRR#(R RaRoR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#s  cCs5t||ijo|dtd|iSdS(s- Check minlength constraint. s$must be at least %(minlength)d bytesRN(RRR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_rule_minlengthscCs5t||ijo|dtd|iSdS(s- Check maxlength constraint. s"can be at most %(maxlength)d bytesRN(RRR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_rule_maxlengthscCs5t||ijo|dtd|iSdS(s* Check length constraint. s must be exactly %(length)d bytesRN(RRR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _rule_lengthscCsmt|toDyti|}WqTtj o}tdt|qTXntt|i ||S(Ntreason( R^Rtbase64t b64decodeRR RRRR(R RuRR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs N( R'R3R4RRRRR#RRRR.R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRus    tStrcBsreZdZeideeffZeZe dZ dZ d dZ dZdZdZdZRS( s1 A parameter for Unicode text (stored in the ``unicode`` type). This class is named *Str* instead of *Unicode* so it's aligned with the Python v3 ``(str, unicode) => (bytes, str)`` clean-up. See: http://docs.python.org/3.0/whatsnew/3.0.html Also see the `Bytes` parameter. tnoextrawhitespacesmust be Unicode textcOsw|idddjo d|_nti|dti|_|idd|_tt|i|||dS(NRR( R-R.RRtUNICODERRRR#(R RaRoR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#s  cCst||ijo|St|ttttifjo|i|St|ttfjo+td|i d|dt |i ntd|i d|dt |i dS(s0 Convert a single scalar value. RaRRN( RRRRRRR(RiRRaRRR(R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs"cCsC|itjodSt|t|ijo |dSdS(s7 Do not allow leading/trailing spaces. Ns+Leading and trailing spaces are not allowed(RR<Rtstrip(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_rule_noextrawhitespacescCs5t||ijo|dtd|iSdS(s- Check minlength constraint. s)must be at least %(minlength)d charactersRN(RRR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRscCs5t||ijo|dtd|iSdS(s- Check maxlength constraint. s'can be at most %(maxlength)d charactersRN(RRR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRscCs5t||ijo|dtd|iSdS(s* Check length constraint. s%must be exactly %(length)d charactersRN(RRR;(R RRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRsN(R'R3R4RRcRR=RRRRR#R.RRRRR(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs     tIA5StrcBs#eZdZdZddZRS(s# An IA5String per RFC 4517 cOs tt|i|||dS(N(RRR#(R RaRoR/((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR# sc Cst|totxqtt|D]Y}t||djo<td|id|dtdtd||q#q#Wnt t |i ||S(NiRaRRs(The character '%(char)r' is not allowed.tchar( R^RtxrangeRtordRRRR;RRR(R RuRR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs #N(R'R3R4R#R.R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs R_cBs3eZdZeideeffZddZRS(sE A parameter for passwords (stored in the ``unicode`` type). tconfirmcCst|ttfoRt|djo?|\}}||jotd|id|n|}ntt|i||S(NiRaR( R^R(RiRR RaRR_R(R RuRtp1tp2((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#s )   N( R'R3R4RRcRR=R.R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR_stEnumcBs<eZdZeideeffZdZdZRS(s; Base class for parameters with enumerable values. RcOstt|i|||xot|iD]^\}}t||ij o<d|i|f}tt||i|t|fq,q,Wt |idjot d|indS(Ns %s values[%d]is$%s: list of values must not be empty( RRR#RRRRbRR RR(R RaRoR/RRtn((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR#5s *cKs||ijolt|idjo|dtd|idSdid|iD}|dtd|SndS( Nismust be '%(value)s'Ruiu, cssx|]}d|VqWdS(s'%s'N((R%Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pys Gs smust be one of %(values)sR(RRR;R*(R RRuR/R((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _rule_valuesBs (R'R3R4RDRcR(R#R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR,s  t BytesEnumcBseZdZeZRS(sB Enumerable for binary data (stored in the ``str`` type). (R'R3R4RR(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRJstStrEnumcBseZdZeZRS(sy Enumerable for Unicode text (stored in the ``unicode`` type). For example: >>> enum = StrEnum('my_enum', values=(u'One', u'Two', u'Three')) >>> enum.validate(u'Two', 'cli') is None True >>> enum.validate(u'Four', 'cli') Traceback (most recent call last): ... ValidationError: invalid 'my_enum': must be one of 'One', 'Two', 'Three' (R'R3R4RR(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRRs tAnycBs,eZdZeZddZddZRS(sS A parameter capable of holding values of any type. For internal use only. cCs|S(N((R RuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRksc Csbx[|iD]P}|t|}|dj o.td|id|d|d|d|q q WdS(NRaRuRRRw(RpRR.R Ra(R RuRRwR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRns   N(R'R3R4tobjectRR.RR(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRds tFilecBs3eZdZeideefdeeffZRS(sh File parameter type. Accepts file names and loads their content into the parameter value. tstdin_if_missingR(R'R3R4RRcRR<(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR{s t AccessTimecBseZdZdZdZdddZdZdZdZd Z d Z d Z d Z d Z dZdZdZRS(s Access time parameter type. Accepts values conforming to generalizedTime as defined in RFC 4517 section 3.3.13 without time zone information. cCst|djotdn|iptdnt|dd!}|djp |djotdnt|dd!}|djp |djotd ndS( Nis&HHMM must be exactly 4 characters longsHHMM non-numericiiisHH out of rangei;sMM out of range(RRt isnumericR(R R[thhtmm((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_HHMMs cCsh|io:t|}|djp |djotdqdn|d jotd ndS( Niisday of the week out of rangetMontTuetWedtThutFritSattSunsinvalid day of the week(R RRRRRR(R RR(R R[Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_dotws    iicCs?|iptdnt|}|djo.|djp |d jotd q;n|djo.|djp |djotd q;n|djo|d djoP|ddjp|ddjo.|djp |djotd q7q;|djp |djotd q;ndS(Nsday of the month non-numericiiiiii i isday of the month out of rangeiii i iiiidiii(iiiiii i (iii i (R RR(R R[t month_numtyearRu((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_dotms     3cCsW|iptdnt|}|djp |djotdndS(Nsweek of the month non-numericiisweek of the month out of range(R RR(R R[Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_wotms   cCsW|iptdnt|}|djp |djotdndS(Nsweek of the year non-numericii4sweek of the year out of range(R RR(R R[Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_wotys   cCsW|iptdnt|}|djp |djotdndS(Nsday of the year non-numericiimsday of the year out of range(R RR(R R[Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_dotys   cCsW|iptdnt|}|djp |djotdndS(Nsmonth number non-numericii smonth number out of range(R RR(R R[Ru((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_check_month_nums   cCs|id}x|D]}|ptdn|id}t|djotdnx|D]}||qlWt|djo5t|dt|djotdqqqWdS(NRWsinvalid time ranget-iii(tsplitRRR(R R[t check_funct intervalsRRR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_check_intervals!cCsF||djotdn|d7}|i|||i|S(Ntdaysinvalid week specifieri(RR R(R ttsR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_W_specs  cCs||djo5|i||d|i|i||d}nC||djo%|d7}|i|||in td|S(NtweekiiR!sinvalid month specifier(R RR#RR(R R"R((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_M_specs  cCs||djoK|d7}|i|||it||}|i||d}n||djo5|i||d|i|i||d}nC||djo%|d7}|i|||in td|S(NtmonthiR$iR!sinvalid year specifier(R RRR%RR#RR(R R"RR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt _check_Y_specs   c Cs/t|d jotdn|iptdn|i|dd!t|dd!}t|dd!}|i|dd !||t|djo|i|d d!n|id |d d!t|djoAt|dd!}|djp |d jotd q+ndS(Ni i isincomplete generalized timestime non-numericiiiis%s00i<sseconds out of range(i i i(RRR RRRR (R R[tyear_numRts((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_check_generalizeds cCs|i}|ddjot|djotdn|i|d|ddjotdn|i|d t|dt|d jotd qn|dd jod}|dd jo|i|d}nj|dd jo|i|d}nC|ddjo|i|d}n|ddjo d}n|djotd|dn|i ||d|i n tddS(NitabsoluteisDinvalid format, must be 'absolute generalizedTime ~ generalizedTime'iit~sinvalid time range separatorisinvalid time rangetperiodictyearlytmonthlytweeklytdailys0period must be yearly, monthy or daily, got '%s's!time neither absolute or periodic( RRRR*RR.R'R%R#R R (R ttimeR"R((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_checks0 !  cCsy|i|Wnjtj o+}td|id|idn5tj o(td|idtdnXdS(NRaRisincomplete time value(R3RR RR+t IndexErrorRR.(R RRuR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt_rule_required0s& (R'R3R4R RRRRRRR R#R%R'R*R3R5(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyRs          tDNParamcBseZeZddZRS(cCsnt||ijo|Syt|}Wn<tj o0}td|id|dt|nX|S(s0 Convert a single scalar value. RaRR(RRRRRR(R RuRtdnR((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR?sN(R'R3RRR.R(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyR6<stDeprecatedParamcBs3eZeideeffZdZdZRS(t deprecatecOsYd|jot|ddg|d>> s = create_param('hometown?') >>> s Str('hometown?') >>> (s.name, s.required, s.multivalue) ('hometown', False, False) On the other hand, if ``spec`` is already a `Param` instance, it is returned unchanged. For example: >>> b = Bytes('cert') >>> create_param(b) is b True As a plugin author, you will not call this function directly (which would be no more convenient than simply creating the `Str` instance). Instead, `frontend.Command` will call it for you when it evaluates the ``takes_args`` and ``takes_options`` attributes, and `frontend.Object` will call it for you when it evaluates the ``takes_params`` attribute. :param spec: A spec string or a `Param` instance. R5(R^RDRRRR R(R5((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pyt create_param^s !)(9R4RRRRUt xmlrpclibRRttypesRttextRRtplugableRRRterrorsRRR R R t constantsR R RRRtutilRt ipapython.dnRRR@RdRARDRRRRRRRRRR_RRRRRRR6R8R<(((s5/usr/lib/python2.6/site-packages/ipalib/parameters.pytdsP    x -  #*dC>S