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 1 commit
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
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Markdown-command
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.
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
Binary file added dist/markdown_command-0.0.2-py3-none-any.whl
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
Binary file not shown.
Binary file added dist/markdown_command-0.0.2.tar.gz
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
Binary file not shown.
22 changes: 22 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "markdown_command"
version = "0.0.2"
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
authors = [
{ name="Michal Moroz", email="[email protected]" },
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
]
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",
]

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"
Empty file.
77 changes: 77 additions & 0 deletions src/markdown_command/markdown_command.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
"""
WojtekMielczarek-Makimo marked this conversation as resolved.
Show resolved Hide resolved
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 = '1.0.1'


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)])