{"action":"opened","number":103,"pull_request":{"url":"https://api.github.com/repos/HackSoftware/Odin/pulls/103","id":187854192,"html_url":"https://github.com/HackSoftware/Odin/pull/103","diff_url":"https://github.com/HackSoftware/Odin/pull/103.diff","patch_url":"https://github.com/HackSoftware/Odin/pull/103.patch","issue_url":"https://api.github.com/repos/HackSoftware/Odin/issues/103","number":103,"state":"open","locked":false,"title":"Scheduled weekly dependency update for week 19","user":{"login":"pyup-bot","id":16239342,"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 [gevent](https://pypi.org/project/gevent) from **1.2.2** to **1.3.0**.\n\n\n<details>\n  <summary>Changelog</summary>\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.8.1**.\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 [raven](https://pypi.org/project/raven) from **6.6.0** to **6.8.0**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 6.8.0\n   ```\n   ------------------\n* [Core] Fixed DSNs without secrets not sending events.\n* [Core] Added lazy import for pkg_resources\n* [Core] Added NamedTuple Serializer\n* [Sanic] Fixed sanic integration dependencies\n* [Django] Fixed sql hook bug\n   ```\n   \n  \n  \n   ### 6.7.0\n   ```\n   ------------------\n* [Sanic] Added support for sanic.\n* [Core] Disabled dill logger by default\n* [Core] Added `SENTRY_NAME`, `SENTRY_ENVIRONMENT` and `SENTRY_RELEASE` \n         environment variables\n* [Core] DSN secret is now optional\n* [Core] Added fix for cases with exceptions in repr\n* [core] Fixed bug with mutating `record.data`\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/raven\n  - Changelog: https://pyup.io/changelogs/raven/\n  - Repo: https://github.com/getsentry/raven-python\n</details>\n\n\n\n\n\n### Update [boto3](https://pypi.org/project/boto3) from **1.7.4** to **1.7.19**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 1.7.19\n   ```\n   ======\n\n* api-change:``firehose``: [``botocore``] Update firehose client to latest version\n   ```\n   \n  \n  \n   ### 1.7.18\n   ```\n   ======\n\n* api-change:``gamelift``: [``botocore``] Update gamelift client to latest version\n   ```\n   \n  \n  \n   ### 1.7.17\n   ```\n   ======\n\n* api-change:``rds``: [``botocore``] Update rds client to latest version\n* api-change:``ec2``: [``botocore``] Update ec2 client to latest version\n* api-change:``budgets``: [``botocore``] Update budgets client to latest version\n   ```\n   \n  \n  \n   ### 1.7.16\n   ```\n   ======\n\n* api-change:``rds``: [``botocore``] Update rds client to latest version\n* api-change:``ec2``: [``botocore``] Update ec2 client to latest version\n   ```\n   \n  \n  \n   ### 1.7.15\n   ```\n   ======\n\n* api-change:``alexaforbusiness``: [``botocore``] Update alexaforbusiness client to latest version\n* api-change:``s3``: [``botocore``] Update s3 client to latest version\n* api-change:``budgets``: [``botocore``] Update budgets client to latest version\n* api-change:``es``: [``botocore``] Update es client to latest version\n   ```\n   \n  \n  \n   ### 1.7.14\n   ```\n   ======\n\n* api-change:``guardduty``: [``botocore``] Update guardduty client to latest version\n   ```\n   \n  \n  \n   ### 1.7.13\n   ```\n   ======\n\n* api-change:``config``: [``botocore``] Update config client to latest version\n* api-change:``secretsmanager``: [``botocore``] Update secretsmanager client to latest version\n* api-change:``appsync``: [``botocore``] Update appsync client to latest version\n   ```\n   \n  \n  \n   ### 1.7.12\n   ```\n   ======\n\n* api-change:``acm``: [``botocore``] Update acm client to latest version\n* api-change:``codepipeline``: [``botocore``] Update codepipeline client to latest version\n* api-change:``ssm``: [``botocore``] Update ssm client to latest version\n* api-change:``ec2``: [``botocore``] Update ec2 client to latest version\n   ```\n   \n  \n  \n   ### 1.7.11\n   ```\n   ======\n\n* api-change:``guardduty``: [``botocore``] Update guardduty client to latest version\n* api-change:``alexaforbusiness``: [``botocore``] Update alexaforbusiness client to latest version\n* api-change:``route53domains``: [``botocore``] Update route53domains client to latest version\n* api-change:``workspaces``: [``botocore``] Update workspaces client to latest version\n* api-change:``sagemaker``: [``botocore``] Update sagemaker client to latest version\n* api-change:``dynamodb``: [``botocore``] Update dynamodb client to latest version\n   ```\n   \n  \n  \n   ### 1.7.10\n   ```\n   ======\n\n* api-change:``glacier``: [``botocore``] Update glacier client to latest version\n* api-change:``secretsmanager``: [``botocore``] Update secretsmanager client to latest version\n   ```\n   \n  \n  \n   ### 1.7.9\n   ```\n   =====\n\n* api-change:``rekognition``: [``botocore``] Update rekognition client to latest version\n* api-change:``xray``: [``botocore``] Update xray client to latest version\n* api-change:``codedeploy``: [``botocore``] Update codedeploy client to latest version\n   ```\n   \n  \n  \n   ### 1.7.8\n   ```\n   =====\n\n* api-change:``secretsmanager``: [``botocore``] Update secretsmanager client to latest version\n* api-change:``elasticbeanstalk``: [``botocore``] Update elasticbeanstalk client to latest version\n   ```\n   \n  \n  \n   ### 1.7.7\n   ```\n   =====\n\n* api-change:``iotanalytics``: [``botocore``] Update iotanalytics client to latest version\n* api-change:``iot``: [``botocore``] Update iot client to latest version\n* api-change:``autoscaling-plans``: [``botocore``] Update autoscaling-plans client to latest version\n   ```\n   \n  \n  \n   ### 1.7.6\n   ```\n   =====\n\n* api-change:``medialive``: [``botocore``] Update medialive client to latest version\n* api-change:``firehose``: [``botocore``] Update firehose client to latest version\n   ```\n   \n  \n  \n   ### 1.7.5\n   ```\n   =====\n\n* api-change:``ce``: [``botocore``] Update ce client to latest version\n* api-change:``codepipeline``: [``botocore``] Update codepipeline client to latest version\n* api-change:``ssm``: [``botocore``] Update ssm client to latest version\n* api-change:``ec2``: [``botocore``] Update ec2 client to latest version\n* api-change:``secretsmanager``: [``botocore``] Update secretsmanager client to latest version\n* api-change:``rds``: [``botocore``] Update rds client to latest version\n* api-change:``devicefarm``: [``botocore``] Update devicefarm client to latest version\n* bugfix:dynamodb: Fixes a bug causing dynamodb operations with no output to throw errors.\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/boto3\n  - Changelog: https://pyup.io/changelogs/boto3/\n  - Repo: https://github.com/boto/boto3\n</details>\n\n\n\n\n\n### Update [wheel](https://pypi.org/project/wheel) from **0.31.0** to **0.31.1**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 0.31.1\n   ```\n   ======\n- Fixed arch as ``None`` when converting eggs to wheels\n   ```\n   \n  \n</details>\n\n\n \n\n<details>\n  <summary>Links</summary>\n  \n  - PyPI: https://pypi.org/project/wheel\n  - Changelog: https://pyup.io/changelogs/wheel/\n  - Repo: https://github.com/pypa/wheel\n</details>\n\n\n\n\n\n### Update [django](https://pypi.org/project/django) from **1.11.11** to **2.0.5**.\n\n\n<details>\n  <summary>Changelog</summary>\n  \n  \n   ### 2.0.5\n   ```\n   ==========================\n\n*May 1, 2018*\n\nDjango 2.0.5 fixes several bugs in 2.0.4.\n\nBugfixes\n========\n\n* Corrected the import paths that ``inspectdb`` generates for\n  ``django.contrib.postgres`` fields (:ticket:`29307`).\n\n* Fixed a regression in Django 1.11.8 where altering a field with a unique\n  constraint may drop and rebuild more foreign keys than necessary\n  (:ticket:`29193`).\n\n* Fixed crashes in ``django.contrib.admindocs`` when a view is a callable\n  object, such as ``django.contrib.syndication.views.Feed`` (:ticket:`29296`).\n\n* Fixed a regression in Django 1.11.12 where ``QuerySet.values()`` or\n  ``values_list()`` after combining an annotated and unannotated queryset with\n  ``union()``, ``difference()``, or ``intersection()`` crashed due to mismatching\n  columns (:ticket:`29286`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.0.4\n   ```\n   ==========================\n\n*April 2, 2018*\n\nDjango 2.0.4 fixes several bugs in 2.0.3.\n\nBugfixes\n========\n\n* Fixed a crash when filtering with an ``Exists()`` annotation of a queryset\n  containing a single field (:ticket:`29195`).\n\n* Fixed admin autocomplete widget&#39;s translations for `zh-hans` and `zh-hant`\n  languages (:ticket:`29213`).\n\n* Corrected admin&#39;s autocomplete widget to add a space after custom classes\n  (:ticket:`29221`).\n\n* Fixed ``PasswordResetConfirmView`` crash when using a user model with a\n  ``UUIDField`` primary key and the reset URL contains an encoded primary key\n  value that decodes to an invalid UUID (:ticket:`29206`).\n\n* Fixed a regression in Django 1.11.8 where combining two annotated\n  ``values_list()`` querysets with ``union()``, ``difference()``, or\n  ``intersection()`` crashed due to mismatching columns (:ticket:`29229`).\n\n* Fixed a regression in Django 1.11 where an empty choice could be initially\n  selected for the ``SelectMultiple`` and ``CheckboxSelectMultiple`` widgets\n  (:ticket:`29273`).\n\n* Fixed a regression in Django 2.0 where ``OpenLayersWidget`` deserialization\n  ignored the widget map&#39;s SRID and assumed 4326 (WGS84) (:ticket:`29116`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.0.3\n   ```\n   ==========================\n\n*March 6, 2018*\n\nDjango 2.0.3 fixes two security issues and several bugs in 2.0.2. Also, the\nlatest string translations from Transifex are incorporated.\n\nCVE-2018-7536: Denial-of-service possibility in ``urlize`` and ``urlizetrunc`` template filters\n===============================================================================================\n\nThe ``django.utils.html.urlize()`` function was extremely slow to evaluate\ncertain inputs due to catastrophic backtracking vulnerabilities in two regular\nexpressions. The ``urlize()`` function is used to implement the ``urlize`` and\n``urlizetrunc`` template filters, which were thus vulnerable.\n\nThe problematic regular expressions are replaced with parsing logic that\nbehaves similarly.\n\nCVE-2018-7537: Denial-of-service possibility in ``truncatechars_html`` and ``truncatewords_html`` template filters\n==================================================================================================================\n\nIf ``django.utils.text.Truncator``&#39;s ``chars()`` and ``words()`` methods were\npassed the ``html=True`` argument, they were extremely slow to evaluate certain\ninputs due to a catastrophic backtracking vulnerability in a regular\nexpression. The ``chars()`` and ``words()`` methods are used to implement the\n``truncatechars_html`` and ``truncatewords_html`` template filters, which were\nthus vulnerable.\n\nThe backtracking problem in the regular expression is fixed.\n\nBugfixes\n========\n\n* Fixed a regression that caused sliced ``QuerySet.distinct().order_by()``\n  followed by ``count()`` to crash (:ticket:`29108`).\n\n* Prioritized the datetime and time input formats without ``%f`` for the Thai\n  locale to fix the admin time picker widget displaying &quot;undefined&quot;\n  (:ticket:`29109`).\n\n* Fixed crash with ``QuerySet.order_by(Exists(...))`` (:ticket:`29118`).\n\n* Made ``Q.deconstruct()`` deterministic with multiple keyword arguments\n  (:ticket:`29125`). You may need to modify ``Q``&#39;s in existing migrations, or\n  accept an autogenerated migration.\n\n* Fixed a regression where a ``When()`` expression with a list argument crashes\n  (:ticket:`29166`).\n\n* Fixed crash when using a ``Window()`` expression in a subquery\n  (:ticket:`29172`).\n\n* Fixed ``AbstractBaseUser.normalize_username()`` crash if the ``username``\n  argument isn&#39;t a string (:ticket:`29176`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.0.2\n   ```\n   ==========================\n\n*February 1, 2018*\n\nDjango 2.0.2 fixes a security issue and several bugs in 2.0.1.\n\nCVE-2018-6188: Information leakage in ``AuthenticationForm``\n============================================================\n\nA regression in Django 1.11.8 made\n:class:`~django.contrib.auth.forms.AuthenticationForm` run its\n``confirm_login_allowed()`` method even if an incorrect password is entered.\nThis can leak information about a user, depending on what messages\n``confirm_login_allowed()`` raises. If ``confirm_login_allowed()`` isn&#39;t\noverridden, an attacker enter an arbitrary username and see if that user has\nbeen set to ``is_active=False``. If ``confirm_login_allowed()`` is overridden,\nmore sensitive details could be leaked.\n\nThis issue is fixed with the caveat that ``AuthenticationForm`` can no longer\nraise the &quot;This account is inactive.&quot; error if the authentication backend\nrejects inactive users (the default authentication backend, ``ModelBackend``,\nhas done that since Django 1.10). This issue will be revisited for Django 2.1\nas a fix to address the caveat will likely be too invasive for inclusion in\nolder versions.\n\nBugfixes\n========\n\n* Fixed hidden content at the bottom of the &quot;The install worked successfully!&quot;\n  page for some languages (:ticket:`28885`).\n\n* Fixed incorrect foreign key nullification if a model has two foreign keys to\n  the same model and a target model is deleted (:ticket:`29016`).\n\n* Fixed regression in the use of ``QuerySet.values_list(..., flat=True)``\n  followed by ``annotate()`` (:ticket:`29067`).\n\n* Fixed a regression where a queryset that annotates with geometry objects\n  crashes (:ticket:`29054`).\n\n* Fixed a regression where ``contrib.auth.authenticate()`` crashes if an\n  authentication backend doesn&#39;t accept ``request`` and a later one does\n  (:ticket:`29071`).\n\n* Fixed a regression where ``makemigrations`` crashes if a migrations directory\n  doesn&#39;t have an ``__init__.py`` file (:ticket:`29091`).\n\n* Fixed crash when entering an invalid uuid in ``ModelAdmin.raw_id_fields``\n  (:ticket:`29094`).\n\n\n==========================\n   ```\n   \n  \n  \n   ### 2.0.1\n   ```\n   ==========================\n\n*January 1, 2018*\n\nDjango 2.0.1 fixes several bugs in 2.0.\n\nBugfixes\n========\n\n* Fixed a regression in Django 1.11 that added newlines between ``MultiWidget``&#39;s\n  subwidgets (:ticket:`28890`).\n\n* Fixed incorrect class-based model index name generation for models with\n  quoted ``db_table`` (:ticket:`28876`).\n\n* Fixed incorrect foreign key constraint name for models with quoted\n  ``db_table`` (:ticket:`28876`).\n\n* Fixed a regression in caching of a ``GenericForeignKey`` when the referenced\n  model instance uses more than one level of multi-table inheritance\n  (:ticket:`28856`).\n\n* Reallowed filtering a queryset with ``GeometryField=None`` (:ticket:`28896`).\n\n* Corrected admin check to allow a ``OneToOneField`` in\n  ``ModelAdmin.autocomplete_fields`` (:ticket:`28898`).\n\n* Fixed a regression on SQLite where ``DecimalField`` returned a result with\n  trailing zeros in the fractional part truncated (:ticket:`28915`).\n\n* Fixed crash in the ``testserver`` command startup (:ticket:`28941`).\n\n* Fixed crash when coercing a translatable URL pattern to ``str``\n  (:ticket:`28947`).\n\n* Fixed crash on SQLite when renaming a field in a model referenced by a\n  ``ManyToManyField`` (:ticket:`28884`).\n\n* Fixed a crash when chaining ``values()`` or ``values_list()`` after\n  ``QuerySet.select_for_update(of=(...))`` (:ticket:`28944`).\n\n* Fixed admin changelist crash when using a query expression in the page&#39;s\n  ordering (:ticket:`28958`).\n\n\n========================\n   ```\n   \n  \n  \n   ### 2.0\n   ```\n   ========================\n\n*December 2, 2017*\n\nWelcome to Django 2.0!\n\nThese release notes cover the :ref:`new features &lt;whats-new-2.0&gt;`, as well as\nsome :ref:`backwards incompatible changes &lt;backwards-incompatible-2.0&gt;` you&#39;ll\nwant to be aware of when upgrading from Django 1.11 or earlier. We&#39;ve\n:ref:`dropped some features&lt;removed-features-2.0&gt;` that have reached the end of\ntheir deprecation cycle, and we&#39;ve :ref:`begun the deprecation process for some\nfeatures &lt;deprecated-features-2.0&gt;`.\n\nThis release starts Django&#39;s use of a :ref:`loose form of semantic versioning\n&lt;internal-release-cadence&gt;`, but there aren&#39;t any major backwards incompatible\nchanges that might be expected of a 2.0 release. Upgrading should be a similar\namount of effort as past feature releases.\n\nSee the :doc:`/howto/upgrade-version` guide if you&#39;re updating an existing\nproject.\n\nPython compatibility\n====================\n\nDjango 2.0 supports Python 3.4, 3.5, and 3.6. We **highly recommend** and only\nofficially support the latest release of each series.\n\nThe Django 1.11.x series is the last to support Python 2.7.\n\nDjango 2.0 will be the last release series to support Python 3.4. If you plan\na deployment of Python 3.4 beyond the end-of-life for Django 2.0 (April 2019),\nstick with Django 1.11 LTS (supported until April 2020) instead. Note, however,\nthat the end-of-life for Python 3.4 is March 2019.\n\nThird-party library support for older version of Django\n=======================================================\n\nFollowing the release of Django 2.0, we suggest that third-party app authors\ndrop support for all versions of Django prior to 1.11. At that time, you should\nbe able to run your package&#39;s tests using ``python -Wd`` so that deprecation\nwarnings do appear. After making the deprecation warning fixes, your app should\nbe compatible with Django 2.0.\n\n.. _whats-new-2.0:\n\nWhat&#39;s new in Django 2.0\n========================\n\nSimplified URL routing syntax\n-----------------------------\n\nThe new :func:`django.urls.path()` function allows a simpler, more readable URL\nrouting syntax. For example, this example from previous Django releases::\n\n    url(r&#39;^articles/(?P&lt;year&gt;[0-9]{4})/$&#39;, views.year_archive),\n\ncould be written as::\n\n    path(&#39;articles/&lt;int:year&gt;/&#39;, views.year_archive),\n\nThe new syntax supports type coercion of URL parameters. In the example, the\nview will receive the ``year`` keyword argument as an integer rather than as\na string. Also, the URLs that will match are slightly less constrained in the\nrewritten example. For example, the year 10000 will now match since the year\nintegers aren&#39;t constrained to be exactly four digits long as they are in the\nregular expression.\n\nThe ``django.conf.urls.url()`` function from previous versions is now available\nas :func:`django.urls.re_path`. The old location remains for backwards\ncompatibility, without an imminent deprecation. The old\n``django.conf.urls.include()`` function is now importable from ``django.urls``\nso you can use ``from django.urls import include, path, re_path`` in your\nURLconfs.\n\nThe :doc:`/topics/http/urls` document is rewritten to feature the new syntax\nand provide more details.\n\nMobile-friendly ``contrib.admin``\n---------------------------------\n\nThe admin is now responsive and supports all major mobile devices. Older\nbrowsers may experience varying levels of graceful degradation.\n\nWindow expressions\n------------------\n\nThe new :class:`~django.db.models.expressions.Window` expression allows\nadding an ``OVER`` clause to querysets. You can use :ref:`window functions\n&lt;window-functions&gt;` and :ref:`aggregate functions &lt;aggregation-functions&gt;` in\nthe expression.\n\nMinor features\n--------------\n\n:mod:`django.contrib.admin`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* The new :attr:`.ModelAdmin.autocomplete_fields` attribute and\n  :meth:`.ModelAdmin.get_autocomplete_fields` method allow using an\n  `Select2 &lt;https://select2.org&gt;`_ search widget for ``ForeignKey`` and\n  ``ManyToManyField``.\n\n:mod:`django.contrib.auth`\n~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* The default iteration count for the PBKDF2 password hasher is increased from\n  36,000 to 100,000.\n\n:mod:`django.contrib.gis`\n~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Added MySQL support for the\n  :class:`~django.contrib.gis.db.models.functions.AsGeoJSON` function,\n  :class:`~django.contrib.gis.db.models.functions.GeoHash` function,\n  :class:`~django.contrib.gis.db.models.functions.IsValid` function,\n  :lookup:`isvalid` lookup, and :ref:`distance lookups &lt;distance-lookups&gt;`.\n\n* Added the :class:`~django.contrib.gis.db.models.functions.Azimuth` and\n  :class:`~django.contrib.gis.db.models.functions.LineLocatePoint` functions,\n  supported on PostGIS and SpatiaLite.\n\n* Any :class:`~django.contrib.gis.geos.GEOSGeometry` imported from GeoJSON now\n  has its SRID set.\n\n* Added the :attr:`.OSMWidget.default_zoom` attribute to customize the map&#39;s\n  default zoom level.\n\n* Made metadata readable and editable on rasters through the\n  :attr:`~django.contrib.gis.gdal.GDALRaster.metadata`,\n  :attr:`~django.contrib.gis.gdal.GDALRaster.info`, and\n  :attr:`~django.contrib.gis.gdal.GDALBand.metadata` attributes.\n\n* Allowed passing driver-specific creation options to\n  :class:`~django.contrib.gis.gdal.GDALRaster` objects using ``papsz_options``.\n\n* Allowed creating :class:`~django.contrib.gis.gdal.GDALRaster` objects in\n  GDAL&#39;s internal virtual filesystem. Rasters can now be :ref:`created from and\n  converted to binary data &lt;gdal-raster-vsimem&gt;` in-memory.\n\n* The new :meth:`GDALBand.color_interp()\n  &lt;django.contrib.gis.gdal.GDALBand.color_interp&gt;` method returns the color\n  interpretation for the band.\n\n:mod:`django.contrib.postgres`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* The new ``distinct`` argument for\n  :class:`~django.contrib.postgres.aggregates.ArrayAgg` determines if\n  concatenated values will be distinct.\n\n* The new :class:`~django.contrib.postgres.functions.RandomUUID` database\n  function returns a version 4 UUID. It requires use of PostgreSQL&#39;s\n  ``pgcrypto`` extension which can be activated using the new\n  :class:`~django.contrib.postgres.operations.CryptoExtension` migration\n  operation.\n\n* :class:`django.contrib.postgres.indexes.GinIndex` now supports the\n  ``fastupdate`` and ``gin_pending_list_limit`` parameters.\n\n* The new :class:`~django.contrib.postgres.indexes.GistIndex` class allows\n  creating ``GiST`` indexes in the database. The new\n  :class:`~django.contrib.postgres.operations.BtreeGistExtension` migration\n  operation installs the ``btree_gist`` extension to add support for operator\n  classes that aren&#39;t built-in.\n\n* :djadmin:`inspectdb` can now introspect ``JSONField`` and various\n  ``RangeField``\\s (``django.contrib.postgres`` must be in ``INSTALLED_APPS``).\n\n:mod:`django.contrib.sitemaps`\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n* Added the ``protocol`` keyword argument to the\n  :class:`~django.contrib.sitemaps.GenericSitemap` constructor.\n\nCache\n~~~~~\n\n* ``cache.set_many()`` now returns a list of keys that failed to be inserted.\n  For the built-in backends, failed inserts can only happen on memcached.\n\nFile Storage\n~~~~~~~~~~~~\n\n* :meth:`File.open() &lt;django.core.files.File.open&gt;` can be used as a context\n  manager, e.g. ``with file.open() as f:``.\n\nForms\n~~~~~\n\n* The new ``date_attrs`` and ``time_attrs`` arguments for\n  :class:`~django.forms.SplitDateTimeWidget` and\n  :class:`~django.forms.SplitHiddenDateTimeWidget` allow specifying different\n  HTML attributes for the ``DateInput`` and ``TimeInput`` (or hidden)\n  subwidgets.\n\n* The new :meth:`Form.errors.get_json_data()\n  &lt;django.forms.Form.errors.get_json_data&gt;` method returns form errors as\n  a dictionary suitable for including in a JSON response.\n\nGeneric Views\n~~~~~~~~~~~~~\n\n* The new :attr:`.ContextMixin.extra_context` attribute allows adding context\n  in ``View.as_view()``.\n\nManagement Commands\n~~~~~~~~~~~~~~~~~~~\n\n* :djadmin:`inspectdb` now translates MySQL&#39;s unsigned integer columns to\n  ``PositiveIntegerField`` or ``PositiveSmallIntegerField``.\n\n* The new :option:`makemessages --add-location` option controls the comment\n  format in PO files.\n\n* :djadmin:`loaddata` can now :ref:`read from stdin &lt;loading-fixtures-stdin&gt;`.\n\n* The new :option:`diffsettings --output` option allows formatting the output\n  in a unified diff format.\n\n* On Oracle, :djadmin:`inspectdb` can now introspect ``AutoField`` if the\n  column is created as an identity column.\n\n* On MySQL, :djadmin:`dbshell` now supports client-side TLS certificates.\n\nMigrations\n~~~~~~~~~~\n\n* The new :option:`squashmigrations --squashed-name` option allows naming the\n  squashed migration.\n\nModels\n~~~~~~\n\n* The new :class:`~django.db.models.functions.StrIndex` database function\n  finds the starting index of a string inside another string.\n\n* On Oracle, ``AutoField`` and ``BigAutoField`` are now created as `identity\n  columns`_.\n\n  .. _`identity columns`: https://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htmDRDAA109\n\n* The new ``chunk_size`` parameter of :meth:`.QuerySet.iterator` controls the\n  number of rows fetched by the Python database client when streaming results\n  from the database. For databases that don&#39;t support server-side cursors, it\n  controls the number of results Django fetches from the database adapter.\n\n* :meth:`.QuerySet.earliest`, :meth:`.QuerySet.latest`, and\n  :attr:`Meta.get_latest_by &lt;django.db.models.Options.get_latest_by&gt;` now\n  allow ordering by several fields.\n\n* Added the :class:`~django.db.models.functions.ExtractQuarter` function to\n  extract the quarter from :class:`~django.db.models.DateField` and\n  :class:`~django.db.models.DateTimeField`, and exposed it through the\n  :lookup:`quarter` lookup.\n\n* Added the :class:`~django.db.models.functions.TruncQuarter` function to\n  truncate :class:`~django.db.models.DateField` and\n  :class:`~django.db.models.DateTimeField` to the first day of a quarter.\n\n* Added the :attr:`~django.db.models.Index.db_tablespace` parameter to\n  class-based indexes.\n\n* If the database supports a native duration field (Oracle and PostgreSQL),\n  :class:`~django.db.models.functions.Extract` now works with\n  :class:`~django.db.models.DurationField`.\n\n* Added the ``of`` argument to :meth:`.QuerySet.select_for_update()`, supported\n  on PostgreSQL and Oracle, to lock only rows from specific tables rather than\n  all selected tables. It may be helpful particularly when\n  :meth:`~.QuerySet.select_for_update()` is used in conjunction with\n  :meth:`~.QuerySet.select_related()`.\n\n* The new ``field_name`` parameter of :meth:`.QuerySet.in_bulk` allows fetching\n  results based on any unique model field.\n\n* :meth:`.CursorWrapper.callproc()` now takes an optional dictionary of keyword\n  parameters, if the backend supports this feature. Of Django&#39;s built-in\n  backends, only Oracle supports it.\n\n* The new :meth:`connection.execute_wrapper()\n  &lt;django.db.backends.base.DatabaseWrapper.execute_wrapper&gt;` method allows\n  :doc:`installing wrappers around execution of database queries\n  &lt;/topics/db/instrumentation&gt;`.\n\n* The new ``filter`` argument for built-in aggregates allows :ref:`adding\n  different conditionals &lt;conditional-aggregation&gt;` to multiple aggregations\n  over the same fields or relations.\n\n* Added support for expressions in :attr:`Meta.ordering\n  &lt;django.db.models.Options.ordering&gt;`.\n\n* The new ``named`` parameter of :meth:`.QuerySet.values_list` allows fetching\n  results as named tuples.\n\n* The new :class:`.FilteredRelation` class allows adding an ``ON`` clause to\n  querysets.\n\nPagination\n~~~~~~~~~~\n\n* Added :meth:`Paginator.get_page() &lt;django.core.paginator.Paginator.get_page&gt;`\n  to provide the documented pattern of handling invalid page numbers.\n\nRequests and Responses\n~~~~~~~~~~~~~~~~~~~~~~\n\n* The :djadmin:`runserver` Web server supports HTTP 1.1.\n\nTemplates\n~~~~~~~~~\n\n* To increase the usefulness of :meth:`.Engine.get_default` in third-party\n  apps, it now returns the first engine if multiple ``DjangoTemplates`` engines\n  are configured in ``TEMPLATES`` rather than raising ``ImproperlyConfigured``.\n\n* Custom template tags may now accept keyword-only arguments.\n\nTests\n~~~~~\n\n* Added threading support to :class:`~django.test.LiveServerTestCase`.\n\n* Added settings that allow customizing the test tablespace parameters for\n  Oracle: :setting:`DATAFILE_SIZE`, :setting:`DATAFILE_TMP_SIZE`,\n  :setting:`DATAFILE_EXTSIZE`, and :setting:`DATAFILE_TMP_EXTSIZE`.\n\nValidators\n~~~~~~~~~~\n\n* The new :class:`.ProhibitNullCharactersValidator` disallows the null\n  character in the input of the :class:`~django.forms.CharField` form field\n  and its subclasses. Null character input was observed from vulnerability\n  scanning tools. Most databases silently discard null characters, but\n  psycopg2 2.7+ raises an exception when trying to save a null character to\n  a char/text field with PostgreSQL.\n\n.. _backwards-incompatible-2.0:\n\nBackwards incompatible changes in 2.0\n=====================================\n\nRemoved support for bytestrings in some places\n----------------------------------------------\n\nTo support native Python 2 strings, older Django versions had to accept both\nbytestrings and unicode strings. Now that Python 2 support is dropped,\nbytestrings should only be encountered around input/output boundaries (handling\nof binary fields or HTTP streams, for example). You might have to update your\ncode to limit bytestring usage to a minimum, as Django no longer accepts\nbytestrings in certain code paths. Python&#39;s :option:`-b` option may help detect\nthat mistake in your code.\n\nFor example, ``reverse()`` now uses ``str()`` instead of ``force_text()`` to\ncoerce the ``args`` and ``kwargs`` it receives, prior to their placement in\nthe URL. For bytestrings, this creates a string with an undesired ``b`` prefix\nas well as additional quotes (``str(b&#39;foo&#39;)`` is ``&quot;b&#39;foo&#39;&quot;``). To adapt, call\n``decode()`` on the bytestring before passing it to ``reverse()``.\n\nDatabase backend API\n--------------------\n\nThis section describes changes that may be needed in third-party database\nbackends.\n\n* The ``DatabaseOperations.datetime_cast_date_sql()``,\n  ``datetime_cast_time_sql()``, ``datetime_trunc_sql()``,\n  ``datetime_extract_sql()``, and ``date_interval_sql()`` methods now return\n  only the SQL to perform the operation instead of SQL and a list of\n  parameters.\n\n* Third-party database backends should add a ``DatabaseWrapper.display_name``\n  attribute with the name of the database that your backend works with. Django\n  may use it in various messages, such as in system checks.\n\n* The first argument of ``SchemaEditor._alter_column_type_sql()`` is now\n  ``model`` rather than ``table``.\n\n* The first argument of ``SchemaEditor._create_index_name()`` is now\n  ``table_name`` rather than ``model``.\n\n* To enable ``FOR UPDATE OF`` support, set\n  ``DatabaseFeatures.has_select_for_update_of = True``. If the database\n  requires that the arguments to ``OF`` be columns rather than tables, set\n  ``DatabaseFeatures.select_for_update_of_column = True``.\n\n* To enable support for :class:`~django.db.models.expressions.Window`\n  expressions, set ``DatabaseFeatures.supports_over_clause`` to ``True``. You\n  may need to customize the ``DatabaseOperations.window_start_rows_start_end()``\n  and/or ``window_start_range_start_end()`` methods.\n\n* Third-party database backends should add a\n  ``DatabaseOperations.cast_char_field_without_max_length`` attribute with the\n  database data type that will be used in the\n  :class:`~django.db.models.functions.Cast` function for a ``CharField`` if the\n  ``max_length`` argument isn&#39;t provided.\n\n* The first argument of ``DatabaseCreation._clone_test_db()`` and\n  ``get_test_db_clone_settings()`` is now ``suffix`` rather\n  than ``number`` (in case you want to rename the signatures in your backend\n  for consistency). ``django.test`` also now passes those values as strings\n  rather than as integers.\n\n* Third-party database backends should add a\n  ``DatabaseIntrospection.get_sequences()`` method based on the stub in\n  ``BaseDatabaseIntrospection``.\n\nDropped support for Oracle 11.2\n-------------------------------\n\nThe end of upstream support for Oracle 11.2 is Dec. 2020. Django 1.11 will be\nsupported until April 2020 which almost reaches this date. Django 2.0\nofficially supports Oracle 12.1+.\n\nDefault MySQL isolation level is read committed\n-----------------------------------------------\n\nMySQL&#39;s default isolation level, repeatable read, may cause data loss in\ntypical Django usage. To prevent that and for consistency with other databases,\nthe default isolation level is now read committed. You can use the\n:setting:`DATABASES` setting to :ref:`use a different isolation level\n&lt;mysql-isolation-level&gt;`, if needed.\n\n:attr:`AbstractUser.last_name &lt;django.contrib.auth.models.User.last_name&gt;` ``max_length`` increased to 150\n----------------------------------------------------------------------------------------------------------\n\nA migration for :attr:`django.contrib.auth.models.User.last_name` is included.\nIf you have a custom user model inheriting from ``AbstractUser``, you&#39;ll need\nto generate and apply a database migration for your user model.\n\nIf you want to preserve the 30 character limit for last names, use a custom\nform::\n\n    from django.contrib.auth.forms import UserChangeForm\n\n    class MyUserChangeForm(UserChangeForm):\n        last_name = forms.CharField(max_length=30, required=False)\n\nIf you wish to keep this restriction in the admin when editing users, set\n``UserAdmin.form`` to use this form::\n\n    from django.contrib.auth.admin import UserAdmin\n    from django.contrib.auth.models import User\n\n    class MyUserAdmin(UserAdmin):\n        form = MyUserChangeForm\n\n    admin.site.unregister(User)\n    admin.site.register(User, MyUserAdmin)\n\n``QuerySet.reverse()`` and ``last()`` are prohibited after slicing\n------------------------------------------------------------------\n\nCalling ``QuerySet.reverse()`` or ``last()`` on a sliced queryset leads to\nunexpected results due to the slice being applied after reordering. This is\nnow prohibited, e.g.::\n\n    &gt;&gt;&gt; Model.objects.all()[:2].reverse()\n    Traceback (most recent call last):\n    ...\n    TypeError: Cannot reverse a query once a slice has been taken.\n\nForm fields no longer accept optional arguments as positional arguments\n-----------------------------------------------------------------------\n\nTo help prevent runtime errors due to incorrect ordering of form field\narguments, optional arguments of built-in form fields are no longer accepted\nas positional arguments. For example::\n\n    forms.IntegerField(25, 10)\n\nraises an exception and should be replaced with::\n\n    forms.IntegerField(max_value=25, min_value=10)\n\n``call_command()`` validates the options it receives\n----------------------------------------------------\n\n``call_command()`` now validates that the argument parser of the command being\ncalled defines all of the options passed to ``call_command()``.\n\nFor custom management commands that use options not created using\n``parser.add_argument()``, add a ``stealth_options`` attribute on the command::\n\n    class MyCommand(BaseCommand):\n        stealth_options = (&#39;option_name&#39;, ...)\n\nIndexes no longer accept positional arguments\n---------------------------------------------\n\nFor example::\n\n    models.Index([&#39;headline&#39;, &#39;-pub_date&#39;], &#39;index_name&#39;)\n\nraises an exception and should be replaced with::\n\n    models.Index(fields=[&#39;headline&#39;, &#39;-pub_date&#39;], name=&#39;index_name&#39;)\n\nForeign key constraints are now enabled on SQLite\n-------------------------------------------------\n\nThis will appear as a backwards-incompatible change (``IntegrityError:\nFOREIGN KEY constraint failed``) if attempting to save an existing model\ninstance that&#39;s violating a foreign key constraint.\n\nForeign keys are now created with ``DEFERRABLE INITIALLY DEFERRED`` instead of\n``DEFERRABLE IMMEDIATE``. Thus, tables may need to be rebuilt to recreate\nforeign keys with the new definition, particularly if you&#39;re using a pattern\nlike this::\n\n    from django.db import transaction\n\n    with transaction.atomic():\n        Book.objects.create(author_id=1)\n        Author.objects.create(id=1)\n\nIf you don&#39;t recreate the foreign key as ``DEFERRED``, the first ``create()``\nwould fail now that foreign key constraints are enforced.\n\nBackup your database first! After upgrading to Django 2.0, you can then\nrebuild tables using a script similar to this::\n\n    from django.apps import apps\n    from django.db import connection\n\n    for app in apps.get_app_configs():\n        for model in app.get_models(include_auto_created=True):\n            if model._meta.managed and not (model._meta.proxy or model._meta.swapped):\n                for base in model.__bases__:\n                    if hasattr(base, &#39;_meta&#39;):\n                        base._meta.local_many_to_many = []\n                model._meta.local_many_to_many = []\n                with connection.schema_editor() as editor:\n                    editor._remake_table(model)\n\nThis script hasn&#39;t received extensive testing and needs adaption for various\ncases such as multiple databases. Feel free to contribute improvements.\n\nIn addition, because of a table alteration limitation of SQLite, it&#39;s prohibited\nto perform :class:`~django.db.migrations.operations.RenameModel` and\n:class:`~django.db.migrations.operations.RenameField` operations on models or\nfields referenced by other models in a transaction. In order to allow migrations\ncontaining these operations to be applied, you must set the\n``Migration.atomic`` attribute to ``False``.\n\nMiscellaneous\n-------------\n\n* The ``SessionAuthenticationMiddleware`` class is removed. It provided no\n  functionality since session authentication is unconditionally enabled in\n  Django 1.10.\n\n* The default HTTP error handlers (``handler404``, etc.) are now callables\n  instead of dotted Python path strings. Django favors callable references\n  since they provide better performance and debugging experience.\n\n* :class:`~django.views.generic.base.RedirectView` no longer silences\n  ``NoReverseMatch`` if the ``pattern_name`` doesn&#39;t exist.\n\n* When :setting:`USE_L10N` is off, :class:`~django.forms.FloatField` and\n  :class:`~django.forms.DecimalField` now respect :setting:`DECIMAL_SEPARATOR`\n  and :setting:`THOUSAND_SEPARATOR` during validation. For example, with the\n  settings::\n\n     USE_L10N = False\n     USE_THOUSAND_SEPARATOR = True\n     DECIMAL_SEPARATOR = &#39;,&#39;\n     THOUSAND_SEPARATOR = &#39;.&#39;\n\n  an input of ``&quot;1.345&quot;`` is now converted to ``1345`` instead of ``1.345``.\n\n* Subclasses of :class:`~django.contrib.auth.models.AbstractBaseUser` are no\n  longer required to implement ``get_short_name()`` and ``get_full_name()``.\n  (The base implementations that raise ``NotImplementedError`` are removed.)\n  ``django.contrib.admin`` uses these methods if implemented but doesn&#39;t\n  require them. Third-party apps that use these methods may want to adopt a\n  similar approach.\n\n* The ``FIRST_DAY_OF_WEEK`` and ``NUMBER_GROUPING`` format settings are now\n  kept as integers in JavaScript and JSON i18n view outputs.\n\n* :meth:`~django.test.TransactionTestCase.assertNumQueries` now ignores\n  connection configuration queries. Previously, if a test opened a new database\n  connection, those queries could be included as part of the\n  ``assertNumQueries()`` count.\n\n* The default size of the Oracle test tablespace is increased from 20M to 50M\n  and the default autoextend size is increased from 10M to 25M.\n\n* To improve performance when streaming large result sets","created_at":"2018-05-14T14:53:28Z","updated_at":"2018-05-14T14:53:28Z","closed_at":null,"merged_at":null,"merge_commit_sha":null,"assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/HackSoftware/Odin/pulls/103/commits","review_comments_url":"https://api.github.com/repos/HackSoftware/Odin/pulls/103/comments","review_comment_url":"https://api.github.com/repos/HackSoftware/Odin/pulls/comments{/number}","comments_url":"https://api.github.com/repos/HackSoftware/Odin/issues/103/comments","statuses_url":"https://api.github.com/repos/HackSoftware/Odin/statuses/dd4c88690c8349c4209d2082966fcdebe5c41608","head":{"label":"HackSoftware:pyup-scheduled-update-2018-05-14","ref":"pyup-scheduled-update-2018-05-14","sha":"dd4c88690c8349c4209d2082966fcdebe5c41608","user":{"login":"HackSoftware","id":11139128,"avatar_url":"https://avatars1.githubusercontent.com/u/11139128?v=4","gravatar_id":"","url":"https://api.github.com/users/HackSoftware","html_url":"https://github.com/HackSoftware","followers_url":"https://api.github.com/users/HackSoftware/followers","following_url":"https://api.github.com/users/HackSoftware/following{/other_user}","gists_url":"https://api.github.com/users/HackSoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/HackSoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HackSoftware/subscriptions","organizations_url":"https://api.github.com/users/HackSoftware/orgs","repos_url":"https://api.github.com/users/HackSoftware/repos","events_url":"https://api.github.com/users/HackSoftware/events{/privacy}","received_events_url":"https://api.github.com/users/HackSoftware/received_events","type":"Organization","site_admin":false},"repo":{"id":92667396,"name":"Odin","full_name":"HackSoftware/Odin","owner":{"login":"HackSoftware","id":11139128,"avatar_url":"https://avatars1.githubusercontent.com/u/11139128?v=4","gravatar_id":"","url":"https://api.github.com/users/HackSoftware","html_url":"https://github.com/HackSoftware","followers_url":"https://api.github.com/users/HackSoftware/followers","following_url":"https://api.github.com/users/HackSoftware/following{/other_user}","gists_url":"https://api.github.com/users/HackSoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/HackSoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HackSoftware/subscriptions","organizations_url":"https://api.github.com/users/HackSoftware/orgs","repos_url":"https://api.github.com/users/HackSoftware/repos","events_url":"https://api.github.com/users/HackSoftware/events{/privacy}","received_events_url":"https://api.github.com/users/HackSoftware/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/HackSoftware/Odin","description":"Learning management system for HackBulgaria / HackSoft Academy","fork":false,"url":"https://api.github.com/repos/HackSoftware/Odin","forks_url":"https://api.github.com/repos/HackSoftware/Odin/forks","keys_url":"https://api.github.com/repos/HackSoftware/Odin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/HackSoftware/Odin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/HackSoftware/Odin/teams","hooks_url":"https://api.github.com/repos/HackSoftware/Odin/hooks","issue_events_url":"https://api.github.com/repos/HackSoftware/Odin/issues/events{/number}","events_url":"https://api.github.com/repos/HackSoftware/Odin/events","assignees_url":"https://api.github.com/repos/HackSoftware/Odin/assignees{/user}","branches_url":"https://api.github.com/repos/HackSoftware/Odin/branches{/branch}","tags_url":"https://api.github.com/repos/HackSoftware/Odin/tags","blobs_url":"https://api.github.com/repos/HackSoftware/Odin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/HackSoftware/Odin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/HackSoftware/Odin/git/refs{/sha}","trees_url":"https://api.github.com/repos/HackSoftware/Odin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/HackSoftware/Odin/statuses/{sha}","languages_url":"https://api.github.com/repos/HackSoftware/Odin/languages","stargazers_url":"https://api.github.com/repos/HackSoftware/Odin/stargazers","contributors_url":"https://api.github.com/repos/HackSoftware/Odin/contributors","subscribers_url":"https://api.github.com/repos/HackSoftware/Odin/subscribers","subscription_url":"https://api.github.com/repos/HackSoftware/Odin/subscription","commits_url":"https://api.github.com/repos/HackSoftware/Odin/commits{/sha}","git_commits_url":"https://api.github.com/repos/HackSoftware/Odin/git/commits{/sha}","comments_url":"https://api.github.com/repos/HackSoftware/Odin/comments{/number}","issue_comment_url":"https://api.github.com/repos/HackSoftware/Odin/issues/comments{/number}","contents_url":"https://api.github.com/repos/HackSoftware/Odin/contents/{+path}","compare_url":"https://api.github.com/repos/HackSoftware/Odin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/HackSoftware/Odin/merges","archive_url":"https://api.github.com/repos/HackSoftware/Odin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/HackSoftware/Odin/downloads","issues_url":"https://api.github.com/repos/HackSoftware/Odin/issues{/number}","pulls_url":"https://api.github.com/repos/HackSoftware/Odin/pulls{/number}","milestones_url":"https://api.github.com/repos/HackSoftware/Odin/milestones{/number}","notifications_url":"https://api.github.com/repos/HackSoftware/Odin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/HackSoftware/Odin/labels{/name}","releases_url":"https://api.github.com/repos/HackSoftware/Odin/releases{/id}","deployments_url":"https://api.github.com/repos/HackSoftware/Odin/deployments","created_at":"2017-05-28T14:48:51Z","updated_at":"2018-04-30T09:10:36Z","pushed_at":"2018-05-14T14:53:27Z","git_url":"git://github.com/HackSoftware/Odin.git","ssh_url":"git@github.com:HackSoftware/Odin.git","clone_url":"https://github.com/HackSoftware/Odin.git","svn_url":"https://github.com/HackSoftware/Odin","homepage":"","size":1609,"stargazers_count":5,"watchers_count":5,"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,"open_issues_count":5,"license":null,"forks":0,"open_issues":5,"watchers":5,"default_branch":"master"}},"base":{"label":"HackSoftware:master","ref":"master","sha":"3289c599530ae9ccc345dc4fb721c835dd3902b1","user":{"login":"HackSoftware","id":11139128,"avatar_url":"https://avatars1.githubusercontent.com/u/11139128?v=4","gravatar_id":"","url":"https://api.github.com/users/HackSoftware","html_url":"https://github.com/HackSoftware","followers_url":"https://api.github.com/users/HackSoftware/followers","following_url":"https://api.github.com/users/HackSoftware/following{/other_user}","gists_url":"https://api.github.com/users/HackSoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/HackSoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HackSoftware/subscriptions","organizations_url":"https://api.github.com/users/HackSoftware/orgs","repos_url":"https://api.github.com/users/HackSoftware/repos","events_url":"https://api.github.com/users/HackSoftware/events{/privacy}","received_events_url":"https://api.github.com/users/HackSoftware/received_events","type":"Organization","site_admin":false},"repo":{"id":92667396,"name":"Odin","full_name":"HackSoftware/Odin","owner":{"login":"HackSoftware","id":11139128,"avatar_url":"https://avatars1.githubusercontent.com/u/11139128?v=4","gravatar_id":"","url":"https://api.github.com/users/HackSoftware","html_url":"https://github.com/HackSoftware","followers_url":"https://api.github.com/users/HackSoftware/followers","following_url":"https://api.github.com/users/HackSoftware/following{/other_user}","gists_url":"https://api.github.com/users/HackSoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/HackSoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/HackSoftware/subscriptions","organizations_url":"https://api.github.com/users/HackSoftware/orgs","repos_url":"https://api.github.com/users/HackSoftware/repos","events_url":"https://api.github.com/users/HackSoftware/events{/privacy}","received_events_url":"https://api.github.com/users/HackSoftware/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/HackSoftware/Odin","description":"Learning management system for HackBulgaria / HackSoft Academy","fork":false,"url":"https://api.github.com/repos/HackSoftware/Odin","forks_url":"https://api.github.com/repos/HackSoftware/Odin/forks","keys_url":"https://api.github.com/repos/HackSoftware/Odin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/HackSoftware/Odin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/HackSoftware/Odin/teams","hooks_url":"https://api.github.com/repos/HackSoftware/Odin/hooks","issue_events_url":"https://api.github.com/repos/HackSoftware/Odin/issues/events{/number}","events_url":"https://api.github.com/repos/HackSoftware/Odin/events","assignees_url":"https://api.github.com/repos/HackSoftware/Odin/assignees{/user}","branches_url":"https://api.github.com/repos/HackSoftware/Odin/branches{/branch}","tags_url":"https://api.github.com/repos/HackSoftware/Odin/tags","blobs_url":"https://api.github.com/repos/HackSoftware/Odin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/HackSoftware/Odin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/HackSoftware/Odin/git/refs{/sha}","trees_url":"https://api.github.com/repos/HackSoftware/Odin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/HackSoftware/Odin/statuses/{sha}","languages_url":"https://api.github.com/repos/HackSoftware/Odin/languages","stargazers_url":"https://api.github.com/repos/HackSoftware/Odin/stargazers","contributors_url":"https://api.github.com/repos/HackSoftware/Odin/contributors","subscribers_url":"https://api.github.com/repos/HackSoftware/Odin/subscribers","subscription_url":"https://api.github.com/repos/HackSoftware/Odin/subscription","commits_url":"https://api.github.com/repos/HackSoftware/Odin/commits{/sha}","git_commits_url":"https://api.github.com/repos/HackSoftware/Odin/git/commits{/sha}","comments_url":"https://api.github.com/repos/HackSoftware/Odin/comments{/number}","issue_comment_url":"https://api.github.com/repos/HackSoftware/Odin/issues/comments{/number}","contents_url":"https://api.github.com/repos/HackSoftware/Odin/contents/{+path}","compare_url":"https://api.github.com/repos/HackSoftware/Odin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/HackSoftware/Odin/merges","archive_url":"https://api.github.com/repos/HackSoftware/Odin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/HackSoftware/Odin/downloads","issues_url":"https://api.github.com/repos/HackSoftware/Odin/issues{/number}","pulls_url":"https://api.github.com/repos/HackSoftware/Odin/pulls{/number}","milestones_url":"https://api.github.com/repos/HackSoftware/Odin/milestones{/number}","notifications_url":"https://api.github.com/repos/HackSoftware/Odin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/HackSoftware/Odin/labels{/name}","releases_url":"https://api.github.com/repos/HackSoftware/Odin/releases{/id}","deployments_url":"https://api.github.com/repos/HackSoftware/Odin/deployments","created_at":"2017-05-28T14:48:51Z","updated_at":"2018-04-30T09:10:36Z","pushed_at":"2018-05-14T14:53:27Z","git_url":"git://github.com/HackSoftware/Odin.git","ssh_url":"git@github.com:HackSoftware/Odin.git","clone_url":"https://github.com/HackSoftware/Odin.git","svn_url":"https://github.com/HackSoftware/Odin","homepage":"","size":1609,"stargazers_count":5,"watchers_count":5,"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,"open_issues_count":5,"license":null,"forks":0,"open_issues":5,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/HackSoftware/Odin/pulls/103"},"html":{"href":"https://github.com/HackSoftware/Odin/pull/103"},"issue":{"href":"https://api.github.com/repos/HackSoftware/Odin/issues/103"},"comments":{"href":"https://api.github.com/repos/HackSoftware/Odin/issues/103/comments"},"review_comments":{"href":"https://api.github.com/repos/HackSoftware/Odin/pulls/103/comments"},"review_comment":{"href":"https://api.github.com/repos/HackSoftware/Odin/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/HackSoftware/Odin/pulls/103/commits"},"statuses":{"href":"https://api.github.com/repos/HackSoftware/Odin/statuses/dd4c88690c8349c4209d2082966fcdebe5c41608"}},"author_association":"CONTRIBUTOR","merged":false,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":null,"comments":0,"review_comments":0,"maintainer_can_modify":false,"commits":11,"additions":11,"deletions":11,"changed_files":4}}
{"actor":{"display_login":"pyup-bot"}}