{"action":"closed","number":148,"pull_request":{"url":"https://api.github.com/repos/drummonds/bene/pulls/148","id":304338980,"node_id":"MDExOlB1bGxSZXF1ZXN0MzA0MzM4OTgw","html_url":"https://github.com/drummonds/bene/pull/148","diff_url":"https://github.com/drummonds/bene/pull/148.diff","patch_url":"https://github.com/drummonds/bene/pull/148.patch","issue_url":"https://api.github.com/repos/drummonds/bene/issues/148","number":148,"state":"closed","locked":false,"title":"Scheduled weekly dependency update for week 31","user":{"login":"pyup-bot","id":16239342,"node_id":"MDQ6VXNlcjE2MjM5MzQy","avatar_url":"https://avatars0.githubusercontent.com/u/16239342?v=4","gravatar_id":"","url":"https://api.github.com/users/pyup-bot","html_url":"https://github.com/pyup-bot","followers_url":"https://api.github.com/users/pyup-bot/followers","following_url":"https://api.github.com/users/pyup-bot/following{/other_user}","gists_url":"https://api.github.com/users/pyup-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/pyup-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pyup-bot/subscriptions","organizations_url":"https://api.github.com/users/pyup-bot/orgs","repos_url":"https://api.github.com/users/pyup-bot/repos","events_url":"https://api.github.com/users/pyup-bot/events{/privacy}","received_events_url":"https://api.github.com/users/pyup-bot/received_events","type":"User","site_admin":false},"body":"\n\n\n\n\n### Update [psycopg2](https://pypi.org/project/psycopg2) from **2.7.4** to **2.8.3**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.8.3\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Added *interval_status* parameter to\n  `~psycopg2.extras.ReplicationCursor.start_replication()` method and other\n  facilities to send automatic replication keepalives at periodic intervals\n  (:ticket:`913`).\n- Fixed namedtuples caching introduced in 2.8 (:ticket:`928`).\n   ```\n   \n  \n  \n   ### 2.8.2\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Fixed `~psycopg2.extras.RealDictCursor` when there are repeated columns\n  (:ticket:`884`).\n- Binary packages built with openssl 1.1.1b. Should fix concurrency problems\n  (:tickets:`543, 836`).\n   ```\n   \n  \n  \n   ### 2.8.1\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Fixed `~psycopg2.extras.RealDictRow` modifiability (:ticket:`886`).\n- Fixed &quot;there&#39;s no async cursor&quot; error polling a connection with no cursor\n  (:ticket:`887`).\n   ```\n   \n  \n  \n   ### 2.8\n   ```\n   -------------------------\n\nNew features:\n\n- Added `~psycopg2.errors` module. Every PostgreSQL error is converted into\n  a specific exception class (:ticket:`682`).\n- Added `~psycopg2.extensions.encrypt_password()` function (:ticket:`576`).\n- Added `~psycopg2.extensions.BYTES` adapter to manage databases with mixed\n  encodings on Python 3 (:ticket:`835`).\n- Added `~psycopg2.extensions.Column.table_oid` and\n  `~psycopg2.extensions.Column.table_column` attributes on `cursor.description`\n  items (:ticket:`661`).\n- Added `connection.info` object to retrieve various PostgreSQL connection\n  information (:ticket:`726`).\n- Added `~connection.get_native_connection()` to expose the raw ``PGconn``\n  structure to C extensions via Capsule (:ticket:`782`).\n- Added `~connection.pgconn_ptr` and `~cursor.pgresult_ptr` to expose raw\n  C structures to Python and interact with libpq via ctypes (:ticket:`782`).\n- `~psycopg2.sql.Identifier` can represent qualified names in SQL composition\n  (:ticket:`732`).\n- Added `!ReplicationCursor`.\\ `~psycopg2.extras.ReplicationCursor.wal_end`\n  attribute (:ticket:`800`).\n- Added *fetch* parameter to `~psycopg2.extras.execute_values()` function\n  (:ticket:`813`).\n- `!str()` on `~psycopg2.extras.Range` produces a human-readable representation\n  (:ticket:`773`).\n- `~psycopg2.extras.DictCursor` and `~psycopg2.extras.RealDictCursor` rows\n  maintain columns order (:ticket:`177`).\n- Added `~psycopg2.extensions.Diagnostics.severity_nonlocalized` attribute on\n  the `~psycopg2.extensions.Diagnostics` object (:ticket:`783`).\n- More efficient `~psycopg2.extras.NamedTupleCursor` (:ticket:`838`).\n\nBug fixes:\n\n- Fixed connections occasionally broken by the unrelated use of the\n  multiprocessing module (:ticket:`829`).\n- Fixed async communication blocking if results are returned in different\n  chunks, e.g. with notices interspersed to the results (:ticket:`856`).\n- Fixed adaptation of numeric subclasses such as `~enum.IntEnum`\n  (:ticket:`591`).\n\nOther changes:\n\n- Dropped support for Python 2.6, 3.2, 3.3.\n- Dropped `psycopg1` module.\n- Dropped deprecated `!register_tstz_w_secs()` (was previously a no-op).\n- Dropped deprecated `!PersistentConnectionPool`. This pool class was mostly\n  designed to interact with Zope. Use `!ZPsycopgDA.pool` instead.\n- Binary packages no longer installed by default. The &#39;psycopg2-binary&#39;\n  package must be used explicitly.\n- Dropped `!PSYCOPG_DISPLAY_SIZE` build parameter.\n- Dropped support for mxDateTime as the default date and time adapter.\n  mxDatetime support continues to be available as an alternative to Python&#39;s\n  builtin datetime.\n- No longer use 2to3 during installation for Python 2 &amp; 3 compatibility. All\n  source files are now compatible with Python 2 &amp; 3 as is.\n- The `!psycopg2.test` package is no longer installed by ``python setup.py\n  install``.\n- Wheel package compiled against OpenSSL 1.0.2r and PostgreSQL 11.2 libpq.\n   ```\n   \n  \n  \n   ### 2.7.7\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Cleanup of the cursor results assignment code, which might have solved\n  double free and inconsistencies in concurrent usage (:tickets:`346, 384`).\n- Wheel package compiled against OpenSSL 1.0.2q.\n   ```\n   \n  \n  \n   ### 2.7.6.1\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Fixed binary package broken on OS X 10.12 (:ticket:`807`).\n- Wheel package compiled against PostgreSQL 11.1 libpq.\n   ```\n   \n  \n  \n   ### 2.7.6\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Close named cursors if exist, even if `~cursor.execute()` wasn&#39;t called\n  (:ticket:`746`).\n- Fixed building on modern FreeBSD versions with Python 3.7 (:ticket:`755`).\n- Fixed hang trying to :sql:`COPY` via `~cursor.execute()` in asynchronous\n  connections (:ticket:`781`).\n- Fixed adaptation of arrays of empty arrays (:ticket:`788`).\n- Fixed segfault accessing the connection&#39;s `~connection.readonly` and\n  `~connection.deferrable` attributes repeatedly (:ticket:`790`).\n- `~psycopg2.extras.execute_values()` accepts `~psycopg2.sql.Composable`\n  objects (:ticket:`794`).\n- `~psycopg2.errorcodes` map updated to PostgreSQL 11.\n- Wheel package compiled against PostgreSQL 10.5 libpq and OpenSSL 1.0.2p.\n   ```\n   \n  \n  \n   ### 2.7.5\n   ```\n   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Allow non-ascii chars in namedtuple fields (regression introduced fixing\n  :ticket:`211`).\n- Fixed adaptation of arrays of arrays of nulls (:ticket:`325`).\n- Fixed building on Solaris 11 and derivatives such as SmartOS and illumos\n  (:ticket:`677`).\n- Maybe fixed building on MSYS2 (as reported in :ticket:`658`).\n- Allow string subclasses in connection and other places (:ticket:`679`).\n- Don&#39;t raise an exception closing an unused named cursor (:ticket:`716`).\n- Wheel package compiled against PostgreSQL 10.4 libpq and OpenSSL 1.0.2o.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/psycopg2\n  - Changelog: https://pyup.io/changelogs/psycopg2/\n  - Homepage: http://initd.org/psycopg/\n</details>\n\n\n\n\n\n### Update [gevent](https://pypi.org/project/gevent) from **1.2.2** to **1.4.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 1.4.0\n   ```\n   ==================\n\n- Build with Cython 0.29 in &#39;3str&#39; mode.\n\n- Test with PyPy 6.0 on Windows.\n\n- Add support for application-wide callbacks when ``Greenlet`` objects\n  are started. See :pr:`1289`, provided by Yury Selivanov.\n\n- Fix consuming a single ready object using\n  ``next(gevent.iwait(objs))``. Previously such a construction would\n  hang because `iter` was not called. See :pr:`1288`, provided by Josh\n  Snyder. This is not recommended, though, as unwaited objects will\n  have dangling links (but see next item).\n\n- Make `gevent.iwait` return an iterator that can now also be used as\n  a context manager. If you&#39;ll only be consuming part of the iterator,\n  use it in a ``with`` block to avoid leaking resources. See\n  :pr:`1290`, provided by Josh Snyder.\n\n- Fix semaphores to immediately notify links if they are ready and\n  ``rawlink()`` is called. This behaves like ``Event`` and\n  ``AsyncEvent``. Note that the order in which semaphore links are\n  called is not specified. See :issue:`1287`, reported by Dan Milon.\n\n- Improve safety of handling exceptions during interpreter shutdown.\n  See :issue:`1295` reported by BobDenar1212.\n\n- Remove the deprecated ability to specify ``GEVENT_RESOLVER`` and\n  other importable settings as a ``path/to/a/package.module.item``.\n  This had race conditions and didn&#39;t work with complicated resolver\n  implementations. Place the required package or module on `sys.path`\n  first.\n\n- Reduce the chances that using the blocking monitor functionality\n  could result in apparently random ``SystemError:\n  Objects/tupleobject.c: bad argument to internal function``. Reported\n  in :issue:`1302` by Ulrich Petri.\n\n- Refactored the gevent test runner and test suite to make them more\n  reusable. In particular, the tests are now run with ``python -m\n  gevent.tests``. See :issue:`1293`.\n\n- Make a monkey-patched ``socket.getaddrinfo`` return socket module\n  enums instead of plain integers for the socket type and address\n  family on Python 3. See :issue:`1310` reported by TheYOSH.\n\n  .. note:: This requires Python 3.4.3 or above due to an undocumented\n            change in that version.\n\n- Make gevent&#39;s pywsgi server set the non-standard environment value\n  ``wsgi.input_terminated`` to True. See :issue:`1308`.\n\n- Make `gevent.util.assert_switches` produce more informative messages\n  when the assertion fails.\n\n- Python 2: If a `gevent.socket` was closed asynchronously (in a\n  different greenlet or a hub callback), `AttributeError` could result\n  if the socket was already in use. Now the correct socket.error\n  should be raised.\n\n- Fix :meth:`gevent.threadpool.ThreadPool.join` raising a\n  `UserWarning` when using the libuv backend. Reported in\n  :issue:`1321` by ZeroNet.\n\n- Fix ``FileObjectPosix.seek`` raising `OSError` when it should have\n  been `IOError` on Python 2. Reported by, and PR by, Ricardo Kirkner.\n  See :issue:`1323`.\n\n- Upgrade libuv from 1.23.2 to 1.24.0.\n   ```\n   \n  \n  \n   ### 1.3.7\n   ```\n   ==================\n\n- Formatting run info no longer includes ``gevent.local.local``\n  objects that have no value in the greenlet. See :issue:`1275`.\n\n- Fixed negative length in pywsgi&#39;s Input read functions for non chunked body.\n  Reported in :issue:`1274` by tzickel.\n\n- Upgrade libuv from 1.22.0 to 1.23.2.\n\n- Fix opening files in text mode in CPython 2 on Windows by patching\n  libuv. See :issue:`1282` reported by wiggin15.\n   ```\n   \n  \n  \n   ### 1.3.6\n   ```\n   ==================\n\n- gevent now depends on greenlet 0.4.14 or above. gevent binary wheels\n  for 1.3.5 and below must have greenlet 0.4.13 installed on Python\n  3.7 or they will crash. Reported by Alexey Stepanov in :issue:`1260`\n  and pkittenis in :issue:`1261`.\n\n- :class:`gevent.local.local` subclasses correctly supports\n  ``staticmethod`` functions. Reported by Brendan Powers in\n  :issue:`1266`.\n   ```\n   \n  \n  \n   ### 1.3.5\n   ```\n   ==================\n\n- Update the bundled libuv from 1.20.1 to 1.22.0.\n\n- Test Python 3.7 on Appveyor. Fix the handling of Popen&#39;s\n  ``close_fds`` argument on 3.7.\n\n- Update Python versions tested on Travis, including PyPy to 6.0. See :issue:`1195`.\n\n- :mod:`gevent.queue` imports ``_PySimpleQueue`` instead of\n  ``SimpleQueue`` so that it doesn&#39;t block the event loop.\n  :func:`gevent.monkey.patch_all` makes this same substitution in\n  :mod:`queue`. This fixes issues with\n  :class:`concurrent.futures.ThreadPoolExecutor` as well. Reported in\n  :issue:`1248` by wwqgtxx and :issue:`1251` by pyld.\n\n- :meth:`gevent.socket.socket.connect` doesn&#39;t pass the port (service)\n  to :func:`socket.getaddrinfo` when it resolves an ``AF_INET`` or\n  ``AF_INET6`` address. (The standard library doesn&#39;t either.) This\n  fixes an issue on Solaris. Reported in :issue:`1252` by wiggin15.\n\n- :meth:`gevent.socket.socket.connect` works with more address\n  families, notably AF_TIPC, AF_NETLINK, AF_BLUETOOTH, AF_ALG and AF_VSOCK.\n   ```\n   \n  \n  \n   ### 1.3.4\n   ```\n   ==================\n\n- Be more careful about issuing ``MonkeyPatchWarning`` for ssl\n  imports. Now, we only issue it if we detect the one specific\n  condition that is known to lead to RecursionError. This may produce\n  false negatives, but should reduce or eliminate false positives.\n\n- Based on measurements and discussion in :issue:`1233`, adjust the\n  way :mod:`gevent.pywsgi` generates HTTP chunks. This is intended to\n  reduce network overhead, especially for smaller chunk sizes.\n\n- Additional slight performance improvements in :mod:`gevent.pywsgi`.\n  See :pr:`1241`.\n   ```\n   \n  \n  \n   ### 1.3.3\n   ```\n   ==================\n\n- :func:`gevent.sleep` updates the loop&#39;s notion of the current time\n  before sleeping so that sleep duration corresponds more closely to\n  elapsed (wall clock) time. :class:`gevent.Timeout` does the same.\n  Reported by champax and FoP in :issue:`1227`.\n\n- Fix an ``UnboundLocalError`` in SSL servers when wrapping a socket\n  throws an error. Reported in :issue:`1236` by kochelmonster.\n   ```\n   \n  \n  \n   ### 1.3.2.post0\n   ```\n   ========================\n\n- Fix a packaging error in manylinux binary wheels that prevented some\n  imports from working. See :issue:`1219`.\n   ```\n   \n  \n  \n   ### 1.3.2\n   ```\n   ==================\n\n- Allow weak refeneces to :class:`gevent.queue.Queue`. Reported in\n  :issue:`1217` by githrdw.\n   ```\n   \n  \n  \n   ### 1.3.1\n   ```\n   ==================\n\n- Allow weak references to :class:`gevent.event.Event`. Reported in\n  :issue:`1211` by Matias Guijarro.\n\n- Fix embedded uses of :func:`gevent.Greenlet.spawn`, especially under\n  uwsgi. Reported in :issue:`1212` by Kunal Gangakhedkar.\n\n- Fix :func:`gevent.os.nb_write` and :func:`gevent.os.nb_read` not\n  always closing the IO event they opened in the event of an\n  exception. This would be a problem especially for libuv.\n   ```\n   \n  \n  \n   ### 1.3.0\n   ```\n   ==================\n\n- Python 3.7 passes the automated memory leak checks. See :issue:`1197`.\n\n- Update autoconf&#39;s config.guess and config.sub to the latest versions\n  for c-ares and libev.\n\n- :class:`gevent.local.local` subclasses that mix-in ABCs can be instantiated.\n  Reported in :issue:`1201` by Bob Jordan.\n   ```\n   \n  \n  \n   ### 1.3b2\n   ```\n   ==================\n\n- On Windows, CFFI is now a dependency so that the libuv backend\n  really can be used by default.\n\n- Fix a bug detecting whether we can use the memory monitoring\n  features when psutil is not installed.\n\n- `gevent.subprocess.Popen` uses ``/proc/self/fd`` (on Linux) or\n  ``/dev/fd`` (on BSD, including macOS) to find the file descriptors\n  to close when ``close_fds`` is true. This matches an optimization\n  added to Python 3 (and backports it to Python 2.7), making process\n  spawning up to 9 times faster. Also, on Python 3, since Python 3.3\n  is no longer supported, we can also optimize the case where\n  ``close_fds`` is false (not the default), making process spawning up\n  to 38 times faster. Initially reported in :issue:`1172` by Ofer Koren.\n\n- The bundled libuv is now 1.20.1, up from 1.19.2. See :issue:`1177`.\n\n- The long-deprecated and undocumented module ``gevent.wsgi`` was removed.\n\n- Add `gevent.util.assert_switches` to build on the monitoring\n  functions. Fixes :issue:`1182`.\n\n- A started monitor thread for the active hub now survives a fork. See\n  :issue:`1185`.\n\n- The greenlet tracer functions used for the various monitoring\n  capabilities are now compiled with Cython for substantially lower\n  overhead. See :pr:`1190`.\n\n- libuv now collects all pending watchers and runs their callbacks at\n  the end of the loop iteration using UV_RUN_ONCE. This eliminates the\n  need to patch libuv to be greenlet-safe. It also means that\n  zero-duration timer watchers are actual timer watchers again\n  (instead of being turned into check watchers); newly added\n  zero-duration timers cannot block the event loop because they won&#39;t\n  be run until a safe time.\n\n- Python 3.7.0b4 is now the tested and supported version of Python\n  3.7. PyPy 6.0 has been tested, although CI continues to use 5.10.\n   ```\n   \n  \n  \n   ### 1.3b1\n   ```\n   ==================\n\nDependencies\n------------\n\n- Cython 0.28.2 is now used to build gevent from a source checkout.\n\n- The bundled libuv is now 1.19.2, up from 1.18.0.\n\nPlatform Support\n----------------\n\n- Travis CI tests on Python 3.7.0b3.\n\n- Windows now defaults to the libuv backend if CFFI is installed. See\n  :issue:`1163`.\n\nBug Fixes\n---------\n\n- On Python 2, when monkey-patching `threading.Event`, also\n  monkey-patch the underlying class, ``threading._Event``. Some code\n  may be type-checking for that. See :issue:`1136`.\n\n- Fix libuv io watchers polling for events that only stopped watchers\n  are interested in, reducing CPU usage. Reported in :issue:`1144` by\n  wwqgtxx.\n\nEnhancements\n------------\n\n- Add additional optimizations for spawning greenlets, making it\n  faster than 1.3a2.\n\n- Use strongly typed watcher callbacks in the libuv CFFI extensions.\n  This prevents dozens of compiler warnings.\n\n- When gevent prints a timestamp as part of an error message, it is\n  now in UTC format as specified by RFC3339.\n\n- Threadpool threads that exit now always destroy their hub (if one\n  was created). This prevents some forms of resource leaks (notably\n  visible as blocking functions reported by the new monitoring abilities).\n\n- Hub objects now include the value of their ``name`` attribute in\n  their repr.\n\n- Pools for greenlets and threads have lower overhead, especially for\n  ``map``. See :pr:`1153`.\n\n- The undocumented, internal implementation classes ``IMap`` and\n  ``IMapUnordered`` classes are now compiled with Cython, further\n  reducing the overhead of ``[Thread]Pool.imap``.\n\n- The classes `gevent.event.Event` and `gevent.event.AsyncResult`\n  are compiled with Cython for improved performance, as is the\n  ``gevent.queue`` module and ``gevent.hub.Waiter`` and certain\n  time-sensitive parts of the hub itself. Please report any\n  compatibility issues.\n\n- ``python -m gevent.monkey &lt;script&gt;`` accepts more values for\n  ``&lt;script&gt;``, including paths to packages or compiled bytecode.\n  Reported in :issue:`1157` by Eddie Linder.\n\n- Add a simple event framework for decoupled communication. It uses\n  :mod:`zope.event` if that is installed.\n\n- :mod:`gevent.monkey` has support for plugins in the form of event\n  subscribers and setuptools entry points. See :pr:`1158` and\n  :issue:`1162`. setuptools must be installed at runtime for its entry\n  points to function.\n\nMonitoring and Debugging\n------------------------\n\n- Introduce the configuration variable\n  `gevent.config.track_greenlet_tree` (aka\n  ``GEVENT_TRACK_GREENLET_TREE``) to allow disabling the greenlet tree\n  features for applications where greenlet spawning is performance\n  critical. This restores spawning performance to 1.2 levels.\n\n- Add an optional monitoring thread for each hub. When enabled, this\n  thread (by default) looks for greenlets that block the event loop\n  for more than 0.1s. You can add your own periodic monitoring\n  functions to this thread. Set ``GEVENT_MONITOR_THREAD_ENABLE`` to\n  use it, and ``GEVENT_MAX_BLOCKING_TIME`` to configure the blocking\n  interval.\n\n- The monitoring thread emits events when it detects certain\n  conditions, like loop blocked or memory limits exceeded.\n\n- Add settings for monitoring memory usage and emitting events when a\n  threshold is exceeded and then corrected. gevent currently supplies\n  no policy for what to do when memory exceeds the configured limit.\n  ``psutil`` must be installed to use this. See :pr:`1150`.\n   ```\n   \n  \n  \n   ### 1.3a2\n   ```\n   ==================\n\nDependencies\n------------\n\n- Cython 0.28b1 or later is now required to build gevent from a source\n  checkout (Cython is *not* required to build a source distribution\n  from PyPI).\n\n- Update c-ares to 1.14.0. See :issue:`1105`.\n\n- gevent now **requires** the patched version of libuv it is\n  distributed with. Building gevent with a non-embedded libuv, while\n  not previously supported, is not possible now. See\n  :issue:`1126`.\n\n\nPlatform Support\n----------------\n\n- Travis CI tests on Python 3.7.0b2 and PyPy 2.7 5.10.0 and PyPy 3.5\n  5.10.1.\n\nBuild Changes\n-------------\n\n- Fix building from a source distribution (PyPI) without Cython\n  installed.\n\nEnhancements\n------------\n\n- Add the ``dnspython`` resolver as a lightweight alternative to\n  c-ares. It is generally faster than c-ares and is supported on PyPy.\n  c-ares may be deprecated in the future. See :pr:`1088` and\n  :issue:`1103`.\n\n- Add the module :mod:`gevent.time` that can be imported instead of\n  :mod:`time`, much like :mod:`gevent.socket` can be imported instead\n  of :mod:`socket`. It contains ``gevent.sleep``. This aids\n  monkey-patching.\n\n- Simple subclasses of `gevent.local.local` now have the same\n  (substantially improved) performance characteristics of plain\n  `gevent.local.local` itself, making them 2 to 3 times faster than\n  before. See :pr:`1117`. If there are any compatibility\n  problems, please open issues.\n\nMonitoring and Debugging\n~~~~~~~~~~~~~~~~~~~~~~~~\n\n- Greenlet objects now keep track of their spawning parent greenlet\n  and the code location that spawned them, in addition to maintaining\n  a &quot;spawn tree local&quot; mapping. This adds some runtime overhead in\n  relative terms, but absolute numbers are still relatively small.\n  Based on a proposal from PayPal and comments by Mahmoud Hashemi and\n  Kurt Rose. See :issue:`755` and :pr:`1115`. As always, feedback is\n  appreciated.\n\n- Greenlet objects now have a `minimal_ident\n  &lt;gevent.Greenlet.minimal_ident&gt;` property. It functions\n  similarly to ``Thread.ident`` or ``id`` by uniquely identifying the\n  greenlet object while it remains alive, and it can be reused after\n  the greenlet object is dead. It is different in that it is small and\n  sequential. Based on a proposal from PayPal and comments by Mahmoud\n  Hashemi and Kurt Rose. See :issue:`755`. As always, feedback is\n  appreciated.\n\n- `gevent.Greenlet` objects now have a `gevent.Greenlet.name`\n  attribute that is included in the default repr.\n\n- Include the values of `gevent.local.local` objects associated with\n  each greenlet in `gevent.util.format_run_info`.\n\n- Add `gevent.util.GreenletTree` to visualize the greenlet tree. This\n  is used by `gevent.util.format_run_info`.\n\n\nSubprocess\n~~~~~~~~~~\n\n- Make :class:`gevnt.subprocess.Popen` accept the ``restore_signals``\n  keyword argument on all versions of Python, and on Python 2 have it\n  default to false. It previously defaulted to true on all versions;\n  now it only defaults to true on Python 3. The standard library in\n  Python 2 does not have this argument and its behaviour with regards\n  to signals is undocumented, but there is code known to rely on\n  signals not being restored under Python 2. Initial report and patch\n  in :pr:`1063` by Florian Margaine.\n\n- Allow :class:`gevent.subprocess.Popen` to accept the keyword\n  arguments ``pass_fds`` and ``start_new_session`` under Python 2.\n  They have always had the same default as Python 3, namely an empty\n  tuple and false, but now are accessible to Python 2.\n\n- Support the ``capture_output`` argument added to Python 3.7 in\n  :func:`gevent.subprocess.run`.\n\nConfiguration\n~~~~~~~~~~~~~\n\n- Centralize all gevent configuration in an object at\n  ``gevent.config``, allowing for gevent to be configured through code\n  and not *necessarily* environment variables, and also provide a\n  centralized place for documentation. See :issue:`1090`.\n\n  - The new ``GEVENT_CORE_CFFI_ONLY`` environment variable has been\n    replaced with the pre-existing ``GEVENT_LOOP`` environment\n    variable. That variable may take the values ``libev-cext``,\n    ``libev-cffi``, or ``libuv-cffi``, (or be a list in preference\n    order, or be a dotted name; it may also be assigned to an\n    object in Python code at ``gevent.config.loop``).\n\n  - The ``GEVENTARES_SERVERS`` environment variable is deprecated in\n    favor of ``GEVENT_RESOLVER_SERVERS``. See :issue:`1103`.\n\n\nBug Fixes\n---------\n\n- Fix calling ``shutdown`` on a closed socket. It was raising\n  ``AttributeError``, now it once again raises the correct\n  ``socket.error``. Reported in :issue:`1089` by André Cimander.\n\n- Fix an interpreter crash that could happen if two or more ``loop``\n  objects referenced the default event loop and one of them was\n  destroyed and then the other one destroyed or (in the libev C\n  extension implementation only) deallocated (garbage collected). See\n  :issue:`1098`.\n\n- Fix a race condition in libuv child callbacks. See :issue:`1104`.\n\nOther Changes\n-------------\n\n- The internal, undocumented module ``gevent._threading`` has been\n  simplified.\n\n- The internal, undocumented class ``gevent._socket3._fileobject`` has\n  been removed. See :issue:`1084`.\n\n- Simplify handling of the libev default loop and the ``destroy()``\n  method. The default loop, when destroyed, can again be requested and\n  it will regenerate itself. The default loop is the only one that can\n  receive child events.\n\n- Make :meth:`gevent.socket.socket.sendall` up to ten times faster on\n  PyPy3, through the same change that was applied in gevent 1.1b3 for PyPy2.\n\n- Be more careful about issuing a warning about patching SSL on\n  Python 2. See :issue:`1108`.\n\n- Signal handling under PyPy with libuv is more reliable. See\n  :issue:`1112`.\n\n- The :mod:`gevent.greenlet` module is now compiled with Cython to\n  offset any performance decrease due to :issue:`755`. Please open\n  issues for any compatibility concerns. See :pr:`1115` and :pr:`1120`.\n\n- On CPython, allow the pure-Python implementations of\n  `gevent.Greenlet`, `gevent.local` and `gevent.lock` to be\n  used when the environment variable ``PURE_PYTHON`` is set. This is\n  not recommended except for debugging and testing. See :issue:`1118`.\n\n- :meth:`gevent.select.poll.poll` now interprets a *timeout* of -1 the\n  same as a *timeout* of *None* as the standard requires. Previously,\n  on libuv this was interpreted the same as a *timeout* of 0. In\n  addition, all *timeout* values less than zero are interpreted like\n  *None* (as they always were under libev). See :issue:`1127`.\n\n- Monkey-patching now defaults to patching ``threading.Event``.\n   ```\n   \n  \n  \n   ### 1.3a1\n   ```\n   ==================\n\nDependencies\n------------\n\n- gevent is now built and tested with Cython 0.27. This is required\n  for Python 3.7 support.\n\n- Update c-ares to 1.13.0. See :issue:`990`.\n\n\nPlatform Support\n----------------\n\n- Add initial support for Python 3.7a3. It has the same level of\n  support as Python 3.6.\n\n  - Using unreleased Cython 0.28 and greenlet 0.4.13; requires Python 3.7a3.\n\n  - The ``async`` functions and classes have been renamed to\n    ``async_`` due to ``async`` becoming a keyword in Python 3.7.\n    Aliases are still in place for older versions. See :issue:`1047`.\n\n- gevent is now tested on Python 3.6.4. This includes the following\n  fixes and changes:\n\n  - Errors raised from :mod:`gevent.subprocess` will have a\n    ``filename`` attribute set.\n  - The :class:`threading.Timer` class is now monkey-patched and can\n    be joined. Previously on Python 3.4 and above, joining a ``Timer``\n    would hang the process.\n  - :meth:`gevent.ssl.SSLSocket.unwrap` behaves more like the standard\n    library, including returning a SSLSocket and allowing certain\n    timeout-related SSL errors to propagate. The added standard\n    library tests ``test_ftplib.py`` now passes.\n  - :class:`gevent.subprocess.Popen` accepts a &quot;path-like object&quot; for\n    the *cwd* parameter on all platforms. Previously this only worked\n    on POSIX platforms under Python 3.6. Now it also works on Windows under\n    Python 3.6 (as expected) and is backported to all previous versions.\n\n- Linux CI now tests on PyPy3 3.5-5.9.0, updated from PyPy3 3.5-5.7.1.\n  See :issue:`1001`. PyPy2 has been updated to 5.9.0 from 5.7.1,\n  Python 2.7 has been updated to 2.7.14 from 2.7.13, Python 3.4 is\n  updated to 3.4.7 from 3.4.5, Python 3.5 is now 3.5.4 from 3.5.3, and\n  Python 3.6 is now 3.6.4 from 3.6.0.\n\n- Drop support for Python 3.3. The documentation has only claimed\n  support for 3.4+ since gevent 1.2 was released, and only 3.4+ has\n  been tested. This merely removes the supporting Trove classifier and\n  remaining test code. See :issue:`997`.\n\n- PyPy is now known to run on Windows using the libuv backend, with\n  caveats. See the section on libuv for more information.\n\n- Due to security concerns, official support for Python 2.7.8 and\n  earlier (without a modern SSL implementation) has been dropped.\n  These versions are no longer tested with gevent, but gevent can\n  still be installed on them. Supporting code will be removed in the\n  next major version of gevent. See :issue:`1073`.\n\nBuild Changes\n-------------\n\n- When building gevent from a source checkout (*not* a distributed\n  source distribution), ``make`` is no longer required and the\n  ``Makefile`` is not used. Neither is an external ``cython`` command.\n  Instead, the ``cythonize`` function is used, as recommended by\n  Cython. (The external commands were never required by source\n  distributions.) See :issue:`1076`.\n\n- :class:`gevent.local.local` is compiled with Cython on CPython.\n\n- The Cython ares &#39;channel&#39; class is no longer declared to be publicly\n  accessible from a named C structure. Doing so caused a conflict with\n  the c-ares header files.\n\nBug Fixes\n---------\n\n- If a single greenlet created and destroyed many\n  :class:`gevent.local.local` objects without ever exiting, there\n  would be a leak of the function objects intended to clean up the\n  locals after the greenlet exited. Introduce a weak reference to\n  avoid that. Reported in :issue:`981` by Heungsub Lee.\n\n- pywsgi also catches and ignores by default\n  :const:`errno.WSAECONNABORTED` on Windows. Initial patch in\n  :pr:`999` by Jan van Valburg.\n\n- :meth:`gevent.subprocess.Popen.communicate` returns the correct type\n  of str (not bytes) in universal newline mode under Python 3, or when\n  an encoding has been specified. Initial patch in :pr:`939` by\n  William Grzybowski.\n\n- :meth:`gevent.subprocess.Popen.communicate` (and in general,\n  accessing ``Popen.stdout`` and ``Popen.stderr``) returns the correct\n  type of str (bytes) in universal newline mode under Python 2.\n  Previously it always returned unicode strings. Reported in\n  :issue:`1039` by Michal Petrucha.\n\n- :class:`gevent.fileobject.FileObjectPosix` returns native strings in\n  universal newline mode on Python 2. This is consistent with what\n  :class:`.FileObjectThread` does. See :issue:`1039`.\n\n- ``socket.send()`` now catches ``EPROTOTYPE`` on macOS to handle a race\n  condition during shutdown. Fixed in :pr:`1035` by Jay Oster.\n\n- :func:`gevent.socket.create_connection` now properly cleans up open\n  sockets if connecting or binding raises a :exc:`BaseException` like\n  :exc:`KeyboardInterrupt`, :exc:`greenlet.GreenletExit` or\n  :exc:`gevent.timeout.Timeout`. Reported in :issue:`1044` by\n  kochelmonster.\n\n\nOther Changes\n-------------\n\n- ``Pool.add`` now accepts ``blocking`` and ``timeout`` parameters,\n  which function similarly to their counterparts in ``Semaphore``.\n  See :pr:`1032` by Ron Rothman.\n\n- Defer adjusting the stdlib&#39;s list of active threads until\n  ``threading`` is monkey patched. Previously this was done when\n  :mod:`gevent.threading` was imported. That module is documented to\n  be used as a helper for monkey patching, so this should generally\n  function the same, but some applications ignore the documentation\n  and directly import that module anyway.\n\n  A positive consequence is that ``import gevent.threading, threading;\n  threading.current_thread()`` will no longer return a DummyThread\n  before monkey-patching. Another positive consequence is that PyPy\n  will no longer print a ``KeyError`` on exit if\n  :mod:`gevent.threading` was imported *without* monkey-patching.\n\n  See :issue:`984`.\n\n- Specify the Requires-Python metadata for improved installation\n  support in certain tools (setuptools v24.2.1 or newer is required).\n  See :issue:`995`.\n\n- Monkey-patching after the :mod:`ssl` module has been imported now\n  prints a warning because this can produce ``RecursionError``.\n\n- :class:`gevent.local.local` objects are now approximately 3.5 times faster\n  getting, setting and deleting attributes on PyPy. This involved\n  implementing more of the attribute protocols directly. Please open\n  an issue if you have any compatibility problems. See :issue:`1020`.\n\n- :class:`gevent.local.local` is compiled with Cython on CPython. It\n  was already 5 to 6 times faster due to the work on :issue:`1020`,\n  and compiling it with Cython makes it another 5 to 6 times faster,\n  for a total speed up of about 35 times. It is now in the same\n  ballpark as the native :class:`threading.local` class. It also uses\n  one pointer less memory per object, and one pointer less memory per\n  greenlet. See :pr:`1024`.\n\n- More safely terminate subprocesses on Windows with\n  :meth:`gevent.subprocess.Popen.terminate`. Reported in :issue:`1023`\n  by Giacomo Debidda.\n\n- gevent now uses cffi&#39;s &quot;extern &#39;Python&#39;&quot; callbacks. These should be\n  faster and more stable. This requires at least cffi 1.4.0. See :issue:`1049`.\n\n- gevent now approximately tries to stick to a scheduling interval\n  when running callbacks, instead of simply running a count of\n  callbacks. The interval is determined by\n  :func:`gevent.getswitchinterval`. On Python 3, this is the same as\n  the thread switch interval. On Python 2, this defaults to 0.005s and\n  can be changed with :func:`gevent.setswitchinterval`. This should\n  result in more fair &quot;scheduling&quot; of greenlets, especially when\n  ``gevent.sleep(0)`` or other busy callbacks are in use. The interval\n  is checked every 50 callbacks to keep overhead low. See\n  :issue:`1072`. With thanks to Arcadiy Ivanov and Antonio Cuni.\n\nlibuv\n-----\n\n- Add initial *experimental* support for using libuv as a backend\n  instead of libev, controlled by setting the environment variable\n  ``GEVENT_CORE_CFFI_ONLY=libuv`` before importing gevent. This\n  suffers a number of limitations compared to libev, notably:\n\n  - libuv support is not available in the manylinux wheels uploaded to\n    PyPI. The manylinux specification requires glibc 2.5, while libuv\n    requires glibc 2.12. Install from source to access libuv on Linux\n    (e.g., pip&#39;s ``--no-binary`` option).\n\n  - Timers (such as ``gevent.sleep`` and ``gevent.Timeout``) only\n    support a resolution of 1ms (in practice, it&#39;s closer to 1.5ms).\n    Attempting to use something smaller will automatically increase it\n    to 1ms and issue a warning. Because libuv only supports\n    millisecond resolution by rounding a higher-precision clock to an\n    integer number of milliseconds, timers apparently suffer from more\n    jitter.\n\n  - Using negative timeouts may behave differently from libev.\n\n  - libuv blocks delivery of all signals, so signals are handled using\n    an (arbitrary) 0.3 second timer. This means that signal handling\n    will be delayed by up to that amount, and that the longest the\n    event loop can sleep in the operating system&#39;s ``poll`` call is\n    that amount. Note that this is what gevent does for libev on\n    Windows too.\n\n  - libuv only supports one io watcher per file descriptor, whereas\n    libev and gevent have always supported many watchers using\n    different settings. The libev behaviour is emulated at the Python\n    level, but that adds overhead.\n\n  - Looping multiple times and expecting events for the same file\n    descriptor to be raised each time without any data being read or\n    written (as works with libev) does not appear to work correctly on\n    Linux when using ``gevent.select.poll`` or a monkey-patched\n    ``selectors.PollSelector``.\n\n  - The build system does not support using a system libuv; the\n    embedded copy must be used. Using setuptools to compile libuv was\n    the most portable method found.\n\n  - If anything unexpected happens, libuv likes to ``abort()`` the\n    entire process instead of reporting an error. For example, closing\n    a file descriptor it is using in a watcher may cause the entire\n    process to be exited.\n\n  - There may be occasional otherwise unexplained and hard to\n    duplicate crashes. If you can duplicate a crash, **please** submit\n    an issue.\n\n  - This is the only backend that PyPy can use on Windows. As of this\n    alpha, there are many known issues with non-blocking sockets\n    (e.g., as used by :mod:`asyncore`; see ``test_ftplib.py``) and\n    sometimes sockets not getting closed in a timely fashion\n    (apparently; see ``test_httpservers.py``) and communicating with\n    subprocesses (it always hangs). Help tracking those down would be\n    appreciated. Only PyPy2 is tested.\n\n  Feedback and pull requests are welcome, especially to address the\n  issues mentioned above.\n\n  Other differences include:\n\n  - The order in which timers and other callbacks are invoked may be\n    different than in libev. In particular, timers and IO callbacks\n    happen in a different order, and timers may easily be off by up to\n    half of the supposed 1ms resolution. See :issue:`1057`.\n\n  - Starting a ``timer`` watcher does not update the loop&#39;s time by\n    default. This is because, unlike libev, a timer callback can cause\n    other timer callbacks to be run if they expire because the loop&#39;s\n    time updated, without cycling the event loop. See :issue:`1057`.\n\n    libev has also been changed to follow this behaviour.\n\n    Also see :issue:`1072`.\n\n  - Timers of zero duration do not necessarily cause the event loop to\n    cycle, as they do in libev. Instead, they may be called\n    immediately. If zero duration timers are added from other zero\n    duration timer callbacks, this can lead the loop to appear to\n    hang, as no IO will actually be done.\n\n    To mitigate this issue, ``loop.timer()`` detects attempts to use\n    zero duration timers and turns them into a check watcher. check\n    watchers do not support the ``again`` method.\n\n  - All watchers (e.g., ``loop.io``) and the ``Timeout`` class have a\n    ``close`` method that should be called when code is done using the\n    object (they also function as context managers and a ``with``\n    statement will automatically close them). gevent does this\n    internally for sockets, file objects and internal timeouts.\n    Neglecting to close an object may result in leaking native\n    resources. To debug this, set the environment variables\n    ``GEVENT_DEBUG=debug`` and ``PYTHONTRACEMALLOC=n`` before starting\n    the process.\n\n    The traditional cython-based libev backend will not leak if\n    ``close`` is not called and will not produce warnings. The\n    CFFI-based libev backend will not currently leak but will produce\n    warnings. The CFFI-based libuv backend may leak and will produce\n    warnings.\n\n  Again, this is extremely experimental and all of it is subject to\n  change.\n\n  See :issue:`790` for history and more in-depth discussion.\n\nlibev\n-----\n\n- The C extension has been updated to use more modern Cython idioms\n  and generate less code for simplicity, faster compilation and better\n  cache usage. See :pr:`1077`.\n\n  - Watcher objects may be slightly larger. On a 64-bit platform, a\n    typical watcher may be 16 bytes (2 pointers) larger. This is\n    offset by slight performance gains.\n\n  - Cython is no longer preprocessed. Certain attributes that were\n    previously only defined in certain compilation modes (notably\n    LIBEV_EMBED) are now always defined, but will raise\n    ``AttributeError`` or have a negative value when not available. In\n    general these attributes are not portable or documented and are\n    not implemented by libuv or the CFFI backend. See :issue:`1076`.\n\n  - Certain private helper functions (``gevent_handle_error``, and part of\n    ``gevent_call``) are now implemented in Cython instead of C. This\n    reduces our reliance on internal undocumented implementation\n    details of Cython and Python that could change. See :pr:`1080`.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/gevent\n  - Changelog: https://pyup.io/changelogs/gevent/\n  - Homepage: http://www.gevent.org/\n</details>\n\n\n\n\n\n### Update [gunicorn](https://pypi.org/project/gunicorn) from **19.7.1** to **19.9.0**.\n\n\n*The bot wasn't able to find a changelog for this release. [Got an idea?](https://github.com/pyupio/changelogs/issues/new)*\n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/gunicorn\n  - Changelog: https://pyup.io/changelogs/gunicorn/\n  - Homepage: http://gunicorn.org\n</details>\n\n\n\n\n\n### Update [django-environ](https://pypi.org/project/django-environ) from **0.4.4** to **0.4.5**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 0.4.5\n   ```\n   --------------------------\nAdded\n+++++\n  - Support for Django 2.0\n  - Support for smart casting\n  - Support PostgreSQL unix domain socket paths\n  - Tip: Multiple env files\n\nChanged\n+++++++\n  - Fix parsing option values None, True and False\n  - Order of importance of engine configuration in db_url_config\n\nRemoved\n+++++++\n  - Remove django and six dependencies\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/django-environ\n  - Changelog: https://pyup.io/changelogs/django-environ/\n  - Repo: https://github.com/joke2k/django-environ\n</details>\n\n\n\n\n\n### Update [whitenoise](https://pypi.org/project/whitenoise) from **3.3.1** to **4.1.3**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 4.1.3\n   ```\n   ------\n\n * Fix handling of zero-valued mtimes which can occur when running on some\n   filesystems (thanks `twosigmajab &lt;https://github.com/twosigmajab&gt;`_ for\n   reporting).\n * Fix potential path traversal attack while running in autorefresh mode on\n   Windows (thanks `phith0n &lt;https://github.com/phith0n&gt;`_ for reporting).\n   This is a good time to reiterate that autofresh mode is never intended for\n   production use.\n   ```\n   \n  \n  \n   ### 4.1.2\n   ```\n   ------\n\n * Add correct MIME type for WebAssembly, which is required for files to be\n   executed (thanks `mdboom &lt;https://github.com/mdboom&gt;`_ ).\n * Stop accessing the FILE_CHARSET Django setting which was almost entirely\n   unused and is now deprecated (thanks `timgraham\n   &lt;https://github.com/timgraham&gt;`_).\n   ```\n   \n  \n  \n   ### 4.1.1\n   ```\n   ------\n\n * Fix `bug &lt;https://github.com/evansd/whitenoise/issues/202&gt;`_ in ETag\n   handling (thanks `edmorley &lt;https://github.com/edmorley&gt;`_).\n * Documentation fixes (thanks `jamesbeith &lt;https://github.com/jamesbeith&gt;`_\n   and `mathieusteele &lt;https://github.com/mathieusteele&gt;`_).\n   ```\n   \n  \n  \n   ### 4.1\n   ```\n   ----\n\n * Silenced spurious warning about missing directories when in development (i.e\n   &quot;autorefresh&quot;) mode.\n * Support supplying paths as `Pathlib\n   &lt;https://docs.python.org/3.4/library/pathlib.html&gt;`_ instances, rather than\n   just strings (thanks `browniebroke &lt;https://github.com/browniebroke&gt;`_).\n * Add a new :ref:`CompressedStaticFilesStorage &lt;compression-and-caching&gt;`\n   backend to support applying compression without applying Django&#39;s hash-versioning\n   process.\n * Documentation improvements.\n   ```\n   \n  \n  \n   ### 4.0\n   ```\n   ----\n\n.. note:: **Breaking changes**\n          The latest version of WhiteNoise removes some options which were\n          deprecated in the previous major release:\n\n    * The WSGI integration option for Django\n      (which involved editing ``wsgi.py``) has been removed. Instead, you\n      should add WhiteNoise to your\n      middleware list in ``settings.py`` and remove any reference to WhiteNoise from\n      ``wsgi.py``.\n      See the :ref:`documentation &lt;django-middleware&gt;` for more details. |br|\n      (The :doc:`pure WSGI &lt;base&gt;` integration is still available for non-Django apps.)\n\n    * The ``whitenoise.django.GzipManifestStaticFilesStorage`` alias has now\n      been removed. Instead you should use the correct import path:\n      ``whitenoise.storage.CompressedManifestStaticFilesStorage``.\n\n    If you are not using either of these integration options you should have\n    no issues upgrading to the latest version.\n\nRemoved Python 3.3 Support\n++++++++++++++++++++++++++\n\nRemoved support for Python 3.3 since it&#39;s end of life was in September 2017.\n\n\nIndex file support\n++++++++++++++++++\n\nWhiteNoise now supports serving :ref:`index files &lt;index-files-django&gt;` for\ndirectories (e.g. serving ``/example/index.html`` at ``/example/``). It also\ncreates redirects so that visiting the index file directly, or visiting the URL\nwithout a trailing slash will redirect to the correct URL.\n\n\nRange header support (&quot;byte serving&quot;)\n+++++++++++++++++++++++++++++++++++++\n\nWhiteNoise now respects the HTTP Range header which allows a client to request\nonly part of a file. The main use for this is in serving video files to iOS\ndevices as Safari refuses to play videos unless the server supports the\nRange header.\n\n\nETag support\n++++++++++++\n\nWhiteNoise now adds ETag headers to files using the same algorithm used by\nnginx. This gives slightly better caching behaviour than relying purely on Last\nModified dates (although not as good as creating immutable files using\nsomething like ``ManifestStaticFilesStorage``, which is still the best option\nif you can use it).\n\nIf you need to generate your own ETags headers for any reason you can define a\ncustom :any:`add_headers_function &lt;WHITENOISE_ADD_HEADERS_FUNCTION&gt;`.\n\n\nRemove requirement to run collectstatic\n+++++++++++++++++++++++++++++++++++++++\n\nBy setting :any:`WHITENOISE_USE_FINDERS` to ``True`` files will be served\ndirectly from their original locations (usually in ``STATICFILES_DIRS`` or app\n``static`` subdirectories) without needing to be collected into ``STATIC_ROOT``\nby the collectstatic command. This was\nalways the default behaviour when in ``DEBUG`` mode but previously it wasn&#39;t\npossible to enable this behaviour in production. For small apps which aren&#39;t\nusing the caching and compression features of the more advanced storage\nbackends this simplifies the deployment process by removing the need to run\ncollectstatic as part of the build step -- in fact, it&#39;s now possible not to\nhave any build step at all.\n\n\nCustomisable immutable files test\n+++++++++++++++++++++++++++++++++\n\nWhiteNoise ships with code which detects when you are using Django&#39;s\nManifestStaticFilesStorage backend and sends optimal caching headers for files\nwhich are guaranteed not to change. If you are using a different system for\ngenerating cacheable files then you might need to supply your own function for\ndetecting such files. Previously this required subclassing WhiteNoise, but now\nyou can use the :any:`WHITENOISE_IMMUTABLE_FILE_TEST` setting.\n\n\nFix runserver_nostatic to work with Channels\n++++++++++++++++++++++++++++++++++++++++++++\n\nThe old implementation of :ref:`runserver_nostatic &lt;runserver-nostatic&gt;` (which\ndisables Django&#39;s default static file handling in development) did not work\nwith `Channels`_, which needs its own runserver implementation. The\nrunserver_nostatic command has now been rewritten so that it should work with\nChannels and with any other app which provides its own runserver.\n\n.. _Channels: https://channels.readthedocs.io/\n\n\nReduced storage requirements for static files\n+++++++++++++++++++++++++++++++++++++++++++++\n\nThe new :any:`WHITENOISE_KEEP_ONLY_HASHED_FILES` setting reduces the number of\nfiles in STATIC_ROOT by half by storing files only under their hashed names\n(e.g.  ``app.db8f2edc0c8a.js``), rather than also keeping a copy with the\noriginal name (e.g. ``app.js``).\n\n\n\nImproved start up performance\n+++++++++++++++++++++++++++++\n\nWhen in production mode (i.e. when :any:`autorefresh &lt;WHITENOISE_AUTOREFRESH&gt;`\nis disabled), WhiteNoise scans all static files when the application starts in\norder to be able to serve them as efficiently and securely as possible. For\nmost applications this makes no noticeable difference to start up time, however\nfor applications with very large numbers of static files this process can take\nsome time. In WhiteNoise 4.0 the file scanning code has been rewritten to do\nthe minimum possible amount of filesystem access which should make the start up\nprocess considerably faster.\n\n\nWindows Testing\n+++++++++++++++\n\nWhiteNoise has always aimed to support Windows as well as \\*NIX platforms but\nwe are now able to run the test suite against Windows as part of the CI process\nwhich should ensure that we can maintain Windows compatibility in future.\n\n\nModification times for compressed files\n+++++++++++++++++++++++++++++++++++++++\n\nThe compressed storage backend (which generates Gzip and Brotli compressed\nfiles) now ensures that compressed files have the same modification time as the\noriginals.  This only makes a difference if you are using the compression\nbackend with something other than WhiteNoise to actually serve the files, which\nvery few users do.\n\nReplaced brotlipy with official Brotli Python Package\n+++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nSince the official `Brotli project &lt;https://github.com/google/brotli&gt;`_ offers\na `Brotli Python package &lt;https://pypi.org/project/Brotli/&gt;`_ brotlipy has been\nreplaced with Brotli.\n\nFurthermore a ``brotli`` key has been added to ``extras_require`` which allows\ninstalling WhiteNoise and Brotli together like this:\n\n.. code-block:: bash\n\n    pip install whitenoise[brotli]\n\n\n---------------------------\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/whitenoise\n  - Changelog: https://pyup.io/changelogs/whitenoise/\n  - Homepage: http://whitenoise.evans.io\n</details>\n\n\n\n\n\n### Update [django-anymail](https://pypi.org/project/django-anymail) from **1.4** to **6.1.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 6.1\n   ```\n   ----\n\n*2019-07-07*\n\nFeatures\n~~~~~~~~\n\n* **Mailgun:** Add new `MAILGUN_WEBHOOK_SIGNING_KEY` setting for verifying tracking and\n  inbound webhook calls. Mailgun&#39;s webhook signing key can become different from your\n  `MAILGUN_API_KEY` if you have ever rotated either key.\n  See `docs &lt;https://anymail.readthedocs.io/en/stable/esps/mailgun/std:setting-ANYMAIL_MAILGUN_WEBHOOK_SIGNING_KEY&gt;`__.\n  (More in `153`_. Thanks to `dominik-lekse`_ for reporting the problem and Mailgun&#39;s\n  `mbk-ok`_ for identifying the cause.)\n   ```\n   \n  \n  \n   ### 6.0.1\n   ```\n   ------\n\n*2019-05-19*\n\nFixes\n~~~~~\n\n* Support using `AnymailMessage` with django-mailer and similar packages that pickle\n  messages. (See `147`_. Thanks to `ewingrj`_ for identifying the problem.)\n\n* Fix UnicodeEncodeError error while reporting invalid email address on Python 2.7.\n  (See `148`_. Thanks to `fdemmer`_ for reporting the problem.)\n   ```\n   \n  \n  \n   ### 6.0\n   ```\n   ----\n\n*2019-02-23*\n\nBreaking changes\n~~~~~~~~~~~~~~~~\n\n* **Postmark:** Anymail&#39;s `message.anymail_status.recipients[email]` no longer\n  lowercases the recipient&#39;s email address. For consistency with other ESPs, it now\n  uses the recipient email with whatever case was used in the sent message. If your\n  code is doing something like `message.anymail_status.recipients[email.lower()]`,\n  you should remove the `.lower()`\n\n* **SendGrid:** In batch sends, Anymail&#39;s SendGrid backend now assigns a separate\n  `message_id` for each &quot;to&quot; recipient, rather than sharing a single id for all\n  recipients. This improves accuracy of tracking and statistics (and matches the\n  behavior of many other ESPs).\n\n  If your code uses batch sending (merge_data with multiple to-addresses) and checks\n  `message.anymail_status.message_id` after sending, that value will now be a *set* of\n  ids. You can obtain each recipient&#39;s individual message_id with\n  `message.anymail_status.recipients[to_email].message_id`.\n  See `docs &lt;https://anymail.readthedocs.io/en/stable/esps/sendgrid/sendgrid-message-id&gt;`__.\n\nFeatures\n~~~~~~~~\n\n* Add new `merge_metadata` option for providing per-recipient metadata in batch\n  sends. Available for all supported ESPs *except* Amazon SES and SendinBlue.\n  See `docs &lt;https://anymail.readthedocs.io/en/stable/sending/anymail_additions/anymail.message.AnymailMessage.merge_metadata&gt;`__.\n  (Thanks `janneThoft`_ for the idea and SendGrid implementation.)\n\n* **Mailjet:** Remove limitation on using `cc` or `bcc` together with `merge_data`.\n\n\nFixes\n~~~~~\n\n* **Mailgun:** Better error message for invalid sender domains (that caused a cryptic\n  &quot;Mailgun API response 200: OK Mailgun Magnificent API&quot; error in earlier releases).\n\n* **Postmark:** Don&#39;t error if a message is sent with only Cc and/or Bcc recipients\n  (but no To addresses). Also, `message.anymail_status.recipients[email]` now includes\n  send status for Cc and Bcc recipients. (Thanks to `ailionx`_ for reporting the error.)\n\n* **SendGrid:** With legacy templates, stop (ab)using &quot;sections&quot; for merge_global_data.\n  This avoids potential conflicts with a template&#39;s own use of SendGrid section tags.\n   ```\n   \n  \n  \n   ### 5.0\n   ```\n   ----\n\n*2018-11-07*\n\nBreaking changes\n~~~~~~~~~~~~~~~~\n\n* **Mailgun:** Anymail&#39;s status tracking webhooks now report Mailgun &quot;temporary failure&quot;\n  events as Anymail&#39;s normalized &quot;deferred&quot; `event_type`. (Previously they were reported\n  as &quot;bounced&quot;, lumping them in with permanent failures.) The new behavior is consistent\n  with how Anymail handles other ESP&#39;s tracking notifications. In the unlikely case your\n  code depended on &quot;temporary failure&quot; showing up as &quot;bounced&quot; you will need to update it.\n  (Thanks `costela`_.)\n\nFeatures\n~~~~~~~~\n\n* **Postmark:** Allow either template alias (string) or numeric template id for\n  Anymail&#39;s `template_id` when sending with Postmark templates.\n\nFixes\n~~~~~\n\n* **Mailgun:** Improve error reporting when an inbound route is accidentally pointed\n  at Anymail&#39;s tracking webhook url or vice versa.\n   ```\n   \n  \n  \n   ### 4.3\n   ```\n   ----\n\n*2018-10-11*\n\nFeatures\n~~~~~~~~\n\n*  Treat MIME attachments that have a *Content-ID* but no explicit *Content-Disposition*\n   header as inline, matching the behavior of many email clients. For maximum\n   compatibility, you should always set both (or use Anymail&#39;s inline helper functions).\n   (Thanks `costela`_.)\n\nFixes\n~~~~~\n\n*  **Mailgun:** Raise `AnymailUnsupportedFeature` error when attempting to send an\n   attachment without a filename (or inline attachment without a *Content-ID*), because\n   Mailgun silently drops these attachments from the sent message. (See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/esps/mailgun/limitations-and-quirks&gt;`__.\n   Thanks `costela`_ for identifying this undocumented Mailgun API limitation.)\n*  **Mailgun:** Fix problem where attachments with non-ASCII filenames would be lost.\n   (Works around Requests/urllib3 issue encoding multipart/form-data filenames in a way\n   that isn&#39;t RFC 7578 compliant. Thanks to `decibyte`_ for catching the problem.)\n\nOther\n~~~~~\n*  Add (undocumented) DEBUG_API_REQUESTS Anymail setting. When enabled, prints raw\n   API request and response during send. Currently implemented only for Requests-based\n   backends (all but Amazon SES and SparkPost). Because this can expose API keys and\n   other sensitive info in log files, it should not be used in production.\n   ```\n   \n  \n  \n   ### 4.2\n   ```\n   ----\n\n*2018-09-07*\n\nFeatures\n~~~~~~~~\n\n*  **Postmark:** Support per-recipient template `merge_data` and batch sending. (Batch\n   sending can be used with or without a template. See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/esps/postmark/postmark-templates&gt;`__.)\n\nFixes\n~~~~~\n\n*  **Postmark:** When using `template_id`, ignore empty subject and body. (Postmark\n   issues an error if Django&#39;s default empty strings are used with template sends.)\n   ```\n   \n  \n  \n   ### 4.1\n   ```\n   ----\n\n*2018-08-27*\n\nFeatures\n~~~~~~~~\n\n*  **SendGrid:** Support both new &quot;dynamic&quot; and original &quot;legacy&quot; transactional\n   templates. (See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/esps/sendgrid/sendgrid-templates&gt;`__.)\n*  **SendGrid:** Allow merging `esp_extra[&quot;personalizations&quot;]` dict into other message-derived\n   personalizations. (See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/esps/sendgrid/sendgrid-esp-extra&gt;`__.)\n   ```\n   \n  \n  \n   ### 4.0\n   ```\n   ----\n\n*2018-08-19*\n\nBreaking changes\n~~~~~~~~~~~~~~~~\n\n*  Drop support for Django versions older than Django 1.11.\n   (For compatibility back to Django 1.8, stay on the Anymail `v3.0`_\n   extended support branch.)\n*  **SendGrid:** Remove the legacy SendGrid *v2* EmailBackend.\n   (Anymail&#39;s default since v0.8 has been SendGrid&#39;s newer v3 API.)\n   If your settings.py `EMAIL_BACKEND` still references &quot;sendgrid_v2,&quot; you must\n   `upgrade to v3 &lt;https://anymail.readthedocs.io/en/v3.0/esps/sendgrid/upgrading-to-sendgrid-s-v3-api&gt;`__.\n\nFeatures\n~~~~~~~~\n\n*  **Mailgun:** Add support for new Mailgun webhooks. (Mailgun&#39;s original &quot;legacy\n   webhook&quot; format is also still supported. See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/esps/mailgun/mailgun-webhooks&gt;`__.)\n*  **Mailgun:** Document how to use new European region. (This works in earlier\n   Anymail versions, too.)\n*  **Postmark:** Add support for Anymail&#39;s normalized `metadata` in sending\n   and webhooks.\n\nFixes\n~~~~~\n\n*  Avoid problems with Gmail blocking messages that have inline attachments, when sent\n   from a machine whose local hostname ends in *.com*. Change Anymail&#39;s\n   `attach_inline_image()` default *Content-ID* domain to the literal text &quot;inline&quot;\n   (rather than Python&#39;s default of the local hostname), to work around a limitation\n   of some ESP APIs that don&#39;t permit distinct content ID and attachment filenames\n   (Mailgun, Mailjet, Mandrill and SparkPost). See `112`_ for more details.\n*  **Amazon SES:** Work around an\n   `Amazon SES bug &lt;https://forums.aws.amazon.com/thread.jspa?threadID=287048&gt;`__\n   that can corrupt non-ASCII message bodies if you are using SES&#39;s open or click\n   tracking. (See `115`_ for more details. Thanks to `varche1`_ for isolating\n   the specific conditions that trigger the bug.)\n\nOther\n~~~~~\n\n*  Maintain changelog in the repository itself (rather than in GitHub release notes).\n*  Test against released versions of Python 3.7 and Django 2.1.\n   ```\n   \n  \n  \n   ### 3.0\n   ```\n   ----\n\n*2018-05-30*\n\nThis is an extended support release. Anymail v3.x will receive security updates\nand fixes for any breaking ESP API changes through at least April, 2019.\n\nBreaking changes\n~~~~~~~~~~~~~~~~\n\n*  Drop support for Python 3.3 (see `99`_).\n*  **SendGrid:** Fix a problem where Anymail&#39;s status tracking webhooks didn&#39;t always\n   receive the same `event.message_id` as the sent `message.anymail_status.message_id`,\n   due to unpredictable behavior by SendGrid&#39;s API. Anymail now generates a UUID for\n   each sent message and attaches it as a SendGrid custom arg named anymail_id. For most\n   users, this change should be transparent. But it could be a breaking change if you\n   are relying on a specific message_id format, or relying on message_id matching the\n   *Message-ID* mail header or SendGrid&#39;s &quot;smtp-id&quot; event field. (More details in the\n   `docs &lt;https://anymail.readthedocs.io/en/stable/esps/sendgrid/sendgrid-message-id&gt;`__;\n   also see `108`_.) Thanks to `joshkersey`_ for the report and the fix.\n\nFeatures\n~~~~~~~~\n\n*  Support Django 2.1 prerelease.\n\nFixes\n~~~~~\n\n*  **Mailjet:** Fix tracking webhooks to work correctly when Mailjet &quot;group events&quot;\n   option is disabled (see `106`_).\n\nDeprecations\n~~~~~~~~~~~~\n\n*  This will be the last Anymail release to support Django 1.8, 1.9, and 1.10\n   (see `110`_).\n*  This will be the last Anymail release to support the legacy SendGrid v2 EmailBackend\n   (see `111`_). (SendGrid&#39;s newer v3 API has been the default since Anymail v0.8.)\n\nIf these deprecations affect you and you cannot upgrade, set your requirements to\n`django-anymail~=3.0` (a &quot;compatible release&quot; specifier, equivalent to `&gt;=3.0,==3.*`).\n   ```\n   \n  \n  \n   ### 2.2\n   ```\n   ----\n\n*2018-04-16*\n\nFixes\n~~~~~\n\n*  Fix a breaking change accidentally introduced in v2.1: The boto3 package is no\n   longer required if you aren&#39;t using Amazon SES.\n   ```\n   \n  \n  \n   ### 2.1\n   ```\n   ----\n\n*2018-04-11*\n\n**NOTE:** v2.1 accidentally introduced a **breaking change:** enabling Anymail webhooks\nwith `include(&#39;anymail.urls&#39;)` causes an error if boto3 is not installed, even if you\naren&#39;t using Amazon SES. This is fixed in v2.2.\n\nFeatures\n~~~~~~~~\n\n*  **Amazon SES:** Add support for this ESP\n   (`docs &lt;https://anymail.readthedocs.io/en/stable/esps/amazon_ses/&gt;`__).\n*  **SparkPost:** Add SPARKPOST_API_URL setting to support SparkPost EU and SparkPost\n   Enterprise\n   (`docs &lt;https://anymail.readthedocs.io/en/stable/esps/sparkpost/std:setting-ANYMAIL_SPARKPOST_API_URL&gt;`__).\n*  **Postmark:** Update for Postmark &quot;modular webhooks.&quot; This should not impact client\n   code. (Also, older versions of Anymail will still work correctly with Postmark&#39;s\n   webhook changes.)\n\nFixes\n~~~~~\n\n*  **Inbound:** Fix several issues with inbound messages, particularly around non-ASCII\n   headers and body content. Add workarounds for some limitations in older Python email\n   packages.\n\nOther\n~~~~~\n\n*  Use tox to manage Anymail test environments (see contributor\n   `docs &lt;https://anymail.readthedocs.io/en/stable/contributing/testing&gt;`__).\n\nDeprecations\n~~~~~~~~~~~~\n\n*  This will be the last Anymail release to support Python 3.3. See `99`_ for more\n   information.\n   ```\n   \n  \n  \n   ### 2.0\n   ```\n   ----\n\n*2018-03-08*\n\nBreaking changes\n~~~~~~~~~~~~~~~~\n\n*  Drop support for deprecated WEBHOOK_AUTHORIZATION setting. If you are using webhooks\n   and still have this Anymail setting, you must rename it to WEBHOOK_SECRET. See the\n   `v1.4`_ release notes.\n*  Handle *Reply-To,* *From,* and *To* in EmailMessage `extra_headers` the same as\n   Django&#39;s SMTP EmailBackend if supported by your ESP, otherwise raise an unsupported\n   feature error. Fixes the SparkPost backend to be consistent with other backends if\n   both `headers[&quot;Reply-To&quot;]` and `reply_to` are set on the same message. If you are\n   setting a message&#39;s `headers[&quot;From&quot;]` or `headers[&quot;To&quot;]` (neither is common), the\n   new behavior is likely a breaking change. See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/sending/django_email/additional-headers&gt;`__\n   and `91`_.\n*  Treat EmailMessage `extra_headers` keys as case-\\ *insensitive* in all backends, for\n   consistency with each other (and email specs). If you are specifying duplicate\n   headers whose names differ only in case, this may be a breaking change. See\n   `docs &lt;https://anymail.readthedocs.io/en/stable/sending/django_email/additional-headers&gt;`__.\n\nFeatures\n~~~~~~~~\n\n*  **SendinBlue:** Add support for this ESP\n   (`docs &lt;https://anymail.readthedocs.io/en/stable/esps/sendinblue/&gt;`__).\n   Thanks to `RignonNoel`_ for the implementation.\n*  Add EmailMessage `envelope_sender` attribute, which can adjust the message&#39;s\n   *Return-Path* if supported by your ESP\n   (`docs &lt;https://anymail.readthedocs.io/en/stable/sending/anymail_additions/anymail.message.AnymailMessage.envelope_sender&gt;`__).\n*  Add universal wheel to PyPI releases for faster installation.\n\nOther\n~~~~~\n\n*  Update setup.py metadata, clean up implementation. (Hadn&#39;t really been touched\n   since original Djrill version.)\n*  Prep for Python 3.7.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/django-anymail\n  - Changelog: https://pyup.io/changelogs/django-anymail/\n  - Repo: https://github.com/anymail/django-anymail\n</details>\n\n\n\n\n\n### Update [wheel](https://pypi.org/project/wheel) from **0.30.0** to **0.33.4**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 0.33.4\n   ```\n   - Reverted PR 289 (adding directory entries to the wheel file) due to\n  incompatibility with ``distlib.wheel``\n   ```\n   \n  \n  \n   ### 0.33.3\n   ```\n   - Fixed wheel build failures on some systems due to all attributes being\n  preserved (PR by Matt Wozniski)\n   ```\n   \n  \n  \n   ### 0.33.2\n   ```\n   - Fixed empty directories missing from the wheel (PR by Jason R. Coombs)\n   ```\n   \n  \n  \n   ### 0.33.1\n   ```\n   - Fixed the ``--build-number`` option for ``wheel pack`` not being applied\n   ```\n   \n  \n  \n   ### 0.33.0\n   ```\n   - Added the ``--build-number`` option to the ``wheel pack`` command\n- Fixed bad shebangs sneaking into wheels\n- Fixed documentation issue with ``wheel pack`` erroneously being called\n  ``wheel repack``\n- Fixed filenames with &quot;bad&quot; characters (like commas) not being quoted in\n  ``RECORD`` (PR by Paul Moore)\n- Sort requirements extras to ensure deterministic builds\n  (PR by PoncinMatthieu)\n- Forced ``inplace = False`` when building a C extension for the wheel\n   ```\n   \n  \n  \n   ### 0.32.3\n   ```\n   - Fixed compatibility with Python 2.7.0 – 2.7.3\n- Fixed handling of direct URL requirements with markers (PR by Benoit Pierre)\n   ```\n   \n  \n  \n   ### 0.32.2\n   ```\n   - Fixed build number appearing in the ``.dist-info`` directory name\n- Made wheel file name parsing more permissive\n- Fixed wrong Python tag in wheels converted from eggs\n  (PR by John T. Wodder II)\n   ```\n   \n  \n  \n   ### 0.32.1\n   ```\n   - Fixed ``AttributeError: &#39;Requirement&#39; object has no attribute &#39;url&#39;`` on\n  setuptools/pkg_resources versions older than 18.8 (PR by Benoit Pierre)\n- Fixed ``AttributeError: &#39;module&#39; object has no attribute\n  &#39;algorithms_available&#39;`` on Python &lt; 2.7.9 (PR by Benoit Pierre)\n- Fixed permissions on the generated ``.dist-info/RECORD`` file\n   ```\n   \n  \n  \n   ### 0.32.0\n   ```\n   - Removed wheel signing and verifying features\n- Removed the &quot;wheel install&quot; and &quot;wheel installscrip","created_at":"2019-08-05T14:54:06Z","updated_at":"2019-08-12T14:53:12Z","closed_at":"2019-08-12T14:53:12Z","merged_at":null,"merge_commit_sha":"db9f74229c8505bb4a83a2a7d51354ba6379c00d","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/drummonds/bene/pulls/148/commits","review_comments_url":"https://api.github.com/repos/drummonds/bene/pulls/148/comments","review_comment_url":"https://api.github.com/repos/drummonds/bene/pulls/comments{/number}","comments_url":"https://api.github.com/repos/drummonds/bene/issues/148/comments","statuses_url":"https://api.github.com/repos/drummonds/bene/statuses/561e6a5c436fcc256db1a0949f9d830dd0ae21f4","head":{"label":"drummonds:pyup-scheduled-update-2019-08-05","ref":"pyup-scheduled-update-2019-08-05","sha":"561e6a5c436fcc256db1a0949f9d830dd0ae21f4","user":{"login":"drummonds","id":3843291,"node_id":"MDQ6VXNlcjM4NDMyOTE=","avatar_url":"https://avatars0.githubusercontent.com/u/3843291?v=4","gravatar_id":"","url":"https://api.github.com/users/drummonds","html_url":"https://github.com/drummonds","followers_url":"https://api.github.com/users/drummonds/followers","following_url":"https://api.github.com/users/drummonds/following{/other_user}","gists_url":"https://api.github.com/users/drummonds/gists{/gist_id}","starred_url":"https://api.github.com/users/drummonds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drummonds/subscriptions","organizations_url":"https://api.github.com/users/drummonds/orgs","repos_url":"https://api.github.com/users/drummonds/repos","events_url":"https://api.github.com/users/drummonds/events{/privacy}","received_events_url":"https://api.github.com/users/drummonds/received_events","type":"User","site_admin":false},"repo":{"id":94203801,"node_id":"MDEwOlJlcG9zaXRvcnk5NDIwMzgwMQ==","name":"bene","full_name":"drummonds/bene","private":false,"owner":{"login":"drummonds","id":3843291,"node_id":"MDQ6VXNlcjM4NDMyOTE=","avatar_url":"https://avatars0.githubusercontent.com/u/3843291?v=4","gravatar_id":"","url":"https://api.github.com/users/drummonds","html_url":"https://github.com/drummonds","followers_url":"https://api.github.com/users/drummonds/followers","following_url":"https://api.github.com/users/drummonds/following{/other_user}","gists_url":"https://api.github.com/users/drummonds/gists{/gist_id}","starred_url":"https://api.github.com/users/drummonds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drummonds/subscriptions","organizations_url":"https://api.github.com/users/drummonds/orgs","repos_url":"https://api.github.com/users/drummonds/repos","events_url":"https://api.github.com/users/drummonds/events{/privacy}","received_events_url":"https://api.github.com/users/drummonds/received_events","type":"User","site_admin":false},"html_url":"https://github.com/drummonds/bene","description":null,"fork":false,"url":"https://api.github.com/repos/drummonds/bene","forks_url":"https://api.github.com/repos/drummonds/bene/forks","keys_url":"https://api.github.com/repos/drummonds/bene/keys{/key_id}","collaborators_url":"https://api.github.com/repos/drummonds/bene/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/drummonds/bene/teams","hooks_url":"https://api.github.com/repos/drummonds/bene/hooks","issue_events_url":"https://api.github.com/repos/drummonds/bene/issues/events{/number}","events_url":"https://api.github.com/repos/drummonds/bene/events","assignees_url":"https://api.github.com/repos/drummonds/bene/assignees{/user}","branches_url":"https://api.github.com/repos/drummonds/bene/branches{/branch}","tags_url":"https://api.github.com/repos/drummonds/bene/tags","blobs_url":"https://api.github.com/repos/drummonds/bene/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/drummonds/bene/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/drummonds/bene/git/refs{/sha}","trees_url":"https://api.github.com/repos/drummonds/bene/git/trees{/sha}","statuses_url":"https://api.github.com/repos/drummonds/bene/statuses/{sha}","languages_url":"https://api.github.com/repos/drummonds/bene/languages","stargazers_url":"https://api.github.com/repos/drummonds/bene/stargazers","contributors_url":"https://api.github.com/repos/drummonds/bene/contributors","subscribers_url":"https://api.github.com/repos/drummonds/bene/subscribers","subscription_url":"https://api.github.com/repos/drummonds/bene/subscription","commits_url":"https://api.github.com/repos/drummonds/bene/commits{/sha}","git_commits_url":"https://api.github.com/repos/drummonds/bene/git/commits{/sha}","comments_url":"https://api.github.com/repos/drummonds/bene/comments{/number}","issue_comment_url":"https://api.github.com/repos/drummonds/bene/issues/comments{/number}","contents_url":"https://api.github.com/repos/drummonds/bene/contents/{+path}","compare_url":"https://api.github.com/repos/drummonds/bene/compare/{base}...{head}","merges_url":"https://api.github.com/repos/drummonds/bene/merges","archive_url":"https://api.github.com/repos/drummonds/bene/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/drummonds/bene/downloads","issues_url":"https://api.github.com/repos/drummonds/bene/issues{/number}","pulls_url":"https://api.github.com/repos/drummonds/bene/pulls{/number}","milestones_url":"https://api.github.com/repos/drummonds/bene/milestones{/number}","notifications_url":"https://api.github.com/repos/drummonds/bene/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/drummonds/bene/labels{/name}","releases_url":"https://api.github.com/repos/drummonds/bene/releases{/id}","deployments_url":"https://api.github.com/repos/drummonds/bene/deployments","created_at":"2017-06-13T11:04:35Z","updated_at":"2019-06-05T09:17:38Z","pushed_at":"2019-08-12T14:53:07Z","git_url":"git://github.com/drummonds/bene.git","ssh_url":"git@github.com:drummonds/bene.git","clone_url":"https://github.com/drummonds/bene.git","svn_url":"https://github.com/drummonds/bene","homepage":null,"size":2183,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":1,"watchers":1,"default_branch":"test"}},"base":{"label":"drummonds:test","ref":"test","sha":"fc51352048a1560e1e9906a8ad29b9743c215a41","user":{"login":"drummonds","id":3843291,"node_id":"MDQ6VXNlcjM4NDMyOTE=","avatar_url":"https://avatars0.githubusercontent.com/u/3843291?v=4","gravatar_id":"","url":"https://api.github.com/users/drummonds","html_url":"https://github.com/drummonds","followers_url":"https://api.github.com/users/drummonds/followers","following_url":"https://api.github.com/users/drummonds/following{/other_user}","gists_url":"https://api.github.com/users/drummonds/gists{/gist_id}","starred_url":"https://api.github.com/users/drummonds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drummonds/subscriptions","organizations_url":"https://api.github.com/users/drummonds/orgs","repos_url":"https://api.github.com/users/drummonds/repos","events_url":"https://api.github.com/users/drummonds/events{/privacy}","received_events_url":"https://api.github.com/users/drummonds/received_events","type":"User","site_admin":false},"repo":{"id":94203801,"node_id":"MDEwOlJlcG9zaXRvcnk5NDIwMzgwMQ==","name":"bene","full_name":"drummonds/bene","private":false,"owner":{"login":"drummonds","id":3843291,"node_id":"MDQ6VXNlcjM4NDMyOTE=","avatar_url":"https://avatars0.githubusercontent.com/u/3843291?v=4","gravatar_id":"","url":"https://api.github.com/users/drummonds","html_url":"https://github.com/drummonds","followers_url":"https://api.github.com/users/drummonds/followers","following_url":"https://api.github.com/users/drummonds/following{/other_user}","gists_url":"https://api.github.com/users/drummonds/gists{/gist_id}","starred_url":"https://api.github.com/users/drummonds/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drummonds/subscriptions","organizations_url":"https://api.github.com/users/drummonds/orgs","repos_url":"https://api.github.com/users/drummonds/repos","events_url":"https://api.github.com/users/drummonds/events{/privacy}","received_events_url":"https://api.github.com/users/drummonds/received_events","type":"User","site_admin":false},"html_url":"https://github.com/drummonds/bene","description":null,"fork":false,"url":"https://api.github.com/repos/drummonds/bene","forks_url":"https://api.github.com/repos/drummonds/bene/forks","keys_url":"https://api.github.com/repos/drummonds/bene/keys{/key_id}","collaborators_url":"https://api.github.com/repos/drummonds/bene/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/drummonds/bene/teams","hooks_url":"https://api.github.com/repos/drummonds/bene/hooks","issue_events_url":"https://api.github.com/repos/drummonds/bene/issues/events{/number}","events_url":"https://api.github.com/repos/drummonds/bene/events","assignees_url":"https://api.github.com/repos/drummonds/bene/assignees{/user}","branches_url":"https://api.github.com/repos/drummonds/bene/branches{/branch}","tags_url":"https://api.github.com/repos/drummonds/bene/tags","blobs_url":"https://api.github.com/repos/drummonds/bene/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/drummonds/bene/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/drummonds/bene/git/refs{/sha}","trees_url":"https://api.github.com/repos/drummonds/bene/git/trees{/sha}","statuses_url":"https://api.github.com/repos/drummonds/bene/statuses/{sha}","languages_url":"https://api.github.com/repos/drummonds/bene/languages","stargazers_url":"https://api.github.com/repos/drummonds/bene/stargazers","contributors_url":"https://api.github.com/repos/drummonds/bene/contributors","subscribers_url":"https://api.github.com/repos/drummonds/bene/subscribers","subscription_url":"https://api.github.com/repos/drummonds/bene/subscription","commits_url":"https://api.github.com/repos/drummonds/bene/commits{/sha}","git_commits_url":"https://api.github.com/repos/drummonds/bene/git/commits{/sha}","comments_url":"https://api.github.com/repos/drummonds/bene/comments{/number}","issue_comment_url":"https://api.github.com/repos/drummonds/bene/issues/comments{/number}","contents_url":"https://api.github.com/repos/drummonds/bene/contents/{+path}","compare_url":"https://api.github.com/repos/drummonds/bene/compare/{base}...{head}","merges_url":"https://api.github.com/repos/drummonds/bene/merges","archive_url":"https://api.github.com/repos/drummonds/bene/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/drummonds/bene/downloads","issues_url":"https://api.github.com/repos/drummonds/bene/issues{/number}","pulls_url":"https://api.github.com/repos/drummonds/bene/pulls{/number}","milestones_url":"https://api.github.com/repos/drummonds/bene/milestones{/number}","notifications_url":"https://api.github.com/repos/drummonds/bene/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/drummonds/bene/labels{/name}","releases_url":"https://api.github.com/repos/drummonds/bene/releases{/id}","deployments_url":"https://api.github.com/repos/drummonds/bene/deployments","created_at":"2017-06-13T11:04:35Z","updated_at":"2019-06-05T09:17:38Z","pushed_at":"2019-08-12T14:53:07Z","git_url":"git://github.com/drummonds/bene.git","ssh_url":"git@github.com:drummonds/bene.git","clone_url":"https://github.com/drummonds/bene.git","svn_url":"https://github.com/drummonds/bene","homepage":null,"size":2183,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":1,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":1,"watchers":1,"default_branch":"test"}},"_links":{"self":{"href":"https://api.github.com/repos/drummonds/bene/pulls/148"},"html":{"href":"https://github.com/drummonds/bene/pull/148"},"issue":{"href":"https://api.github.com/repos/drummonds/bene/issues/148"},"comments":{"href":"https://api.github.com/repos/drummonds/bene/issues/148/comments"},"review_comments":{"href":"https://api.github.com/repos/drummonds/bene/pulls/148/comments"},"review_comment":{"href":"https://api.github.com/repos/drummonds/bene/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/drummonds/bene/pulls/148/commits"},"statuses":{"href":"https://api.github.com/repos/drummonds/bene/statuses/561e6a5c436fcc256db1a0949f9d830dd0ae21f4"}},"author_association":"COLLABORATOR","merged":false,"mergeable":true,"rebaseable":true,"mergeable_state":"unstable","merged_by":null,"comments":1,"review_comments":0,"maintainer_can_modify":false,"commits":51,"additions":51,"deletions":51,"changed_files":4}}
{"actor":{"display_login":"pyup-bot"}}