atsfill 0.0.4.dev53__tar.gz → 0.0.4.dev55__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 (38) hide show
  1. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/PKG-INFO +1 -1
  2. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/pyproject.toml +1 -1
  3. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/pyproject.toml.orig +1 -1
  4. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/smartrecruiters.py +5 -2
  5. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/commands.py +5 -4
  6. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/LICENSE +0 -0
  7. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/README.md +0 -0
  8. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/__init__.py +0 -0
  9. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/__init__.py +0 -0
  10. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/ashby.py +0 -0
  11. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/bamboohr.py +0 -0
  12. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/breezy.py +0 -0
  13. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/dayforce.py +0 -0
  14. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/greenhouse.py +0 -0
  15. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/hireology.py +0 -0
  16. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/jazzhr.py +0 -0
  17. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/lever.py +0 -0
  18. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/manatal.py +0 -0
  19. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/oracle.py +0 -0
  20. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/paycor.py +0 -0
  21. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/paylocity.py +0 -0
  22. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/phenom.py +0 -0
  23. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/recruitee.py +0 -0
  24. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/teamtailor.py +0 -0
  25. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/workable.py +0 -0
  26. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/adapters/wttj.py +0 -0
  27. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/cli.py +0 -0
  28. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/__init__.py +0 -0
  29. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/accounts.py +0 -0
  30. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/adapter.py +0 -0
  31. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/attempts.py +0 -0
  32. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/browser.py +0 -0
  33. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/matching.py +0 -0
  34. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/paths.py +0 -0
  35. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/registry.py +0 -0
  36. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/core/results.py +0 -0
  37. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/src/atsfill/py.typed +0 -0
  38. {atsfill-0.0.4.dev53 → atsfill-0.0.4.dev55}/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.dev53
3
+ Version: 0.0.4.dev55
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.dev53"
3
+ version = "0.0.4.dev55"
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.dev53"
3
+ version = "0.0.4.dev55"
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"
@@ -23,6 +23,9 @@ ONECLICK = re.compile(r"^/oneclick-ui/company/([^/]+)/publication/([^/]+)")
23
23
  APPLY_LINK = "a[href*='/oneclick-ui/company/']"
24
24
  QUESTIONS = "sr-screening-questions-form"
25
25
  CONTAINER = f"{QUESTIONS} [data-test=question-container]"
26
+ # The footer's buttons, named in the posting's language.
27
+ NEXT = "[data-test=footer-next] button"
28
+ SUBMIT = "[data-test=footer-submit] button"
26
29
  FORM_TIMEOUT_MS = 30_000
27
30
  COOKIE_TIMEOUT_MS = 5_000
28
31
  OPTION_TIMEOUT_MS = 10_000
@@ -194,7 +197,7 @@ class SmartRecruiters:
194
197
 
195
198
  def submit(self, page: Page) -> str | None:
196
199
  before = page.url
197
- page.get_by_role("button", name="Submit", exact=True).first.click()
200
+ page.locator(SUBMIT).first.click()
198
201
  page.wait_for_url(lambda url: url != before, timeout=SUBMIT_TIMEOUT_MS)
199
202
  return page.url
200
203
 
@@ -351,7 +354,7 @@ def _fill_profile(page: Page, field_id: str, selector: str, answer: Answer) -> N
351
354
  def _next(page: Page) -> None:
352
355
  """Goes on to the questions page. Never Submit: a posting with no questions submits from
353
356
  the profile page. A click right after the last answer can go unheeded, so it is repeated."""
354
- button = page.get_by_role("button", name="Next", exact=True)
357
+ button = page.locator(NEXT)
355
358
  for _ in range(NEXT_TRIES):
356
359
  if not button.count():
357
360
  return
@@ -39,9 +39,10 @@ def _login_required(url: str, adapter: Adapter) -> Result:
39
39
  def _opened(
40
40
  data: Path, url: str, sessions: Sessions | None, detected: list[str]
41
41
  ) -> Generator[tuple[Page, Adapter] | Result]:
42
- """The loaded page and the adapter that claims it by its URL, else by its page; or the
43
- result that ends the command first. An adapter that needs an account gets its session,
44
- and only that adapter's (ADR 0007). The adapter's name goes in `detected` once known."""
42
+ """The loaded page and the adapter that claims it by its URL, else by the URL a redirect
43
+ lands on, else by its page; or the result that ends the command first. An adapter that
44
+ needs an account gets its session, and only that adapter's (ADR 0007). The adapter's name
45
+ goes in `detected` once known."""
45
46
  adapter = _detect(url)
46
47
  if adapter:
47
48
  detected.append(adapter.name)
@@ -59,7 +60,7 @@ def _opened(
59
60
  raise
60
61
  # A page that never finishes loading (a redirect to an employer's career page)
61
62
  # is left to the adapter that claimed its URL.
62
- if adapter is None and (adapter := _detect(url, page)):
63
+ if adapter is None and (adapter := _detect(page.url) or _detect(url, page)):
63
64
  detected.append(adapter.name)
64
65
  if adapter is None:
65
66
  yield _no_adapter(url)
File without changes
File without changes