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
270
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
110
Learning from Failure: Post-mortems
alex
2
300
Techniques for Debugging Hard Problems
alex
1
610
Building Communities with Code Review
alex
4
310
Documenting Domain Specific Knowledge
alex
1
400
Pickles are for Delis, not for Software
alex
0
470
Code Review in Open Source Software
alex
4
790
Why Ruby isn't slow
alex
10
3.8k
PyPy + Swift
alex
2
540
Other Decks in Programming
See All in Programming
組み合わせ爆発にのまれない - 責務分割 x テスト
halhorn
1
170
Vibe codingでおすすめの言語と開発手法
uyuki234
0
130
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
140
tsgolintはいかにしてtypescript-goの非公開APIを呼び出しているのか
syumai
7
2.4k
複雑なUI設計への銀の弾丸 「オブジェクト指向UIデザイン」
teamlab
PRO
2
110
Graviton と Nitro と私
maroon1st
0
140
Grafana:建立系統全知視角的捷徑
blueswen
0
250
脳の「省エネモード」をデバッグする ~System 1(直感)と System 2(論理)の切り替え~
panda728
PRO
0
120
TestingOsaka6_Ozono
o3
0
180
Navigating Dependency Injection with Metro
l2hyunwoo
1
200
ThorVG Viewer In VS Code
nors
0
300
令和最新版Android Studioで化石デバイス向けアプリを作る
arkw
0
460
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.7k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
880
Java REST API Framework Comparison - PWX 2021
mraible
34
9k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
720
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
76
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
130
We Have a Design System, Now What?
morganepeng
54
7.9k
It's Worth the Effort
3n
187
29k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
680
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
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