Hello community,
here is the log from the commit of package python-panflute for openSUSE:Factory
checked in at 2020-03-12 23:07:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-panflute (Old)
and /work/SRC/openSUSE:Factory/.python-panflute.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-panflute"
Thu Mar 12 23:07:51 2020 rev:3 rq:784293 version:1.12.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-panflute/python-panflute.changes
2019-11-20 10:27:50.734569556 +0100
+++
/work/SRC/openSUSE:Factory/.python-panflute.new.3160/python-panflute.changes
2020-03-12 23:12:30.587328745 +0100
@@ -1,0 +2,9 @@
+Thu Mar 12 11:32:27 UTC 2020 - Marketa Calabkova <[email protected]>
+
+- Update to version 1.12.5
+ * tweak error messages of panflute.dump
+ * allow slice assignment to element items (via ListContainer)
+ * Tables should now work well without a header or without a body.
+ * stringify() now adds quotes around the contents of a Quoted() element.
+
+-------------------------------------------------------------------
Old:
----
panflute-1.11.2.tar.gz
New:
----
panflute-1.12.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-panflute.spec ++++++
--- /var/tmp/diff_new_pack.Y29lUC/_old 2020-03-12 23:12:31.019328915 +0100
+++ /var/tmp/diff_new_pack.Y29lUC/_new 2020-03-12 23:12:31.023328917 +0100
@@ -1,7 +1,7 @@
#
# spec file for package python-panflute
#
-# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -12,17 +12,18 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
+#
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
Name: python-panflute
-Version: 1.11.2
+Version: 1.12.5
Release: 0
-License: BSD-3-Clause
Summary: Pandoc filters package for Python
-Url: https://github.com/sergiocorreia/panflute
+License: BSD-3-Clause
Group: Development/Languages/Python
+URL: https://github.com/sergiocorreia/panflute
Source:
https://files.pythonhosted.org/packages/source/p/panflute/panflute-%{version}.tar.gz
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
@@ -31,8 +32,8 @@
BuildRequires: %{python_module PyYAML}
BuildRequires: %{python_module click}
BuildRequires: %{python_module future}
-BuildRequires: %{python_module pytest}
BuildRequires: %{python_module pytest-cov}
+BuildRequires: %{python_module pytest}
BuildRequires: python-configparser
BuildRequires: python-shutilwhich
# /SECTION
@@ -61,7 +62,7 @@
sed -i 's|shutilwhich||'
%{buildroot}%{python3_sitelib}/panflute-*.egg-info/requires.txt
%files %{python_files}
-%doc README.md README.rst
+%doc README.md
%license LICENSE
%python3_only %{_bindir}/panflute
%python3_only %{_bindir}/panfl
++++++ panflute-1.11.2.tar.gz -> panflute-1.12.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/MANIFEST.in
new/panflute-1.12.5/MANIFEST.in
--- old/panflute-1.11.2/MANIFEST.in 2019-01-21 09:59:30.000000000 +0100
+++ new/panflute-1.12.5/MANIFEST.in 2020-02-20 06:52:03.000000000 +0100
@@ -1,2 +1,3 @@
include README.md
include LICENSE
+include requirements.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/PKG-INFO new/panflute-1.12.5/PKG-INFO
--- old/panflute-1.11.2/PKG-INFO 2019-01-21 10:00:45.000000000 +0100
+++ new/panflute-1.12.5/PKG-INFO 2020-02-20 06:52:18.328729000 +0100
@@ -1,95 +1,61 @@
Metadata-Version: 2.1
Name: panflute
-Version: 1.11.2
+Version: 1.12.5
Summary: Pythonic Pandoc filters
Home-page: https://github.com/sergiocorreia/panflute
Author: Sergio Correia
Author-email: [email protected]
License: BSD3
-Description: :Date: January 21, 2019
+Description: # Panflute: Pythonic Pandoc Filters
- .. contents::
- :depth: 3
- ..
-
- Panflute: Pythonic Pandoc Filters
- =================================
-
- |Python version| |PyPI version| |Development Status| |Build Status|
-
- `panflute <http://scorreia.com/software/panflute/>`__ is a Python
- package that makes creating Pandoc filters fun.
-
- For a detailed user guide, documentation, and installation
instructions,
- see http://scorreia.com/software/panflute/. For examples that you can
- use as starting points, check the `examples
- repo
<https://github.com/sergiocorreia/panflute-filters/tree/master/filters>`__,
- the `sample
- template
<https://raw.githubusercontent.com/sergiocorreia/panflute/master/docs/source/_static/template.py>`__,
- or `this github
- search
<https://github.com/search?o=desc&q=%22import+panflute%22+OR+%22from+panflute%22+created%3A%3E2016-01-01+language%3APython+extension%3Apy&s=indexed&type=Code&utf8=%E2%9C%93>`__.
- If you want to contribute, head `here </CONTRIBUTING.md>`__.
+ [](https://pypi.python.org/pypi/panflute/)
+ [](https://pypi.python.org/pypi/panflute/)
+ [](https://pypi.python.org/pypi/panflute/)
+ [](https://github.com/sergiocorreia/panflute/actions?query=workflow%3A%22CI+Tests%22)
- Install
- -------
+ [panflute](http://scorreia.com/software/panflute/) is a Python package
that makes creating Pandoc filters fun.
- To install panflute, open the command line and type:
+ For a detailed user guide, documentation, and installation
instructions, see
+ <http://scorreia.com/software/panflute/>.
+ For examples that you can use as starting points, check the [examples
repo](https://github.com/sergiocorreia/panflute-filters/tree/master/filters),
the [sample
template](https://raw.githubusercontent.com/sergiocorreia/panflute/master/docs/source/_static/template.py),
or [this github
search](https://github.com/search?o=desc&q=%22import+panflute%22+OR+%22from+panflute%22+created%3A%3E2016-01-01+language%3APython+extension%3Apy&s=indexed&type=Code&utf8=%E2%9C%93).
+ If you want to contribute, head [here](/CONTRIBUTING.md).
+
+ You might also find useful [this
presentation](https://github.com/BPLIM/Workshops/raw/master/BPLIM2019/D2_S1_Sergio_Correia_Markdown.pdf)
on how I use markdown+pandoc+panflute to write research papers (at the Banco
de Portugal 2019 Workshop on Reproductible Research).
- .. code:: bash
- pip install panflute
+ ## Install
+
+ To install panflute, open the command line and type:
- Python 2.7+, 3.3+, PyPy, and PyPy3 are supported.
+ ```bash
+ pip install panflute
+ ```
- Uninstall
- ---------
+ Python 3.6+ and PyPy3 are supported (Python 2.7 and Python 3.3-3.5
were supported up to version 1.11.4).
- .. code:: bash
+ ## Uninstall
- pip uninstall panflute
+ ```bash
+ pip uninstall panflute
+ ```
- Dev Install
- -----------
+ ## Dev Install
After cloning the repo and opening the panflute folder:
- ``python setup.py install``
- installs the package locally
- ``python setup.py develop``
- installs locally with a symlink so changes are automatically updated
-
- In addition, if you use python2, you need to pasteurize the code before
- running tests. In this directory, Run
-
- .. code:: bash
-
- # install pasteurize if you didn't have it yet
- pip2 install -U future
- pasteurize -wnj 4 .
-
- Contributing
- ------------
-
- Feel free to submit push requests. For consistency, code should comply
- with `pep8 <https://pypi.python.org/pypi/pep8>`__ (as long as its
- reasonable), and with the style guides by
- [@kennethreitz](http://docs.python-guide.org/en/latest/writing/style/)
- and `google <http://google.github.io/styleguide/pyguide.html>`__. Read
- more `here </CONTRIBUTING.md>`__.
-
- License
- -------
-
- BSD3 license (following ``pandocfilters`` by @jgm).
-
- .. |Python version| image::
https://img.shields.io/pypi/pyversions/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
- .. |PyPI version| image:: https://img.shields.io/pypi/v/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
- .. |Development Status| image::
https://img.shields.io/pypi/status/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
- .. |Build Status| image::
https://travis-ci.org/sergiocorreia/panflute.svg?branch=master
- :target: https://travis-ci.org/sergiocorreia/panflute
+ `python setup.py install`: installs the package locally
+
+ `python setup.py develop`: installs locally with a symlink so changes
are automatically updated
+
+
+ ## Contributing
+
+ Feel free to submit push requests. For consistency, code should comply
with [pep8](https://pypi.python.org/pypi/pep8) (as long as its reasonable), and
with the style guides by
[@kennethreitz](http://docs.python-guide.org/en/latest/writing/style/) and
[google](http://google.github.io/styleguide/pyguide.html). Read more
[here](/CONTRIBUTING.md).
+
+ ## License
+
+ BSD3 license (following `pandocfilters` by @jgm).
+
Keywords: pandoc pandocfilters markdown latex
Platform: UNKNOWN
@@ -101,14 +67,11 @@
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Text Processing :: Filters
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
-Provides-Extra: pypi
+Description-Content-Type: text/markdown
Provides-Extra: test
+Provides-Extra: pypi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/README.md
new/panflute-1.12.5/README.md
--- old/panflute-1.11.2/README.md 2019-01-21 09:59:30.000000000 +0100
+++ new/panflute-1.12.5/README.md 2020-02-20 06:52:03.000000000 +0100
@@ -3,7 +3,7 @@
[](https://pypi.python.org/pypi/panflute/)
[](https://pypi.python.org/pypi/panflute/)
[](https://pypi.python.org/pypi/panflute/)
-[](https://travis-ci.org/sergiocorreia/panflute)
+[](https://github.com/sergiocorreia/panflute/actions?query=workflow%3A%22CI+Tests%22)
[panflute](http://scorreia.com/software/panflute/) is a Python package that
makes creating Pandoc filters fun.
@@ -12,6 +12,8 @@
For examples that you can use as starting points, check the [examples
repo](https://github.com/sergiocorreia/panflute-filters/tree/master/filters),
the [sample
template](https://raw.githubusercontent.com/sergiocorreia/panflute/master/docs/source/_static/template.py),
or [this github
search](https://github.com/search?o=desc&q=%22import+panflute%22+OR+%22from+panflute%22+created%3A%3E2016-01-01+language%3APython+extension%3Apy&s=indexed&type=Code&utf8=%E2%9C%93).
If you want to contribute, head [here](/CONTRIBUTING.md).
+You might also find useful [this
presentation](https://github.com/BPLIM/Workshops/raw/master/BPLIM2019/D2_S1_Sergio_Correia_Markdown.pdf)
on how I use markdown+pandoc+panflute to write research papers (at the Banco
de Portugal 2019 Workshop on Reproductible Research).
+
## Install
@@ -21,7 +23,7 @@
pip install panflute
```
-Python 2.7+, 3.3+, PyPy, and PyPy3 are supported.
+Python 3.6+ and PyPy3 are supported (Python 2.7 and Python 3.3-3.5 were
supported up to version 1.11.4).
## Uninstall
@@ -33,19 +35,10 @@
After cloning the repo and opening the panflute folder:
-`python setup.py install`
-: installs the package locally
-
-`python setup.py develop`
-: installs locally with a symlink so changes are automatically updated
+`python setup.py install`: installs the package locally
-In addition, if you use python2, you need to pasteurize the code before
running tests. In this directory, Run
+`python setup.py develop`: installs locally with a symlink so changes are
automatically updated
-```bash
-# install pasteurize if you didn't have it yet
-pip2 install -U future
-pasteurize -wnj 4 .
-```
## Contributing
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/README.rst
new/panflute-1.12.5/README.rst
--- old/panflute-1.11.2/README.rst 2019-01-21 10:00:12.000000000 +0100
+++ new/panflute-1.12.5/README.rst 1970-01-01 01:00:00.000000000 +0100
@@ -1,84 +0,0 @@
-:Date: January 21, 2019
-
-.. contents::
- :depth: 3
-..
-
-Panflute: Pythonic Pandoc Filters
-=================================
-
-|Python version| |PyPI version| |Development Status| |Build Status|
-
-`panflute <http://scorreia.com/software/panflute/>`__ is a Python
-package that makes creating Pandoc filters fun.
-
-For a detailed user guide, documentation, and installation instructions,
-see http://scorreia.com/software/panflute/. For examples that you can
-use as starting points, check the `examples
-repo
<https://github.com/sergiocorreia/panflute-filters/tree/master/filters>`__,
-the `sample
-template
<https://raw.githubusercontent.com/sergiocorreia/panflute/master/docs/source/_static/template.py>`__,
-or `this github
-search
<https://github.com/search?o=desc&q=%22import+panflute%22+OR+%22from+panflute%22+created%3A%3E2016-01-01+language%3APython+extension%3Apy&s=indexed&type=Code&utf8=%E2%9C%93>`__.
-If you want to contribute, head `here </CONTRIBUTING.md>`__.
-
-Install
--------
-
-To install panflute, open the command line and type:
-
-.. code:: bash
-
- pip install panflute
-
-Python 2.7+, 3.3+, PyPy, and PyPy3 are supported.
-
-Uninstall
----------
-
-.. code:: bash
-
- pip uninstall panflute
-
-Dev Install
------------
-
-After cloning the repo and opening the panflute folder:
-
-``python setup.py install``
- installs the package locally
-``python setup.py develop``
- installs locally with a symlink so changes are automatically updated
-
-In addition, if you use python2, you need to pasteurize the code before
-running tests. In this directory, Run
-
-.. code:: bash
-
- # install pasteurize if you didn't have it yet
- pip2 install -U future
- pasteurize -wnj 4 .
-
-Contributing
-------------
-
-Feel free to submit push requests. For consistency, code should comply
-with `pep8 <https://pypi.python.org/pypi/pep8>`__ (as long as its
-reasonable), and with the style guides by
-[@kennethreitz](http://docs.python-guide.org/en/latest/writing/style/)
-and `google <http://google.github.io/styleguide/pyguide.html>`__. Read
-more `here </CONTRIBUTING.md>`__.
-
-License
--------
-
-BSD3 license (following ``pandocfilters`` by @jgm).
-
-.. |Python version| image:: https://img.shields.io/pypi/pyversions/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
-.. |PyPI version| image:: https://img.shields.io/pypi/v/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
-.. |Development Status| image:: https://img.shields.io/pypi/status/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
-.. |Build Status| image::
https://travis-ci.org/sergiocorreia/panflute.svg?branch=master
- :target: https://travis-ci.org/sergiocorreia/panflute
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/__init__.py
new/panflute-1.12.5/panflute/__init__.py
--- old/panflute-1.11.2/panflute/__init__.py 2019-01-21 10:00:24.000000000
+0100
+++ new/panflute-1.12.5/panflute/__init__.py 2020-02-20 06:52:03.000000000
+0100
@@ -5,13 +5,7 @@
Panflute is a Python package that makes `Pandoc <http://pandoc.org/>`_
filters fun to write. (`Installation <install.html>`_)
"""
-from __future__ import unicode_literals
-from __future__ import print_function
-from __future__ import division
-from __future__ import absolute_import
-from future import standard_library
-standard_library.install_aliases()
from .containers import ListContainer, DictContainer
from .base import Element, Block, Inline, MetaValue
@@ -38,6 +32,6 @@
from .tools import (
stringify, yaml_filter, shell, run_pandoc, convert_text, debug, get_option)
-from .autofilter import main, panfl, get_filter_dir, stdio
+from .autofilter import main, panfl, get_filter_dirs, stdio
from .version import __version__
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/autofilter.py
new/panflute-1.12.5/panflute/autofilter.py
--- old/panflute-1.11.2/panflute/autofilter.py 2019-01-21 10:00:26.000000000
+0100
+++ new/panflute-1.12.5/panflute/autofilter.py 2020-02-20 06:52:03.000000000
+0100
@@ -5,18 +5,12 @@
Exports ``main`` and ``panfl``.
"""
-from __future__ import unicode_literals
-from __future__ import print_function
-from __future__ import division
-from __future__ import absolute_import
-
-from builtins import open
-from future import standard_library
-standard_library.install_aliases()
+
import os
import os.path as p
import sys
import click
+from io import StringIO
from .io import load, dump
from .tools import debug
@@ -26,21 +20,35 @@
reduced_sys_path = [dir_ for dir_ in sys.path if (dir_ not in ('', '.')) and
p.isdir(dir_)]
-def get_filter_dir(hardcoded=True):
+def get_filter_dirs(hardcoded=True):
+ """
+ Return directories where we expect to find filters.
+
+ If hardcoded=True use paths we know ex ante; if False ask Pandoc for a list
+ """
if hardcoded:
if os.name == 'nt':
- return p.join(os.environ["APPDATA"], "pandoc", "filters")
+ d1 = [p.join(os.environ["APPDATA"], "pandoc", "filters")]
+ return d1
else:
- return p.join(os.environ["HOME"], ".pandoc", "filters")
+ d1 = p.join(os.environ["HOME"], ".pandoc", "filters")
+ d2 = p.join(os.environ["HOME"], ".local", "share", "pandoc",
"filters")
+ return [d1, d2]
else:
from .tools import run_pandoc
+
# Extract $DATADIR
info = run_pandoc(args=['--version']).splitlines()
prefix = "Default user data directory: "
info = [row for row in info if row.startswith(prefix)]
assert len(info) == 1
data_dir = info[0][len(prefix):]
- return p.normpath(p.expanduser(p.expandvars(p.join(data_dir,
'filters'))))
+
+ # data_dir might contain multiple folders:
+ # Default user data directory: /home/runner/.local/share/pandoc or
/home/runner/.pandoc/filters
+ data_dir = data_dir.split(' or ')
+ data_dir = [p.normpath(p.expanduser(p.expandvars(p.join(d,
'filters')))) for d in data_dir]
+ return data_dir
def stdio(filters=None, search_dirs=None, data_dir=True, sys_path=True,
panfl_=False, input_stream=None, output_stream=None):
@@ -61,8 +69,8 @@
for debug purpose
:return: None
"""
+
doc = load(input_stream)
- # meta = doc.metadata # Local variable 'meta' value is not used
verbose = doc.get_metadata('panflute-verbose', False)
if search_dirs is None:
@@ -86,16 +94,20 @@
# default panflute behaviour:
search_dirs.append('.')
if data_dir:
- search_dirs.append(get_filter_dir())
+ search_dirs.extend(get_filter_dirs())
if sys_path:
search_dirs += sys.path
else:
# panfl/pandoctools behaviour:
if data_dir:
- search_dirs.append(get_filter_dir())
+ search_dirs.extend(get_filter_dirs())
if sys_path:
search_dirs += reduced_sys_path
+ if verbose:
+ debug('panflute will search for filters in the following folders:')
+ debug(' '.join('"{}"'.format(f) for f in search_dirs))
+
# Display message (tests that everything is working ok)
msg = doc.get_metadata('panflute-echo', False)
if msg:
@@ -248,6 +260,9 @@
else:
raise Exception("filter not found: " + filter_)
+ # Intercept any print() statements made by filters (which would cause
Pandoc to fail)
+ sys.stdout = alt_stdout = StringIO()
+
for filter_, filter_path, module_, extra_dir in filter_paths:
if verbose:
debug("panflute: running filter <{}>".format(filter_))
@@ -266,5 +281,15 @@
raise Exception(e)
if verbose:
debug("panflute: filter <{}> completed".format(filter_))
+
+ alt_stdout_data = alt_stdout.getvalue()
+ if alt_stdout_data:
+ debug('[PANFLUTE WARNING] Filter "{}" wrote to stdout, but Pandoc
does not allow that'.format(filter_))
+ debug(alt_stdout_data)
+ sys.stderr.flush()
+ sys.stdout = alt_stdout = StringIO()
+
+ # Restore stdout
+ sys.stdout = sys.__stdout__
return doc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/base.py
new/panflute-1.12.5/panflute/base.py
--- old/panflute-1.11.2/panflute/base.py 2019-01-21 10:00:26.000000000
+0100
+++ new/panflute-1.12.5/panflute/base.py 2020-02-20 06:52:03.000000000
+0100
@@ -1,28 +1,14 @@
"""
Base classes and methods of all Pandoc elements
"""
-from __future__ import unicode_literals
-from __future__ import print_function
-from __future__ import division
-from __future__ import absolute_import
# ---------------------------
# Imports
# ---------------------------
-from future import standard_library
-standard_library.install_aliases()
-import sys
-py2 = sys.version_info[0] == 2
-if py2: str = basestring
-
from operator import attrgetter
-if py2:
- from collections import OrderedDict, MutableSequence, MutableMapping
-else:
- from collections import OrderedDict
- from collections.abc import MutableSequence, MutableMapping
-
+from collections import OrderedDict
+from collections.abc import MutableSequence, MutableMapping
from itertools import chain
from .containers import ListContainer, DictContainer
@@ -286,7 +272,7 @@
raise TypeError(type(obj))
setattr(self, child, ans)
- # Then apply the action to the element
+ # Then apply the action to the root element
altered = action(self, doc)
return self if altered is None else altered
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/containers.py
new/panflute-1.12.5/panflute/containers.py
--- old/panflute-1.11.2/panflute/containers.py 2019-01-21 10:00:26.000000000
+0100
+++ new/panflute-1.12.5/panflute/containers.py 2020-02-20 06:52:03.000000000
+0100
@@ -2,26 +2,13 @@
These containers keep track of the identity of the parent
object, and the attribute of the parent object that they correspond to.
"""
-from __future__ import print_function
-from __future__ import unicode_literals
-from __future__ import division
-from __future__ import absolute_import
# ---------------------------
# Imports
# ---------------------------
-from future import standard_library
-standard_library.install_aliases()
-import sys
-py2 = sys.version_info[0] == 2
-if py2: str = basestring
-
-if py2:
- from collections import OrderedDict, MutableSequence, MutableMapping
-else:
- from collections import OrderedDict
- from collections.abc import MutableSequence, MutableMapping
+from collections import OrderedDict
+from collections.abc import MutableSequence, MutableMapping
from .utils import check_type, encode_dict # check_group
@@ -52,11 +39,7 @@
__slots__ = ['list', 'oktypes', 'parent', 'location']
- def __init__(self, *args, **_3to2kwargs):
- if 'parent' in _3to2kwargs: parent = _3to2kwargs['parent']; del
_3to2kwargs['parent']
- else: parent = None
- if 'oktypes' in _3to2kwargs: oktypes = _3to2kwargs['oktypes']; del
_3to2kwargs['oktypes']
- else: oktypes = object
+ def __init__(self, *args, oktypes=object, parent=None):
self.oktypes = oktypes
self.parent = parent
self.location = None # Cannot be set through __init__
@@ -84,7 +67,10 @@
del self.list[i]
def __setitem__(self, i, v):
- v = check_type(v, self.oktypes)
+ if isinstance(i, slice):
+ v = (check_type(x, self.oktypes) for x in v)
+ else:
+ v = check_type(v, self.oktypes)
self.list[i] = v
def insert(self, i, v):
@@ -116,11 +102,7 @@
__slots__ = ['dict', 'oktypes', 'parent', 'location']
- def __init__(self, *args, **kwargs):
- if 'parent' in kwargs: parent = kwargs['parent']; del kwargs['parent']
- else: parent = None
- if 'oktypes' in kwargs: oktypes = kwargs['oktypes']; del
kwargs['oktypes']
- else: oktypes = object
+ def __init__(self, *args, oktypes=object, parent=None, **kwargs):
self.oktypes = oktypes
self.parent = parent
self.location = None
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/elements.py
new/panflute-1.12.5/panflute/elements.py
--- old/panflute-1.11.2/panflute/elements.py 2019-01-21 10:00:33.000000000
+0100
+++ new/panflute-1.12.5/panflute/elements.py 2020-02-20 06:52:03.000000000
+0100
@@ -1,25 +1,17 @@
-from __future__ import unicode_literals
-from __future__ import print_function
-from __future__ import division
-from __future__ import absolute_import
+"""
+Classes corresponding to Pandoc elements
+"""
+
# ---------------------------
# Imports
# ---------------------------
-from builtins import dict
-from builtins import str
-from future import standard_library
-standard_library.install_aliases()
from collections import OrderedDict
from .utils import check_type, check_group, encode_dict
from .containers import ListContainer, DictContainer
from .base import Element, Block, Inline, MetaValue
-import sys
-py2 = sys.version_info[0] == 2
-if py2: str = basestring
-
# ---------------------------
# Special Root Class
@@ -56,13 +48,7 @@
_children = ['metadata', 'content']
- def __init__(self, *args, **_3to2kwargs):
- if 'api_version' in _3to2kwargs: api_version =
_3to2kwargs['api_version']; del _3to2kwargs['api_version']
- else: api_version = None
- if 'format' in _3to2kwargs: format = _3to2kwargs['format']; del
_3to2kwargs['format']
- else: format = 'html'
- if 'metadata' in _3to2kwargs: metadata = _3to2kwargs['metadata']; del
_3to2kwargs['metadata']
- else: metadata = {}
+ def __init__(self, *args, metadata={}, format='html', api_version=None):
self._set_content(args, Block)
self.metadata = metadata
self.format = format # Output format
@@ -373,18 +359,11 @@
__slots__ = ['level', '_content', 'identifier', 'classes', 'attributes']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'attributes' in _3to2kwargs: attributes =
_3to2kwargs['attributes']; del _3to2kwargs['attributes']
- else: attributes = {}
- if 'classes' in _3to2kwargs: classes = _3to2kwargs['classes']; del
_3to2kwargs['classes']
- else: classes = []
- if 'identifier' in _3to2kwargs: identifier =
_3to2kwargs['identifier']; del _3to2kwargs['identifier']
- else: identifier = ''
- if 'level' in _3to2kwargs: level = _3to2kwargs['level']; del
_3to2kwargs['level']
- else: level = 1
+ def __init__(self, *args, level=1,
+ identifier='', classes=[], attributes={}):
self.level = check_type(level, int)
- if not 0 < self.level <= 6:
- raise TypeError('Header level not between 1 and 6')
+ if not 0 < self.level <= 10:
+ raise TypeError('Header level not between 1 and 10')
self._set_ica(identifier, classes, attributes)
self._set_content(args, Inline)
@@ -409,13 +388,7 @@
__slots__ = ['_content', 'identifier', 'classes', 'attributes']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'attributes' in _3to2kwargs: attributes =
_3to2kwargs['attributes']; del _3to2kwargs['attributes']
- else: attributes = {}
- if 'classes' in _3to2kwargs: classes = _3to2kwargs['classes']; del
_3to2kwargs['classes']
- else: classes = []
- if 'identifier' in _3to2kwargs: identifier =
_3to2kwargs['identifier']; del _3to2kwargs['identifier']
- else: identifier = ''
+ def __init__(self, *args, identifier='', classes=[], attributes={}):
self._set_ica(identifier, classes, attributes)
self._set_content(args, Block)
@@ -440,13 +413,7 @@
__slots__ = ['_content', 'identifier', 'classes', 'attributes']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'attributes' in _3to2kwargs: attributes =
_3to2kwargs['attributes']; del _3to2kwargs['attributes']
- else: attributes = {}
- if 'classes' in _3to2kwargs: classes = _3to2kwargs['classes']; del
_3to2kwargs['classes']
- else: classes = []
- if 'identifier' in _3to2kwargs: identifier =
_3to2kwargs['identifier']; del _3to2kwargs['identifier']
- else: identifier = ''
+ def __init__(self, *args, identifier='', classes=[], attributes={}):
self._set_ica(identifier, classes, attributes)
self._set_content(args, Inline)
@@ -467,9 +434,7 @@
__slots__ = ['quote_type', '_content']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'quote_type' in _3to2kwargs: quote_type =
_3to2kwargs['quote_type']; del _3to2kwargs['quote_type']
- else: quote_type = 'DoubleQuote'
+ def __init__(self, *args, quote_type='DoubleQuote'):
self.quote_type = check_group(quote_type, QUOTE_TYPES)
self._set_content(args, Inline)
@@ -495,9 +460,7 @@
__slots__ = ['_content', '_citations']
_children = ['content', 'citations']
- def __init__(self, *args, **_3to2kwargs):
- if 'citations' in _3to2kwargs: citations = _3to2kwargs['citations'];
del _3to2kwargs['citations']
- else: citations = []
+ def __init__(self, *args, citations=[]):
self._set_content(args, Inline)
self.citations = citations
@@ -615,17 +578,8 @@
'identifier', 'classes', 'attributes']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'attributes' in _3to2kwargs: attributes =
_3to2kwargs['attributes']; del _3to2kwargs['attributes']
- else: attributes = {}
- if 'classes' in _3to2kwargs: classes = _3to2kwargs['classes']; del
_3to2kwargs['classes']
- else: classes = []
- if 'identifier' in _3to2kwargs: identifier =
_3to2kwargs['identifier']; del _3to2kwargs['identifier']
- else: identifier = ''
- if 'title' in _3to2kwargs: title = _3to2kwargs['title']; del
_3to2kwargs['title']
- else: title = ''
- if 'url' in _3to2kwargs: url = _3to2kwargs['url']; del
_3to2kwargs['url']
- else: url = ''
+ def __init__(self, *args, url='', title='',
+ identifier='', classes=[], attributes={}):
self._set_content(args, Inline)
self._set_ica(identifier, classes, attributes)
self.url = check_type(url, str)
@@ -659,17 +613,8 @@
'identifier', 'classes', 'attributes']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'attributes' in _3to2kwargs: attributes =
_3to2kwargs['attributes']; del _3to2kwargs['attributes']
- else: attributes = {}
- if 'classes' in _3to2kwargs: classes = _3to2kwargs['classes']; del
_3to2kwargs['classes']
- else: classes = []
- if 'identifier' in _3to2kwargs: identifier =
_3to2kwargs['identifier']; del _3to2kwargs['identifier']
- else: identifier = ''
- if 'title' in _3to2kwargs: title = _3to2kwargs['title']; del
_3to2kwargs['title']
- else: title = ''
- if 'url' in _3to2kwargs: url = _3to2kwargs['url']; del
_3to2kwargs['url']
- else: url = ''
+ def __init__(self, *args, url='', title='',
+ identifier='', classes=[], attributes={}):
self._set_content(args, Inline)
self._set_ica(identifier, classes, attributes)
self.url = check_type(url, str)
@@ -736,7 +681,7 @@
:param text: a string of raw text with another underlying format
:type text: :class:`str`
- :param format: Format of the raw text ('html', 'tex', 'latex' or 'context')
+ :param format: Format of the raw text ('html', 'tex', 'latex', 'context',
etc.)
:type format: ``str``
:Base: :class:`Block`
"""
@@ -807,7 +752,7 @@
:param text: a string of raw text with another underlying format
:type text: :class:`str`
- :param format: Format of the raw text ('html', 'tex', 'latex' or 'context')
+ :param format: Format of the raw text ('html', 'tex', 'latex', 'context',
etc.)
:type format: ``str``
:Base: :class:`Inline`
"""
@@ -881,13 +826,7 @@
__slots__ = ['_content', 'start', 'style', 'delimiter']
_children = ['content']
- def __init__(self, *args, **_3to2kwargs):
- if 'delimiter' in _3to2kwargs: delimiter = _3to2kwargs['delimiter'];
del _3to2kwargs['delimiter']
- else: delimiter = 'Period'
- if 'style' in _3to2kwargs: style = _3to2kwargs['style']; del
_3to2kwargs['style']
- else: style = 'Decimal'
- if 'start' in _3to2kwargs: start = _3to2kwargs['start']; del
_3to2kwargs['start']
- else: start = 1
+ def __init__(self, *args, start=1, style='Decimal', delimiter='Period'):
self._set_content(args, ListItem)
self.start = check_type(start, int)
self.style = check_group(style, LIST_NUMBER_STYLES)
@@ -1113,42 +1052,50 @@
'alignment', 'width', 'rows', 'cols']
_children = ['header', 'content', 'caption']
- def __init__(self, *args, **_3to2kwargs):
- if 'width' in _3to2kwargs: width = _3to2kwargs['width']; del
_3to2kwargs['width']
- else: width = None
- if 'alignment' in _3to2kwargs: alignment = _3to2kwargs['alignment'];
del _3to2kwargs['alignment']
- else: alignment = None
- if 'caption' in _3to2kwargs: caption = _3to2kwargs['caption']; del
_3to2kwargs['caption']
- else: caption = None
- if 'header' in _3to2kwargs: header = _3to2kwargs['header']; del
_3to2kwargs['header']
- else: header = None
+ def __init__(self, *args, header=None, caption=None,
+ alignment=None, width=None):
+
self._set_content(args, TableRow)
- self.rows = len(self.content)
- self.cols = len(self.content[0].content)
self.header = header
self.caption = caption if caption else []
+ self.rows = len(self.content)
+ self.cols = 0
+
+ if self.content:
+ self.cols = len(self.content[0].content)
+
+ if self.header:
+ header_cols = len(self.header.content)
+ if not self.cols:
+ self.cols = header_cols
+ elif self.cols != header_cols:
+ msg = '\n\nInvalid number of header columns.'
+ msg += 'Expected {} but received {}\n'.format(self.cols,
header_cols)
+ raise IndexError(msg)
+
if alignment is None:
self.alignment = ['AlignDefault'] * self.cols
else:
- self.alignment = [check_group(a, TABLE_ALIGNMENT)
- for a in alignment]
- if len(self.alignment) != self.cols:
- raise IndexError('alignment has an incorrect number of cols')
+ self.alignment = [check_group(a, TABLE_ALIGNMENT) for a in
alignment]
+ if self.cols != len(self.alignment):
+ msg = '\n\nInvalid number of alignment columns.'
+ msg += 'Expected {} but received {}\n'.format(self.cols,
len(self.alignment))
+ raise IndexError(msg)
if width is None:
self.width = [0.0] * self.cols
else:
self.width = [check_type(w, (float, int)) for w in width]
- if len(self.width) != self.cols:
- raise IndexError('width has an incorrect number of cols')
+ if self.cols != len(self.width):
+ msg = '\n\nInvalid number of width columns.'
+ msg += 'Expected {} but received {}\n'.format(self.cols,
len(self.width))
+ raise IndexError(msg)
+
@property
def header(self):
- if self._header is not None:
- self._header.parent = self
- self._header.location = 'header'
return self._header
@header.setter
@@ -1159,8 +1106,10 @@
value = value.content if isinstance(value, TableRow) else list(value)
self._header = TableRow(*value)
- if len(value) != self.cols:
- msg = 'table header has an incorrect number of cols:'
+ self._header.parent = self
+ self._header.location = 'header'
+ if hasattr(self, 'cols') and len(value) != self.cols:
+ msg = 'table header has an incorrect number of columns:'
msg += ' {} rows but expected {}'.format(len(value), self.cols)
raise IndexError(msg)
@@ -1378,8 +1327,45 @@
MATH_FORMATS = {'DisplayMath', 'InlineMath'}
-RAW_FORMATS = {'html', 'tex', 'latex', 'context', 'rtf', 'opendocument',
- 'noteref', 'openxml', 'icml'}
+RAW_FORMATS = {'tex',
+ 'latex',
+ 'html',
+ 'context',
+ 'rtf',
+ 'opendocument',
+ 'noteref',
+ 'openxml',
+ 'icml',
+ 'commonmark',
+ 'creole',
+ 'docbook',
+ 'docx',
+ 'dokuwiki',
+ 'epub',
+ 'fb2',
+ 'gfm',
+ 'haddock',
+ 'ipynb',
+ 'jats',
+ 'json',
+ 'man',
+ 'markdown',
+ 'markdown_github',
+ 'markdown_mmd',
+ 'markdown_phpextra',
+ 'markdown_strict',
+ 'mediawiki',
+ 'muse',
+ 'native',
+ 'odt',
+ 'opml',
+ 'org',
+ 'rst',
+ 't2t',
+ 'textile',
+ 'tikiwiki',
+ 'twiki',
+ 'vimwiki'}
SPECIAL_ELEMENTS = LIST_NUMBER_STYLES | LIST_NUMBER_DELIMITERS | \
MATH_FORMATS | TABLE_ALIGNMENT | QUOTE_TYPES | CITATION_MODE
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/io.py
new/panflute-1.12.5/panflute/io.py
--- old/panflute-1.11.2/panflute/io.py 2019-01-21 10:00:27.000000000 +0100
+++ new/panflute-1.12.5/panflute/io.py 2020-02-20 06:52:03.000000000 +0100
@@ -1,13 +1,12 @@
-from __future__ import unicode_literals
-from __future__ import print_function
-from __future__ import division
-from __future__ import absolute_import
+"""
+I/O related functions
+"""
+
+
# ---------------------------
# Imports
# ---------------------------
-from future import standard_library
-standard_library.install_aliases()
from .elements import Element, Doc, from_json, ListContainer
# These will get modified if using Pandoc legacy (<1.8)
@@ -22,8 +21,6 @@
from collections import OrderedDict
from functools import partial
-py2 = sys.version_info[0] == 2
-
# ---------------------------
# Functions
@@ -56,7 +53,7 @@
"""
if input_stream is None:
- input_stream = io.open(sys.stdin.fileno()) if py2 else
io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
+ input_stream = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')
# Load JSON and validate it
doc = json.load(input_stream, object_pairs_hook=from_json)
@@ -130,9 +127,12 @@
(default is :data:`sys.stdout`)
"""
- assert type(doc) == Doc, "panflute.dump needs input of type panflute.Doc"
+ if not isinstance(doc, Doc):
+ msg = 'panflute.dump needs input of type "panflute.Doc" but received
one of type "{}"'.format(type(doc).__name__)
+ raise TypeError(msg)
+
if output_stream is None:
- sys.stdout = codecs.getwriter("utf-8")(sys.stdout) if py2 else
codecs.getwriter("utf-8")(sys.stdout.detach())
+ sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
output_stream = sys.stdout
# Switch to legacy JSON output; eg: {'t': 'Space', 'c': []}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/tools.py
new/panflute-1.12.5/panflute/tools.py
--- old/panflute-1.11.2/panflute/tools.py 2019-01-21 10:00:29.000000000
+0100
+++ new/panflute-1.12.5/panflute/tools.py 2020-02-20 06:52:03.000000000
+0100
@@ -1,13 +1,12 @@
-from __future__ import print_function
-from __future__ import unicode_literals
-from __future__ import division
-from __future__ import absolute_import
+"""
+Useful (but not essential) functions for writing panflute filters
+"""
+
+
# ---------------------------
# Imports
# ---------------------------
-from future import standard_library
-standard_library.install_aliases()
from .base import Element
from .elements import *
from .io import dump
@@ -20,20 +19,11 @@
import yaml
import shlex
-# shutil.which: new in version 3.3
-try:
- from shutil import which
-except ImportError:
- from shutilwhich import which
-
+from shutil import which
from subprocess import Popen, PIPE
from functools import partial
-py2 = sys.version_info[0] == 2
-if py2: str = basestring
-
-
# ---------------------------
# Constants
# ---------------------------
@@ -205,6 +195,14 @@
ans = ''
else:
ans = ''
+
+ # Add quotes around the contents of Quoted()
+ if type(e.parent) == Quoted:
+ if e.index == 0:
+ ans = '"' + ans
+ if e.index == len(e.container) - 1:
+ ans += '"'
+
answer.append(ans)
answer = []
@@ -338,8 +336,10 @@
proc = Popen([pandoc_path] + args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
out, err = proc.communicate(input=text.encode('utf-8'))
exitcode = proc.returncode
+ if err:
+ debug(err.decode('utf-8'))
if exitcode != 0:
- raise IOError(err)
+ raise IOError('')
return out.decode('utf-8')
@@ -522,10 +522,9 @@
def get_option(options=None, local_tag=None, doc=None, doc_tag=None,
default=None, error_on_none=True):
- """ fetch an option variable,
- from either a local (element) level option/attribute tag,
- document level metadata tag,
- or a default
+ """
+ Fetch an option variable from either a local (element) level
option/attribute tag,
+ a document level metadata tag, or a default.
:type options: ``dict``
:type local_tag: ``str``
@@ -539,9 +538,13 @@
Also, if error_on_none=True and the final variable is None, then a
ValueError will be raised
In this manner you can set global variables, which can be optionally
overriden at a local level.
- For example, to apply different styles to docx text
+ For example, the two files below show how to apply different styles to
docx text:
+
+ **main.md:**
+
+ .. code-block:: none
+ :linenos:
- main.md:
------------------
style-div:
name: MyStyle
@@ -555,7 +558,11 @@
some more text
:::
- style_filter.py:
+ **style_filter.py:**
+
+ .. code-block:: python
+ :linenos:
+
import panflute as pf
def action(elem, doc):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/utils.py
new/panflute-1.12.5/panflute/utils.py
--- old/panflute-1.11.2/panflute/utils.py 2019-01-21 10:00:27.000000000
+0100
+++ new/panflute-1.12.5/panflute/utils.py 2020-02-20 06:52:03.000000000
+0100
@@ -1,17 +1,11 @@
"""
Auxiliary functions that have no dependencies
"""
-from __future__ import unicode_literals
-from __future__ import print_function
-from __future__ import division
-from __future__ import absolute_import
+
# ---------------------------
# Imports
# ---------------------------
-from future import standard_library
-standard_library.install_aliases()
-from builtins import object
from collections import OrderedDict
import sys
import os.path as p
@@ -22,16 +16,48 @@
# Functions
# ---------------------------
+
+def get_caller_name():
+ '''Get the name of the calling Element
+
+ This is just the name of the Class of the __init__ calling function
+ '''
+
+ # References:
+ #
https://jugad2.blogspot.com/2015/09/find-caller-and-callers-caller-of.html
+ # https://stackoverflow.com/a/47956089/3977107
+ # https://stackoverflow.com/a/11799376/3977107
+
+ pos = 1
+ while True:
+ pos += 1
+ try:
+ callingframe = sys._getframe(pos)
+ except ValueError:
+ return 'Panflute'
+ #print(pos, callingframe.f_code.co_name, file=sys.stderr)
+
+ if callingframe.f_code.co_name == '__init__':
+ class_name = callingframe.f_locals['self'].__class__.__name__
+ if 'Container' not in class_name:
+ return class_name
+
+
def check_type(value, oktypes):
# This allows 'Space' instead of 'Space()'
if callable(value):
value = value()
- if not isinstance(value, oktypes):
- tag = type(value).__name__
- msg = 'received {} but expected {}'.format(tag, oktypes)
- raise TypeError(msg)
- else:
+
+ if isinstance(value, oktypes):
return value
+
+ # Invalid type
+ caller = get_caller_name()
+ tag = type(value).__name__
+ #oktypes_names = [x.name for x in oktypes]
+ #print(oktypes, file=sys.stderr)
+ msg = '\n\nElement "{}" received "{}" but expected {}\n'.format(caller,
tag, oktypes)
+ raise TypeError(msg)
def check_group(value, group):
@@ -51,7 +77,7 @@
# Classes
# ---------------------------
-class ContextImport(object):
+class ContextImport:
"""
Import module context manager.
Temporarily prepends extra dir
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute/version.py
new/panflute-1.12.5/panflute/version.py
--- old/panflute-1.11.2/panflute/version.py 2019-01-21 09:59:30.000000000
+0100
+++ new/panflute-1.12.5/panflute/version.py 2020-02-20 06:52:03.000000000
+0100
@@ -1 +1,5 @@
-__version__ = '1.11.2'
+"""
+Panflute version
+"""
+
+__version__ = '1.12.5'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute.egg-info/PKG-INFO
new/panflute-1.12.5/panflute.egg-info/PKG-INFO
--- old/panflute-1.11.2/panflute.egg-info/PKG-INFO 2019-01-21
10:00:44.000000000 +0100
+++ new/panflute-1.12.5/panflute.egg-info/PKG-INFO 2020-02-20
06:52:18.000000000 +0100
@@ -1,95 +1,61 @@
Metadata-Version: 2.1
Name: panflute
-Version: 1.11.2
+Version: 1.12.5
Summary: Pythonic Pandoc filters
Home-page: https://github.com/sergiocorreia/panflute
Author: Sergio Correia
Author-email: [email protected]
License: BSD3
-Description: :Date: January 21, 2019
+Description: # Panflute: Pythonic Pandoc Filters
- .. contents::
- :depth: 3
- ..
-
- Panflute: Pythonic Pandoc Filters
- =================================
-
- |Python version| |PyPI version| |Development Status| |Build Status|
-
- `panflute <http://scorreia.com/software/panflute/>`__ is a Python
- package that makes creating Pandoc filters fun.
-
- For a detailed user guide, documentation, and installation
instructions,
- see http://scorreia.com/software/panflute/. For examples that you can
- use as starting points, check the `examples
- repo
<https://github.com/sergiocorreia/panflute-filters/tree/master/filters>`__,
- the `sample
- template
<https://raw.githubusercontent.com/sergiocorreia/panflute/master/docs/source/_static/template.py>`__,
- or `this github
- search
<https://github.com/search?o=desc&q=%22import+panflute%22+OR+%22from+panflute%22+created%3A%3E2016-01-01+language%3APython+extension%3Apy&s=indexed&type=Code&utf8=%E2%9C%93>`__.
- If you want to contribute, head `here </CONTRIBUTING.md>`__.
+ [](https://pypi.python.org/pypi/panflute/)
+ [](https://pypi.python.org/pypi/panflute/)
+ [](https://pypi.python.org/pypi/panflute/)
+ [](https://github.com/sergiocorreia/panflute/actions?query=workflow%3A%22CI+Tests%22)
- Install
- -------
+ [panflute](http://scorreia.com/software/panflute/) is a Python package
that makes creating Pandoc filters fun.
- To install panflute, open the command line and type:
+ For a detailed user guide, documentation, and installation
instructions, see
+ <http://scorreia.com/software/panflute/>.
+ For examples that you can use as starting points, check the [examples
repo](https://github.com/sergiocorreia/panflute-filters/tree/master/filters),
the [sample
template](https://raw.githubusercontent.com/sergiocorreia/panflute/master/docs/source/_static/template.py),
or [this github
search](https://github.com/search?o=desc&q=%22import+panflute%22+OR+%22from+panflute%22+created%3A%3E2016-01-01+language%3APython+extension%3Apy&s=indexed&type=Code&utf8=%E2%9C%93).
+ If you want to contribute, head [here](/CONTRIBUTING.md).
+
+ You might also find useful [this
presentation](https://github.com/BPLIM/Workshops/raw/master/BPLIM2019/D2_S1_Sergio_Correia_Markdown.pdf)
on how I use markdown+pandoc+panflute to write research papers (at the Banco
de Portugal 2019 Workshop on Reproductible Research).
- .. code:: bash
- pip install panflute
+ ## Install
+
+ To install panflute, open the command line and type:
- Python 2.7+, 3.3+, PyPy, and PyPy3 are supported.
+ ```bash
+ pip install panflute
+ ```
- Uninstall
- ---------
+ Python 3.6+ and PyPy3 are supported (Python 2.7 and Python 3.3-3.5
were supported up to version 1.11.4).
- .. code:: bash
+ ## Uninstall
- pip uninstall panflute
+ ```bash
+ pip uninstall panflute
+ ```
- Dev Install
- -----------
+ ## Dev Install
After cloning the repo and opening the panflute folder:
- ``python setup.py install``
- installs the package locally
- ``python setup.py develop``
- installs locally with a symlink so changes are automatically updated
-
- In addition, if you use python2, you need to pasteurize the code before
- running tests. In this directory, Run
-
- .. code:: bash
-
- # install pasteurize if you didn't have it yet
- pip2 install -U future
- pasteurize -wnj 4 .
-
- Contributing
- ------------
-
- Feel free to submit push requests. For consistency, code should comply
- with `pep8 <https://pypi.python.org/pypi/pep8>`__ (as long as its
- reasonable), and with the style guides by
- [@kennethreitz](http://docs.python-guide.org/en/latest/writing/style/)
- and `google <http://google.github.io/styleguide/pyguide.html>`__. Read
- more `here </CONTRIBUTING.md>`__.
-
- License
- -------
-
- BSD3 license (following ``pandocfilters`` by @jgm).
-
- .. |Python version| image::
https://img.shields.io/pypi/pyversions/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
- .. |PyPI version| image:: https://img.shields.io/pypi/v/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
- .. |Development Status| image::
https://img.shields.io/pypi/status/panflute.svg
- :target: https://pypi.python.org/pypi/panflute/
- .. |Build Status| image::
https://travis-ci.org/sergiocorreia/panflute.svg?branch=master
- :target: https://travis-ci.org/sergiocorreia/panflute
+ `python setup.py install`: installs the package locally
+
+ `python setup.py develop`: installs locally with a symlink so changes
are automatically updated
+
+
+ ## Contributing
+
+ Feel free to submit push requests. For consistency, code should comply
with [pep8](https://pypi.python.org/pypi/pep8) (as long as its reasonable), and
with the style guides by
[@kennethreitz](http://docs.python-guide.org/en/latest/writing/style/) and
[google](http://google.github.io/styleguide/pyguide.html). Read more
[here](/CONTRIBUTING.md).
+
+ ## License
+
+ BSD3 license (following `pandocfilters` by @jgm).
+
Keywords: pandoc pandocfilters markdown latex
Platform: UNKNOWN
@@ -101,14 +67,11 @@
Classifier: License :: OSI Approved :: BSD License
Classifier: Operating System :: OS Independent
Classifier: Topic :: Text Processing :: Filters
-Classifier: Programming Language :: Python :: 2
-Classifier: Programming Language :: Python :: 2.7
-Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
-Provides-Extra: pypi
+Description-Content-Type: text/markdown
Provides-Extra: test
+Provides-Extra: pypi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute.egg-info/SOURCES.txt
new/panflute-1.12.5/panflute.egg-info/SOURCES.txt
--- old/panflute-1.11.2/panflute.egg-info/SOURCES.txt 2019-01-21
10:00:45.000000000 +0100
+++ new/panflute-1.12.5/panflute.egg-info/SOURCES.txt 2020-02-20
06:52:18.000000000 +0100
@@ -1,7 +1,7 @@
LICENSE
MANIFEST.in
README.md
-README.rst
+requirements.txt
setup.cfg
setup.py
panflute/__init__.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/panflute.egg-info/requires.txt
new/panflute-1.12.5/panflute.egg-info/requires.txt
--- old/panflute-1.11.2/panflute.egg-info/requires.txt 2019-01-21
10:00:45.000000000 +0100
+++ new/panflute-1.12.5/panflute.egg-info/requires.txt 2020-02-20
06:52:18.000000000 +0100
@@ -1,6 +1,4 @@
pyyaml
-future
-shutilwhich
click
[pypi]
@@ -11,4 +9,3 @@
pandocfilters
configparser
pytest-cov
-future
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/requirements.txt
new/panflute-1.12.5/requirements.txt
--- old/panflute-1.11.2/requirements.txt 1970-01-01 01:00:00.000000000
+0100
+++ new/panflute-1.12.5/requirements.txt 2020-02-20 06:52:03.000000000
+0100
@@ -0,0 +1,2 @@
+pyyaml
+click
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/panflute-1.11.2/setup.py new/panflute-1.12.5/setup.py
--- old/panflute-1.11.2/setup.py 2019-01-21 09:59:30.000000000 +0100
+++ new/panflute-1.12.5/setup.py 2020-02-20 06:52:03.000000000 +0100
@@ -12,12 +12,12 @@
here = path.abspath(path.dirname(__file__))
# Get the long description from the README file
-try:
- with open(path.join(here, 'README.rst'), encoding='utf-8') as f:
- long_description = f.read()
-except (IOError):
- with open(path.join(here, 'README.md'), encoding='utf-8') as f:
- long_description = f.read()
+with open(path.join(here, 'README.md'), encoding='utf-8') as f:
+ long_description = f.read()
+
+# Get requirements from 'requirements.txt'
+with open(path.join(here, 'requirements.txt'), encoding='utf-8') as f:
+ requirements = [x.strip() for x in f.readlines()]
# Import version number
version = {}
@@ -35,6 +35,7 @@
description='Pythonic Pandoc filters',
long_description=long_description,
+ long_description_content_type='text/markdown',
# The project's main homepage.
url='https://github.com/sergiocorreia/panflute',
@@ -70,10 +71,6 @@
# Specify the Python versions you support here. In particular, ensure
# that you indicate whether you support Python 2, Python 3 or both.
# https://pypi.python.org/pypi?%3Aaction=list_classifiers
- 'Programming Language :: Python :: 2',
- 'Programming Language :: Python :: 2.7',
- 'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8',
@@ -96,7 +93,7 @@
# your project is installed. For an analysis of "install_requires" vs pip's
# requirements files see:
# https://packaging.python.org/en/latest/requirements.html
- install_requires=['pyyaml', 'future', 'shutilwhich', 'click'],
+ install_requires=requirements,
# List additional groups of dependencies here (e.g. development
# dependencies). You can install these using the following syntax,
@@ -104,7 +101,7 @@
# $ pip install -e .[dev,test]
extras_require={
# 'dev': ['check-manifest'],
- 'test': ['pandocfilters', 'configparser', 'pytest-cov', 'future'],
+ 'test': ['pandocfilters', 'configparser', 'pytest-cov'],
'pypi': ['docutils', 'Pygments']
},