Drill 02: API Discovery
Explore unfamiliar JSON APIs by flattening and grepping.
Run This Drill
bash ~/atelier/_bibliotheca/domus-captures/docs/modules/ROOT/examples/gron-drills/02-api-discovery.sh
Drill Script
#!/bin/bash
# GRON DRILL 02: API DISCOVERY
# Paste this entire script into your terminal
# Topics: Exploring GitHub API with gron
# Requires: gh CLI authenticated
echo "=================================================================="
echo " GRON DRILL 02: API DISCOVERY "
echo "=================================================================="
echo ""
if ! command -v gh &>/dev/null; then
echo "ERROR: gh CLI not found. Install: sudo pacman -S github-cli"
exit 1
fi
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.1: EXPLORE YOUR PROFILE"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh api user | gron | head -20"
gh api user | gron | head -20
echo " ..."
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.2: FIND SPECIFIC FIELDS"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh api user | gron | grep -i repo"
gh api user | gron | grep -i repo
echo ""
echo "Command: gh api user | gron | grep -i created"
gh api user | gron | grep -i created
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.3: DISCOVER → EXTRACT"
echo "gron found the paths, now use jq"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh api user | jq '{login, repos: .public_repos, created: .created_at}'"
gh api user | jq '{login, repos: .public_repos, created: .created_at}'
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.4: EXPLORE A REPO"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh api 'repos/EvanusModestus/domus-captures' | gron | grep -iE 'lang|size|topic' | head -10"
gh api 'repos/EvanusModestus/domus-captures' | gron | grep -iE 'lang|size|topic' | head -10
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.5: EXPLORE COMMITS"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh api 'repos/EvanusModestus/domus-captures/commits?per_page=3' | gron | grep message"
gh api 'repos/EvanusModestus/domus-captures/commits?per_page=3' | gron | grep message
echo ""
echo "Path discovered: json[N].commit.message"
echo ""
echo "Command: gh api 'repos/EvanusModestus/domus-captures/commits?per_page=3' | jq '.[].commit.message'"
gh api 'repos/EvanusModestus/domus-captures/commits?per_page=3' | jq '.[].commit.message'
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.6: RECONSTRUCT FILTERED VIEW"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh api 'repos/EvanusModestus/domus-captures' | gron | grep -E '(name|language|default_branch)' | gron --ungron"
gh api 'repos/EvanusModestus/domus-captures' | gron | grep -E '(\.name |\.language |\.default_branch )' | gron --ungron
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "DRILL 2.7: FIND THE RIGHT FIELD NAME"
echo "Classic problem: is it fullName or full_name?"
echo "------------------------------------------------------------------"
echo ""
echo "Command: gh search code 'vault' --owner EvanusModestus --json repository --limit 1 | gron | grep -i name"
gh search code 'vault' --owner EvanusModestus --json repository --limit 1 | gron | grep -i name
echo ""
echo "(Answer: .repository.full_name — snake_case)"
echo ""
# ---------------------------------------------------------------------------
echo "------------------------------------------------------------------"
echo "YOUR TURN - TRY THESE:"
echo "------------------------------------------------------------------"
echo ""
echo "1. Explore branches:"
echo " gh api 'repos/EvanusModestus/domus-captures/branches' | gron | head -20"
echo ""
echo "2. Find protection info:"
echo " gh api 'repos/EvanusModestus/domus-captures/branches' | gron | grep protect"
echo ""
echo "3. Discover stargazers path, then extract:"
echo " gh api 'repos/EvanusModestus/domus-captures' | gron | grep star"
echo " gh api 'repos/EvanusModestus/domus-captures' | jq '.stargazers_count'"
echo ""
echo "------------------------------------------------------------------"
echo "KEY TAKEAWAYS:"
echo "1. gh api returns JSON — gron makes it explorable"
echo "2. Always quote URLs with ? in zsh: gh api 'url?param=val'"
echo "3. gron | grep finds field names you don't know"
echo "4. gron path minus 'json' prefix = jq path"
echo "5. Discovery first (gron), extraction second (jq)"
echo "------------------------------------------------------------------"