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.
Files changed (69) hide show
  1. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/PKG-INFO +1 -1
  2. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/pyproject.toml +1 -1
  3. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/pyproject.toml.orig +1 -1
  4. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/phenom.py +19 -1
  5. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/LICENSE +0 -0
  6. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/README.md +0 -0
  7. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/__init__.py +0 -0
  8. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/__init__.py +0 -0
  9. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/adp.py +0 -0
  10. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/adpmyjobs.py +0 -0
  11. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/ashby.py +0 -0
  12. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/bamboohr.py +0 -0
  13. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/breezy.py +0 -0
  14. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/dayforce.py +0 -0
  15. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/eightfold.py +0 -0
  16. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/greenhouse.py +0 -0
  17. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/gupy.py +0 -0
  18. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/hireology.py +0 -0
  19. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/hiringthing.py +0 -0
  20. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/hrmdirect.py +0 -0
  21. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/isolvedhire.py +0 -0
  22. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/jazzhr.py +0 -0
  23. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/jobaffinity.py +0 -0
  24. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/jobstreet.py +0 -0
  25. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/join.py +0 -0
  26. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/lever.py +0 -0
  27. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/manatal.py +0 -0
  28. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/oracle.py +0 -0
  29. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/paycor.py +0 -0
  30. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/paylocity.py +0 -0
  31. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/personio.py +0 -0
  32. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/pinpoint.py +0 -0
  33. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/recruitee.py +0 -0
  34. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/recruiterflow.py +0 -0
  35. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/rippling.py +0 -0
  36. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/smartrecruiters.py +0 -0
  37. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/successfactors.js +0 -0
  38. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/successfactors.py +0 -0
  39. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/taleo.py +0 -0
  40. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/teamtailor.py +0 -0
  41. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/ukg.py +0 -0
  42. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/welcomekit.py +0 -0
  43. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/wellfound.py +0 -0
  44. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/werecruit.py +0 -0
  45. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/workable.py +0 -0
  46. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/workatastartup.py +0 -0
  47. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/workday.py +0 -0
  48. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/wttj.py +0 -0
  49. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/adapters/zohorecruit.py +0 -0
  50. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/cli.py +0 -0
  51. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/__init__.py +0 -0
  52. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/accounts.py +0 -0
  53. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/adapter.py +0 -0
  54. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/attempts.py +0 -0
  55. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/browser.py +0 -0
  56. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/commands.py +0 -0
  57. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/conditions.py +0 -0
  58. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/countries.py +0 -0
  59. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/html.py +0 -0
  60. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/matching.py +0 -0
  61. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/otp.py +0 -0
  62. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/passwords.py +0 -0
  63. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/paths.py +0 -0
  64. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/registry.py +0 -0
  65. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/results.py +0 -0
  66. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/snapshot.py +0 -0
  67. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/core/telemetry.py +0 -0
  68. {atsfill-0.0.6.dev205 → atsfill-0.0.7.dev208}/src/atsfill/py.typed +0 -0
  69. {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.6.dev205
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "atsfill"
3
- version = "0.0.6.dev205"
3
+ version = "0.0.7.dev208"
4
4
  description = "Read, dry-run and submit job application forms on hiring systems: Ashby, Greenhouse, Teamtailor, Welcome to the Jungle."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "atsfill"
3
- version = "0.0.6.dev205"
3
+ version = "0.0.7.dev208"
4
4
  description = "Read, dry-run and submit job application forms on hiring systems: Ashby, Greenhouse, Teamtailor, Welcome to the Jungle."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -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("rate_limited: the careers site answers /applySubmit 403")
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