Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
160
Learning from Failure: Post-mortems
alex
2
390
Techniques for Debugging Hard Problems
alex
1
670
Building Communities with Code Review
alex
4
350
Documenting Domain Specific Knowledge
alex
1
450
Pickles are for Delis, not for Software
alex
0
580
Code Review in Open Source Software
alex
4
830
Why Ruby isn't slow
alex
10
3.9k
PyPy + Swift
alex
2
600
Other Decks in Programming
See All in Programming
dotNET_vulnclicker_intro.pdf
deka_morita
0
150
golang-bob.pdf
iwatsukayura
0
130
JIS keyboard support in Omarchy
lef237
0
150
自作Discord音声botをLambda MicroVMsに移行した話 / Migrating My Discord Voice Bot to Lambda MicroVMs
akihisaikeda
0
140
Domain-Driven Transformation
hschwentner
2
2.3k
FactoryBotをやめればRSpecは速くなるのか?
yuta_onishi_97
0
980
オーケストレーション記述言語 Katari
yukikurage
0
150
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
190
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
ジョジョの世界をXRで再現する
mofurune
0
180
パスワード再設定メールのURLについて知っておこう
uyuki234
0
170
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
330
Game over? The fight for quality and originality in the time of robots
wayneb77
1
310
Testing 201, or: Great Expectations
jmmastey
46
8.3k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
570
Designing for Performance
lara
612
70k
Making Projects Easy
brettharned
120
6.8k
Done Done
chrislema
187
17k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Speed Design
sergeychernyshev
33
2.2k
How to make the Groovebox
asonas
2
2.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
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