{ "info": { "author": "FID-Judaica, Goethe Universit\u00e4t", "author_email": "a.christianson@ub.uni-frankfurt.de", "bugtrack_url": null, "classifiers": [], "description": "Deromanize\n==========\n``deromanize`` is a set of tools to aid in converting Romanized text\nback into original scripts.\n\n.. contents::\n\nInstallation\n------------\n``deromanize`` requires Python 3.5 or better.\n\n\n.. code:: bash\n\n $ git clone https://github.com/fid-judaica/deromanize\n $ cd deromanize\n $ pip3 install .\n\nOr, to use the version in PyPI:\n\n.. code:: bash\n\n $ pip3 install deromanize\n\nThis assumes you're working in a virtualenv, as you ought. Otherwise,\nuse the ``--user`` flag with ``pip``. There's no reason ever to install this as root.\nDon't do it.\n\nBasic usage\n-----------\nThe first step in working with ``deromanize`` is defining your decoding\nkeys in data through a profile.\n\nA profile has fairly simple format. It is a dictionary which contains\ndictionaries that have all the information needed to build up\ntransliteration rules. It can easily be stored as JSON or any format\ncan represent the same data structures as JSON. I like to use YAML\nbecause it's easy to write.\n\nThe profile should contain at least one character group (the example\nbelow has two) and a ``keys`` section.\n\n.. code:: yaml\n\n keys:\n base:\n - consonants\n - vowels\n\n consonants:\n \u02be: \u05d0\n b: \u05d1\n v: \u05d1\n g: \u05d2\n d: \u05d3\n h: \u05d4\n \u1e7f: [\u05d5\u05d5, \u05d5]\n z: \u05d6\n \u1e25: \u05d7\n \u1e6d: \u05d8\n y: [\u05d9\u05d9, \u05d9]\n k: \u05db\n kh: \u05db\n l: \u05dc\n m: \u05de\n n: \u05e0\n s: \u05e1\n \u02bf: \u05e2\n p: \u05e4\n f: \u05e4\n ts: \u05e6\n \u1e33: \u05e7\n r: \u05e8\n \u015b: \u05e9\n sh: \u05e9\n t: \u05ea\n\n vowels:\n i: \u05d9\n e: ['', \u05d9]\n a: ''\n o: [\u05d5, '']\n u: \u05d5\n\nNote:\n The letters in the arrays are reversed on this web page when viewed in\n most modern web browsers because of automatic bidi resolution. Most\n editors also pull these shenanigans, which is great for text, but not\n great for code. Emacs has options for this, and Vim doesn't even try\n to fix bidi (though your terminal might). I don't know what kind of\n options your favorite editor has for falling back to \"stupid\" LTR text\n flow when it screws up code readability.\n\nCharacter groups:\n\nEach character group is a dictionary containing the Romanized form\ncharacter as a key, and the original form as the value. If a Romanized\nkey can have multiple possible interpretations, they may be put in\nlists. The person defining the standard ought to put these replacements\nin the order they believe to most frequent in the actual language, as\nresults will ultimately be sorted based on the index numbers of these\nlists.\n\nRomanized forms can contain an arbitrary number of characters, so\ndigraphs will be fine. You may even wish to define longer clusters to,\nfor example, provide uniform handling of common morphological\naffixes. ``deromanize`` uses greedy matching, so the longest possible\ncluster will always be matched. There are also other uses for character\ngroups involving pattern matching which will be covered later. (You can\nreally stick any arbitrary data in this file that you think might be\nhelpful later; aside from two keys, ``keys`` and ``char_sets``, nothing\nwill be processed automatically)\n\nKeys:\n\n``keys`` is a dictionary of objects that allow you to compose the\ndifferent character groups in different ways. For one-to-one\ntransliteration standards, you'd theoretically only need one key (and\nprobably not need to mess around with this framework, though it would\nget the job done just fine).\n\nIn this case, we create one key called ``base`` and a list of the groups\nit will contain, ``consonants`` and ``vowels``.\n\nGiven the above configuration, we can do something like this:\n\n.. code:: python\n\n >>> # KeyGenerators only deal with python objects, so we have to\n >>> # deserialize it from our chosen format.\n >>> import deromanize as dr\n >>> import yaml\n >>> PROFILE = yaml.safe_load(open('above_profile.yml'))\n >>> keys = dr.KeyGenerator(PROFILE)\n\nFrom here, we can start sending words to the ``base`` key and see what\ncomes out.\n\n.. code:: python\n\n >>> parts = keys['base'].getallparts('shalom')\n >>> parts\n [ReplacementList('sh', [(0, '\u05e9')]), ReplacementList('a', [(0, '')]), ReplacementList('l', [(0, '\u05dc')]), ReplacementList('o', [(0, '\u05d5'), (1, '')]), ReplacementList('m', [(0, '\u05de')])]\n >>> # looks a little silly.\n >>> shalom = dr.add_rlists(parts)\n >>> shalom\n ReplacementList('shalom', [(0, '\u05e9\u05dc\u05d5\u05de'), (1, '\u05e9\u05dc\u05de')])\n >>> # conversion to a string provides a more readable version\n >>> print(shalom)\n shalom:\n 0 \u05e9\u05dc\u05d5\u05de\n 1 \u05e9\u05dc\u05de\n\nSo, basically, the ``.getallparts()`` method takes a string as input and\ndecodes it bit by bit, grabbing all possible original versions for each\nRomanization symbol. You can get all the possible version of the word\ntogether. Ignore the numbers for now. They have to deal with\nsorting. This is just to demonstrate the most basic use-case. The\nHebrew-speakers may observe that neither of these options is correct\n(because it doesn't account for final letters), so we'll dive a bit\ndeeper into the system to see how more complex situations can be dealt\nwith.\n\nBuilding Complex Profiles\n-------------------------\nLet's take a look at a more complex profile, bit by bit. (See the\nprofile in its entirety here_.)\n\n.. _here: ./tests/test.yml\n\nDefining Keys\n~~~~~~~~~~~~~\n\n.. code:: yaml\n\n keys:\n base:\n groups:\n - consonants\n - vowels\n - other\n - clusters\n - infrequent: 10\n\n front:\n parent: base\n groups:\n - beginning\n - beginning patterns\n\n end:\n parent: base\n groups: final\n suffix: true\n\nThe first thing to know is that there are a few configuration shortcuts\nif a key only contains a list, that list is automatically assigned to\n``groups``. Therefore:\n\n .. code:: yaml\n\n base:\n - consonants\n - vowels\n - other\n - clusters\n - infrequent: 10\n\nis the same as...\n\n.. code:: yaml\n\n base:\n groups:\n - consonants\n - vowels\n - other\n - clusters\n - infrequent: 10\n\nThe other shortcut is that ``base`` is actually a special key name. If\nit is defined, all other character groups will inherit the default\ncharacter set from it as a prototype which you can selectively override\nand extend with other character groups to build all the groups you need.\n\nTherefore:\n\n.. code:: yaml\n\n front:\n - beginning\n - beginning patterns\n\n\\... is the same as...\n\n.. code:: yaml\n\n front:\n base: base\n groups:\n - beginning\n - beginning patterns\n\nIf you don't want this behavior for any of your keys, you can simply\nchoose not to define ``base``. If you find it useful, but you want to\nget out of it for a particular key, you can set it to ``None`` (which\nhappens to be spelled ``null`` in JSON and YAML).\n\n.. code:: yaml\n\n front:\n base: null\n groups: (some groups here)\n\nYou can, of course, use any other key as your base and get into some\nrather sophisticated composition if you wish. Just don't create a\ndependency cycle or you'll end up in a never-ending loop. (Well, I guess\nit will end when Python hits its recursion limit.)\n\nOne last thing you may notice that's odd in this section is that one of\nthe groups in ``base`` is ``infrequent: 10``. This is a way to\nmanipulate the sort order of results. It might be a good time to explain\nthat in a little more detail.\n\nSorting and \"Weight\"\n~~~~~~~~~~~~~~~~~~~~\nEach possible replacement for any Romanization symbol or cluster may\nhave one or more possible replacements, and therefore can be given as\nlists. As shorthand, if there is only one possible replacement, it may\nbe a string, but it will be converted to a list containing that one\nitem at runtime.\n\nAs the items are added, they are assigned a ``weight``. In the common\ncase, that weight is simply the index number in the list.\n\nLet's go back and pretend that are working with the simple profile at\nthe top of this README. We have a line like this in the file:\n\n.. code:: yaml\n\n y: [\u05d9\u05d9, \u05d9]\n\nWhen we run this through the KeyGenerator instance we can see what happens\nto it:\n\n.. code:: python\n\n >>> key['base']['y']\n ReplacementList('y', [(0, '\u05d9\u05d9'), (1, '\u05d9')])\n >>> key['base']['y'][0]\n Replacement.new(0, '\u05d9\u05d9')\n\nBasically, each item is explicitly assigned its weight. When you add\ntwo ``Replacement`` instances together, their weights are added, and\ntheir strings are concatenated.\n\n.. code:: python\n\n >>> key['base']['y'][0] + key['base']['o'][0]\n Replacement.new(0, '\u05d9\u05d9\u05d5')\n\nLikewise, when two ``ReplacemntList`` items are added together, the\nRomanized strings are concatenated, and all the permutations of their\noriginal forms are combined as well:\n\n.. code:: python\n\n >>> print(key['base']['y'] + key['base']['o'])\n yo:\n 0 \u05d9\u05d9\u05d5\n 1 \u05d9\u05d9\n 1 \u05d9\u05d5\n 2 \u05d9\n\nNote:\n As you may observe, the ``ReplacementList`` comes with pretty\n formatting when used with ``print()`` for easier debugging.\n\nAfter all the variations have been generated, the resulting\n``ReplacementList`` can be sorted with its ``.sort()`` method according\nto these weights, from least to greatest.\n\nHowever (coming back to the real config file), certain normalizations\nmay appear infrequently, so that one wants to try everything else\nbefore resorting for that. These may be rare cases as is the case with\nmy ``infrequent`` character group, or it may be a way to hedge bets\nagainst human error in input data.\n\nWhat ``infrequent: 10`` does is tell the ``KeyGenerator`` instance to add\n``10`` to the index number of each Replacement to generate its\nweight. Groups used in this way will not overwrite groups that already\nvalues that already exist in the key. Instead, the replacement list will\nbe extended to include these values. This will drag less likely options\nto the bottom of the list.\n\n.. code:: python\n\n >>> shalom = add_rlists( key['base'].getallparts('shalom'))\n >>> print(shalom)\n shalom:\n 0 \u05e9\u05dc\u05d5\u05de\n 5 \u05e9\u05dc\u05de\n 10 \u05e9\u05dc\u05d0\u05de\n 10 \u05e9\u05d0\u05dc\u05d5\u05de\n 15 \u05e9\u05d0\u05dc\u05de\n 20 \u05e9\u05d0\u05dc\u05d0\u05de\n\nA couple of colleagues pointed out to me that this weighting system\nseems very arbitrary in and it should be based on values between 0 and\n1 for a more scientific and statistical approach. However, the purpose\nof the weighting system is simply to allow the person defining to have\na greater control over how results are sorted and have nothing to do\nwith science or statistics. If you want to sink items in a particular\ngroup lower in the final sort order, stick a big fat number besides\nthe replacement value. This is the only meaning the numbers have.\n\nHowever, if you need to have these numbers look more scientific to use\nwith a statistical framework, they can be converted at any point:\n\n.. code:: python\n\n >>> shalom.makestat()\n >>> print(shalom)\n shalom:\n 0.6855870895937674 \u05e9\u05dc\u05d5\u05de\n 0.11426451493229456 \u05e9\u05dc\u05de\n 0.06232609905397886 \u05e9\u05dc\u05d0\u05de\n 0.06232609905397886 \u05e9\u05d0\u05dc\u05d5\u05de\n 0.04284919309961046 \u05e9\u05d0\u05dc\u05de\n 0.03264700426636988 \u05e9\u05d0\u05dc\u05d0\u05de\n\nAlso note that weights can arbitrary be added to any replacement\ndirectly when it is defined. We could get a similar result for the word\nabove if, instead of using the ``infrequent`` group, we had defined the\nletters like this:\n\n.. code:: yaml\n\n ...\n a: ['' [10, '\u05d0']]\n o: [\u05d5, '', [10, \u05d0]]\n ...\n\nNote:\n Here are those bidi shenanigans I mention earlier. Paste into Vim or\n something to see the correct character order.\n\nAny replacement that is a list or tuple of two beginning with an integer\nwill use that integer as its weight assignment. In this way, one can\nhave very direct control over how results are sorted.\n\nThis is also what is done for the case when ``o`` should be replaced\nwith the empty string. It is manually weighted at ``5``.\n\nUsing Suffix Keys\n~~~~~~~~~~~~~~~~~\nThose of you who know Hebrew have noticed, dobutless, that we are still\nunable to generate the word \u05e9\u05dc\u05d5\u05dd as it is supposed to look, with a\nproper *final mem*. Suffix keys are used to deal with word endings, such\nas final letters (common in Semitic writing systems but also found in\nGreek) or perhaps common morphological suffixes.\n\nA suffix group is defined like this:\n\n.. code:: yaml\n\n end:\n groups: [ some list of groups ]\n suffix: true\n\nThis will create a reversed tokenizer that begins looking for tokens at\nthe end of the word and moves forward. It can be used to deal with\nendings separately.\n\n.. code:: python\n\n >>> suffix, remainder = keys['end'].getpart('shalom')\n >>> suffix\n ReplacementList('m', [(0, '\u05dd')])\n >>> remainder\n 'shalo'\n >>> front = add_rlists(keys['base'].getallparts(remainder))\n >>> shalom = front + suffix\n >>> print(shalom)\n shalom:\n 0 \u05e9\u05dc\u05d5\u05dd\n 5 \u05e9\u05dc\u05dd\n 10 \u05e9\u05dc\u05d0\u05dd\n 10 \u05e9\u05d0\u05dc\u05d5\u05dd\n 15 \u05e9\u05d0\u05dc\u05dd\n 20 \u05e9\u05d0\u05dc\u05d0\u05dd\n\nWe've also seen the ``.getpart()`` method of a key for the first time.\nThis method takes a string as input returns a replist for the first\nmatching token (or the last matching token, if *suffix* was specified)\nas well as the remaining string. This is useful if you want to have\ndifferent rules about the beginning, middle and end of a word, as I\ntypically do.\n\nPattern-Based Replacement Generation\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n``deromanize`` profiles also allow the user to generate large numbers\nof replacements from pattern-based definitions. Patterns rely on the\nuse of special characters that will generate sets of characters\ndefined elsewhere in the profile.\n\nThis somewhat analogous to ranges of characters like ``\\w`` or ``\\s``\nin regex. However, unlike regex, which characters will be treated as\nspecial are not yet defined (nor are there values). To create these\ncharacter sets and their aliases, the ``char_sets`` group must be\ndefined in the profile.\n\n.. code:: yaml\n\n char_sets:\n C:\n key: base \n chars: consonants\n F:\n key: front\n chars: consonants\n\nWhat this says is that ``C`` will be an alias for all the characters\ndefined in the group ``consonants`` and replacements will be drawn\nfrom the ``base`` key. Likewise ``F`` will stand for the same\ncharacter set, ``consonants``, but replacements will be drawn from the\nkey called ``front``. The value of ``chars`` may also be a list of\nliteral characters instead of the name of a character group. ``key``,\nhowever must be a key defined in the ``keys`` group. If no ``base`` is\ndefined for the character set alias, it defaults to the base\nkey. Likewise, if the value of any character alias is not a dictionary\n(containing at least a ``chars`` value), its value will be assigned to\nfor ``chars``, so a shorthand for the above is:\n\n.. code:: yaml\n\n char_sets:\n C: consonants\n F:\n key: front\n chars: consonants\n\nAlso note that the character aliases themselves (``C`` and ``F``\nabove) can be arbitrary length. You should try to chose sequences that\ncannot possibly appear in your transliteration. Capitals have no\nmeaning in the standard I've defined, so I use them, but you could\nalso use something like ``\\c`` and ``\\v`` if you needed. Just note\nthat there is no mechanism for escaping special characters once\ndefined.\n\nWhen it comes to actually using these in replacement definitions, it\ngoes something like this...\n\n.. code:: yaml\n\n beginning patterns:\n FiCC: [\\1\\2\\3, \\1\u05d9\\2\\3]\n FoCC: [\\1\u05d5\\2\\3, \\1\\2\\3]\n FeCC: [\\1\\2\\3]\n\nEach alias character becomes something like a 'capture group' in\nregex, and can be recalled int the replacement string with a\nbackslashed number (like regex). The appropriate replacements will be\ngenerated for all characters in the group.\n\nPlease be aware that you can generate a LOT of replacements this way\n(the above groups, with the rest of this config file, generate over\n50,000 new replacements). This can take a few seconds to chug\nthrough.\n\nA Little Hidden Metadata\n------------------------\nEach ``Replacement`` in a ``ReplacementList`` has an attribute called\n``keyvalue``. This is a tuple where each item a two-tuple of the token\nfound and how it was interpreted in the case of the specific\n``Replacment``. Continuing with our ``shalom`` variable from previous\nexamples:\n\n.. code:: python\n\n >>> shalom[0]\n Replacement.new(0, '\u05e9\u05dc\u05d5\u05dd')\n >>> shalom[0].keyvalue\n (('sh', '\u05e9'), ('a', ''), ('l', '\u05dc'), ('o', '\u05d5'), ('m', '\u05dd'))\n\nThis can be useful for various things. Say we wanted to generate another\ntransliteration standard from this. Some outside source has verified\nthat the generated option ``\u05e9\u05dc\u05d5\u05dd`` is the correct Hebrew form of\n``shalom``, but now we want to create a more detail transliteration that\nwill show that the /o/ vowel was marked with the letter vav. Because we\ncan go back and specifically see that /o/ was realized as vav in this\ncase, it is easy to generate something like ``\u0161al\u00f4m`` if we want to.\n\nAdditionally, this can be a way to detect errors in the transliteration.\n\nIn the system we use, the letter \u05e7 is supposed to be written as *\u1e33*,\nusing the diacritic to distinguish it from hard *kaf* (\u05db). However,\nsometimes people make mistakes. Assuming we have defined a\nfault-tolerant standard which understands that sometimes people will\nwrite k instead of \u1e33, we can generate something like this:\n\n.. code:: python\n\n >>> shuk = 'shuk' # oops! should be \"shu\u1e33\"\n >>> shuk = add_rlists(keys['base'].getallparts(shuk))\n print(shuk)\n shuk:\n 0 \u05e9\u05d5\u05db\n 20 \u05e9\u05d5\u05e7\n\nWhen it has been verified that ``\u05e9\u05d5\u05e7`` is the correct Hebrew form, we\ncan look at how it was built up:\n\n.. code:: python\n\n >>> shuk[1].keyvalue\n (('sh', '\u05e9'), ('u', '\u05d5'), ('k', '\u05e7')\n\nAt this point it is trivial for the computer to see that \u05e7 was\nincorrectly transcribed as *k*, and it can easily go back and correct\nthe source if necessary. There is a function to aid in using this\nkey-value data in generating new forms in the ``cacheutils`` module. See\nthe following section for links to documentation about that.\n\nNote that some of this data may be lost for tokens generated with\npatterns if the keys have been cached with ``cached_keys`` and recalled.\n``cached_keys`` should only be used to speed-up small utilities where\nthis information is not needed.\n\nExtras: Caching Helpers, Miscellaneous Utilities, and Microservice\n------------------------------------------------------------------\nAt the end of the day, ``deromanize`` is just a helpful tool taking data\nin one script and generating all possible equivalents in another script.\nFor conversion between any systems that don't have one-to-one\ncorrespondence. It's up to the user figure out how the correct\nalternative will be selected. However, `deromanize.cacheutils`_ has some\nsimple utilities that can help with recall once the correct form has\nbeen selected.\n\n`deromanize.tools`_ has some other helper functions that have been very\nuseful to me while working with ``deromanize`` on real data in different\nlanguages and scripts -- helpers to strip punctuation, remove\ndiacritics, correct mistakes in the source text, as well as a decoder\nfunction that will work well with complex profiles which have different\nrules for the beginning, middle and end of a word.\n\nIf you're using ``deromanize``, there is a good chance you'll want this\nkind of stuff. Check out the docs on those modules!\n\n- `deromanize.cacheutils`_\n- `deromanize.tools`_\n\nAdditionally, there is another package you can use to spin up\n``deromanize`` as a microservice, `microdero`_. This primarily for\npeople who are interested using ``deromanize``, but cannot or do not\nwish to have most of their project in Python, such web app that uses the\ngenerated data on the client or a mature project in another language\nthat would like to integrate ``deromanize``.\n\n.. _deromanize.cacheutils: doc/cacheutils.rst\n.. _deromanize.tools: doc/tools.rst\n.. _microdero: https://github.com/FID-Judaica/microdero\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/FID-Judaica/deromanize.py", "keywords": "", "license": "MLP 2.0/EUPL 1.1", "maintainer": "", "maintainer_email": "", "name": "deromanize", "package_url": "https://pypi.org/project/deromanize/", "platform": "", "project_url": "https://pypi.org/project/deromanize/", "project_urls": { "Homepage": "https://github.com/FID-Judaica/deromanize.py" }, "release_url": "https://pypi.org/project/deromanize/0.9/", "requires_dist": null, "requires_python": "", "summary": "rule-based algorithms converting Romanized text to original scripts", "version": "0.9" }, "last_serial": 5912087, "releases": { "0.0": [ { "comment_text": "", "digests": { "md5": "547fe35bd958fdb936edf0dacc900459", "sha256": "1d894a18bbf8632503652112fce2db4a13e8f8942a3413ec96749b18e818e88c" }, "downloads": -1, "filename": "deromanize-0.0-py3-none-any.whl", "has_sig": false, "md5_digest": "547fe35bd958fdb936edf0dacc900459", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 22647, "upload_time": "2017-04-12T14:33:22", "url": "https://files.pythonhosted.org/packages/2d/b5/4ec8e45298503158eb84d8dacc7134ac8b5f4211a7398ab23c48e744e48a/deromanize-0.0-py3-none-any.whl" } ], "0.1": [ { "comment_text": "", "digests": { "md5": "48bff321cc5c71023ed8c72835b12957", "sha256": "49ccff87dc852bcacaf0ca836013fbc8cd969e3e4eb5047f52ddb5b3018a8fc7" }, "downloads": -1, "filename": "deromanize-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "48bff321cc5c71023ed8c72835b12957", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23797, "upload_time": "2017-04-24T14:18:58", "url": "https://files.pythonhosted.org/packages/b2/d2/63013a3e047c5c283afec7a1a39b0c99a24073a803f81bdd75f46234d5db/deromanize-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "0d4cf85c1dcffcc8656cabfe8ee8af70", "sha256": "3e4695cae818ed28325d9cb9ac4f014d777ff245eb25442c0c8b04844c9e11aa" }, "downloads": -1, "filename": "deromanize-0.1.tar.gz", "has_sig": false, "md5_digest": "0d4cf85c1dcffcc8656cabfe8ee8af70", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20941, "upload_time": "2017-04-24T14:19:00", "url": "https://files.pythonhosted.org/packages/9c/27/94fb3dab212bd37225d719e4ffcdca12e31a1afa80e35617238b370068f6/deromanize-0.1.tar.gz" } ], "0.2": [ { "comment_text": "", "digests": { "md5": "f260e14fb8bb4abd00e4d57353eae8f4", "sha256": "b8e580db936a6846b45a8756589aabfd13e9072512b02af1ca65d8e661ecb0bb" }, "downloads": -1, "filename": "deromanize-0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "f260e14fb8bb4abd00e4d57353eae8f4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 23792, "upload_time": "2017-04-24T15:05:18", "url": "https://files.pythonhosted.org/packages/c8/d1/bea033bd6067a80f7b96139de17a8c700291568f77e34eae17b5f59d3bf7/deromanize-0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3b6ccc4f5140f64be2c3d71e6f74ffcc", "sha256": "1453afcc39adb2c53339bb41a9159958c22b0479ebd413854a4208da6fe5a5c8" }, "downloads": -1, "filename": "deromanize-0.2.tar.gz", "has_sig": false, "md5_digest": "3b6ccc4f5140f64be2c3d71e6f74ffcc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 20937, "upload_time": "2017-04-24T15:05:22", "url": "https://files.pythonhosted.org/packages/d7/84/63f8c577aeb688a0dcc13ae4fa8da694b9da62640e4d7c6dd8be46fbc550/deromanize-0.2.tar.gz" } ], "0.3": [ { "comment_text": "", "digests": { "md5": "965fbaeb91101850d9c50a92ceea2526", "sha256": "b23e59cf2f21e301a7ce4a1aab5c736cbe0ec89bb0a4357d104d9e06d69635e7" }, "downloads": -1, "filename": "deromanize-0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "965fbaeb91101850d9c50a92ceea2526", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27134, "upload_time": "2017-09-05T12:14:52", "url": "https://files.pythonhosted.org/packages/2f/a3/3edf673fab93d9692ea90605fe09163339b414923b8a87ceb99238a2e543/deromanize-0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b3eb7217d62fc945304eac46cefb572f", "sha256": "a78f165b57bb3f0b09f02e21a04802923cf98a79b38ef7c98341b47697920a9e" }, "downloads": -1, "filename": "deromanize-0.3.tar.gz", "has_sig": false, "md5_digest": "b3eb7217d62fc945304eac46cefb572f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23316, "upload_time": "2017-09-05T12:14:53", "url": "https://files.pythonhosted.org/packages/25/23/8f08a08177f7a2c679a57b543318b70b8f1a11813a4db34194518fbe5bd6/deromanize-0.3.tar.gz" } ], "0.4": [ { "comment_text": "", "digests": { "md5": "5259ff153668704e3e83dc1587a00816", "sha256": "94331ba649dca3a809c4fa0dc9d9dadd08dafad9251f4a47e850e3361d30d825" }, "downloads": -1, "filename": "deromanize-0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "5259ff153668704e3e83dc1587a00816", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27134, "upload_time": "2017-09-05T12:38:06", "url": "https://files.pythonhosted.org/packages/f2/11/980a3587feb5aab1d22c4374285ee4ac07b544da9fcfbdf9c7420d518661/deromanize-0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4455e37b14d5a131b4e431d71377ac18", "sha256": "09b33cf9dccfbc81c71055984b3220ebe4f9d3b933c39ff00cbe8691b7039630" }, "downloads": -1, "filename": "deromanize-0.4.tar.gz", "has_sig": false, "md5_digest": "4455e37b14d5a131b4e431d71377ac18", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23314, "upload_time": "2017-09-05T12:38:08", "url": "https://files.pythonhosted.org/packages/93/50/fdd74924dba01bc23a5f21904f6c641681af794e500191cb9f90f3e0a8c5/deromanize-0.4.tar.gz" } ], "0.5": [ { "comment_text": "", "digests": { "md5": "89cbeef0e0cb2ef16b2f705559de03d5", "sha256": "3534f37b717870df29f298b3874d9209df6c99e89520a71b7c1e13e60eaf208a" }, "downloads": -1, "filename": "deromanize-0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "89cbeef0e0cb2ef16b2f705559de03d5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 27704, "upload_time": "2017-09-07T16:09:06", "url": "https://files.pythonhosted.org/packages/56/09/05b3253110e4316629eed8d0f5f7f95242b34c9779beb9b9bcbc8e95fdbf/deromanize-0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e68dfd15bd36a885db51ecf3457fe300", "sha256": "f19199196f545ac3f6e6061de22ff1d3d9334fd6a68b8a87883de4c2e0fb59e2" }, "downloads": -1, "filename": "deromanize-0.5.tar.gz", "has_sig": false, "md5_digest": "e68dfd15bd36a885db51ecf3457fe300", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 23749, "upload_time": "2017-09-07T16:09:09", "url": "https://files.pythonhosted.org/packages/5b/05/70ecdd6357b58466e26f88649f0a1dd7867c9ca01de2758928726f6d006a/deromanize-0.5.tar.gz" } ], "0.6": [ { "comment_text": "", "digests": { "md5": "b1bb11b7d1f68681903357dc3ae0186c", "sha256": "9cc68df4d0bf404a35985d7be8fa53e06bdac6c4c319a4d339e8abab5ac15092" }, "downloads": -1, "filename": "deromanize-0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "b1bb11b7d1f68681903357dc3ae0186c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 32248, "upload_time": "2017-09-12T15:31:07", "url": "https://files.pythonhosted.org/packages/71/85/6adab55ec840285a17f0ac49d6f4063a40d011d20bcec0f96b27dca43d41/deromanize-0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "52a8b2010271b5909abce6c050258805", "sha256": "5d53f0be11b67d3638496821d070ceef44508a85549cd68cae676d98bb51efd2" }, "downloads": -1, "filename": "deromanize-0.6.tar.gz", "has_sig": false, "md5_digest": "52a8b2010271b5909abce6c050258805", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 28359, "upload_time": "2017-09-12T15:31:09", "url": "https://files.pythonhosted.org/packages/81/64/ffedda35a91b69a5ebc5dc49fa4951ac185ba7b2af5b63bd766276bda68c/deromanize-0.6.tar.gz" } ], "0.7": [ { "comment_text": "", "digests": { "md5": "ad10558c3a292933512ed66bfb960d3b", "sha256": "04ad933d5eca34b7ebeee0b60fdea195eaee414d4f3d35d00532b38691cfe32d" }, "downloads": -1, "filename": "deromanize-0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "ad10558c3a292933512ed66bfb960d3b", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 33285, "upload_time": "2018-07-23T10:55:36", "url": "https://files.pythonhosted.org/packages/4b/11/d9f04c652a67b085055c9ae4d71cd03db8d22f428d501b7065d09d70cd80/deromanize-0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "934a418396ebe2bcf7c530469afc1876", "sha256": "39e6f7de22f74a61c7a76493ed19d323968640589a7cbe7679dffffee9d75ddc" }, "downloads": -1, "filename": "deromanize-0.7.tar.gz", "has_sig": false, "md5_digest": "934a418396ebe2bcf7c530469afc1876", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 29210, "upload_time": "2018-07-23T10:55:38", "url": "https://files.pythonhosted.org/packages/49/88/337f0ebb8725e4516a9af4b8a8c230293965a8df6073cc1ec67f6577183f/deromanize-0.7.tar.gz" } ], "0.8": [ { "comment_text": "", "digests": { "md5": "6030122f8dd97ec7fac3fddba898e697", "sha256": "36a1cb712caf19ceaabca9ef024546055e310c1f063172513dc757a9d59b1bd1" }, "downloads": -1, "filename": "deromanize-0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "6030122f8dd97ec7fac3fddba898e697", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25163, "upload_time": "2018-10-09T11:13:51", "url": "https://files.pythonhosted.org/packages/bf/a9/60d068949e73e4e868637b21a91187c8db4f16e573a658b3833a4cad25b3/deromanize-0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8b4c03d50112f0425e1f7e262bf760d2", "sha256": "c044db031f7615c48a0abdfa2cb6aef40a30c3be846c7cb604b09ff1ff5dec1d" }, "downloads": -1, "filename": "deromanize-0.8.tar.gz", "has_sig": false, "md5_digest": "8b4c03d50112f0425e1f7e262bf760d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31298, "upload_time": "2018-10-09T11:13:52", "url": "https://files.pythonhosted.org/packages/5f/bb/93387ed1d7fccba1923b17d3d0d4f32e3d665310b48ac8ec39f55bffe79f/deromanize-0.8.tar.gz" } ], "0.9": [ { "comment_text": "", "digests": { "md5": "267398a3d237da233ad990da9b3dceb4", "sha256": "a0899cb73a37f56e3d823bd860ef49c0362d5729f7d64b2bdf790c40835c56b4" }, "downloads": -1, "filename": "deromanize-0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "267398a3d237da233ad990da9b3dceb4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25341, "upload_time": "2019-10-01T12:49:09", "url": "https://files.pythonhosted.org/packages/66/46/778d64f646a98c2e23a876a402101a0e943ce6c62a2e65390d712a18f5d5/deromanize-0.9-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "267398a3d237da233ad990da9b3dceb4", "sha256": "a0899cb73a37f56e3d823bd860ef49c0362d5729f7d64b2bdf790c40835c56b4" }, "downloads": -1, "filename": "deromanize-0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "267398a3d237da233ad990da9b3dceb4", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 25341, "upload_time": "2019-10-01T12:49:09", "url": "https://files.pythonhosted.org/packages/66/46/778d64f646a98c2e23a876a402101a0e943ce6c62a2e65390d712a18f5d5/deromanize-0.9-py3-none-any.whl" } ] }