Package: clevertext
CleverTextWork in progress... copied from CleverDict>CONTENTSOVERVIEWINSTALLATIONINPUT METHODSOUTPUT METHODSATTRIBUTE NAMES AND ALIASESDEEPER DIVE INTO ATTRIBUTE NAMESSETTING AN ATTRIBUTE WITHOUT CREATING A DICTIONARY ITEMTHE AUTO-SAVE FEATURECREATING YOUR OWN AUTO-SAVE FUNCTIONCONTRIBUTINGCREDITS1. OVERVIEWCleverTextis a convenience class that behaves almost exactly like regular Python string but also contain its own self-contained version history and record of actions.  It is mainly intented for recording and comparing different states of text (string, HTML, JSON, code etc) as various transformations (replacements, deletions, validation, parsing) are applied to it. Built inCleverTextmethods (e.g.diff()) are readily available for ETL style processing, and can be added easily and consistently, allowing you to segregate common text manipulation function from your main control code for example.2. INSTALLATIONVery lightweight install viapip. No dependencies.python -m pip install clevertext --upgradeThen from your Python shell just import the class...>>> from clevertext import CleverText3. INPUT METHODSYou can create aCleverTextinstance using keyword arguments:>>> x = CleverText("This is the my first draft")4. OUTPUT METHODS5. ATTRIBUTES6. BUILT-IN METHODS7. ADDING YOUR OWN METHODS8. ENABLING AUTO-SAVE9. CREATING YOUR OWN AUTO-SAVE/AUTO-DELETE FUNCTIONAs well as autosave/autodelete options baked in toCleverText, you can set pretty much any custom function to runautomaticallywhen aCleverTextvalue iscreated, changed, or deleted, for example to update a database, save to a file, or synchronise with cloud storage etc.  Less code for you, and less chance you'll forget to explicitly call that crucial update function...This can be enabled at aclasslevel, or by creating subclasses ofCleverTextwith different options, or anobject/instancelevel.  We strongly recommend theobject/instanceapproach wherever possible, but you have the choice.Autosaving a particular object/instance:You can either overwrite the.save()/.delete()methods when you create your object, or use.set_autosave()/.set_autodelete()after the event:Autosaving at a class level:Simple to do, but beware this could change all existingCleverTextinstances as well as all future ones:>>> CleverText.save = your_save_function
>>> CleverText.delete = your_delete_functionCreating Subclasses:If you create a subclass ofCleverTextremember to callsuper().__init__()beforetrying to set any further class or object attributes, otherwise you'll run into trouble:class AutoStore(CleverText):
    def __init__(self, *args, **kwargs):
        self.setattr_direct('index', [])
        super().__init__(*args, **kwargs)

    def save(self, name, value):
        """ Keep a separate 'store' for data in .index """
        self.index.append((name, value))

class AutoConfirm(CleverText): pass
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def save(self, name, value):
        """ Print confirmation of the latest change """
        print(f"{name.title()}: {value.upper()}")CONTRIBUTING METHODS AS PULL REQUESTS10. CONTRIBUTING TO THE CORE DESIGNWe'd love to see Pull Requests (and relevant tests) from other contributors, particularly if you can help:EvolveCleverTextto make it play nicely with other classes and formats.For example:datetime.Put the finishing touches on thedocstringsto enable autocompletion in modern IDEs (this is neither the author's strong suit nor his passion!).Improve the structure and coverage oftest_clevertext.py.For a list of all outstandingFeature Requestsand (heaven forbid!) actualIssuesplease have a look here and maybe you can help out?https://github.com/PFython/clevertext/issues?q=is%3Aopen+is%3Aissue11. CREDITSCleverTextwas conceived by Peter Fison and co-developed with the expert assistance of Ruud van der Ham from the friendly and excellent Pythonista Cafe forum (www.pythonistacafe.com).It follows on from the success ofCleverDictwhich is similar in concept and well worth checking out if you haven't already.If you findclevertexthelpful, please feel free to: