atsfill 0.0.6.dev202__tar.gz → 0.0.6.dev203__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.6.dev202 → atsfill-0.0.6.dev203}/PKG-INFO +1 -1
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/pyproject.toml +1 -1
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/pyproject.toml.orig +1 -1
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/commands.py +1 -1
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/matching.py +12 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/LICENSE +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/README.md +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/__init__.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/__init__.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/adp.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/adpmyjobs.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/ashby.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/bamboohr.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/breezy.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/dayforce.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/eightfold.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/greenhouse.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/gupy.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/hireology.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/hiringthing.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/hrmdirect.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/isolvedhire.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/jazzhr.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/jobaffinity.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/jobstreet.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/join.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/lever.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/manatal.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/oracle.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/paycor.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/paylocity.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/personio.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/phenom.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/pinpoint.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/recruitee.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/recruiterflow.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/rippling.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/smartrecruiters.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/successfactors.js +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/successfactors.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/taleo.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/teamtailor.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/ukg.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/welcomekit.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/wellfound.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/werecruit.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/workable.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/workatastartup.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/workday.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/wttj.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/zohorecruit.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/cli.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/__init__.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/accounts.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/adapter.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/attempts.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/browser.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/conditions.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/countries.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/html.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/otp.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/passwords.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/paths.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/registry.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/results.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/snapshot.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/telemetry.py +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/py.typed +0 -0
- {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/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.
|
|
3
|
+
Version: 0.0.6.dev203
|
|
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
|
|
@@ -426,7 +426,7 @@ def _fill(
|
|
|
426
426
|
result.status, result.reason = Status.REFUSED, "invalid_answers: " + "; ".join(problems)
|
|
427
427
|
return result
|
|
428
428
|
result.warnings = matching.knockouts(result.fields, answers)
|
|
429
|
-
adapter.fill(page, answers)
|
|
429
|
+
adapter.fill(page, matching.to_fill(result.fields, answers))
|
|
430
430
|
_shown_as_listed(page, adapter, result, answers)
|
|
431
431
|
if result.status is not Status.READY:
|
|
432
432
|
return result
|
|
@@ -51,6 +51,9 @@ def _absolute_url(value: str) -> bool:
|
|
|
51
51
|
def matches(
|
|
52
52
|
field: Field, answer: Answer, read_back: Answer | None, form: Form | None = None
|
|
53
53
|
) -> bool:
|
|
54
|
+
if field.type is FieldType.MULTI_CHOICE and answer == []:
|
|
55
|
+
# a cleared list: a read-back may leave out a field that holds nothing
|
|
56
|
+
return read_back in (None, "", [])
|
|
54
57
|
if read_back is None:
|
|
55
58
|
return False
|
|
56
59
|
match field.type:
|
|
@@ -98,6 +101,8 @@ def _answer_problem(field: Field, answer: object, form: Form) -> str | None:
|
|
|
98
101
|
if field.type is FieldType.MULTI_CHOICE:
|
|
99
102
|
if not (isinstance(answer, list) and all(isinstance(v, str) for v in answer)):
|
|
100
103
|
return "a multi_choice answer is a list of strings"
|
|
104
|
+
if not answer:
|
|
105
|
+
return "required, so an empty list does not answer it" if form.asked(field) else None
|
|
101
106
|
values = answer
|
|
102
107
|
elif not isinstance(answer, str):
|
|
103
108
|
return f"a {field.type} answer is a string"
|
|
@@ -169,6 +174,13 @@ def problems(fields: list[Field], answers: dict[str, Answer]) -> list[str]:
|
|
|
169
174
|
return out
|
|
170
175
|
|
|
171
176
|
|
|
177
|
+
def to_fill(fields: list[Field], answers: dict[str, Answer]) -> dict[str, Answer]:
|
|
178
|
+
"""The answers an adapter fills, after `problems` passed them: an empty list clears what a
|
|
179
|
+
field holds, so one that holds nothing has nothing to fill."""
|
|
180
|
+
by_id = {f.id: f for f in fields}
|
|
181
|
+
return {i: a for i, a in answers.items() if a != [] or by_id[i].prefilled or by_id[i].default}
|
|
182
|
+
|
|
183
|
+
|
|
172
184
|
def knockouts(fields: list[Field], answers: dict[str, Answer]) -> list[str]:
|
|
173
185
|
"""The answers that end the application: never refused, as one can be the truthful one."""
|
|
174
186
|
by_id = {f.id: f for f in fields}
|
|
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
|
|
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
|