numbers-parser 4.10.4__tar.gz → 4.10.6__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 (66) hide show
  1. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/PKG-INFO +9 -9
  2. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/README.md +2 -2
  3. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/pyproject.toml +35 -22
  4. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/__init__.py +1 -1
  5. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/_cat_numbers.py +4 -4
  6. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/_unpack_numbers.py +5 -5
  7. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/cell.py +150 -128
  8. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/constants.py +5 -6
  9. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/containers.py +11 -8
  10. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/document.py +147 -108
  11. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/exceptions.py +0 -7
  12. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/formula.py +3 -4
  13. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNArchives_pb2.py +24 -26
  14. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSAArchives_pb2.py +26 -28
  15. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCEArchives_pb2.py +8 -10
  16. numbers_parser-4.10.6/src/numbers_parser/generated/TSCHArchives_GEN_pb2.py +69 -0
  17. numbers_parser-4.10.6/src/numbers_parser/generated/TSCHArchives_pb2.py +148 -0
  18. numbers_parser-4.10.6/src/numbers_parser/generated/TSDArchives_pb2.py +237 -0
  19. numbers_parser-4.10.6/src/numbers_parser/generated/TSKArchives_pb2.py +283 -0
  20. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSPArchiveMessages_pb2.py +32 -34
  21. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSPMessages_pb2.py +40 -40
  22. numbers_parser-4.10.6/src/numbers_parser/generated/TSSArchives_pb2.py +64 -0
  23. numbers_parser-4.10.6/src/numbers_parser/generated/TSTArchives_pb2.py +440 -0
  24. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSTStylePropertyArchiving_pb2.py +8 -10
  25. numbers_parser-4.10.6/src/numbers_parser/generated/TSWPArchives_pb2.py +288 -0
  26. numbers_parser-4.10.6/src/numbers_parser/generated/TSWPCommandArchives_pb2.py +132 -0
  27. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/iwafile.py +17 -17
  28. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/iwork.py +33 -27
  29. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/model.py +94 -52
  30. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/numbers_uuid.py +6 -4
  31. numbers_parser-4.10.4/src/numbers_parser/generated/TSCHArchives_GEN_pb2.py +0 -75
  32. numbers_parser-4.10.4/src/numbers_parser/generated/TSCHArchives_pb2.py +0 -152
  33. numbers_parser-4.10.4/src/numbers_parser/generated/TSDArchives_pb2.py +0 -247
  34. numbers_parser-4.10.4/src/numbers_parser/generated/TSKArchives_pb2.py +0 -285
  35. numbers_parser-4.10.4/src/numbers_parser/generated/TSSArchives_pb2.py +0 -64
  36. numbers_parser-4.10.4/src/numbers_parser/generated/TSTArchives_pb2.py +0 -444
  37. numbers_parser-4.10.4/src/numbers_parser/generated/TSWPArchives_pb2.py +0 -324
  38. numbers_parser-4.10.4/src/numbers_parser/generated/TSWPCommandArchives_pb2.py +0 -132
  39. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/LICENSE.rst +0 -0
  40. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/bullets.py +0 -0
  41. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/currencies.py +0 -0
  42. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/data/empty.numbers +0 -0
  43. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/experimental.py +0 -0
  44. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNArchives_sos_pb2.py +0 -0
  45. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNCommandArchives_pb2.py +0 -0
  46. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNCommandArchives_sos_pb2.py +0 -0
  47. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSAArchives_sos_pb2.py +0 -0
  48. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSACommandArchives_sos_pb2.py +0 -0
  49. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCH3DArchives_pb2.py +0 -0
  50. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHArchives_Common_pb2.py +0 -0
  51. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHArchives_sos_pb2.py +0 -0
  52. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHCommandArchives_pb2.py +0 -0
  53. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHPreUFFArchives_pb2.py +0 -0
  54. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSDArchives_sos_pb2.py +0 -0
  55. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSDCommandArchives_pb2.py +0 -0
  56. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSKArchives_sos_pb2.py +0 -0
  57. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSPDatabaseMessages_pb2.py +0 -0
  58. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSSArchives_sos_pb2.py +0 -0
  59. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSTArchives_sos_pb2.py +0 -0
  60. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSTCommandArchives_pb2.py +0 -0
  61. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSWPArchives_sos_pb2.py +0 -0
  62. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/__init__.py +0 -0
  63. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/fontmap.py +0 -0
  64. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/functionmap.py +0 -0
  65. {numbers_parser-4.10.4/src/numbers_parser → numbers_parser-4.10.6/src/numbers_parser/generated}/mapping.py +24 -24
  66. {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/numbers_cache.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: numbers-parser
3
- Version: 4.10.4
3
+ Version: 4.10.6
4
4
  Summary: Read and write Apple Numbers spreadsheets
5
5
  Home-page: https://github.com/masaccio/numbers-parser
6
6
  License: MIT
@@ -16,14 +16,14 @@ Classifier: Programming Language :: Python :: 3.11
16
16
  Classifier: Programming Language :: Python :: 3.12
17
17
  Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
18
18
  Requires-Dist: compact-json (>=1.1.3,<2.0.0)
19
- Requires-Dist: enum-tools (>=0.11.0,<0.12.0)
20
- Requires-Dist: importlib-resources (>=6.1.1,<7.0.0)
19
+ Requires-Dist: enum-tools (>=0.11)
20
+ Requires-Dist: importlib-resources (>=6.1)
21
21
  Requires-Dist: pendulum (>=3.0,<4.0)
22
22
  Requires-Dist: protobuf
23
- Requires-Dist: python-snappy (>=0.6.1,<0.7.0)
24
- Requires-Dist: regex (>=2022.9.13,<2023.0.0)
25
- Requires-Dist: roman (>=3.3,<4.0)
26
- Requires-Dist: setuptools (>=69.0.3,<70.0.0)
23
+ Requires-Dist: python-snappy (>=0.7,<0.8)
24
+ Requires-Dist: regex (>2024.0)
25
+ Requires-Dist: roman (>=4.0)
26
+ Requires-Dist: setuptools (>=69.0.3)
27
27
  Requires-Dist: sigfig (>=1.3.2,<2.0.0)
28
28
  Project-URL: Documentation, https://github.com/masaccio/numbers-parser/blob/main/README.md
29
29
  Project-URL: Repository, https://github.com/masaccio/numbers-parser
@@ -34,8 +34,8 @@ Description-Content-Type: text/markdown
34
34
  [![Test Status](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml/badge.svg)](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml)[![Security Checks](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml/badge.svg)](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml)[![Code Coverage](https://codecov.io/gh/masaccio/numbers-parser/branch/main/graph/badge.svg?token=EKIUFGT05E)](https://codecov.io/gh/masaccio/numbers-parser)[![PyPI Version](https://badge.fury.io/py/numbers-parser.svg)](https://badge.fury.io/py/numbers-parser)
35
35
 
36
36
  `numbers-parser` is a Python module for parsing [Apple Numbers](https://www.apple.com/numbers/)`.numbers` files. It supports Numbers files
37
- generated by Numbers version 10.3, and up with the latest tested version being 13.2
38
- (current as of September 2023).
37
+ generated by Numbers version 10.3, and up with the latest tested version being 14.0
38
+ (current as of April 2024).
39
39
 
40
40
  It supports and is tested against Python versions from 3.9 onwards. It is not compatible
41
41
  with earlier versions of Python.
@@ -3,8 +3,8 @@
3
3
  [![Test Status](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml/badge.svg)](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml)[![Security Checks](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml/badge.svg)](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml)[![Code Coverage](https://codecov.io/gh/masaccio/numbers-parser/branch/main/graph/badge.svg?token=EKIUFGT05E)](https://codecov.io/gh/masaccio/numbers-parser)[![PyPI Version](https://badge.fury.io/py/numbers-parser.svg)](https://badge.fury.io/py/numbers-parser)
4
4
 
5
5
  `numbers-parser` is a Python module for parsing [Apple Numbers](https://www.apple.com/numbers/)`.numbers` files. It supports Numbers files
6
- generated by Numbers version 10.3, and up with the latest tested version being 13.2
7
- (current as of September 2023).
6
+ generated by Numbers version 10.3, and up with the latest tested version being 14.0
7
+ (current as of April 2024).
8
8
 
9
9
  It supports and is tested against Python versions from 3.9 onwards. It is not compatible
10
10
  with earlier versions of Python.
@@ -12,7 +12,7 @@ name = "numbers-parser"
12
12
  packages = [{include = "numbers_parser", from = "src"}]
13
13
  readme = "README.md"
14
14
  repository = "https://github.com/masaccio/numbers-parser"
15
- version = "4.10.4"
15
+ version = "4.10.6"
16
16
 
17
17
  [tool.poetry.scripts]
18
18
  cat-numbers = "numbers_parser._cat_numbers:main"
@@ -23,38 +23,50 @@ compact-json = "^1.1.3"
23
23
  pendulum = "^3.0"
24
24
  protobuf = "*"
25
25
  python = ">=3.9,<4.0"
26
- python-snappy = "^0.6.1"
27
- regex = "^2022.9.13"
28
- roman = "^3.3"
26
+ python-snappy = "^0.7"
27
+ regex = ">=2022.9.13,>2023.0,>2024.0"
28
+ roman = ">=3.3,>=4.0"
29
29
  sigfig = "^1.3.2"
30
- setuptools = "^69.0.3"
31
- importlib-resources = "^6.1.1"
32
- enum-tools = "^0.11.0"
30
+ setuptools = ">=69.0.3"
31
+ importlib-resources = ">=6.1"
32
+ enum-tools = ">=0.11"
33
33
 
34
34
  [tool.poetry.group.dev.dependencies]
35
35
  black = "*"
36
36
  gprof2dot = "^2022.7.29"
37
37
  line-profiler = "^4.0.3"
38
- mock = "^5.1.0"
39
- psutil = "^5.9.5"
40
- pytest = "^7.2.0"
41
- pytest-check = "^1.0.10"
38
+ mock = ">=5.1.0"
39
+ psutil = ">=5.9"
40
+ pytest = ">=7.2.0"
41
+ pytest-check = ">=1.0"
42
42
  pytest-console-scripts = "^1.3.1"
43
- pytest-cov = "^4.0.0"
43
+ pytest-cov = ">=4.0,>=5.0"
44
44
  pytest-profiling = "^1.7.0"
45
45
  pytest-xdist = "^3.3.1"
46
- ruff = "^0.0.292"
47
- termcolor = "^2.2.0"
46
+ ruff = "*"
47
+ termcolor = ">=2.2"
48
48
  tox = "^4.11.4"
49
- python-magic = "^0.4.27"
49
+ python-magic = ">=0.4"
50
+ tqdm = ">=4.66"
51
+
52
+ [tool.poetry.group.docs]
53
+ optional = true
50
54
 
51
55
  [tool.poetry.group.docs.dependencies]
52
- sphinx = "^7.2.6"
53
- enum-tools = "^0.11.0"
54
- sphinx-toolbox = "^3.5.0"
55
- sphinx-nefertiti = "^0.2.1"
56
- sphinx-markdown-builder = "^0.6.6"
57
- sphinx-copybutton = "^0.5.2"
56
+ sphinx = ">= 7.3"
57
+ enum-tools = ">=0.11"
58
+ sphinx-toolbox = ">=3.5"
59
+ sphinx-nefertiti = ">=0.3.3"
60
+ sphinx-markdown-builder = ">=0.6"
61
+ sphinx-copybutton = ">=0.5"
62
+
63
+ [tool.poetry.group.bootstrap]
64
+ optional = true
65
+
66
+ [tool.poetry.group.bootstrap.dependencies]
67
+ pyobjc-core = ">=10.2"
68
+ pyobjc-framework-Cocoa = ">=10.2"
69
+ py2app = ">=0.28"
58
70
 
59
71
  [build-system]
60
72
  build-backend = "poetry.core.masonry.api"
@@ -96,10 +108,11 @@ profile = "black"
96
108
  exclude = [
97
109
  # Machine-generated files
98
110
  ".bootstrap/*",
111
+ ".tox/*",
112
+ ".vscode/*",
99
113
  "src/numbers_parser/generated/*",
100
114
  # Third-party files not to lint
101
115
  "src/debug/lldbutil.py", # Tox
102
- ".tox/*",
103
116
  ]
104
117
  fix = true
105
118
  ignore = [
@@ -37,7 +37,7 @@ def _check_installed_numbers_version():
37
37
  installed_version = re.sub(r"(\d+)\.(\d+)\.\d+", r"\1.\2", installed_version)
38
38
  if installed_version not in SUPPORTED_NUMBERS_VERSIONS:
39
39
  warnings.warn(
40
- f"Numbers version {installed_version} not tested with this version", stacklevel=2
40
+ f"Numbers version {installed_version} not tested with this version", stacklevel=2,
41
41
  )
42
42
  fp.close()
43
43
  return installed_version
@@ -15,7 +15,7 @@ logger = logging.getLogger(numbers_parser_name)
15
15
 
16
16
  def command_line_parser():
17
17
  parser = argparse.ArgumentParser(
18
- description="Export data from Apple Numbers spreadsheet tables"
18
+ description="Export data from Apple Numbers spreadsheet tables",
19
19
  )
20
20
  commands = parser.add_mutually_exclusive_group()
21
21
  commands.add_argument(
@@ -49,15 +49,15 @@ def command_line_parser():
49
49
  help="Dump formatted cells (durations) as they appear in Numbers",
50
50
  )
51
51
  parser.add_argument(
52
- "-s", "--sheet", action="append", help="Names of sheet(s) to include in export"
52
+ "-s", "--sheet", action="append", help="Names of sheet(s) to include in export",
53
53
  )
54
54
  parser.add_argument(
55
- "-t", "--table", action="append", help="Names of table(s) to include in export"
55
+ "-t", "--table", action="append", help="Names of table(s) to include in export",
56
56
  )
57
57
  parser.add_argument("document", nargs="*", help="Document(s) to export")
58
58
  parser.add_argument("--debug", default=False, action="store_true", help="Enable debug logging")
59
59
  parser.add_argument(
60
- "--experimental", default=False, action="store_true", help=argparse.SUPPRESS
60
+ "--experimental", default=False, action="store_true", help=argparse.SUPPRESS,
61
61
  )
62
62
  return parser
63
63
 
@@ -69,7 +69,7 @@ class NumbersUnpacker(IWorkHandler):
69
69
  """Ensure that a path's directory exists."""
70
70
  parts = os.path.split(path)
71
71
  with contextlib.suppress(OSError):
72
- os.makedirs(os.path.join(*([self.output_dir] + list(parts[:-1]))))
72
+ os.makedirs(os.path.join(*([self.output_dir, *list(parts[:-1])])))
73
73
 
74
74
  def prettify_uuids(self, obj: object):
75
75
  if isinstance(obj, dict):
@@ -110,12 +110,12 @@ class NumbersUnpacker(IWorkHandler):
110
110
 
111
111
  def allowed_format(self, extension: str) -> bool:
112
112
  """bool: Return ``True`` if the filename extension is supported by the handler."""
113
- return True if extension == ".numbers" else False
113
+ return extension == ".numbers"
114
114
 
115
115
  def allowed_version(self, version: str) -> bool:
116
116
  """bool: Return ``True`` if the document version is allowed."""
117
117
  version = re.sub(r"(\d+)\.(\d+)\.\d+", r"\1.\2", version)
118
- return True if version in SUPPORTED_NUMBERS_VERSIONS else False
118
+ return version in SUPPORTED_NUMBERS_VERSIONS
119
119
 
120
120
 
121
121
  def main():
@@ -125,7 +125,7 @@ def main():
125
125
  parser.add_argument("--hex-uuids", action="store_true", help="print UUIDs as hex")
126
126
  parser.add_argument("--pretty-storage", action="store_true", help="pretty print cell storage")
127
127
  parser.add_argument(
128
- "--compact-json", action="store_true", help="Format JSON compactly as possible"
128
+ "--compact-json", action="store_true", help="Format JSON compactly as possible",
129
129
  )
130
130
  parser.add_argument("--pretty", action="store_true", help="Enable all prettifying options")
131
131
  parser.add_argument("--output", "-o", help="directory name to unpack into")
@@ -159,7 +159,7 @@ def main():
159
159
  pretty_storage=args.pretty_storage,
160
160
  compact_json=args.compact_json,
161
161
  output_dir=args.output,
162
- )
162
+ ),
163
163
  )
164
164
  iwork.open(Path(document))
165
165
  except (FileFormatError, FileError) as e: