atsfill 0.0.4.dev124__tar.gz → 0.0.4.dev125__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.4.dev124 → atsfill-0.0.4.dev125}/PKG-INFO +1 -1
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/pyproject.toml +1 -1
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/pyproject.toml.orig +1 -1
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/wttj.py +14 -3
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/LICENSE +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/README.md +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/__init__.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/__init__.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/ashby.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/bamboohr.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/breezy.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/dayforce.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/eightfold.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/greenhouse.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/gupy.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/hireology.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/hiringthing.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/hrmdirect.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/jazzhr.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/join.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/lever.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/manatal.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/oracle.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/paycor.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/paylocity.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/personio.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/phenom.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/pinpoint.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/recruitee.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/rippling.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/smartrecruiters.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/successfactors.js +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/successfactors.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/taleo.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/teamtailor.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/ukg.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/workable.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/workday.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/adapters/zohorecruit.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/cli.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/__init__.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/accounts.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/adapter.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/attempts.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/browser.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/commands.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/conditions.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/html.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/matching.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/passwords.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/paths.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/registry.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/core/results.py +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/src/atsfill/py.typed +0 -0
- {atsfill-0.0.4.dev124 → atsfill-0.0.4.dev125}/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.
|
|
3
|
+
Version: 0.0.4.dev125
|
|
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
|
|
@@ -13,7 +13,7 @@ from urllib.parse import urlsplit
|
|
|
13
13
|
|
|
14
14
|
from atsfill.core import browser, matching
|
|
15
15
|
from atsfill.core.adapter import Blocked, Gap, NotTaken, Refused, Unsupported
|
|
16
|
-
from atsfill.core.browser import Locator, Page, Request, Response, Timeout
|
|
16
|
+
from atsfill.core.browser import Locator, Page, PageRequest, Request, Response, Timeout
|
|
17
17
|
from atsfill.core.results import Answer, Field, FieldType, SideEffect
|
|
18
18
|
|
|
19
19
|
HOST = "www.welcometothejungle.com"
|
|
@@ -205,12 +205,21 @@ def _account_form(page: Page, form: str, values: dict[str, str], posts: str) ->
|
|
|
205
205
|
page.wait_for_function(
|
|
206
206
|
"() => document.cookie.includes('csrf-token=')", timeout=ACCOUNT_TIMEOUT_MS
|
|
207
207
|
)
|
|
208
|
+
sent: list[PageRequest] = []
|
|
208
209
|
answered: list[Response] = []
|
|
209
210
|
|
|
211
|
+
def posted(request: PageRequest) -> bool:
|
|
212
|
+
return request.method == "POST" and urlsplit(request.url).path.endswith(posts)
|
|
213
|
+
|
|
214
|
+
def on_request(request: PageRequest) -> None:
|
|
215
|
+
if posted(request):
|
|
216
|
+
sent.append(request)
|
|
217
|
+
|
|
210
218
|
def on_response(response: Response) -> None:
|
|
211
|
-
if response.request
|
|
219
|
+
if posted(response.request):
|
|
212
220
|
answered.append(response)
|
|
213
221
|
|
|
222
|
+
page.on("request", on_request)
|
|
214
223
|
page.on("response", on_response)
|
|
215
224
|
on_form = page.url
|
|
216
225
|
page.locator(f"[data-testid={form}-submit-button]").click()
|
|
@@ -223,7 +232,8 @@ def _account_form(page: Page, form: str, values: dict[str, str], posts: str) ->
|
|
|
223
232
|
# the page leaves the form on its own: a navigation before then is aborted
|
|
224
233
|
page.wait_for_url(lambda url: url != on_form, timeout=ACCOUNT_TIMEOUT_MS)
|
|
225
234
|
return
|
|
226
|
-
|
|
235
|
+
# the page can show the answer before its response event arrives here
|
|
236
|
+
if said.count() and not sent:
|
|
227
237
|
field = said.first.get_attribute("data-testid") or ""
|
|
228
238
|
text = said.first.inner_text().strip()
|
|
229
239
|
if field.endswith("-password-error"):
|
|
@@ -231,6 +241,7 @@ def _account_form(page: Page, form: str, values: dict[str, str], posts: str) ->
|
|
|
231
241
|
raise Unsupported(f"unhandled_rendering: the form says {text!r}")
|
|
232
242
|
page.wait_for_timeout(ACCOUNT_POLL_MS)
|
|
233
243
|
finally:
|
|
244
|
+
page.remove_listener("request", on_request)
|
|
234
245
|
page.remove_listener("response", on_response)
|
|
235
246
|
raise Unsupported("unhandled_rendering: the form answered nothing")
|
|
236
247
|
|
|
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
|