Skip to content
View uhsear's full-sized avatar

Highlights

  • Pro

Block or report uhsear

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
uhsear/README.md

Asir Khan

GIS developer for a Florida county. I write scripts and tools for everyone to use, and increasingly for people working within the GIS community.

They are single-file Python, MIT licensed. Each one guards a specific production failure I have watched happen, and the README opens by describing that failure rather than the feature list. Anything destructive is dry-run by default and needs --apply.

Most carry a --self-test you can run before trusting the tool:

python <tool>.py --self-test

Thirteen need an Esri library to run (arcpy or the arcgis Python API): agol-relink, arcade-rule-deploy, arcpy-nullscan, fcload, fcpatch, fullpull, gdbprune, hostedreap, safe-republish, sightline, svcdrift, whowrites, xydrift.

Ten of those thirteen still run their self-test without one, because the import is deferred until the tool actually reaches a geodatabase or a portal. Three do not: fullpull and sightline need their library present even to self-test, and arcpy-nullscan is an older script with no self-test at all.

The other twenty-nine are standard library only and run anywhere Python 3 does. That includes two that read Esri formats without Esri software: cimscan parses .aprx and .lyrx with no ArcGIS installed, and gdbxray reads a geodatabase schema through GDAL.


ArcGIS Online and Enterprise

itemcensus Inventory every item in an organization, and refuse to report a total the server cannot prove is complete. Search counts accurately only to 10,000.
sharewatch Diff your sharing posture against yesterday, because the platform keeps no audit log. Read-only.
sightline Audit web maps for layers their viewers cannot see. Broken sharing, dead services, public maps pointing at secured data.
agol-relink Bulk-replace REST service URLs across Portal content, including the StoryMap and Experience Builder drafts other tools miss.
hostedreap Delete hosted feature layer rows that no longer exist in your source. Backup first, dry run by default.
fullpull Download every layer of a REST service into a File Geodatabase, verified against the server's own record count.
whobreaks Every item referencing the one you are about to delete, including the Experience Builder drafts a dependency graph never opens.
ghostsvc Services the server runs but the portal never registered. They answer anonymously and appear in no sharing report.

Geodatabase

safe-republish Refuse to truncate a feature class when the staged replacement fails a plausibility check.
fcload Load a dataset into a geodatabase, refusing the imports that corrupt silently.
gdbxray Print the schema ogrinfo will not show you: subtypes, attribute rules, attachment linkage.
gdbprune Delete stale leaf versions from a versioned Enterprise geodatabase, printing the plan first.
arcade-rule-deploy Deploy Arcade attribute rules, preflight-checked and idempotent. Resolves every FeatureSetByName before writing.
arcadecheck Inventory every Arcade expression you own and say which ones can leave with you.

Data quality

geocodesift Audit a geocoded batch instead of believing its match rate. A ZIP-centroid fallback still scores 98.
tzrot Find date fields reinterpreted as UTC, and count the records whose calendar day moved.
roadmiles Certify centerline mileage and refuse to count the same road twice, including the copy digitized backwards.
arcpy-nullscan Report NULL and blank values across every layer and standalone table in a map, including null geometry.
ringwind Name every GeoJSON ring wound against your declared convention. A backwards ring makes point-in-polygon answer backwards.
sidestamp Check what is stamped on each side of a centerline against the polygon that side fronts, and prove the sides are not reversed.
pl94 Read the Census PL 94-171 file for any US county, refusing a block extract that does not reconcile to the county total.
fcpatch Apply reviewed attribute corrections, refusing any row whose current value is no longer the value that was reviewed.
nalmatch Reconcile a parcel layer against the tax roll. Refuses any ID rule that would merge two parcels into one key.
idreuse Measure how far apart two rows sharing an ID actually are. A key that matches is not evidence they are the same object.
xydrift Name the rows whose stored coordinate columns disagree with their own geometry, and resync only those.
feedstamp Refuse to run the pipeline when the delivery is not a new, complete one. Yesterday's file is still a file.
svcdrift Diff a published service against the dataset it came from, rather than calling two different schemas the same.

Developer tooling

restfake A mock ArcGIS REST server that fails the way ArcGIS actually fails: 200 OK with an error body.
pytlint Static analysis for Python toolboxes. Never imports the file it checks.
cimscan Report every data source in a tree of .aprx and .lyrx files with no ArcGIS licence.
gdbfence Refuse the commit that puts a geodatabase, or a shapefile missing its .prj, into git.
clonedrift Name every script on a share that exists in more than one version, and say what the versions disagree about.
alwayszero Name every unattended script that cannot report failure. Task Scheduler has said 0x0 for four years.
whowrites Name every script that empties a feature class, and never name a reader as the thing that destroyed it.
jobharness One import gives a scheduled script logging, retry, resume and a safe unzip. Standard library only.
logsift Mine a scheduled job's own logs into metrics, refusing the number that is really a timestamp.
litswap Rename a string constant across a tree of scripts without touching one comment or docstring.

Operations

svcguard Guarantee an ArcGIS Server service restarts around risky maintenance, even on failure.
taskpulse Audit every Windows scheduled task and report which ones are silently failing.
stalehost Find every file still naming the host you are retiring, and never call a tree clean it could not finish reading.
svcsource Report what is behind every service on an ArcGIS Server site, and say which ones it could not resolve.
prostall Diagnose why ArcGIS Pro is slow here, measure every answer, and never record a crashed probe as a finding.

Start here if you are browsing: safe-republish is the shortest example of the idea. It refuses a truncate-and-append when the replacement data is not believable, because the row count people check first is the one that misses a 37 percent loss on a large layer.

Pinned Loading

  1. agol-relink agol-relink Public

    Bulk-replace REST service URLs across ArcGIS Online / Portal content. Dry-run by default, backs up every item, and patches the StoryMap/Experience Builder drafts that other tools miss.

    Python

  2. arcpy-nullscan arcpy-nullscan Public

    Report NULL and blank values across every layer and standalone table in an ArcGIS Pro map, including null geometry and standalone tables that naive scripts miss.

    Python

  3. gdbprune gdbprune Public

    Delete stale leaf versions from a traditionally-versioned Enterprise geodatabase, printing the plan first. Dry run by default.

    Python

  4. sightline sightline Public

    Audit ArcGIS Online web maps for layers their viewers cannot see. Finds broken sharing, dead services, and public maps pointing at secured data.

    Python

  5. svcguard svcguard Public

    Guarantee an ArcGIS Server service restarts around risky maintenance, even on failure. Standard library only, no arcpy.

    Python