atsfill 0.0.4.dev86__tar.gz → 0.0.4.dev87__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 (45) hide show
  1. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/PKG-INFO +1 -1
  2. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/pyproject.toml +1 -1
  3. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/pyproject.toml.orig +1 -1
  4. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/rippling.py +6 -2
  5. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/browser.py +9 -3
  6. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/LICENSE +0 -0
  7. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/README.md +0 -0
  8. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/__init__.py +0 -0
  9. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/__init__.py +0 -0
  10. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/ashby.py +0 -0
  11. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/bamboohr.py +0 -0
  12. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/breezy.py +0 -0
  13. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/dayforce.py +0 -0
  14. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/eightfold.py +0 -0
  15. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/greenhouse.py +0 -0
  16. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/hireology.py +0 -0
  17. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/hiringthing.py +0 -0
  18. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/jazzhr.py +0 -0
  19. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/lever.py +0 -0
  20. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/manatal.py +0 -0
  21. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/oracle.py +0 -0
  22. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/paycor.py +0 -0
  23. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/paylocity.py +0 -0
  24. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/personio.py +0 -0
  25. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/phenom.py +0 -0
  26. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/pinpoint.py +0 -0
  27. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/recruitee.py +0 -0
  28. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/smartrecruiters.py +0 -0
  29. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/teamtailor.py +0 -0
  30. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/workable.py +0 -0
  31. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/wttj.py +0 -0
  32. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/adapters/zohorecruit.py +0 -0
  33. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/cli.py +0 -0
  34. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/__init__.py +0 -0
  35. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/accounts.py +0 -0
  36. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/adapter.py +0 -0
  37. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/attempts.py +0 -0
  38. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/commands.py +0 -0
  39. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/matching.py +0 -0
  40. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/passwords.py +0 -0
  41. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/paths.py +0 -0
  42. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/registry.py +0 -0
  43. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/core/results.py +0 -0
  44. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/py.typed +0 -0
  45. {atsfill-0.0.4.dev86 → atsfill-0.0.4.dev87}/src/atsfill/registry.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: atsfill
3
- Version: 0.0.4.dev86
3
+ Version: 0.0.4.dev87
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.4.dev86"
3
+ version = "0.0.4.dev87"
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.4.dev86"
3
+ version = "0.0.4.dev87"
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"
@@ -218,8 +218,12 @@ class Rippling:
218
218
  timeout=PARSE_TIMEOUT_MS,
219
219
  ):
220
220
  _attach(page, "resume", answers["resume"])
221
- with suppress(Timeout): # its notice covers the fields below it while it shows
222
- page.get_by_text(PARSED_NOTICE).wait_for(state="hidden", timeout=NOTICE_TIMEOUT_MS)
221
+ # The page writes the parse and shows its notice a moment after the response; the
222
+ # notice then covers the fields below it while it shows.
223
+ notice = page.get_by_text(PARSED_NOTICE)
224
+ with suppress(Timeout):
225
+ notice.wait_for(timeout=NOTICE_TIMEOUT_MS)
226
+ notice.wait_for(state="hidden", timeout=NOTICE_TIMEOUT_MS)
223
227
  for field_id, field in self._fields.items():
224
228
  if field_id == "resume" or field_id not in answers:
225
229
  continue
@@ -63,6 +63,8 @@ INCLUDE = re.compile(r"^!#include (\S+)$", re.M)
63
63
  # A page holding a banner the lists hide: until they do, the blocker is still starting.
64
64
  PROBE = ("https://blocker.invalid/", '<div id="cookie-banner">probe</div>')
65
65
  BLOCKER_TIMEOUT_MS = 30_000 # its lists take seconds to compile on each launch, more under load
66
+ OVERLAY_GRACE_MS = 1_000 # how long a cover may stay on a click target before it counts
67
+ OVERLAY_POLL_MS = 100
66
68
 
67
69
 
68
70
  class OutOfTime(Exception):
@@ -338,7 +340,11 @@ def overlay_on(target: Locator) -> str | None:
338
340
 
339
341
 
340
342
  def click(target: Locator) -> None:
341
- """Clicks the target, raising `Overlaid` when an overlay is on top of it."""
342
- if overlay := overlay_on(target):
343
- raise Overlaid(overlay)
343
+ """Clicks the target, raising `Overlaid` when an overlay stays on top of it for the grace
344
+ period: a toast or a spinner that goes within it is waited out."""
345
+ deadline = time.monotonic() + OVERLAY_GRACE_MS / 1000
346
+ while overlay := overlay_on(target):
347
+ if time.monotonic() >= deadline:
348
+ raise Overlaid(overlay)
349
+ target.page.wait_for_timeout(OVERLAY_POLL_MS)
344
350
  target.click()
File without changes
File without changes