summaryrefslogtreecommitdiff
path: root/creole/setup_utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'creole/setup_utils.py')
-rw-r--r--creole/setup_utils.py101
1 files changed, 98 insertions, 3 deletions
diff --git a/creole/setup_utils.py b/creole/setup_utils.py
index b2e4dbb..1e6058e 100644
--- a/creole/setup_utils.py
+++ b/creole/setup_utils.py
@@ -21,7 +21,7 @@ from pathlib import Path
from readme_renderer.rst import render
-from creole import creole2html, html2rest
+from creole import creole2html, html2markdown, html2rest
from creole.shared.diff_utils import unified_diff
from creole.shared.unknown_tags import raise_unknown_node, transparent_unknown_nodes
@@ -125,6 +125,30 @@ def _generate_rst_readme(*, creole_readme_path):
return rest_readme
+def _generate_markdown_readme(*, creole_readme_path):
+ with creole_readme_path.open('r') as f:
+ creole_readme = f.read().strip()
+
+ # convert creole into html
+ html_readme = creole2html(creole_readme)
+ html_readme_path = creole_readme_path.with_suffix('.html')
+ html_readme_path.write_text(html_readme, encoding='utf-8')
+
+ # convert html to ReSt
+ rest_readme = html2markdown(
+ html_readme,
+ unknown_emit=raise_unknown_node # raise a error if a unknown node found
+ )
+
+ # Check if generated ReSt is valid, see also:
+ # https://pypi.org/help/#description-content-type
+ rendered = render(rest_readme, stream=sys.stderr)
+ if rendered is None:
+ sys.exit(1)
+
+ return rest_readme
+
+
def update_rst_readme(package_root, filename='README.creole'):
"""
Generate README.rst from README.creole
@@ -172,6 +196,53 @@ def update_rst_readme(package_root, filename='README.creole'):
return rest_readme_path
+def update_markdown_readme(package_root, filename='README.creole'):
+ """
+ Generate README.md 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('.md')
+ print(
+ f'Generate {rest_readme_path.name} from {creole_readme_path.name}',
+ end='...', flush=True
+ )
+
+ markdown_readme = _generate_markdown_readme(creole_readme_path=creole_readme_path)
+
+ # Check if content was changed
+ changed = False
+ with rest_readme_path.open('r') as f:
+ for new_line, old_line in zip(markdown_readme.splitlines(), f):
+ if new_line.rstrip() != old_line.rstrip():
+ changed = True
+ break
+
+ if not changed:
+ # The existing README.rst is up-to-date: Don't change the timestamp
+ print('nothing changed, ok.')
+ return rest_readme_path
+
+ with rest_readme_path.open('w') as f:
+ f.write(markdown_readme)
+
+ # Add a note about generation with modification time from source:
+
+ f.write('\n\n------------\n\n')
+
+ modification_time = creole_readme_path.stat().st_mtime
+ dt = datetime.datetime.fromtimestamp(modification_time)
+ dt = dt.replace(microsecond=0)
+ dt = dt.isoformat(sep=' ')
+ f.write(f'``Note: this file is generated from {filename} {dt} with "python-creole"``')
+
+ print('done.')
+ return rest_readme_path
+
+
def assert_rst_readme(package_root, filename='README.creole'):
"""
raise AssertionError if README.rst is not up-to-date.
@@ -179,8 +250,7 @@ def assert_rst_readme(package_root, filename='README.creole'):
creole_readme_path = Path(package_root, filename)
rest_readme = _generate_rst_readme(creole_readme_path=creole_readme_path)
rest_readme_path = creole_readme_path.with_suffix('.rst')
- with rest_readme_path.open('r') as f:
- content = f.read()
+ content = rest_readme_path.read_text(encoding='UTF-8')
assert len(content) > 0, f'Empty content in {rest_readme_path}'
content = content.rsplit('\n', 4)[0] # remove note about generation with modification time
@@ -190,6 +260,23 @@ def assert_rst_readme(package_root, filename='README.creole'):
raise AssertionError(f'{rest_readme_path.name} is not up-to-date:\n{diff}')
+def assert_markdown_readme(package_root, filename='README.creole'):
+ """
+ raise AssertionError if README.md is not up-to-date.
+ """
+ creole_readme_path = Path(package_root, filename)
+ markdown_readme = _generate_markdown_readme(creole_readme_path=creole_readme_path)
+ markdown_readme_path = creole_readme_path.with_suffix('.md')
+ content = markdown_readme_path.read_text(encoding='UTF-8')
+
+ assert len(content) > 0, f'Empty content in {markdown_readme_path}'
+ content = content.rsplit('\n', 4)[0] # remove note about generation with modification time
+
+ if markdown_readme != content:
+ diff = unified_diff(content, markdown_readme, filename=markdown_readme_path.name)
+ raise AssertionError(f'{markdown_readme_path.name} is not up-to-date:\n{diff}')
+
+
def update_creole_rst_readme():
return update_rst_readme(
package_root=Path(__file__).parent.parent,
@@ -197,5 +284,13 @@ def update_creole_rst_readme():
)
+def update_creole_markdown_readme():
+ return update_markdown_readme(
+ package_root=Path(__file__).parent.parent,
+ filename='README.creole'
+ )
+
+
if __name__ == '__main__':
update_creole_rst_readme()
+ update_creole_markdown_readme()