{ "info": { "author": "R\u00e9mi Alvergnat", "author_email": "toilal.dev@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "ReBulk\n=======\n\n.. image:: http://img.shields.io/pypi/v/rebulk.svg\n :target: https://pypi.python.org/pypi/rebulk\n :alt: Latest Version\n\n.. image:: http://img.shields.io/badge/license-MIT-blue.svg\n :target: https://pypi.python.org/pypi/rebulk\n :alt: MIT License\n\n.. image:: http://img.shields.io/travis/Toilal/rebulk.svg\n :target: http://travis-ci.org/Toilal/rebulk?branch=master\n :alt: Build Status\n\n.. image:: http://img.shields.io/coveralls/Toilal/rebulk.svg\n :target: https://coveralls.io/r/Toilal/rebulk?branch=master\n :alt: Coveralls\n\nReBulk is a python library that performs advanced searches in strings that would be hard to implement using\n`re module`_ or `String methods`_ only.\n\nIt includes some features like ``Patterns``, ``Match``, ``Rule`` that allows developers to build a\ncustom and complex string matcher using a readable and extendable API.\n\nThis project is hosted on GitHub: ``_\n\nInstall\n-------\n.. code-block:: sh\n\n $ pip install rebulk\n\nUsage\n------\nRegular expression, string and function based patterns are declared in a ``Rebulk`` object. It use a fluent API to\nchain ``string``, ``regex``, and ``functional`` methods to define various patterns types.\n\n.. code-block:: python\n\n >>> from rebulk import Rebulk\n >>> bulk = Rebulk().string('brown').regex(r'qu\\w+').functional(lambda s: (20, 25))\n\nWhen ``Rebulk`` object is fully configured, you can call ``matches`` method with an input string to retrieve all\n``Match`` objects found by registered pattern.\n\n.. code-block:: python\n\n >>> bulk.matches(\"The quick brown fox jumps over the lazy dog\")\n [, , ]\n\nIf multiple ``Match`` objects are found at the same position, only the longer one is kept.\n\n.. code-block:: python\n\n >>> bulk = Rebulk().string('lakers').string('la')\n >>> bulk.matches(\"the lakers are from la\")\n [, ]\n\nString Patterns\n---------------\nString patterns are based on `str.find`_ method to find matches, but returns all matches in the string. ``ignore_case``\ncan be enabled to ignore case.\n\n.. code-block:: python\n\n >>> Rebulk().string('la').matches(\"lalalilala\")\n [, , , ]\n\n >>> Rebulk().string('la').matches(\"LalAlilAla\")\n []\n\n >>> Rebulk().string('la', ignore_case=True).matches(\"LalAlilAla\")\n [, , , ]\n\nYou can define several patterns with a single ``string`` method call.\n\n.. code-block:: python\n\n >>> Rebulk().string('Winter', 'coming').matches(\"Winter is coming...\")\n [, ]\n\nRegular Expression Patterns\n---------------------------\nRegular Expression patterns are based on a compiled regular expression.\n`re.finditer`_ method is used to find matches.\n\nIf `regex module`_ is available, it will be used by rebulk instead of default `re module`_.\n\n.. code-block:: python\n\n >>> Rebulk().regex(r'l\\w').matches(\"lolita\")\n [, ]\n\nYou can define several patterns with a single ``regex`` method call.\n\n.. code-block:: python\n\n >>> Rebulk().regex(r'Wint\\wr', r'com\\w{3}').matches(\"Winter is coming...\")\n [, ]\n\nAll keyword arguments from `re.compile`_ are supported.\n\n.. code-block:: python\n\n >>> import re # import required for flags constant\n >>> Rebulk().regex('L[A-Z]KERS', flags=re.IGNORECASE) \\\n ... .matches(\"The LaKeRs are from La\")\n []\n\n >>> Rebulk().regex('L[A-Z]', 'L[A-Z]KERS', flags=re.IGNORECASE) \\\n ... .matches(\"The LaKeRs are from La\")\n [, ]\n\n >>> Rebulk().regex(('L[A-Z]', re.IGNORECASE), ('L[a-z]KeRs')) \\\n ... .matches(\"The LaKeRs are from La\")\n [, ]\n\nIf `regex module`_ is available, it automatically supports repeated captures.\n\n.. code-block:: python\n\n >>> # If regex module is available, repeated_captures is True by default.\n >>> matches = Rebulk().regex(r'(\\d+)(?:-(\\d+))+').matches(\"01-02-03-04\")\n >>> matches[0].children # doctest:+SKIP\n [<01:(0, 2)>, <02:(3, 5)>, <03:(6, 8)>, <04:(9, 11)>]\n\n >>> # If regex module is not available, or if repeated_captures is forced to False.\n >>> matches = Rebulk().regex(r'(\\d+)(?:-(\\d+))+', repeated_captures=False) \\\n ... .matches(\"01-02-03-04\")\n >>> matches[0].children\n [<01:(0, 2)+initiator=01-02-03-04>, <04:(9, 11)+initiator=01-02-03-04>]\n\n- ``abbreviations``\n\n Defined as a list of 2-tuple, each tuple is an abbreviation. It simply replace ``tuple[0]`` with ``tuple[1]`` in the\n expression.\n\n >>> Rebulk().regex(r'Custom-separators', abbreviations=[(\"-\", r\"[\\W_]+\")])\\\n ... .matches(\"Custom_separators using-abbreviations\")\n []\n\n\nFunctional Patterns\n-------------------\nFunctional Patterns are based on the evaluation of a function.\n\nThe function should have the same parameters as ``Rebulk.matches`` method, that is the input string,\nand must return at least start index and end index of the ``Match`` object.\n\n.. code-block:: python\n\n >>> def func(string):\n ... index = string.find('?')\n ... if index > -1:\n ... return 0, index - 11\n >>> Rebulk().functional(func).matches(\"Why do simple ? Forget about it ...\")\n []\n\nYou can also return a dict of keywords arguments for ``Match`` object.\n\nYou can define several patterns with a single ``functional`` method call, and function used can return multiple\nmatches.\n\nChain Patterns\n--------------\nChain Patterns are ordered composition of string, functional and regex patterns. Repeater can be set to define\nrepetition on chain part.\n\n.. code-block:: python\n\n >>> r = Rebulk().regex_defaults(flags=re.IGNORECASE)\\\n ... .defaults(children=True, formatter={'episode': int, 'version': int})\\\n ... .chain()\\\n ... .regex(r'e(?P\\d{1,4})').repeater(1)\\\n ... .regex(r'v(?P\\d+)').repeater('?')\\\n ... .regex(r'[ex-](?P\\d{1,4})').repeater('*')\\\n ... .close() # .repeater(1) could be omitted as it's the default behavior\n >>> r.matches(\"This is E14v2-15-16-17\").to_dict() # converts matches to dict\n MatchesDict([('episode', [14, 15, 16, 17]), ('version', 2)])\n\nPatterns parameters\n-------------------\n\nAll patterns have options that can be given as keyword arguments.\n\n- ``validator``\n\n Function to validate ``Match`` value given by the pattern. Can also be a ``dict``, to use ``validator`` with pattern\n named with key.\n\n .. code-block:: python\n\n >>> def check_leap_year(match):\n ... return int(match.value) in [1980, 1984, 1988]\n >>> matches = Rebulk().regex(r'\\d{4}', validator=check_leap_year) \\\n ... .matches(\"In year 1982 ...\")\n >>> len(matches)\n 0\n >>> matches = Rebulk().regex(r'\\d{4}', validator=check_leap_year) \\\n ... .matches(\"In year 1984 ...\")\n >>> len(matches)\n 1\n\nSome base validator functions are available in ``rebulk.validators`` module. Most of those functions have to be\nconfigured using ``functools.partial`` to map them to function accepting a single ``match`` argument.\n\n- ``formatter``\n\n Function to convert ``Match`` value given by the pattern. Can also be a ``dict``, to use ``formatter`` with matches\n named with key.\n\n .. code-block:: python\n\n >>> def year_formatter(value):\n ... return int(value)\n >>> matches = Rebulk().regex(r'\\d{4}', formatter=year_formatter) \\\n ... .matches(\"In year 1982 ...\")\n >>> isinstance(matches[0].value, int)\n True\n\n- ``pre_match_processor`` / ``post_match_processor``\n\n Function to mutagen or invalidate a match generated by a pattern.\n\n Function has a single parameter which is the Match object. If function returns False, it will be considered as an\n invalid match. If function returns a match instance, it will replace the original match with this instance in the\n process.\n\n- ``post_processor``\n\n Function to change the default output of the pattern. Function parameters are Matches list and Pattern object.\n\n- ``name``\n\n The name of the pattern. It is automatically passed to ``Match`` objects generated by this pattern.\n\n- ``tags``\n\n A list of string that qualifies this pattern.\n\n- ``value``\n\n Override value property for generated ``Match`` objects. Can also be a ``dict``, to use ``value`` with pattern\n named with key.\n\n- ``validate_all``\n\n By default, validator is called for returned ``Match`` objects only. Enable this option to validate them all, parent\n and children included.\n\n- ``format_all``\n\n By default, formatter is called for returned ``Match`` values only. Enable this option to format them all, parent and\n children included.\n\n- ``disabled``\n\n A ``function(context)`` to disable the pattern if returning ``True``.\n\n- ``children``\n\n If ``True``, all children ``Match`` objects will be retrieved instead of a single parent ``Match`` object.\n\n- ``private``\n\n If ``True``, ``Match`` objects generated from this pattern are available internally only. They will be removed at\n the end of ``Rebulk.matches`` method call.\n\n- ``private_parent``\n\n Force parent matches to be returned and flag them as private.\n\n- ``private_children``\n\n Force children matches to be returned and flag them as private.\n\n- ``private_names``\n\n Matches names that will be declared as private\n\n- ``ignore_names``\n\n Matches names that will be ignored from the pattern output, after validation.\n\n- ``marker``\n\n If ``true``, ``Match`` objects generated from this pattern will be markers matches instead of standard matches.\n They won't be included in ``Matches`` sequence, but will be available in ``Matches.markers`` sequence (see\n ``Markers`` section).\n\n\nMatch\n-----\n\nA ``Match`` object is the result created by a registered pattern.\n\nIt has a ``value`` property defined, and position indices are available through ``start``, ``end`` and ``span``\nproperties.\n\nIn some case, it contains children ``Match`` objects in ``children`` property, and each child ``Match`` object\nreference its parent in ``parent`` property. Also, a ``name`` property can be defined for the match.\n\nIf groups are defined in a Regular Expression pattern, each group match will be converted to a\nsingle ``Match`` object. If a group has a name defined (``(?Pgroup)``), it is set as ``name`` property in a child\n``Match`` object. The whole regexp match (``re.group(0)``) will be converted to the main ``Match`` object,\nand all subgroups (1, 2, ... n) will be converted to ``children`` matches of the main ``Match`` object.\n\n.. code-block:: python\n\n >>> matches = Rebulk() \\\n ... .regex(r\"One, (?P\\w+), Two, (?P\\w+), Three, (?P\\w+)\") \\\n ... .matches(\"Zero, 0, One, 1, Two, 2, Three, 3, Four, 4\")\n >>> matches\n []\n >>> for child in matches[0].children:\n ... '%s = %s' % (child.name, child.value)\n 'one = 1'\n 'two = 2'\n 'three = 3'\n\nIt's possible to retrieve only children by using ``children`` parameters. You can also customize the way structure\nis generated with ``every``, ``private_parent`` and ``private_children`` parameters.\n\n.. code-block:: python\n\n >>> matches = Rebulk() \\\n ... .regex(r\"One, (?P\\w+), Two, (?P\\w+), Three, (?P\\w+)\", children=True) \\\n ... .matches(\"Zero, 0, One, 1, Two, 2, Three, 3, Four, 4\")\n >>> matches\n [<1:(14, 15)+name=one+initiator=One, 1, Two, 2, Three, 3>, <2:(22, 23)+name=two+initiator=One, 1, Two, 2, Three, 3>, <3:(32, 33)+name=three+initiator=One, 1, Two, 2, Three, 3>]\n\nMatch object has the following properties that can be given to Pattern objects\n\n- ``formatter``\n\n Function to convert ``Match`` value given by the pattern. Can also be a ``dict``, to use ``formatter`` with matches\n named with key.\n\n .. code-block:: python\n\n >>> def year_formatter(value):\n ... return int(value)\n >>> matches = Rebulk().regex(r'\\d{4}', formatter=year_formatter) \\\n ... .matches(\"In year 1982 ...\")\n >>> isinstance(matches[0].value, int)\n True\n\n- ``format_all``\n\n By default, formatter is called for returned ``Match`` values only. Enable this option to format them all, parent and\n children included.\n\n- ``conflict_solver``\n\n A ``function(match, conflicting_match)`` used to solve conflict. Returned object will be removed from matches by\n ``ConflictSolver`` default rule. If ``__default__`` string is returned, it will fallback to default behavior\n keeping longer match.\n\n\nMatches\n-------\n\nA ``Matches`` object holds the result of ``Rebulk.matches`` method call. It's a sequence of ``Match`` objects and\nit behaves like a list.\n\nAll methods accepts a ``predicate`` function to filter ``Match`` objects using a callable, and an ``index`` int to\nretrieve a single element from default returned matches.\n\nIt has the following additional methods and properties on it.\n\n- ``starting(index, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that starts at given index.\n\n- ``ending(index, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that ends at given index.\n\n- ``previous(match, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that are previous and nearest to match.\n\n- ``next(match, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that are next and nearest to match.\n\n- ``tagged(tag, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that have the given tag defined.\n\n- ``named(name, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that have the given name.\n\n- ``range(start=0, end=None, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects for given range, sorted from start to end.\n\n- ``holes(start=0, end=None, formatter=None, ignore=None, predicate=None, index=None)``\n\n Retrieves a list of *hole* ``Match`` objects for given range. A hole match is created for each range where no match\n is available.\n\n- ``conflicting(match, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects that conflicts with given match.\n\n- ``chain_before(self, position, seps, start=0, predicate=None, index=None)``:\n\n Retrieves a list of chained matches, before position, matching predicate and separated by characters from seps only.\n\n- ``chain_after(self, position, seps, end=None, predicate=None, index=None)``:\n\n Retrieves a list of chained matches, after position, matching predicate and separated by characters from seps only.\n\n- ``at_match(match, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects at the same position as match.\n\n- ``at_span(span, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects from given (start, end) tuple.\n\n- ``at_index(pos, predicate=None, index=None)``\n\n Retrieves a list of ``Match`` objects from given position.\n\n- ``names``\n\n Retrieves a sequence of all ``Match.name`` properties.\n\n- ``tags``\n\n Retrieves a sequence of all ``Match.tags`` properties.\n\n- ``to_dict(details=False, first_value=False, enforce_list=False)``\n\n Convert to an ordered dict, with ``Match.name`` as key and ``Match.value`` as value.\n\n It's a subclass of `OrderedDict`_, that contains a ``matches`` property which is a dict with ``Match.name`` as key\n and list of ``Match`` objects as value.\n\n If ``first_value`` is ``True`` and distinct values are found for the same name, value will be wrapped to a list.\n If ``False``, first value only will be kept and values lists can be retrieved with ``values_list`` which is a dict\n with ``Match.name`` as key and list of ``Match.value`` as value.\n\n if ``enforce_list`` is ``True``, all values will be wrapped to a list, even if a single value is found.\n\n If ``details`` is True, ``Match.value`` objects are replaced with complete ``Match`` object.\n\n- ``markers``\n\n A custom ``Matches`` sequences specialized for ``markers`` matches (see below)\n\nMarkers\n-------\n\nIf you have defined some patterns with ``markers`` property, then ``Matches.markers`` points to a special ``Matches``\nsequence that contains only ``markers`` matches. This sequence supports all methods from ``Matches``.\n\nMarkers matches are not intended to be used in final result, but can be used to implement a ``Rule``.\n\nRules\n-----\nRules are a convenient and readable way to implement advanced conditional logic involving several ``Match`` objects.\nWhen a rule is triggered, it can perform an action on ``Matches`` object, like filtering out, adding additional tags or\nrenaming.\n\nRules are implemented by extending the abstract ``Rule`` class. They are registered using ``Rebulk.rule`` method by\ngiving either a ``Rule`` instance, a ``Rule`` class or a module containing ``Rule classes`` only.\n\nFor a rule to be triggered, ``Rule.when`` method must return ``True``, or a non empty list of ``Match``\nobjects, or any other truthy object. When triggered, ``Rule.then`` method is called to perform the action with\n``when_response`` parameter defined as the response of ``Rule.when`` call.\n\nInstead of implementing ``Rule.then`` method, you can define ``consequence`` class property with a Consequence classe\nor instance, like ``RemoveMatch``, ``RenameMatch`` or ``AppendMatch``. You can also use a list of consequence when\nrequired : ``when_response`` must then be iterable, and elements of this iterable will be given to each consequence in\nthe same order.\n\nWhen many rules are registered, it can be useful to set ``priority`` class variable to define a priority integer\nbetween all rule executions (higher priorities will be executed first). You can also define ``dependency`` to declare\nanother Rule class as dependency for the current rule, meaning that it will be executed before.\n\nFor all rules with the same ``priority`` value, ``when`` is called before, and ``then`` is called after all.\n\n.. code-block:: python\n\n >>> from rebulk import Rule, RemoveMatch\n\n >>> class FirstOnlyRule(Rule):\n ... consequence = RemoveMatch\n ...\n ... def when(self, matches, context):\n ... grabbed = matches.named(\"grabbed\", 0)\n ... if grabbed and matches.previous(grabbed):\n ... return grabbed\n\n >>> rebulk = Rebulk()\n\n >>> rebulk.regex(\"This match(.*?)grabbed\", name=\"grabbed\")\n <...Rebulk object ...>\n >>> rebulk.regex(\"if it's(.*?)first match\", private=True)\n <...Rebulk object at ...>\n >>> rebulk.rules(FirstOnlyRule)\n <...Rebulk object at ...>\n\n >>> rebulk.matches(\"This match is grabbed only if it's the first match\")\n []\n >>> rebulk.matches(\"if it's NOT the first match, This match is NOT grabbed\")\n []\n\n.. _re module: https://docs.python.org/3/library/re.html\n.. _regex module: https://pypi.python.org/pypi/regex\n.. _String methods: https://docs.python.org/3/library/stdtypes.html#str\n.. _str.find: https://docs.python.org/3/library/stdtypes.html#str.find\n.. _re.finditer: https://docs.python.org/3/library/re.html#re.finditer\n.. _re.compile: https://docs.python.org/3/library/re.html#re.compile\n.. _OrderedDict: https://docs.python.org/2/library/collections.html#collections.OrderedDict", "description_content_type": "", "docs_url": null, "download_url": "https://pypi.python.org/packages/source/r/rebulk/rebulk-2.0.0.tar.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/Toilal/rebulk/", "keywords": "re regexp regular expression search pattern string match", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "rebulk", "package_url": "https://pypi.org/project/rebulk/", "platform": "", "project_url": "https://pypi.org/project/rebulk/", "project_urls": { "Download": "https://pypi.python.org/packages/source/r/rebulk/rebulk-2.0.0.tar.gz", "Homepage": "https://github.com/Toilal/rebulk/" }, "release_url": "https://pypi.org/project/rebulk/2.0.0/", "requires_dist": null, "requires_python": "", "summary": "Rebulk - Define simple search patterns in bulk to perform advanced matching on any string.", "version": "2.0.0" }, "last_serial": 5757291, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "2583c5f716434d0cdbb3be5a0ebb77cf", "sha256": "11f03b6b0fabd2d7fafee49c3d151495ef8068291972f55610cbf0d028f45f86" }, "downloads": -1, "filename": "rebulk-0.0.1.tar.gz", "has_sig": false, "md5_digest": "2583c5f716434d0cdbb3be5a0ebb77cf", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10236, "upload_time": "2015-09-18T20:27:18", "url": "https://files.pythonhosted.org/packages/a8/8a/88dd8ad76ebf95c2346a97444ebe885554236feb6b718ca4caa2d929981b/rebulk-0.0.1.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "737b5dfc6b74970da6a839d77f4605f2", "sha256": "787ba5a0deda86aa7ff337d6211ded13048945af1efb76a38eda4b7b037a417a" }, "downloads": -1, "filename": "rebulk-0.1.0.tar.gz", "has_sig": false, "md5_digest": "737b5dfc6b74970da6a839d77f4605f2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14505, "upload_time": "2015-09-23T20:09:13", "url": "https://files.pythonhosted.org/packages/a5/df/0ac438b36ba346924955950dedceba7efb87d147a8a8df3b8174f1a5f906/rebulk-0.1.0.tar.gz" } ], "0.2.0": [ { "comment_text": "", "digests": { "md5": "0c1885e99da7c44cbbaafa3152220d22", "sha256": "51fee81543e7350ea7b97d5545a6afb1d0f77a7a955003234c6fc9f49b920d15" }, "downloads": -1, "filename": "rebulk-0.2.0.tar.gz", "has_sig": false, "md5_digest": "0c1885e99da7c44cbbaafa3152220d22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 21811, "upload_time": "2015-10-01T14:42:42", "url": "https://files.pythonhosted.org/packages/73/34/8d4c740a308e13c8aa873a99c707df20debc04e89a11e711168a4f0dd956/rebulk-0.2.0.tar.gz" } ], "0.2.1": [ { "comment_text": "", "digests": { "md5": "d1ea8bf3f676042857fb08d33f5a208f", "sha256": "1add41679b8828ea3fa7a742ce69abd3f8115683f5a4a2366a4937087a1b9f6e" }, "downloads": -1, "filename": "rebulk-0.2.1.tar.gz", "has_sig": false, "md5_digest": "d1ea8bf3f676042857fb08d33f5a208f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 19707, "upload_time": "2015-10-01T18:46:52", "url": "https://files.pythonhosted.org/packages/16/c8/498995c94f6daefdbec8d5c0d5cb0b065b80a804635d6304a9df6a0dbf49/rebulk-0.2.1.tar.gz" } ], "0.3.0": [ { "comment_text": "", "digests": { "md5": "c22a42412834edd443b3e3240041572e", "sha256": "b4c67d635915df5924a11057aa5e0309b21f69012e21ea8777268ed338b1ce89" }, "downloads": -1, "filename": "rebulk-0.3.0.tar.gz", "has_sig": false, "md5_digest": "c22a42412834edd443b3e3240041572e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 26221, "upload_time": "2015-10-18T21:38:36", "url": "https://files.pythonhosted.org/packages/51/31/d8c9ff5800c0903c25550977f0d25eca089c763f705e387ba2708361b8ce/rebulk-0.3.0.tar.gz" } ], "0.4.0": [ { "comment_text": "", "digests": { "md5": "9eda0f726f9d6007bb503219af4c0d2c", "sha256": "6196ba874a9ec5c11b0fc894f74d258d3bbb88d089687041b2ceab963fdbaea0" }, "downloads": -1, "filename": "rebulk-0.4.0.tar.gz", "has_sig": false, "md5_digest": "9eda0f726f9d6007bb503219af4c0d2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34091, "upload_time": "2015-10-30T22:39:05", "url": "https://files.pythonhosted.org/packages/93/ce/a27f3ec3371c9b5bc43b29254d9e53a262b0a5b114b818591c6cd6998cfd/rebulk-0.4.0.tar.gz" } ], "0.4.1": [ { "comment_text": "", "digests": { "md5": "bdd9955d941d5825eac5b48573ede5f1", "sha256": "b763e8c22be3bad3f7a98f26fc789bbfa35719ec4e31a8511d5e4cfb7cf87750" }, "downloads": -1, "filename": "rebulk-0.4.1.tar.gz", "has_sig": false, "md5_digest": "bdd9955d941d5825eac5b48573ede5f1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34161, "upload_time": "2015-11-01T21:05:33", "url": "https://files.pythonhosted.org/packages/2d/5b/84bf4e4381eb911c516fb5b7d30c19eaa62262e60652b867b226879b6cb1/rebulk-0.4.1.tar.gz" } ], "0.4.2": [ { "comment_text": "", "digests": { "md5": "73933ab16aac908f041706fb16abb6ac", "sha256": "b897c29ac7e5580e50b861983c93bce4d9aa126bbec5a498535fc68919d742ca" }, "downloads": -1, "filename": "rebulk-0.4.2.tar.gz", "has_sig": false, "md5_digest": "73933ab16aac908f041706fb16abb6ac", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 34371, "upload_time": "2015-11-05T19:58:46", "url": "https://files.pythonhosted.org/packages/2f/87/fec3c906184e3e2b8921799152e4af2674d238f25da4ca4bc81252e27ce2/rebulk-0.4.2.tar.gz" } ], "0.5.0": [ { "comment_text": "", "digests": { "md5": "bf0362dd7ed8731dc0a704f156d254c8", "sha256": "fca38ded166482c0a7d36d52492b09fa2d2b970104928978752f2659aec67fbc" }, "downloads": -1, "filename": "rebulk-0.5.0.tar.gz", "has_sig": false, "md5_digest": "bf0362dd7ed8731dc0a704f156d254c8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 248092, "upload_time": "2015-11-07T22:59:49", "url": "https://files.pythonhosted.org/packages/3c/7d/b7fe31c3ed547061ede9bf0fa89e7e0b56fb33cd3087e79b5f424a40242b/rebulk-0.5.0.tar.gz" } ], "0.6.0": [ { "comment_text": "", "digests": { "md5": "ad06e0317a04e2c2cd9f02bd42467d07", "sha256": "bd4fcc5b9790677f77e7936253defd7a185e59f1e0beeb882f047cbf5393e01e" }, "downloads": -1, "filename": "rebulk-0.6.0.tar.gz", "has_sig": false, "md5_digest": "ad06e0317a04e2c2cd9f02bd42467d07", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 248790, "upload_time": "2015-11-09T21:37:28", "url": "https://files.pythonhosted.org/packages/0c/95/c0627bba76e63936a1cf77da948fb22623aa2266912935aa6462b3c28566/rebulk-0.6.0.tar.gz" } ], "0.6.1": [ { "comment_text": "", "digests": { "md5": "6f4012b11adeb6656634ad91c2c3ac49", "sha256": "70ec42bdd9b9b893a1242f1afbe1dd3bab362abf2c333d9222159234fc80d83f" }, "downloads": -1, "filename": "rebulk-0.6.1.tar.gz", "has_sig": false, "md5_digest": "6f4012b11adeb6656634ad91c2c3ac49", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 249533, "upload_time": "2015-11-11T21:16:50", "url": "https://files.pythonhosted.org/packages/d4/c6/c37a6551e557816500f0d72dfa7ef62d2f623830a54c9f6c88f7b8882f72/rebulk-0.6.1.tar.gz" } ], "0.6.2": [ { "comment_text": "", "digests": { "md5": "e36e01aed725e8fb2fe318c3ea70b600", "sha256": "8e960dfe0a8a08f0d6e431bb1bbc7bfa802a04e2bff7b48ab7b12918aa507dd6" }, "downloads": -1, "filename": "rebulk-0.6.2.tar.gz", "has_sig": false, "md5_digest": "e36e01aed725e8fb2fe318c3ea70b600", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 249639, "upload_time": "2015-11-14T08:02:32", "url": "https://files.pythonhosted.org/packages/a5/50/447c0909b99627206090ab5a5005b689a7cd8b9bef67b2eaa6b3ee87eebf/rebulk-0.6.2.tar.gz" } ], "0.6.3": [ { "comment_text": "", "digests": { "md5": "d50dc8edc0f69e9aaceda1a4ab18f0f4", "sha256": "13aa8a4f1ec3931ef1aac706db75e53dcd07bab38f12dad2e560d9c6af575458" }, "downloads": -1, "filename": "rebulk-0.6.3.tar.gz", "has_sig": false, "md5_digest": "d50dc8edc0f69e9aaceda1a4ab18f0f4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 250045, "upload_time": "2015-11-15T09:55:14", "url": "https://files.pythonhosted.org/packages/09/6c/7283d0b895bfb0bdf05e487827d3eff7f096e622838c0bfc439654a388a5/rebulk-0.6.3.tar.gz" } ], "0.6.4": [ { "comment_text": "", "digests": { "md5": "5155ac8dee7108a93d9c44651595ea85", "sha256": "16094db62bd693af8811110ee10fdf4239720eae9bd74535123f387534118fbc" }, "downloads": -1, "filename": "rebulk-0.6.4.tar.gz", "has_sig": false, "md5_digest": "5155ac8dee7108a93d9c44651595ea85", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 250078, "upload_time": "2015-11-21T14:28:50", "url": "https://files.pythonhosted.org/packages/63/e3/3762f9b4e92cd6be2496fdf2ffb33c96f8be8b33f6f03a59762c9c4d7197/rebulk-0.6.4.tar.gz" } ], "0.6.5": [ { "comment_text": "", "digests": { "md5": "ea141621d5af239a4e85e03294301135", "sha256": "b14e2a4a44faa7a5684003be2240cce03da742e5973924976437dad4862e429d" }, "downloads": -1, "filename": "rebulk-0.6.5.tar.gz", "has_sig": false, "md5_digest": "ea141621d5af239a4e85e03294301135", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 250351, "upload_time": "2016-01-22T05:59:57", "url": "https://files.pythonhosted.org/packages/a8/f6/13dc8a64f387d5a0a5fe0005cb84b9b32dd6fe19df09d9f146da59b8574c/rebulk-0.6.5.tar.gz" } ], "0.7.0": [ { "comment_text": "", "digests": { "md5": "1afafd3ea7bf216e07f8a877463cdb6b", "sha256": "848b845a656b6990e3796a104dcdaba9f265efbd63109ba882849accb548aa5d" }, "downloads": -1, "filename": "rebulk-0.7.0.tar.gz", "has_sig": false, "md5_digest": "1afafd3ea7bf216e07f8a877463cdb6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 254319, "upload_time": "2016-01-25T23:33:37", "url": "https://files.pythonhosted.org/packages/b1/f2/78a39980079f9de5ea4b99a20fe34ceab8e62bd467281cf654b5b289ea83/rebulk-0.7.0.tar.gz" } ], "0.7.1": [ { "comment_text": "", "digests": { "md5": "98f677cf8f05acc42f49b02145071497", "sha256": "c472793cecbe2d75c8850a8e50e9b00dadec0a906c70644121bae7389a530401" }, "downloads": -1, "filename": "rebulk-0.7.1.tar.gz", "has_sig": false, "md5_digest": "98f677cf8f05acc42f49b02145071497", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 254375, "upload_time": "2016-02-03T18:20:49", "url": "https://files.pythonhosted.org/packages/80/3d/1f49630aa020791d1358ab19d879c52f7ea8f056a2360d64cb37a1a2bcc1/rebulk-0.7.1.tar.gz" } ], "0.7.2": [ { "comment_text": "", "digests": { "md5": "7501125afdaac727a54266fe5a5de018", "sha256": "ee4c75819c6d0eeedb531fb22c214e50f303ccc4703f27db1f993cd082ed5a20" }, "downloads": -1, "filename": "rebulk-0.7.2.tar.gz", "has_sig": false, "md5_digest": "7501125afdaac727a54266fe5a5de018", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 254345, "upload_time": "2016-04-27T21:48:36", "url": "https://files.pythonhosted.org/packages/77/df/06b4d2ddc94d8618cd6da533e42c090cbf4aa90bd046a5b0224a53282e9d/rebulk-0.7.2.tar.gz" } ], "0.7.3": [ { "comment_text": "", "digests": { "md5": "bba47602412c1a974873d3e249148e48", "sha256": "1ee0f672be5cfeed793d294c1cfc078c254fb0966af59191e4f6a0785b3b1697" }, "downloads": -1, "filename": "rebulk-0.7.3.tar.gz", "has_sig": false, "md5_digest": "bba47602412c1a974873d3e249148e48", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 254565, "upload_time": "2016-07-25T21:39:57", "url": "https://files.pythonhosted.org/packages/4d/71/44e0ca08d29265185963bf39a5566746ef1a7e663b5e155bd67a9e4fbd5c/rebulk-0.7.3.tar.gz" } ], "0.7.3.dev0": [ { "comment_text": "", "digests": { "md5": "f9630a20937cee22a944bb1e77db58d9", "sha256": "47102ebf9ae03adc0c5f8e24393586716c5ee2a0da7bd7c579eef9cbdcf46b9f" }, "downloads": -1, "filename": "rebulk-0.7.3.dev0.tar.gz", "has_sig": false, "md5_digest": "f9630a20937cee22a944bb1e77db58d9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 254596, "upload_time": "2016-07-25T21:39:02", "url": "https://files.pythonhosted.org/packages/71/91/e6eb16cd067c02a3f0885539d062c583650a6ceddc3478bce8b03e5aa9f3/rebulk-0.7.3.dev0.tar.gz" } ], "0.7.4": [ { "comment_text": "", "digests": { "md5": "716c1d76bce9a94389af141e0893a3d2", "sha256": "1bbea5ebcc18b70c5deb19ba6924fb76392d5130b0fe712e3af7a4e4bee18e21" }, "downloads": -1, "filename": "rebulk-0.7.4.tar.gz", "has_sig": false, "md5_digest": "716c1d76bce9a94389af141e0893a3d2", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 255137, "upload_time": "2016-09-11T10:01:56", "url": "https://files.pythonhosted.org/packages/e7/57/50fd1a365093b8edc71a8cae3d070d50c133eaa229272a53bb2f1ee34195/rebulk-0.7.4.tar.gz" } ], "0.7.5": [ { "comment_text": "", "digests": { "md5": "aa74b34086977e4ca86c1f3ddca149ab", "sha256": "050102f497a32e2b9eb32e0e914e809f2343b46efb82eaf0d5d09f76cd218458" }, "downloads": -1, "filename": "rebulk-0.7.5.tar.gz", "has_sig": false, "md5_digest": "aa74b34086977e4ca86c1f3ddca149ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 255757, "upload_time": "2016-09-18T09:44:51", "url": "https://files.pythonhosted.org/packages/7d/8b/4c0993f9af94a730db5e006379ea1707afd8d6387db6f95ae45e4c1ba8bb/rebulk-0.7.5.tar.gz" } ], "0.7.6": [ { "comment_text": "", "digests": { "md5": "aa823265a156b8a0c7f448b5be32db1d", "sha256": "1357820b13460fc30ecdf58b7743b34da79f76bec954c21051da9eefab0e82cd" }, "downloads": -1, "filename": "rebulk-0.7.6.tar.gz", "has_sig": false, "md5_digest": "aa823265a156b8a0c7f448b5be32db1d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 256070, "upload_time": "2016-09-18T20:36:46", "url": "https://files.pythonhosted.org/packages/1b/e6/ff6bab7e66679a01ea52b0269a354df3a8047572eac107fff70110f5d943/rebulk-0.7.6.tar.gz" } ], "0.7.7": [ { "comment_text": "", "digests": { "md5": "c602fac777b269f9e48ec94124b40926", "sha256": "1b17f6153b26e88d247fac7a3a0735ba03d8ffad7a73d4c95516bf6db1d430ed" }, "downloads": -1, "filename": "rebulk-0.7.7.tar.gz", "has_sig": false, "md5_digest": "c602fac777b269f9e48ec94124b40926", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 256170, "upload_time": "2016-11-26T13:58:27", "url": "https://files.pythonhosted.org/packages/6a/d5/57de5c84b15865cb89b477cbf714129a3d7b78f6681a36e9250e059969f2/rebulk-0.7.7.tar.gz" } ], "0.8.0": [ { "comment_text": "", "digests": { "md5": "91d2848a91796891e75840f5a16143af", "sha256": "b09451c6c7bf38dcc0f089e9580eff9b3b55eb5bb4b9587c0168e351c1b5b225" }, "downloads": -1, "filename": "rebulk-0.8.0.tar.gz", "has_sig": false, "md5_digest": "91d2848a91796891e75840f5a16143af", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 256852, "upload_time": "2016-11-26T20:36:10", "url": "https://files.pythonhosted.org/packages/7e/57/132a5047e7b7389233c235be265640573c1360914b815b09f03dac2d149b/rebulk-0.8.0.tar.gz" } ], "0.8.1": [ { "comment_text": "", "digests": { "md5": "cb252523d4a2e818d09c4da991a85d22", "sha256": "368116d8c2e1a028d65c57cd34dfa99f47631cf741de174305575fcdc54875fd" }, "downloads": -1, "filename": "rebulk-0.8.1.tar.gz", "has_sig": false, "md5_digest": "cb252523d4a2e818d09c4da991a85d22", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 256871, "upload_time": "2016-11-27T08:34:51", "url": "https://files.pythonhosted.org/packages/a5/b5/e3f8ddb062477bbadcc68fee092316d33f38c93a154fed1da9d33286ab94/rebulk-0.8.1.tar.gz" } ], "0.8.2": [ { "comment_text": "", "digests": { "md5": "ba9687962e6fcf6c979eb4af5654d47a", "sha256": "8c09901bda7b79a21d46faf489d67d017aa54d38bdabdb53f824068a6640401a" }, "downloads": -1, "filename": "rebulk-0.8.2.tar.gz", "has_sig": false, "md5_digest": "ba9687962e6fcf6c979eb4af5654d47a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 257147, "upload_time": "2016-11-27T14:43:36", "url": "https://files.pythonhosted.org/packages/58/06/5072bb14eecb98948b57ffa32120da550037fa9b64e1860190755fea97ff/rebulk-0.8.2.tar.gz" } ], "0.9.0": [ { "comment_text": "", "digests": { "md5": "9f1a6c3c26e5e9b4fb748c1ca27557ab", "sha256": "e0c69bdddccbba3ef881948ea96f1d62eda91201c306ea568a676507a30985eb" }, "downloads": -1, "filename": "rebulk-0.9.0.tar.gz", "has_sig": false, "md5_digest": "9f1a6c3c26e5e9b4fb748c1ca27557ab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 257342, "upload_time": "2017-05-31T13:42:09", "url": "https://files.pythonhosted.org/packages/a6/e1/4d7f428da2a537f6325af46fdfda4c8e425f92a0ce7e4a2c4a30558f7160/rebulk-0.9.0.tar.gz" } ], "1.0.0": [ { "comment_text": "", "digests": { "md5": "b65c2f0745aee1828e6fe85ff9434aa6", "sha256": "1d49e4f7ef6fb874e60efccacbbe661092fabdb7770cdf7f7de4516d50535998" }, "downloads": -1, "filename": "rebulk-1.0.0.tar.gz", "has_sig": false, "md5_digest": "b65c2f0745aee1828e6fe85ff9434aa6", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 255918, "upload_time": "2018-10-12T21:08:41", "url": "https://files.pythonhosted.org/packages/34/2e/fa453c6d8a895a96d5cd0ddb673e6c45f69d7ca9a2544eb8f36114ed7789/rebulk-1.0.0.tar.gz" } ], "1.0.1": [ { "comment_text": "", "digests": { "md5": "bf62651ec1d1cafb37a98cf78cf0415d", "sha256": "81142667c5626913392d81c199bfb2ca60a16d85c402c3e371f0f29dbc262684" }, "downloads": -1, "filename": "rebulk-1.0.1.tar.gz", "has_sig": false, "md5_digest": "bf62651ec1d1cafb37a98cf78cf0415d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 255891, "upload_time": "2019-08-12T20:32:14", "url": "https://files.pythonhosted.org/packages/ff/fc/25e350ad71b22dca6d49979d43a523e13e7d5f9b5893ce0e8dfc509e2503/rebulk-1.0.1.tar.gz" } ], "2.0.0": [ { "comment_text": "", "digests": { "md5": "1dcfc1d18ae723df096b254291fc6397", "sha256": "1b0d526859ef3e8647f37c606d7ae7c32259e370b3f1519e4219a3ba72740aec" }, "downloads": -1, "filename": "rebulk-2.0.0.tar.gz", "has_sig": false, "md5_digest": "1dcfc1d18ae723df096b254291fc6397", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 257112, "upload_time": "2019-08-29T22:21:31", "url": "https://files.pythonhosted.org/packages/ad/f6/3b27f7399ac8486d86e239e0a44acacfd0e0a3e5903071420c0b0cf8b465/rebulk-2.0.0.tar.gz" } ], "2.0.0b1": [ { "comment_text": "", "digests": { "md5": "be934737adeeb8317e5299678c5263cb", "sha256": "6d040bb0db91820441a199de3b1d8f368e2d666f90ca36b6e935062c12bd0b23" }, "downloads": -1, "filename": "rebulk-2.0.0b1.tar.gz", "has_sig": false, "md5_digest": "be934737adeeb8317e5299678c5263cb", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 256997, "upload_time": "2019-08-27T21:57:07", "url": "https://files.pythonhosted.org/packages/76/7b/f05b5129485b7059e33e08b8b5218568cea5b8bd069292a03bb076f387f1/rebulk-2.0.0b1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "1dcfc1d18ae723df096b254291fc6397", "sha256": "1b0d526859ef3e8647f37c606d7ae7c32259e370b3f1519e4219a3ba72740aec" }, "downloads": -1, "filename": "rebulk-2.0.0.tar.gz", "has_sig": false, "md5_digest": "1dcfc1d18ae723df096b254291fc6397", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 257112, "upload_time": "2019-08-29T22:21:31", "url": "https://files.pythonhosted.org/packages/ad/f6/3b27f7399ac8486d86e239e0a44acacfd0e0a3e5903071420c0b0cf8b465/rebulk-2.0.0.tar.gz" } ] }