Repository navigation
openroles 0.2.0: eleven more systems, careers sites, workplace - #9
Merged
Merged
Conversation
New readers, each in the same Job shape: Workable, Teamtailor, Personio, Recruitee, Rippling, JazzHR, Gem, Polymer, Manatal, Homerun and ClearCompany, and careersite, which reads any careers site's sitemap and the schema.org JobPosting on each job page (iCIMS and Eightfold sites among them). Each reader quotes the vendor's own words for its endpoint. Where the endpoint is documented as public, only an explicit Disallow stops a read; elsewhere robots.txt must be readable and allow it. Job.workplace says remote, hybrid or onsite from the board's own field. Politeness: Content-Signal ai-input=no is honoured, redirects are checked against the new host's robots.txt, a GET read twice sends its ETag, and XML declaring a DTD or entities is never parsed. Releases now publish from a version tag: PyPI, the GitHub release from the CHANGELOG entry, and the MCP Registry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LrnN33G65kWMuv8y7xpUk4
Every reader names its hosts, so a network allowlist (a firewall, a cloud sandbox's allowed domains) can be written from the boards themselves rather than from a copied list. Nothing is fetched for a board given as ats:token. Also `openroles hosts <target>...` on the command line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LrnN33G65kWMuv8y7xpUk4
An application sets its own User-Agent and the robots.txt agents it answers to through a public call, instead of assigning to the private _http module. Agents are only ever added: "*" and "openroles" are always kept. robots_allows() is public for anything else the application fetches. The Workday path example and the country example are invented. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LrnN33G65kWMuv8y7xpUk4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
openroles 0.2.0. Eleven more systems read into the same
Jobshape, and one reader for careers sites with no job API.careersite: any careers site that publishes its jobs for search engines, read from its sitemap and each job page's schema.orgJobPosting. Reaches iCIMS and Eightfold sites, among others. robots.txt must allow it, Crawl-delay is kept, at most 40 pages a call.openroles.configure(): an application embedding openroles sets its own User-Agent and the robots.txt agents it answers to (never fewer than*andopenroles), instead of assigning to private module state.openroles.robots_allows()is public.openroles.hosts()/openroles hosts: the hosts reading a board calls, for a network allowlist, with no request for a board given asats:token. Every reader has ahosts(token).Job.workplace: remote, hybrid or onsite, from the board's own field.Content-Signal: ai-input=nohonoured; redirects checked against the new host's robots.txt (at most five);ETagon a repeat GET; XML declaring a DTD or entities is refused.__version__,server.jsonand the CHANGELOG.llms.txt,server.json,pyproject.tomland the version at 0.2.0. Two docstring examples replaced with invented ones.How it was checked
Every reader has invented fixtures and tests (fields, a missing board, robots.txt saying no): 141 tests. Each new reader except Workable was run once against a real board on the vendor's own careers site, without keeping its data. Workable was not run live: its hosts answered 429 on every attempt, including today's, so that reader is built from Workable's documentation alone and the README says so.
pytestandruff check .pass (CI on 3.9 to 3.13; the wheel builds with all 16 readers)🤖 Generated with Claude Code
https://claude.ai/code/session_01LrnN33G65kWMuv8y7xpUk4