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
300
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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
More Decks by Alex Gaynor
See All by Alex Gaynor
Quantifying Memory Unsafety and Reactions to It
alex
0
150
Learning from Failure: Post-mortems
alex
2
360
Techniques for Debugging Hard Problems
alex
1
660
Building Communities with Code Review
alex
4
340
Documenting Domain Specific Knowledge
alex
1
440
Pickles are for Delis, not for Software
alex
0
560
Code Review in Open Source Software
alex
4
820
Why Ruby isn't slow
alex
10
3.9k
PyPy + Swift
alex
2
590
Other Decks in Programming
See All in Programming
Hono + Inertia + React で LP を構築した話
oukayuka
2
200
Go を使い始めて 2 ヶ月の学び / My first two months with Go
contour_gara
0
410
AIエージェント時代のコードレビューを設計する
nogu66
5
2.4k
ソフトウェアラスタライザ
fadis
1
780
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
280
一参加者から『中の人』へ 〜全通PHPerがブースに立って学んだ、カンファレンスを100倍楽しむコツ〜
wp_daisuke
0
100
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
800
ALB ログから Trace を気合で繋げる技術
fohte
7
850
Oxlintはいいぞ(続)
yug1224
1
530
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
620
まだ間に合う!今年の夏こそSchemeのマクロ展開器を完全理解!
omasanori
0
620
My Marp Sample
sinoue0108
0
140
Featured
See All Featured
Designing for Timeless Needs
cassininazir
1
470
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.5k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
230
Designing for humans not robots
tammielis
254
26k
How to Talk to Developers About Accessibility
jct
2
530
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Color Theory Basics | Prateek | Gurzu
gurzu
0
450
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Building Experiences: Design Systems, User Experience, and Full Site Editing
marktimemedia
0
590
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