{ "info": { "author": "alexsavio", "author_email": "alexsavio@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Console", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: MacOS", "Operating System :: OS Independent", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3.6", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "hansel\n======\n\nParametric file paths to access and build structured folder trees.\n\n|PyPI| |Build Status| |Coverage Status| |Code Health|\n\nIt almost doesn't have `Dependencies`_, check how to `Install`_ it.\n\nGithub repository: https://github.com/alexsavio/hansel\n\nUsage\n=====\n\nQuick Intro\n-----------\n\nImagine this folder tree:\n\n::\n\n data\n \u2514\u2500\u2500 raw\n \u251c\u2500\u2500 0040000\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 session_1\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 anat_1\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 rest_1\n \u251c\u2500\u2500 0040001\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 session_1\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 anat_1\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 rest_1\n \u251c\u2500\u2500 0040002\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 session_1\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 anat_1\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 rest_1\n \u251c\u2500\u2500 0040003\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 session_1\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 anat_1\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 rest_1\n \u251c\u2500\u2500 0040004\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 session_1\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 anat_1\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 rest_1\n\n\n.. code:: python\n\n >>> from pprint import pprint\n >>> from hansel import Crumb\n\n # create the crumb\n >>> crumb = Crumb(\"{base_dir}/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n\n # set the base_dir path\n >>> crumb = crumb.replace(base_dir='/tmp/hansel/data')\n >>> print(str(crumb))\n /tmp/hansel/data/raw/{subject_id}/{session_id}/{image_type}/{image}\n\n # get the ids of the subjects\n >>> subj_ids = crumb['subject_id']\n >>> print(subj_ids)\n ['0040000', '0040001', '0040002', '0040003', '0040004', '0040005', ...\n\n # get the paths to the subject folders, the output can be strings or crumbs,\n # you choose with the ``make_crumbs`` boolean argument. Default: True.\n >>> subj_paths = crumb.ls('subject_id', make_crumbs=True)\n >>> pprint(subj_paths)\n [Crumb(\"/tmp/hansel/data/raw/0040000/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040003/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040004/{session_id}/{image_type}/{image}\"),\n ...\n\n # set the image_type\n >>> anat_crumb = crumb.replace(image_type='anat_1')\n >>> print(anat_crumb)\n /tmp/hansel/data/raw/{subject_id}/{session_id}/anat_1/{image}\n\n # get the paths to the images inside the anat_1 folders\n >>> anat_paths = anat_crumb.ls('image')\n >>> pprint(anat_paths)\n [Crumb(\"/tmp/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040004/session_1/anat_1/mprage.nii.gz\"),\n ...\n\n # get the ``session_id`` of each of these ``anat_paths``\n >>> sessions = [cr['session_id'][0] for cr in anat_paths]\n >>> print(sessions)\n ['session_1', 'session_1', 'session_1', 'session_1', 'session_1', ...\n\n # if you don't want the the output to be ``Crumbs`` but string paths:\n >>> anat_paths = anat_crumb.ls('image', make_crumbs=False)\n >>> pprint(anat_paths)\n ['/tmp/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz',\n '/tmp/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz',\n '/tmp/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz',\n '/tmp/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz',\n '/tmp/hansel/data/raw/0040004/session_1/anat_1/mprage.nii.gz',\n ...\n\n # you can also use a list of ``fnmatch`` expressions to ignore certain files patterns\n # using the ``ignore_list`` argument in the constructor.\n # For example, the files that start with '.'.\n >>> crumb = Crumb(\"{base_dir}/data/raw/{subject_id}/{session_id}/{image_type}/{image}\", ignore_list=['.*'])\n\nOnce you have a fully defined Crumb, you can use its ``path`` for operations with the corresponding file.\nFor that you have to convert it to string by using ``str(crumb)`` or ``crumb.path``.\n\nSee more quick examples after the `Long Intro`_ check `More features and tricks`_.\n\n---------------------\n\nLong Intro\n----------\n\nI often find myself in a work related with structured folder paths, such as the\none shown above.\n\nI have tried many ways of solving these situations: loops, dictionaries,\nconfiguration files, etc. I always end up doing a different thing for the same\nproblem over and over again.\n\nThis week I grew tired of it and decided to make a representation of a\nstructured folder tree in a string and access it the most easy way.\n\nIf you look at the folder structure above I have:\n\n- the root directory from where it is hanging: ``...data/raw``,\n- many identifiers (in this case a subject identification), e.g.,\n ``0040000``,\n- session identification, ``session_1`` and\n- a data type (in this case an image type), ``anat_1`` and ``rest_1``.\n\nWith ``hansel`` I can represent this folder structure like this:\n\n.. code:: python\n\n >>> from hansel import Crumb\n >>> crumb = Crumb(\"{base_dir}/data/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n\nLet's say we have the structure above hanging from a base directory like ``/home/hansel/``.\n\nI can use the ``replace`` function to make set the ``base_dir`` parameter:\n\n.. code:: python\n\n >>> crumb = crumb.replace(base_dir='/home/hansel')\n >>> print(str(crumb))\n /home/hansel/data/raw/{subject_id}/{session_id}/{image_type}/{image}\n\nif I don't need a copy of ``crumb``, I can use the ``[]`` operator:\n\n.. code:: python\n\n >>> crumb['base_dir'] = '/tmp/hansel'\n >>> print(str(crumb))\n /tmp/hansel/data/raw/{subject_id}/{session_id}/{image_type}/{image}\n\nNow that the root path of my dataset is set, I can start querying my\ncrumb path.\n\nIf I want to know the path to the existing ``subject_id`` folders:\n\nWe can use the ``ls`` function. Its output can be ``str`` or ``Crumb``.\nI can choose this using the ``make_crumbs`` argument (default: True):\n\n.. code:: python\n\n >>> subj_crumbs = crumb.ls('subject_id')\n >>> pprint(subj_crumbs)\n [Crumb(\"/tmp/hansel/data/raw/0040000/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040003/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/0040004/{session_id}/{image_type}/{image}\"),\n ...\n\n >>> subj_paths = crumb.ls('subject_id', make_crumbs=False)\n >>> pprint(subj_paths)\n ['/tmp/hansel/data/raw/0040000/{session_id}/{image_type}/{image}',\n '/tmp/hansel/data/raw/0040001/{session_id}/{image_type}/{image}',\n '/tmp/hansel/data/raw/0040002/{session_id}/{image_type}/{image}',\n '/tmp/hansel/data/raw/0040003/{session_id}/{image_type}/{image}',\n '/tmp/hansel/data/raw/0040004/{session_id}/{image_type}/{image}',\n ...\n\n\nIf I want to know what are the existing ``subject_id``:\n\n.. code:: python\n\n >>> subj_ids = crumb.ls('subject_id', fullpath=False)\n >>> print(subj_ids)\n ['0040000', '0040001', '0040002', '0040003', '0040004', '0040005', ...\n\nor\n\n.. code:: python\n\n >>> subj_ids = crumb['subject_id']\n >>> print(subj_ids)\n ['0040000', '0040001', '0040002', '0040003', '0040004', '0040005', ...\n\nNow, if I wanted to get the path to all the images inside the ``anat_1`` folders,\nI could do this:\n\n.. code:: python\n\n >>> anat_crumb = crumb.replace(image_type='anat_1')\n >>> print(anat_crumb)\n /tmp/hansel/data/raw/{subject_id}/{session_id}/anat_1/{image}\n\nor if I don't need to keep a copy of ``crumb``:\n\n.. code:: python\n\n >>> crumb['image_type'] = 'anat_1'\n\n # get the paths to the images inside the anat_1 folders\n >>> anat_paths = crumb.ls('image')\n >>> pprint(anat_paths)\n [Crumb(\"/tmp/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040004/session_1/anat_1/mprage.nii.gz\"),\n ...\n\nRemember that I can still access the replaced crumb arguments in each of the previous\ncrumbs in ``anat_paths``.\n\n.. code:: python\n\n >>> subj_ids = [cr['subject_id'][0] for cr in anat_paths]\n >>> print(subj_ids)\n ['0040000', '0040001', '0040002', '0040003', '0040004', ...\n\n >>> files = [cr['image'][0] for cr in anat_paths]\n >>> print(files)\n ['mprage.nii.gz', 'mprage.nii.gz', 'mprage.nii.gz', 'mprage.nii.gz', ...\n\n\nMore features and tricks\n------------------------\n\nThere are more possibilities such as:\n\nCreating folder trees\n~~~~~~~~~~~~~~~~~~~~~\n\nUse `mktree` and `ParameterGrid` to create a tree of folders.\n\n .. code:: python\n\n >>> from hansel import mktree\n >>> from hansel.utils import ParameterGrid\n\n >>> crumb = Crumb(\"/tmp/hansel/data/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n\n >>> session_ids = [\"session_{}\".format(i) for i in range(2)]\n >>> subject_ids = [\"subj_{}\".format(i) for i in range(3)]\n\n >>> values_map = dict(session_id=session_ids, subject_id=subject_ids)\n\n >>> crumbs = mktree(crumb, list(ParameterGrid(values_map)))\n >>> pprint(crumbs)\n [Crumb(\"/tmp/hansel/data/raw/subj_0/session_0/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/subj_1/session_0/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/subj_2/session_0/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/subj_0/session_1/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/subj_1/session_1/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/raw/subj_2/session_1/{image_type}/{image}\")]\n\n\nCheck the feasibility of a crumb path\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n .. code:: python\n\n >>> crumb = Crumb(\"/tmp/hansel/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n\n # ask if there is any subject with the image 'lollipop.png'.\n >>> crumb['image'] = 'lollipop.png'\n >>> assert not crumb.exists()\n\n\nCheck which subjects have 'jujube.png' and 'toffee.png' files\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n .. code:: python\n\n >>> crumb = Crumb(\"/tmp/hansel/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n\n >>> toffee_crumb = crumb.replace(image='toffee.png')\n >>> jujube_crumb = crumb.replace(image='jujube.png')\n\n # using sets functionality\n >>> gluttons = set(toffee_crumb['subject_id']).intersection(set(jujube_crumb['subject_id']) # doctest: +SKIP\n >>> print(gluttons) # doctest: +SKIP\n ['gretel', 'hansel']\n\n\nUse the `intersection` function\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUse it for comparisons on more than one crumb argument.\nThis can be used to compare datasets with the same structure in different folders.\n\n*One argument*\n\nImagine that we have two working folders of subjects for two different projects: `proj1` and `proj2`.\nIf I want to check what subjects are common to both projects:\n\n .. code:: python\n\n >>> from hansel import intersection\n\n # using one argument\n >>> cr_proj1 = Crumb(\"/tmp/hansel/data/proj1/{subject_id}/{session_id}/{image_type}/{image}\")\n >>> cr_proj2 = Crumb(\"/tmp/hansel/data/proj2/{subject_id}/{session_id}/{image_type}/{image}\")\n\n # set the `on` argument in `intersection` to specify which crumb arguments to merge.\n >>> merged = intersection(cr_proj1, cr_proj2, on=['subject_id'])\n >>> pprint(merged)\n [(('subject_id', '0040006'),),\n (('subject_id', '0040007'),),\n (('subject_id', '0040008'),),\n (('subject_id', '0040009'),)]\n\n # I can pick these subject crumbs from this result using the `build_paths` function.\n >>> proj1_merged_paths = cr_proj1.build_paths(merged, make_crumbs=True)\n >>> type(proj1_merged_paths)\n \n\n >>> pprint(list(proj1_merged_paths))\n [Crumb(\"/tmp/hansel/data/proj1/0040006/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/proj1/0040007/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/proj1/0040008/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/proj1/0040009/{session_id}/{image_type}/{image}\")]\n\n >>> pprint(list(cr_proj2.build_paths(merged, make_crumbs=True)))\n [Crumb(\"/tmp/hansel/data/proj2/0040006/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/proj2/0040007/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/proj2/0040008/{session_id}/{image_type}/{image}\"),\n Crumb(\"/tmp/hansel/data/proj2/0040009/{session_id}/{image_type}/{image}\")]\n\n\n*Two arguments*\n\nNow, imagine that I have different sets of `{image}` for these subjects.\nI want to check which of those subjects have exactly the same images.\nLet's say that the subject `0040000` has a `anatomical.nii.gz` instead of `mprage.nii.gz`.\n\n .. code:: python\n\n >>> from hansel import intersection\n\n # using one argument\n >>> cr_proj3 = Crumb(\"/tmp/hansel/data/proj3/{subject_id}/{session_id}/anat_1/{image}\")\n >>> cr_proj4 = Crumb(\"/tmp/hansel/data/proj4/{subject_id}/{session_id}/anat_1/{image}\")\n\n # set the `on` argument in `intersection` to specify which crumb arguments to merge.\n >>> merged = intersection(cr_proj3, cr_proj4, on=['subject_id', 'image'])\n >>> pprint(merged)\n [(('subject_id', '0040001'), ('image', 'mprage.nii.gz')),\n (('subject_id', '0040002'), ('image', 'mprage.nii.gz')),\n (('subject_id', '0040003'), ('image', 'mprage.nii.gz')),\n (('subject_id', '0040004'), ('image', 'mprage.nii.gz')),\n ...\n\n # I can pick these image crumbs from this result using the `build_paths` function.\n >>> pprint(list(cr_proj3.build_paths(merged, make_crumbs=True)))\n [Crumb(\"/tmp/hansel/data/proj3/0040001/{session_id}/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/proj3/0040002/{session_id}/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/proj3/0040003/{session_id}/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/proj3/0040004/{session_id}/anat_1/mprage.nii.gz\"),\n ...\n\n >>> pprint(list(cr_proj4.build_paths(merged, make_crumbs=True)))\n [Crumb(\"/tmp/hansel/data/proj4/0040001/{session_id}/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/proj4/0040002/{session_id}/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/proj4/0040003/{session_id}/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/proj4/0040004/{session_id}/anat_1/mprage.nii.gz\"),\n ...\n\n # adding 'mod' to the intersection would be:\n >>> common_values = intersection(cr_proj3, cr_proj4, on=['subject_id', 'session_id', 'image'])\n >>> pprint(common_values, width=120)\n [(('subject_id', '0040001'), ('session_id', 'session_1'), ('image', 'mprage.nii.gz')),\n (('subject_id', '0040002'), ('session_id', 'session_1'), ('image', 'mprage.nii.gz')),\n (('subject_id', '0040003'), ('session_id', 'session_1'), ('image', 'mprage.nii.gz')),\n (('subject_id', '0040004'), ('session_id', 'session_1'), ('image', 'mprage.nii.gz')),\n ...\n\n\nThe `unfold` and `ls` functions\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUnfold the whole crumb path to get the whole file tree in a list of paths:\n\n .. code:: python\n\n >>> all_images = Crumb(\"/tmp/hansel/data/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n >>> all_images = all_images.unfold()\n >>> pprint(all_images)\n [Crumb(\"/tmp/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040000/session_1/rest_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/rest_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/session_1/rest_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040003/session_1/anat_1/mprage.nii.gz\"),\n ...\n\n # and you can ask for the value of the crumb argument in each element\n >>> print(all_images[0]['subject_id'])\n ['0040000']\n\nNote that `unfold` is the same as calling `ls` function without arguments.\n\n\nUse regular expressions\n~~~~~~~~~~~~~~~~~~~~~~~\n\nUse ``re.match`` or ``fnmatch`` expressions to filter the paths:\n\nThe syntax for crumb arguments with a regular expression is: ``\"{:}\"``\n\n .. code:: python\n\n # only the session_1 folders\n >>> session1_cr = Crumb(\"/tmp/hansel/data/raw/{subject_id}/{session_id:*_1}/{image_type}/{image}\")\n >>> session1_imgs = session1_cr.ls()\n >>> pprint(session1_imgs)\n [Crumb(\"/tmp/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040000/session_1/rest_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/rest_1/mprage.nii.gz\"),\n ...\n\nThe default is for ``fnmatch`` expressions. If you prefer using ``re.match`` for filtering,\nset the ``regex`` argument to ``'re'`` or ``'re.ignorecase'`` in the constructor.\n\n .. code:: python\n\n # only the rest images from the subject ``040000``\n >>> s0_rest_cr = Crumb(\"/tmp/hansel/data/raw/{subject_id:.*00$}/{session_id}/{image_type:rest.*}/{image}\", regex='re')\n >>> s0_rest_imgs = s0_rest_cr.ls()\n >>> print(s0_rest_imgs)\n [Crumb(\"/tmp/hansel/data/raw/0040000/session_1/rest_1/mprage.nii.gz\")]\n\nThe regular expressions can be checked with the `patterns` property.\n\n .. code:: python\n\n >>> pprint(s0_rest_cr.patterns)\n {'image_type': 'rest.*', 'subject_id': '.*00$'}\n\nAnd can be also modified with the `set_pattern` function.\n\n .. code:: python\n\n >>> s0_rest_cr.set_pattern('session_id', '.*_1$')\n >>> pprint(s0_rest_cr.patterns)\n {'image_type': 'rest.*', 'session_id': '.*_1$', 'subject_id': '.*00$'}\n >>> s0_rest_cr.path\n '/tmp/hansel/data/raw/{subject_id:.*00$}/{session_id:.*_1$}/{image_type:rest.*}/{image}'\n\n\nA regular expression can be temporarily set with the `ls` function and the `[]`\noperator.\n\n .. code:: python\n\n >>> crumb = Crumb(\"/tmp/hansel/data/raw/{subject_id}/{session_id}/{image_type}/{image}\")\n >>> mprage_crumb = crumb.ls('image:mprage.*')\n >>> pprint(mprage_crumb)\n [Crumb(\"/tmp/hansel/data/raw/0040000/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040000/session_1/rest_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/anat_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040001/session_1/rest_1/mprage.nii.gz\"),\n Crumb(\"/tmp/hansel/data/raw/0040002/session_1/anat_1/mprage.nii.gz\"),\n ...\n\n >>> pprint(crumb['image:mprage.*'])\n ['mprage.nii.gz',\n 'mprage.nii.gz',\n 'mprage.nii.gz',\n 'mprage.nii.gz',\n 'mprage.nii.gz',\n 'mprage.nii.gz',\n ...\n\n\nCopy and modify folder structure with `crumb_copy`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCopy a folder structure from one crumb to the other. The source crumb\nmust be fully specified, i.e., all crumb arguments must get an existing value.\nIn addition the destination crumb can only have a subset of the crumb arguments\nof the source crumb.\n\n .. code:: python\n\n >>> from hansel import Crumb, crumb_copy\n >>> src_cr = Crumb(\"/tmp/hansel/data/raw/{subj_id}/{sess}/{type}/{img}\")\n >>> dst_cr = Crumb(\"/tmp/hansel/data/copy/{subj_id}/{sess}/{type}\")\n >>> crumb_copy(src_cr, dst_cr)\n\n\nMore functionalities, ideas and comments are welcome.\n\n\nCommand Line\n============\n\n`hansel` will install a command called `crumb`.\nThis CLI has been made with `Click `__,\nso try `crumb -h` to see more details.\n\nYou can use `Crumb.ls`:\n\n .. code:: bash\n\n crumb ls \"/data/hansel/cobre/{sid:4*100}/{session}/{img}\"\n\n\nCopy one file tree to another file tree with `crumb copy`:\n\n .. code:: bash\n\n crumb copy \"/data/hansel/cobre/{sid}/{session}/{img}\" \"/data/hansel/cobre2/{sid}/{img}\"\n\n\nLink one file tree to another file tree with `link`:\n\n .. code:: bash\n\n crumb link \"/data/hansel/cobre/{sid}/{session}/{img}\" \"/data/hansel/cobre2/{sid}/{img}\"\n\n\nReturn the intersection between crumb1 and crumb2 on a given argument with the `intersect` function:\n\n .. code:: bash\n\n crumb intersect --on \"sid\" \"/data/hansel/cobre/{sid}/{session}/{img}\" \"/data/hansel/cobre2/{sid}/{img}\"\n\n\nReturn the difference `crumb1 - crumb2` on a given argument with the `diff` function:\n\n .. code:: bash\n\n crumb diff --on \"sid\" \"/data/hansel/cobre/{sid}/{session}/{img}\" \"/data/hansel/cobre2/{sid}/{img}\"\n\n\nDependencies\n============\n\nPlease see the requirements.txt file. Before installing this package,\ninstall its dependencies with:\n\n .. code:: bash\n\n pip install -r requirements.txt\n\n\nInstall\n=======\n\nIt works on Python 3.4, 3.5 and 2.7. For Python 2.7 install `pathlib2` as well.\n\nThis package uses setuptools. You can install it running:\n\n .. code:: bash\n\n python setup.py install\n\n\nIf you already have the dependencies listed in requirements.txt\ninstalled, to install in your home directory, use:\n\n .. code:: bash\n\n python setup.py install --user\n\nTo install for all users on Unix/Linux:\n\n .. code:: bash\n\n python setup.py build\n sudo python setup.py install\n\n\nYou can also install it in development mode with:\n\n .. code:: bash\n\n python setup.py develop\n\n\nDevelopment\n===========\n\nCode\n----\n\nGithub\n~~~~~~\n\nYou can check the latest sources with the command:\n\n .. code:: bash\n\n git clone https://www.github.com/alexsavio/hansel.git\n\n\nor if you have write privileges:\n\n .. code:: bash\n\n git clone git@github.com:alexsavio/hansel.git\n\n\nIf you are going to create patches for this project, create a branch\nfor it from the master branch.\n\nWe tag stable releases in the repository with the version number.\n\nTesting\n-------\n\nWe are using `py.test `__ to help us with the testing.\n\nOtherwise you can run the tests executing:\n\n .. code:: bash\n\n python setup.py test\n\nor\n\n .. code:: bash\n\n py.test\n\nor\n\n .. code:: bash\n\n make test\n\n\n.. |PyPI| image:: https://img.shields.io/pypi/v/hansel.svg\n :target: https://pypi.python.org/pypi/hansel\n\n.. |Build Status| image:: https://travis-ci.org/alexsavio/hansel.svg?branch=master\n :target: https://travis-ci.org/alexsavio/hansel\n\n.. |Coverage Status| image:: https://coveralls.io/repos/alexsavio/hansel/badge.svg?branch=master&service=github\n :target: https://coveralls.io/github/alexsavio/hansel?branch=master\n\n.. |Code Health| image:: https://landscape.io/github/alexsavio/hansel/master/landscape.svg?style=flat\n :target: https://landscape.io/github/alexsavio/hansel/master\n :alt: Code Health\n\n\n\nChangelog\n=========\n\nVersion 2.0.1 (25.02.2018)\n--------------------------\n\n- Add type annotations accross all code base.\n\n- Fixed documentation. Now it README example code snippets are tested.\n\n\nVersion 2.0.0 (24.02.2018)\n--------------------------\n\n- Drop support for Python 2.7. Add support for Python 3.6.\n\n\nVersion 1.0.0 - Version 1.0.2\n-----------------------------\n\n- add CLI docs to README.\n\n- set in `ls` function `make_crumbs` to False if `fullpath` is also False.\n\n- make in `ls` function `arg_name` parameter mandatory when `fullpath` is False.\n\n\nVersion 0.9.0 - 0.9.6\n---------------------\n\n- \"cli diff\" and \"cli intersect\" have the same interface.\n\n- changed how \"cli intersect\" prints results. Added 'base_crumb' option.\n\n- added to CLI default ignore list for crumbs: `['.*']`.\n\n- add `crumb diff` to CLI.\n\n- add `difference` utility function with test.\n\n- add `test__utils.py` as a WIP.\n\n- move CLI to click.\n\n- Annoying bug fixed.\n\n- Add `crumb_copy`.\n\n- Now it doesn't bother with relative paths.\n\n- Fix `crumb_copy` for existing paths and linking relative paths.\n\n- Add `crumb_copy` CLI.\n\n- Make `click` a dependency and move `crumb_copy` to `crumb copy`.\n\n- Add `crumb ls` and `crumb intersect` CLI.\n\n- Add `is_crumb_arg` function to utils.\n\n- Fix error in `crumb copy` parameter names.\n\n\nVersion 0.8.0 - 0.8.3\n---------------------\n- Set to True the default value for `check_exists` in `Crumb.ls` function.\n I don't think anybody is interested in non-existing paths.\n\n- Now it is possible to set a non-open item in a Crumb, i.e., I can replace the value for an already set crumb argument.\n\n- Update README.rst\n\n- Code clean-up.\n\n- Replace dict to OrderedDict output in `valuesmap_to_dict` function.\n\n- Add regex option within `arg_name` argument of `ls` and `__get_item__`.\n\n\nVersion 0.7.0 - 0.7.5\n---------------------\n- Refactoring of how Crumb works, now using string.Formatter.\n This will help with new features due to simpler logic.Now it is not possible to change the syntax of the Crumbs,\n although I guess nobody is interested in that.\n- Fixed a few bugs from previous versions.\n- Now `copy` function is not a classmethod anymore, so you can do `crumb.copy()` as well as `Crumb.copy(crumb)`.\n- `patterns` is not a dictionary anymore, the regexes are embedded in the `_path` string.\n The property `patterns` returns the dictionary as before. The function `set_pattern` must be used instead to set a different pattern to a given argument.\n\n- Update README.rst\n\n- Fix README.rst because of bad syntax for PyPI.\n\n- Fix bug for Python 2.7\n\n- Fix the bug in .rst for PyPI.\n\n- Code cleanup\n\n\nVersion 0.6.0 - 0.6.2\n---------------------\n- Added `intersection` function in `utils.py`.\n- Change of behaviour in `__getitem__`, now it returns a list of values even if is only the one replace string from `_argval`.\n- General renaming of the private functions inside Crumbs, more in accordance to the `open_args`/`all_args` idea.\n- Fixed a few bugs and now the generated crumbs from `unfold` and `ls` will have the same parameters as the original Crumb.\n\n- Change the behaviour or `intersection` with `len(arg_names) == 1` for compatibility with `crumb.build_path` function.\n- Improve README, update with new examples using `intersection`.\n\n- Add `pandas` helper functions.\n- Add `utils` to convert from values_maps to dicts.\n- Improve docstrings.\n\n\nVersion 0.5.0 - 0.5.5\n---------------------\n- Add Python 2.7 compatibility. Friends don't let friends use Python 2.7!\n- Add 're.ignorecase' option for the `regex` argument in the constructor.\n\n- Add `utils.check_path` function.\n- Fix `Crumb.split` function to return the not defined part of the crumb.\n\n- Add `Crumbs.keys()` function.\n- Rename `utils.remove_duplicates()` to `utils.rm_dups()`.\n\n- Deprecating `Crumbs.keys()` function.\n- Renamed `Crumbs.keys()` to `Crumbs.open_args()` and added `Crumbs.all_args()`.\n- Substitute the internal logic of Crumbs to work with `Crumbs.open_args()`, made it a bit faster.\n\n- Added CHANGES.rst to MANIFEST.in\n\n\nVersion 0.4.0 - 0.4.2\n---------------------\n- Fill CHANGES.rst.\n\n- All outputs from `Crumb.ls` function will be sorted.\n- Add regular expressions or `fnmatch` option for crumb arguments.\n- Change `exists` behaviour. Now the empty crumb arguments will return False when `exist()`.\n\n- Code clean up.\n- Fix bugs.\n\n- Fix CHANGES.rst to correct restview in PyPI.\n- Thanks to restview: https://pypi.python.org/pypi/restview.\n Use: ``restview --long-description``\n- Improve documentation in README.\n- Rename member `_argreg` to `patterns`, so the user can use it to manage the argument patterns.\n\n\nVersion 0.3.0 - 0.3.1\n---------------------\n- Add `_argval` member, a dict which stores crumb arguments replacements.\n- Add tests.\n- Remove `rm_dups` option in `Crumb.ls` function.\n- Remove conversion to `Paths` when `Crumb` has no crumb arguments in `Crumb.ls`.\n\n- Fix README.\n- Code clean up.\n\n\nVersion 0.2.0\n-------------\n- Add `ignore_list` parameter in `Crumb` constructor.\n\n\nVersion 0.1.0 - 0.1.1\n---------------------\n- Simplify code.\n- Increase test coverage.\n- Add `exist_check` to `Crumb.ls` function.\n\n- Fix bugs.\n- Add `Crumb.unfold` function.\n- Move `mktree` out of `Crumb` class.\n", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://pypi.python.org/pypi/hansel", "keywords": "", "license": "Apache 2.0", "maintainer": "", "maintainer_email": "", "name": "hansel", "package_url": "https://pypi.org/project/hansel/", "platform": "Linux/MacOSX", "project_url": "https://pypi.org/project/hansel/", "project_urls": { "Homepage": "https://pypi.python.org/pypi/hansel" }, "release_url": "https://pypi.org/project/hansel/2.0.1/", "requires_dist": null, "requires_python": "", "summary": "Easily traverse your structured folder tree.", "version": "2.0.1" }, "last_serial": 3614855, "releases": { "0.0.1": [], "0.0.2": [ { "comment_text": "", "digests": { "md5": "9ab1e5ae85061ac5ab4ad9b945e213ef", "sha256": "7866f9b8d25bf3d01991f8f4cd6bd250e5d14ddc2f629351df2db8a6bf4e7980" }, "downloads": -1, "filename": "hansel-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "9ab1e5ae85061ac5ab4ad9b945e213ef", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 10988, "upload_time": "2015-12-15T22:47:27", "url": "https://files.pythonhosted.org/packages/82/ae/1f101415d3db363f95ee862401355c821d09f7eaa73b7153059174a68368/hansel-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c23b29bb8829b2ef5765fae50e289b54", "sha256": "8406c225988360ef4e1789d392623db0fcb39eb9678350e3a9689ac1901d2ab7" }, "downloads": -1, "filename": "hansel-0.0.2.tar.gz", "has_sig": false, "md5_digest": "c23b29bb8829b2ef5765fae50e289b54", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10141, "upload_time": "2015-12-15T22:47:13", "url": "https://files.pythonhosted.org/packages/72/05/fd3f56006a2fc2723c003de1c74f8b06934f325d7081dfefc5595a6b7319/hansel-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "cd2bb82234a0da5b58a92d6837e6700e", "sha256": "a77f480a9eb7e59b1c45df1907890f885f9b5be30d405d9344f63b81e4b5b4e4" }, "downloads": -1, "filename": "hansel-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "cd2bb82234a0da5b58a92d6837e6700e", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 13280, "upload_time": "2015-12-16T15:12:14", "url": "https://files.pythonhosted.org/packages/a6/b6/436099f32b029b43ac23ece60854dc5d4450236c144b4a7b810f1433c5c6/hansel-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4ce7e0be9977cd943b587412a2166765", "sha256": "29c3ae6846fcf23a0d311311f5e96a6251a11d061eba2d4ad70a723ff28a6967" }, "downloads": -1, "filename": "hansel-0.0.3.tar.gz", "has_sig": false, "md5_digest": "4ce7e0be9977cd943b587412a2166765", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10349, "upload_time": "2015-12-16T15:12:06", "url": "https://files.pythonhosted.org/packages/9d/8c/380d9ccc91ebdc740748993e5bc18ecfc3f37ea1a0a2fe89f54bcd09c5ef/hansel-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "9c4486897f739c0cd52de45201ecacf4", "sha256": "e33e515bea34dcc4459cc7f56c7efb35c62fc6ee50274c560fdfc9b4afe563f1" }, "downloads": -1, "filename": "hansel-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9c4486897f739c0cd52de45201ecacf4", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 13804, "upload_time": "2015-12-16T18:32:26", "url": "https://files.pythonhosted.org/packages/7c/55/79cbeac06531cf7447dc770489c5cc8cf097d6291d101cad2e52d4015d26/hansel-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76e8cce920e0cf659057d106b11069e7", "sha256": "90ba4aae91dc31d6b3e8ad3bec7f10942d6bed0c9a71d7c55749ee7336ad9a54" }, "downloads": -1, "filename": "hansel-0.0.4.tar.gz", "has_sig": false, "md5_digest": "76e8cce920e0cf659057d106b11069e7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11102, "upload_time": "2015-12-16T18:32:18", "url": "https://files.pythonhosted.org/packages/83/ac/cfd07ea646e546af476de01e3d73cfebbc58a7507b0ca8e30215dcbdd918/hansel-0.0.4.tar.gz" } ], "0.1": [ { "comment_text": "", "digests": { "md5": "29c91ec1fbdb9b5cd1313fbc898c260d", "sha256": "ed4d0fbb0bd2a4df57ecb4f9276daef7d1871d9b903f8cd04f9ac1a140a0d37c" }, "downloads": -1, "filename": "hansel-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "29c91ec1fbdb9b5cd1313fbc898c260d", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 14432, "upload_time": "2015-12-21T23:06:32", "url": "https://files.pythonhosted.org/packages/99/06/99587ab4b3ea0ce05ccc2564bca989dbf4731ad37383b42f397808db8c2c/hansel-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6320070d862241566c0f17fe1e28ae70", "sha256": "845da75884419f2066225f562718e18ca2730588762ffab05534b41a69c89551" }, "downloads": -1, "filename": "hansel-0.1.tar.gz", "has_sig": false, "md5_digest": "6320070d862241566c0f17fe1e28ae70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13861, "upload_time": "2015-12-21T23:06:20", "url": "https://files.pythonhosted.org/packages/51/c3/1b9863034aa2b969f5a5e429aff7b302cad702d3c276f8681a3ae913b49f/hansel-0.1.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "91bd704f4a9f2d254dc08855961cf78c", "sha256": "ddc3503a361417247857fde785aad6c060f7528b5c62ee68e2b1914c09d5901b" }, "downloads": -1, "filename": "hansel-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "91bd704f4a9f2d254dc08855961cf78c", "packagetype": "bdist_wheel", "python_version": "3.4", "requires_python": null, "size": 14460, "upload_time": "2015-12-21T23:09:35", "url": "https://files.pythonhosted.org/packages/3d/38/f5f3dcba38a9c8e219a34faaf85b9f34a7f70a020c28271f2921d416e81f/hansel-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c851571c06ec86c3e2ef6011c66a2674", "sha256": "d3eaff38fb49c2a4b3531b15833503515e64e3e1641673f6547c4839f84abb46" }, "downloads": -1, "filename": "hansel-0.1.0.tar.gz", "has_sig": false, "md5_digest": "c851571c06ec86c3e2ef6011c66a2674", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13868, "upload_time": "2015-12-21T23:09:26", "url": "https://files.pythonhosted.org/packages/9d/eb/dc328fc0ad25c9beb2a14ced90d467687b2776651c8b1de4b8f56caf4f8c/hansel-0.1.0.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "9df54aeeef03cc5c6e1f75fa07a3de45", "sha256": "fa2a9bed2f940729e0ece26a4c3242cf54f8063285d9a8ff4b2e4802110107f2" }, "downloads": -1, "filename": "hansel-0.1.1-py3-none-any.whl", "has_sig": false, "md5_digest": "9df54aeeef03cc5c6e1f75fa07a3de45", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 15759, "upload_time": "2016-01-02T13:40:15", "url": "https://files.pythonhosted.org/packages/92/6f/f9f7968c27480023dadf1f9d15f654a666d902c1dbd9b1ae8598b92924fc/hansel-0.1.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a4f6878adfb1b4511fc4dc834a80f363", "sha256": "991738ca5ab77b615f547b6272dea9f1a568b39b418bd86955a7c30644dcf195" }, "downloads": -1, "filename": "hansel-0.1.1.tar.gz", "has_sig": false, "md5_digest": "a4f6878adfb1b4511fc4dc834a80f363", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14574, "upload_time": "2016-01-02T13:39:51", "url": "https://files.pythonhosted.org/packages/cd/70/c65ccd2be5e44dbb5c19aa47dbc029f1d7bc856b808f034a521146260c0e/hansel-0.1.1.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "50d142cfaa56e4b4b7f5d3ffe97f77a9", "sha256": "4cc109fbeb61ee0e85392bd7cf8d61548005d6c6f05d4dc4d9fdd6fbb893c4e7" }, "downloads": -1, "filename": "hansel-0.2.0-py3-none-any.whl", "has_sig": false, "md5_digest": "50d142cfaa56e4b4b7f5d3ffe97f77a9", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17164, "upload_time": "2016-01-05T10:38:28", "url": "https://files.pythonhosted.org/packages/3d/66/2ee9755f40702194e7ae3a0647132c726fff01fe3e18de61a683cca62927/hansel-0.2.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b2d82cd6d0ebb2e964b7a92adbc45c12", "sha256": "085ade3fa457493a54f2213a9b188e24b6508ed9d7deff685cd6300a4cb14e61" }, "downloads": -1, "filename": "hansel-0.2.0.tar.gz", "has_sig": false, "md5_digest": "b2d82cd6d0ebb2e964b7a92adbc45c12", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12954, "upload_time": "2016-01-05T10:37:58", "url": "https://files.pythonhosted.org/packages/b4/ca/623bd114e32b7e8fccb908b910a812b595d59ce93eaa3de69c07d46e9fbe/hansel-0.2.0.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "670280a0f7285a73f0507ef659b58e28", "sha256": "f031aa5eff4d1942a42b1f893c3e273c2e32d7de46561b86d93665a04f3156ce" }, "downloads": -1, "filename": "hansel-0.3.0-py3-none-any.whl", "has_sig": false, "md5_digest": "670280a0f7285a73f0507ef659b58e28", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17031, "upload_time": "2016-01-12T14:32:17", "url": "https://files.pythonhosted.org/packages/82/19/3ae25e136e4496355c7cb387e9b61daf4313bcaf5bc484048d3b5c7e90bf/hansel-0.3.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27e8179c3ced43385d9173d8bfab7db2", "sha256": "b92e60c21965530e22ef98ba2024392ac986a6bc737ecb9e5ce32059b2b27f6e" }, "downloads": -1, "filename": "hansel-0.3.0.tar.gz", "has_sig": false, "md5_digest": "27e8179c3ced43385d9173d8bfab7db2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12852, "upload_time": "2016-01-12T14:32:07", "url": "https://files.pythonhosted.org/packages/e6/49/5e0ee47b8ebf1cea8913437afadba622a0e3c8704925d64994ce3ae4fe3c/hansel-0.3.0.tar.gz" } ], "0.3.1": [ { "comment_text": "", "digests": { "md5": "63723892e171602df944e23da9809334", "sha256": "e9bd5712fd58ff301c1ef50827c2c172c16ec5d4eba95fbc3819d2ac2770853a" }, "downloads": -1, "filename": "hansel-0.3.1-py3-none-any.whl", "has_sig": false, "md5_digest": "63723892e171602df944e23da9809334", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 17749, "upload_time": "2016-01-12T15:25:16", "url": "https://files.pythonhosted.org/packages/0e/ba/32a48b370ab453a5fbfc41442c9ac4c774428f5dd82ceccc72d09e13b9fc/hansel-0.3.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f0f3aa283be896e357da562f6e3526ab", "sha256": "b68c37b8e5bcf4af0771d2fcbce943df0f14b5f96a8db572f32c8da1fc79f325" }, "downloads": -1, "filename": "hansel-0.3.1.tar.gz", "has_sig": false, "md5_digest": "f0f3aa283be896e357da562f6e3526ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13333, "upload_time": "2016-01-12T15:24:56", "url": "https://files.pythonhosted.org/packages/7c/41/d59c5b1d0d7f437a7a91902acb0063a258cae98397b46cb25f84232a0c75/hansel-0.3.1.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "b91edd8cc224be58265f42f9978acca6", "sha256": "095434aa70996cbef5eb8bc6989c0ad71e19123cb398d291789b7e94983e2a45" }, "downloads": -1, "filename": "hansel-0.4.0-py3-none-any.whl", "has_sig": false, "md5_digest": "b91edd8cc224be58265f42f9978acca6", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 19528, "upload_time": "2016-01-22T10:20:26", "url": "https://files.pythonhosted.org/packages/f4/45/411f44128fcad3256934efbdf29abea9f4bd699984267bd3e4850d51633e/hansel-0.4.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e697fec3ba5672fff5d1dc7112b53727", "sha256": "5c775a7709f8862b09fc66c39eb8a7784a05e758aff0a709fb56ef5333f9f896" }, "downloads": -1, "filename": "hansel-0.4.0.tar.gz", "has_sig": false, "md5_digest": "e697fec3ba5672fff5d1dc7112b53727", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14684, "upload_time": "2016-01-22T10:19:56", "url": "https://files.pythonhosted.org/packages/46/32/52f8ef49492e8d82bed1b9e1c4fd47efe7249bd853433e8b7c41db585991/hansel-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "dbbfed6bb170d8f0f5ebc8f4d5ad5fa6", "sha256": "68e9c1cc3c789e2461b3a9926efa8247920440b0a46c14040323df67bc0d73e4" }, "downloads": -1, "filename": "hansel-0.4.1-py3-none-any.whl", "has_sig": false, "md5_digest": "dbbfed6bb170d8f0f5ebc8f4d5ad5fa6", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 19598, "upload_time": "2016-01-22T10:43:51", "url": "https://files.pythonhosted.org/packages/3b/c1/9df9fa1d3e3e709a15ee44fb5195420c8e419424b1dd32c1a10ba918e90e/hansel-0.4.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c687895b2142e6b3ffcdd6be6f4e2e99", "sha256": "ab44600b4fb051b61c3772f5837f585024041a6070eac9d0ea782bf300796ecc" }, "downloads": -1, "filename": "hansel-0.4.1.tar.gz", "has_sig": false, "md5_digest": "c687895b2142e6b3ffcdd6be6f4e2e99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14731, "upload_time": "2016-01-22T10:43:45", "url": "https://files.pythonhosted.org/packages/91/03/b1a500d00e68ed06484240824e0c7a48f7403b58866ee84210a68770bc54/hansel-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "7073c225484c3e2246f1bcbfd0e30506", "sha256": "baa1c3194c3c1aa634de2f713ae3adc065ab0c79d6f760f6fea7330f3462eac9" }, "downloads": -1, "filename": "hansel-0.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "7073c225484c3e2246f1bcbfd0e30506", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 21496, "upload_time": "2016-01-24T15:44:38", "url": "https://files.pythonhosted.org/packages/47/ed/a6829fe23f2bf718f00e639d4d4b0fef2f8e2827dd979e802f890fb0f306/hansel-0.4.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6c08af1d2bc924517bbab642c994d62a", "sha256": "1e5b02fcd8b6d532cdb4ca92fe2382bdb87d0d795f43667e182179936b123fc5" }, "downloads": -1, "filename": "hansel-0.4.2.tar.gz", "has_sig": false, "md5_digest": "6c08af1d2bc924517bbab642c994d62a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19960, "upload_time": "2016-01-24T15:44:28", "url": "https://files.pythonhosted.org/packages/57/0e/347701323834696565d13a6926ecdddbdaa55c39374477f418d0a9bbba46/hansel-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "1d3e4dc4f9b47bfa4fe694d9844d4a02", "sha256": "e83bf3027cb2e26b7ba8519686bde0ce6e671dc35aa4fe3931c93fc40e322d87" }, "downloads": -1, "filename": "hansel-0.5.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1d3e4dc4f9b47bfa4fe694d9844d4a02", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 21582, "upload_time": "2016-01-24T18:46:09", "url": "https://files.pythonhosted.org/packages/2e/82/95369b62f1394f8e7e21612bb7858651b029bbb0ca758fba6fc51986adc5/hansel-0.5.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a83a50a66062a7901f892fa0fc14dba4", "sha256": "2514a068f779a7315aa6c424fef585f2d2485d474a3ffe85a3040c79671ef17e" }, "downloads": -1, "filename": "hansel-0.5.0.tar.gz", "has_sig": false, "md5_digest": "a83a50a66062a7901f892fa0fc14dba4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20021, "upload_time": "2016-01-24T18:45:55", "url": "https://files.pythonhosted.org/packages/08/97/5029676052f7b513141f9f250b89b4686daab6946f9ffe6f31cdeb5bece4/hansel-0.5.0.tar.gz" } ], "0.5.1": [ { "comment_text": "", "digests": { "md5": "0956b69b1a3fa76862391073e2c1d8d6", "sha256": "7d8adfe22652f2ed6579acac83cbed60db5784f66503a2f2538fdd8a26f29e51" }, "downloads": -1, "filename": "hansel-0.5.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0956b69b1a3fa76862391073e2c1d8d6", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 21875, "upload_time": "2016-01-27T14:21:15", "url": "https://files.pythonhosted.org/packages/11/92/64a341cc9f2b87d13a3dfb879468705e07b52a266c4dc801293b4aa6c589/hansel-0.5.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "311b71c17cba2e916f69605ac33f909b", "sha256": "b6bddba8e529114aa9d0a2a41c2c55896a19c57898ee2159127a37f7418ac112" }, "downloads": -1, "filename": "hansel-0.5.1.tar.gz", "has_sig": false, "md5_digest": "311b71c17cba2e916f69605ac33f909b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16534, "upload_time": "2016-01-27T14:20:47", "url": "https://files.pythonhosted.org/packages/9f/b0/b647cf8659838cdc3fa59d7586506da42df1f9023514f604ce4b28e52cbf/hansel-0.5.1.tar.gz" } ], "0.5.2": [ { "comment_text": "", "digests": { "md5": "eb4a9c222125ced4d586d8265e649a65", "sha256": "c82c208037feb883e73555bb3dde90fb4866b21a2ab4f89d07b99b85c5b51f96" }, "downloads": -1, "filename": "hansel-0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "eb4a9c222125ced4d586d8265e649a65", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 22406, "upload_time": "2016-02-01T14:28:29", "url": "https://files.pythonhosted.org/packages/df/87/5773f67db7bcbe8d2bbe2a1e5c9e8640aa53acaa3388811b838ebb5dd09d/hansel-0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7cca0546d8dd7e39b20633810e116316", "sha256": "ee1ba0740b3b0238e3610cce690993bd54ad502dc9cc9e69dc53bcd839839894" }, "downloads": -1, "filename": "hansel-0.5.2.tar.gz", "has_sig": false, "md5_digest": "7cca0546d8dd7e39b20633810e116316", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16746, "upload_time": "2016-02-01T14:28:20", "url": "https://files.pythonhosted.org/packages/96/b6/5e73eaac2dc003d8effeb71580cdeb0ce2aa1335359079201520406ecf1b/hansel-0.5.2.tar.gz" } ], "0.5.3": [ { "comment_text": "", "digests": { "md5": "8853a3fa279d801ae0e8b3df3787d710", "sha256": "03a448e253666ac8be571fd3362147fa001c68ecd68e1c589f5843dea2ba1d4f" }, "downloads": -1, "filename": "hansel-0.5.3.tar.gz", "has_sig": false, "md5_digest": "8853a3fa279d801ae0e8b3df3787d710", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16931, "upload_time": "2016-02-04T17:30:03", "url": "https://files.pythonhosted.org/packages/73/56/448108ce11b9581c0f8e445ce76d4ef6b84d9c066689b1b86f12b8deab45/hansel-0.5.3.tar.gz" } ], "0.5.4": [ { "comment_text": "", "digests": { "md5": "d786b06c47c29a6893908fb698f181f8", "sha256": "11255da6f93318a557e952ed8bc949eb53339f70f894f7e1bdebd6a05a5e47f2" }, "downloads": -1, "filename": "hansel-0.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "d786b06c47c29a6893908fb698f181f8", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 23260, "upload_time": "2016-02-05T16:10:36", "url": "https://files.pythonhosted.org/packages/00/7e/9350714506160c343aac60048aebd6df96df2343fa00dfc026a042a52bff/hansel-0.5.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "cc0b4a8fef568c739dcc87351e74414b", "sha256": "7966b77e9bddef649838e5230a8930b412ba80353375bd8a320fd3c0d1473669" }, "downloads": -1, "filename": "hansel-0.5.4.tar.gz", "has_sig": false, "md5_digest": "cc0b4a8fef568c739dcc87351e74414b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 17600, "upload_time": "2016-02-05T16:10:12", "url": "https://files.pythonhosted.org/packages/08/51/be9ac8f7fd8a3778cff23d2379f92de2365743823600624dee9c436283ec/hansel-0.5.4.tar.gz" } ], "0.5.5": [ { "comment_text": "", "digests": { "md5": "9570ee46b66199e14e7286b0bd1326ed", "sha256": "b3d2f7fada0293a5388dedc7be91b5b075b43415bab869e1306ea6db9cc391de" }, "downloads": -1, "filename": "hansel-0.5.5-py3-none-any.whl", "has_sig": false, "md5_digest": "9570ee46b66199e14e7286b0bd1326ed", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 23301, "upload_time": "2016-02-08T15:46:27", "url": "https://files.pythonhosted.org/packages/20/d6/49ef77c05d0bdc3cbf89e64059b9f8f30ed87ac09ebb8887064e360b5875/hansel-0.5.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b5c9e52dd7b9086e4c2309c60546593", "sha256": "b5717c6dd206aaaf543a9d139c5acf140307eb08ffe571e1a6f5a7398e98f582" }, "downloads": -1, "filename": "hansel-0.5.5.tar.gz", "has_sig": false, "md5_digest": "8b5c9e52dd7b9086e4c2309c60546593", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 18324, "upload_time": "2016-02-08T15:46:20", "url": "https://files.pythonhosted.org/packages/69/4d/e710ad4f99f2239c87d21d6b0ba90e30423f0add0981f3b4bb6796676e19/hansel-0.5.5.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "7a53058777d4d14abcddaf30f08f0b58", "sha256": "e39337bfb7593a5246ba93ad8a40f68e241104edf9bdbac45e1167fae31fd426" }, "downloads": -1, "filename": "hansel-0.6.0-py3-none-any.whl", "has_sig": false, "md5_digest": "7a53058777d4d14abcddaf30f08f0b58", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 25452, "upload_time": "2016-02-11T10:35:58", "url": "https://files.pythonhosted.org/packages/15/c9/6a84c984f5c9c5297f5ae99d45933d7c58fb99f7770920d24a981dd3127b/hansel-0.6.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bcbe404e683ad166452f6f6d993582a9", "sha256": "4105ba660c8c28cac355e998d50a8d95fb324e9bda36121f02c987a59e469acc" }, "downloads": -1, "filename": "hansel-0.6.0.tar.gz", "has_sig": false, "md5_digest": "bcbe404e683ad166452f6f6d993582a9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20278, "upload_time": "2016-02-11T10:35:53", "url": "https://files.pythonhosted.org/packages/cb/06/e2049194c6cf22ae3dee81f04a39c762ebf061b42705faf05dea1345966f/hansel-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "e3a30847a175be5effbd9c94ce956299", "sha256": "2cef980ea849ad4e15ebcbf83b9462255dcfa364d204c23f6a41e3a3920380b8" }, "downloads": -1, "filename": "hansel-0.6.1-py3-none-any.whl", "has_sig": false, "md5_digest": "e3a30847a175be5effbd9c94ce956299", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 26924, "upload_time": "2016-02-11T12:17:08", "url": "https://files.pythonhosted.org/packages/53/9e/2ff2431eba975b7fd944ebb61585976d2911c4dc98fab270ebdadd9705e2/hansel-0.6.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4b8a7ea5248a089e5a4f7bbb45c7e99", "sha256": "47dbb7964506defada9f8894faf99ebce4f0e2c515d1c998cf580ad2955a1ff7" }, "downloads": -1, "filename": "hansel-0.6.1.tar.gz", "has_sig": false, "md5_digest": "d4b8a7ea5248a089e5a4f7bbb45c7e99", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23389, "upload_time": "2016-02-11T12:16:57", "url": "https://files.pythonhosted.org/packages/78/c8/f71cc3f5f4679e168add194c55e5f599b07667bab065d93756dabaf9c670/hansel-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "4ded99f66996569786182f9b8e0e56ea", "sha256": "03bb6220a723334bbd1cfbf4b4f0566bf7faf15c285b34ad186bd570d5ddf774" }, "downloads": -1, "filename": "hansel-0.6.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4ded99f66996569786182f9b8e0e56ea", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 28755, "upload_time": "2016-02-16T14:11:56", "url": "https://files.pythonhosted.org/packages/74/65/a4c09ce5ef169db95a70c5db80ae123bcfc08a85174da0914289070f9d15/hansel-0.6.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "90769575f8c78d6bff3ca8baa77240dc", "sha256": "a3cbe780436a6d25902eddfdf38b447929b5b711d2d14b280cb59bdfaf236537" }, "downloads": -1, "filename": "hansel-0.6.2.tar.gz", "has_sig": false, "md5_digest": "90769575f8c78d6bff3ca8baa77240dc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 24814, "upload_time": "2016-02-16T14:11:48", "url": "https://files.pythonhosted.org/packages/ac/47/5c3831b79031faad9e9ca4d8474ff8e2b1790be304da8f61b23234068d03/hansel-0.6.2.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "a174e989fb7ccf49582f6bad6105f0de", "sha256": "148c93de4d368d06eeee2aeeb1f76c661d506421280f103ba280a8926024426d" }, "downloads": -1, "filename": "hansel-0.7.0.tar.gz", "has_sig": false, "md5_digest": "a174e989fb7ccf49582f6bad6105f0de", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25435, "upload_time": "2016-02-24T16:52:07", "url": "https://files.pythonhosted.org/packages/b9/35/5216172f4bf0a0f43c0bfbe18b24acb13c1ca3cd61ef6a9cf12809ef00a6/hansel-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "0b3ba5b7d267cd16a49bcf8136428d69", "sha256": "848bfa769ff35977cb517f76fa578b8d5906810a1d6a40a0ac381ef3d28f1b21" }, "downloads": -1, "filename": "hansel-0.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "0b3ba5b7d267cd16a49bcf8136428d69", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 29550, "upload_time": "2016-02-24T16:59:25", "url": "https://files.pythonhosted.org/packages/55/52/0d36690a4ac828d3522977b226fbb3e268962c31d594e83d07f3467459c2/hansel-0.7.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "28b183ce9d208f1750f694d29216ef86", "sha256": "f3a2f9e60a0f768c1faaa5c9f1e138150bc46ad382ccb5b259d5c7a911a61a94" }, "downloads": -1, "filename": "hansel-0.7.1.tar.gz", "has_sig": false, "md5_digest": "28b183ce9d208f1750f694d29216ef86", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25838, "upload_time": "2016-02-24T16:59:19", "url": "https://files.pythonhosted.org/packages/4b/a3/e1a091287bb81c1e9a53bb41c08703a70e49a4fbe850e3f552afba32cce0/hansel-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "591128a1e6221a55a067c6b7124a9c5e", "sha256": "60cfcc0247b6a9ec90bcf94495ee0f1a46e0292e611bdb12f708124e846153c0" }, "downloads": -1, "filename": "hansel-0.7.2-py3-none-any.whl", "has_sig": false, "md5_digest": "591128a1e6221a55a067c6b7124a9c5e", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 29548, "upload_time": "2016-02-24T17:04:01", "url": "https://files.pythonhosted.org/packages/7c/f5/09a4c4b0603ce04b11f985735a7bb65a02b3610e3c983fc6968bbd8f41dc/hansel-0.7.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5537fd4f78b9de19dd5ec65d62e664ed", "sha256": "cd3c690a12e07cd38d9f1457ada1369525f6f491d3b0d675378076058fe9f363" }, "downloads": -1, "filename": "hansel-0.7.2.tar.gz", "has_sig": false, "md5_digest": "5537fd4f78b9de19dd5ec65d62e664ed", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 25824, "upload_time": "2016-02-24T17:03:54", "url": "https://files.pythonhosted.org/packages/5e/01/7fe84f23eb80c8f4a4f4214dead86cee11466783104015e64880f0ce4224/hansel-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "f9538f2097faba7d13d63add4a18c656", "sha256": "3ffe125a3a3afe43d85f8932bbdcc0f6089c15c893e8816ba1c8f354048ec3cf" }, "downloads": -1, "filename": "hansel-0.7.3-py3-none-any.whl", "has_sig": false, "md5_digest": "f9538f2097faba7d13d63add4a18c656", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 29605, "upload_time": "2016-02-24T23:47:20", "url": "https://files.pythonhosted.org/packages/61/8d/7fdf49597c6b6e0765f300063addea333930cddd1b8cd5cf2f49d39f584f/hansel-0.7.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d07339b3c6303a1b9d812e78668806d7", "sha256": "f5170d4af91719b3cd0eaea93599fbea81f7bd16ebcd8a87bd3703097089970b" }, "downloads": -1, "filename": "hansel-0.7.3.tar.gz", "has_sig": false, "md5_digest": "d07339b3c6303a1b9d812e78668806d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27736, "upload_time": "2016-02-24T23:47:14", "url": "https://files.pythonhosted.org/packages/ec/a1/59b7e1f80e6fa227e5b041fc996d2032045ed833e3d671e4f9f54b3466ca/hansel-0.7.3.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "0a88ee59dcfc26509c5e2cda07c17784", "sha256": "0ec34ce8c082a7697b8a01373dc7e5f057d4b398d20cf613ab21a24d95ff5212" }, "downloads": -1, "filename": "hansel-0.7.4-py3-none-any.whl", "has_sig": false, "md5_digest": "0a88ee59dcfc26509c5e2cda07c17784", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 29635, "upload_time": "2016-02-24T23:56:58", "url": "https://files.pythonhosted.org/packages/62/fc/08e025bf564ddca5a0a157c32bbafc05ac0d01ff010796816747392c9e12/hansel-0.7.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "358116a88f59ed5889d715b4e40e2f85", "sha256": "18e41eb53b91872779dfa2a2b3c4b366c6fe6d0d873463ecbfd28bac14ee2cc8" }, "downloads": -1, "filename": "hansel-0.7.4.tar.gz", "has_sig": false, "md5_digest": "358116a88f59ed5889d715b4e40e2f85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 27778, "upload_time": "2016-02-24T23:56:51", "url": "https://files.pythonhosted.org/packages/f9/b0/0e6ae1196850d63dce60a755329d20fb5d6ce1791bdcac7af7f2423f09f0/hansel-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "458f5543476e2b9518e077e6af7687e6", "sha256": "20e6cfd91bcc60e877275b6e3b0365eb1de7264d013ed619c76a61fb368bf5a2" }, "downloads": -1, "filename": "hansel-0.7.5-py3-none-any.whl", "has_sig": false, "md5_digest": "458f5543476e2b9518e077e6af7687e6", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 29871, "upload_time": "2016-03-06T20:28:12", "url": "https://files.pythonhosted.org/packages/56/a7/ba2736bef161de2316f6f3d190c3acb01abd079a956b5d1b0c527b5f402b/hansel-0.7.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1357a6b64b88f4980098892c7addad67", "sha256": "37b020472c30e0c0309e933a19d822f7cdb28fc716459b4e6ce514ca20a19c0d" }, "downloads": -1, "filename": "hansel-0.7.5.tar.gz", "has_sig": false, "md5_digest": "1357a6b64b88f4980098892c7addad67", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28023, "upload_time": "2016-03-06T20:27:58", "url": "https://files.pythonhosted.org/packages/6f/12/3efc25704ee6bd7f7fdd101b0656f097b77f2dbe806858932747e4969717/hansel-0.7.5.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "9372f42bd055ad590eef425e7dda5799", "sha256": "5286cbeceaf0e97d84df2ad83a15da1ea1db8af34a9b18d7ca5b57997a05f71c" }, "downloads": -1, "filename": "hansel-0.8.0-py3-none-any.whl", "has_sig": false, "md5_digest": "9372f42bd055ad590eef425e7dda5799", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 30086, "upload_time": "2016-03-16T11:08:51", "url": "https://files.pythonhosted.org/packages/6e/7d/59775d45a6ddd540a0134306dd04a453b637f111661dfdc130dacbd3b3e7/hansel-0.8.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1edda8dffe032ecc316ada0940fff11c", "sha256": "f65ddf336fc5a5991560d2f08805363897c6bd1b6f0ae88cab52ba9a11371f12" }, "downloads": -1, "filename": "hansel-0.8.0.tar.gz", "has_sig": false, "md5_digest": "1edda8dffe032ecc316ada0940fff11c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26371, "upload_time": "2016-03-16T11:08:35", "url": "https://files.pythonhosted.org/packages/74/04/cac2d165fee1103bb525e816939120413fd449afab2990018ef5d0acca4f/hansel-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "6f86aa49119805d5210a1cd218088ee4", "sha256": "66852918c5ea051153626933b2c318896a95409778fa83ebc77e058673d75007" }, "downloads": -1, "filename": "hansel-0.8.1-py3-none-any.whl", "has_sig": false, "md5_digest": "6f86aa49119805d5210a1cd218088ee4", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 30283, "upload_time": "2016-04-18T13:15:27", "url": "https://files.pythonhosted.org/packages/9a/3b/dfceb4a65d640226201a527820cdd0dc7480c9b2000c4d74986e7389840b/hansel-0.8.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "76067bc0715838630d38c08b6f807da0", "sha256": "d29eb301ab870a8124c9f5b76f0b86eb8780f2b9b601c7b10e1f4b551590cffa" }, "downloads": -1, "filename": "hansel-0.8.1.tar.gz", "has_sig": false, "md5_digest": "76067bc0715838630d38c08b6f807da0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30992, "upload_time": "2016-04-18T13:14:58", "url": "https://files.pythonhosted.org/packages/ad/a8/b9dc0f080a0f08468012bd26d806da79a7b1932166c664d59b6f9a63b241/hansel-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "4e21f7b0fbbc8463e665c68f29c99936", "sha256": "4b30f649c6583650ed50c4b85d8165c115552a1d36bfd8b054d75bd448acc127" }, "downloads": -1, "filename": "hansel-0.8.2.tar.gz", "has_sig": false, "md5_digest": "4e21f7b0fbbc8463e665c68f29c99936", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31451, "upload_time": "2016-06-07T10:16:07", "url": "https://files.pythonhosted.org/packages/4e/05/0496f7460921acb171818ad49ea66587ea08aea7db18773ea07dab46b974/hansel-0.8.2.tar.gz" } ], "0.8.3": [ { "comment_text": "", "digests": { "md5": "22accaad0a3babb29c25f5949877e679", "sha256": "65fa489affba1b005a9974a7f6cedef25dffcc0d021a71b8f0f38552fd37bd16" }, "downloads": -1, "filename": "hansel-0.8.3.tar.gz", "has_sig": false, "md5_digest": "22accaad0a3babb29c25f5949877e679", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31872, "upload_time": "2016-06-07T10:30:48", "url": "https://files.pythonhosted.org/packages/41/1e/f537a1120cdcb523def9aba9f7289325ea798a50dd4a854755365d4ad8d7/hansel-0.8.3.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "1b6df75b5821ec2447fd8f7813ff1b8f", "sha256": "6ed90d7f0fc58cb25c95adc366f31bf6cbd208b11ed3f9d2f88bbe3c425ab53a" }, "downloads": -1, "filename": "hansel-0.9.0-py3-none-any.whl", "has_sig": false, "md5_digest": "1b6df75b5821ec2447fd8f7813ff1b8f", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 31076, "upload_time": "2016-06-14T16:57:14", "url": "https://files.pythonhosted.org/packages/c6/3c/a4c2e7c4022245ff13d5f7fdb70b451be7ea4fe8f332a7df2b31c2c3742a/hansel-0.9.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c9067f9a9bd3c0d6152d8d857c1dd5e1", "sha256": "e5d353850aa5b0562fe66032c4d01cde780d8ace78231c8286e4417481903743" }, "downloads": -1, "filename": "hansel-0.9.0.tar.gz", "has_sig": false, "md5_digest": "c9067f9a9bd3c0d6152d8d857c1dd5e1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 32099, "upload_time": "2016-06-14T16:56:22", "url": "https://files.pythonhosted.org/packages/71/ee/c9f020581ac7d97fbdaa436e11d95953efabfc8fc6dffaa8b1b4b607dc13/hansel-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "aab1d0939d916cdd3bc802d7bdfad6f8", "sha256": "cfd8e14288777ec0d23c5fb7fbd020c9849debfdcbcfd759c8552725753498ba" }, "downloads": -1, "filename": "hansel-0.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "aab1d0939d916cdd3bc802d7bdfad6f8", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 32167, "upload_time": "2016-07-20T08:57:11", "url": "https://files.pythonhosted.org/packages/83/e6/b2665f9c87f504086ee25ba4b7d46bf067c3a06d1730a809208888384af1/hansel-0.9.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "13ef66a2eed4cc212c28dd784398bed1", "sha256": "d7803dd0e413756184d1810c6c77a662053aa7dd3d0502529705f06b2a929419" }, "downloads": -1, "filename": "hansel-0.9.1.tar.gz", "has_sig": false, "md5_digest": "13ef66a2eed4cc212c28dd784398bed1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 30683, "upload_time": "2016-07-20T08:57:08", "url": "https://files.pythonhosted.org/packages/90/2b/1b4e9b38d66ca55e3c498850dcbf46b6fe9c8e018941be23c9c48de203da/hansel-0.9.1.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "8355cefd049d35bc8db57abd6d6ba78e", "sha256": "54bc0e139ed8d4674152b7b98b7fe2d083d3f18b28493491c6aaca1ae673ed3b" }, "downloads": -1, "filename": "hansel-0.9.3-py3-none-any.whl", "has_sig": false, "md5_digest": "8355cefd049d35bc8db57abd6d6ba78e", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 34607, "upload_time": "2016-09-19T13:50:02", "url": "https://files.pythonhosted.org/packages/4f/ff/ed08ffe120bf6c4637b4bf6a95ec0d17691ea96abb723234cca0dd0fc3ec/hansel-0.9.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "d4f0e99f7172e6b83a326c13e538a79c", "sha256": "a860a5a4d1d61871bf27c695784418c7e48a2dcfac402fe032d8ae4ecf20f7eb" }, "downloads": -1, "filename": "hansel-0.9.3.tar.gz", "has_sig": false, "md5_digest": "d4f0e99f7172e6b83a326c13e538a79c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35555, "upload_time": "2016-09-19T13:49:48", "url": "https://files.pythonhosted.org/packages/b2/1e/6f1933aa9dd91ca974e3d9cfc8ef9a75ae57b22bae102f222f8f1ac29d9b/hansel-0.9.3.tar.gz" } ], "0.9.4": [ { "comment_text": "", "digests": { "md5": "9872823ab6862e1bbc2343ef04c5a06b", "sha256": "26e7412abf1f345ccd3e009ada4be7a4c4a8d836c0d5c708d3f3f5eab26f512a" }, "downloads": -1, "filename": "hansel-0.9.4-py2-none-any.whl", "has_sig": false, "md5_digest": "9872823ab6862e1bbc2343ef04c5a06b", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 34747, "upload_time": "2016-09-20T11:53:20", "url": "https://files.pythonhosted.org/packages/50/5c/30a1a0aa7e07e76522acb7c9d09763221516a41614b769a70d4538056ab5/hansel-0.9.4-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7c9567d1616de77946fb7305ecca4f0b", "sha256": "6769978511a40559755eecc72444afcadb8e50abd40b4bf6bbe508bd2ce56586" }, "downloads": -1, "filename": "hansel-0.9.4.tar.gz", "has_sig": false, "md5_digest": "7c9567d1616de77946fb7305ecca4f0b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 35768, "upload_time": "2016-09-20T11:53:17", "url": "https://files.pythonhosted.org/packages/c0/69/17539d5627a062fca56a372827f6afeff4b54a338cbc029411f34bfb420d/hansel-0.9.4.tar.gz" } ], "0.9.5": [ { "comment_text": "", "digests": { "md5": "737955a390e71ffd9ff18d2e8149b628", "sha256": "d586cc385b010f2141445514b890caee7f5df033294ae9da8e34ad3f009d9579" }, "downloads": -1, "filename": "hansel-0.9.5-py3-none-any.whl", "has_sig": false, "md5_digest": "737955a390e71ffd9ff18d2e8149b628", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 34977, "upload_time": "2016-10-01T13:37:10", "url": "https://files.pythonhosted.org/packages/a2/e2/69fdea47dbc264db993f88720ea1e28923e9849e969af3f28ebd48cdac4a/hansel-0.9.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "db733b3fd3b0abed716ab96039688d52", "sha256": "6b157fd46644707407848a1e0663314ac9294469e40a7918f6c84f96a3f0150a" }, "downloads": -1, "filename": "hansel-0.9.5.tar.gz", "has_sig": false, "md5_digest": "db733b3fd3b0abed716ab96039688d52", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 33887, "upload_time": "2016-10-01T13:37:07", "url": "https://files.pythonhosted.org/packages/77/c3/11584890880b704ba0ccc6f01812807536dfebb1e868e4db614d864630b7/hansel-0.9.5.tar.gz" } ], "0.9.6": [ { "comment_text": "", "digests": { "md5": "aa005a424b3bc6d963ed74efbf482af6", "sha256": "73a3212b7fabe9adfb92e22e6e009d15d5cd562251f61fa74358a8a036b386fc" }, "downloads": -1, "filename": "hansel-0.9.6-py3-none-any.whl", "has_sig": false, "md5_digest": "aa005a424b3bc6d963ed74efbf482af6", "packagetype": "bdist_wheel", "python_version": "3.5", "requires_python": null, "size": 35669, "upload_time": "2016-12-16T16:30:40", "url": "https://files.pythonhosted.org/packages/33/ea/4d35d9e054eec8fb26fcc9b0d8a669211358035bbc68bb65381315693f50/hansel-0.9.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "56c2438e97073823d445fec6e5c34104", "sha256": "add81229bad3fe5101122420c07b3d4ce46d50b5490466bd9d3e299671a44bcf" }, "downloads": -1, "filename": "hansel-0.9.6.tar.gz", "has_sig": false, "md5_digest": "56c2438e97073823d445fec6e5c34104", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36849, "upload_time": "2016-12-16T16:30:36", "url": "https://files.pythonhosted.org/packages/62/00/147a3b035dba8d8f0a656cb0f363a69ef9e0db235c0d9eae7e307c70aa33/hansel-0.9.6.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "e631c74a6194eca81c55711681b23f63", "sha256": "98f4d97241808780f00065fa2244ccac4f45c4dd997b80ad599dca6fc59a79ef" }, "downloads": -1, "filename": "hansel-1.0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "e631c74a6194eca81c55711681b23f63", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 36207, "upload_time": "2017-02-13T19:19:22", "url": "https://files.pythonhosted.org/packages/e4/ad/55edca0685ba0c1fa7eff218571d2b31d4990973554ac54aeea6db72d3fb/hansel-1.0.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "95fdbfdeb6e4028b94c523f100b0f756", "sha256": "093fa894ad4c202185ddd64afbf4b1a0cc6fb0e427a694fd53770f154305a838" }, "downloads": -1, "filename": "hansel-1.0.0.tar.gz", "has_sig": false, "md5_digest": "95fdbfdeb6e4028b94c523f100b0f756", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36216, "upload_time": "2017-02-13T19:19:16", "url": "https://files.pythonhosted.org/packages/b2/ca/7437845e27bd093dc5d2e26a612d73ba3a9a987f7f5be935ed58a2ffa439/hansel-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "6cabc019f146e776c16779cb77c63c58", "sha256": "6e88ed61397fef2782a760d8f17c7dadd8fd39d3a8cc9595b74770a7f9ea68b4" }, "downloads": -1, "filename": "hansel-1.0.1-py2-none-any.whl", "has_sig": false, "md5_digest": "6cabc019f146e776c16779cb77c63c58", "packagetype": "bdist_wheel", "python_version": "2.7", "requires_python": null, "size": 36333, "upload_time": "2017-03-02T14:57:55", "url": "https://files.pythonhosted.org/packages/64/bd/7245a83de7811421f44fc7756df1a0a66e58d77434392b3ac8801ff1284b/hansel-1.0.1-py2-none-any.whl" }, { "comment_text": "", "digests": { "md5": "11aeb01cffe5e21dbde5f2a9bcb79c20", "sha256": "b2fb9eda3fc9136d84cb0b9547b9c2bcd979fb9348a63b49bbf783550a08ce38" }, "downloads": -1, "filename": "hansel-1.0.1.tar.gz", "has_sig": false, "md5_digest": "11aeb01cffe5e21dbde5f2a9bcb79c20", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37863, "upload_time": "2017-03-02T14:57:52", "url": "https://files.pythonhosted.org/packages/2a/48/f725b31b9bdefbe8c749b514b464b268ff9cd3994aef949c3c9bc963c217/hansel-1.0.1.tar.gz" } ], "1.0.2": [ { "comment_text": "", "digests": { "md5": "440c4fafe801372d6e8a38af93982875", "sha256": "de2e483e8ed866c176d527c56be8d5c31da570915c200f4bedf9c180d870af13" }, "downloads": -1, "filename": "hansel-1.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "440c4fafe801372d6e8a38af93982875", "packagetype": "bdist_wheel", "python_version": "3.6", "requires_python": null, "size": 36333, "upload_time": "2017-03-02T15:05:18", "url": "https://files.pythonhosted.org/packages/12/c1/8886543bbe8e07a723f60da39a62824fa4a4ef3c16de36be16ed1cb6645a/hansel-1.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a2dc7301fa61e1a0d7a56931d04e48bd", "sha256": "8416c9a949b3aea1c7ed878f54bcb98add2c8df397e8d79aab8d23b2df7e5ec4" }, "downloads": -1, "filename": "hansel-1.0.2.tar.gz", "has_sig": false, "md5_digest": "a2dc7301fa61e1a0d7a56931d04e48bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 37848, "upload_time": "2017-03-02T15:05:15", "url": "https://files.pythonhosted.org/packages/c1/bc/ac310aef755f11db067663bf55676544dbe8e826bac91aed48743efd2be6/hansel-1.0.2.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "d270ff50d45400286940973f4e32cc26", "sha256": "aa06700e93442cb6d72746091243abc2d523f7530aa1272796e0e18b89ac6903" }, "downloads": -1, "filename": "hansel-2.0.0.tar.gz", "has_sig": false, "md5_digest": "d270ff50d45400286940973f4e32cc26", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 42700, "upload_time": "2018-02-24T11:11:21", "url": "https://files.pythonhosted.org/packages/64/4d/350a488888f2e108226b3612e8ffa3ed2b5fc8107a1d6804d2f5b7e57595/hansel-2.0.0.tar.gz" } ], "2.0.1": [ { "comment_text": "", "digests": { "md5": "848afe2087677c870a7a19b85415cccf", "sha256": "6e99464173412b2cc77f3dc34ec29cbeb008e1ed2fd20a19dae448b9e1334a2e" }, "downloads": -1, "filename": "hansel-2.0.1.tar.gz", "has_sig": false, "md5_digest": "848afe2087677c870a7a19b85415cccf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45901, "upload_time": "2018-02-25T18:18:29", "url": "https://files.pythonhosted.org/packages/d8/e9/5dc98a7538e8daef1e10585447297c3f0b34adee4e1f11c2fef4f52c212a/hansel-2.0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "848afe2087677c870a7a19b85415cccf", "sha256": "6e99464173412b2cc77f3dc34ec29cbeb008e1ed2fd20a19dae448b9e1334a2e" }, "downloads": -1, "filename": "hansel-2.0.1.tar.gz", "has_sig": false, "md5_digest": "848afe2087677c870a7a19b85415cccf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 45901, "upload_time": "2018-02-25T18:18:29", "url": "https://files.pythonhosted.org/packages/d8/e9/5dc98a7538e8daef1e10585447297c3f0b34adee4e1f11c2fef4f52c212a/hansel-2.0.1.tar.gz" } ] }