atsfill 0.0.4.dev52__tar.gz → 0.0.4.dev54__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.dev52 → atsfill-0.0.4.dev54}/PKG-INFO +1 -1
  2. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/pyproject.toml +1 -1
  3. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/pyproject.toml.orig +1 -1
  4. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/ashby.py +7 -5
  5. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/smartrecruiters.py +5 -2
  6. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/LICENSE +0 -0
  7. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/README.md +0 -0
  8. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/__init__.py +0 -0
  9. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/__init__.py +0 -0
  10. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/bamboohr.py +0 -0
  11. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/breezy.py +0 -0
  12. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/dayforce.py +0 -0
  13. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/greenhouse.py +0 -0
  14. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/hireology.py +0 -0
  15. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/jazzhr.py +0 -0
  16. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/lever.py +0 -0
  17. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/manatal.py +0 -0
  18. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/oracle.py +0 -0
  19. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/paycor.py +0 -0
  20. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/paylocity.py +0 -0
  21. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/phenom.py +0 -0
  22. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/recruitee.py +0 -0
  23. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/teamtailor.py +0 -0
  24. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/workable.py +0 -0
  25. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/adapters/wttj.py +0 -0
  26. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/cli.py +0 -0
  27. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/__init__.py +0 -0
  28. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/accounts.py +0 -0
  29. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/adapter.py +0 -0
  30. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/attempts.py +0 -0
  31. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/browser.py +0 -0
  32. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/commands.py +0 -0
  33. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/matching.py +0 -0
  34. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/paths.py +0 -0
  35. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/registry.py +0 -0
  36. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/core/results.py +0 -0
  37. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/src/atsfill/py.typed +0 -0
  38. {atsfill-0.0.4.dev52 → atsfill-0.0.4.dev54}/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.dev52
3
+ Version: 0.0.4.dev54
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.dev52"
3
+ version = "0.0.4.dev54"
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.dev52"
3
+ version = "0.0.4.dev54"
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"
@@ -12,6 +12,7 @@ from functools import partial
12
12
  from typing import Any
13
13
  from urllib.parse import parse_qs, urlsplit
14
14
 
15
+ from atsfill.core import browser
15
16
  from atsfill.core.adapter import Blocked, Gap, Unsupported, known_gap
16
17
  from atsfill.core.browser import HTTP_TIMEOUT_S, Page, Response, Timeout
17
18
  from atsfill.core.results import Answer, Field, FieldType, SideEffect
@@ -152,16 +153,17 @@ class Ashby:
152
153
  case FieldType.CHOICE, str() if entry.locator("input[role=combobox]").count():
153
154
  entry.locator("input[role=combobox]").fill(answer)
154
155
  option = page.get_by_role("option", name=answer, exact=True)
155
- self._saved(page, option.click)
156
+ self._saved(page, partial(browser.click, option))
156
157
  case FieldType.CHOICE, str():
157
- self._saved(page, entry.get_by_text(answer, exact=True).click)
158
+ self._saved(page, partial(browser.click, entry.get_by_text(answer, exact=True)))
158
159
  case FieldType.MULTI_CHOICE, list():
159
160
  for value in answer:
160
- self._saved(page, entry.get_by_text(value, exact=True).click)
161
+ choice = entry.get_by_text(value, exact=True)
162
+ self._saved(page, partial(browser.click, choice))
161
163
  case FieldType.TYPEAHEAD, str():
162
164
  entry.locator("input[role=combobox]").fill(answer)
163
165
  option = page.get_by_role("option").filter(has_text=answer).first
164
- self._saved(page, option.click)
166
+ self._saved(page, partial(browser.click, option))
165
167
  case FieldType.FILE, str():
166
168
  upload = entry.locator("input[type=file]")
167
169
  self._saved(page, partial(upload.set_input_files, answer))
@@ -201,7 +203,7 @@ class Ashby:
201
203
  lambda r: _op(r).startswith("ApiSubmit") and _op(r).endswith("Action"),
202
204
  timeout=SUBMIT_TIMEOUT_MS,
203
205
  ) as submitted:
204
- page.locator(".ashby-application-form-submit-button").click()
206
+ browser.click(page.locator(".ashby-application-form-submit-button"))
205
207
  response = submitted.value
206
208
  text = response.text()
207
209
  if "RECAPTCHA_SCORE_BELOW_THRESHOLD" in text or "spam" in text.lower():
@@ -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
File without changes
File without changes