diff options
author | ptmcg <ptmcg@austin.rr.com> | 2018-12-31 13:10:59 -0600 |
---|---|---|
committer | ptmcg <ptmcg@austin.rr.com> | 2018-12-31 13:10:59 -0600 |
commit | e177e2feed1bfbe29f32c3378978313d19ce1c26 (patch) | |
tree | 45eed16a9965597827d8dc2031b1012d222fc842 /examples/statemachine/documentSignoffDemo.py | |
parent | 5132a91c470a8b6c34c7f0525c0bf41b9365e817 (diff) | |
download | pyparsing-git-e177e2feed1bfbe29f32c3378978313d19ce1c26.tar.gz |
Add document signoff and library book state examples;
Diffstat (limited to 'examples/statemachine/documentSignoffDemo.py')
-rw-r--r-- | examples/statemachine/documentSignoffDemo.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/examples/statemachine/documentSignoffDemo.py b/examples/statemachine/documentSignoffDemo.py new file mode 100644 index 0000000..9378507 --- /dev/null +++ b/examples/statemachine/documentSignoffDemo.py @@ -0,0 +1,68 @@ +# +# documentSignoffDemo.py +# +# Example of a state machine modeling the state of a document in a document +# control system, using named state transitions +# +import statemachine +import documentsignoffstate + + +class Document: + def __init__(self): + # start light in Red state + self._state = documentsignoffstate.New() + + @property + def state(self): + return self._state + + # get behavior/properties from current state + def __getattr__(self, attrname): + attr = getattr(self._state, attrname) + if isinstance(getattr(documentsignoffstate, attrname, None), + documentsignoffstate.DocumentRevisionStateTransition): + return lambda : setattr(self, '_state', attr()) + return attr + + def __str__(self): + return "{}: {}".format(self.__class__.__name__, self._state) + + +def run_demo(): + import random + + doc = Document() + print(doc) + + # begin editing document + doc.create() + print(doc) + print(doc.state.description) + + while not isinstance(doc._state, documentsignoffstate.Approved): + + print('...submit') + doc.submit() + print(doc) + print(doc.state.description) + + if random.randint(1,10) > 3: + print('...reject') + doc.reject() + else: + print('...approve') + doc.approve() + + print(doc) + print(doc.state.description) + + doc.activate() + print(doc) + print(doc.state.description) + +if __name__ == '__main__': + run_demo() + +# TODO - can you pickle state or otherwise persist it? +# TODO - can you decorate state changes (for logging or permission checking)? |