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.
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/PKG-INFO +9 -9
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/README.md +2 -2
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/pyproject.toml +35 -22
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/__init__.py +1 -1
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/_cat_numbers.py +4 -4
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/_unpack_numbers.py +5 -5
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/cell.py +150 -128
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/constants.py +5 -6
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/containers.py +11 -8
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/document.py +147 -108
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/exceptions.py +0 -7
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/formula.py +3 -4
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNArchives_pb2.py +24 -26
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSAArchives_pb2.py +26 -28
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCEArchives_pb2.py +8 -10
- numbers_parser-4.10.6/src/numbers_parser/generated/TSCHArchives_GEN_pb2.py +69 -0
- numbers_parser-4.10.6/src/numbers_parser/generated/TSCHArchives_pb2.py +148 -0
- numbers_parser-4.10.6/src/numbers_parser/generated/TSDArchives_pb2.py +237 -0
- numbers_parser-4.10.6/src/numbers_parser/generated/TSKArchives_pb2.py +283 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSPArchiveMessages_pb2.py +32 -34
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSPMessages_pb2.py +40 -40
- numbers_parser-4.10.6/src/numbers_parser/generated/TSSArchives_pb2.py +64 -0
- numbers_parser-4.10.6/src/numbers_parser/generated/TSTArchives_pb2.py +440 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSTStylePropertyArchiving_pb2.py +8 -10
- numbers_parser-4.10.6/src/numbers_parser/generated/TSWPArchives_pb2.py +288 -0
- numbers_parser-4.10.6/src/numbers_parser/generated/TSWPCommandArchives_pb2.py +132 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/iwafile.py +17 -17
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/iwork.py +33 -27
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/model.py +94 -52
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/numbers_uuid.py +6 -4
- numbers_parser-4.10.4/src/numbers_parser/generated/TSCHArchives_GEN_pb2.py +0 -75
- numbers_parser-4.10.4/src/numbers_parser/generated/TSCHArchives_pb2.py +0 -152
- numbers_parser-4.10.4/src/numbers_parser/generated/TSDArchives_pb2.py +0 -247
- numbers_parser-4.10.4/src/numbers_parser/generated/TSKArchives_pb2.py +0 -285
- numbers_parser-4.10.4/src/numbers_parser/generated/TSSArchives_pb2.py +0 -64
- numbers_parser-4.10.4/src/numbers_parser/generated/TSTArchives_pb2.py +0 -444
- numbers_parser-4.10.4/src/numbers_parser/generated/TSWPArchives_pb2.py +0 -324
- numbers_parser-4.10.4/src/numbers_parser/generated/TSWPCommandArchives_pb2.py +0 -132
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/LICENSE.rst +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/bullets.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/currencies.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/data/empty.numbers +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/experimental.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNCommandArchives_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TNCommandArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSAArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSACommandArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCH3DArchives_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHArchives_Common_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHCommandArchives_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSCHPreUFFArchives_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSDArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSDCommandArchives_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSKArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSPDatabaseMessages_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSSArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSTArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSTCommandArchives_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/TSWPArchives_sos_pb2.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/__init__.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/fontmap.py +0 -0
- {numbers_parser-4.10.4 → numbers_parser-4.10.6}/src/numbers_parser/generated/functionmap.py +0 -0
- {numbers_parser-4.10.4/src/numbers_parser → numbers_parser-4.10.6/src/numbers_parser/generated}/mapping.py +24 -24
- {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.
|
|
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
|
|
20
|
-
Requires-Dist: importlib-resources (>=6.1
|
|
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.
|
|
24
|
-
Requires-Dist: regex (
|
|
25
|
-
Requires-Dist: roman (>=
|
|
26
|
-
Requires-Dist: setuptools (>=69.0.3
|
|
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
|
[](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml)[](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml)[](https://codecov.io/gh/masaccio/numbers-parser)[](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
|
|
38
|
-
(current as of
|
|
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
|
[](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml)[](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml)[](https://codecov.io/gh/masaccio/numbers-parser)[](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
|
|
7
|
-
(current as of
|
|
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.
|
|
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.
|
|
27
|
-
regex = "
|
|
28
|
-
roman = "
|
|
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 = "
|
|
31
|
-
importlib-resources = "
|
|
32
|
-
enum-tools = "
|
|
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 = "
|
|
39
|
-
psutil = "
|
|
40
|
-
pytest = "
|
|
41
|
-
pytest-check = "
|
|
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 = "
|
|
43
|
+
pytest-cov = ">=4.0,>=5.0"
|
|
44
44
|
pytest-profiling = "^1.7.0"
|
|
45
45
|
pytest-xdist = "^3.3.1"
|
|
46
|
-
ruff = "
|
|
47
|
-
termcolor = "
|
|
46
|
+
ruff = "*"
|
|
47
|
+
termcolor = ">=2.2"
|
|
48
48
|
tox = "^4.11.4"
|
|
49
|
-
python-magic = "
|
|
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 = "
|
|
53
|
-
enum-tools = "
|
|
54
|
-
sphinx-toolbox = "
|
|
55
|
-
sphinx-nefertiti = "
|
|
56
|
-
sphinx-markdown-builder = "
|
|
57
|
-
sphinx-copybutton = "
|
|
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
|
|
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
|
|
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
|
|
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:
|