atsfill 0.0.6.dev205__tar.gz → 0.0.7.dev208__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/PKG-INFO +1 -1
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/pyproject.toml +1 -1
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/pyproject.toml.orig +1 -1
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/phenom.py +19 -1
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/LICENSE +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/README.md +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/__init__.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/__init__.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/adp.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/adpmyjobs.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/ashby.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/bamboohr.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/breezy.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/dayforce.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/eightfold.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/greenhouse.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/gupy.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/hireology.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/hiringthing.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/hrmdirect.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/isolvedhire.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/jazzhr.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/jobaffinity.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/jobstreet.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/join.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/lever.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/manatal.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/oracle.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/paycor.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/paylocity.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/personio.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/pinpoint.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/recruitee.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/recruiterflow.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/rippling.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/smartrecruiters.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/successfactors.js +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/successfactors.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/taleo.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/teamtailor.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/ukg.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/welcomekit.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/wellfound.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/werecruit.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/workable.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/workatastartup.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/workday.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/wttj.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/zohorecruit.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/cli.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/__init__.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/accounts.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/adapter.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/attempts.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/browser.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/commands.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/conditions.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/countries.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/html.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/matching.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/otp.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/passwords.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/paths.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/registry.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/results.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/snapshot.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/telemetry.py +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/py.typed +0 -0
- {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/registry.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: atsfill
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.7.dev208
|
|
4
4
|
Summary: Read, dry-run and submit job application forms on hiring systems: Ashby, Greenhouse, Teamtailor, Welcome to the Jungle.
|
|
5
5
|
Keywords: job-applications,ats,ashby,greenhouse,teamtailor,ai-agents,cli
|
|
6
6
|
Author: shbernal
|
|
@@ -71,6 +71,7 @@ MAX_STEPS = 12
|
|
|
71
71
|
OPTIONS_TIMEOUT_S = 8
|
|
72
72
|
LOADERS_AT_ONCE = 8 # a loader request a country: 245 on one site
|
|
73
73
|
COUNTRIES_KEPT_S = 24 * 3600 # a site's country fields, kept between reads
|
|
74
|
+
RATE_LIMITED = "rate_limited: the careers site answers /applySubmit 403"
|
|
74
75
|
YES_NO = ["Yes", "No"]
|
|
75
76
|
NO_YES = ["No", "Yes"]
|
|
76
77
|
MONTH = " (MM/YYYY)"
|
|
@@ -373,11 +374,28 @@ class Phenom:
|
|
|
373
374
|
raise RuntimeError(f"no configuration for the wizard ({e})") from None
|
|
374
375
|
finally: # raised once the read ends, so the answers that came are kept
|
|
375
376
|
if refused:
|
|
376
|
-
raise Blocked(
|
|
377
|
+
raise Blocked(RATE_LIMITED)
|
|
377
378
|
self._raws = {raw["id"]: raw for raw in raws}
|
|
378
379
|
return fields
|
|
379
380
|
|
|
380
381
|
def fill(self, page: Page, answers: dict[str, Answer]) -> None:
|
|
382
|
+
"""Fills the steps. The firewall can start refusing mid-fill, which the page does not
|
|
383
|
+
show: the step just never passes."""
|
|
384
|
+
refused = False
|
|
385
|
+
|
|
386
|
+
def on_response(response: Any) -> None:
|
|
387
|
+
nonlocal refused
|
|
388
|
+
refused |= response.status == 403 and "/applySubmit" in response.url
|
|
389
|
+
|
|
390
|
+
page.on("response", on_response)
|
|
391
|
+
try:
|
|
392
|
+
self._fill_steps(page, answers)
|
|
393
|
+
finally:
|
|
394
|
+
page.remove_listener("response", on_response)
|
|
395
|
+
if refused:
|
|
396
|
+
raise Blocked(RATE_LIMITED)
|
|
397
|
+
|
|
398
|
+
def _fill_steps(self, page: Page, answers: dict[str, Answer]) -> None:
|
|
381
399
|
page.context.clear_cookies()
|
|
382
400
|
self._open(page, fresh=True)
|
|
383
401
|
self._accept_terms(page)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|