{ "info": { "author": "Marc Debureaux", "author_email": "marc@debureaux.fr", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 2.0", "Framework :: Django :: 2.1", "Framework :: Django :: 2.2", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Utilities" ], "description": "# Framework commun\n\nBo\u00eete \u00e0 outils commune pour des d\u00e9veloppements autour de Django (https://www.djangoproject.com/) et \nDjango REST Framework (http://www.django-rest-framework.org/).\n\n## Django\n\n### Entit\u00e9s\n\nUne entit\u00e9 est un super-mod\u00e8le Django offrant un nombre important de nouvelles fonctionnalit\u00e9s tels que l'historisation\ndes donn\u00e9es, la r\u00e9version, les m\u00e9tadonn\u00e9es, la s\u00e9rialisation et la repr\u00e9sentation des donn\u00e9es sous forme de\ndictionnaire.\n\nPour utiliser ces fonctionnalit\u00e9s, il est n\u00e9cessaire de faire h\u00e9riter chaque mod\u00e8le de ``common.models.Entity`` qui\nh\u00e9rite lui-m\u00eame de ``django.db.models.Model``.\n\n```python\nfrom common.models import Entity\n\nclass Personne(Entity):\n pass\n```\n\nLes mod\u00e8les entit\u00e9s poss\u00e8dent par d\u00e9faut les champs suivants :\n* ``creation_date`` : date de cr\u00e9ation de l'entit\u00e9\n* ``modification_date`` : date de derni\u00e8re modification de l'entit\u00e9\n* ``current_user`` : dernier utilisateur \u00e0 l'origine de la cr\u00e9ation/modification\n* ``uuid`` : identifiant unique de l'entit\u00e9\n\nL'identifiant unique permet de retrouver n'importe quelle entit\u00e9 depuis la base de donn\u00e9es car chacune est\nenregistr\u00e9e dans un r\u00e9f\u00e9rentiel global conjointement \u00e0 son type. Il est donc possible de r\u00e9cup\u00e9rer une entit\u00e9 ainsi :\n\n```python\nfrom common.models import Global\n\nentity = Global.objects.entity('4b9abebd-8157-4e49-bcae-1a7e063a9f86')\n```\n\n> Attention ! Les entit\u00e9s surchargent les m\u00e9thodes de persistance par d\u00e9faut de Django \n(``save()``, ``create()``, ``delete()``).\n``update()`` garde cependant son comportement par d\u00e9faut car il ex\u00e9cute directement la mise \u00e0 jour en base de \ndonn\u00e9es, il sera donc impossible de d\u00e9tecter les changements si elle est utilis\u00e9e.\n\nUne version all\u00e9g\u00e9e d'entit\u00e9 est \u00e0 disposition sans l'historisation ni le r\u00e9f\u00e9rentiel global, il suffit alors\nd'h\u00e9riter les mod\u00e8les de ``common.models.CommonModel`` \u00e0 la place de ``common.models.Entity``.\n\n### Entit\u00e9s p\u00e9rissables\n\nUne entit\u00e9 p\u00e9rissable poss\u00e8de une dur\u00e9e de validit\u00e9 dans le temps, elle poss\u00e8de les m\u00eames fonctionnalit\u00e9s que l'entit\u00e9\nmais poss\u00e8de en prime une date de d\u00e9but (``start_date``) et une date de fin potentielle (``end_date``).\n\nPour d\u00e9finir une entit\u00e9 p\u00e9rissable, il suffit de faire h\u00e9riter le mod\u00e8le de ``common.models.PerishableEntity`` au lieu\nde ``common.models.Entity``. Il n'existe pas d'alternative simplifi\u00e9e hors historisation des entit\u00e9s p\u00e9rissables.\n\nLorsqu'une entit\u00e9 p\u00e9rissable existante en base de donn\u00e9es est sauvegard\u00e9e, le m\u00e9canisme suivant s'ex\u00e9cute :\n* si une date de fin est fournie, l'entit\u00e9 courante est modifi\u00e9e et cl\u00f4tur\u00e9e \u00e0 cette date\n* sans date de fin fournie, l'entit\u00e9 courante est cl\u00f4tur\u00e9e \u00e0 cette date et une autre entit\u00e9 avec les modifications est \ncr\u00e9\u00e9e avec une date de d\u00e9but actualis\u00e9e et sans date de fin programm\u00e9e\n\nLes entit\u00e9s p\u00e9rissables impl\u00e9mentent une fonction de r\u00e9cup\u00e9ration des donn\u00e9es par rapport \u00e0 une date donn\u00e9e, si la date\nn'est pas fournie la requ\u00eate r\u00e9cup\u00e9rera toutes les entit\u00e9s qui sont valides par rapport \u00e0 la date et heure courante.\n\n```python\nadresses = Adresse.objects.filter(personne_id=1).select_valid(date='2016-08-01T00:00:00')\n```\n\n### Administration\n\nAfin de garantir les fonctionnalit\u00e9s de l'historisation dans l'interface d'administration, il est n\u00e9cessaire de faire\nh\u00e9riter les classes d'administration de ``common.admin.EntityAdmin`` qui permet les fonctionnalit\u00e9s suivantes :\n\n* G\u00e8re automatiquement l'utilisateur connect\u00e9 pour les modifications\n* Affiche automatiquement la date de cr\u00e9ation et de modification et fournit les filtres de recherche\n* G\u00e8re les permissions d'affichage\n* Affiche les m\u00e9tadonn\u00e9es de l'entit\u00e9\n\nPour les entit\u00e9s p\u00e9rissables, il convient d'utiliser ``common.admin.PerishableEntityAdmin`` \u00e0 la place de\n``common.admin.EntityAdmin``.\n\nPour les inlines, des \u00e9quivalents pour les entit\u00e9s sont \u00e9galement \u00e0 disposition : \n``common.admin.EntityTabularInline`` et ``common.admin.EntityStackedInline``.\n\nUne version all\u00e9g\u00e9e existe pour ``common.models.CommonModel`` qui est ``common.admin.CommonAdmin`` qui impl\u00e9mente\nl'ensemble des fonctionnalit\u00e9s en dehors de l'historisation.\n\n### Historisation\n\nToute alt\u00e9ration au niveau des donn\u00e9es d'un mod\u00e8le entit\u00e9 est d\u00e9tect\u00e9e et enregistr\u00e9e dans un historique,\ncela permet un suivi des modifications par utilisation ainsi que la possibilit\u00e9 de revenir \u00e0 un \u00e9tat ant\u00e9rieur pour\nl'entit\u00e9 ou un champ sp\u00e9cifique de l'entit\u00e9.\n\nA chaque modification, un historique d'entit\u00e9 (``common.models.History``) est sauvegard\u00e9 pour l'entit\u00e9 et un \u00e9l\u00e9ment \npar champ modifi\u00e9 dans l'historique (``common.models.HistoryField``) uniquement s'il s'agit d'une modification.\n\n* Les relations de type many-to-many sont trait\u00e9s s\u00e9par\u00e9ment \u00e0 l'historisation.\n* Si Celery est install\u00e9 (http://www.celeryproject.org/), l'historisation est ex\u00e9cut\u00e9e de mani\u00e8re asynchrone.\n* L'utilisateur \u00e0 l'origine de la modification est conserv\u00e9 dans l'historique.\n* Il est possible d'ajouter un message et/ou modifier l'utilisateur \u00e0 l'historique via le code.\n\n```python\npersonne = Personne(nom='Marc', age=30)\npersonne.save(_current_user=utilisateur, _reason=\"Message d'information\")\n```\n\nIl est possible sur un historique d'entit\u00e9 ou un historique de champ de demander une restauration des donn\u00e9es de\nl'historique cibl\u00e9 sur l'entit\u00e9 concern\u00e9e gr\u00e2ce \u00e0 la m\u00e9thode ```restore()```, il est possible de lui passer\n\u00e9galement un utilisateur et un message d'information.\n\nLa restauration provoque elle-m\u00eame un historique sp\u00e9cifique qui permet de revenir en arri\u00e8re si n\u00e9cessaire.\n\n```python\nhistory.restore(current_user=utilisateur, reason=\"Message d'information\", rollback=False)\n# rollback permet de reg\u00e9n\u00e9rer compl\u00e8tement l'entit\u00e9 si elle a \u00e9t\u00e9 supprim\u00e9e\n```\n\n### M\u00e9tadonn\u00e9es\n\nLes m\u00e9tadonn\u00e9es permettent d'ajouter des donn\u00e9es tierces sur une entit\u00e9, ces donn\u00e9es peuvent \u00eatre structur\u00e9es comme\nl'utilisateur le souhaitera et seront stock\u00e9es sous forme de JSON dans la base de donn\u00e9es. Chaque entit\u00e9 poss\u00e8de des\nm\u00e9thodes permettant d'acc\u00e9der aux m\u00e9tadonn\u00e9es de l'entit\u00e9.\n\nLes donn\u00e9es stock\u00e9es dans les m\u00e9tadonn\u00e9es peuvent \u00eatre de n'importe quel type Python \u00e0 condition que ce dernier ainsi\nque les donn\u00e9es qu'il contient \u00e9ventuellement soient s\u00e9rialisables (list, dict, int, float, etc...).\n\n```python\npersonne.set_metadata('cle', 'valeur')\npersonne.get_metadata('cle')\n>>> 'valeur'\npersonne.del_metadata('cle')\npersonne.get_metadata('cle')\n>>> None\n```\n\nLes m\u00e9tadonn\u00e9es d'une entit\u00e9 peuvent \u00eatre directement utilis\u00e9es dans des requ\u00eates m\u00eame si ce n'est pas recommand\u00e9 pour\ndes raisons de performances (en fonction du volume de donn\u00e9es).\nElles sont repr\u00e9sent\u00e9es sous forme d'un mod\u00e8le Django ``common.models.MetaData``.\n\n```python\nPersonne.objects.filter(metadata__key='cle', metadata__value='valeur').first()\nMetaData.objects.search(key='cle', value='valeur', type=Personne)\n```\n\n### S\u00e9rialisation\n\nChaque entit\u00e9 ou requ\u00eate concernant une entit\u00e9 peut \u00eatre s\u00e9rialis\u00e9e en utilisant la m\u00e9thode \n``serialize(format='json')`` dans l'un des formats suivants:\n* JSON\n* XML\n* YAML\n\n```python\npersonne = Personne.objects.first()\nresultat = personne.serialize()\nresultat\n>>> [json] Personne (1)\nresultat.data\n>>> '[{\"nom\": \"Marc\", \"age\": 30}]'\npersonne = resultat.deserialize()\npersonne\n>>> Personne: Marc (30 ans)\n```\n\n```python\npersonnes = Personne.objects.all()\nresultat = personnes.serialize()\nresultat\n>>> [json] Personne (2)\nresultat.data\n>>> '[{\"nom\": \"Marc\", \"age\": 30}, {\"nom\": \"Eric\", \"age\": 40}]'\npersonnes = resultat.deserialize()\npersonnes\n>>> [Personne: Marc (30 ans), Personne: Eric (40 ans)]\n```\n\n### Repr\u00e9sentation en dictionnaire\n\nUne requ\u00eate ou une entit\u00e9 peut \u00eatre repr\u00e9sent\u00e9e par un dictionnaire Python avec la m\u00e9thode ``to_dict()``.\n\n```python\npersonne.to_dict()\n>>> {\"nom\": \"Marc\", \"age\": 30}\nPersonne.objects.all().to_dict()\n>>> [{\"nom\": \"Marc\", \"age\": 30}, {\"nom\": \"Eric\", \"age\": 40}]\n```\n\n``to_dict()`` prend plusieurs arguments optionnels en param\u00e8tres, la m\u00e9thode est document\u00e9e dans le code.\n\n### Type d'entit\u00e9\n\nDjango conserve syst\u00e9matiquement le type des diff\u00e9rents mod\u00e8les en base de donn\u00e9es, les entit\u00e9s poss\u00e8dent un moyen\nsimple pour r\u00e9cup\u00e9rer ce type sur chaque entit\u00e9 de mani\u00e8re performante et unique.\n\n```python\nPersonne.get_model_type()\n>>> \npersonne.model_type\n>>> \n```\n\n### WebHooks\n\nUn webhook est un callback HTTP qui transmet des donn\u00e9es \u00e0 un serveur externe en fonction d'une action \nr\u00e9alis\u00e9e sur l'application. Le r\u00e9cepteur doit \u00eatre en mesure de comprendre le message qui est transmis.\nIl est possible de configurer un webhook qui r\u00e9agit \u00e0 un ou plusieurs actions sur une ou plusieurs entit\u00e9s.\n\nLes actions couvertes sont les suivantes :\n* Cr\u00e9ation\n* Modification\n* Suppression\n* Relations de type many-to-many\n\nUn webhook peut \u00eatre configur\u00e9 pour utiliser une authentification sur le serveur externe si n\u00e9cessaire.\n\nPar d\u00e9faut, le webhook ex\u00e9cute la m\u00e9thode ``to_dict()`` sur l'instance concern\u00e9 avec les param\u00e8tres d\u00e9finis dans\n``NOTIFY_OPTIONS``, mais il est possible de changer ce comportement en d\u00e9finissant une m\u00e9thode ``get_webhook_data`` au\nniveau du mod\u00e8le.\n\nLes notifications des changements par webhook est d\u00e9sactiv\u00e9e par d\u00e9faut et peut \u00eatre activ\u00e9 via ``NOTIFY_CHANGES``.\n\n### Usage de service\n\nL'usage des services permet de compter le nombre de fois o\u00f9 une URL est appel\u00e9e dans l'application par un m\u00eame\nutilisateur et m\u00eame de limiter le nombre d'usages.\n\nLa fonctionnalit\u00e9 est d\u00e9sactiv\u00e9e par d\u00e9faut et peut \u00eatre activ\u00e9e via ``SERVICE_USAGE``. \nIl est \u00e9galement n\u00e9cessaire d'ajouter ``'common.middleware.ServiceUsageMiddleware'`` dans ``MIDDLEWARE_CLASSES``.\n\n### M\u00e9tadonn\u00e9es utilisateurs & groupes\n\nDe la m\u00eame mani\u00e8re que sur les entit\u00e9s, les utilisateurs et les groupes ont la possibilit\u00e9 de conserver de \nl'information contextuelle sous forme de m\u00e9tadonn\u00e9e, cependant le fonctionnement diff\u00e8re car ces mod\u00e8les peuvent \u00eatre\nsubstitu\u00e9s dans le d\u00e9veloppement.\n\nIl s'agit alors d'une relation de type one-to-one syst\u00e9matiquement pr\u00e9sent \u00e0 la cr\u00e9ation d'un nouvel utilisateur ou\nd'un nouveau groupe et poss\u00e9dant un champ de type JSON pour contenir ces donn\u00e9es.\n\n## Utilitaires\n\nUn grand nombre de fonctions, d\u00e9corateurs et classes utilitaires sont \u00e0 disposition des d\u00e9veloppeurs pour acc\u00e9l\u00e9rer la\nproduction de nouvelles fonctionnalit\u00e9s. Ces utilitaires sont regroup\u00e9s dans ``common.utils`` pour tout ce qui est\nrelatif \u00e0 Django et dans ``common.api.utils`` pour tout ce qui est relatif \u00e0 Django REST Framework.\n\n* ``singleton`` : d\u00e9corateur permettant de transformer une classe en singleton\n* ``get_current_app`` : permet de r\u00e9cup\u00e9rer l'application Celery actuelle ou un mock si Celery n'est pas install\u00e9\n* ``parsedate`` : permet d'\u00e9valuer une date dans n'importe quel format\n* ``timeit`` : d\u00e9corateur permettant de calculer le temps d'ex\u00e9cution d'une fonction\n* ``synchronized`` : d\u00e9corateur permettant de rendre thread-safe l'ex\u00e9cution d'une fonction\n* ``temporary_upload`` : d\u00e9corateur permettant \u00e0 une vue de supporter l'import d'un fichier de mani\u00e8re temporaire\n* ``download_file`` : d\u00e9corateur permettant \u00e0 une vue de supporter le t\u00e9l\u00e9chargement d'un fichier\n* ``render_to`` : d\u00e9corateur permettant de simplifier l'\u00e9criture d'une vue avec template\n* ``ajax_request`` : d\u00e9corateur permettant \u00e0 une vue de se comporter comme une api_view\n* ``evaluate`` : permet d'\u00e9valuer une expression Python de mani\u00e8re plus s\u00fbre\n* ``execute`` : permet d'ex\u00e9cuter du code Python de mani\u00e8re plus s\u00fbre\n* ``patch_settings`` : context manager permettant d'alt\u00e9rer la configuration le temps de l'ex\u00e9cution\n* ``recursive_dict_product`` : permet de faire un produit cart\u00e9sien des donn\u00e9es d'un dictionnaire\n* ``get_choices_fields`` : permet de r\u00e9cup\u00e9rer les choix des mod\u00e8les d'une ou plusieurs applications\n* ``get_prefetchs`` : permet de r\u00e9cup\u00e9rer toutes les relations invers\u00e9es d'un mod\u00e8le\n* ``get_related`` : permet de r\u00e9cup\u00e9rer toutes les relations ascendantes d'un mod\u00e8le\n* ``prefetch_generics`` : permet de r\u00e9cup\u00e9rer les relations g\u00e9n\u00e9riques d'un mod\u00e8le\n* ``str_to_bool`` : permet de convertir une cha\u00eene de caract\u00e8res quelconque en bool\u00e9en\n* ``decimal`` : permet de convertir un \u00e9l\u00e9ment quelconque en nombre d\u00e9cimal\n* ``decimal_to_str`` : permet de convertir un nombre d\u00e9cimal en cha\u00eene de caract\u00e8res\n* ``recursive_get_urls`` : permet de r\u00e9cup\u00e9rer toutes les URLs d'un module\n* ``idict`` : dictionnaire donc les cl\u00e9s sont toujours converties dans un format uniforme\n* ``sort_dict`` : permet de trier un dictionnaire par ses cl\u00e9s\n* ``null`` : objet nul absolu retournant toujours une valeur nulle sans erreur\n* ``to_object`` : permet de convertir un dictionnaire ou un objet Python\n* ``get_size`` : permet de r\u00e9cup\u00e9rer la taille en m\u00e9moire d'un objet Python quelconque\n* ``file_is_text`` : permet de v\u00e9rifier qu'un fichier est au format texte\n* ``process_file`` : permet de s'assurer qu'un fichier est bien complet et d\u00e9compresse les \u00e9ventuelles archives\n* ``base64_encode`` : permet d'encoder une cha\u00eene de caract\u00e8res en base 64\n* ``base64_decode`` : permet de d\u00e9coder une cha\u00eene de caract\u00e8res en base 64\n* ``short_identifier`` : permet de g\u00e9n\u00e9rer un identifiant \"unique\" court\n* ``json_encode`` : permet de s\u00e9rialiser un objet Python en JSON\n* ``json_decode`` : permet de d\u00e9s\u00e9rialiser une cha\u00eene de caract\u00e8res JSON en objet Python\n* ``get_current_user`` : permet de r\u00e9cup\u00e9rer l'utilisateur actuellement connect\u00e9 dans la pile d'ex\u00e9cution\n* ``get_pk_field`` : permet de r\u00e9cup\u00e9rer le champ de cl\u00e9 primaire d'un mod\u00e8le en h\u00e9ritage concret\n\n##### Autres (``common.admin``)\n\n* ``create_admin`` : permet de cr\u00e9er automatiquement les classes d'administration d'un mod\u00e8le\n\n### Champs de mod\u00e8les\n\nLes champs de mod\u00e8le sont d\u00e9finis dans ``common.fields``.\n\n* ``CustomDecimalField`` : champ d\u00e9cimal pour \u00e9viter la repr\u00e9sentation scientifique des nombres\n* ``PickleField`` : champ binaire pour contenir de la donn\u00e9e Python brute\n* ``JsonField`` : champ pour repr\u00e9senter des donn\u00e9es JSON (compatible avec les autres SGBD mais seul PostgreSQL\nsupporte les requ\u00eates sur ce type de champ)\n\n### Formulaires\n\nLes utilitaires autour des formulaires sont d\u00e9finis dans ``common.forms``. Chaque classe utilitaire pour les\nformulaires poss\u00e8dent une interface de base, pr\u00e9fix\u00e9e g\u00e9n\u00e9ralement ``Base`` pour d'autres impl\u00e9mentations.\n\n* ``CommonForm`` : classe de base pour les formulaires avec gestion des historiques\n* ``CommonFormSet`` : classe de base pour les ensembles de formulaires avec gestion des historiques\n* ``CommonModelForm`` : classe de base pour repr\u00e9senter les formulaires issus d'entit\u00e9s\n* ``CommonModelFormSet`` : classe de base pour repr\u00e9senter les ensembles de formulaires issus d'entit\u00e9s\n* ``JsonField`` : champ de formulaire pour repr\u00e9senter les donn\u00e9es JSON\n* ``get_model_form`` : fonction permettant de cr\u00e9er un formulaire d'entit\u00e9 avec des imbrications\n\n# Django REST Framework\n\n## Utilitaires\n\n* ``to_model_serializer`` : d\u00e9corateur permettant de convertir un s\u00e9rialiseur classique en s\u00e9rialiseur de mod\u00e8le\n* ``to_model_viewset`` : d\u00e9corateur permettant d'associer un mod\u00e8le et \u00e0 un s\u00e9rialiseur \u00e0 une vue\n* ``create_model_serializer_and_viewset`` : permet de cr\u00e9er en une fois le s\u00e9rialiseur et la vue pour un mod\u00e8le\n* ``perishable_view`` : permet de g\u00e9rer les donn\u00e9es p\u00e9rissables d'une vue \u00e0 travers l'URL\n* ``api_view_with_serializer`` : d\u00e9corateur permettant de cr\u00e9er une vue assujettie \u00e0 un s\u00e9rialiseur\n* ``create_model_serializer`` : permet de cr\u00e9er un s\u00e9rialiseur de mod\u00e8le\n* ``auto_view`` : d\u00e9corateur permettant de cr\u00e9er une vue \u00e0 partir d'un QuerySet\n* ``api_paginate`` : permet d'ajouter une pagination sur le r\u00e9sultat d'une requ\u00eate pour une vue\n* ``create_api`` : permet de cr\u00e9er les APIs standards (RESTful) pour un ou plusieurs mod\u00e8les\n* ``disable_relation_fields`` : permet de d\u00e9sactiver les listes d\u00e9roulantes pour les relations des APIs\n\n##### S\u00e9rialiseurs (``common.api.serializers``)\n\n* ``CommonModelSerializer`` : s\u00e9rialiseur commun pour repr\u00e9senter les entit\u00e9s\n* ``GenericFormSerializer`` : s\u00e9rialiseur permettant l'imbrication d'entit\u00e9s pour les formulaires\n\n##### Champs (``common.api.fields``)\n\n* ``JsonField`` : champ permettant la gestion des donn\u00e9es JSON\n* ``AsymetricRelatedField`` : champ permettant l'affichage de l'ensemble des donn\u00e9es des entit\u00e9s de cl\u00e9s \u00e9trang\u00e8res\nmais accepte n\u00e9anmoins un simple identifiant \u00e0 la cr\u00e9ation/modification\n* ``CustomHyperlinkedField`` : champ permettant de g\u00e9rer les liens vers d'autres APIs en permettant de croiser\nles diff\u00e9rents namespaces (utilis\u00e9 par d\u00e9faut par les utilitaires)\n\n##### Pagination (``common.api.pagination``)\n\n* ``CustomPageNumberPagination`` : pagination am\u00e9lior\u00e9e pour les APIs \n(doit \u00eatre d\u00e9fini dans ``DEFAULT_PAGINATION_CLASS`` de ``REST_FRAMEWORK``)\n\n##### Rendu (``common.api.renderers``)\n\n* ``CustomCSVRenderer`` : rendu CSV am\u00e9lior\u00e9 avec t\u00e9l\u00e9chargement (uniquement si django-rest-framework-csv est install\u00e9,\ndoit \u00eatre d\u00e9fini dans ``DEFAULT_RENDERER_CLASSES`` de ``REST_FRAMEWORK``)\n\n##### Tests (``common.tests``)\n\n* ``BaseApiTestCase`` : classe de base pour les tests unitaires des APIs\n* ``AuthenticatedBaseApiTestCase`` : classe de base pour les tests unitaires des APIs avec authentification\n* ``create_api_test_class`` : fonction pour g\u00e9n\u00e9rer tous les tests d'une API standard (RESTful)\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/debnet/common-framework", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "common-framework", "package_url": "https://pypi.org/project/common-framework/", "platform": "", "project_url": "https://pypi.org/project/common-framework/", "project_urls": { "Homepage": "https://github.com/debnet/common-framework" }, "release_url": "https://pypi.org/project/common-framework/2019.10.1/", "requires_dist": null, "requires_python": "", "summary": "All-in-one framework for Django and Django REST Framework", "version": "2019.10.1" }, "last_serial": 5907141, "releases": { "2017.10.2": [ { "comment_text": "", "digests": { "md5": "a4927555b192eecda97226ed238a5eea", "sha256": "04ec631d76ffc94d03c43a62ec2cda106271ded39cdcc175634a42e0a710023a" }, "downloads": -1, "filename": "common_framework-2017.10.2-py3-none-any.whl", "has_sig": false, "md5_digest": "a4927555b192eecda97226ed238a5eea", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 250161, "upload_time": "2017-10-04T07:31:33", "url": "https://files.pythonhosted.org/packages/1e/df/ea77d4ffa163d8a9292200fa884958046291c43bf85bef307be82b0f8061/common_framework-2017.10.2-py3-none-any.whl" } ], "2017.11.15": [ { "comment_text": "", "digests": { "md5": "3df0be4a618cc9d95c9c05982f642f73", "sha256": "d9a4df3a180f3ca86763ce88b09e2f25664e5449ca680c0c479693dbd502ac86" }, "downloads": -1, "filename": "common_framework-2017.11.15-py3-none-any.whl", "has_sig": false, "md5_digest": "3df0be4a618cc9d95c9c05982f642f73", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 241816, "upload_time": "2017-11-15T14:30:54", "url": "https://files.pythonhosted.org/packages/ec/ef/9cedde60e4d25616782668025ebc2e09bc7c159a61055545449384896ca3/common_framework-2017.11.15-py3-none-any.whl" } ], "2017.11.23": [ { "comment_text": "", "digests": { "md5": "00bbc3019bbc8fde1f3b2206c005bcd1", "sha256": "06c7960bac7843dcb2c6ea016b8eef5651e1381d96afb748ebf613335fe5e1cf" }, "downloads": -1, "filename": "common_framework-2017.11.23-py3-none-any.whl", "has_sig": false, "md5_digest": "00bbc3019bbc8fde1f3b2206c005bcd1", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 400717, "upload_time": "2017-11-24T04:40:59", "url": "https://files.pythonhosted.org/packages/b1/ab/126cd0a86ff658bc9a0435823d2a0eb5020ed4cac659b34a03b9834914d2/common_framework-2017.11.23-py3-none-any.whl" } ], "2017.12.13": [ { "comment_text": "", "digests": { "md5": "4ea844d2e57fdc8f7d5cac43a22f0a99", "sha256": "c56deb9d5fd81a027ec3298254af27b9c6f81a6bde60a09a25e2c2184a0c5d1e" }, "downloads": -1, "filename": "common_framework-2017.12.13-py3-none-any.whl", "has_sig": false, "md5_digest": "4ea844d2e57fdc8f7d5cac43a22f0a99", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 250513, "upload_time": "2017-12-13T18:13:02", "url": "https://files.pythonhosted.org/packages/cd/25/4a828fb2116df0d6218424f521df3f14f1e1a24ca1f2408e983a9a432d61/common_framework-2017.12.13-py3-none-any.whl" } ], "2017.12.22": [ { "comment_text": "", "digests": { "md5": "8ccd2a45255516e279885d06ceb884e3", "sha256": "ad381a2ef0d867fe76d7ea745fc00a56a8f0989b1f3a3e155ab0f3e1d3f8372d" }, "downloads": -1, "filename": "common_framework-2017.12.22-py3-none-any.whl", "has_sig": false, "md5_digest": "8ccd2a45255516e279885d06ceb884e3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 250707, "upload_time": "2017-12-22T09:20:50", "url": "https://files.pythonhosted.org/packages/89/24/a085423559bec060b81e754c0f930ff663906db4ff6df82f7c7e35703f3f/common_framework-2017.12.22-py3-none-any.whl" } ], "2017.9.13": [ { "comment_text": "", "digests": { "md5": "d79bdd74316f86df78207c0a1cbd7a0b", "sha256": "24f049edd694000f5e93f0b1727047583499fd31754911144f1291b874c73014" }, "downloads": -1, "filename": "common_framework-2017.9.13-py3-none-any.whl", "has_sig": false, "md5_digest": "d79bdd74316f86df78207c0a1cbd7a0b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 249362, "upload_time": "2017-09-13T10:00:51", "url": "https://files.pythonhosted.org/packages/26/2b/f2c521b6d4561df7bd74426a8a221d8f256cc04ca20cadf016c9d6997a21/common_framework-2017.9.13-py3-none-any.whl" } ], "2017.9.20": [ { "comment_text": "", "digests": { "md5": "8cbbef57777857f7a850dc92316b4783", "sha256": "791945224aab9a510942a9f2b9e2ee5c4fbb70a97e056a4f254571e7312de518" }, "downloads": -1, "filename": "common_framework-2017.9.20-py3-none-any.whl", "has_sig": false, "md5_digest": "8cbbef57777857f7a850dc92316b4783", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 249706, "upload_time": "2017-09-20T12:44:44", "url": "https://files.pythonhosted.org/packages/b1/5a/d5c1e596006aa182335360660d0fcd4ac4719d33ba7030ffe3f4f3a1f03c/common_framework-2017.9.20-py3-none-any.whl" } ], "2017.9.28": [ { "comment_text": "", "digests": { "md5": "1dd8775fff8f4c239026eb0f45125e6e", "sha256": "3553e1e7dfd4d7e57571f3ca2299de15820a8a21dbb42a2b7ff7d21a1287b607" }, "downloads": -1, "filename": "common_framework-2017.9.28-py3-none-any.whl", "has_sig": false, "md5_digest": "1dd8775fff8f4c239026eb0f45125e6e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 249721, "upload_time": "2017-09-29T15:29:23", "url": "https://files.pythonhosted.org/packages/55/12/2966de2e6c9410f2517da116c4aff9056640711325ef773b229e4893af2d/common_framework-2017.9.28-py3-none-any.whl" } ], "2018.1.10": [ { "comment_text": "", "digests": { "md5": "a8de32aa8aa0582ccbab247084342ff2", "sha256": "bfdd4f6553bb98724244fe4dbbd480f910ff2fe2205cfd92e8a266a6d4ce7dee" }, "downloads": -1, "filename": "common_framework-2018.1.10-py3-none-any.whl", "has_sig": false, "md5_digest": "a8de32aa8aa0582ccbab247084342ff2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 251119, "upload_time": "2018-01-10T17:19:41", "url": "https://files.pythonhosted.org/packages/ae/79/5d54f895af909c8e52dc9025f6ae8e288dc08f7a04b3ff2eb1bd70cbdb05/common_framework-2018.1.10-py3-none-any.whl" } ], "2018.1.6": [ { "comment_text": "", "digests": { "md5": "95c5ac721f79764d3a12a6b24660deff", "sha256": "102c2e6431a5c19fee99ace3e73d4a209c2bae206b4b49046e208cf1a984fd19" }, "downloads": -1, "filename": "common_framework-2018.1.6-py3-none-any.whl", "has_sig": false, "md5_digest": "95c5ac721f79764d3a12a6b24660deff", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 251129, "upload_time": "2018-01-07T22:54:11", "url": "https://files.pythonhosted.org/packages/df/41/f51f57ab2c9e8e69f4664351a78979e45c945edad81c0520e3f9f604b01d/common_framework-2018.1.6-py3-none-any.whl" } ], "2018.10.10": [ { "comment_text": "", "digests": { "md5": "62956499debad064dae5f8d945042c08", "sha256": "f494875cb035835eb2a04265ec45f56d46a72b0d5556f30f364eddffe402c5f0" }, "downloads": -1, "filename": "common_framework-2018.10.10-py3-none-any.whl", "has_sig": false, "md5_digest": "62956499debad064dae5f8d945042c08", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 292023, "upload_time": "2018-10-10T23:51:28", "url": "https://files.pythonhosted.org/packages/a9/bb/34fa3cad3282572185c7949d2f03a5d2d7ad54d7e42f02c2c83931f7bb9b/common_framework-2018.10.10-py3-none-any.whl" } ], "2018.10.26": [ { "comment_text": "", "digests": { "md5": "d4faf51cb91e76bc3e48a2e602f16f1a", "sha256": "a5b4ef19e90454489c579731f6c4c43e5ded203c1fa98491cfe20f568bfb559e" }, "downloads": -1, "filename": "common_framework-2018.10.26-py3-none-any.whl", "has_sig": false, "md5_digest": "d4faf51cb91e76bc3e48a2e602f16f1a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 429834, "upload_time": "2018-10-26T14:37:40", "url": "https://files.pythonhosted.org/packages/84/b1/b5feb67db9e94574e7487e058931b2642950f2098ef92f11353e787fd221/common_framework-2018.10.26-py3-none-any.whl" } ], "2018.11.26": [ { "comment_text": "", "digests": { "md5": "0c22827680f24df567e7a7aebc8fef2b", "sha256": "94424283a69e3c5b1fb2ae4f1a5f790a0ca20a8f6da660d8dce55b6d02daee71" }, "downloads": -1, "filename": "common_framework-2018.11.26-py3-none-any.whl", "has_sig": false, "md5_digest": "0c22827680f24df567e7a7aebc8fef2b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 430267, "upload_time": "2018-11-26T14:00:49", "url": "https://files.pythonhosted.org/packages/98/dc/77edf31cfd0de94476bb313ad3ad0120afa9d8f13e441bc953d638e5c191/common_framework-2018.11.26-py3-none-any.whl" } ], "2018.12.17": [ { "comment_text": "", "digests": { "md5": "556172fc64c51038ed76c1ef36c73ffc", "sha256": "4d70976d55bebfb281362836d2cb0a5233f984323b489f87be5994eaf315133d" }, "downloads": -1, "filename": "common_framework-2018.12.17-py3-none-any.whl", "has_sig": false, "md5_digest": "556172fc64c51038ed76c1ef36c73ffc", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 427129, "upload_time": "2018-12-17T14:30:37", "url": "https://files.pythonhosted.org/packages/81/bc/9e407b8c9e833ceb4009d3a9fef90b58d00b1c526bf30e67b9562bc2974e/common_framework-2018.12.17-py3-none-any.whl" } ], "2018.12.18": [ { "comment_text": "", "digests": { "md5": "0fc000c6a394af37b641c298a7203701", "sha256": "fb3517f883cd22d9b894f4abf5be875fc9d335cd36cc7c57f2a59523d55a3bd6" }, "downloads": -1, "filename": "common_framework-2018.12.18-py3-none-any.whl", "has_sig": false, "md5_digest": "0fc000c6a394af37b641c298a7203701", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 427273, "upload_time": "2018-12-17T23:33:36", "url": "https://files.pythonhosted.org/packages/19/ce/3e4fafcbb38a11bc6f6296a4b4e8e09c227c14fc6b7d04aad9eb651bf023/common_framework-2018.12.18-py3-none-any.whl" } ], "2018.12.22": [ { "comment_text": "", "digests": { "md5": "abbbcacc1f63630f1cbb75d3ba84baf3", "sha256": "d3fe1278dc15995d44022c6e6c6156c56fad33d2b38ff79e14969112cf29c4d9" }, "downloads": -1, "filename": "common_framework-2018.12.22-py3-none-any.whl", "has_sig": false, "md5_digest": "abbbcacc1f63630f1cbb75d3ba84baf3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 429498, "upload_time": "2018-12-22T19:45:25", "url": "https://files.pythonhosted.org/packages/39/79/3a72f93c078a443b481742c1866da96acbf71b60dca59be272542b10c81c/common_framework-2018.12.22-py3-none-any.whl" } ], "2018.12.4": [ { "comment_text": "", "digests": { "md5": "b29d2e6f18b1884c6e4b5533dcd653eb", "sha256": "c86b853669d7badb9f761dcebb530084d4bab1748e1ed0c1877c53bb4b8b61a5" }, "downloads": -1, "filename": "common_framework-2018.12.4-py3-none-any.whl", "has_sig": false, "md5_digest": "b29d2e6f18b1884c6e4b5533dcd653eb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 435379, "upload_time": "2018-12-03T20:08:10", "url": "https://files.pythonhosted.org/packages/31/8e/95bfece4d8b5f06a3c2ca29ab6339b02d0e2def41cac9f701275dfd727ed/common_framework-2018.12.4-py3-none-any.whl" } ], "2018.12.5": [ { "comment_text": "", "digests": { "md5": "37594620f69e45ad31cf6f6e123e9eaf", "sha256": "8d3da57b545d74f6f251650a857cd530cddcf389932d6ca27e0ff378ce5aada8" }, "downloads": -1, "filename": "common_framework-2018.12.5-py3-none-any.whl", "has_sig": false, "md5_digest": "37594620f69e45ad31cf6f6e123e9eaf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 139588, "upload_time": "2018-12-05T10:07:40", "url": "https://files.pythonhosted.org/packages/a7/7c/5e6e5f4b50e6810d233f2f8aa75cec11955ef12075e74b140178c88413f2/common_framework-2018.12.5-py3-none-any.whl" } ], "2018.2.10": [ { "comment_text": "", "digests": { "md5": "4816e3f9fe53684c3c0366bbe8970e3f", "sha256": "7e77dc8dda5f01f9c67289fea48887a6315e87d64d19490f99547e879292bbbc" }, "downloads": -1, "filename": "common_framework-2018.2.10-py3-none-any.whl", "has_sig": false, "md5_digest": "4816e3f9fe53684c3c0366bbe8970e3f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 253884, "upload_time": "2018-02-11T03:29:47", "url": "https://files.pythonhosted.org/packages/cf/ee/1fac2759f170b699588bd61dcadc4a10a7e8a2ab68fa6ab4f4f463a3b622/common_framework-2018.2.10-py3-none-any.whl" } ], "2018.2.13": [ { "comment_text": "", "digests": { "md5": "c39f347158125e63ff8fd6e82290efe0", "sha256": "6684bfe75ad288675980a0c683999945dd7065a04fcf9fbd1d8de9eddb657e2f" }, "downloads": -1, "filename": "common_framework-2018.2.13-py3-none-any.whl", "has_sig": false, "md5_digest": "c39f347158125e63ff8fd6e82290efe0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 253887, "upload_time": "2018-02-13T10:17:24", "url": "https://files.pythonhosted.org/packages/ed/d5/90a681b18d331e7e2a66660b832ba0748179c93974ffb426b89bb40eec36/common_framework-2018.2.13-py3-none-any.whl" } ], "2018.2.19": [ { "comment_text": "", "digests": { "md5": "af34f2f92f3acdadb0666c825ba2610b", "sha256": "c161efb45e12d6508e8e1f27c3db1ece282925f58d367a271d29dda7d28a4655" }, "downloads": -1, "filename": "common_framework-2018.2.19-py3-none-any.whl", "has_sig": false, "md5_digest": "af34f2f92f3acdadb0666c825ba2610b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 254289, "upload_time": "2018-02-19T16:49:24", "url": "https://files.pythonhosted.org/packages/52/61/e725f42abda1029dc0ded97f4cc95b5f865afb47f2153c04c8c4d139f029/common_framework-2018.2.19-py3-none-any.whl" } ], "2018.2.27": [ { "comment_text": "", "digests": { "md5": "a1b3e59c41d562a6ce5bd7571cec58b8", "sha256": "087f251daea4b613941a40727da0ad109158ce632fa10ea729b4c25bfd6bf986" }, "downloads": -1, "filename": "common_framework-2018.2.27-py3-none-any.whl", "has_sig": false, "md5_digest": "a1b3e59c41d562a6ce5bd7571cec58b8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 255304, "upload_time": "2018-02-28T09:04:55", "url": "https://files.pythonhosted.org/packages/b4/c2/c2b981d5ddf0a4c932ec8301681733c5b4534c56aff239426520f8446f68/common_framework-2018.2.27-py3-none-any.whl" } ], "2018.3.15": [ { "comment_text": "", "digests": { "md5": "ea74c448ace9398a710712ce7468e513", "sha256": "204dab539dab5a9b80ae2a66748a95439d4f2ab093b2206bdc2871b503f366f1" }, "downloads": -1, "filename": "common_framework-2018.3.15-py3-none-any.whl", "has_sig": false, "md5_digest": "ea74c448ace9398a710712ce7468e513", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 256023, "upload_time": "2018-03-15T08:51:53", "url": "https://files.pythonhosted.org/packages/43/d6/0342dbe8d8c93d34a5577204acf327e8d7ba697ca06b78266a026a94d133/common_framework-2018.3.15-py3-none-any.whl" } ], "2018.3.19": [ { "comment_text": "", "digests": { "md5": "69ab70b49c3344616826f330c0953e8e", "sha256": "36b1213ceca9a56d6be93efe0c7b9bad70edb5a2f8eaaff3c057edbb2c7b526e" }, "downloads": -1, "filename": "common_framework-2018.3.19-py3-none-any.whl", "has_sig": false, "md5_digest": "69ab70b49c3344616826f330c0953e8e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 256624, "upload_time": "2018-03-19T14:28:56", "url": "https://files.pythonhosted.org/packages/54/c6/e76bd6f4c2f59c587e21ad7c89bb0f95edd41288d8665b6ed62d76852925/common_framework-2018.3.19-py3-none-any.whl" } ], "2018.3.2": [ { "comment_text": "", "digests": { "md5": "f3105b8197554186ef37b2067afa0eec", "sha256": "d1cf63b303216f34f50cba4d4ac05d2983e07c0bb9513d604c2bc2660b3b557c" }, "downloads": -1, "filename": "common_framework-2018.3.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f3105b8197554186ef37b2067afa0eec", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 255967, "upload_time": "2018-03-05T08:23:31", "url": "https://files.pythonhosted.org/packages/31/dd/cbcc3db4bdd22f58841631dc2766fec1bc8589d681c7d0df60ff3c70088d/common_framework-2018.3.2-py3-none-any.whl" } ], "2018.3.20": [ { "comment_text": "", "digests": { "md5": "f69d2258074234a209b5ad9043bb2de3", "sha256": "87cb0305c1c5f7c969b736c6b298fad2e11e6240b0ac3197e7470816afe65ab9" }, "downloads": -1, "filename": "common_framework-2018.3.20-py3-none-any.whl", "has_sig": false, "md5_digest": "f69d2258074234a209b5ad9043bb2de3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 256673, "upload_time": "2018-03-19T15:11:09", "url": "https://files.pythonhosted.org/packages/03/bd/56602e85aef73abc4c2e2e215aa8c45e521cb33508cf588ca579ed1fd204/common_framework-2018.3.20-py3-none-any.whl" } ], "2018.3.21": [ { "comment_text": "", "digests": { "md5": "f012b34cb868516a19f02c3307d1cf5e", "sha256": "b97bfa117275b70cc10d73d90fff00d5113bec3d09936a55b108c2c962f25a59" }, "downloads": -1, "filename": "common_framework-2018.3.21-py3-none-any.whl", "has_sig": false, "md5_digest": "f012b34cb868516a19f02c3307d1cf5e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 260219, "upload_time": "2018-03-20T13:25:58", "url": "https://files.pythonhosted.org/packages/96/43/7dd55126016ee848e0403ef872092cdcb7d4fc779a959bf4deba22881b06/common_framework-2018.3.21-py3-none-any.whl" } ], "2018.3.23": [ { "comment_text": "", "digests": { "md5": "0aad74853cdb237b9713e7e15ec16d4e", "sha256": "da82326846071565d8adc67feabbee98a4db05a78cd916955204cfc2a9fd73bd" }, "downloads": -1, "filename": "common_framework-2018.3.23-py3-none-any.whl", "has_sig": false, "md5_digest": "0aad74853cdb237b9713e7e15ec16d4e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 260328, "upload_time": "2018-03-23T08:58:55", "url": "https://files.pythonhosted.org/packages/c5/fc/da525b9dbb079382db24429f5f5935be61a1960e5eae3e70024d76d19294/common_framework-2018.3.23-py3-none-any.whl" } ], "2018.3.26": [ { "comment_text": "", "digests": { "md5": "3bfb5e48b45669632a42f53aaf1d2ea5", "sha256": "9a4fcbe9c98e9fc3869488d17938090cbccc56e18ba7b73a5e011d9c8c0a38b0" }, "downloads": -1, "filename": "common_framework-2018.3.26-py3-none-any.whl", "has_sig": false, "md5_digest": "3bfb5e48b45669632a42f53aaf1d2ea5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 260371, "upload_time": "2018-03-26T09:28:56", "url": "https://files.pythonhosted.org/packages/cb/cb/30c8ab70603d1e5e8d284026dbaa4c00aeac66991bbb653b18fd8f562694/common_framework-2018.3.26-py3-none-any.whl" } ], "2018.3.9": [ { "comment_text": "", "digests": { "md5": "375581dd13f17ea146c585b01b9c1ed5", "sha256": "9a4e6bb80697b1f557615267aa435f882f9ef37897de97d5400a59a0466fa00a" }, "downloads": -1, "filename": "common_framework-2018.3.9-py3-none-any.whl", "has_sig": false, "md5_digest": "375581dd13f17ea146c585b01b9c1ed5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 255991, "upload_time": "2018-03-09T09:05:14", "url": "https://files.pythonhosted.org/packages/d3/0e/fffa3c2102b10ca690330fc62cb592495a81931464bd1bf52833efdaa876/common_framework-2018.3.9-py3-none-any.whl" } ], "2018.4.10": [ { "comment_text": "", "digests": { "md5": "eb63c2c7edc0c35683bb63a2a23b6cd3", "sha256": "68e7f1ba6963b4faf7781fa89eef377b0ebcfb828bde9499bf985762cb22b042" }, "downloads": -1, "filename": "common_framework-2018.4.10-py3-none-any.whl", "has_sig": false, "md5_digest": "eb63c2c7edc0c35683bb63a2a23b6cd3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 279570, "upload_time": "2018-04-10T14:07:48", "url": "https://files.pythonhosted.org/packages/a4/f9/5833197f9d88760b5405f830f912e938064a578d93375c68147b77b45e6a/common_framework-2018.4.10-py3-none-any.whl" } ], "2018.4.11": [ { "comment_text": "", "digests": { "md5": "6cd0992f76488dedbdbd94e5a8c0cba4", "sha256": "05482a0b5ee856d36bef6375fbcd953dda6038835adeab341b5a1e983a752614" }, "downloads": -1, "filename": "common_framework-2018.4.11-py3-none-any.whl", "has_sig": false, "md5_digest": "6cd0992f76488dedbdbd94e5a8c0cba4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 279636, "upload_time": "2018-04-12T14:58:59", "url": "https://files.pythonhosted.org/packages/f8/b8/ca6fc1d3b34434530dde959325edd624269724c66ff64837d24e75e0bb0c/common_framework-2018.4.11-py3-none-any.whl" } ], "2018.4.2": [ { "comment_text": "", "digests": { "md5": "b117caccb9b09e50e77bc90dd4f911a3", "sha256": "98f2af24127156e33e9b41addfc4e1290488ab7a6a000d80c8cc97ddcb56980c" }, "downloads": -1, "filename": "common_framework-2018.4.2-py3-none-any.whl", "has_sig": false, "md5_digest": "b117caccb9b09e50e77bc90dd4f911a3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 260648, "upload_time": "2018-04-03T13:26:23", "url": "https://files.pythonhosted.org/packages/15/57/36b54a54c376604597ebf03f7feab8ebfaa5b430639599bb4c282c5bc541/common_framework-2018.4.2-py3-none-any.whl" } ], "2018.4.26": [ { "comment_text": "", "digests": { "md5": "ac08b3a7eca6d29cb19df79a66668309", "sha256": "656bd9836d0e9ee0c739a566fd6cc280cc4bb7f610c09f49674e054119e97044" }, "downloads": -1, "filename": "common_framework-2018.4.26-py3-none-any.whl", "has_sig": false, "md5_digest": "ac08b3a7eca6d29cb19df79a66668309", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 279780, "upload_time": "2018-04-27T10:08:47", "url": "https://files.pythonhosted.org/packages/bd/a7/c92ae01062afe15829e7531eb74d3eff1583d20b943d607bca21c07356fc/common_framework-2018.4.26-py3-none-any.whl" } ], "2018.4.3": [ { "comment_text": "", "digests": { "md5": "d97a821445aa46e53926c3658dc47259", "sha256": "2523f585eab845cae8e1e607040572e9656d3b6816a8b06c05ce302f1341a091" }, "downloads": -1, "filename": "common_framework-2018.4.3-py3-none-any.whl", "has_sig": false, "md5_digest": "d97a821445aa46e53926c3658dc47259", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 260589, "upload_time": "2018-04-04T17:02:16", "url": "https://files.pythonhosted.org/packages/71/a4/fc8dc79c8ebf288c2c0531c790a16809d3e45c93a87a719d2f422aac0e53/common_framework-2018.4.3-py3-none-any.whl" } ], "2018.4.30": [ { "comment_text": "", "digests": { "md5": "50ad497b075ef4610520d940dfa3921b", "sha256": "ce433639e346b226be8a82e21af9f001e3c0652cca8d9bf12074edd58bbbc9ef" }, "downloads": -1, "filename": "common_framework-2018.4.30-py3-none-any.whl", "has_sig": false, "md5_digest": "50ad497b075ef4610520d940dfa3921b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 280252, "upload_time": "2018-04-30T14:03:41", "url": "https://files.pythonhosted.org/packages/1f/34/5557a5aef24f7645a7053d13a14c7cc579e40f6e6a20582ba29a30fde73e/common_framework-2018.4.30-py3-none-any.whl" } ], "2018.4.9": [ { "comment_text": "", "digests": { "md5": "5e0effd31eb772643d0171d97ad6aabe", "sha256": "b702a6b53ecf278d10a9a4fb2ffb392a53d16c9455758467205cd4db024fa6c7" }, "downloads": -1, "filename": "common_framework-2018.4.9-py3-none-any.whl", "has_sig": false, "md5_digest": "5e0effd31eb772643d0171d97ad6aabe", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 279593, "upload_time": "2018-04-09T12:42:41", "url": "https://files.pythonhosted.org/packages/ea/5c/0be18d9fbc5ffc4f85047bee765a665d5a305115676308ff0050fa61ca12/common_framework-2018.4.9-py3-none-any.whl" } ], "2018.5.10": [ { "comment_text": "", "digests": { "md5": "7c89775c1556c6db48f2d42bdce640bf", "sha256": "17e3132c9d30e35fa6e6644ab66526bf65e0db1161d5333a76107a094329226c" }, "downloads": -1, "filename": "common_framework-2018.5.10-py3-none-any.whl", "has_sig": false, "md5_digest": "7c89775c1556c6db48f2d42bdce640bf", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286151, "upload_time": "2018-05-10T15:44:31", "url": "https://files.pythonhosted.org/packages/a5/c8/d580b323efdd98d7c4acc98ed974f3ae5e5d83358ded02474c16e83da4c4/common_framework-2018.5.10-py3-none-any.whl" } ], "2018.5.22": [ { "comment_text": "", "digests": { "md5": "d720c51ec998c0bf12ae1900e3687dda", "sha256": "bbdff5397723916f930d54b9747e5c15294faf7b404c508cb140064c25e0b305" }, "downloads": -1, "filename": "common_framework-2018.5.22-py3-none-any.whl", "has_sig": false, "md5_digest": "d720c51ec998c0bf12ae1900e3687dda", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286672, "upload_time": "2018-05-23T14:15:32", "url": "https://files.pythonhosted.org/packages/e0/de/91051ee10645394c9412f8875d35311addb446c8e85705d02d5a78e3c8eb/common_framework-2018.5.22-py3-none-any.whl" } ], "2018.5.23": [ { "comment_text": "", "digests": { "md5": "4fd516f169a58a1976435c8b172d7744", "sha256": "db162c5f4b043023be5740efa4d145db27947e7047815d27c92c979cbf8bf611" }, "downloads": -1, "filename": "common_framework-2018.5.23-py3-none-any.whl", "has_sig": false, "md5_digest": "4fd516f169a58a1976435c8b172d7744", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286748, "upload_time": "2018-05-23T15:18:27", "url": "https://files.pythonhosted.org/packages/28/e1/c498ad092cf1b9ea8893cfb5cb0da1588d941f44bad0edf8579fcdc43f8b/common_framework-2018.5.23-py3-none-any.whl" } ], "2018.5.4": [ { "comment_text": "", "digests": { "md5": "9c0b4c35b75cc77904fafb5c5c603bf6", "sha256": "a85215590d08f9965a78b0828f963a6d4e87a15d5baba9c26cadc6280e09e945" }, "downloads": -1, "filename": "common_framework-2018.5.4-py3-none-any.whl", "has_sig": false, "md5_digest": "9c0b4c35b75cc77904fafb5c5c603bf6", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 280326, "upload_time": "2018-05-04T12:40:49", "url": "https://files.pythonhosted.org/packages/09/71/34f7711e9c442fcd229849d6ebafba25fab75fe73277977e41adae5f9c24/common_framework-2018.5.4-py3-none-any.whl" } ], "2018.5.7": [ { "comment_text": "", "digests": { "md5": "ec70629a0622f1a99132b4b3746dab87", "sha256": "66ba96a15ef5b27c062ceea0a6282dd0bd3e1856439790450205325ed3f47a82" }, "downloads": -1, "filename": "common_framework-2018.5.7-py3-none-any.whl", "has_sig": false, "md5_digest": "ec70629a0622f1a99132b4b3746dab87", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286117, "upload_time": "2018-05-07T09:21:25", "url": "https://files.pythonhosted.org/packages/9f/5c/a82b9d249a5b2ec63ea1321d27419a12d4f6e5ddf0a057b6b299e29af03b/common_framework-2018.5.7-py3-none-any.whl" } ], "2018.6.13": [ { "comment_text": "", "digests": { "md5": "cf6d8b54ff84ba86f36217986af25258", "sha256": "c243c6e826c0d2df6264df199a2979d83b84ba7bca6ce96aab0b473af8e09cc5" }, "downloads": -1, "filename": "common_framework-2018.6.13-py3-none-any.whl", "has_sig": false, "md5_digest": "cf6d8b54ff84ba86f36217986af25258", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286885, "upload_time": "2018-06-14T12:50:19", "url": "https://files.pythonhosted.org/packages/47/bc/ef66f8b5805ab63a0eccc374a3b921847cea92ea636c58d0f7afc49e6cc4/common_framework-2018.6.13-py3-none-any.whl" } ], "2018.7.24": [ { "comment_text": "", "digests": { "md5": "a93d79c00b9667efe4d522131721eef9", "sha256": "30f57b68c124c68a43db5dd5302d89cbd863b7adba720109735ed62563f21dae" }, "downloads": -1, "filename": "common_framework-2018.7.24-py3-none-any.whl", "has_sig": false, "md5_digest": "a93d79c00b9667efe4d522131721eef9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286728, "upload_time": "2018-07-24T12:48:43", "url": "https://files.pythonhosted.org/packages/f2/a5/b0ec7c6f2333c7686cf263ee5f2dbe40fc554a05ff201e588325d3111fa4/common_framework-2018.7.24-py3-none-any.whl" } ], "2018.7.25": [ { "comment_text": "", "digests": { "md5": "97a1c621586e1b6438f311316c861464", "sha256": "745c25a0ce337984ddf28701e32e3cd217cbce1505db78ee9273b209c468989d" }, "downloads": -1, "filename": "common_framework-2018.7.25-py3-none-any.whl", "has_sig": false, "md5_digest": "97a1c621586e1b6438f311316c861464", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 287212, "upload_time": "2018-07-25T12:31:34", "url": "https://files.pythonhosted.org/packages/21/bc/8e3376516fb02c04d89b6fb247583119341383c9c3a0ee2a090b2582ba55/common_framework-2018.7.25-py3-none-any.whl" } ], "2018.7.9": [ { "comment_text": "", "digests": { "md5": "8a96dce22e1948c982ac1e5f59b142d9", "sha256": "74e81a3fc469369e762bbbeeb17daa0ccce2723303cead0b0e8106ebc84b9631" }, "downloads": -1, "filename": "common_framework-2018.7.9-py3-none-any.whl", "has_sig": false, "md5_digest": "8a96dce22e1948c982ac1e5f59b142d9", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286699, "upload_time": "2018-07-12T12:12:30", "url": "https://files.pythonhosted.org/packages/dd/ef/b2beb93dd8ef94c91a0dc75869c49464d96796d24c4eb4cdeccd874329bf/common_framework-2018.7.9-py3-none-any.whl" } ], "2019.1.16": [ { "comment_text": "", "digests": { "md5": "63c7754ffeae8901bb9f7ab395bc06f8", "sha256": "6e2b630345a781862cbed3d68e55d859d24a58dfd96debc080cefe75a93da8c8" }, "downloads": -1, "filename": "common_framework-2019.1.16-py3-none-any.whl", "has_sig": false, "md5_digest": "63c7754ffeae8901bb9f7ab395bc06f8", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 429545, "upload_time": "2019-01-17T01:35:29", "url": "https://files.pythonhosted.org/packages/a8/85/bda0242402ce4eb7ea3bf5344b0538c7eafe0196aa23793ab6645c00b7b5/common_framework-2019.1.16-py3-none-any.whl" } ], "2019.10.1": [ { "comment_text": "", "digests": { "md5": "bb0aacb2770e72490d437a0351dedf4c", "sha256": "7872c678a0fbf66272b5bf12992819915181fd59bc1f26d7b853860b15d8e51c" }, "downloads": -1, "filename": "common_framework-2019.10.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bb0aacb2770e72490d437a0351dedf4c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 288741, "upload_time": "2019-09-30T14:20:50", "url": "https://files.pythonhosted.org/packages/d6/98/35801b6ed8cfdeb99bd12be2ba3cd74f78d2fc5fbb943ee4bdfcaf454af4/common_framework-2019.10.1-py3-none-any.whl" } ], "2019.2.1": [ { "comment_text": "", "digests": { "md5": "821a47c315f9f70c5a072c31be1d078f", "sha256": "535286dc8d66cd7924ba3027e35c0a65680ae5b718b803174eda3beb87eca2a4" }, "downloads": -1, "filename": "common_framework-2019.2.1-py3-none-any.whl", "has_sig": false, "md5_digest": "821a47c315f9f70c5a072c31be1d078f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 442006, "upload_time": "2019-02-02T18:10:23", "url": "https://files.pythonhosted.org/packages/b0/65/dcb758ca0f015ab9d43c967233f35ed1e22ef9dc95dd4e28165a2b3e9d91/common_framework-2019.2.1-py3-none-any.whl" } ], "2019.2.6": [ { "comment_text": "", "digests": { "md5": "227abecce286d5d5b7ea7110ced3b0c2", "sha256": "0bbdebad72994a2e147088c2a13372dcbcb50b2938c1a8b9a532ed08b1a389ef" }, "downloads": -1, "filename": "common_framework-2019.2.6-py3-none-any.whl", "has_sig": false, "md5_digest": "227abecce286d5d5b7ea7110ced3b0c2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 442081, "upload_time": "2019-02-07T15:16:05", "url": "https://files.pythonhosted.org/packages/86/86/ac5d2800e74b91728ed87882a3e93fdf2f258ed36f75a988951c1fba7412/common_framework-2019.2.6-py3-none-any.whl" } ], "2019.3.5": [ { "comment_text": "", "digests": { "md5": "f2a6cf22f92995b0ebf1aa2cf44f7a94", "sha256": "374df4bd33699dc4b7d8b2e8e3e93c4934df005cce355a928000f4bc82908f11" }, "downloads": -1, "filename": "common_framework-2019.3.5-py3-none-any.whl", "has_sig": false, "md5_digest": "f2a6cf22f92995b0ebf1aa2cf44f7a94", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 442077, "upload_time": "2019-03-05T09:53:33", "url": "https://files.pythonhosted.org/packages/69/60/938676f533bfd824f50a6291693e23ba304d08733821a7e18fdf018b29d7/common_framework-2019.3.5-py3-none-any.whl" } ], "2019.4.5": [ { "comment_text": "", "digests": { "md5": "8e219ebfcae8ffa7ecbd8102d9ec6479", "sha256": "62f9356ad83939e65ce211e134eeb9e229e54c662c7805243bf9fe96b79f3889" }, "downloads": -1, "filename": "common_framework-2019.4.5-py3-none-any.whl", "has_sig": false, "md5_digest": "8e219ebfcae8ffa7ecbd8102d9ec6479", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 446604, "upload_time": "2019-04-05T00:25:31", "url": "https://files.pythonhosted.org/packages/a7/8d/f64ea15b5a5435e4f02332f2429ed312d42fe75dce9e9a0474f399284d64/common_framework-2019.4.5-py3-none-any.whl" } ], "2019.5.14": [ { "comment_text": "", "digests": { "md5": "0d23a76350990ff843e3f135ba7635cb", "sha256": "5ddf5bfb59cddccc214a3ca00d40260f29ffd9ce9ca9bf628f5ded3a53bc5c05" }, "downloads": -1, "filename": "common_framework-2019.5.14-py3-none-any.whl", "has_sig": false, "md5_digest": "0d23a76350990ff843e3f135ba7635cb", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 142330, "upload_time": "2019-05-13T19:37:40", "url": "https://files.pythonhosted.org/packages/61/32/14ee2105902e83e35e0da0166d2cf9f529f4feded0c9f656d4bce04ab87c/common_framework-2019.5.14-py3-none-any.whl" } ], "2019.5.15": [ { "comment_text": "", "digests": { "md5": "242ba0d1e01be286a271d06eceee0d4b", "sha256": "101aa47a28a8d16040996317827ef8b460bc1f1b99edca02362652b59557d205" }, "downloads": -1, "filename": "common_framework-2019.5.15-py3-none-any.whl", "has_sig": false, "md5_digest": "242ba0d1e01be286a271d06eceee0d4b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 142297, "upload_time": "2019-05-16T08:18:57", "url": "https://files.pythonhosted.org/packages/3e/7f/d7ff44815bf266a86bbf2cc42bfa6b39c894a47a81f1298dd8501667489c/common_framework-2019.5.15-py3-none-any.whl" } ], "2019.6.15": [ { "comment_text": "", "digests": { "md5": "c774b678f348158900f94130e4155e53", "sha256": "d937fc5d519169ed3e8d38a360294616be252500e5e6b273914b3c2c7c7b6979" }, "downloads": -1, "filename": "common_framework-2019.6.15-py3-none-any.whl", "has_sig": false, "md5_digest": "c774b678f348158900f94130e4155e53", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 142293, "upload_time": "2019-06-19T15:12:43", "url": "https://files.pythonhosted.org/packages/5d/a4/b3d3b6e47c582eeaa785bf9613842e0b987d9cc691526d45f7505bb4131f/common_framework-2019.6.15-py3-none-any.whl" } ], "2019.6.20": [ { "comment_text": "", "digests": { "md5": "cbe89206083747d004a257f76833de9e", "sha256": "31ed6178a52076af91a3597fe0cdd85ea0a96d44f0fb814f2f24b6ef8e327969" }, "downloads": -1, "filename": "common_framework-2019.6.20-py3-none-any.whl", "has_sig": false, "md5_digest": "cbe89206083747d004a257f76833de9e", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 142312, "upload_time": "2019-06-21T12:28:30", "url": "https://files.pythonhosted.org/packages/bc/e1/43fbc82037f444761ea0b3936dcc267bf800a6b6caa44ebcbed949adc3de/common_framework-2019.6.20-py3-none-any.whl" } ], "2019.7.1": [ { "comment_text": "", "digests": { "md5": "67c605e5d7b96a671cecfb5d3f728cb2", "sha256": "66b4d0f1da488d7f958d1ca1eda773fb779d3a5184aafe5744f0a1101d5e0528" }, "downloads": -1, "filename": "common_framework-2019.7.1-py3-none-any.whl", "has_sig": false, "md5_digest": "67c605e5d7b96a671cecfb5d3f728cb2", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 266937, "upload_time": "2019-07-04T13:39:25", "url": "https://files.pythonhosted.org/packages/5b/4c/26d27a7c565d57f1f46e6685a5f39fde6f9e6ee1316996c958460f21c6f5/common_framework-2019.7.1-py3-none-any.whl" } ], "2019.7.7": [ { "comment_text": "", "digests": { "md5": "c9bfcb114b61a54a6a396854f9922dc0", "sha256": "74b2467ceba366c1364821cac6bb4ce526fa1bd7e693466f6324c75d92cc10b9" }, "downloads": -1, "filename": "common_framework-2019.7.7-py3-none-any.whl", "has_sig": false, "md5_digest": "c9bfcb114b61a54a6a396854f9922dc0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 131085, "upload_time": "2019-07-09T12:29:49", "url": "https://files.pythonhosted.org/packages/24/65/2fc7d23c3adca05c3873ef0a2c37c464e2f9306895a07476d7f5a0d6ea2d/common_framework-2019.7.7-py3-none-any.whl" } ], "2019.8.1": [ { "comment_text": "", "digests": { "md5": "f6822480a9900ae950ab34f5d1d7b397", "sha256": "9ae9c8c52dd96652af537d4d6201eea8af516e5c5a339339b3a6df729288eda7" }, "downloads": -1, "filename": "common_framework-2019.8.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f6822480a9900ae950ab34f5d1d7b397", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 284587, "upload_time": "2019-08-01T15:58:58", "url": "https://files.pythonhosted.org/packages/19/03/14676a866614e875c33259017e10e0914b0b96e9a1e37fc54297556eaec4/common_framework-2019.8.1-py3-none-any.whl" } ], "2019.8.8": [ { "comment_text": "", "digests": { "md5": "04705ef80bf97655fed2db42547e6d7f", "sha256": "9a7129449220871ef9d0164b38abfec7109cce30316435ae825d713b1cb517ee" }, "downloads": -1, "filename": "common_framework-2019.8.8-py3-none-any.whl", "has_sig": false, "md5_digest": "04705ef80bf97655fed2db42547e6d7f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 286260, "upload_time": "2019-08-12T13:59:39", "url": "https://files.pythonhosted.org/packages/f5/ca/637c2d591faeb740d6d6cddb106c62a3e714d0714c8f4be0fe48f8f8ec37/common_framework-2019.8.8-py3-none-any.whl" } ], "2019.9.1": [ { "comment_text": "", "digests": { "md5": "41a24f29933c13db325431b5e47f37ee", "sha256": "585d6871a25f9f63a1bf661495a4e062058a10630f7052a2e36408d5c85acbba" }, "downloads": -1, "filename": "common_framework-2019.9.1-py3-none-any.whl", "has_sig": false, "md5_digest": "41a24f29933c13db325431b5e47f37ee", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 288713, "upload_time": "2019-09-02T14:27:27", "url": "https://files.pythonhosted.org/packages/02/c3/ee7e88f28e7fb88de1fcec1e84b319322d9b94ce7e8944f922f7f75a4e79/common_framework-2019.9.1-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "bb0aacb2770e72490d437a0351dedf4c", "sha256": "7872c678a0fbf66272b5bf12992819915181fd59bc1f26d7b853860b15d8e51c" }, "downloads": -1, "filename": "common_framework-2019.10.1-py3-none-any.whl", "has_sig": false, "md5_digest": "bb0aacb2770e72490d437a0351dedf4c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 288741, "upload_time": "2019-09-30T14:20:50", "url": "https://files.pythonhosted.org/packages/d6/98/35801b6ed8cfdeb99bd12be2ba3cd74f78d2fc5fbb943ee4bdfcaf454af4/common_framework-2019.10.1-py3-none-any.whl" } ] }