Autres langues

Code source de plmapp.lifecycle

############################################################################
# openPLM - open source PLM
# Copyright 2010 Philippe Joulaud, Pierre Cosquer
# 
# This file is part of openPLM.
#
#    openPLM 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.
#
#    openPLM 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 openPLM.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact :
#    Philippe Joulaud : ninoo.fr@gmail.com
#    Pierre Cosquer : pcosquer@linobject.com
################################################################################

"""
This module contains a class that can be used to simplify the usage of
:class:`.Lifecycle` and :class:`.LifecycleStates`.

.. seealso::

    :meth:`.Lifecycle.to_states_list`
        Method to convert a :class:`.Lifecycle` into a :class:`LifecycleList`

    :meth:`.Lifecycle.from_lifecyclelist`.
        Method to convert a :class:`LifecycleList` into a :class:`.Lifecycle` 

Example::

    _lifecycles_list = [
        ("draft", "official", "deprecated"),
        ("draft", "official"),
    ]

    lifecycles = dict()
    for cycles in _lifecycles_list:
        name = "->".join(cycles) 
        lifecycles[name] = LifecycleList(name, "official", *cycles)
"""


[docs]class LifecycleList(list): u""" Object which represents a lifecycle as a list of string. This class inherits from list, so you can use all list methods. For example:: >>> cycle = LifecycleList("MyCycle", "b") >>> cycle.extend(["a", "b", "c"]) >>> cycle[0] 'a' .. attribute:: name name of the lifecycle .. attribute:: official_state name of the official state (must be in the list of states) """ def __init__(self, name, official_state, *args): super(LifecycleList, self).__init__(self) self.name = name self.official_state = official_state self.extend(args)
[docs] def next_state(self, state): u""" Returns the next state of *state* Raises :exc:`ValueError` if *state* is not in the list and :exc:`IndexError` if *state* is the last state. Example:: >>> cycle = LifecycleList("MyCycle", "b", "a", "b", "c", "d") >>> cycle.next_state("b") 'c' >>> cycle.next_state("d") Traceback (most recent call last): ... IndexError: list index out of range >>> cycle.next_state("z") Traceback (most recent call last): ... ValueError: list.index(x): x not in list """ index = self.index(state) return self[index + 1]
[docs] def previous_state(self, state): u""" Returns the previous state of *state* Raises :exc:`ValueError` if *state* is not in the list and :exc:`IndexError` if *state* is the first state. Example:: >>> cycle = LifecycleList("MyCycle", "b", "a", "b", "c", "d") >>> cycle.previous_state("b") 'a' >>> cycle.previous_state("a") Traceback (most recent call last): ... IndexError >>> cycle.previous_state("z") Traceback (most recent call last): ... ValueError: list.index(x): x not in list """ index = self.index(state) if index - 1 < 0: raise IndexError() return self[index - 1]
if __name__ == "__main__": import doctest doctest.testmod()