Source code for cpe.comp.cpecomp2_3_wfn

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
This file is part of cpe package.

This module allows to store the value of the components of a CPE name
of version 2.3 of CPE (Common Platform Enumeration) specification with
Well-Formed Name (WFN) style.

Copyright (C) 2013  Alejandro Galindo García, Roberto Abdelkader Martínez Pérez

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program 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 Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.

For any problems using the cpe package, or general questions and
feedback about it, please contact:

- Alejandro Galindo García: galindo.garcia.alejandro@gmail.com
- Roberto Abdelkader Martínez Pérez: robertomartinezp@gmail.com
"""

from cpecomp2_3 import CPEComponent2_3

import re


[docs]class CPEComponent2_3_WFN(CPEComponent2_3): """ Represents a component of version 2.3 of CPE specification with WFN style. """ ############### # CONSTANTS # ############### # Patterns used to check the value of component _ESCAPE = r"\\" _PUNC_NO_DASH = "\!|\"|\;|\#|\$|\%|\&|\'|\(|\)|\+|\,|\.|\/|\:|\<|\=|\>|\@|\[|\]|\^|\`|\{|\||\}|\~" #: Separator of components of CPE name with URI style SEPARATOR_COMP = ", " #: Separator of attribute and value in pairs of component SEPARATOR_PAIR = "=" #: Separator of language parts: language and region SEPARATOR_LANG = r"\-" # Logical values in string format #: Logical value associated with a any value logical value VALUE_ANY = "ANY" #: Logical value associated with a not applicable logical value VALUE_NA = "NA" #: Constant associated with wildcard to indicate a sequence of characters WILDCARD_MULTI = "*" #: Constant associated with wildcard to indicate a character WILDCARD_ONE = "?" ############### # VARIABLES # ############### _spec1 = "\{0}".format(WILDCARD_ONE) _spec2 = "\{0}".format(WILDCARD_MULTI) _spec_chrs = "{0}+|{1}".format(_spec1, _spec2) _special = "{0}|{1}".format(_spec1, _spec2) _punc_w_dash = "{0}|-".format(_PUNC_NO_DASH) _quoted1 = "{0}({1}|{2}|{3})".format(_ESCAPE, _ESCAPE, _special, _PUNC_NO_DASH) _quoted2 = "{0}({1}|{2}|{3})".format(_ESCAPE, _ESCAPE, _special, _punc_w_dash) _body1 = "\w|{0}".format(_quoted1) _body2 = "\w|{0}".format(_quoted2) _body = "(({0})({1})*)|{2}({3})+".format(_body1, _body2, _body2, _body2) _avstring_pattern = "^((({0})|(({1})({2})*))({3})?)$".format(_body, _spec_chrs, _body2, _spec_chrs) _value_rxc = re.compile(_avstring_pattern) #################### # OBJECT METHODS # #################### def _decode(self): """ Convert the encoded value of component to standard value (WFN value) is not necessary in this case because the internal value is in WFN already. """ pass def _is_valid_value(self): """ Return True if the value of component in generic attribute is valid, and otherwise False. :returns: True if value is valid, False otherwise :rtype: boolean """ comp_str = self._standard_value return CPEComponent2_3_WFN._value_rxc.match(comp_str) is not None
[docs] def get_value(self): """ Returns the encoded value of component. :returns: encoded value of component :rtype: string """ # Add double quotes return '"{0}"'.format(super(CPEComponent2_3_WFN, self).get_value())
[docs] def set_value(self, comp_str, comp_att): """ Set the value of component. :param string comp_str: value of component :param string comp_att: attribute associated with comp_str :returns: None :exception: ValueError - incorrect value of component """ # Del double quotes of value str = comp_str[1:-1] self._standard_value = str # Parse the value super(CPEComponent2_3_WFN, self).set_value(str, comp_att)
if __name__ == "__main__": import doctest doctest.testmod() doctest.testfile("../tests/testfile_cpecomp2_3_wfn.txt")