Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
The cobbler's children have no shoes, or buildi...
Search
Alex Gaynor
May 30, 2016
Programming
1
250
The cobbler's children have no shoes, or building better tools for ourselves
As delivered at PyCon 2016 in Portland, OR.
Alex Gaynor
May 30, 2016
Tweet
Share
More Decks by Alex Gaynor
See All by Alex Gaynor
Quantifying Memory Unsafety and Reactions to It
alex
0
82
Learning from Failure: Post-mortems
alex
2
280
Techniques for Debugging Hard Problems
alex
1
540
Building Communities with Code Review
alex
4
260
Documenting Domain Specific Knowledge
alex
1
350
Pickles are for Delis, not for Software
alex
0
320
Code Review in Open Source Software
alex
4
740
Why Ruby isn't slow
alex
10
3.8k
PyPy + Swift
alex
2
510
Other Decks in Programming
See All in Programming
コンテナでLambdaをデプロイするときに知っておきたかったこと
_takahash
0
140
CTFのWebにおける⾼難易度問題について
hamayanhamayan
1
950
Kubernetesで実現できるPlatform Engineering の現在地
nwiizo
2
1.7k
マルチアカウント環境での、そこまでがんばらない RI/SP 運用設計
wa6sn
0
330
보일러플레이트 코드가 진짜 나쁜 건가요?
gaeun5744
0
370
NestJSのコードからOpenAPIを自動生成する際の最適解を探す
astatsuya
0
180
Return of the Full-Stack Developer
simas
PRO
1
310
PsySHから紐解くREPLの仕組み
muno92
PRO
1
510
新卒から4年間、20年もののWebサービスと 向き合って学んだソフトウェア考古学
oguri
7
6.5k
SLI/SLOの設定を進めるその前に アラート品質の改善に取り組んだ話
tanden
2
690
Django for Data Science (Boston Python Meetup, March 2025)
wsvincent
0
230
アーキテクトと美学 / Architecture and Aesthetics
nrslib
12
2.9k
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.7k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
12
1.4k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
490
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
8
700
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
The World Runs on Bad Software
bkeepers
PRO
67
11k
How to train your dragon (web standard)
notwaldorf
91
5.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
31
4.7k
Transcript
The cobbler's children have no shoes, or building better tools
for ourselves Alex Gaynor - PyCon 2016
About me • Director of the Python Software Foundation •
Open source contributor • Django, PyPy, CPython, pyca/cryptography, etc. • Washington, D.C. resident • Bagel and deli enthusiast • US Digital Service employee
A short history of tools
$ git init
None
Code review
Deployment automation
Emerging trends
CI for PRs
Linting (flake8, bandit, flake8-import-order, etc.)
Coverage Tracking
livegrep.com
github.com/facebook/mention-bot
Workflow
Build more tailored tools
Automation > Process
APIs!
Issues • Create an issue • Add/remove labels • Add
a comment • Assign to someone
Pull requests • Send a PR • Assign a PR
• Add/remove labels • Leave a code review • Add a commit status
Examples
$ pip install github3.py
import github3 gh_client = github3.login( os.environ["GITHUB_USERNAME"], os.environ["GITHUB_PASSWORD"], )
repo = gh_client.repository("django", "django")
HTTPS certificate expiration
def get_expiration_date(host): ssl_context = ssl.create_default_context() with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
sock = ssl_context.wrap_socket(sock, server_hostname=host) sock.connect((host, 443)) expiration = ssl.cert_time_to_seconds(sock.getpeercert()["notAfter"]) return datetime.datetime.fromtimestamp(expiration)
while True: for host in MY_DOMAINS: expiration = get_expiration_date(host) if
expiration - datetime.datetime.now() < CUTOFF: file_an_issue(gh_client, host, expiration) time.sleep(3600)
def file_an_issue(gh_client, host, expiration): gh_client.create_issue( "django", "django", "Cert expiring soon:
{}".format(host), "The cert for `{}` expires on {}, get a new one!".format( host, expiration ), "alex", labels=["ssl-cert"] )
Auto-labeling
Web hooks
def github_webhook(request): event = request.headers.get("X-Github-Event") if event != "pull_request": return
Response(status=200) body = json.load(request.stream) if body.get("action") not in {"opened", "reopened", "synchronize"}: return Response(status=200)
issue = repo.issue(body["number"]) pr = repo.pull_request(issue.number) changed_files = (f.filename for
f in pr.iter_files()) if "django/utils/crypto.py" in changed_files: issue.add_labels("security")
Other ideas
requirements.txt bumper
UI change reviewer
Github Web hook UI Reviewer Comment Screenshots
Approval process commit status
Thanks! Questions? https://github.com/alex https://speakerdeck.com/alex