mirror of
https://github.com/emojisum/emojisum.git
synced 2024-11-27 01:35:40 +00:00
Add Python version
This commit is contained in:
parent
cdca4cf09e
commit
72cd9b2859
5 changed files with 128 additions and 0 deletions
1
contrib/emojisum-py/MANIFEST.in
Normal file
1
contrib/emojisum-py/MANIFEST.in
Normal file
|
@ -0,0 +1 @@
|
||||||
|
include src/emojisum/emojimap.json
|
1
contrib/emojisum-py/requirements.txt
Normal file
1
contrib/emojisum-py/requirements.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
rich
|
24
contrib/emojisum-py/setup.py
Normal file
24
contrib/emojisum-py/setup.py
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
from setuptools import find_packages, setup
|
||||||
|
|
||||||
|
|
||||||
|
def get_requirements():
|
||||||
|
with open("requirements.txt") as f:
|
||||||
|
return f.read().splitlines()
|
||||||
|
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name="emojisum",
|
||||||
|
version="1.0.0",
|
||||||
|
packages=find_packages(where="src"),
|
||||||
|
url="",
|
||||||
|
license="",
|
||||||
|
author="Tamir Bahar",
|
||||||
|
author_email="",
|
||||||
|
description="",
|
||||||
|
package_dir={"": "src"},
|
||||||
|
include_package_data=True,
|
||||||
|
install_requires=get_requirements(),
|
||||||
|
entry_points={
|
||||||
|
"console_scripts": ["emojisum=emojisum:entry"],
|
||||||
|
},
|
||||||
|
)
|
101
contrib/emojisum-py/src/emojisum/__init__.py
Normal file
101
contrib/emojisum-py/src/emojisum/__init__.py
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
import hashlib
|
||||||
|
import json
|
||||||
|
import mmap
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import NamedTuple, Optional
|
||||||
|
|
||||||
|
from rich.console import Console
|
||||||
|
|
||||||
|
SHA1SUM_PATTERN = re.compile(r"(?P<digest>\S*)\s+(?P<path>.*)")
|
||||||
|
OPENSSL_SHA1_PATTERN = re.compile(r"SHA1\((?P<path>.*)\)=\s+(?P<digest>.*)")
|
||||||
|
OUTPUT_PATTERNS = [SHA1SUM_PATTERN, OPENSSL_SHA1_PATTERN]
|
||||||
|
|
||||||
|
|
||||||
|
class Sha1Result(NamedTuple):
|
||||||
|
hex_digest: str
|
||||||
|
path: str
|
||||||
|
|
||||||
|
|
||||||
|
def load_table():
|
||||||
|
with (Path(__file__).parent / "emojimap.json").open() as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
return data["emojiwords"]
|
||||||
|
|
||||||
|
|
||||||
|
def _emojify(hex_digest):
|
||||||
|
for i in range(0, len(hex_digest), 2):
|
||||||
|
yield load_table()[int(hex_digest[i : i + 1], 0x10)][0]
|
||||||
|
|
||||||
|
|
||||||
|
def emojify(hex_digest: str):
|
||||||
|
return "".join(_emojify(hex_digest))
|
||||||
|
|
||||||
|
|
||||||
|
def sha1sum(path: Path):
|
||||||
|
h = hashlib.sha1()
|
||||||
|
with path.open("rb") as f:
|
||||||
|
with mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) as mm:
|
||||||
|
h.update(mm)
|
||||||
|
return h.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
def parse_sha1_output(output: str) -> Optional[Sha1Result]:
|
||||||
|
for pattern in OUTPUT_PATTERNS:
|
||||||
|
match = pattern.match(output)
|
||||||
|
if match:
|
||||||
|
return Sha1Result(hex_digest=match["digest"], path=match["path"])
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def print_result(result: Sha1Result):
|
||||||
|
path = os.path.normpath(result.path)
|
||||||
|
hex_digest = result.hex_digest
|
||||||
|
|
||||||
|
markdown = emojify(hex_digest=hex_digest)
|
||||||
|
|
||||||
|
Console().print(
|
||||||
|
f"SHA1({path}) = {hex_digest}", emoji=False, markup=False, highlight=False
|
||||||
|
)
|
||||||
|
Console().print(
|
||||||
|
f"SHA1({path}) = {markdown}", emoji=False, markup=False, highlight=False
|
||||||
|
)
|
||||||
|
Console().print(
|
||||||
|
f"SHA1({path}) = {markdown}", emoji=True, markup=False, highlight=False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def calculate_sum(path: Path) -> Sha1Result:
|
||||||
|
return Sha1Result(path=str(path), hex_digest=sha1sum(path))
|
||||||
|
|
||||||
|
|
||||||
|
def main(path: Optional[Path] = None):
|
||||||
|
if path:
|
||||||
|
sha1_result = calculate_sum(path)
|
||||||
|
|
||||||
|
elif not sys.stdin.isatty():
|
||||||
|
sha1_result = parse_sha1_output(sys.stdin.read())
|
||||||
|
else:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not sha1_result:
|
||||||
|
return
|
||||||
|
|
||||||
|
print_result(sha1_result)
|
||||||
|
|
||||||
|
|
||||||
|
def entry():
|
||||||
|
if len(sys.argv) == 2:
|
||||||
|
path = Path(sys.argv[1])
|
||||||
|
else:
|
||||||
|
path = None
|
||||||
|
|
||||||
|
main(path)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
entry()
|
1
contrib/emojisum-py/src/emojisum/emojimap.json
Symbolic link
1
contrib/emojisum-py/src/emojisum/emojimap.json
Symbolic link
|
@ -0,0 +1 @@
|
||||||
|
../../emoji/emojimap.json
|
Loading…
Reference in a new issue