numbers-parser 4.13.3__py3-none-any.whl → 4.14.2__py3-none-any.whl
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/__init__.py +5 -4
- numbers_parser/_cat_numbers.py +24 -16
- numbers_parser/_csv2numbers.py +13 -14
- numbers_parser/_unpack_numbers.py +6 -7
- numbers_parser/bullets.py +7 -8
- numbers_parser/cell.py +280 -255
- numbers_parser/constants.py +22 -8
- numbers_parser/containers.py +11 -10
- numbers_parser/document.py +196 -150
- numbers_parser/exceptions.py +1 -8
- numbers_parser/formula.py +29 -32
- numbers_parser/generated/TSKArchives_pb2.py +92 -92
- numbers_parser/generated/TSSArchives_pb2.py +36 -36
- numbers_parser/generated/TSWPCommandArchives_pb2.py +99 -99
- numbers_parser/generated/fontmap.py +16 -10
- numbers_parser/generated/mapping.py +0 -1
- numbers_parser/iwafile.py +16 -16
- numbers_parser/iwork.py +32 -17
- numbers_parser/model.py +222 -210
- numbers_parser/numbers_cache.py +6 -7
- numbers_parser/numbers_uuid.py +4 -1
- numbers_parser/roman.py +32 -0
- {numbers_parser-4.13.3.dist-info → numbers_parser-4.14.2.dist-info}/METADATA +18 -22
- {numbers_parser-4.13.3.dist-info → numbers_parser-4.14.2.dist-info}/RECORD +27 -26
- {numbers_parser-4.13.3.dist-info → numbers_parser-4.14.2.dist-info}/WHEEL +1 -1
- {numbers_parser-4.13.3.dist-info → numbers_parser-4.14.2.dist-info}/LICENSE.rst +0 -0
- {numbers_parser-4.13.3.dist-info → numbers_parser-4.14.2.dist-info}/entry_points.txt +0 -0
numbers_parser/numbers_cache.py
CHANGED
|
@@ -10,7 +10,8 @@ class Cacheable:
|
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
def cache(num_args=1):
|
|
13
|
-
"""
|
|
13
|
+
"""
|
|
14
|
+
Decorator to memoize a class method using a precise subset of
|
|
14
15
|
its arguments.
|
|
15
16
|
"""
|
|
16
17
|
|
|
@@ -21,10 +22,9 @@ def cache(num_args=1):
|
|
|
21
22
|
key = ".".join([str(args[x]) for x in range(num_args)])
|
|
22
23
|
if key in self._cache[method]:
|
|
23
24
|
return self._cache[method][key]
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return value
|
|
25
|
+
value = func(self, *args, **kwargs)
|
|
26
|
+
self._cache[method][key] = value
|
|
27
|
+
return value
|
|
28
28
|
|
|
29
29
|
def inner_no_args(self):
|
|
30
30
|
method = func.__name__
|
|
@@ -34,7 +34,6 @@ def cache(num_args=1):
|
|
|
34
34
|
|
|
35
35
|
if num_args == 0:
|
|
36
36
|
return inner_no_args
|
|
37
|
-
|
|
38
|
-
return inner_multi_args
|
|
37
|
+
return inner_multi_args
|
|
39
38
|
|
|
40
39
|
return cache_decorator
|
numbers_parser/numbers_uuid.py
CHANGED
|
@@ -71,5 +71,8 @@ class NumbersUUID(UUID):
|
|
|
71
71
|
uuid_w1 = (self.int >> 32) & 0xFFFFFFFF
|
|
72
72
|
uuid_w0 = self.int & 0xFFFFFFFF
|
|
73
73
|
return TSPMessages.CFUUIDArchive(
|
|
74
|
-
uuid_w3=uuid_w3,
|
|
74
|
+
uuid_w3=uuid_w3,
|
|
75
|
+
uuid_w2=uuid_w2,
|
|
76
|
+
uuid_w1=uuid_w1,
|
|
77
|
+
uuid_w0=uuid_w0,
|
|
75
78
|
)
|
numbers_parser/roman.py
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
def to_roman(value: int) -> str:
|
|
2
|
+
"""Convert an integer to a Roman number in the available range of values."""
|
|
3
|
+
if value == 0:
|
|
4
|
+
return "N"
|
|
5
|
+
|
|
6
|
+
if value < 1 or value > 3999:
|
|
7
|
+
msg = "Number out of range for Roman numerals"
|
|
8
|
+
raise ValueError(msg)
|
|
9
|
+
|
|
10
|
+
roman_map = {
|
|
11
|
+
1000: "M",
|
|
12
|
+
900: "CM",
|
|
13
|
+
500: "D",
|
|
14
|
+
400: "CD",
|
|
15
|
+
100: "C",
|
|
16
|
+
90: "XC",
|
|
17
|
+
50: "L",
|
|
18
|
+
40: "XL",
|
|
19
|
+
10: "X",
|
|
20
|
+
9: "IX",
|
|
21
|
+
5: "V",
|
|
22
|
+
4: "IV",
|
|
23
|
+
1: "I",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
roman_num = ""
|
|
27
|
+
for int_value, roman_symbol in roman_map.items():
|
|
28
|
+
while value >= int_value:
|
|
29
|
+
roman_num += roman_symbol
|
|
30
|
+
value -= int_value
|
|
31
|
+
|
|
32
|
+
return roman_num
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: numbers-parser
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.14.2
|
|
4
4
|
Summary: Read and write Apple Numbers spreadsheets
|
|
5
5
|
Home-page: https://github.com/masaccio/numbers-parser
|
|
6
6
|
License: MIT
|
|
@@ -15,17 +15,14 @@ Classifier: Programming Language :: Python :: 3.10
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3.11
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
17
17
|
Classifier: Topic :: Office/Business :: Financial :: Spreadsheet
|
|
18
|
-
Requires-Dist: colorama (>=0.4.6,<0.5.0)
|
|
19
18
|
Requires-Dist: compact-json (>=1.1.3,<2.0.0)
|
|
20
19
|
Requires-Dist: enum-tools (>=0.11)
|
|
21
20
|
Requires-Dist: importlib-resources (>=6.1)
|
|
22
|
-
Requires-Dist: pendulum (>=3.0,<4.0)
|
|
23
21
|
Requires-Dist: protobuf
|
|
22
|
+
Requires-Dist: python-dateutil (>=2.9.0.post0,<3.0.0)
|
|
24
23
|
Requires-Dist: python-snappy (>=0.7,<0.8)
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist: setuptools (>=69.0.3)
|
|
28
|
-
Requires-Dist: sigfig (>=1.3.2,<2.0.0)
|
|
24
|
+
Requires-Dist: setuptools (>=70.0.0)
|
|
25
|
+
Requires-Dist: sigfig (>=1.3.3,<2.0.0)
|
|
29
26
|
Project-URL: Documentation, https://github.com/masaccio/numbers-parser/blob/main/README.md
|
|
30
27
|
Project-URL: Repository, https://github.com/masaccio/numbers-parser
|
|
31
28
|
Description-Content-Type: text/markdown
|
|
@@ -129,21 +126,19 @@ the column values.
|
|
|
129
126
|
|
|
130
127
|
Cells are objects with a common base class of `Cell`. All cell types
|
|
131
128
|
have a property `value` which returns the contents of the cell as a
|
|
132
|
-
python datatype.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
|
137
|
-
|
|
138
|
-
|
|
|
139
|
-
|
|
|
140
|
-
|
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
| ErrorCell | `None` | |
|
|
146
|
-
| MergedCell | `None` | See [Merged cells](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.MergedCell) |
|
|
129
|
+
python datatype. Available cell types are:
|
|
130
|
+
|
|
131
|
+
| Cell type | value type | Additional properties |
|
|
132
|
+
|--------------|----------------------|--------------------------------------------------------------------------------------------------------|
|
|
133
|
+
| NumberCell | `float` | |
|
|
134
|
+
| TextCell | `str` | |
|
|
135
|
+
| RichTextCell | `str` | See [Rich text](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.RichTextCell) |
|
|
136
|
+
| EmptyCell | `None` | |
|
|
137
|
+
| BoolCell | `bool` | |
|
|
138
|
+
| DateCell | `datetime.datetime` | |
|
|
139
|
+
| DurationCell | `datetime.timedelta` | |
|
|
140
|
+
| ErrorCell | `None` | |
|
|
141
|
+
| MergedCell | `None` | See [Merged cells](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.MergedCell) |
|
|
147
142
|
|
|
148
143
|
Cell references can be either zero-offset row/column integers or an
|
|
149
144
|
Excel/Numbers A1 notation. Where cell values are not `None` the
|
|
@@ -506,6 +501,7 @@ The following limitations are expected to always remain:
|
|
|
506
501
|
(see [issue 69](https://github.com/masaccio/numbers-parser/issues/69) for details).
|
|
507
502
|
- Password-encrypted documents cannot be opened. You must first re-save without
|
|
508
503
|
a password to read (see [issue 88](https://github.com/masaccio/numbers-parser/issues/88) for details).
|
|
504
|
+
A UnsupportedError exception is raised when such documents are opened.
|
|
509
505
|
|
|
510
506
|
## License
|
|
511
507
|
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
numbers_parser/__init__.py,sha256=
|
|
2
|
-
numbers_parser/_cat_numbers.py,sha256=
|
|
3
|
-
numbers_parser/_csv2numbers.py,sha256=
|
|
4
|
-
numbers_parser/_unpack_numbers.py,sha256=
|
|
5
|
-
numbers_parser/bullets.py,sha256=
|
|
6
|
-
numbers_parser/cell.py,sha256=
|
|
7
|
-
numbers_parser/constants.py,sha256=
|
|
8
|
-
numbers_parser/containers.py,sha256=
|
|
1
|
+
numbers_parser/__init__.py,sha256=a5CkU3_Fn41rHS0DN8u8se0iz2JhvmggRHmSh-akn5o,1428
|
|
2
|
+
numbers_parser/_cat_numbers.py,sha256=ISBoHUvQv-_CG_yyx2IHvdj2OG3l0ejl2qk2ZV3y9Zk,4737
|
|
3
|
+
numbers_parser/_csv2numbers.py,sha256=R_13gVe_RfLWLOv-DzVJ60xkqhdOA-RKna-Ce5ud4V8,14624
|
|
4
|
+
numbers_parser/_unpack_numbers.py,sha256=KvY04wqTH6JPwZWHAW1VlcY1HZQvXq-U5THEG7Au0mY,7045
|
|
5
|
+
numbers_parser/bullets.py,sha256=CKMjSYRzLM123wQNDG8B5vfodRLjW5UOc2HDPlvfNr4,2637
|
|
6
|
+
numbers_parser/cell.py,sha256=lx3RlIh6UohlhmnyoyHWf7Tq6XNXvF--C52sWHDBb3A,76583
|
|
7
|
+
numbers_parser/constants.py,sha256=JyTKQCnmEP6eNUQpk7eWQYlygTgUhVD7G6Std6426xs,10322
|
|
8
|
+
numbers_parser/containers.py,sha256=SBD99t0ABHraGA8729jPXy5VcRHT21U_WM3ijOIiwd4,4886
|
|
9
9
|
numbers_parser/currencies.py,sha256=8k4a3WKmDoHeurkDICymHX13N7ManHSTaka_JNXCZYA,3767
|
|
10
10
|
numbers_parser/data/empty.numbers,sha256=zQjVqcNGN-xNZh51_eAxD8Zxmxh88Sd7kpf4JygUA_E,90601
|
|
11
|
-
numbers_parser/document.py,sha256=
|
|
12
|
-
numbers_parser/exceptions.py,sha256=
|
|
11
|
+
numbers_parser/document.py,sha256=j1G9xH9Z7UndsQBSBRCUMLHtc4I77X6rJVOcuV4IZvQ,59094
|
|
12
|
+
numbers_parser/exceptions.py,sha256=51yJTYm0X2am4YK-F6sVYOHmlYrBex_e4lYtbmiQX3I,611
|
|
13
13
|
numbers_parser/experimental.py,sha256=WARjTa-2ePb8Ga8Q6oDP6EJCs12ofLRF2YpwzUu66ZI,374
|
|
14
|
-
numbers_parser/formula.py,sha256=
|
|
14
|
+
numbers_parser/formula.py,sha256=yRGSrd0Jrv_pgwtfokYRI2rZwUyTMYIV_Icm_8dj_P8,10759
|
|
15
15
|
numbers_parser/generated/TNArchives_pb2.py,sha256=Tq1UC2Ml1dzAQFIrz3Om-sGI903FBZmlN3GgYQNt4a8,15931
|
|
16
16
|
numbers_parser/generated/TNArchives_sos_pb2.py,sha256=AYI1X5t5Gb4l941jXlHEY0v97ToIze0bSYBR7KQmS0A,1215
|
|
17
17
|
numbers_parser/generated/TNCommandArchives_pb2.py,sha256=my5CgnWmqHa5p0NFf-aUC8aqEPz3-pXXlyz4UJmZKZE,18378
|
|
@@ -32,11 +32,11 @@ numbers_parser/generated/TSCKArchives_sos_pb2.py,sha256=2zK3-z-pe1xrY1qut28VQjHR
|
|
|
32
32
|
numbers_parser/generated/TSDArchives_pb2.py,sha256=G5vUxZbx66eTdNgxbagUQmo6N7pvfoXwU07jBgv90cU,39093
|
|
33
33
|
numbers_parser/generated/TSDArchives_sos_pb2.py,sha256=Q2MYAXjAW-PGE3FY8kFH89rry9PPUQv7DS956wymFwo,6022
|
|
34
34
|
numbers_parser/generated/TSDCommandArchives_pb2.py,sha256=zMHr3_Koa9vGmkl2PMTnMptUCY2iOe1zJOWN6re2jQs,29291
|
|
35
|
-
numbers_parser/generated/TSKArchives_pb2.py,sha256=
|
|
35
|
+
numbers_parser/generated/TSKArchives_pb2.py,sha256=D5EaP8aTC2VstJo7XfsGQ1VNzPPDRe34FXknSR5yUb8,26357
|
|
36
36
|
numbers_parser/generated/TSPArchiveMessages_pb2.py,sha256=5Th08Q19AOsMEMggvM9fda1StJjV8LTDDI5x7pY6aM8,17950
|
|
37
37
|
numbers_parser/generated/TSPDatabaseMessages_pb2.py,sha256=_jvq890xBQpSDcYOKgII30XlxukPBRZBu0kkRpbJ-z0,2024
|
|
38
38
|
numbers_parser/generated/TSPMessages_pb2.py,sha256=LBHRhNnQdDu226sh3gK_AOjbO3LDkGCWpVi1wzf7emA,13032
|
|
39
|
-
numbers_parser/generated/TSSArchives_pb2.py,sha256=
|
|
39
|
+
numbers_parser/generated/TSSArchives_pb2.py,sha256=DNqQYFogujTOLIIW4B4_tTTLdGz-Y-kmkxQOhWLmMmg,10067
|
|
40
40
|
numbers_parser/generated/TSSArchives_sos_pb2.py,sha256=FAhtvQ9TBg18AcIk4HwGCreNWlEu3k_kK_9jRVsh7FM,2842
|
|
41
41
|
numbers_parser/generated/TSTArchives_pb2.py,sha256=PRNF8aceuLyEYmJunUG-R8PIa4ruWnKZThOy11o59Z4,88236
|
|
42
42
|
numbers_parser/generated/TSTArchives_sos_pb2.py,sha256=JxiMXSdTH5VJo-c5zDdD_tzGQCTrUDE2K0YP_x-zh84,12597
|
|
@@ -44,18 +44,19 @@ numbers_parser/generated/TSTCommandArchives_pb2.py,sha256=LEyGJBOLdhxVarepxGfHpr
|
|
|
44
44
|
numbers_parser/generated/TSTStylePropertyArchiving_pb2.py,sha256=0ADsIwTk4GcTeQJRhYxEEjsD_SuLEOSUaGYdHnsO9CA,12415
|
|
45
45
|
numbers_parser/generated/TSWPArchives_pb2.py,sha256=6bGFEo-lABOA8l1PbDG96GVd1vmB9PMaYFiqAiDsHdk,55432
|
|
46
46
|
numbers_parser/generated/TSWPArchives_sos_pb2.py,sha256=poJ49WA4JjZsHpmROyv4jFl2xGpJy6pTRCaJQZ5ZGr0,29114
|
|
47
|
-
numbers_parser/generated/TSWPCommandArchives_pb2.py,sha256
|
|
47
|
+
numbers_parser/generated/TSWPCommandArchives_pb2.py,sha256=-wQpDqveA64l_V-0jXyMkycrE_L7e9zXYzw9JfirsbE,25595
|
|
48
48
|
numbers_parser/generated/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
-
numbers_parser/generated/fontmap.py,sha256=
|
|
49
|
+
numbers_parser/generated/fontmap.py,sha256=ORrf3PtxG_gfT1t8R77yXjXBlIefRjvUCBUuG5RCTh8,23806
|
|
50
50
|
numbers_parser/generated/functionmap.py,sha256=9OLSNlOVWxRO9xS8QZmK1HURpc11c1B5nIAAecUwA98,6082
|
|
51
|
-
numbers_parser/generated/mapping.py,sha256=
|
|
52
|
-
numbers_parser/iwafile.py,sha256=
|
|
53
|
-
numbers_parser/iwork.py,sha256=
|
|
54
|
-
numbers_parser/model.py,sha256=
|
|
55
|
-
numbers_parser/numbers_cache.py,sha256=
|
|
56
|
-
numbers_parser/numbers_uuid.py,sha256=
|
|
57
|
-
numbers_parser
|
|
58
|
-
numbers_parser-4.
|
|
59
|
-
numbers_parser-4.
|
|
60
|
-
numbers_parser-4.
|
|
61
|
-
numbers_parser-4.
|
|
51
|
+
numbers_parser/generated/mapping.py,sha256=bJS_CK3AXXMFUSoSWbeDt6VTbCqIfX9OnTKLr0qDezA,32288
|
|
52
|
+
numbers_parser/iwafile.py,sha256=nVwCcXvx8TgX-DkYqSbcJQzKyXR1Z8_y547XeY7Y-fs,11948
|
|
53
|
+
numbers_parser/iwork.py,sha256=Qx1Izf9cfQKnLTDiJyeCOsmL9PSsfV-XOf0Kkb2oPMo,9396
|
|
54
|
+
numbers_parser/model.py,sha256=45twYfR1xtQbVkvcGO4c-jurS5ZqKPGM-ltVp1uJJhs,107011
|
|
55
|
+
numbers_parser/numbers_cache.py,sha256=wJHEGQfCbRvX94xL2Uehlz5UjTr8n4nBgutCw_4Dbis,1098
|
|
56
|
+
numbers_parser/numbers_uuid.py,sha256=d5-Hwu-lWbBPuIP6vybNBuVzzja5HeuKsgK_PvMSw9c,2735
|
|
57
|
+
numbers_parser/roman.py,sha256=CErv1uRp8eE9Bsuh_QsrBAzKFsfHSEs8CHpfFW0Gd70,725
|
|
58
|
+
numbers_parser-4.14.2.dist-info/LICENSE.rst,sha256=8vTa1-5KSdHrTpU9rlheO5005EWReEPMpjV7BjSaMc4,1050
|
|
59
|
+
numbers_parser-4.14.2.dist-info/METADATA,sha256=Wq_ehqr9iqT9Kdv6BTnpjsmXUCJmU3v7UUIejTcbp3I,23003
|
|
60
|
+
numbers_parser-4.14.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
61
|
+
numbers_parser-4.14.2.dist-info/entry_points.txt,sha256=8VSxWAamOAvVcKS6iza4BQtYe03nga552HMLcVY-MBc,160
|
|
62
|
+
numbers_parser-4.14.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|