mirror of
https://github.com/MadsLorentzen/ai-job-search.git
synced 2026-11-02 13:12:50 +00:00
fix(job-key): report a non-string url in --audit instead of a traceback (#634)
* fix(job-key): report a non-string url in --audit instead of a traceback A numeric, list or object url crashed the duplicate-URL pass with an AttributeError on .rstrip. Report it with a one-line error naming the key, as the other malformed-state branches do. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> * changelog: place the #634 entry under [Unreleased] Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com> Co-authored-by: Mads Lorentzen <madslorentzen_17@hotmail.com>
This commit is contained in:
3 files changed
+17
No files matched your search
@@ -72,6 +72,11 @@ per-file diff commands.
|
|||||||
`--country`. Results, stdout and the exit code are unchanged, so a bucket freehire adds later
|
`--country`. Results, stdout and the exit code are unchanged, so a bucket freehire adds later
|
||||||
still works.
|
still works.
|
||||||
|
|
||||||
|
- **`job_key.py --audit` reports an entry whose `url` is not a string** (#634, `tools/job_key.py`,
|
||||||
|
`tests/test_job_key.py`) - a numeric, list or object `url` crashed the duplicate-URL pass with an
|
||||||
|
`AttributeError` traceback on `.rstrip`, although the audit already reports other malformed state
|
||||||
|
with a one-line error and exit 1. It now names the offending key the same way.
|
||||||
|
|
||||||
## [1.7.3] - 2026-10-19
|
## [1.7.3] - 2026-10-19
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -278,6 +278,14 @@ class AuditCLI(unittest.TestCase):
|
|||||||
self.assertIn("entry is not an object: acme_soc-analyst", proc.stderr)
|
self.assertIn("entry is not an object: acme_soc-analyst", proc.stderr)
|
||||||
self.assertNotIn("Traceback", proc.stderr)
|
self.assertNotIn("Traceback", proc.stderr)
|
||||||
|
|
||||||
|
def test_non_string_url_is_reported_not_a_traceback(self):
|
||||||
|
for bad in (123, ["https://example.com/job"], {"href": "x"}):
|
||||||
|
with self.subTest(url=bad):
|
||||||
|
proc = self.run_audit_raw({"seen": {"acme_soc-analyst": {"company": "Acme", "title": "SOC Analyst", "url": bad}}})
|
||||||
|
self.assertEqual(proc.returncode, 1)
|
||||||
|
self.assertIn("entry url is not a string: acme_soc-analyst", proc.stderr)
|
||||||
|
self.assertNotIn("Traceback", proc.stderr)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
@@ -191,6 +191,10 @@ def audit(path: Path) -> int:
|
|||||||
if not_objects:
|
if not_objects:
|
||||||
print(f"{path}: entry is not an object: {not_objects[0]}", file=sys.stderr)
|
print(f"{path}: entry is not an object: {not_objects[0]}", file=sys.stderr)
|
||||||
return 1
|
return 1
|
||||||
|
bad_url = [k for k, v in seen.items() if v.get("url") is not None and not isinstance(v["url"], str)]
|
||||||
|
if bad_url:
|
||||||
|
print(f"{path}: entry url is not a string: {bad_url[0]}", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
|
||||||
malformed = [k for k in seen if not is_canonical(k) and not is_legacy_shape(k)]
|
malformed = [k for k in seen if not is_canonical(k) and not is_legacy_shape(k)]
|
||||||
legacy = [k for k in seen if is_legacy_shape(k)]
|
legacy = [k for k in seen if is_legacy_shape(k)]
|
||||||
|
|||||||
Reference in new issue
Block a user