Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-nbconvert for
openSUSE:Factory checked in at 2022-03-13 20:25:12
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-nbconvert (Old)
and /work/SRC/openSUSE:Factory/.python-nbconvert.new.25692 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-nbconvert"
Sun Mar 13 20:25:12 2022 rev:12 rq:961349 version:6.4.4
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-nbconvert/python-nbconvert.changes
2022-02-21 17:46:42.795596048 +0100
+++
/work/SRC/openSUSE:Factory/.python-nbconvert.new.25692/python-nbconvert.changes
2022-03-13 20:25:33.135682526 +0100
@@ -1,0 +2,16 @@
+Sat Mar 12 04:50:52 UTC 2022 - Arun Persaud <[email protected]>
+
+- specfile:
+ * update nbconvert-vendorize-mistune.patch (linenumbers changed and lines
before patch)
+ * require beautiful-soup
+
+- update to version 6.4.4:
+ * HTMLExporter: Respect the embed_images flag for HTML blocks PR
+ #1721
+
+- changes from version 6.4.3:
+ * Remove ipython genutils PR #1727
+ * Add section to customizing showing how to use template inheritance
+ PR #1719
+
+-------------------------------------------------------------------
Old:
----
nbconvert-6.4.2.tar.gz
New:
----
nbconvert-6.4.4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-nbconvert.spec ++++++
--- /var/tmp/diff_new_pack.5aFRCw/_old 2022-03-13 20:25:33.703683194 +0100
+++ /var/tmp/diff_new_pack.5aFRCw/_new 2022-03-13 20:25:33.707683199 +0100
@@ -32,7 +32,7 @@
%{?!python_module:%define python_module() python3-%{**}}
%define skip_python2 1
Name: python-nbconvert%{psuffix}
-Version: 6.4.2
+Version: 6.4.4
Release: 0
Summary: Conversion of Jupyter Notebooks
License: BSD-3-Clause
@@ -43,6 +43,7 @@
# PATCH-FIX-OPENSUSE nbconvert-vendorize-mistune.patch --
gh#jupyter/nbconvert#1685
Patch1: nbconvert-vendorize-mistune.patch
BuildRequires: %{python_module base >= 3.7}
+BuildRequires: %{python_module beautifulsoup4}
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
BuildRequires: python-rpm-macros
@@ -50,6 +51,7 @@
Requires: jupyter-nbconvert = %{version}
Requires: python-Jinja2 >= 2.4
Requires: python-Pygments >= 2.4.1
+Requires: python-beautifulsoup4
Requires: python-bleach
Requires: python-defusedxml
Requires: python-entrypoints >= 0.2.2
++++++ nbconvert-6.4.2.tar.gz -> nbconvert-6.4.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/PKG-INFO new/nbconvert-6.4.4/PKG-INFO
--- old/nbconvert-6.4.2/PKG-INFO 2022-02-10 00:02:54.066899800 +0100
+++ new/nbconvert-6.4.4/PKG-INFO 2022-03-11 23:18:57.830361400 +0100
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: nbconvert
-Version: 6.4.2
+Version: 6.4.4
Summary: Converting Jupyter Notebooks
Home-page: https://jupyter.org
Author: Jupyter Development Team
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/docs/source/changelog.rst
new/nbconvert-6.4.4/docs/source/changelog.rst
--- old/nbconvert-6.4.2/docs/source/changelog.rst 2022-01-26
14:23:50.831099500 +0100
+++ new/nbconvert-6.4.4/docs/source/changelog.rst 2022-03-11
23:06:31.623179400 +0100
@@ -4,6 +4,31 @@
Changes in nbconvert
====================
+6.4.4
+-----
+* HTMLExporter: Respect the embed_images flag for HTML blocks :ghpull:`1721`
+
+6.4.3
+-----
+* Remove ipython genutils :ghpull:`1727`
+* Add section to customizing showing how to use template inheritance
:ghpull:`1719`
+
+6.4.2
+-----
+* Adding theme support for WebPDF exporter :ghpull:`1718`
+* Add option to embed_images in Markdown cells :ghpull:`1717`
+* HTMLExporter: Add theme alias and docs :ghpull:`1716`
+* Add basic support for federated labextensions themes :ghpull:`1703`
+* Always hide the collapser element :ghpull:`1712)
+* Raise pyppeteer requirement to >=1,<1.1 :ghpull:`1711`
+
+6.4.1
+-----
+* Handle needs_background cell metadata :ghpull:`1704`
+* Fix styling regression :ghpull:`1708`
+* Fix DOM structure of markdown cells in lab template :ghpull:`1709`
+* CodeMirror style bleed fix :ghpull:`1710`
+
6.4.0
-----
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/docs/source/customizing.rst
new/nbconvert-6.4.4/docs/source/customizing.rst
--- old/nbconvert-6.4.2/docs/source/customizing.rst 2021-09-11
06:56:22.514379300 +0200
+++ new/nbconvert-6.4.4/docs/source/customizing.rst 2022-03-11
23:06:26.195244000 +0100
@@ -140,3 +140,68 @@
For example, in the reveal template, ``index.html.j2`` extends
``base.html.j2`` which is in the same directory, and
``base.html.j2`` extends ``lab/base.html.j2``. This approach allows using
content that is available in other templates
or may be overriden in the current template.
+
+A practical example
+~~~~~~~~~~~~~~~~~~~
+
+Say you would like to modify the existing Markdown template to wrap each
+output statement in a fenced code block:
+
+.. code::
+
+ ```output
+ (1, 2, 3)
+ ```
+
+Start by creating a new template directory, say ``mdoutput``. In it,
+you have the following files::
+
+ conf.json
+ index.md.j2
+
+The configuration file, ``conf.json`` states that your template
+applies to markdown files::
+
+ {
+ "mimetypes": {
+ "text/markdown": true
+ }
+ }
+
+The ``index.md.j2`` template entrypoint extends the existing markdown
+template, and redefines how output blocks are rendered:
+
+.. code::
+
+ {% extends 'markdown/index.md.j2' %}
+
+ {%- block traceback_line -%}
+ ```output
+ {{ line.rstrip() | strip_ansi }}
+ ```
+ {%- endblock traceback_line -%}
+
+ {%- block stream -%}
+ ```output
+ {{ output.text.rstrip() }}
+ ```
+ {%- endblock stream -%}
+
+ {%- block data_text scoped -%}
+ ```output
+ {{ output.data['text/plain'].rstrip() }}
+ ```
+ {%- endblock data_text -%}
+
+You can now convert your notebook to markdown using the new template::
+
+ jupyter nbconvert --execute notebook.ipynb --to markdown --template=mdoutput
+
+(If you put your template folder in a different location than your
+notebook, remember to add
+``--TemplateExporter.extra_template_basedirs=path/to/template/parent``.)
+
+To further explore the possibilities of templating, take a look at the
+root of all templates: ``null.j2``. You can find it in the
+``./nbconvert/templates/base`` subfolder of one of the data paths given
+by ``jupyter --paths``.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/_version.py
new/nbconvert-6.4.4/nbconvert/_version.py
--- old/nbconvert-6.4.2/nbconvert/_version.py 2022-02-10 00:02:42.110830000
+0100
+++ new/nbconvert-6.4.4/nbconvert/_version.py 2022-03-11 23:17:39.032964200
+0100
@@ -1,4 +1,4 @@
-version_info = (6, 4, 2)
+version_info = (6, 4, 4)
pre_info = ''
dev_info = ''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/filters/__init__.py
new/nbconvert-6.4.4/nbconvert/filters/__init__.py
--- old/nbconvert-6.4.2/nbconvert/filters/__init__.py 2021-09-11
06:56:22.518379200 +0200
+++ new/nbconvert-6.4.4/nbconvert/filters/__init__.py 2022-03-11
23:06:26.200562200 +0100
@@ -8,4 +8,4 @@
from .metadata import *
from .pandoc import *
-from ipython_genutils.text import indent
+from nbconvert.utils.text import indent
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/nbconvert-6.4.2/nbconvert/filters/markdown_mistune.py
new/nbconvert-6.4.4/nbconvert/filters/markdown_mistune.py
--- old/nbconvert-6.4.2/nbconvert/filters/markdown_mistune.py 2022-02-10
00:01:26.782388700 +0100
+++ new/nbconvert-6.4.4/nbconvert/filters/markdown_mistune.py 2022-03-11
23:06:26.201169000 +0100
@@ -21,6 +21,8 @@
# Python 2
from cgi import escape as html_escape
+import bs4
+
import mistune
from pygments import highlight
@@ -135,6 +137,22 @@
formatter = HtmlFormatter()
return highlight(code, lexer, formatter)
+ def block_html(self, html):
+ embed_images = self.options.get('embed_images', False)
+
+ if embed_images:
+ html = self._html_embed_images(html)
+
+ return super().block_html(html)
+
+ def inline_html(self, html):
+ embed_images = self.options.get('embed_images', False)
+
+ if embed_images:
+ html = self._html_embed_images(html)
+
+ return super().inline_html(html)
+
def header(self, text, level, raw=None):
html = super().header(text, level, raw=raw)
if self.options.get("exclude_anchor_links"):
@@ -166,7 +184,6 @@
attachments = self.options.get('attachments', {})
attachment_prefix = 'attachment:'
embed_images = self.options.get('embed_images', False)
- path = self.options.get('path', '')
if src.startswith(attachment_prefix):
name = src[len(attachment_prefix):]
@@ -187,18 +204,49 @@
src = 'data:' + mime_type + ';base64,' + data
elif embed_images:
- image_path = os.path.join(path, src)
- if os.path.exists(image_path):
- with open(image_path, 'rb') as fobj:
- mime_type = mimetypes.guess_type(image_path)[0]
-
- base64_data = base64.b64encode(fobj.read())
- base64_data = base64_data.replace(b'\n',
b'').decode('ascii')
+ base64_url = self._src_to_base64(src)
- src = 'data:{};base64,{}'.format(mime_type, base64_data)
+ if base64_url is not None:
+ src = base64_url
return super().image(src, title, text)
+ def _src_to_base64(self, src):
+ """Turn the source file into a base64 url.
+
+ :param src: source link of the file.
+ :return: the base64 url or None if the file was not found.
+ """
+ path = self.options.get('path', '')
+ src_path = os.path.join(path, src)
+
+ if not os.path.exists(src_path):
+ return None
+
+ with open(src_path, 'rb') as fobj:
+ mime_type = mimetypes.guess_type(src_path)[0]
+
+ base64_data = base64.b64encode(fobj.read())
+ base64_data = base64_data.replace(b'\n', b'').decode('ascii')
+
+ return 'data:{};base64,{}'.format(mime_type, base64_data)
+
+ def _html_embed_images(self, html):
+ parsed_html = bs4.BeautifulSoup(html, features="html.parser")
+ imgs = parsed_html.find_all('img')
+
+ # Replace img tags's sources by base64 dataurls
+ for img in imgs:
+ if 'src' not in img.attrs:
+ continue
+
+ base64_url = self._src_to_base64(img.attrs['src'])
+
+ if base64_url is not None:
+ img.attrs['src'] = base64_url
+
+ return str(parsed_html)
+
def markdown2html_mistune(source):
"""Convert a markdown string to HTML using mistune"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/nbconvertapp.py
new/nbconvert-6.4.4/nbconvert/nbconvertapp.py
--- old/nbconvert-6.4.2/nbconvert/nbconvertapp.py 2022-02-10
00:01:26.786388600 +0100
+++ new/nbconvert-6.4.4/nbconvert/nbconvertapp.py 2022-03-11
23:06:26.202268600 +0100
@@ -15,9 +15,9 @@
import glob
import asyncio
from textwrap import fill, dedent
-from ipython_genutils.text import indent
from jupyter_core.application import JupyterApp, base_aliases, base_flags
+from nbconvert.utils.text import indent
from traitlets.config import catch_config_error, Configurable
from traitlets import (
Unicode, List, Instance, DottedObjectName, Type, Bool,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/nbconvert-6.4.2/nbconvert/tests/files/notebook5_embed_images.ipynb
new/nbconvert-6.4.4/nbconvert/tests/files/notebook5_embed_images.ipynb
--- old/nbconvert-6.4.2/nbconvert/tests/files/notebook5_embed_images.ipynb
1970-01-01 01:00:00.000000000 +0100
+++ new/nbconvert-6.4.4/nbconvert/tests/files/notebook5_embed_images.ipynb
2022-03-11 23:06:26.205035000 +0100
@@ -0,0 +1,51 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "id": "e684608d",
+ "metadata": {},
+ "source": [
+ ""
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "e609fcaf",
+ "metadata": {},
+ "source": [
+ "<img src='./containerized_deployments.jpeg'></img>"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "id": "a0043f9e",
+ "metadata": {},
+ "source": [
+ "<div>\n",
+ " <img src='./containerized_deployments.jpeg'></img>\n",
+ "</div>"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.9.10"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/tests/test_nbconvertapp.py
new/nbconvert-6.4.4/nbconvert/tests/test_nbconvertapp.py
--- old/nbconvert-6.4.2/nbconvert/tests/test_nbconvertapp.py 2022-01-26
14:23:50.839099600 +0100
+++ new/nbconvert-6.4.4/nbconvert/tests/test_nbconvertapp.py 2022-03-11
23:06:26.205365000 +0100
@@ -572,6 +572,32 @@
assert "var widgetRendererSrc =
'https://unpkg.com/@jupyter-widgets/html-manager@*/dist/embed-amd.js';" in
output
+ def test_not_embedding_images_htmlexporter(self):
+ """Check that the HTMLExporter does not embed images by default"""
+
+ with self.create_temp_cwd(["notebook5_embed_images.ipynb",
+ "containerized_deployments.jpeg"]):
+ self.nbconvert('notebook5_embed_images --log-level 0 --to html')
+ assert os.path.isfile('notebook5_embed_images.html')
+ with open("notebook5_embed_images.html", 'r', encoding="utf8") as
f:
+ text = f.read()
+ assert "./containerized_deployments.jpeg" in text
+ assert "src='./containerized_deployments.jpeg'" in text
+ assert text.count("data:image/jpeg;base64") == 0
+
+ def test_embedding_images_htmlexporter(self):
+ """Check that the HTMLExporter embeds images if needed"""
+
+ with self.create_temp_cwd(["notebook5_embed_images.ipynb",
+ "containerized_deployments.jpeg"]):
+ self.nbconvert('notebook5_embed_images --log-level 0 --to html
--embed-images')
+ assert os.path.isfile('notebook5_embed_images.html')
+ with open("notebook5_embed_images.html", 'r', encoding="utf8") as
f:
+ text = f.read()
+ assert "./containerized_deployments.jpeg" not in text
+ assert "src='./containerized_deployments.jpeg'" not in text
+ assert text.count("data:image/jpeg;base64") == 3
+
def test_execute_widgets_from_nbconvert(self):
"""Check jupyter widgets render"""
notebookName = "Unexecuted_widget"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/utils/io.py
new/nbconvert-6.4.4/nbconvert/utils/io.py
--- old/nbconvert-6.4.2/nbconvert/utils/io.py 2021-09-11 06:56:22.526379300
+0200
+++ new/nbconvert-6.4.4/nbconvert/utils/io.py 2022-03-11 23:06:26.205582000
+0100
@@ -5,6 +5,10 @@
# Distributed under the terms of the Modified BSD License.
import codecs
+import errno
+import os
+import random
+import shutil
import sys
def unicode_std_stream(stream='stdout'):
@@ -48,3 +52,81 @@
class FormatSafeDict(dict):
def __missing__(self, key):
return '{' + key + '}'
+
+
+try:
+ ENOLINK = errno.ENOLINK
+except AttributeError:
+ ENOLINK = 1998
+
+
+def link(src, dst):
+ """Hard links ``src`` to ``dst``, returning 0 or errno.
+
+ Note that the special errno ``ENOLINK`` will be returned if ``os.link``
isn't
+ supported by the operating system.
+ """
+
+ if not hasattr(os, "link"):
+ return ENOLINK
+ link_errno = 0
+ try:
+ os.link(src, dst)
+ except OSError as e:
+ link_errno = e.errno
+ return link_errno
+
+
+def link_or_copy(src, dst):
+ """Attempts to hardlink ``src`` to ``dst``, copying if the link fails.
+
+ Attempts to maintain the semantics of ``shutil.copy``.
+
+ Because ``os.link`` does not overwrite files, a unique temporary file
+ will be used if the target already exists, then that file will be moved
+ into place.
+ """
+
+ if os.path.isdir(dst):
+ dst = os.path.join(dst, os.path.basename(src))
+
+ link_errno = link(src, dst)
+ if link_errno == errno.EEXIST:
+ if os.stat(src).st_ino == os.stat(dst).st_ino:
+ # dst is already a hard link to the correct file, so we don't need
+ # to do anything else. If we try to link and rename the file
+ # anyway, we get duplicate files - see
http://bugs.python.org/issue21876
+ return
+
+ new_dst = dst + "-temp-%04X" %(random.randint(1, 16**4), )
+ try:
+ link_or_copy(src, new_dst)
+ except:
+ try:
+ os.remove(new_dst)
+ except OSError:
+ pass
+ raise
+ os.rename(new_dst, dst)
+ elif link_errno != 0:
+ # Either link isn't supported, or the filesystem doesn't support
+ # linking, or 'src' and 'dst' are on different filesystems.
+ shutil.copy(src, dst)
+
+
+def ensure_dir_exists(path, mode=0o755):
+ """ensure that a directory exists
+
+ If it doesn't exist, try to create it and protect against a race condition
+ if another process is doing the same.
+
+ The default permissions are 755, which differ from os.makedirs default of
777.
+ """
+ if not os.path.exists(path):
+ try:
+ os.makedirs(path, mode=mode)
+ except OSError as e:
+ if e.errno != errno.EEXIST:
+ raise
+ elif not os.path.isdir(path):
+ raise IOError("%r exists but is not a directory" % path)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/utils/text.py
new/nbconvert-6.4.4/nbconvert/utils/text.py
--- old/nbconvert-6.4.2/nbconvert/utils/text.py 1970-01-01 01:00:00.000000000
+0100
+++ new/nbconvert-6.4.4/nbconvert/utils/text.py 2022-03-11 23:06:26.205690400
+0100
@@ -0,0 +1,41 @@
+import os
+import re
+
+
+def indent(instr, nspaces=4, ntabs=0, flatten=False):
+ """Indent a string a given number of spaces or tabstops.
+
+ indent(str,nspaces=4,ntabs=0) -> indent str by ntabs+nspaces.
+
+ Parameters
+ ----------
+
+ instr : basestring
+ The string to be indented.
+ nspaces : int (default: 4)
+ The number of spaces to be indented.
+ ntabs : int (default: 0)
+ The number of tabs to be indented.
+ flatten : bool (default: False)
+ Whether to scrub existing indentation. If True, all lines will be
+ aligned to the same indentation. If False, existing indentation will
+ be strictly increased.
+
+ Returns
+ -------
+
+ str|unicode : string indented by ntabs and nspaces.
+
+ """
+ if instr is None:
+ return
+ ind = '\t' * ntabs + ' ' * nspaces
+ if flatten:
+ pat = re.compile(r'^\s*', re.MULTILINE)
+ else:
+ pat = re.compile(r'^', re.MULTILINE)
+ outstr = re.sub(pat, ind, instr)
+ if outstr.endswith(os.linesep + ind):
+ return outstr[:-len(ind)]
+ else:
+ return outstr
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/nbconvert/writers/files.py
new/nbconvert-6.4.4/nbconvert/writers/files.py
--- old/nbconvert-6.4.2/nbconvert/writers/files.py 2021-09-11
06:56:22.526379300 +0200
+++ new/nbconvert-6.4.4/nbconvert/writers/files.py 2022-03-11
23:06:26.206065700 +0100
@@ -8,8 +8,10 @@
import glob
from pathlib import Path
+
+from nbconvert.utils.io import ensure_dir_exists, link_or_copy
from traitlets import Unicode, observe
-from ipython_genutils.path import link_or_copy, ensure_dir_exists
+
from .base import WriterBase
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/nbconvert-6.4.2/setup.py new/nbconvert-6.4.4/setup.py
--- old/nbconvert-6.4.2/setup.py 2022-02-10 00:01:26.786388600 +0100
+++ new/nbconvert-6.4.4/setup.py 2022-03-11 23:06:26.206297200 +0100
@@ -224,6 +224,7 @@
'pandocfilters>=1.4.1',
'testpath',
'defusedxml',
+ 'beautifulsoup4',
'nbclient>=0.5.0,<0.6.0'
]
++++++ nbconvert-vendorize-mistune.patch ++++++
--- /var/tmp/diff_new_pack.5aFRCw/_old 2022-03-13 20:25:33.951683485 +0100
+++ /var/tmp/diff_new_pack.5aFRCw/_new 2022-03-13 20:25:33.955683490 +0100
@@ -2,9 +2,9 @@
===================================================================
--- nbconvert-6.3.0.orig/nbconvert/filters/markdown_mistune.py
+++ nbconvert-6.3.0/nbconvert/filters/markdown_mistune.py
-@@ -18,7 +18,7 @@ except ImportError:
- # Python 2
- from cgi import escape as html_escape
+@@ -23,7 +23,7 @@ except ImportError:
+
+ import bs4
-import mistune
+from nbconvert.vendor import mistune
@@ -15,7 +15,7 @@
===================================================================
--- nbconvert-6.3.0.orig/setup.py
+++ nbconvert-6.3.0/setup.py
-@@ -212,7 +212,6 @@ setup_args = dict(
+@@ -214,7 +214,6 @@ setup_args = dict(
)
setup_args['install_requires'] = [