summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Diemer <github.com@jensdiemer.de>2020-02-01 14:17:08 +0100
committerGitHub <noreply@github.com>2020-02-01 14:17:08 +0100
commit69037331053950a1a03324ef3486769cc88ed591 (patch)
tree76e6c940c9a96eab032bf95ffbf3d5b0eb910371
parent5c2ac71e9f92692dfcd152b8b449c7775bda9319 (diff)
parent3a86cb5bb14ec4b49547bfa717edc554d03b59ba (diff)
downloadcreole-69037331053950a1a03324ef3486769cc88ed591.tar.gz
Merge pull request #41 from jedie/fix-readme
Helper to build and upload to PyPi, with prechecks and update README.rst from README.creole
-rw-r--r--.github/workflows/pythonapp.yml35
-rw-r--r--.gitignore1
-rw-r--r--README.creole1
-rw-r--r--README.rst619
-rw-r--r--creole/__init__.py11
-rw-r--r--creole/setup_utils.py260
-rw-r--r--pyproject.toml12
7 files changed, 877 insertions, 62 deletions
diff --git a/.github/workflows/pythonapp.yml b/.github/workflows/pythonapp.yml
index 620ca27..c0dd6a5 100644
--- a/.github/workflows/pythonapp.yml
+++ b/.github/workflows/pythonapp.yml
@@ -1,49 +1,46 @@
name: test
-on: [push]
+on:
+ schedule:
+ - cron: '0 8 * * *'
+ push:
jobs:
test:
runs-on: ubuntu-latest
+ strategy:
+ max-parallel: 4
+ matrix:
+ python-version: [3.8, 3.7, 3.6]
steps:
- uses: actions/checkout@v1
- - name: Set up Python 3.7
+ - name: 'Set up Python ${{ matrix.python-version }}'
uses: actions/setup-python@v1
with:
- python-version: 3.7
+ python-version: '${{ matrix.python-version }}'
- - name: Install package
+ - name: 'Install package'
run: |
make install-poetry
source $HOME/.poetry/env
make install
- - name: List installed packages
+ - name: 'List installed packages'
run: |
source $HOME/.poetry/env
poetry run pip freeze
- - name: List all tox test environments
+ - name: 'List all tox test environments'
run: |
source $HOME/.poetry/env
make tox-listenvs
- - name: Run linters
+ - name: 'Run linters'
run: |
source $HOME/.poetry/env
make lint
- - name: Run tests with Python v3.8
+ - name: 'Run tests with Python v${{ matrix.python-version }}'
run: |
source $HOME/.poetry/env
- make tox-py38
-
- - name: Run tests with Python v3.7
- run: |
- source $HOME/.poetry/env
- make tox-py37
-
- - name: Run tests with Python v3.6
- run: |
- source $HOME/.poetry/env
- make tox-py36
+ make pytest
diff --git a/.gitignore b/.gitignore
index 3d914c2..3ed4524 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
*.egg-info
/dist
/build
+/publish.log
.idea
/poetry.lock
diff --git a/README.creole b/README.creole
index f656531..ea48cdb 100644
--- a/README.creole
+++ b/README.creole
@@ -22,6 +22,7 @@ The creole2html part based on the creole markup parser and emitter from the Moin
| {{https://travis-ci.org/jedie/python-creole.svg|Build Status on travis-ci.org}} | [[https://travis-ci.org/jedie/python-creole/|travis-ci.org/jedie/python-creole]] |
| {{https://coveralls.io/repos/jedie/python-creole/badge.svg|Coverage Status on coveralls.io}} | [[https://coveralls.io/r/jedie/python-creole|coveralls.io/r/jedie/python-creole]] |
| {{https://landscape.io/github/jedie/python-creole/master/landscape.svg|Status on landscape.io}} | [[https://landscape.io/github/jedie/python-creole/master|landscape.io/github/jedie/python-creole/master]] |
+| {{https://badge.fury.io/py/python-creole.svg|PyPi version}} | [[https://pypi.org/project/python-creole/|pypi.org/project/python-creole/]] |
= install =
diff --git a/README.rst b/README.rst
new file mode 100644
index 0000000..af848fb
--- /dev/null
+++ b/README.rst
@@ -0,0 +1,619 @@
+===================
+about python-creole
+===================
+
+python-creole is a OpenSource (GPL) Python lib for converting markups.
+python-creole is pure python. No external libs needed.
+
+Compatible Python Versions (see `tox.ini <https://github.com/jedie/python-creole/blob/master/tox.ini>`_ or `.travis.yml <https://github.com/jedie/python-creole/blob/master/.travis.yml>`_):
+
+* 3.8, 3.7, 3.6
+
+* PyPy3
+
+Existing converters:
+
+* creole -> html
+
+* html -> creole markup
+
+* reSt -> html (for clean html code)
+
+* html -> reStructuredText markup (only a subset of reSt supported)
+
+* html -> textile markup (not completed yet)
+
+The creole2html part based on the creole markup parser and emitter from the MoinMoin project by Radomir Dopieralski and Thomas Waldmann.
+
++-----------------------------------+
+| |Build Status on github| |
++-----------------------------------+
+| |Build Status on travis-ci.org| |
++-----------------------------------+
+| |Coverage Status on coveralls.io| |
++-----------------------------------+
+| |Status on landscape.io| |
++-----------------------------------+
+
+.. |Build Status on github| image:: https://github.com/jedie/python-creole/workflows/test/badge.svg?branch=master
+.. |Build Status on travis-ci.org| image:: https://travis-ci.org/jedie/python-creole.svg
+.. _travis-ci.org/jedie/python-creole: https://travis-ci.org/jedie/python-creole/
+.. |Coverage Status on coveralls.io| image:: https://coveralls.io/repos/jedie/python-creole/badge.svg
+.. _coveralls.io/r/jedie/python-creole: https://coveralls.io/r/jedie/python-creole
+.. |Status on landscape.io| image:: https://landscape.io/github/jedie/python-creole/master/landscape.svg
+.. _landscape.io/github/jedie/python-creole/master: https://landscape.io/github/jedie/python-creole/master
+
+=======
+install
+=======
+
+Python packages available on: `http://pypi.python.org/pypi/python-creole/ <http://pypi.python.org/pypi/python-creole/>`_
+
+::
+
+ ~$ pip install python-creole
+
+To setup a virtualenv via Poetry, see ``unittests`` section below.
+
+------------
+dependencies
+------------
+
+For the most parts (``creole2html`` and ``html2creole``) no external libraries are needed.
+
+For all functionality (and running the unittests) these modules are needed:
+
+* `docutils <http://pypi.python.org/pypi/docutils/>`_ (for the ReStructuredText stuff)
+
+* `textile <http://pypi.python.org/pypi/textile/>`_ (for html2textile tests)
+
+=======
+example
+=======
+
+-----------
+creole2html
+-----------
+
+Convert creole markup to html code:
+
+::
+
+ >>> from creole import creole2html
+ >>> creole2html("This is **creole //markup//**")
+ u'<p>This is <strong>creole <i>markup</i></strong></p>\n'
+
+-----------
+html2creole
+-----------
+
+Convert html code back into creole markup:
+
+::
+
+ >>> from creole import html2creole
+ >>> html2creole(u'<p>This is <strong>creole <i>markup</i></strong></p>\n')
+ u'This is **creole //markup//**'
+
+---------
+rest2html
+---------
+
+Convert ReStructuredText into clean html code (needs `docutils`_):
+
+::
+
+ >>> from creole.rest2html.clean_writer import rest2html
+ >>> rest2html(u"A ReSt link to `PyLucid CMS <http://www.pylucid.org>`_ :)")
+ u'<p>A ReSt link to <a href="http://www.pylucid.org">PyLucid CMS</a> :)</p>\\n'
+
+(more information: `rest2html wiki page <https://github.com/jedie/python-creole/wiki/rest2html>`_)
+
+---------
+html2rest
+---------
+
+Convert html code into ReStructuredText markup:
+
+::
+
+ >>> from creole import html2rest
+ >>> html2rest(u'<p>This is <strong>ReStructuredText</strong> <em>markup</em>!</p>')
+ u'This is **ReStructuredText** *markup*!'
+
+------------
+html2textile
+------------
+
+Convert html code into textile markup
+
+::
+
+ >>> from creole import html2textile
+ >>> html2textile(u'<p>This is <strong>textile <i>markup</i></strong>!</p>')
+ u'This is *textile __markup__*!'
+
+See also: `http://github.com/jedie/python-creole/blob/master/demo.py <http://github.com/jedie/python-creole/blob/master/demo.py>`_
+
+=====================
+Image size additional
+=====================
+
+You can pass image width/height in image tags, e.g.:
+
+::
+
+ >>> from creole import creole2html
+ >>> creole_markup="""{{foobar.jpg|image title|90x160}}"""
+ >>> creole2html(creole_markup)
+ '<p><img src="foobar.jpg" title="image title" alt="image title" width="90" height="160" /></p>'
+
+The third part (``90x160``) is not in creole standard, you can force a *strict* mode, e.g.:
+
+::
+
+ >>> creole2html(creole_markup, strict=True)
+ '<p><img src="foobar.jpg" title="image title|90x160" alt="image title|90x160" /></p>'
+
+================================
+Source code highlighting support
+================================
+
+You can find a example macro which highlight source code thanks to the pygments
+library. It is located here: `/creole/shared/example_macros.py <https://github.com/jedie/python-creole/blob/master/creole/shared/example_macros.py>`_.
+Here is how to use it:
+
+::
+
+ >>> from creole import creole2html
+ >>> from creole.shared.example_macros import code
+ >>> creole_markup="""<<code ext=".py">>#some code\nprint('coucou')\n<</code>>"""
+ >>> creole2html(creole_markup, macros={'code': code})
+
+=====================
+commandline interface
+=====================
+
+If you have python-creole installed, you will get these simple CLI scripts:
+
+* creole2html
+
+* html2creole
+
+* html2rest
+
+* html2textile
+
+Here the ``--help`` output from ``html2creole``:
+
+::
+
+ $ html2creole --help
+ usage: html2creole [-h] [-v] [--encoding ENCODING] sourcefile destination
+
+ python-creole is an open-source (GPL) markup converter in pure Python for:
+ creole2html, html2creole, html2ReSt, html2textile
+
+ positional arguments:
+ sourcefile source file to convert
+ destination Output filename
+
+ optional arguments:
+ -h, --help show this help message and exit
+ -v, --version show program's version number and exit
+ --encoding ENCODING Codec for read/write file (default encoding: utf-8)
+
+Example to convert a html file into a creole file:
+
+::
+
+ $ html2creole foobar.html foobar.creole
+
+=============
+documentation
+=============
+
+We store documentation/examples into the project wiki:
+
+* `https://github.com/jedie/python-creole/wiki <https://github.com/jedie/python-creole/wiki>`_
+
+How to handle unknown html tags in html2creole:
+
+* `https://github.com/jedie/python-creole/wiki/Unknown-Html-Tags <https://github.com/jedie/python-creole/wiki/Unknown-Html-Tags>`_
+
+Contributers should take a look at this page:
+
+* `https://github.com/jedie/python-creole/wiki/Developer-Info <https://github.com/jedie/python-creole/wiki/Developer-Info>`_
+
+Creole Markup Cheat Sheet can be found here: `http://www.wikicreole.org/wiki/CheatSheet <http://www.wikicreole.org/wiki/CheatSheet>`_
+
+|Creole Markup Cheat Sheet|
+
+.. |Creole Markup Cheat Sheet| image:: http://www.wikicreole.org/imageServlet?page=CheatSheet%2Fcreole_cheat_sheet.png&width=340
+
+---------
+unittests
+---------
+
+::
+
+ # clone repository (or use your fork):
+ ~$ git clone https://github.com/jedie/python-creole.git
+ ~$ cd python-creole
+
+ # install or update poetry:
+ ~/python-crole$ make install-poetry
+
+ # install python-creole via poetry:
+ ~/python-crole$ make install
+
+ # Run pytest:
+ ~/python-crole$ make pytest
+
+ # Run pytest via tox with all environments:
+ ~/python-crole$ make tox
+
+ # Run pytest via tox with one Python version:
+ ~/python-crole$ make tox-py38
+ ~/python-crole$ make tox-py37
+ ~/python-crole$ make tox-py36
+
+--------------------
+Use creole in README
+--------------------
+
+With python-creole you can convert a README on-the-fly from creole into ReStructuredText in setup.py
+How to do this, read: `https://github.com/jedie/python-creole/wiki/Use-In-Setup <https://github.com/jedie/python-creole/wiki/Use-In-Setup>`_
+
+Note: In this case you must install **docutils**! See above.
+
+=======
+history
+=======
+
+* *dev* - `compare v1.4.1...master <https://github.com/jedie/python-creole/compare/v1.4.1...master>`_
+
+ * TBC
+
+* v1.4.1 - 2020-01-19 - `compare v1.4.0...master <https://github.com/jedie/python-creole/compare/v1.4.0...master>`_
+
+ * Remove Python v2 support code
+
+ * `Fix "Undefined substitution referenced" error <https://github.com/jedie/python-creole/issues/26>`_ contributed by dforsi
+
+ * `Fix regression in tests for setup_utils <https://github.com/jedie/python-creole/pull/37>`_ contributed by jugmac00
+
+ * Fix code style with: autopep8
+
+ * sort imports with isort
+
+ * change old ``%-formatted`` and ``.format(...)`` strings into Python 3.6+'s ``f-strings`` with flynt
+
+ * Activate linting in CI pipeline
+
+* v1.4.0 - 2020-01-19 - `compare v1.3.2...master <https://github.com/jedie/python-creole/compare/v1.3.2...master>`_
+
+ * modernize project:
+
+ * use poetry
+
+ * Add a ``Makefile``
+
+ * use pytest and tox
+
+ * remove Python v2 support
+
+ * Test with Python v3.6, v3.7 and v3.8
+
+* v1.3.2 - 2018-02-27 - `compare v1.3.1...v1.3.2 <https://github.com/jedie/python-creole/compare/v1.3.1...v1.3.2>`_
+
+ * Adding optional img size to creole2html and html2creole contributed by `John Dupuy <https://github.com/JohnAD>`_
+
+ * run tests also with python 3.5 and 3.6
+
+* v1.3.1 - 2015-08-15 - `compare v1.3.0...v1.3.1 <https://github.com/jedie/python-creole/compare/v1.3.0...v1.3.1>`_
+
+ * Bugfix for "Failed building wheel for python-creole"
+
+* v1.3.0 - 2015-06-02 - `compare v1.2.2...v1.3.0 <https://github.com/jedie/python-creole/compare/v1.2.2...v1.3.0>`_
+
+ * Refactory internal file structure
+
+ * run unittests and doctests with nose
+
+ * Refactor CLI tests
+
+ * skip official support for Python 2.6
+
+ * small code cleanups and fixes.
+
+ * use **json.dumps()** instead of **repr()** in some cases
+
+* v1.2.2 - 2015-04-05 - `compare v1.2.1...v1.2.2 <https://github.com/jedie/python-creole/compare/v1.2.1...v1.2.2>`_
+
+ * Bugfix textile unittests if url scheme is unknown
+
+ * migrate google-code Wiki to github and remove google-code links
+
+* v1.2.1 - 2014-09-14 - `compare v1.2.0...v1.2.1 <https://github.com/jedie/python-creole/compare/v1.2.0...v1.2.1>`_
+
+ * Use origin PyPi code to check generated reStructuredText in setup.py
+
+ * Update unitest for textile v2.1.8
+
+* v1.2.0 - 2014-05-15 - `compare v1.1.1...v1.2.0 <https://github.com/jedie/python-creole/compare/v1.1.1...v1.2.0>`_
+
+ * NEW: Add ``<<code>>`` example macro (Source code highlighting with pygments) - implemented by Julien Enselme
+
+ * NEW: Add ``<<toc>>`` macro to create a table of contents list
+
+ * Bugfix for: AttributeError: 'CreoleParser' object has no attribute '_escaped_char_repl'
+
+ * Bugfix for: AttributeError: 'CreoleParser' object has no attribute '_escaped_url_repl'
+
+ * API Change: Callable macros will raise a TypeError instead of create a DeprecationWarning (Was removed in v0.5)
+
+* v1.1.1 - 2013-11-08
+
+ * Bugfix: Setup script exited with error: can't copy 'README.creole': doesn't exist or not a regular file
+
+* v1.1.0 - 2013-10-28
+
+ * NEW: Simple commandline interface added.
+
+* v1.0.7 - 2013-08-07
+
+ * Bugfix in 'clean reStructuredText html writer' if docutils => v0.11 used.
+
+ * Bugfix for PyPy 2.1 usage
+
+* v1.0.6 - 2012-10-15
+
+ * Security fix in rest2html: Disable "file_insertion_enabled" and "raw_enabled" as default.
+
+* v1.0.5 - 2012-09-03
+
+ * made automatic protocol links more strict: Only whitespace before and at the end are allowed.
+
+ * Bugfix: Don't allow ``ftp:/broken`` (Only one slash) to be a link.
+
+* v1.0.4 - 2012-06-11
+
+ * html2rest: Handle double link/image substitution and raise better error messages
+
+ * Bugfix in unittests (include test README file in python package). Thanks to Wen Heping for reporting this.
+
+* v1.0.3 - 2012-06-11
+
+ * Bugfix: ``AttributeError: 'module' object has no attribute 'interesting_cdata'`` from HTMLParser patch. Thanks to Wen Heping for reporting this.
+
+ * Fix a bug in get_long_description() ReSt test for Py3k and his unittests.
+
+ * Use Travis CI, too.
+
+* v1.0.2 - 2012-04-04
+
+ * Fix "`AttributeError: 'NoneType' object has no attribute 'parent' <https://github.com/jedie/python-creole/issues/6>`_" in html2creole.
+
+* v1.0.1 - 2011-11-16
+
+ * Fix "`TypeError: expected string or buffer <https://github.com/jedie/python-creole/issues/5>`_" in rest2html.
+
+ * `Bugfix in exception handling. <https://github.com/jedie/python-creole/commit/e8422f944709a5f8c2c6a8c8a58a84a92620f035>`_
+
+* v1.0.0 - 2011-10-20
+
+ * Change API: Replace 'parser_kwargs' and 'emitter_kwargs' with separate arguments. (More information on `API Wiki Page <https://github.com/jedie/python-creole/wiki/API>`_)
+
+* v0.9.2
+
+ * Turn zip_safe in setup.py on and change unittests API.
+
+* v0.9.1
+
+ * Many Bugfixes, tested with CPython 2.6, 2.7, 3.2 and PyPy v1.6
+
+* v0.9.0
+
+ * Add Python v3 support (like `http://python3porting.com/noconv.html <http://python3porting.com/noconv.html>`_ strategy)
+
+ * move unittests into creole/tests/
+
+ * Tested with Python 2.7.1, 3.2 and PyPy v1.6.1 15798ab8cf48 jit
+
+* v0.8.5
+
+ * Bugfix in html2creole: ignore links without href
+
+* v0.8.4
+
+ * Bugfix in html parser if list tag has attributes: `https://code.google.com/p/python-creole/issues/detail?id=19#c4 <https://code.google.com/p/python-creole/issues/detail?id=19#c4>`_
+
+* v0.8.3
+
+ * Better error message if given string is not unicode: `https://code.google.com/p/python-creole/issues/detail?id=19 <https://code.google.com/p/python-creole/issues/detail?id=19>`_
+
+* v0.8.2
+
+ * Bugfix in get_long_description() error handling (*local variable 'long_description_origin' referenced before assignment*)
+
+* v0.8.1
+
+ * Bugfix for installation under python 2.5
+
+ * Note: `setup helper <https://github.com/jedie/python-creole/wiki/Use-In-Setup>`_ changed: rename ``GetLongDescription(...)`` to ``get_long_description(...)``
+
+* v0.8
+
+ * New GetLongDescription() helper for setup.py, see: `https://github.com/jedie/python-creole/wiki/Use-In-Setup`_
+
+* v0.7.3
+
+ * Bugfix in html2rest:
+
+ * table without ``<th>`` header
+
+ * new line after table
+
+ * create reference hyperlinks in table cells intead of embedded urls.
+
+ * Don't always use raise_unknown_node()
+
+ * Add child content to raise_unknown_node()
+
+* v0.7.2
+
+ * Activate ``----`` to ``<hr>`` in html2rest
+
+ * Update demo.py
+
+* v0.7.1
+
+ * Bugfix if docutils are not installed
+
+ * API change: rest2html is now here: ``from creole.rest2html.clean_writer import rest2html``
+
+* v0.7.0
+
+ * **NEW**: Add a html2reStructuredText converter (only a subset of reSt supported)
+
+* v0.6.1
+
+ * Bugfix: separate lines with one space in "wiki style line breaks" mode
+
+* v0.6
+
+ * **NEW**: html2textile converter
+
+ * some **API changed**!
+
+* v0.5
+
+ * **API changed**:
+
+ * Html2CreoleEmitter optional argument 'unknown_emit' takes now a callable for handle unknown html tags.
+
+ * No macros used as default in creole2html converting.
+
+ * We remove the support for callable macros. Only dict and modules are allowed.
+
+ * remove unknown html tags is default behaviour in html2creole converting.
+
+ * restructure and cleanup sourcecode files.
+
+* v0.4
+
+ * only emit children of empty tags like div and span (contributed by Eric O'Connell)
+
+ * remove inter wiki links and doesn't check the protocol
+
+* v0.3.3
+
+ * Use <tt> when {{{ ... }}} is inline and not <pre>, see: `PyLucid Forum Thread <http://forum.pylucid.org/viewtopic.php?f=3&t=320>`_
+
+ * Bugfix in html2creole: insert newline before new list. TODO: apply to all block tags: `issues 16 <http://code.google.com/p/python-creole/issues/detail?id=16#c5>`_
+
+* v0.3.2
+
+ * Bugfix for spaces after Headline: `issues 15 <https://code.google.com/p/python-creole/issues/detail?id=15>`_
+
+* v0.3.1
+
+ * Make argument 'block_rules' in Parser() optional
+
+* v0.3.0
+
+ * creole2html() has the optional parameter 'blog_line_breaks' to switch from default blog to wiki line breaks
+
+* v0.2.8
+
+ * bugfix in setup.py
+
+* v0.2.7
+
+ * handle obsolete non-closed <br> tag
+
+* v0.2.6
+
+ * bugfix in setup.py
+
+ * Cleanup DocStrings
+
+ * add unittests
+
+* v0.2.5
+
+ * creole2html: Bugfix if "--", "//" etc. stands alone, see also: `issues 12 <http://code.google.com/p/python-creole/issues/detail?id=12>`_
+
+ * Note: bold, italic etc. can't cross line any more.
+
+* v0.2.4
+
+ * creole2html: ignore file extensions in image tag
+
+ * see also: `issues 7 <http://code.google.com/p/python-creole/issues/detail?id=7>`_
+
+* v0.2.3
+
+ * html2creole bugfix/enhanced: convert image tag without alt attribute:
+
+ * see also: `issues 6 <http://code.google.com/p/python-creole/issues/detail?id=6>`_
+
+ * Thanks Betz Stefan alias 'encbladexp'
+
+* v0.2.2
+
+ * html2creole bugfix: convert ``<a href="/url/">Search & Destroy</a>``
+
+* v0.2.1
+
+ * html2creole bugfixes in:
+
+ * converting tables: ignore tbody tag and better handling p and a tags in td
+
+ * converting named entity
+
+* v0.2
+
+ * remove all django template tag stuff: `issues 3 <http://code.google.com/p/python-creole/issues/detail?id=3>`_
+
+ * html code always escaped
+
+* v0.1.1
+
+ * improve macros stuff, patch by Vitja Makarov: `issues 2 <http://code.google.com/p/python-creole/issues/detail?id=2>`_
+
+* v0.1.0
+
+ * first version cut out from `PyLucid CMS <http://www.pylucid.org>`_
+
+first source code was written 27.11.2008: `Forum thread (de) <http://www.python-forum.de/viewtopic.php?f=3&t=16742>`_
+
+-------------
+Project links
+-------------
+
++--------+------------------------------------------------+
+| GitHub | `https://github.com/jedie/python-creole`_ |
++--------+------------------------------------------------+
+| Wiki | `https://github.com/jedie/python-creole/wiki`_ |
++--------+------------------------------------------------+
+| PyPi | `https://pypi.org/project/python-creole/`_ |
++--------+------------------------------------------------+
+
+.. _https://github.com/jedie/python-creole: https://github.com/jedie/python-creole
+.. _https://pypi.org/project/python-creole/: https://pypi.org/project/python-creole/
+
+--------
+donation
+--------
+
+* `paypal.me/JensDiemer <https://www.paypal.me/JensDiemer>`_
+
+* `Flattr This! <https://flattr.com/submit/auto?uid=jedie&url=https%3A%2F%2Fgithub.com%2Fjedie%2Fpython-creole%2F>`_
+
+* Send `Bitcoins <http://www.bitcoin.org/>`_ to `1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F <https://blockexplorer.com/address/1823RZ5Md1Q2X5aSXRC5LRPcYdveCiVX6F>`_
+
+------------
+
+``Note: this file is generated from README.creole with "python-creole" at 2020-02-01 12:50:27`` \ No newline at end of file
diff --git a/creole/__init__.py b/creole/__init__.py
index 25dd09c..e5d6324 100644
--- a/creole/__init__.py
+++ b/creole/__init__.py
@@ -1,18 +1,13 @@
-# coding: utf-8
-
"""
python-creole
~~~~~~~~~~~~~
- :homepage:
- http://code.google.com/p/python-creole/
-
:sourcecode:
- http://github.com/jedie/python-creole
+ https://github.com/jedie/python-creole
:PyPi:
- http://pypi.python.org/pypi/python-creole/
+ https://pypi.org/project/python-creole/
:copyleft: 2008-2020 by python-creole team, see AUTHORS for more details.
:license: GNU GPL v3 or above, see LICENSE for more details.
@@ -28,7 +23,7 @@ from creole.emitter.html2textile_emitter import TextileEmitter
from creole.parser.creol2html_parser import CreoleParser
from creole.parser.html_parser import HtmlParser
-__version__ = "1.4.1"
+__version__ = "1.4.2.dev1"
__api__ = "1.0" # Creole 1.0 spec - http://wikicreole.org/
VERSION_STRING = __version__ # remove in future
diff --git a/creole/setup_utils.py b/creole/setup_utils.py
index 17623f5..24b1b1a 100644
--- a/creole/setup_utils.py
+++ b/creole/setup_utils.py
@@ -1,5 +1,3 @@
-# coding: utf-8
-
"""
utils for distutils setup
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -23,9 +21,9 @@
try:
from creole.setup_utils import get_long_description
except ImportError:
- if "register" in sys.argv or "sdist" in sys.argv or "--long-description" in sys.argv:
+ if 'register' in sys.argv or 'sdist' in sys.argv or '--long-description' in sys.argv:
etype, evalue, etb = sys.exc_info()
- evalue = etype("%s - Please install python-creole >= v0.8 - e.g.: pip install python-creole" % evalue)
+ evalue = etype('%s - Please install python-creole >= v0.8 - e.g.: pip install python-creole' % evalue)
raise etype, evalue, etb
long_description = None
else:
@@ -43,16 +41,20 @@
"""
import codecs
+import datetime
import os
+import shutil
+import subprocess
import sys
import warnings
+from pathlib import Path
-from creole import creole2html, html2rest
+from creole import __version__, creole2html, html2rest
from creole.shared.unknown_tags import raise_unknown_node, transparent_unknown_nodes
RAISE_ERRORS_ARGS = (
- "check", "register", "sdist", "bdist", "upload",
- "--long-description", "--restructuredtext",
+ 'check', 'register', 'sdist', 'bdist', 'upload',
+ '--long-description', '--restructuredtext',
)
@@ -70,13 +72,16 @@ def should_raise_errors():
return False
-def get_long_description(package_root, filename="README.creole", raise_errors=None):
+def get_long_description(package_root, filename='README.creole', raise_errors=None):
""" read README file and convert it on-the-fly to ReStructuredText. """
+
+ warnings.warn('get_long_description() will be removed in the future', DeprecationWarning)
+
if raise_errors is None:
raise_errors = should_raise_errors()
if raise_errors:
- sys.stderr.write("Test creole2rest and raise an error, if rendering failed...\n")
+ sys.stderr.write('Test creole2rest and raise an error, if rendering failed...\n')
# raise a error if a unknown node found
unknown_emit = raise_unknown_node
else:
@@ -84,10 +89,10 @@ def get_long_description(package_root, filename="README.creole", raise_errors=No
unknown_emit = transparent_unknown_nodes
filepath = os.path.join(package_root, filename)
- long_description_origin = ""
+ long_description_origin = ''
try:
# Read creole README
- f = codecs.open(filepath, "r", encoding="utf-8")
+ f = codecs.open(filepath, 'r', encoding='utf-8')
long_description_origin = f.read().strip()
f.close()
@@ -97,14 +102,14 @@ def get_long_description(package_root, filename="README.creole", raise_errors=No
# convert html to ReSt
long_description_rest = html2rest(
long_description_html,
- emitter_kwargs={"unknown_emit": unknown_emit}
+ emitter_kwargs={'unknown_emit': unknown_emit}
)
except Exception:
if raise_errors:
raise
# Don't raise the error e.g. in ./setup install process
evalue = sys.exc_info()[1]
- long_description_rest = f"[Error: {evalue}]\n{long_description_origin}"
+ long_description_rest = f'[Error: {evalue}]\n{long_description_origin}'
else:
if raise_errors:
# Test created ReSt code like PyPi does it.
@@ -112,31 +117,230 @@ def get_long_description(package_root, filename="README.creole", raise_errors=No
try:
pypi_rest2html(long_description_rest)
except SystemExit as e:
- msg = f"Error creole2rest self test failed: rest2html() exist with status code: {e.args[0]}\n"
+ msg = f'Error creole2rest self test failed: rest2html() exist with status code: {e.args[0]}\n'
sys.stderr.write(msg)
sys.exit(msg)
except Exception as e:
- sys.exit(f"ReSt2html error: {e}")
+ sys.exit(f'ReSt2html error: {e}')
else:
- if "check" in sys.argv:
- print("Generating creole to ReSt to html, ok.")
+ if 'check' in sys.argv:
+ print('Generating creole to ReSt to html, ok.')
return long_description_rest
-def _get_long_description(*args, **kwargs):
- msg = "'GetLongDescription' is deprecated, use 'get_long_description' instead."
- if should_raise_errors():
- raise DeprecationWarning(msg)
+def update_rst_readme(package_root, filename='README.creole'):
+ """
+ Generate README.rst from README.creole
+ """
+ assert isinstance(package_root, Path)
+ assert package_root.is_dir(), f'Directory not found: {package_root}'
+ creole_readme_path = Path(package_root, filename)
+ assert creole_readme_path.is_file(), f'File not found: {creole_readme_path}'
+
+ rest_readme_path = creole_readme_path.with_suffix('.rst')
+ print(
+ f'Generate {rest_readme_path.name} from {creole_readme_path.name}',
+ end='...', flush=True
+ )
+
+ with creole_readme_path.open('r') as f:
+ creole_readme = f.read().strip()
+
+ # convert creole into html
+ html_readme = creole2html(creole_readme)
+
+ # convert html to ReSt
+ rest_readme = html2rest(
+ html_readme,
+ emitter_kwargs={
+ 'unknown_emit': raise_unknown_node # raise a error if a unknown node found
+ }
+ )
+
+ with rest_readme_path.open('w') as f:
+ f.write(rest_readme)
+ f.write('\n\n------------\n\n')
+ dt = datetime.datetime.utcnow()
+ dt = dt.replace(microsecond=0)
+ dt = dt.isoformat(sep=' ')
+ f.write(f'``Note: this file is generated from {filename} with "python-creole" at {dt}``')
+
+ print('done.')
+
+
+def update_creole_rst_readme():
+ update_rst_readme(
+ package_root=Path(__file__).parent.parent,
+ filename='README.creole'
+ )
+
+
+def verbose_check_output(*args, log=None):
+ """ 'verbose' version of subprocess.check_output() """
+ call_info = 'Call: %r' % ' '.join(args)
+ try:
+ output = subprocess.check_output(
+ args, universal_newlines=True, stderr=subprocess.STDOUT
+ )
+ except subprocess.CalledProcessError as err:
+ print('\n***ERROR:')
+ print(err.output)
+ if log is not None:
+ log.write(err.output)
+ raise
+ return call_info, output
+
+
+def verbose_check_call(*args):
+ """ 'verbose' version of subprocess.check_call() """
+ print('\tCall: %r\n' % ' '.join(args))
+ subprocess.check_call(args, universal_newlines=True)
+
+
+def confirm(txt):
+ print(f'\n{txt}')
+ if input('\nPublish anyhow? (Y/N)').lower() not in ('y', 'j'):
+ print('Bye.')
+ sys.exit(-1)
+
+
+def poetry_publish(package_root, version, filename='README.creole', log_filename='publish.log'):
+ """
+ Helper to build and upload to PyPi, with prechecks and update README.rst from README.creole
+
+ Optional arguments are passed to `poetry publish` e.g.:
+
+ $ poetry config repositories.testpypi https://test.pypi.org/simple
+ $ poetry run publish --repository=testpypi
+
+ Build and upload to PyPi, if...
+ ... __version__ doesn't contains 'dev'
+ ... we are on git "master" branch
+ ... git repository is 'clean' (no changed files)
+
+ Upload with 'poetry', git tag the current version and git push --tag
+
+ The cli arguments will be pass to 'twine'. So this is possible:
+ * Display 'twine' help page...: ./setup.py publish --help
+ * use testpypi................: ./setup.py publish --repository=test
+
+ add this to poetry pyproject.toml, e.g.:
+
+ [tool.poetry.scripts]
+ publish = 'foo.bar:publish'
+
+ based on:
+ https://github.com/jedie/python-code-snippets/blob/master/CodeSnippets/setup_publish.py
+ """
+ update_rst_readme(package_root=package_root, filename=filename)
+
+ for key in ('dev', 'rc'):
+ if key in version:
+ confirm(f'WARNING: Version contains {key!r}: v{version}\n')
+ break
+
+ print('\nCheck if we are on "master" branch:')
+ call_info, output = verbose_check_output('git', 'branch', '--no-color')
+ print(f'\t{call_info}')
+ if '* master' in output:
+ print('OK')
+ else:
+ confirm(f'\nNOTE: It seems you are not on "master":\n{output}')
+
+ print('\ncheck if if git repro is clean:')
+ call_info, output = verbose_check_output('git', 'status', '--porcelain')
+ print(f'\t{call_info}')
+ if output == '':
+ print('OK')
+ else:
+ print('\n *** ERROR: git repro not clean:')
+ print(output)
+ sys.exit(-1)
+
+ print('\nRun "poetry check":')
+ call_info, output = verbose_check_output('poetry', 'check')
+ if 'All set!' not in output:
+ print(output)
+ confirm('Check failed!')
+ else:
+ print('OK')
+
+ print('\ncheck if pull is needed')
+ verbose_check_call('git', 'fetch', '--all')
+ call_info, output = verbose_check_output('git', 'log', 'HEAD..origin/master', '--oneline')
+ print(f'\t{call_info}')
+ if output == '':
+ print('OK')
+ else:
+ print('\n *** ERROR: git repro is not up-to-date:')
+ print(output)
+ sys.exit(-1)
+ verbose_check_call('git', 'push')
+
+ print('\nCleanup old builds:')
+
+ def rmtree(path):
+ path = os.path.abspath(path)
+ if os.path.isdir(path):
+ print('\tremove tree:', path)
+ shutil.rmtree(path)
+ rmtree('./dist')
+ rmtree('./build')
+
+ print(f'\nSet new version to: v{version}')
+ verbose_check_call('poetry', 'version', version)
+
+ print('\nbuild but do not upload...')
+
+ with open(log_filename, 'a') as log:
+ log.write('\n')
+ log.write('-' * 100)
+ log.write('\n')
+ call_info, output = verbose_check_output('poetry', 'build', log=log)
+ print(f'\t{call_info}')
+ log.write(call_info)
+ log.write(output)
+
+ print(f'Build log file is here: {log_filename!r}')
+
+ git_tag = f'v{version}'
+
+ print('\ncheck git tag')
+ call_info, output = verbose_check_output(
+ 'git', 'log', 'HEAD..origin/master', '--oneline',
+ )
+ if git_tag in output:
+ print(f'\n *** ERROR: git tag {git_tag!r} already exists!')
+ print(output)
+ sys.exit(-1)
else:
- warnings.warn(msg, DeprecationWarning)
- return get_long_description(*args, **kwargs)
+ print('OK')
+ print('\nUpload to PyPi via poetry:')
+ args = ['poetry', 'publish'] + sys.argv[1:]
+ verbose_check_call(*args)
-GetLongDescription = _get_long_description # for backward-compatibility
+ print('\ngit tag version')
+ verbose_check_call('git', 'tag', git_tag)
+
+ print('\ngit push tag to server')
+ verbose_check_call('git', 'push', '--tags')
+
+ sys.exit(0)
+
+
+def publish_python_creole():
+ """
+ Publish python-creole to PyPi
+ Call this via:
+ $ poetry run publish
+ """
+ poetry_publish(
+ package_root=Path(__file__).parent.parent,
+ version=__version__,
+ )
-if __name__ == "__main__":
- package_root = os.path.abspath("../")
- long_description = get_long_description(package_root)
- print(long_description)
+if __name__ == '__main__':
+ update_creole_rst_readme()
diff --git a/pyproject.toml b/pyproject.toml
index b821124..cb88369 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,14 +1,10 @@
[tool.poetry]
name = 'python-creole'
-version = '1.4.1'
+version = "1.4.2.dev1"
description = 'python-creole is an open-source (GPL) markup converter in pure Python for: creole2html, html2creole, html2ReSt, html2textile'
-# TODO: convert it:
-readme='README.creole'
-
-# on the way, see: https://github.com/python-poetry/poetry/pull/1166/
-# https://packaging.python.org/guides/making-a-pypi-friendly-readme/#including-your-readme-in-your-package-s-metadata
-# long_description_content_type = 'text/plain'
+# Will be generated from README.creole with: 'poetry run update_rst_readme'
+readme='README.rst'
license = 'GPL-3.0-or-later'
authors = ['Jens Diemer <python-creole@jensdiemer.de>']
@@ -57,6 +53,8 @@ creole2html = 'creole.cmdline:cli_creole2html'
html2creole = 'creole.cmdline:cli_html2creole'
html2rest = 'creole.cmdline:cli_html2rest'
html2textile = 'creole.cmdline:cli_html2textile'
+update_rst_readme = 'creole.setup_utils:update_creole_rst_readme'
+publish = 'creole.setup_utils:publish_python_creole'
[build-system]
requires = ['poetry>=0.12']