Skip to content

Instantly share code, notes, and snippets.

View petri's full-sized avatar

Petri Savolainen petri

View GitHub Profile
@petri
petri / get_products.py
Created August 31, 2022 20:12
get product metadata from web page in Python
import extruct
import requests
from w3lib.html import get_base_url
from urllib.parse import urlparse
url = "https://www.kalevala.fi/collections/korvakorut/products/paratiisi-tappikorvakorut-hopea"
@petri
petri / test.py
Created November 27, 2020 20:56
test example
def test_cmdline_logging_info(caplog, capsys):
retv = tnefparse.cmdline.tnefparse(('-l', 'INFO', '-rb', 'tests/examples/rtf.tnef'))
assert not retv
stdout, _ = capsys.readouterr()
assert len(stdout) == 593
assert caplog.record_tuples == [
('tnefparse', logging.INFO, 'Skipping checksum for performance'),
]
def tnefparse(argv=None):
@petri
petri / bouncer.py
Last active September 28, 2020 14:28
generic helper awaitable to synchronize awaiters chronologically on a first-come first-served basis
class bouncer(Awaitable):
"serve awaiters on a first-come first-served basis"
queue = []
def __init__(self):
type(self).queue.append(self.caller)
@property
def caller(self):
@petri
petri / predicate.py
Last active September 27, 2020 18:48
a first come, first served queing predicate for asyncio Condition
class my_turn:
"""a first come, first served coordinator predicate for
asyncio.Condition.wait_for(predicate); could also do away
the 'caller' by just hardcoding it to the current task
"""
queue = []
def __init__(self, caller):
type(self).queue.insert(0, caller)
@petri
petri / gist:46bb6b8eac8ea5b8f01c90e7414d7951
Last active September 27, 2020 18:42 — forked from HQJaTu/gist:345f7147065f1e10587169dc36cc1edb
Python asyncio ordering test - single-connection multiplex version with asyncio.Queue
#!/usr/bin/env python3
# vim: autoindent tabstop=4 shiftwidth=4 expandtab softtabstop=4 filetype=python
# Proof-of-Concept for https://stackoverflow.com/q/64017656/1548275
# Do Python asyncio Streams maintain order over multiple writers and readers?
import sys
import argparse
@petri
petri / splicing.py
Created April 26, 2020 13:05
Get all ordered n-size splices of a sequence in Python
def splice(sequence, size):
"return a list of all ordered splices of given size"
ss = len(sequence)
return [sequence[i:i+size] for i in range(0, ss-size+1)]
@petri
petri / hfst.rb
Last active December 9, 2018 18:02
hfst homebrew recipe
class Hfst < Formula
desc "Helsinki Finite-State Technology (library and application suite)"
homepage "https://hfst.github.io"
url "https://github.com/hfst/hfst/archive/v3.15.0.tar.gz"
sha256 "1ce90956d7c91d75e7c141e3852504b02728672239746858a141ccfae1712d19"
depends_on "automake"
depends_on "autoconf"
depends_on "libtool"
depends_on "bison"
@petri
petri / country_names.py
Last active October 22, 2018 18:40
Common disambiguated country names
"""
An attempt to produce a good enough list of commonly understandable country names
from pycountry straight-jacket names. Thus country names produced are without
prefixes such as "Republic of", and are also disambiguated from one another
(British & US Virgin Islands and Republic & Democratic Republic of Congo).
People living in the two countries both known as Congo call their country
either Congo-Kinshasa or Congo-Brazzaville, ie. adding the name of the capital;
we use that convention as an incremental means for additional disambiguation.
Also, liberty is taken to call Lao People's Democratic Republic just Laos, and
use the commonly known names North and South Korea, rather than the official
code {
background-color: red !important;
color: blue;
border: solid thin gray;
}
@petri
petri / Checksum.py
Last active January 24, 2023 21:50 — forked from Zireael-N/Checksum.py
Python script that calculates SHA1, SHA256, MD5 checksums of a given file. Similar to what you might accomplish with eg. ”openssl dgst -sha512 -binary my-downloaded-file.zip | base64”
#!/usr/bin/python
import hashlib
import os
import sys
if len(sys.argv) < 2:
sys.exit('Usage: %s filename' % sys.argv[0])
if not os.path.exists(sys.argv[1]):