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
84
Learning from Failure: Post-mortems
alex
2
280
Techniques for Debugging Hard Problems
alex
1
550
Building Communities with Code Review
alex
4
270
Documenting Domain Specific Knowledge
alex
1
350
Pickles are for Delis, not for Software
alex
0
330
Code Review in Open Source Software
alex
4
750
Why Ruby isn't slow
alex
10
3.8k
PyPy + Swift
alex
2
510
Other Decks in Programming
See All in Programming
AWS で実現する安全な AI エージェントの作り方 〜 Bedrock Engineer の実装例を添えて 〜 / how-to-build-secure-ai-agents
gawa
8
840
状態と共に暮らす:ステートフルへの挑戦
ypresto
2
750
メモリウォールを超えて:キャッシュメモリ技術の進歩
kawayu
0
1.9k
The Efficiency Paradox and How to Save Yourself and the World
hollycummins
0
110
タイムゾーンの奥地は思ったよりも闇深いかもしれない
suguruooki
1
700
The Implementations of Advanced LR Parser Algorithm
junk0612
1
340
API for docs
soutaro
2
1.4k
Building a macOS screen saver with Kotlin (Android Makers 2025)
zsmb
1
160
地域ITコミュニティの活性化とAWSに移行してみた話
yuukis
0
250
DataStoreをテストする
mkeeda
0
300
AWSで雰囲気でつくる! VRChatの写真変換ピタゴラスイッチ
anatofuz
0
170
Boost Your Performance and Developer Productivity with Jakarta EE 11
ivargrimstad
0
150
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
49
7.7k
How STYLIGHT went responsive
nonsquared
99
5.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
41
2.2k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Code Review Best Practice
trishagee
67
18k
Producing Creativity
orderedlist
PRO
344
40k
RailsConf 2023
tenderlove
30
1.1k
The Pragmatic Product Professional
lauravandoore
33
6.5k
VelocityConf: Rendering Performance Case Studies
addyosmani
328
24k
Building Applications with DynamoDB
mza
94
6.3k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Building Flexible Design Systems
yeseniaperezcruz
329
38k
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