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.
Files changed (69) hide show
  1. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/PKG-INFO +1 -1
  2. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/pyproject.toml +1 -1
  3. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/pyproject.toml.orig +1 -1
  4. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/commands.py +1 -1
  5. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/matching.py +12 -0
  6. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/LICENSE +0 -0
  7. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/README.md +0 -0
  8. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/__init__.py +0 -0
  9. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/__init__.py +0 -0
  10. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/adp.py +0 -0
  11. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/adpmyjobs.py +0 -0
  12. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/ashby.py +0 -0
  13. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/bamboohr.py +0 -0
  14. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/breezy.py +0 -0
  15. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/dayforce.py +0 -0
  16. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/eightfold.py +0 -0
  17. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/greenhouse.py +0 -0
  18. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/gupy.py +0 -0
  19. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/hireology.py +0 -0
  20. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/hiringthing.py +0 -0
  21. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/hrmdirect.py +0 -0
  22. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/isolvedhire.py +0 -0
  23. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/jazzhr.py +0 -0
  24. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/jobaffinity.py +0 -0
  25. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/jobstreet.py +0 -0
  26. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/join.py +0 -0
  27. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/lever.py +0 -0
  28. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/manatal.py +0 -0
  29. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/oracle.py +0 -0
  30. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/paycor.py +0 -0
  31. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/paylocity.py +0 -0
  32. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/personio.py +0 -0
  33. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/phenom.py +0 -0
  34. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/pinpoint.py +0 -0
  35. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/recruitee.py +0 -0
  36. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/recruiterflow.py +0 -0
  37. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/rippling.py +0 -0
  38. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/smartrecruiters.py +0 -0
  39. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/successfactors.js +0 -0
  40. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/successfactors.py +0 -0
  41. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/taleo.py +0 -0
  42. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/teamtailor.py +0 -0
  43. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/ukg.py +0 -0
  44. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/welcomekit.py +0 -0
  45. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/wellfound.py +0 -0
  46. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/werecruit.py +0 -0
  47. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/workable.py +0 -0
  48. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/workatastartup.py +0 -0
  49. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/workday.py +0 -0
  50. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/wttj.py +0 -0
  51. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/adapters/zohorecruit.py +0 -0
  52. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/cli.py +0 -0
  53. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/__init__.py +0 -0
  54. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/accounts.py +0 -0
  55. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/adapter.py +0 -0
  56. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/attempts.py +0 -0
  57. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/browser.py +0 -0
  58. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/conditions.py +0 -0
  59. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/countries.py +0 -0
  60. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/html.py +0 -0
  61. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/otp.py +0 -0
  62. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/passwords.py +0 -0
  63. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/paths.py +0 -0
  64. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/registry.py +0 -0
  65. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/results.py +0 -0
  66. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/snapshot.py +0 -0
  67. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/core/telemetry.py +0 -0
  68. {atsfill-0.0.6.dev202 → atsfill-0.0.6.dev203}/src/atsfill/py.typed +0 -0
  69. {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.dev202
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "atsfill"
3
- version = "0.0.6.dev202"
3
+ version = "0.0.6.dev203"
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.6.dev202"
3
+ version = "0.0.6.dev203"
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"
@@ -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