Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Markdown-command #1

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# ignore ALL files from the dist directory
dist/
*.egg-info
42 changes: 42 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@

Process a Markdown file, execute commands within

and print file contents with executed commands' output.



## Installation



The script is available on `PyPI`:



```
pip install markdown-command

```



## Usage
```

markdown-command [options] FILE



The pattern for commands to be executed is:

[$ command --with-options -and arguments]



Options:

--help Display this message.

--version Display version information.

```
29 changes: 29 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"

[project]
name = "markdown_command"
version = "0.9"
authors = [
{ name="Michal Moroz", email="[email protected]" },
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
{ name="Wojciech Mielczarek", email="[email protected]" },
]
description = "Process a Markdown file, execute commands within and print file contents with executed commands' output."
readme = "README.md"
requires-python = ">=3.7"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
]
dependencies = [
'docopt == 0.6.2',
]

WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
[project.urls]
"Homepage" = "https://github.com/makimo/markdown-command"
"Bug Tracker" = "https://github.com/makimo/markdown-command/issues"

[project.scripts]
markdown-command = "markdown_command:main"
77 changes: 77 additions & 0 deletions src/markdown_command.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
"""
Process a Markdown file, execute commands within
and print file contents with executed commands' output.

Usage:
markdown-command [options] FILE

The pattern for commands to be executed is:
[$ command --with-options -and arguments]

Options:
--help Display this message.
--version Display version information.
"""

VERSION = '0.9'


import sys
import re

import shutil

import subprocess
from multiprocessing import Pool

from docopt import docopt

import shlex


pattern = re.compile(r'^\s*\[\$\s*([^\]]+)\]\s*$')


def run_cmd(command_string):
return subprocess.check_output(
shlex.split(command_string)
).decode('utf-8')


def concurrently_map_to_dict(f, keys):
p = Pool()
results = p.map(f, keys)
p.close()

return dict(zip(keys, results))


def main():
arguments = docopt(__doc__, version=VERSION)

file = arguments['FILE']

with open(file, 'r') as f:
to_process = []

for line in f:
m = pattern.match(line)

if not m:
continue

to_process.append(m.group(1))

items = concurrently_map_to_dict(run_cmd, to_process)

f.seek(0)

for line in f:
m = pattern.match(line)

if not m:
sys.stdout.write(line)
continue

sys.stdout.write(items[m.group(1)])

Empty file.