pypaperless-cli2 0.1.0__tar.gz → 0.2.0__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 (31) hide show
  1. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/PKG-INFO +1 -1
  2. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/pyproject.toml +1 -1
  3. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/commands/document/edit.py +5 -5
  4. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/converters/__init__.py +1 -0
  5. pypaperless_cli2-0.2.0/src/pypaperless_cli/utils/converters/date.py +29 -0
  6. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/types.py +5 -0
  7. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/LICENSE +0 -0
  8. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/README.md +0 -0
  9. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/__init__.py +0 -0
  10. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/api.py +0 -0
  11. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/app.py +0 -0
  12. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/commands/__init__.py +0 -0
  13. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/commands/auth.py +0 -0
  14. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/commands/document/__init__.py +0 -0
  15. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/commands/document/show.py +0 -0
  16. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/config/__init__.py +0 -0
  17. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/config/account.py +0 -0
  18. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/config/config.py +0 -0
  19. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/const.py +0 -0
  20. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/py.typed +0 -0
  21. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/__init__.py +0 -0
  22. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/converters/custom_field.py +0 -0
  23. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/converters/helpers/__init__.py +0 -0
  24. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/converters/helpers/strtobool.py +0 -0
  25. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/converters/tag.py +0 -0
  26. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/groups.py +0 -0
  27. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/highlighter.py +0 -0
  28. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/validators/__init__.py +0 -0
  29. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/validators/custom_field.py +0 -0
  30. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/validators/document.py +0 -0
  31. {pypaperless_cli2-0.1.0 → pypaperless_cli2-0.2.0}/src/pypaperless_cli/utils/validators/tag.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pypaperless-cli2
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Command-line interface for Paperless-ngx (fork of pypaperless-cli, updated for pypaperless 5.x / Paperless-ngx 3.x)
5
5
  License-File: LICENSE
6
6
  Author: Marcel Brückner
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "pypaperless-cli2"
3
- version = "0.1.0"
3
+ version = "0.2.0"
4
4
  description = "Command-line interface for Paperless-ngx (fork of pypaperless-cli, updated for pypaperless 5.x / Paperless-ngx 3.x)"
5
5
  authors = ["Marcel Brückner <marcelbrueckner@users.noreply.github.com>"]
6
6
  readme = "README.md"
@@ -8,7 +8,7 @@ from pypaperless.models.common import CustomFieldValue
8
8
 
9
9
  from pypaperless_cli.api import PaperlessAsyncAPI
10
10
  from pypaperless_cli.utils import converters, groups, validators
11
- from pypaperless_cli.utils.types import CustomFieldKeyValue, Document
11
+ from pypaperless_cli.utils.types import CustomFieldKeyValue, Date, Document
12
12
 
13
13
  group_tags = Group(name = "Tags parameters", sort_key=groups.standard_fields.sort_key+1)
14
14
  group_custom_fields = Group(name = "Custom fields parameters", sort_key=group_tags.sort_key+1)
@@ -21,7 +21,7 @@ async def edit(
21
21
  document_type: Optional[int] = None,
22
22
  storage_path: Optional[int] = None,
23
23
  title: Optional[str] = None,
24
- created_date: Optional[str] = None,
24
+ created_date: Optional[Date] = None,
25
25
 
26
26
  # Handle tags
27
27
  add_tags: Annotated[
@@ -86,7 +86,8 @@ async def edit(
86
86
  title: str
87
87
  Document title
88
88
  created_date: str
89
- The ISO 8601 date (YYYY-MM-DD) the document was initially issued.
89
+ The date the document was initially issued. Accepts several formats, e.g. YYYY-MM-DD
90
+ (ISO 8601) or DD.MM.YYYY (German), and normalizes them automatically.
90
91
 
91
92
  add_tags: List[str|int]
92
93
  Assign tags. Requires the ID or the exact name of the tags.
@@ -121,8 +122,7 @@ async def edit(
121
122
  document.title = title
122
123
 
123
124
  if created_date:
124
- from datetime import datetime
125
- document.created = datetime.strptime(created_date, "%Y-%m-%d").date()
125
+ document.created = created_date
126
126
 
127
127
  if remove_tags:
128
128
  # Only keep tags not in `remove_tags``
@@ -4,6 +4,7 @@ from typing import Any
4
4
 
5
5
 
6
6
  from pypaperless_cli.utils.converters.custom_field import custom_field_name_to_id
7
+ from pypaperless_cli.utils.converters.date import parse_date
7
8
  from pypaperless_cli.utils.converters.tag import tag_name_to_id
8
9
 
9
10
  import pypaperless_cli.utils.converters.helpers
@@ -0,0 +1,29 @@
1
+ """Date related converter"""
2
+
3
+ from typing import Any
4
+
5
+ import arrow
6
+
7
+ # Formats are tried in order until one matches; the first match wins.
8
+ # Day-first is assumed for dot/slash-separated dates (e.g. German invoices use DD.MM.YYYY),
9
+ # so MM/DD/YYYY-style US dates are deliberately not included to avoid ambiguity.
10
+ SUPPORTED_DATE_FORMATS = [
11
+ "YYYY-MM-DD",
12
+ "DD.MM.YYYY",
13
+ "DD.MM.YY",
14
+ "DD/MM/YYYY",
15
+ "YYYY/MM/DD",
16
+ ]
17
+
18
+ def parse_date(type_, *args) -> Any:
19
+ """Parses a date given in any of `SUPPORTED_DATE_FORMATS` into a `date` object."""
20
+
21
+ value = args[0]
22
+
23
+ try:
24
+ return arrow.get(value, SUPPORTED_DATE_FORMATS).date()
25
+ except arrow.parser.ParserError:
26
+ raise ValueError(
27
+ f"\"{value}\" is not a recognized date. Supported formats: "
28
+ + ", ".join(SUPPORTED_DATE_FORMATS)
29
+ )
@@ -1,5 +1,6 @@
1
1
  """Custom variable types."""
2
2
 
3
+ from datetime import date
3
4
  from typing import Annotated
4
5
 
5
6
  from cyclopts import Parameter
@@ -21,6 +22,10 @@ Document = Annotated[int, Parameter(
21
22
  validator = validators.document_exists
22
23
  )]
23
24
 
25
+ Date = Annotated[date, Parameter(
26
+ converter = converters.parse_date
27
+ )]
28
+
24
29
  CustomFieldKeyValue = Annotated[str|int, Parameter(
25
30
  converter = converters.custom_field_name_to_id,
26
31
  validator = validators.custom_field_exists