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 building better tools for ourselves
Search
Alex Gaynor
May 30, 2016
Programming
1
220
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
70
Learning from Failure: Post-mortems
alex
2
260
Techniques for Debugging Hard Problems
alex
1
480
Building Communities with Code Review
alex
4
240
Documenting Domain Specific Knowledge
alex
1
290
Pickles are for Delis, not for Software
alex
0
280
Code Review in Open Source Software
alex
4
710
Why Ruby isn't slow
alex
10
3.7k
PyPy + Swift
alex
2
490
Other Decks in Programming
See All in Programming
日付と正規化
megmogmog1965
0
140
Trial
cairolibrary720
1
130
CSC307 Lecture 07
javiergs
PRO
0
220
Introduction to GitOps
hwchiu
0
110
12年前の『型システム入門』翻訳の思い出話
mame
11
1.2k
データカタログ運用物語 〜令和6年夏の理想と現実〜
kuro_kurorrr
0
110
GraphQL はいいぞ! ~Laravel で学ぶ GraphQL 入門~
azuki
1
160
Webエディタライブラリ 「CodeMirror」から学ぶ Webアプリ開発のテクニック
ryosukeigarashi
0
250
DMMプラットフォームにおけるTiDBの導入から運用まで
pospome
7
3k
ぼっちを避けて楽しむためのアノテコノテ / Various Tips and Tricks to Avoid Loneliness and Have Fun
nrslib
3
1.7k
APIのない大学ログインWebサービスをWKWebViewとJavaScriptでアプリ化した話
akidon0000
1
330
初心者がおさえておきたいAWS CDKのベストプラクティス 2024
konokenj
15
7.3k
Featured
See All Featured
The Cult of Friendly URLs
andyhume
75
5.9k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
36
9.1k
Building Adaptive Systems
keathley
34
2k
Documentation Writing (for coders)
carmenintech
63
4.2k
Gamification - CAS2011
davidbonilla
78
4.9k
Build The Right Thing And Hit Your Dates
maggiecrowley
28
2.2k
Side Projects
sachag
451
42k
Leading Effective Engineering Teams 2024
addyosmani
3
300
ReactJS: Keep Simple. Everything can be a component!
pedronauck
662
120k
The MySQL Ecosystem @ GitHub 2015
samlambert
248
12k
Designing with Data
zakiwarfel
96
5k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
277
13k
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