{ "info": { "author": "Christophe BAL", "author_email": "projetmbc@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU General Public License (GPL)", "Operating System :: MacOS", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3", "Topic :: Desktop Environment :: File Managers", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Logging", "Topic :: Text Processing :: Markup :: LaTeX", "Topic :: Utilities" ], "description": "About this package\n==================\n\n**misTool** is the contraction of **missing**, **miscellaneous** and **tool(s)**.\nThis package contains some modules that could be useful for Python\ndevelopments.\n\n***If you want more informations and examples than thereafter, just take\na look at the docstrings.***\n\n\nI beg your pardon for my english...\n===================================\n\nEnglish is not my native language, so be nice if you notice misunderstandings, misspellings or grammatical errors in my documents and codes.\n\n\nWhat's new in this version `1.2.2-beta` ?\n=========================================\n\n\u00a8html and \u00a8latex basic frames have been added to be used with `term_use.withframe`.\n\n\n\nWhat's new in this version `1.2.1-beta` ?\n=========================================\n\nThe function ``between`` in ``string_use`` has a new optional argument ``keepseps`` so as to keep or not the separators.\n\n\nWhat's new in this version `1.2.0-beta` ?\n=========================================\n\nThe module ``date_use`` has been changed to ``datetime_use`` : see the presentation above to know how to work now with dates inside **misTool**.\n\n\nWhat's new in this version `1.1.1-beta` ?\n=========================================\n\nIn the module ``python_use``, the new class ``MKOrderedDict`` allows to define kinds of ordered dictionaries accepting several times the same key but at different \"places\".\n\n**Warning !** Here are some important changes.\n\n1. In the module ``python_use``, the class ``OrderedRecuDict`` becomes ``RecuOrderedDict``.\n\n1. In the module ``string_use``, the function ``ascii_it`` becomes ``asciify``.\n\n\nThe module ``os_use``\n=====================\n\nChanging the working directory for commands\n-------------------------------------------\n\nWith ``os_use.cd``, you have a context which changes temporarily the directory where launching terminal like commands. When the context is closed, the working directory goes back to the one just before the call of ``os_use.cd``.\n\nLet's see an example. We suppose that we have the following directory with the absolute path ``/Users/projetmbc/basic_dir`` in a Unix system.\n\n```\n+ basic_dir\n * latex_1.tex\n * latex_2.tex\n * python_1.py\n * python_2.py\n * python_3.py\n * python_4.py\n * text_1.txt\n * text_2.txt\n * text_3.txt\n + empty_dir\n + sub_dir\n * code_A.py\n * code_B.py\n * slide_A.pdf\n * slide_B.pdf\n + sub_sub_dir\n * doc.pdf\n```\n\n\nThe following code first goes inside ``/Users/projetmbc/basic_dir`` and then it moves to ``/Users/projetmbc/basic_dir/sub_dir``. With ``subprocess.call(\"ls\")``, we simply use the Unix command ``ls`` so as to list files and folders inside the current working directory.\n\n```python\n>>> import subprocess\n>>> from mistool.os_use import cd\n>>> with cd(\"/Users/projetmbc/basic_dir\"):\n... subprocess.call(\"ls\")\nempty_dir\tpython_1.py\tpython_4.py\ttext_2.txt\nlatex_1.tex\tpython_2.py\tsub_dir\t\ttext_3.txt\nlatex_2.tex\tpython_3.py\ttext_1.txt\n>>> with cd(\"/Users/projetmbc/basic_dir/sub_dir\"):\n... subprocess.call(\"ls\")\ncode_A.py\tslide_A.pdf\tsub_sub_dir\ncode_B.py\tslide_B.pdf\n```\n\n\nLaunching commands like in a terminal\n-------------------------------------\n\nThe aim of the function ``os_use.runthis`` is to simplify a lot the launching of subprocesses *(just use commands as you were inside your terminal)*. Let's consider the basic following Python script with absolute path ``/Users/projetmbc/script.py``.\n\n```python\nprint(\"Everything is ok.\")\n```\n\nTo launch this program, we just have to use the single string Unix command ``python3 /Users/projetmbc/script.py`` like in the following lines. You can see that by default nothing is printed, so you have to use ``showoutput = True`` if\nyou want to see what the script launched prints.\n\n```python\n>>> from mistool.os_use import PPath, runthis\n>>> pyfile = PPath(\"/Users/projetmbc/script.py\")\n>>> runthis(cmd = \"python3 {0}\".format(ppath))\n>>> runthis(cmd = \"python3 {0}\".format(ppath), showoutput = True)\nEverything is ok.\n```\n\n\nSystem used and environment's path\n----------------------------------\n\nThe call to ``os_use.system()`` returns the name, in lower case, of the OS used : possible strings returned can be for example ``\"windows\"``, ``\"mac\"``, ``\"linux\"`` and also ``\"java\"``.\n\n\n``os_use.pathenv()`` gives you the paths of executables known by your OS *(this is indeed an alias for ``os.getenv('PATH')``)*.\n\n\nEnhanced version of the class ``pathlib.Path``\n----------------------------------------------\n\nThe class ``os_use.PPath`` adds several methods to the useful class ``pathlib.Path``. Here are examples.\n\n\n### Informations about one path\n\nThe following code shows additional informations given by the class ``os_use.PPath``.\n\n```python\n>>> from mistool.os_use import PPath\n>>> path = PPath(\"dir/subdir/file.txt\")\n>>> path.parent\nPPath('dir/subdir')\n>>> print(path.depth)\n2\n>>> print(path.ext)\n'txt'\n```\n\n\nAnother useful method named ``is_protected`` works as explained below.\n\n1. If the path does not point to an existing file or folder, an OS error is raised.\n\n1. If the path is the one of a folder, the answer returned is ``True`` for a modifiable directory and ``False`` otherwise.\n\n1. Finally if the path points to a file, then that is its parent folder which is tested.\n\n\nThere is also the method ``is_empty`` which can give three different responses.\n\n1. If the path is the one of an empty directory, ``False`` is\nreturned.\n\n1. ``True`` is returned when the path corresponds to an non-empty folder.\n\n1. If the path doesn't point to an existing directory an OS error is raised.\n\n\n### Changing one path\n\nChanging or adding an extension is very easy with the method ``with_ext``.\n\n```python\n>>> from mistool.os_use import PPath\n>>> path_no_ext = PPath(\"dir/subdir\")\n>>> path_no_ext.with_ext(\"ext\")\nPPath('dir/subdir.ext')\n>>> path_ext = PPath(\"dir/subdir/file.txt\")\n>>> path_ext.with_ext(\"ext\")\nPPath('dir/subdir/file.ext')\n```\n\n\nObtaining a short version or a normalized one of a path needs no effort. Here is how to do that *(``~`` is a shortcut for the main OS user's folder)*.\n\n```python\n>>> from mistool.os_use import PPath\n>>> path_too_long = PPath(\"~/dir_1/dir_2/dir_3/../../file.txt\")\n>>> path_too_long.normpath\nPPath('/Users/projetmbc/dir_1/file.txt')\n>>> path_long = PPath(\"/Users/projetmbc/dir_1/dir_2/dir_3/../../file.txt\")\n>>> path_long.shortpath\nPPath('~/dir_1/file.txt')\n```\n\n\n### Comparing paths\n\nThe \"common\" folder of several paths is obtained by using the method ``common_with`` or equivalently the magic operator ``&``.\n\n```python\n>>> from mistool.os_use import PPath\n>>> path = PPath(\"/Users/projetmbc/source/doc\")\n>>> path_1 = PPath(\"/Users/projetmbc/README\")\n>>> path_2 = PPath(\"/Users/projetmbc/source/misTool/os_use.py\")\n>>> path_danger = PPath(\"/NoUser/projects\")\n>>> path.common_with(path_1) # Same as ``path & path_1``\nPPath('/Users/projetmbc')\n>>> path.common_with(path_2) # Same as ``path & path_2``\nPPath('/Users/projetmbc/source')\n>>> path.common_with(path_danger) # No error raised !\nPPath('/')\n>>> path.common_with(path_1, path_2) # Same as ``path & path_1 & path_2``\nPPath('/Users/projetmbc')\n>>> path.common_with([path_1, path_2]) # Same as ``path & [path_1, path_2]``\nPPath('/Users/projetmbc')\n```\n\n\nThe class ``os_use.PPath`` adds a magic method so as to use ``path - anotherpath`` instead of ``path.relative_to(anotherpath)`` where the method ``relative_to`` is implemented by the class ``pathlib.Path``.\n\n```python\n>>> from mistool.os_use import PPath\n>>> main = PPath(\"/Users/projetmbc\")\n>>> path_1 = PPath(\"/Users/projetmbc/README\")\n>>> path_2 = PPath(\"/Users/projetmbc/source/misTool/os_use.py\")\n>>> path_1 - main\nPPath('README')\n>>> path_2 - main\nPPath('source/misTool/os_use.py')\n>>> path_2 - path_1\nTraceback (most recent call last):\n[...]\nValueError: '/Users/projetmbc/source/misTool/os_use.py' does not start with '/Users/projetmbc/README'\n```\n\n\nIf you need to know the depth of one path relatively to another, just call the method ``depth_in``.\n\n```python\n>>> from mistool.os_use import PPath\n>>> main = PPath(\"/Users/projetmbc\")\n>>> path_1 = PPath(\"/Users/projetmbc/README\")\n>>> path_2 = PPath(\"/Users/projetmbc/source/misTool/os_use.py\")\n>>> path_pb = PPath(\"/NoUser/projects\")\n>>> print(path_1.depth_in(main))\n0\n>>> print(path_2.depth_in(main))\n2\n>>> print(path_pb.depth_in(main))\nTraceback (most recent call last):\n[...]\nValueError: '/NoUser/projects' does not start with '/Users/projetmbc'\n```\n\n### The special concept of \"regpath\"\n\nA \"regpath\" is a query mixing all the power of regexes and the Unix-glob special characters *(there are also some additional query\nfeatures)*. We will use some \"regpaths\" in the incoming examples.\n\n**See the docstring of the method ``regpath2meta`` for complete informations about the \"regpaths\".**\n\n\n### Walk and see\n\nThe method ``see`` **tries** to open the current path with a possible associated application. For example, an HTML file will be opened by your default browser.\n\n\nYou can walk very easily inside a directory thanks to the method ``walk`` and the \"regpaths\" *(see the previous section)*. For example, let's suppose that we have the following directory with absolute path\n``/Users/projetmbc/basic_dir`` in a Unix system.\n\n```\n+ basic_dir\n * latex_1.tex\n * latex_2.tex\n * python_1.py\n * python_2.py\n * python_3.py\n * python_4.py\n * text_1.txt\n * text_2.txt\n * text_3.txt\n + empty_dir\n + sub_dir\n * code_A.py\n * code_B.py\n * slide_A.pdf\n * slide_B.pdf\n + sub_sub_dir\n * doc.pdf\n```\n\n\nHere are easy to understand examples where the regpath ``\"*\"`` is for a\nnon-recursive search contrary to the regpath ``\"**\"``.\n\n```python\n>>> from mistool.os_use import PPath\n>>> folder = PPath(\"/Users/projetmbc/basic_dir\")\n>>> for p in folder.walk(\"dir::**\"):\n... print(\"+\", p)\n...\n+ /Users/projetmbc/basic_dir/empty_dir\n+ /Users/projetmbc/basic_dir/sub_dir\n+ /Users/projetmbc/basic_dir/sub_dir/sub_sub_dir\n>>> for p in folder.walk(\"file::**.py\"):\n... print(\"+\", p)\n...\n+ /Users/projetmbc/basic_dir/python_1.py\n+ /Users/projetmbc/basic_dir/python_2.py\n+ /Users/projetmbc/basic_dir/python_3.py\n+ /Users/projetmbc/basic_dir/python_4.py\n+ /Users/projetmbc/basic_dir/sub_dir/code_A.py\n+ /Users/projetmbc/basic_dir/sub_dir/code_B.py\n>>> for p in folder.walk(\"file::*.py\"):\n... print(\"+\", p)\n...\n+ /Users/projetmbc/basic_dir/python_1.py\n+ /Users/projetmbc/basic_dir/python_2.py\n+ /Users/projetmbc/basic_dir/python_3.py\n+ /Users/projetmbc/basic_dir/python_4.py\n```\n\n\n### Create\n\nCreating files and folders is straight forward with the method ``create`` even if this needs to add several parent directories that don't yet exist. In the following example, we suppose that the current directory has absolute path ``/Users/projetmbc``, and doesn't contain any subfolder.\n\n```python\n>>> from mistool.os_use import PPath\n>>> path_1 = PPath(\"test/README\")\n>>> path_1.is_file()\nFalse\n>>> path_1.create(\"file\")\n>>> path_1.is_file()\nTrue\n>>> path_2 = PPath(\"test/README\")\n>>> path_2.create(\"dir\")\nTraceback (most recent call last):\n[...]\nValueError: path points to an existing file.\n```\n\n\n### Remove\n\nIf you want to destroy a whole directory, or simply a file, given by its ``PPath``, just use the method ``remove``.\n\n\n**Warning ! Because removing a file or a directory can be a dangerous thing, you can use the method ``can_be_removed`` which by default will raise an OS error if the ``PPath`` is one of an existing file or folder.**\n\n\nThe method ``clean`` allows to remove specific files and/or directories matching a regpath given as an argument.\n\n\n### Move & copy\n\nBy default, the method ``copy_to`` allows you to copy a file or a directory into another location, whereas the method ``move_to`` will move a file or a directory to another place.\n\n\nThe module ``string_use``\n=========================\n\nMulti-replacements\n------------------\n\nThe class ``string_use.MultiReplace`` makes possible to do multi-replacements recursively or not *(by default ``mode = \"norecu\"``)*.\n\n```python\n>>> from mistool.string_use import MultiReplace\n>>> from mistool.config.pattern import PATTERNS_WORDS\n>>> oldnew = {\n... 'W1': \"Word #1\",\n... 'W2': \"Word #2\",\n... 'W3': \"W1 and W2\"\n... }\n>>> mreplace = MultiReplace(\n... oldnew = oldnew,\n... mode = \"recu\",\n... pattern = PATTERNS_WORDS['var']\n... )\n>>> print(mreplace(\"W1 and W2 = W3\"))\nWord #1 and Word #2 = Word #1 and Word #2\n>>> mreplace.mode = \"norecu\" \n>>> mreplace.build()\n>>> print(mreplace(\"W1 and W2 = W3\"))\nWord #1 and Word #2 = W1 and W2\n```\n\nThe code above show that cyclic definitions will raise a ``ValueError`` exception.\n\n```python\n>>> from mistool.string_use import MultiReplace\n>>> from mistool.config.pattern import PATTERNS_WORDS\n>>> oldnew = {\n... 'WRONG_1': \"one small text and WRONG_2\",\n... 'WRONG_2': \"one small text, and then WRONG_3\",\n... 'WRONG_3': \"with WRONG_1, there is one problem here\"\n... }\n>>> mreplace = MultiReplace(\n... oldnew = oldnew,\n... mode = \"recu\",\n... pattern = PATTERNS_WORDS[\"var\"]\n... )\nTraceback (most recent call last):\n[...]\nValueError: the following viscious circle has been found.\n\t + WRONG_2 --> WRONG_3 --> WRONG_1 --> WRONG_2\n```\n\n\nMulti-splits\n------------\n\nThe aim of the class ``string_use.MultiSplit`` is to split a text on several semantic depths. Here is an example of use.\n\n```python\n>>> from mistool.string_use import MultiSplit\n>>> msplit = MultiSplit(seps = \"|\")\n>>> print(msplit(\"p_1 ; p_2 ; p_3 | r_1 ; r_2 | s\"))\n[\n 'p_1 ; p_2 ; p_3 ',\n ' r_1 ; r_2 ',\n\t' s'\n]\n>>> msplit.seps = [\"|\", \";\"]\n>>> msplit.strip = True\n>>> print(msplit(\"p_1 ; p_2 ; p_3 | r_1 ; r_2 | s\"))\n[\n ['p_1', 'p_2', 'p_3'],\n ['r_1', 'r_2'],\n ['s']\n]\n```\n\nBefore, between and after\n-------------------------\n\nThe function ``string_use.between`` looks for two separators such as to return the text before, between and after the first matching of this separators. By default, separators are not kept but you can ask to the function to keep them. ``None`` is returned if no matching has been found. Just take a look at a concrete example.\n\n```python\n>>> from mistool.string_use import between\n>>> text = \"f(x ; y) = x**2 + y**2\"\n>>> seps = [\"(\", \")\"]\n>>> print(between(text, seps))\n[\n 'f', # Before\n 'x ; y', # Between\n ' = x**2 + y**2' # After\n]\n>>> print(between(text, seps, True))\n[\n 'f(', # Before\n 'x ; y', # Between\n ') = x**2 + y**2' # After\n]\n>>> seps = [\"{\", \"}\"]\n>>> print(between(text, seps))\nNone\n```\n\nJoin with a last special text\n-----------------------------\n\nYou can join several strings with a special final separator as the examples above show.\n\n```python\n>>> from mistool.string_use import joinand\n>>> texts = [\"1\", \"2\", \"3\"]\n>>> print(joinand(texts))\n1, 2 and 3\n>>> print(joinand(texts = texts, andtext = \"et\"))\n1, 2 et 3\n>>> print(joinand(texts = texts, sep = \" + \", andtext = \"=\"))\n1 + 2 = 3\n```\n\n\nPlaying with cases of letters\n-----------------------------\n\nThe function ``string_use.case`` gives more auto-formatting of strings *(the last formatting looks strange but it is useful for an incoming project of the author of ``mistool``)*.\n\n```python\n>>> from mistool.string_use import case\n>>> text = \"onE eXamPLe\"\n>>> for kind in ['lower', 'upper', 'sentence', 'title']:\n... print(\"{0} [{1}]\".format(case(text, kind), kind))\n...\none example [lower]\nONE EXAMPLE [upper]\nOne example [sentence]\nOne Example [title]\n```\n\n\nA camel case string can be \"uncamelized\" by the function ``string_use.camelto``. Here is how to use it *(you can change the separator by using the optional argument ``sep`` which is ``\"_\"`` by default)*.\n\n```python\n>>> from mistool.string_use import camelto\n>>> text = \"OneSmallExampLE\"\n>>> for kind in ['lower', 'upper', 'sentence', 'title']:\n... print(\"{0} [{1}]\".format(camelto(text, kind), kind))\n...\none_small_examp_l_e [lower]\nONE_SMALL_EXAMP_L_E [upper]\nOne_small_examp_l_e [sentence]\nOne_Small_Examp_L_E [title]\n```\n\nIf you need to check the case of a string, just use ``string_use.iscase(text, kind)``.\n\n\nPlaying with ASCII\n------------------\n\nYou can check if a string is a pure ASCII one.\n\n```python\n>>> from mistool.string_use import isascii\n>>> print(isascii(\"Vive la France !\"))\nTrue\n>>> print(isascii(\"\u00a1Viva Espa\u00f1a!\"))\nFalse\n```\n\n\nYou can also transform a string to a pure ASCII one *(this will not always work but in case of failure you can contribute very easily to enhance ``string_use.asciify``)*.\n\n```python\n>>> from mistool.string_use import asciify\n>>> print(asciify(\"\u00a1Viva Espa\u00f1a!\"))\nViva Espana!\n>>> oldnew = {'!': \"\"}\n>>> print(asciify(text = \"\u00a1Viva Espa\u00f1a!\", oldnew = oldnew))\nViva Espana\n```\n\n\nThe last example above shows how to be permissive : this means that ``string_use.asciify`` will \"asciify\" the most characters as possible.\n\n```python\n>>> from mistool.string_use import asciify\n>>> print(asciify(text = \"L'Odyss\u00e9e de \u220f\", strict = False))\nL'Odyssee de \u220f\n>>> print(asciify(\"L'Odyss\u00e9e de \u220f\"))\nTraceback (most recent call last):\n[...]\nValueError: ASCII conversion can't be made because of the character << \u220f >>.\nYou can use the function ``_ascii_report`` so as to report more precisely\nthis fealure with eventually an ascii alternative.\n```\n\n\nAuto completion\n---------------\n\nThe class ``string_use.AutoComplete`` gives the auto-completion feature accessible without using any GUI package.\n\n```python\n>>> from mistool.string_use import AutoComplete\n>>> myac = AutoComplete(\n... words = [\n... \"article\", \"artist\", \"art\",\n... \"when\", \"who\", \"whendy\",\n... \"bar\", \"barbie\", \"barber\", \"bar\"\n... ]\n... )\n>>> print(myac.matching(\"art\"))\n['article', 'artist']\n>>> print(myac.matching(\"\"))\n[\n 'art', 'article', 'artist',\n 'bar', 'barber', 'barbie',\n 'when', 'whendy', 'who'\n]\n>>> print(myac.missing(\"art\", 'article'))\nicle\n```\n\n\nIt is a convention in GUI applications to give auto-completion only for at least three characters. You can do that by using the optional argument ``minsize`` which is ``1`` by default.\n\n\nThe module ``term_use``\n=======================\n\nAuto-numbering steps\n--------------------\n\nFor terminal informations, it can be useful to number some important printed steps. This can be done easily with the class ``term_use.Step``.\n\n```python\n>>> from mistool.term_use import Step\n>>> mysteps = Step()\n>>> i = 0\n>>> while i <= 12:\n... if i % 2:\n... mysteps(\"Action #{0}\".format(i))\n... i += 1\n...\n1) Action #1\n2) Action #3\n3) Action #5\n4) Action #7\n5) Action #9\n6) Action #11\n```\n\nThe class ``term_use.Step`` has two optional arguments.\n\n1. ``start`` gives the first number which is ``1`` by default.\n\n2. ``textit`` is a function of two variables ``(n, t)`` returning the text containing the step number ``n`` and the text ``t``. By default, ``textit = lambda n, t: \"{0}) {1}\".format(n, t)``.\n\n\nFrame\n-----\n\nThe function ``term_use.withframe`` puts a text inside an ASCII frame *(you can choose the alignment and use other kinds of frames if necessary as it is explained in the docstrings)*.\n\n```python\n>>> from mistool.term_use import withframe\n>>> text = '''\n... One small\n... text\n... to do tests\n... '''.strip()\n>>> print(withframe(text))\n###############\n# One small #\n# text #\n# to do tests #\n###############\n```\n\n\nASCII tree views of one directory\n---------------------------------\n\nFor our examples, we consider a folder with the following structure and the absolute path ``/Users/projetmbc/dir``.\n\n```\n+ dir\n * code_1.py\n * code_2.py\n * file_1.txt\n * file_2.txt\n + doc\n * code_A.py\n * code_B.py\n * slide_A.pdf\n * slide_B.pdf\n + licence\n * doc.pdf\n + emptydir\n```\n\nThe preceding ASCII tree view was built easily using the following code *(``PPath`` is the class defined in ``os_use`` added in ``term_use`` for you comfort)*.\n\n```python\n>>> from mistool.term_use import DirView, PPath\n>>> dir = PPath(\"/Users/projetmbc/dir\")\n>>> dirview = DirView(\n... ppath = dir,\n... sorting = \"filefirst\"\n... )\n>>> print(dirview.ascii)\n+ dir\n * code_1.py\n * code_2.py\n * file_1.txt\n * file_2.txt\n + doc\n * code_A.py\n * code_B.py\n * slide_A.pdf\n * slide_B.pdf\n + licence\n * doc.pdf\n + emptydir\n```\n\n\nUsing the \"regpath\" concept of the module ``os_use``, we can filter folders and files shown as in the example above *(we also use the argument ``display`` so as to customize the output)*.\n\n```python\n>>> from mistool.term_use import DirView, PPath\n>>> dir = PPath(\"/Users/projetmbc/dir\")\n>>> dirview = DirView(\n... ppath = dir,\n... regpath = \"file::**.py\",\n... display = \"main short found\"\n... )\n>>> print(dirview.ascii)\n+ dir\n * code_1.py\n * code_2.py\n + doc\n * code_A.py\n * code_B.py\n```\n\n\nYou can also use the following property methods.\n\n1. ``dirview.tree`` is a graphical tree.\n\n1. ``dirview.toc`` gives a minimal tabulated tree.\n\n1. ``dirview.latex`` is for the LaTeX package ``dirtree``.\n\n\nThe module ``python_use``\n=========================\n\nA multikeys dictionary\n----------------------\n\nThe class ``MKOrderedDict`` allows to work easily with multikeys ordered dictionaries. Here is a complete example of use.\n\n```python\n>>> from mistool.python_use import MKOrderedDict\n>>> onemkdict = MKOrderedDict()\n>>> onemkdict[(1, 2, 4)] = \"1st value\"\n>>> onemkdict[\"key\"] = \"2nd value\"\n>>> onemkdict[\"key\"] = \"3rd value\"\n>>> print(onemkdict)\nMKOrderedDict([\n ((id=0, key=(1, 2, 4)), value='1st value'),\n ((id=0, key='key') , value='2nd value'),\n ((id=1, key='key') , value='3rd value')\n])\n>>> for k_id, val in onemkdict[\"key\"]:\n... print(k_id, val)\n...\n0 2nd value\n1 3rd value\n>>> print(onemkdict.getitembyid(1, \"key\"))\n3rd value\n>>> for (k_id, key), val in onemkdict.items():\n... print((k_id, key), \"===>\", val)\n...\n(0, (1, 2, 4)) ===> 1st value\n(0, 'key') ===> 2nd value\n(1, 'key') ===> 3rd value\n>>> for key, val in onemkdict.items(noid=True):\n... print(key, \"===>\", val)\n...\n(1, 2, 4) ===> 1st value\nkey ===> 2nd value\nkey ===> 3rd value\n>>> \"key\" in onemkdict\nTrue\n>>> \"kaaaay\" in onemkdict\nFalse\n>>> onemkdict.setitembyid(0, \"key\", \"New 2nd value\")\n>>> print(onemkdict)\nMKOrderedDict([\n ((id=0, key=(1, 2, 4)), value='1st value'),\n ((id=0, key='key') , value='New 2nd value'),\n ((id=1, key='key') , value='3rd value')])\n```\n\n\nA dictionary defined recursively\n--------------------------------\n\nThe class ``RecuOrderedDict`` allows to use a list of hashable keys, or just a single hashable key. Here is a complete example of use.\n\n```python\n>>> from mistool.python_use import RecuOrderedDict\n>>> onerecudict = RecuOrderedDict()\n>>> onerecudict[[1, 2, 4]] = \"1st value\"\n>>> onerecudict[(1, 2, 4)] = \"2nd value\"\n>>> onerecudict[\"key\"] = \"3rd value\"\n>>> print(onerecudict)\nRecuOrderedDict([\n (\n 1,\n RecuOrderedDict([\n (\n 2,\n RecuOrderedDict([ (4, '1st value') ])\n )\n ])\n ),\n (\n (1, 2, 4),\n '2nd value'\n ),\n (\n 'key',\n '3rd value'\n )\n])\n>>> [1, 2, 4] in onerecudict\nTrue\n>>> [2, 4] in onerecudict[1]\nTrue\n```\n\n\nList of single values of a dictionary\n-------------------------------------\n\nIf you need to list all the value of one dictionary, the function ``python_use.dictvalues`` is made for you.\n\n```python\n>>> from mistool.python_use import dictvalues\n>>> onedict = {\"a\": 1, \"b\": 2, \"c\": 1}\n>>> print(dictvalues(onedict))\n[1, 2]\n>>> print(list(onedict.values()))\n[2, 1, 1]\n```\n\n\nEasy quoted text with the least escaped quote symbols\n-----------------------------------------------------\n\nWith ``python_use.quote`` you can add without pain quotes around a text.\n\n```python\n>>> from mistool.python_use import quote\n>>> print(quote('First example.'))\n'First example.'\n>>> print(quote(\"Same example.\"))\n'Same example.'\n>>> print(quote('One \"small\" example.'))\n'One \"small\" example.'\n>>> print(quote(\"Another kind of \\\"example\\\".\"))\n'Another kind of \"example\".'\n>>> print(quote(\"An example a 'little' more \\\"problematic\\\".\"))\n'An example a \\'little\\' more \"problematic\".'\n```\n\n\nThe module ``datetime_use``\n===========================\n\nSpecial class `ddatetime`\n-------------------------\n\nThe class `ddatetime` is an enhanced version of the class `datetime.datetime` : see the two sections below. It is very easy to build an instance of `ddatetime` thanks to the very cool function `build_ddatetime`. The examples above show different ways to define a date.\n\n```python\n>>> from mistool.datetime_use import build_ddatetime\n>>> build_ddatetime((2017, 8, 1))\nddatetime(2017, 8, 1, 0, 0)\n>>> build_ddatetime(2017, 8, 1)\nddatetime(2017, 8, 1, 0, 0)\n>>> build_ddatetime(\"2017-08-01\")\nddatetime(2017, 8, 1, 0, 0)\n>>> build_ddatetime(\"Friday 01 august 2017\")\nddatetime(2017, 8, 1, 0, 0)\n>>> build_ddatetime(\"Vendredi 1er ao\u00fbt 2017\", lang = \"fr_FR\")\nddatetime(2017, 8, 1, 0, 0)\n>>> build_ddatetime(\"Vendredi 1er ao\u00fbt 2017\")\n[...]\nValueError: Unknown string format\n>>> build_ddatetime(\"Vendredi 1er ao\u00fbt 2017\", \"fr_FR\")\n[...]\nTypeError: an integer is required (got type str)\n```\n\nNote that you **must** define a special language using ``lang = \"fr_FR\"`` as you can see in the two last commands in the preceding example.\n\n\nNext day having a fixed english name\n------------------------------------\n\nIn some applications you want to know the next monday after a fixing date.\n\n```python\n>>> from mistool.datetime_use import ddatetime\n>>> onedate = ddatetime(2017,8, 1)\n>>> print(onedate.strftime(\"%Y-%m-%d is a %A.\"))\n2017-08-01 is a Tuesday.\n>>> nextfriday = onedate.nextday(name = \"friday\")\n>>> print(\"Next Friday:\", nextfriday.strftime(\"%Y-%m-%d\"))\nNext Friday: 2017-08-04\n```\n\nTranslating a date\n------------------\n\nThanks to the class `ddatetime`, it is easy to safely translate all the names in a date.\n\n```python\n>>> from mistool.datetime_use import ddatetime\n>>> onedate = ddatetime(2015, 6, 2)\n>>> oneformat = \"%A %d %B %Y\"\n>>> print(onedate.translate(strformat = oneformat))\nTuesday 02 June 2015\n>>> print(onedate.translate(strformat = oneformat, lang = \"fr_FR\"))\nMardi 02 juin 2015\n```\n\nParsing a string to build a date\n--------------------------------\n\nThe function ``parsedate`` is an international version of the function ``dateutil.parser.parse`` (translations need external contributions : the job is very easy to do !).\n\n```python\n>>> from mistool.datetime_use import parsedate\n>>> parsedate(\"Friday 01 august 2017\")\nddatetime(2017, 8, 1, 0, 0)\n>>> parsedate(timestr = \"Vendredi 1er Ao\u00fbt 2017\", lang = \"fr_FR\")\nddatetime(2017, 8, 1, 0, 0)\n>>> parsedate(timestr = \"Montag, 11. April 2016\", lang = \"de_DE\")\n[...]\nValueError: unsupported language ''de_DE''\n```\n\n\nThe module ``url_use``\n======================\n\nLooking for dead or bad urls\n----------------------------\n\nFor the following example, we suppose that we have a working internet connection.\n\n```python\n>>> from mistool.url_use import islinked\n>>> islinked(\"http://www.google.com\")\nTrue\n>>> islinked(\"http://www.g-o-o-g-l-e.com\")\nFalse\n```\n\nEscaping special characters in urls\n-----------------------------------\n\nIt is safe to not use non-ASCII characters in a url. Here is one way to do that.\n\n```python\n>>> from mistool.url_use import escape\n>>> print(escape(\"http://www.vivaespa\u00f1a.com/cami\u00f3n/\"))\nhttp://www.vivaespa%C3%B1a.com/cami%C3%B3n/\n```\n\n\nThe module ``latex_use``\n========================\n\nEscaping the special LaTeX characters\n-------------------------------------\n\nThe function ``latex_use.escape`` will escape all special characters for you regarding the text or math mode.\n\n```python\n>>> from mistool.latex_use import escape\n>>> onetext = \"\\OH/ & ...\"\n>>> print(escape(onetext))\n\\textbackslash{}OH/ \\& ...\n>>> print(escape(text = onetext, mode = \"math\"))\n\\backslash{}OH/ \\& ...\n```\n\n\nEasy LaTeX compilation(s)\n-------------------------\n\nThe class ``latex_use.Build`` compiles a LaTeX file for you *(for the moment only the PDF compilation is implemented)*. Let's consider the\nfollowing LaTeX file with the absolute path ``/Users/projetmbc/latex/file.tex``.\n\n```latex\n\\documentclass[11pt, oneside]{article}\n\n\\begin{document}\n\n\\section{One little test}\n\nOne basic formula : $E = mc^2$.\n\n\\end{document}\n```\n\nIn the following code, we call to the class ``term_use.DirView`` so as to show the new files made by LaTeX *(the ellipsis ``[...]``\nindicates some lines not reproduced here)*.\n\n```python\n>>> from mistool.latex_use import Build, PPath\n>>> from mistool.term_use import DirView\n>>> latexdir = PPath(\"/Users/projetmbc/latex/file.tex\")\n>>> print(DirView(latexdir.parent).ascii)\n+ latex\n * file.tex\n>>> builder = Build(latexdir)\n>>> builder.pdf()\n# -- Start of compilation Nb.1 -- #\n\nThis is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded\nformat=pdflatex)\n restricted \\write18 enabled.\nentering extended mode\n\n[...]\n\nOutput written on file.pdf (1 page, 36666 bytes).\nTranscript written on file.log.\n\n# -- End of compilation Nb.1 -- #\n>>> print(DirView(latexdir.parent).ascii)\n+ latex\n * file.aux\n * file.log\n * file.pdf\n * file.tex\n```\n\nThe PDF file has been build by LaTeX but there are also temporary ones. If you need several compilations, so as to build a table of content for example, just use the attribut-argument ``repeat``, and if you don't want to see the LaTeX ouput, just set the attribut-argument ``showinfos`` to ``False``.\n\n\nRemoving the temporary files produced by LaTeX\n----------------------------------------------\n\nWe keep the same LaTeX example file. The function ``latex_use.clean`` cleans all unuseful temporary files when the compilation has been done.\n\n```python\n>>> from mistool.latex_use import clean, PPath\n>>> from mistool.term_use import DirView\n>>> latexdir = PPath(\"/Users/projetmbc/latex\")\n>>> print(DirView(latexdir.parent).ascii)\n+ latex\n * file.aux\n * file.log\n * file.pdf\n * file.synctex.gz\n * file.tex\n>>> clean(ppath = latexdir, showinfos = True)\n* Cleaning for \"/Users/projetmbc/latex/file.tex\"\n>>> print(DirView(latexdir.parent).ascii)\n+ latex\n * file.pdf\n * file.tex\n```\n\n\nAutomatic installation of personal LaTeX packages\n-------------------------------------------------\n\nLet's suppose that we have package named ``lyxam`` stored in a folder having the absolute path ``/Users/projetmbc/latex/lyxam`` and whose structure is the following one.\n\n```\n+ lyxam\n + change_log\n + 2012\n * 02.txt\n * 03.txt\n * 04.txt\n * 10.txt\n * todo.txt\n * lyxam.sty\n + config\n * settings.tex\n + lang\n * en.tex\n * fr.tex\n + special\n * fr.config\n + standard\n * en.config\n * fr.config\n + style\n * apmep.tex\n * default.tex\n```\n\nTo install this package locally in your LaTeX distribution, just do like in the code above.\n\n```python\n>>> from mistool.latex_use import install, PPath\n>>> package = PPath(\"/Users/projetmbc/latex/lyxam\")\n>>> install(package)\nStarting installation of the package locally.\n * Deletion of the old << lyxam >> package in the local LaTeX directory.\n * Creation of a new << lyxam >> package in the local LaTeX directory.\n + Adding the new file << lyxam.sty >>\n + Adding the new file << change_log/todo.txt >>\n + Adding the new file << change_log/2012/02.txt >>\n + Adding the new file << change_log/2012/03.txt >>\n + Adding the new file << change_log/2012/04.txt >>\n + Adding the new file << change_log/2012/10.txt >>\n + Adding the new file << config/settings.tex >>\n + Adding the new file << config/lang/en.tex >>\n + Adding the new file << config/lang/fr.tex >>\n + Adding the new file << config/lang/special/fr.config >>\n + Adding the new file << config/lang/standard/en.config >>\n + Adding the new file << config/lang/standard/fr.config >>\n + Adding the new file << config/style/apmep.tex >>\n + Adding the new file << config/style/default.tex >>\n * Refreshing the list of LaTeX packages.\n```\n\n\nUsing the concept of \"regpath\" of the module ``os_use``, you can for example choose to not install all the ``TXT`` files.\n\n```python\n>>> from mistool.latex_use import install, PPath\n>>> package = PPath(\"/Users/projetmbc/latex/lyxam\")\n>>> install(ppath = package, regpath = \"file not::**.txt\")\nStarting installation of the package locally.\n * Deletion of the old << lyxam >> package in the local LaTeX directory.\n * Creation of a new << lyxam >> package in the local LaTeX directory.\n + Adding the new file << lyxam.sty >>\n + Adding the new file << config/settings.tex >>\n + Adding the new file << config/lang/en.tex >>\n + Adding the new file << config/lang/fr.tex >>\n + Adding the new file << config/lang/special/fr.config >>\n + Adding the new file << config/lang/standard/en.config >>\n + Adding the new file << config/lang/standard/fr.config >>\n + Adding the new file << config/style/apmep.tex >>\n + Adding the new file << config/style/default.tex >>\n * Refreshing the list of LaTeX packages.\n```\n\n\nRemove a personal LaTeX packages\n--------------------------------\n\nJust use ``remove(name)`` where ``name`` is the name of a local LaTeX package.\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bc-python/mistool", "keywords": "python latex os path string terminal tool", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "mistool", "package_url": "https://pypi.org/project/mistool/", "platform": "", "project_url": "https://pypi.org/project/mistool/", "project_urls": { "Homepage": "https://github.com/bc-python/mistool" }, "release_url": "https://pypi.org/project/mistool/1.2.5b0/", "requires_dist": null, "requires_python": "", "summary": "Miscellaneous missing tools that can help the py-developper.", "version": "1.2.5b0" }, "last_serial": 5881880, "releases": { "1.0.0b0": [ { "comment_text": "", "digests": { "md5": "42c8e2973f4cac51e6ea7d7b79c8a9c0", "sha256": "bf1bc268f22c1031597a2e533b5990676d07e7927b386849f89cc86c4418d08a" }, "downloads": -1, "filename": "mistool-1.0.0b0-py3.5.egg", "has_sig": false, "md5_digest": "42c8e2973f4cac51e6ea7d7b79c8a9c0", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 132637, "upload_time": "2017-02-19T14:36:07", "url": "https://files.pythonhosted.org/packages/d0/f8/fc569530df86e5e2186d9292507ef94633021a021b4c8428e6383dbd84ac/mistool-1.0.0b0-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "82d8fa65dbfdfb3207023ae44ec76e77", "sha256": "6bd9f930f187c3f97e633bfa54932e8b010f5e0fbc02a1c36ef692e6e8ed3dbe" }, "downloads": -1, "filename": "mistool-1.0.0b0-py3-none-any.whl", "has_sig": false, "md5_digest": "82d8fa65dbfdfb3207023ae44ec76e77", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 73593, "upload_time": "2016-07-27T22:41:59", "url": "https://files.pythonhosted.org/packages/a7/fb/e32dbd8a868c07e5c04d3487dfcade4cb374601d5180942f4e2976055233/mistool-1.0.0b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b640fda466fa6f673a0d5a8cc7d5cc1", "sha256": "fe9329ab5a332f5f16cb812631cfe498226d4da2af30e1e83f20fb87a9e1c268" }, "downloads": -1, "filename": "mistool-1.0.0b0.tar.gz", "has_sig": false, "md5_digest": "4b640fda466fa6f673a0d5a8cc7d5cc1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 80259, "upload_time": "2016-07-27T22:42:12", "url": "https://files.pythonhosted.org/packages/8f/15/25ddcfdad49e097e393f99cde23c7c8e9e649b74a984be5305816e031137/mistool-1.0.0b0.tar.gz" } ], "1.1.0b0": [ { "comment_text": "", "digests": { "md5": "5a5e0c3e2a20b8fefdea03b6435e9cad", "sha256": "070beff6fa735e68228321d4dea7393fedb3f6980997060052cb35b068ab4406" }, "downloads": -1, "filename": "mistool-1.1.0b0-py3.5.egg", "has_sig": false, "md5_digest": "5a5e0c3e2a20b8fefdea03b6435e9cad", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 133922, "upload_time": "2017-02-19T14:36:24", "url": "https://files.pythonhosted.org/packages/f6/ca/3c7af50c1566c0efc700fddc21cc9d8d272503249fda3e546ff0925f0cbc/mistool-1.1.0b0-py3.5.egg" } ], "1.1.1b0": [ { "comment_text": "", "digests": { "md5": "7523eb3bc244361ed27483a91298b8ef", "sha256": "42503178ee8e0b2e6f60b366033b35f671f894fd32d8991739d429101ad03cdc" }, "downloads": -1, "filename": "mistool-1.1.1b0-py3.5.egg", "has_sig": false, "md5_digest": "7523eb3bc244361ed27483a91298b8ef", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 146943, "upload_time": "2017-09-27T16:21:27", "url": "https://files.pythonhosted.org/packages/b8/ac/fa802e4b5526cb76ce8724c7fae7d1fdb7cd366b88fc79b4573781019b41/mistool-1.1.1b0-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "c3101a1a7d8be2417d5721f7466be9af", "sha256": "90984afb484ab490ec45f2a6231d1be1c964efb1c6fad95c7258b24d3797b08f" }, "downloads": -1, "filename": "mistool-1.1.1b0-py3-none-any.whl", "has_sig": false, "md5_digest": "c3101a1a7d8be2417d5721f7466be9af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 75735, "upload_time": "2017-02-19T14:35:57", "url": "https://files.pythonhosted.org/packages/6d/a6/4720b8d6a84c774d4081a6e11cb1fd975d16fa9f0b247e5bb5dd3bcd2fc1/mistool-1.1.1b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3de599071f5ea3a2a2d8c9ee9a6b23dd", "sha256": "5016fd3e3bc345fc41a2567eda034ab5c7cd51107c3b77828f65c45e9f2ef103" }, "downloads": -1, "filename": "mistool-1.1.1b0.tar.gz", "has_sig": false, "md5_digest": "3de599071f5ea3a2a2d8c9ee9a6b23dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 82655, "upload_time": "2017-02-19T14:36:29", "url": "https://files.pythonhosted.org/packages/55/82/019aaf6486b3023ef181b41205dffeed5eb14166330802d0a381d6077f91/mistool-1.1.1b0.tar.gz" } ], "1.2.0b0": [ { "comment_text": "", "digests": { "md5": "e1cb8cfb9add1d129e4f3b6ca669873f", "sha256": "4bde861cfb4b17d89038d694fe985e02a80d9e6dfd4087dca72aefdd405cf9b1" }, "downloads": -1, "filename": "mistool-1.2.0b0-py3.5.egg", "has_sig": false, "md5_digest": "e1cb8cfb9add1d129e4f3b6ca669873f", "packagetype": "bdist_egg", "python_version": "3.5", "requires_python": null, "size": 146933, "upload_time": "2017-09-27T16:21:32", "url": "https://files.pythonhosted.org/packages/c4/92/cdb4a3f4416867bc0984861ab00915293eeffdaae7f8c22a0b46b9531da1/mistool-1.2.0b0-py3.5.egg" }, { "comment_text": "", "digests": { "md5": "65c429069d2837f8c526d704e4bf9675", "sha256": "9546f141a5b4f4ff2d461c7055ca5539f98d78d12ee7420e80bd435a5cabc066" }, "downloads": -1, "filename": "mistool-1.2.0b0-py3.6.egg", "has_sig": false, "md5_digest": "65c429069d2837f8c526d704e4bf9675", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 146986, "upload_time": "2017-09-27T16:21:37", "url": "https://files.pythonhosted.org/packages/e9/a0/2d1433daa380229033f77f526a1f27b4b3e40276cda737809c8701c5bc5a/mistool-1.2.0b0-py3.6.egg" } ], "1.2.1b0": [ { "comment_text": "", "digests": { "md5": "ec4c3a3bf5d81c6befb9f9eef5593bbd", "sha256": "1f977ad167c836e66bf624bdf974c1b154bdf22bf74b70141e094e2ee06f3986" }, "downloads": -1, "filename": "mistool-1.2.1b0-py3.6.egg", "has_sig": false, "md5_digest": "ec4c3a3bf5d81c6befb9f9eef5593bbd", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": null, "size": 147320, "upload_time": "2017-09-27T16:21:41", "url": "https://files.pythonhosted.org/packages/25/ea/a38826b7ee318be8089c3426a7c6de1ef34d3be9f84e98b0ee0f001c64ab/mistool-1.2.1b0-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "480fae0a1e1b95d46b2912ecc977de2b", "sha256": "94a51becc51374f1a6b4018f6a72bafabd8d1e11dd7bc83bbf856dc98835b563" }, "downloads": -1, "filename": "mistool-1.2.1b0-py3.7.egg", "has_sig": false, "md5_digest": "480fae0a1e1b95d46b2912ecc977de2b", "packagetype": "bdist_egg", "python_version": "3.7", "requires_python": null, "size": 137839, "upload_time": "2019-07-23T10:39:48", "url": "https://files.pythonhosted.org/packages/10/7f/b376f431c2bc2a7ebfcdff534982c235027d1ce60871921347f90c7c096a/mistool-1.2.1b0-py3.7.egg" }, { "comment_text": "", "digests": { "md5": "cdb5af6674a95afa0555718769dd8032", "sha256": "3af71b461f9350f095785fba0db0310c365ca112840b1922d30bcc2cb1653771" }, "downloads": -1, "filename": "mistool-1.2.1b0-py3-none-any.whl", "has_sig": false, "md5_digest": "cdb5af6674a95afa0555718769dd8032", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 83228, "upload_time": "2017-09-27T16:21:17", "url": "https://files.pythonhosted.org/packages/0b/6b/6b84047ee29aa020c62e8c204a3283d89dc5fbd5c55e4db53ec84b8980df/mistool-1.2.1b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d952db10b088e606f27a034031c56ead", "sha256": "4be4ebecca8f5ed8278104fd7e5481f52aa0dd43d3516032c7d5ea18962f51eb" }, "downloads": -1, "filename": "mistool-1.2.1b0.tar.gz", "has_sig": false, "md5_digest": "d952db10b088e606f27a034031c56ead", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 85233, "upload_time": "2017-09-27T16:21:44", "url": "https://files.pythonhosted.org/packages/5c/19/a46a681f69830e643ca9202a66539e96cc546b86d43690f08bef142b38e4/mistool-1.2.1b0.tar.gz" } ], "1.2.2b0": [ { "comment_text": "", "digests": { "md5": "b6f3475598eadfbed41c7f85840bada9", "sha256": "4e36e305c3fa64485026f3d89c58676b37e4a9385df0b09c7fa2a158b5e8b69a" }, "downloads": -1, "filename": "mistool-1.2.2b0-py3-none-any.whl", "has_sig": false, "md5_digest": "b6f3475598eadfbed41c7f85840bada9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 67953, "upload_time": "2019-07-23T11:23:25", "url": "https://files.pythonhosted.org/packages/d4/23/dd6f280d3cdfe51a48ab3605f41f3a9e49aa6a2563d47236affdbb650efb/mistool-1.2.2b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ee86532f7ae1189757e55d67404b8002", "sha256": "47fc39e7b59c976d490ca7d455e6659ca659018953d79f4438636b023ea641ee" }, "downloads": -1, "filename": "mistool-1.2.2b0.tar.gz", "has_sig": false, "md5_digest": "ee86532f7ae1189757e55d67404b8002", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93890, "upload_time": "2019-07-23T11:23:29", "url": "https://files.pythonhosted.org/packages/46/d5/828896548c4a424023b2a13ed09fd02f91a7bf7522318d94e847d94acae6/mistool-1.2.2b0.tar.gz" } ], "1.2.3b0": [ { "comment_text": "", "digests": { "md5": "e1180e0a0d62ce7b7545854ba55e9968", "sha256": "a5d53a78efaf155d0e6c236cea69ba707186bb91cbdff0ba1be06dd6d507e090" }, "downloads": -1, "filename": "mistool-1.2.3b0-py3-none-any.whl", "has_sig": false, "md5_digest": "e1180e0a0d62ce7b7545854ba55e9968", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 68037, "upload_time": "2019-09-24T21:03:41", "url": "https://files.pythonhosted.org/packages/f4/9a/88997906e5675669da482651f49890b519541983f0b773427c6460503226/mistool-1.2.3b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1c802c49d4ce9c5453a8f49d60c2a6c2", "sha256": "cd6c0074a288d0719bb21844904578d691241102efa228f0a180c9ca10d3bcb1" }, "downloads": -1, "filename": "mistool-1.2.3b0.tar.gz", "has_sig": false, "md5_digest": "1c802c49d4ce9c5453a8f49d60c2a6c2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93959, "upload_time": "2019-09-24T21:03:44", "url": "https://files.pythonhosted.org/packages/46/93/4f9b8e7168d24c62ec1a5e09df6822d23b3faec4034691724a7369320d3e/mistool-1.2.3b0.tar.gz" } ], "1.2.4b0": [ { "comment_text": "", "digests": { "md5": "1af8bb7c93644a6162055ebb89dbd345", "sha256": "afbc4c3c123491f839b2fa179093dc8e3a1815c7ce7f500afe61fa3009f79a40" }, "downloads": -1, "filename": "mistool-1.2.4b0-py3-none-any.whl", "has_sig": false, "md5_digest": "1af8bb7c93644a6162055ebb89dbd345", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 68034, "upload_time": "2019-09-24T21:11:56", "url": "https://files.pythonhosted.org/packages/17/e5/e465cb6188c4f057384cd4452cb356dad273cb14a0737a43e9ab98a1ed8c/mistool-1.2.4b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "38d55fa1aedbb6fc1c788f5e778f8129", "sha256": "a7d54e5c0241fca014155bc4bc77f93d22f3d1a5afbc86db4181354f8391e2b2" }, "downloads": -1, "filename": "mistool-1.2.4b0.tar.gz", "has_sig": false, "md5_digest": "38d55fa1aedbb6fc1c788f5e778f8129", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93951, "upload_time": "2019-09-24T21:12:00", "url": "https://files.pythonhosted.org/packages/16/7f/1719e15feef7cbc9a2dc1219484dcee7128b9c7dff3fbf3955e3d50b651a/mistool-1.2.4b0.tar.gz" } ], "1.2.5b0": [ { "comment_text": "", "digests": { "md5": "8b1a1a6baf35746e98a48757b7017309", "sha256": "f26cd6171ee808f3ae52288a1199deaabdc8c66ab88ff21977a1193d8dfb60c7" }, "downloads": -1, "filename": "mistool-1.2.5b0-py3-none-any.whl", "has_sig": false, "md5_digest": "8b1a1a6baf35746e98a48757b7017309", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 68036, "upload_time": "2019-09-24T21:15:52", "url": "https://files.pythonhosted.org/packages/ff/94/80ce89e845edc120eb7f67cca42c9efe05baf3637061f3fcf327ad87e58c/mistool-1.2.5b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "505aa8a270d1b77e7877550db46a5875", "sha256": "5b9624289b0ab47cd044d01a99aa3b57e5ebeaf6cb796c6c85de9118b14f0b1b" }, "downloads": -1, "filename": "mistool-1.2.5b0.tar.gz", "has_sig": false, "md5_digest": "505aa8a270d1b77e7877550db46a5875", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93937, "upload_time": "2019-09-24T21:15:57", "url": "https://files.pythonhosted.org/packages/d5/4a/a9e681192ddc788bee5e5f05be405c89f3d633f4d6d1b233b9a6b3f115e6/mistool-1.2.5b0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "8b1a1a6baf35746e98a48757b7017309", "sha256": "f26cd6171ee808f3ae52288a1199deaabdc8c66ab88ff21977a1193d8dfb60c7" }, "downloads": -1, "filename": "mistool-1.2.5b0-py3-none-any.whl", "has_sig": false, "md5_digest": "8b1a1a6baf35746e98a48757b7017309", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 68036, "upload_time": "2019-09-24T21:15:52", "url": "https://files.pythonhosted.org/packages/ff/94/80ce89e845edc120eb7f67cca42c9efe05baf3637061f3fcf327ad87e58c/mistool-1.2.5b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "505aa8a270d1b77e7877550db46a5875", "sha256": "5b9624289b0ab47cd044d01a99aa3b57e5ebeaf6cb796c6c85de9118b14f0b1b" }, "downloads": -1, "filename": "mistool-1.2.5b0.tar.gz", "has_sig": false, "md5_digest": "505aa8a270d1b77e7877550db46a5875", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 93937, "upload_time": "2019-09-24T21:15:57", "url": "https://files.pythonhosted.org/packages/d5/4a/a9e681192ddc788bee5e5f05be405c89f3d633f4d6d1b233b9a6b3f115e6/mistool-1.2.5b0.tar.gz" } ] }