diff options
author | Jens Diemer <github.com@jensdiemer.de> | 2020-02-01 14:17:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-01 14:17:08 +0100 |
commit | 69037331053950a1a03324ef3486769cc88ed591 (patch) | |
tree | 76e6c940c9a96eab032bf95ffbf3d5b0eb910371 | |
parent | 5c2ac71e9f92692dfcd152b8b449c7775bda9319 (diff) | |
parent | 3a86cb5bb14ec4b49547bfa717edc554d03b59ba (diff) | |
download | creole-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.yml | 35 | ||||
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | README.creole | 1 | ||||
-rw-r--r-- | README.rst | 619 | ||||
-rw-r--r-- | creole/__init__.py | 11 | ||||
-rw-r--r-- | creole/setup_utils.py | 260 | ||||
-rw-r--r-- | pyproject.toml | 12 |
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 @@ -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'] |