Compare commits

..

No commits in common. "187214cfa1c76168f0f51580f714e8e9e2461d8b" and "164a93cd88ff7fb5c3a60d301a3599e6334d55b4" have entirely different histories.

4 changed files with 28 additions and 117 deletions

View file

@ -2,9 +2,11 @@
"""Check if conference websites are live.""" """Check if conference websites are live."""
import configparser
import os import os
import re import re
import smtplib import smtplib
import typing
import warnings import warnings
from datetime import date from datetime import date
from email.mime.text import MIMEText from email.mime.text import MIMEText
@ -13,10 +15,16 @@ from email.utils import formatdate, make_msgid
import requests import requests
import yaml import yaml
from requests.adapters import HTTPAdapter from requests.adapters import HTTPAdapter
from urllib3.exceptions import InsecureRequestWarning from urllib3.exceptions import InsecureRequestWarning # type: ignore
from urllib3.util.url import parse_url from urllib3.util.url import parse_url # type: ignore
from conference import LiveConference, config, load_yaml
class LiveConference(typing.TypedDict):
"""Live conference."""
conference: str
year: int
live: date
class AbsoluteDNSAdapter(HTTPAdapter): class AbsoluteDNSAdapter(HTTPAdapter):
@ -28,7 +36,6 @@ class AbsoluteDNSAdapter(HTTPAdapter):
# Append a dot to the hostname if it's not already there. # Append a dot to the hostname if it's not already there.
hostname = parsed_url.host hostname = parsed_url.host
assert hostname
if not hostname.endswith("."): if not hostname.endswith("."):
hostname += "." hostname += "."
@ -43,6 +50,16 @@ class AbsoluteDNSAdapter(HTTPAdapter):
return super().send(request, **kwargs) return super().send(request, **kwargs)
config_file_path = os.path.expanduser(
os.path.join(
os.getenv("XDG_CONFIG_HOME", "~/.config"), "conference-check", "config"
)
)
config = configparser.ConfigParser()
config.read(os.path.expanduser(config_file_path))
# Suppress only the single InsecureRequestWarning from urllib3 # Suppress only the single InsecureRequestWarning from urllib3
warnings.filterwarnings("ignore", category=InsecureRequestWarning) warnings.filterwarnings("ignore", category=InsecureRequestWarning)
@ -78,7 +95,6 @@ not_here_list = [
"Wikimedia Error", "Wikimedia Error",
"The page you requested could not be found", "The page you requested could not be found",
"Ooops! Could Not Find It", "Ooops! Could Not Find It",
"OpenStreetMap Authentication Proxy",
] ]
@ -128,6 +144,13 @@ def send_mail(subject: str, body: str) -> None:
s.quit() s.quit()
def load_yaml(name: str) -> typing.Any:
"""Load YAML."""
filename = os.path.expanduser(config["data"][name])
assert os.path.exists(filename)
return yaml.safe_load(open(filename))
def check_conference_web_site(name: str, src_url: str, year: int) -> bool: def check_conference_web_site(name: str, src_url: str, year: int) -> bool:
"""Check if an individual web site is live.""" """Check if an individual web site is live."""
assert "{year}" in src_url assert "{year}" in src_url

View file

@ -1,34 +0,0 @@
"""Conference classes and functions."""
import configparser
import os
import typing
from datetime import date
import yaml
config_file_path = os.path.expanduser(
os.path.join(
os.getenv("XDG_CONFIG_HOME", "~/.config"), "conference-check", "config"
)
)
assert os.path.exists(config_file_path)
config = configparser.ConfigParser()
config.read(os.path.expanduser(config_file_path))
class LiveConference(typing.TypedDict, total=False):
"""Live conference."""
conference: str
year: int
live: date
url: str | None
def load_yaml(name: str) -> typing.Any:
"""Load YAML."""
filename = os.path.expanduser(config["data"][name])
assert os.path.exists(filename)
return yaml.safe_load(open(filename))

View file

@ -1,53 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Conference check</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
h1 {
font-size: 2.5rem;
font-weight: 500;
margin-top: 0;
margin-bottom: 0.5rem;
}
a {
color: #0d6efd;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.text-right {
text-align: right;
}
</style>
</head>
<body>
<h1>Conference check</h1>
<p>Date when website went live.</p>
<table>
{% for l in live %}
<td class="text-right">
{{ l.live.strftime("%a, %d %b %Y") }}
🌍🎉
</td>
<td>
<a href="{{ l.url }}">{{ l.conference }} {{ l.year }}</a>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>

View file

@ -1,25 +0,0 @@
#!/usr/bin/python3
"""When conference websites appeared."""
import flask
from conference import LiveConference, load_yaml
app = flask.Flask(__name__)
app.debug = False
@app.route("/")
async def index() -> str:
"""Index page."""
conferences = load_yaml("conferences")
live: list[LiveConference] = load_yaml("live")
for c in live:
c["url"] = conferences[c["conference"]].format(year=c["year"])
return flask.render_template("index.html", live=live, conferences=conferences)
if __name__ == "__main__":
app.run(host="0.0.0.0")