{ "info": { "author": "Adil Zouitine", "author_email": "adilzouitine@gmail.com", "bugtrack_url": null, "classifiers": [ "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: Implementation :: PyPy" ], "description": "\n# :dress: Outfit [WIP]\n\nOutfit is a lightweight library to **tidy up** your machine learning experiments in a simple way.\n\nThe idea of Outfit is to store in your `Wardrobe` your parameters, output file, scores and features in order to be able to make a request and find out which are your best experimentation according to a given criterion.\n\n## How install outfit ?\n\n**PyPI**:\n\n```bash\npip install outfit\n```\n\n**Dev version**: \n```bash\ngit clone https://github.com/AdilZouitine/outfit\ncd outfit\npip install -r requirements.txt\npip install -e .\n```\n\n\n## How outfit works ?\n\n\n- **Tutorial 1: Build a simple model management pipeline with outfit for a CNN with Pytorch on MNIST dataset** [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/17vJSQ9WRv1OeagyayXBq_eHs9H_Qg5JP) \n\n```python\n\nimport datetime\n\n# Here import all the libraries you need for your experiment\n\nfrom outfit import Wardrobe, getlog\n\nwardrobe = Wardrobe(db_path='foo/bar/mnist.db')\n\nexp = {\n 'experiment_name': 'ResNet18',\n 'comment': 'Use differential learning rate',\n 'date_experiment': datetime.datetime.now()\n}\n\nwardrobe.add_experiment(**exp)\n\nparam = {\n 'dropout': 0.20,\n 'kernel_size': '3x3',\n 'conv_block_1_lr': 0.01,\n 'conv_block_2_lr': 0.001\n }\n\n# Create the instance of your model here with your parameters\nwardrobe.add_dict_parameter(param)\n\n\n# Do your training phase here.\noutput = {'training log': '/result/training_log_resnet18.txt'}\n\n@getlog(filepath=output['training log'])\ndef train_model(model, loaders, loss, lr_scheduler, n_epoch):\n ...\n\noutput.update({\n 'tensorboard': '/result/event.tb',\n 'model': 'diff_lr_resnet18.pth'\n})\n\nwardrobe.add_dict_output(output)\n\nscore = {\n 'train acc': 0.96,\n 'train loss': 0.430,\n 'val acc': 0.94,\n 'val loss': 0.460\n }\nwardrobe.add_dict_score(score)\n\n\nwardrobe.tidy() # commit your experiment in database\n\n```\n\n```python\n# If you want to get the best experiments \n\nfor exp in wardrobe.get_best_scores(mode='max',on_score='val acc'):\n '''\n Verbose is true by default and will print on the console \n at each iteration the parameters, output file, \n features and scores in a table format.\n\n Also returns in dictionary the parameters, output file, features and scores.\n '''\n ...\n\n```\n**Output**:\n```\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\u2502 TOP 1 EXPERIMENT \u2502\n\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\n\n\nTable : Experiment \n\n\u2552\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 \u2502 id_experiment \u2502 experiment_name \u2502 comment \u2502 date_experiement \u2502\n\u255e\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 0 \u2502 1 \u2502 ResNet18 \u2502 Use differential learning rate \u2502 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n\n\nTable : Parameter \n\n\u2552\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 \u2502 id_parameter \u2502 parameter_name \u2502 parameter \u2502 experiment \u2502\n\u255e\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 0 \u2502 1 \u2502 dropout \u2502 0.2 \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 kernel_size \u2502 3x3 \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 2 \u2502 3 \u2502 conv_block_1_lr \u2502 0.01 \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 3 \u2502 4 \u2502 conv_block_2_lr \u2502 0.001 \u2502 1 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n\n\nTable : Output \n\n\u2552\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 \u2502 id_output \u2502 type_output \u2502 path_output \u2502 experiment \u2502\n\u255e\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 0 \u2502 1 \u2502 training log \u2502 /result/training_log_resnet18.txt \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 tensorboard \u2502 /result/event.tb \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 2 \u2502 3 \u2502 model \u2502 diff_lr_resnet18.pth \u2502 1 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n\n\nTable : Score \n\n\u2552\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2564\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2555\n\u2502 \u2502 id_score \u2502 type_score \u2502 score \u2502 experiment \u2502\n\u255e\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u256a\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2561\n\u2502 0 \u2502 1 \u2502 train acc \u2502 0.96 \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 1 \u2502 2 \u2502 train loss \u2502 0.43 \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 2 \u2502 3 \u2502 val acc \u2502 0.94 \u2502 1 \u2502\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\n\u2502 3 \u2502 4 \u2502 val loss \u2502 0.46 \u2502 1 \u2502\n\u2558\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2567\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255b\n\n\nTable : Feature \n\n```\n\n## Other solution:\n\n[mlflow](https://github.com/mlflow/mlflow) & [dvc](https://github.com/iterative/dvc).\n\nThese solutions are great, they also offer a user interface and have many more options than my library however for a simple use where you only want to organize your experimentation and make a simple query.\nBoth solutions seem to be overkill.\n\n\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/AdilZouitine/Outfit", "keywords": "", "license": "BSD-3", "maintainer": "", "maintainer_email": "", "name": "outfit", "package_url": "https://pypi.org/project/outfit/", "platform": "", "project_url": "https://pypi.org/project/outfit/", "project_urls": { "Homepage": "https://github.com/AdilZouitine/Outfit" }, "release_url": "https://pypi.org/project/outfit/0.0.2/", "requires_dist": [ "peewee (>=3.9.6)", "pandas (>=0.24.2)", "tabulate (>=0.8.3)" ], "requires_python": ">=3.5.0", "summary": "Tidy up your machine learning experiments", "version": "0.0.2" }, "last_serial": 5594202, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "ac40448fc71247b77010acd042f4cb6e", "sha256": "1f354049ae634463d815af135e0b5a31a3c20b520af94646acbabc07f24e7744" }, "downloads": -1, "filename": "outfit-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "ac40448fc71247b77010acd042f4cb6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 7499, "upload_time": "2019-07-27T21:57:08", "url": "https://files.pythonhosted.org/packages/ab/8f/23d7df33842cc1915c4c0ca58b9b9d56860c3358fdceacc6db07f1c8674b/outfit-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "27022e8d65183505da475eb477755efc", "sha256": "c0df4064d408b8bf8202e7332e1e276501d31da47ef63520f33ba2305030ad52" }, "downloads": -1, "filename": "outfit-0.0.1.tar.gz", "has_sig": false, "md5_digest": "27022e8d65183505da475eb477755efc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 7194, "upload_time": "2019-07-27T21:57:11", "url": "https://files.pythonhosted.org/packages/bd/0c/968749635a48b9bb10373a2ddad8a281df31d7183ab0038598316df82b4a/outfit-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "d5695ef70f6c76b8e8dce40bd59c9fc8", "sha256": "790b2ecf836a7b66253690edb453617a1afccc92d2b8682123e5719ccdbcffe3" }, "downloads": -1, "filename": "outfit-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d5695ef70f6c76b8e8dce40bd59c9fc8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 7399, "upload_time": "2019-07-27T22:25:24", "url": "https://files.pythonhosted.org/packages/05/cc/1ecbf527e6c3bdeef5b4b60fa51c72ad97123e249cabea77b6a0b68cc364/outfit-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba2a1cc252a8f0d135d506aa9056bebc", "sha256": "e5e2b68b8f4a4010cdb3012e66430b0a75351e77f15d457912b6e45bfe9c41f7" }, "downloads": -1, "filename": "outfit-0.0.2.tar.gz", "has_sig": false, "md5_digest": "ba2a1cc252a8f0d135d506aa9056bebc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 7083, "upload_time": "2019-07-27T22:25:26", "url": "https://files.pythonhosted.org/packages/1d/93/ec387b2285da1b11a7b0ab5c1343533fe766b1c76fbed5f1daef6be8034c/outfit-0.0.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d5695ef70f6c76b8e8dce40bd59c9fc8", "sha256": "790b2ecf836a7b66253690edb453617a1afccc92d2b8682123e5719ccdbcffe3" }, "downloads": -1, "filename": "outfit-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "d5695ef70f6c76b8e8dce40bd59c9fc8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 7399, "upload_time": "2019-07-27T22:25:24", "url": "https://files.pythonhosted.org/packages/05/cc/1ecbf527e6c3bdeef5b4b60fa51c72ad97123e249cabea77b6a0b68cc364/outfit-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ba2a1cc252a8f0d135d506aa9056bebc", "sha256": "e5e2b68b8f4a4010cdb3012e66430b0a75351e77f15d457912b6e45bfe9c41f7" }, "downloads": -1, "filename": "outfit-0.0.2.tar.gz", "has_sig": false, "md5_digest": "ba2a1cc252a8f0d135d506aa9056bebc", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 7083, "upload_time": "2019-07-27T22:25:26", "url": "https://files.pythonhosted.org/packages/1d/93/ec387b2285da1b11a7b0ab5c1343533fe766b1c76fbed5f1daef6be8034c/outfit-0.0.2.tar.gz" } ] }