{ "info": { "author": "Sacha Samama, Tom Stringer, Antoine Simoulin, Benoit Lebreton", "author_email": "ssamama@quantmetry.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 2 - Pre-Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7" ], "description": "# Melusine\n\n\n![](docs/_static/melusine.png)\n\n[![pypi badge](https://img.shields.io/pypi/v/melusine.svg)](https://pypi.python.org/pypi/melusine)\n[![Build Status](https://travis-ci.org/MAIF/melusine.svg?branch=master)](https://travis-ci.org/MAIF/melusine)\n[![documentation badge](https://readthedocs.org/projects/melusine/badge/?version=latest)](https://readthedocs.org/projects/melusine/)\n\n- Free software: Apache Software License 2.0\n- Documentation: [https://melusine.readthedocs.io](https://melusine.readthedocs.io).\n\n# Overview\n\n**Melusine** is a high-level Python library for email classification and feature extraction,\nwritten in Python and capable of running on top of Scikit-Learn, Keras or Tensorflow.\nIt is developed with a focus on emails written in french.\n\nUse **Melusine** if you need a library which :\n * Supports both convolutional networks and recurrent networks, as well as combinations of the two.\n * Runs seamlessly on CPU and GPU.\n\n**Melusine** is compatible with `Python >= 3.5`.\n\n\n## The Melusine package\n\nThis package is designed for the preprocessing, classification and automatic summarization of emails written in french.\n\n\n![](docs/_static/schema_1.png)\n\n**3 main subpackages are offered :**\n\n* ``prepare_email`` : to preprocess and clean emails.\n* ``summarizer`` : to extract keywords from an email.\n* ``models`` : to classify e-mails according to categories pre-defined by the user.\n\n**2 other subpackages are offered as building blocks :**\n\n* ``nlp_tools`` : to provide classic NLP tools such as tokenizer, phraser and embeddings.\n* ``utils`` : to provide a *TransformerScheduler* class to build your own transformer and integrate into a scikit-learn Pipeline.\n\n**An other subpackage is also provided** to manage, modify or add parameters such as : regular expressions, keywords, stopwords, etc.\n\n* ``config`` : contains *`ConfigJsonReader`* class to setup and handle a *conf.json* file. This JSON file is the core of this package since it's used by different submodules to preprocess the data.\n\n\n## Getting started: 30 seconds to Melusine\n\n### Installation\n\n```\npip install melusine\n```\n\nTo use Melusine in a project\n\n```python\nimport melusine\n```\n\n### Input data : Email DataFrame\n\nThe basic requirement to use Melusine is to have an input e-mail DataFrame with the following columns:\n\n- *body* : Body of an email (single message or conversation history)\n- *header* : Header/Subject of an email\n- *date* : Reception date of an email\n- *from* : Email address of the sender\n- *to* : Email address of the recipient\n- *label* (optional): Label of the email for a classification task (examples: Business, Spam, Finance or Family)\n\n| body | header | date | from | to | label |\n|:---------------------------|:--------------:|:------------------------------:|:----------------------------:|:-------------------------------------:|:-------:|\n| Thank you.\\\\nBye,\\\\nJohn | Re: Your order | jeudi 24 mai 2018 11 h 49 CEST | anonymous.sender@unknown.com | anonymous.recipient@unknown.fr | label_1\u00a0|\n\nTo import the test dataset:\n\n```python\nfrom melusine.data.data_loader import load_email_data\n\ndf_email = load_email_data()\n```\n\n\n### Pre-processing pipeline\n\nA working pre-processing pipeline is given below:\n\n```python\nfrom sklearn.pipeline import Pipeline\nfrom melusine.utils.transformer_scheduler import TransformerScheduler\nfrom melusine.prepare_email.manage_transfer_reply import check_mail_begin_by_transfer, update_info_for_transfer_mail, add_boolean_transfer, add_boolean_answer\nfrom melusine.prepare_email.build_historic import build_historic\nfrom melusine.prepare_email.mail_segmenting import structure_email\nfrom melusine.prepare_email.body_header_extraction import extract_last_body\nfrom melusine.prepare_email.cleaning import clean_body\n\nManageTransferReply = TransformerScheduler(\nfunctions_scheduler=[\n (check_mail_begin_by_transfer, None, ['is_begin_by_transfer']),\n (update_info_for_transfer_mail, None, None),\n (add_boolean_answer, None, ['is_answer']),\n (add_boolean_transfer, None, ['is_transfer'])\n])\n\nEmailSegmenting = TransformerScheduler(\nfunctions_scheduler=[\n (build_historic, None, ['structured_historic']),\n (structure_email, None, ['structured_body'])\n])\n\nCleaning = TransformerScheduler(\nfunctions_scheduler=[\n (extract_last_body, None, ['last_body']),\n (clean_body, None, ['clean_body'])\n])\n\nprepare_data_pipeline = Pipeline([\n ('ManageTransferReply', ManageTransferReply),\n ('EmailSegmenting', EmailSegmenting),\n ('Cleaning', Cleaning),\n])\n\ndf_email = prepare_data_pipeline.fit_transform(df_email)\n```\n\nIn this example, the pre-processing functions applied are:\n\n- ``check_mail_begin_by_transfer`` : Email is a direct transfer (True/False)\n- ``update_info_for_transfer_mail`` : Update body, header, from, to, date if direct transfer\n- ``add_boolean_answer`` : Email is an answer (True/False)\n- ``add_boolean_transfer`` : Email is transferred (True/False)\n- ``build_historic`` : When email is a conversation, reconstructs the individual message history\n- ``structure_email`` : Splits each messages into parts and tags them (tags: Hello, Body, Greetings, etc)\n\n### Phraser and Tokenizer pipeline\n\nA pipeline to train and apply the phraser end tokenizer is given below:\n\n```python\nfrom melusine.nlp_tools.phraser import Phraser, phraser_on_body\nfrom melusine.nlp_tools.tokenizer import Tokenizer\n\nphraser = Phraser(input_column='clean_body')\nphraser.train(df_email)\n\nPhraserTransformer = TransformerScheduler(\nfunctions_scheduler=[\n (phraser_on_body, (phraser,), ['clean_body'])\n])\n\nphraser_tokenizer_pipeline = Pipeline([\n ('PhraserTransformer', PhraserTransformer),\n ('Tokenizer', Tokenizer(input_column='clean_body'))\n])\n\ndf_email = phraser_tokenizer_pipeline.fit_transform(df_email)\n```\n\n### Embeddings training\n\nAn example of embedding training is given below:\n\n```python\nfrom melusine.nlp_tools.embedding import Embedding\n\nembedding = Embedding(input_column='clean_body', min_count=10)\nembedding.train(df_email)\n```\n\n### Metadata pipeline\n\nA pipeline to prepare the metadata is given below:\n\n```python\nfrom melusine.prepare_email.metadata_engineering import MetaExtension, MetaDate, Dummifier\n\nmetadata_pipeline = Pipeline([\n ('MetaExtension', MetaExtension()),\n ('MetaDate', MetaDate()),\n ('Dummifier', Dummifier())\n])\n\ndf_meta = metadata_pipeline.fit_transform(df_email)\n```\n\n### Keywords extraction\n\nAn example of keywords extraction is given below:\n\n```python\nfrom melusine.summarizer.keywords_generator import KeywordsGenerator\n\nkeywords_generator = KeywordsGenerator()\ndf_email = keywords_generator.fit_transform(df_email)\n```\n\n### Classification\n\nAn example of classification is given below:\n```python\nfrom sklearn.preprocessing import LabelEncoder\nfrom melusine.nlp_tools.embedding import Embedding\nfrom melusine.models.neural_architectures import cnn_model\nfrom melusine.models.train import NeuralModel\n\nX = df_email.drop(['label'], axis=1)\ny = df_email.label\n\nle = LabelEncoder()\ny = le.fit_transform(y)\n\npretrained_embedding = embedding\n\nnn_model = NeuralModel(architecture_function=cnn_model,\n pretrained_embedding=pretrained_embedding,\n text_input_column='clean_body')\nnn_model.fit(X, y)\ny_res = nn_model.predict(X)\n```\n\n## Glossary\n\n### Pandas dataframes columns\n\nBecause Melusine manipulates pandas dataframes, the naming of the columns is imposed.\nHere is a basic glossary to provide an understanding of each columns manipulated.\nInitial columns of the dataframe:\n\n* **body :** the body of the email. It can be composed of a unique message, a history of messages, a transfer of messages or a combination of history and transfers.\n* **header :** the subject of the email.\n* **date :** the date the email has been sent. It corresponds to the date of the last email message.\n* **from :** the email address of the author of the last email message.\n* **to :** the email address of the recipient of the last email message.\n\nColumns added by Melusine:\n\n* **is_begin_by_transfer :** boolean, indicates if the email is a direct transfer. In that case it is recommended to update the value of the initial columns with the information of the message transferred.\n* **is_answer :** boolean, indicates if the email contains a history of messages\n* **is_transfer :** boolean, indicates if the email is a transfer (in that case it does not have to be a direct transfer).\n* **structured_historic :** list of dictionaries, each dictionary corresponds to a message of the email. The first dictionary corresponds to the last message (the one that has been written) while the last dictionary corresponds to the first message of the history. Each dictionary has two keys :\n\n - *meta :* to access the metadata of the message as a string.\n - *text :* to access the message itself as a string.\n\n* **structured_body :** list of dictionaries, each dictionary corresponds to a message of the email. The first dictionary corresponds to the last message (the one that has been written) while the last dictionary corresponds to the first message of the history. Each dictionary has two keys :\n\n - *meta :* to access the metadata of the message as a dictionary. The dictionary has three keys:\n + *date :* the date of the message.\n + *from :* the email address of the author of the message.\n + *to :* the email address of the recipient of the message.\n\n - *text :* to access the message itself as a dictionary. The dictionary has two keys:\n + *header :* the subject of the message.\n + *structured_text :* the different parts of the message segmented and tagged as a list of dictionaries. Each dictionary has two keys:\n - *part :* to access the part of the message as a string.\n - *tags :* to access the tag of the part of the message.\n\n\n* **last_body :** string, corresponds to the part of the last email message that has been tagged as `BODY`.\n* **clean_body :** string, corresponds a cleaned last_body.\n* **clean_header :** string, corresponds to a cleaned header.\n* **clean_text :** string, concatenation of clean_header and clean_body.\n* **tokens :** list of strings, corresponds to a tokenized column, by default clean_text.\n* **keywords :** list of strings, corresponds to the keywords of extracted from the tokens column.\n\n### Tags\n\nEach messages of an email are segmented in the **structured_body** columns and each part is assigned a tag:\n\n* `RE/TR` : any metadata such as date, from, to, etc.\n* `DISCLAIMER` : any disclaimer such as `L'\u00e9metteur d\u00e9cline toute responsabilit\u00e9...`.\n* `GREETINGS` : any greetings such as `Salutations`.\n* `PJ` : any indication of an attached document such as `See attached file...`.\n* `FOOTER` : any footer such as `Provenance : Courrier pour Windows`.\n* `HELLO` : any salutations such as `Bonjour,`.\n* `THANKS` : any thanks such as `Avec mes remerciements`\n* `BODY` : the core of the the message which contains the valuable information.\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/MAIF/melusine", "keywords": "melusine", "license": "Apache Software License 2.0", "maintainer": "", "maintainer_email": "", "name": "melusine", "package_url": "https://pypi.org/project/melusine/", "platform": "", "project_url": "https://pypi.org/project/melusine/", "project_urls": { "Homepage": "https://github.com/MAIF/melusine" }, "release_url": "https://pypi.org/project/melusine/1.8.6/", "requires_dist": [ "pandas (>=0.25.0)", "scikit-learn (>=0.19.0)", "gensim (>=3.3.0)", "keras (>=2.2.0)", "tqdm (>=4.34)", "tensorflow (<=1.13.1,>=1.10.0)", "unidecode", "joblib" ], "requires_python": "", "summary": "Melusine is a high-level package for french emails preprocessing, classification and feature extraction, written in Python.", "version": "1.8.6" }, "last_serial": 5995885, "releases": { "1.2.0": [ { "comment_text": "", "digests": { "md5": "7a953a488a3779aff94f0aad8801a410", "sha256": "3aa1c2649bee9fdc1a4725a51272da11b1a3d945810734578b72d15e6dd2cad3" }, "downloads": -1, "filename": "melusine-1.2.0.tar.gz", "has_sig": false, "md5_digest": "7a953a488a3779aff94f0aad8801a410", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 610537, "upload_time": "2019-02-27T16:58:19", "url": "https://files.pythonhosted.org/packages/ef/20/94368f02a5f5683ddd35b522dacde2cf36032064740b650e80ecce205261/melusine-1.2.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "1fa36a667c9d6f617297bcae86e1e9a4", "sha256": "a63ec03e089747b342d5f9cd5b6ab99db7acc58e8a2aacae66dcbf6bf98bdba3" }, "downloads": -1, "filename": "melusine-1.4.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "1fa36a667c9d6f617297bcae86e1e9a4", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 41534, "upload_time": "2019-02-27T17:38:12", "url": "https://files.pythonhosted.org/packages/03/03/0752c4bbef962ebbe9dabd1bdc0386621d3531844399ab80107554ff3521/melusine-1.4.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "007dd1333dcd6119f25d5112b83f6f25", "sha256": "7e0ad956f2b219cab6837de42d5e535e060d3a99d7c1673f797afd8aa01103b0" }, "downloads": -1, "filename": "melusine-1.4.0.tar.gz", "has_sig": false, "md5_digest": "007dd1333dcd6119f25d5112b83f6f25", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 607941, "upload_time": "2019-02-27T17:38:14", "url": "https://files.pythonhosted.org/packages/1d/d8/150d5d1195888f683e983c4a301b119f7ac8342f2fd9e63aefea548d6c6d/melusine-1.4.0.tar.gz" } ], "1.5.0": [ { "comment_text": "", "digests": { "md5": "ae30fce12ec29fef996497669f9830fd", "sha256": "67d676af724cdaf9088ef2f90a42e5fa8ea2b655f28f3f09ca9c205ec2de7db8" }, "downloads": -1, "filename": "melusine-1.5.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "ae30fce12ec29fef996497669f9830fd", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 46133, "upload_time": "2019-03-11T09:50:47", "url": "https://files.pythonhosted.org/packages/33/6a/9fc77dc88b2180775c77b97d4cd18d295711bdfe4b3019eb5a920e9ccf00/melusine-1.5.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "988394e7c07e8e64f5d9a834d85025d7", "sha256": "59b004ded16f5c3fe56eaf9f75aead9f1b8239c82894b338cee583bb29b6ab1c" }, "downloads": -1, "filename": "melusine-1.5.0.tar.gz", "has_sig": false, "md5_digest": "988394e7c07e8e64f5d9a834d85025d7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 697817, "upload_time": "2019-03-11T09:50:49", "url": "https://files.pythonhosted.org/packages/15/73/0505fbb1d5224743035611761e9ea6365c801a85c1874081dc9a325d54d3/melusine-1.5.0.tar.gz" } ], "1.5.1": [ { "comment_text": "", "digests": { "md5": "2ecf7bf3837ce1ff4908489e34f38c1c", "sha256": "a57b3fc355a5e4e8a8daa5285bbaf04235116bc97e6b1dd8777eacdc78e5214d" }, "downloads": -1, "filename": "melusine-1.5.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "2ecf7bf3837ce1ff4908489e34f38c1c", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 46139, "upload_time": "2019-03-11T10:16:27", "url": "https://files.pythonhosted.org/packages/a5/62/4436c0c118aa52f18fdd05f1583753a0d784ca1b0a3d25b8e7fe84bcc208/melusine-1.5.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "eb932ad3cab39687bd7e3b12c72aa5b2", "sha256": "04702b63ec547b4f69604c7733e1883c684de92bef2025d27cd3639817c84ef5" }, "downloads": -1, "filename": "melusine-1.5.1.tar.gz", "has_sig": false, "md5_digest": "eb932ad3cab39687bd7e3b12c72aa5b2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 697815, "upload_time": "2019-03-11T10:16:29", "url": "https://files.pythonhosted.org/packages/3a/54/db1928f2be625fe8cd7ec0564d4a6e0636600359f7193392c1a72ae7c0a5/melusine-1.5.1.tar.gz" } ], "1.5.2": [ { "comment_text": "", "digests": { "md5": "035d6492b719f384b985dce34ead81f2", "sha256": "9cc228d5134861b9707deab03e7f8aa5408fcae73abdc8eccd00234fd06bfd3b" }, "downloads": -1, "filename": "melusine-1.5.2-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "035d6492b719f384b985dce34ead81f2", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 61336, "upload_time": "2019-03-11T17:02:28", "url": "https://files.pythonhosted.org/packages/54/10/5abf9004f0732e9d3edc0117b40c969a91aff69b2e2c35c17b95ac214176/melusine-1.5.2-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "5a88f380770fe9aa23463fcbe7ac56a4", "sha256": "a1da836e8b2757362c9f8c219eac06f1d07bf0cf5b34dd6b34f6070e050e6013" }, "downloads": -1, "filename": "melusine-1.5.2.tar.gz", "has_sig": false, "md5_digest": "5a88f380770fe9aa23463fcbe7ac56a4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 704035, "upload_time": "2019-03-11T17:02:30", "url": "https://files.pythonhosted.org/packages/20/81/333055ebf21985acc49e0c519407fa5af99f859fe66d5953cd0ae1505094/melusine-1.5.2.tar.gz" } ], "1.5.4": [ { "comment_text": "", "digests": { "md5": "d7baf4bbefe5b9242a1f25efeb942101", "sha256": "1ebedf8ffc46a1a71fc048e60a7cb328bcc04af87db7eccfc9dbfda96896fab5" }, "downloads": -1, "filename": "melusine-1.5.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "d7baf4bbefe5b9242a1f25efeb942101", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 60077, "upload_time": "2019-03-12T17:45:16", "url": "https://files.pythonhosted.org/packages/a8/f8/f0bc343f6cc3357e9dbb42795439bfce4e9843a25bcc7444a34b8be2bcc1/melusine-1.5.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3e4a8115e6569f3cdd5eebe8b3da1de2", "sha256": "bc8dd376d163e8e8208e0109754437899644c70e738def6c68f87b2a4593b331" }, "downloads": -1, "filename": "melusine-1.5.4.tar.gz", "has_sig": false, "md5_digest": "3e4a8115e6569f3cdd5eebe8b3da1de2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 703416, "upload_time": "2019-03-12T17:45:17", "url": "https://files.pythonhosted.org/packages/55/a2/bbb5fa482a626e6d6385f47639c2fe10ba971cd92d9049b086925b8008c0/melusine-1.5.4.tar.gz" } ], "1.5.5": [ { "comment_text": "", "digests": { "md5": "aae99ab83a6eb95c80dccab446d7ec27", "sha256": "31b9e5526b3c0d34bfcd4557ad9f2e78c9305a05ce97140a6b1aefe2d6a3cb01" }, "downloads": -1, "filename": "melusine-1.5.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "aae99ab83a6eb95c80dccab446d7ec27", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67432, "upload_time": "2019-09-23T14:08:37", "url": "https://files.pythonhosted.org/packages/97/2b/a5ebe175b00fd6b440e21028d7d02f90b2838097be35918928717fa51a49/melusine-1.5.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0431a743e61b02c6c9b0dbff13449ea0", "sha256": "4c462b3b2e3799c7dee7b87c702f2ab0807dc96b5728e24a4463564fcdbc1b7a" }, "downloads": -1, "filename": "melusine-1.5.5.tar.gz", "has_sig": false, "md5_digest": "0431a743e61b02c6c9b0dbff13449ea0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 715107, "upload_time": "2019-09-23T14:08:40", "url": "https://files.pythonhosted.org/packages/f1/a1/1654cfe967a5d958955d1561d6f1b57882b577fd7fa306a1c4a5de02dfec/melusine-1.5.5.tar.gz" } ], "1.6.0": [ { "comment_text": "", "digests": { "md5": "6f55094e57243271553be57adef54b18", "sha256": "6b98af6b45750bab8826fe994d4f815ec52bd89f0476a2f019efccfb9cfb3750" }, "downloads": -1, "filename": "melusine-1.6.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6f55094e57243271553be57adef54b18", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 61995, "upload_time": "2019-05-09T08:37:26", "url": "https://files.pythonhosted.org/packages/bd/23/0b089b2b7fffb291e797e17e4d19e60bd95f10bc2b6cfaf6d56f7558e935/melusine-1.6.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "de8b39c790f46b28dfbba69091074f43", "sha256": "dd8823ed56aa83d0dc0f781d61534ca99ba7794b4af1ea18668f6a8096c07cc3" }, "downloads": -1, "filename": "melusine-1.6.0.tar.gz", "has_sig": false, "md5_digest": "de8b39c790f46b28dfbba69091074f43", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 704469, "upload_time": "2019-05-09T08:37:28", "url": "https://files.pythonhosted.org/packages/55/df/8d3bed99ed3eaaae490dd89d11cd5d3ba9214df2da7fd67a13093afe5b92/melusine-1.6.0.tar.gz" } ], "1.6.1": [ { "comment_text": "", "digests": { "md5": "65e4cb95bccabb63eed84b45b1933d15", "sha256": "9e0034ff1acbc916ad7197724d4ed3dfc60cc37862343f2f852d93f633666e5a" }, "downloads": -1, "filename": "melusine-1.6.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "65e4cb95bccabb63eed84b45b1933d15", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67126, "upload_time": "2019-09-03T14:42:29", "url": "https://files.pythonhosted.org/packages/b4/61/9483b54a95d74d3076c7adc6cacd58a5eef357be9d3fd6954b34ab3a1725/melusine-1.6.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a1213b8af73e1b268b53674863112d4e", "sha256": "4043629698b44b3776b633392af00135fbbf5abf6eeb44d2e3ba9cf0c3fd9034" }, "downloads": -1, "filename": "melusine-1.6.1.tar.gz", "has_sig": false, "md5_digest": "a1213b8af73e1b268b53674863112d4e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 714961, "upload_time": "2019-09-03T14:42:31", "url": "https://files.pythonhosted.org/packages/1d/9d/416cd403e99344bb4e55c252bcc1ffb87f264dccd0769574b6f0d0ff5bf4/melusine-1.6.1.tar.gz" } ], "1.7.0": [ { "comment_text": "", "digests": { "md5": "b25e91a7462a84ecb7e04ca4ace8a70b", "sha256": "8f87d7e3336d60b1e57f5568c9a8a5ceda584037e5969742856cf17cbd0e6316" }, "downloads": -1, "filename": "melusine-1.7.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "b25e91a7462a84ecb7e04ca4ace8a70b", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 61578, "upload_time": "2019-07-29T10:03:54", "url": "https://files.pythonhosted.org/packages/1b/5a/0ce01caa39ff368f2958da286f86812cdbd3e48e083efc8f2a3911a44de7/melusine-1.7.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "afcb08c9eba733d84efd482764810d6b", "sha256": "36aff1d8d46733c40393734cb01577ea10b552421ab7661e40c1915e62e167f9" }, "downloads": -1, "filename": "melusine-1.7.0.tar.gz", "has_sig": false, "md5_digest": "afcb08c9eba733d84efd482764810d6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 705205, "upload_time": "2019-07-29T10:03:56", "url": "https://files.pythonhosted.org/packages/0a/4e/a715dae4e7ce5e4b7698bba9c76fd253e5766e30880d70e7378906f3c12e/melusine-1.7.0.tar.gz" } ], "1.7.1": [ { "comment_text": "", "digests": { "md5": "125cdc69be825b15e52e5c57814fb9d5", "sha256": "6e9f5c6e0f359b5123a96797ae23eb4b2221ea3ec0b50f6838c1f1a8eecc3223" }, "downloads": -1, "filename": "melusine-1.7.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "125cdc69be825b15e52e5c57814fb9d5", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 66945, "upload_time": "2019-08-28T09:58:07", "url": "https://files.pythonhosted.org/packages/c1/c7/faf0f004733f8a5b0510212cbdb07eae45f5c1dd32e73e0fd7070fbb43d4/melusine-1.7.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e887e0f68c06dbe06b095460dcde1bad", "sha256": "2aef1df4cd3cd7b7ef7029f5a4ed1ad95084b59b9b258c9be778488d3edea31a" }, "downloads": -1, "filename": "melusine-1.7.1.tar.gz", "has_sig": false, "md5_digest": "e887e0f68c06dbe06b095460dcde1bad", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 714729, "upload_time": "2019-08-28T09:58:09", "url": "https://files.pythonhosted.org/packages/63/2b/2e7eeef0787ea48abafd6b885f38b4c22145a47d222435d328538842ef75/melusine-1.7.1.tar.gz" } ], "1.8.0": [ { "comment_text": "", "digests": { "md5": "6fa884f8c0dae60174f37eafe20ad509", "sha256": "c63f5771ec17c0d732d3a14b3c758877c132bd8e2814c004097e4132563550e3" }, "downloads": -1, "filename": "melusine-1.8.0-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "6fa884f8c0dae60174f37eafe20ad509", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 66946, "upload_time": "2019-08-28T09:58:10", "url": "https://files.pythonhosted.org/packages/dd/ea/bf1f808385cec14c6a6372d39dca8553a20587a603acab484f60eac9282d/melusine-1.8.0-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "6cd70f4c96884ae25828647841574b28", "sha256": "620e0632475bc2008abb6fb4dda8cf4d2a4cb05b09ccb109017215ab8a52a5bc" }, "downloads": -1, "filename": "melusine-1.8.0.tar.gz", "has_sig": false, "md5_digest": "6cd70f4c96884ae25828647841574b28", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 714744, "upload_time": "2019-08-28T09:58:13", "url": "https://files.pythonhosted.org/packages/d2/7d/93f8355ccb0ccc06b7bd81e7b65dba2c9132cacfb08274622e37b16d6e5b/melusine-1.8.0.tar.gz" } ], "1.8.1": [ { "comment_text": "", "digests": { "md5": "00cd64e98e2d6544d681df0df57d2b77", "sha256": "ac5b69b2e3eaae8a1ca7cc2a04951eec39e8f9b8a07e7cfb505afae3ef868939" }, "downloads": -1, "filename": "melusine-1.8.1-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "00cd64e98e2d6544d681df0df57d2b77", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67127, "upload_time": "2019-09-03T14:42:23", "url": "https://files.pythonhosted.org/packages/0c/2e/07479c24361a6293b6f554c728510dcf51c54778b77edb864513eadbf6b4/melusine-1.8.1-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9cdae6ac260cb280c47d5df35d29817f", "sha256": "74561544878d1e316f8ada00ed53e959c4ce9acb6fd1baa2bbf93506fe13a03a" }, "downloads": -1, "filename": "melusine-1.8.1.tar.gz", "has_sig": false, "md5_digest": "9cdae6ac260cb280c47d5df35d29817f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 714951, "upload_time": "2019-09-03T14:42:25", "url": "https://files.pythonhosted.org/packages/86/fc/53ff8d6a10bf9cc881ccd980ef8ac2a6feefc4e8711a9d1f2072a5fb56e6/melusine-1.8.1.tar.gz" } ], "1.8.3": [ { "comment_text": "", "digests": { "md5": "a89fbc4ae898540f0b2550000edf96fb", "sha256": "5f72aaaa445582a0c4b040dca53e3ab46595fc6dff511c7f6c93a3dfa7eacd46" }, "downloads": -1, "filename": "melusine-1.8.3-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "a89fbc4ae898540f0b2550000edf96fb", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67434, "upload_time": "2019-09-23T14:09:14", "url": "https://files.pythonhosted.org/packages/e8/25/7349e03d23db36a52616db025aba26f235339007a05b873c47a05b86c942/melusine-1.8.3-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8909d531d4a34896556063a5ca2d2053", "sha256": "a5a46839dd43499d50267001013f3fc7f71bf8daea7b9cbab240686b2f1eb804" }, "downloads": -1, "filename": "melusine-1.8.3.tar.gz", "has_sig": false, "md5_digest": "8909d531d4a34896556063a5ca2d2053", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 715125, "upload_time": "2019-09-23T14:09:17", "url": "https://files.pythonhosted.org/packages/8d/55/bfc026bd6d410e434c9e329150138b81b14d6c437fb796402181373b44d1/melusine-1.8.3.tar.gz" } ], "1.8.4": [ { "comment_text": "", "digests": { "md5": "7067e80a16cc49bcf0226828b8169c01", "sha256": "f6a37dd415985819c87536d0d157e9e7f930e7cecb4d48c852348e4b6d9ff9a0" }, "downloads": -1, "filename": "melusine-1.8.4-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7067e80a16cc49bcf0226828b8169c01", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 67435, "upload_time": "2019-09-23T14:10:45", "url": "https://files.pythonhosted.org/packages/1a/55/b7aa56ea12446e65ce1a4a839adc4cf9efa809bdfa155897c6878a42dbaa/melusine-1.8.4-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a29cb22ddf61a231f2826977aed3b16c", "sha256": "82a3ceb240c17bd93a434715eed980478a1537be8adb2cb4ed5f11516b1e2f76" }, "downloads": -1, "filename": "melusine-1.8.4.tar.gz", "has_sig": false, "md5_digest": "a29cb22ddf61a231f2826977aed3b16c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 715128, "upload_time": "2019-09-23T14:10:47", "url": "https://files.pythonhosted.org/packages/d5/15/bfac97c61449a608a331ef115bd35734291d6ca9bdd76d0aa1f3d1f8a5f2/melusine-1.8.4.tar.gz" } ], "1.8.5": [ { "comment_text": "", "digests": { "md5": "7bfc83432ea8e870a853203c8b73589d", "sha256": "d6043b9054c3b684730390f321964679fd3bbd4c9dce090e4da337fa04264bc2" }, "downloads": -1, "filename": "melusine-1.8.5-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "7bfc83432ea8e870a853203c8b73589d", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 69320, "upload_time": "2019-10-09T12:57:24", "url": "https://files.pythonhosted.org/packages/6a/87/d072a09a3e69e1f8ac9bf160511c2df6ce51efe7213d2e5578e949227266/melusine-1.8.5-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "def9d490eae53c36bd4cd9fcfaec0cb6", "sha256": "b034023a5124f3ef54c798f3b2803485c15d36bad10be1cd1b3151f917bb625b" }, "downloads": -1, "filename": "melusine-1.8.5.tar.gz", "has_sig": false, "md5_digest": "def9d490eae53c36bd4cd9fcfaec0cb6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 717439, "upload_time": "2019-10-09T12:57:25", "url": "https://files.pythonhosted.org/packages/a4/60/a5a4ed1132ebe529294809449d3ed226a0005e30dba1acf232a69dcb964f/melusine-1.8.5.tar.gz" } ], "1.8.6": [ { "comment_text": "", "digests": { "md5": "08851d12b785981f4dc372fc1aaf1ca8", "sha256": "f24923f97a1d168ba8d90c40eae5d3af6da8758ebb35b514450f7891f8ad0d16" }, "downloads": -1, "filename": "melusine-1.8.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "08851d12b785981f4dc372fc1aaf1ca8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 65082, "upload_time": "2019-10-18T14:19:56", "url": "https://files.pythonhosted.org/packages/d3/4f/6645fce0cb0945b0b20407796c6934667a2725ea67c7ec4928d4bd15ebe7/melusine-1.8.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "63a8d22b8dd3cf83f5ffa7e321f0e9b0", "sha256": "ea4d940a5368c540ed01204beaee75b7b071e36f42d7c8b6bc6d90e799fa27b3" }, "downloads": -1, "filename": "melusine-1.8.6.tar.gz", "has_sig": false, "md5_digest": "63a8d22b8dd3cf83f5ffa7e321f0e9b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 717075, "upload_time": "2019-10-18T14:19:59", "url": "https://files.pythonhosted.org/packages/43/1b/db6fa4371ccd31d7fb4dc35386346e4005817ebbfd5b8cb6234b94e414d3/melusine-1.8.6.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "08851d12b785981f4dc372fc1aaf1ca8", "sha256": "f24923f97a1d168ba8d90c40eae5d3af6da8758ebb35b514450f7891f8ad0d16" }, "downloads": -1, "filename": "melusine-1.8.6-py2.py3-none-any.whl", "has_sig": false, "md5_digest": "08851d12b785981f4dc372fc1aaf1ca8", "packagetype": "bdist_wheel", "python_version": "py2.py3", "requires_python": null, "size": 65082, "upload_time": "2019-10-18T14:19:56", "url": "https://files.pythonhosted.org/packages/d3/4f/6645fce0cb0945b0b20407796c6934667a2725ea67c7ec4928d4bd15ebe7/melusine-1.8.6-py2.py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "63a8d22b8dd3cf83f5ffa7e321f0e9b0", "sha256": "ea4d940a5368c540ed01204beaee75b7b071e36f42d7c8b6bc6d90e799fa27b3" }, "downloads": -1, "filename": "melusine-1.8.6.tar.gz", "has_sig": false, "md5_digest": "63a8d22b8dd3cf83f5ffa7e321f0e9b0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 717075, "upload_time": "2019-10-18T14:19:59", "url": "https://files.pythonhosted.org/packages/43/1b/db6fa4371ccd31d7fb4dc35386346e4005817ebbfd5b8cb6234b94e414d3/melusine-1.8.6.tar.gz" } ] }