numbers-parser 4.12.0__tar.gz → 4.12.2__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 (59) hide show
  1. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/PKG-INFO +8 -3
  2. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/README.md +7 -2
  3. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/pyproject.toml +1 -1
  4. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/model.py +37 -36
  5. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/LICENSE.rst +0 -0
  6. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/__init__.py +0 -0
  7. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/_cat_numbers.py +0 -0
  8. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/_unpack_numbers.py +0 -0
  9. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/bullets.py +0 -0
  10. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/cell.py +0 -0
  11. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/constants.py +0 -0
  12. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/containers.py +0 -0
  13. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/currencies.py +0 -0
  14. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/data/empty.numbers +0 -0
  15. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/document.py +0 -0
  16. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/exceptions.py +0 -0
  17. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/experimental.py +0 -0
  18. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/formula.py +0 -0
  19. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TNArchives_pb2.py +0 -0
  20. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TNArchives_sos_pb2.py +0 -0
  21. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TNCommandArchives_pb2.py +0 -0
  22. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TNCommandArchives_sos_pb2.py +0 -0
  23. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSAArchives_pb2.py +0 -0
  24. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSAArchives_sos_pb2.py +0 -0
  25. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSACommandArchives_sos_pb2.py +0 -0
  26. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCEArchives_pb2.py +0 -0
  27. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCH3DArchives_pb2.py +0 -0
  28. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCHArchives_Common_pb2.py +0 -0
  29. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCHArchives_GEN_pb2.py +0 -0
  30. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCHArchives_pb2.py +0 -0
  31. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCHArchives_sos_pb2.py +0 -0
  32. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCHCommandArchives_pb2.py +0 -0
  33. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCHPreUFFArchives_pb2.py +0 -0
  34. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCKArchives_pb2.py +0 -0
  35. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSCKArchives_sos_pb2.py +0 -0
  36. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSDArchives_pb2.py +0 -0
  37. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSDArchives_sos_pb2.py +0 -0
  38. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSDCommandArchives_pb2.py +0 -0
  39. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSKArchives_pb2.py +0 -0
  40. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSPArchiveMessages_pb2.py +0 -0
  41. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSPDatabaseMessages_pb2.py +0 -0
  42. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSPMessages_pb2.py +0 -0
  43. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSSArchives_pb2.py +0 -0
  44. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSSArchives_sos_pb2.py +0 -0
  45. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSTArchives_pb2.py +0 -0
  46. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSTArchives_sos_pb2.py +0 -0
  47. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSTCommandArchives_pb2.py +0 -0
  48. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSTStylePropertyArchiving_pb2.py +0 -0
  49. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSWPArchives_pb2.py +0 -0
  50. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSWPArchives_sos_pb2.py +0 -0
  51. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/TSWPCommandArchives_pb2.py +0 -0
  52. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/__init__.py +0 -0
  53. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/fontmap.py +0 -0
  54. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/functionmap.py +0 -0
  55. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/generated/mapping.py +0 -0
  56. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/iwafile.py +0 -0
  57. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/iwork.py +0 -0
  58. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/numbers_cache.py +0 -0
  59. {numbers_parser-4.12.0 → numbers_parser-4.12.2}/src/numbers_parser/numbers_uuid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: numbers-parser
3
- Version: 4.12.0
3
+ Version: 4.12.2
4
4
  Summary: Read and write Apple Numbers spreadsheets
5
5
  Home-page: https://github.com/masaccio/numbers-parser
6
6
  License: MIT
@@ -384,9 +384,12 @@ Current known limitations of `numbers-parser` which may be implemented in the fu
384
384
  - Creating cells of type `BulletedTextCell` is not supported
385
385
  - New tables are inserted with a fixed offset below the last table in a
386
386
  worksheet which does not take into account title or caption size
387
+ - Captions can be created and edited as of numbers-parser version 4.12, but cannot
388
+ be styled. New captions adopt the first caption style available in the current
389
+ document
387
390
  - Formulas cannot be written to a document
388
391
  - Pivot tables are unsupported and saving a document with a pivot table issues
389
- a UnsupportedWarning.
392
+ a UnsupportedWarning (see [issue 73](https://github.com/masaccio/numbers-parser/issues/73) for details).
390
393
 
391
394
  The following limitations are expected to always remain:
392
395
 
@@ -397,7 +400,9 @@ The following limitations are expected to always remain:
397
400
  versions older than 3.11 do not support image filenames with UTF-8 characters
398
401
  [Cell.add_style.bg_image()](https://masaccio.github.io/numbers-parser/api/sheet.html#numbers_parser.Style) returns
399
402
  `None` for such files and issues a `RuntimeWarning`
400
- (see [issue 69](https://github.com/masaccio/numbers-parser/ssues/69) for details).
403
+ (see [issue 69](https://github.com/masaccio/numbers-parser/issues/69) for details).
404
+ - Password-encrypted documents cannot be opened. You must first re-save without
405
+ a password to read (see [issue 88](https://github.com/masaccio/numbers-parser/issues/88) for details).
401
406
 
402
407
  ## License
403
408
 
@@ -352,9 +352,12 @@ Current known limitations of `numbers-parser` which may be implemented in the fu
352
352
  - Creating cells of type `BulletedTextCell` is not supported
353
353
  - New tables are inserted with a fixed offset below the last table in a
354
354
  worksheet which does not take into account title or caption size
355
+ - Captions can be created and edited as of numbers-parser version 4.12, but cannot
356
+ be styled. New captions adopt the first caption style available in the current
357
+ document
355
358
  - Formulas cannot be written to a document
356
359
  - Pivot tables are unsupported and saving a document with a pivot table issues
357
- a UnsupportedWarning.
360
+ a UnsupportedWarning (see [issue 73](https://github.com/masaccio/numbers-parser/issues/73) for details).
358
361
 
359
362
  The following limitations are expected to always remain:
360
363
 
@@ -365,7 +368,9 @@ The following limitations are expected to always remain:
365
368
  versions older than 3.11 do not support image filenames with UTF-8 characters
366
369
  [Cell.add_style.bg_image()](https://masaccio.github.io/numbers-parser/api/sheet.html#numbers_parser.Style) returns
367
370
  `None` for such files and issues a `RuntimeWarning`
368
- (see [issue 69](https://github.com/masaccio/numbers-parser/ssues/69) for details).
371
+ (see [issue 69](https://github.com/masaccio/numbers-parser/issues/69) for details).
372
+ - Password-encrypted documents cannot be opened. You must first re-save without
373
+ a password to read (see [issue 88](https://github.com/masaccio/numbers-parser/issues/88) for details).
369
374
 
370
375
  ## License
371
376
 
@@ -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.12.0"
15
+ version = "4.12.2"
16
16
 
17
17
  [tool.poetry.scripts]
18
18
  cat-numbers = "numbers_parser._cat_numbers:main"
@@ -329,12 +329,16 @@ class _NumbersModel(Cacheable):
329
329
  if enabled is not None:
330
330
  table_info.super.caption_hidden = not enabled
331
331
  else:
332
+ caption_info_id = table_info.super.caption.identifier
333
+ caption_archive = self.objects[caption_info_id]
334
+ if caption_archive.DESCRIPTOR.name == "StandinCaptionArchive":
335
+ return False
332
336
  return not table_info.super.caption_hidden
333
337
 
334
- def captions_style_id(self):
335
- stylesheet = self.objects[self.find_refs("StylesheetArchive")[0]]
338
+ def find_style_id(self, style_substr: str):
339
+ stylesheet = self.objects[self.stylesheet_id()]
336
340
  caption_styles = [
337
- x for x in stylesheet.identifier_to_style_map if "Caption" in x.identifier
341
+ x for x in stylesheet.identifier_to_style_map if style_substr in x.identifier.lower()
338
342
  ]
339
343
  return caption_styles[0].style.identifier
340
344
 
@@ -354,6 +358,7 @@ class _NumbersModel(Cacheable):
354
358
  obj.MergeFrom(TSPMessages.Reference(identifier=id))
355
359
 
356
360
  def create_path_source_archive(self, table_id):
361
+ box_size = 100.0
357
362
  return TSDArchives.PathSourceArchive(
358
363
  horizontalFlip=False,
359
364
  verticalFlip=False,
@@ -367,15 +372,15 @@ class _NumbersModel(Cacheable):
367
372
  ),
368
373
  TSPMessages.Path.Element(
369
374
  type=TSPMessages.Path.ElementType.lineTo,
370
- points=[TSPMessages.Point(x=100.0, y=0.0)],
375
+ points=[TSPMessages.Point(x=box_size, y=0.0)],
371
376
  ),
372
377
  TSPMessages.Path.Element(
373
378
  type=TSPMessages.Path.ElementType.lineTo,
374
- points=[TSPMessages.Point(x=100.0, y=100.0)],
379
+ points=[TSPMessages.Point(x=box_size, y=box_size)],
375
380
  ),
376
381
  TSPMessages.Path.Element(
377
382
  type=TSPMessages.Path.ElementType.lineTo,
378
- points=[TSPMessages.Point(x=0.0, y=100.0)],
383
+ points=[TSPMessages.Point(x=0.0, y=box_size)],
379
384
  ),
380
385
  TSPMessages.Path.Element(
381
386
  type=TSPMessages.Path.ElementType.closeSubpath,
@@ -395,8 +400,8 @@ class _NumbersModel(Cacheable):
395
400
  caption_placement_id, _ = self.objects.create_object_from_dict(
396
401
  "CalculationEngine",
397
402
  {
398
- "caption_anchor_location": 1,
399
- "drawable_anchor_location": 7,
403
+ "caption_anchor_location": 1, # UPPER_LEFT
404
+ "drawable_anchor_location": 7, # LOWER_LEFT
400
405
  },
401
406
  TSAArchives.CaptionPlacementArchive,
402
407
  )
@@ -419,13 +424,26 @@ class _NumbersModel(Cacheable):
419
424
  }
420
425
  ]
421
426
  },
427
+ "table_list_style": {
428
+ "entries": [
429
+ {
430
+ "character_index": 0,
431
+ "object": {"identifier": self.find_style_id("liststyle")},
432
+ }
433
+ ]
434
+ },
422
435
  "table_para_starts": {"entries": [{"character_index": 0, "first": 0, "second": 0}]},
423
436
  "table_para_bidi": {"entries": [{"character_index": 0, "first": 0, "second": 0}]},
424
437
  "table_drop_cap_style": {"entries": [{"character_index": 0}]},
425
438
  },
426
439
  TSWPArchives.StorageArchive,
427
440
  )
428
- for object_id in [storage_id, self.captions_style_id(), self.caption_paragraph_style_id()]:
441
+ for object_id in [
442
+ storage_id,
443
+ self.find_style_id("caption"),
444
+ self.find_style_id("liststyle"),
445
+ self.caption_paragraph_style_id(),
446
+ ]:
429
447
  self.add_component_reference(
430
448
  object_id, location="CalculationEngine", component_id=self.stylesheet_id()
431
449
  )
@@ -435,8 +453,8 @@ class _NumbersModel(Cacheable):
435
453
  owned_storage=TSPMessages.Reference(identifier=storage_id),
436
454
  deprecated_storage=TSPMessages.Reference(identifier=storage_id),
437
455
  super=TSDArchives.ShapeArchive(
438
- super=self.create_drawable(table_info_id, 0, 0, flags=1),
439
- style={"identifier": self.captions_style_id()},
456
+ super=self.create_drawable(table_info_id, 0, 500, flags=1),
457
+ style={"identifier": self.find_style_id("caption")},
440
458
  strokePatternOffsetDistance=0.0,
441
459
  pathsource=self.create_path_source_archive(table_id),
442
460
  ),
@@ -465,11 +483,13 @@ class _NumbersModel(Cacheable):
465
483
  caption_archive = self.objects[caption_info_id]
466
484
 
467
485
  caption_storage_id = caption_archive.super.owned_storage.identifier
468
- caption_text = self.objects[caption_storage_id].text
469
486
  if caption is not None:
470
- caption_text[0] = caption
487
+ clear_field_container(self.objects[caption_storage_id].text)
488
+ self.objects[caption_storage_id].text.append(caption)
489
+ elif len(self.objects[caption_storage_id].text) == 0:
490
+ return "Caption"
471
491
  else:
472
- return caption_text[0]
492
+ return self.objects[caption_storage_id].text[0]
473
493
 
474
494
  @cache()
475
495
  def table_tiles(self, table_id):
@@ -1377,24 +1397,6 @@ class _NumbersModel(Cacheable):
1377
1397
  "Tables/HeaderStorageBucket-{}",
1378
1398
  )
1379
1399
 
1380
- from_table_info = self.objects[self.table_info_id(from_table_id)]
1381
- from_caption_info = self.objects[from_table_info.super.caption.identifier]
1382
- caption_storage_id, caption_storage = self.objects.create_object_from_dict(
1383
- "CalculationEngine",
1384
- {"text": ["Caption"]},
1385
- TSWPArchives.StorageArchive,
1386
- )
1387
- caption_storage.MergeFrom(self.objects[from_caption_info.super.owned_storage.identifier])
1388
- caption_info_id, caption_info = self.objects.create_object_from_dict(
1389
- "CalculationEngine",
1390
- {},
1391
- TSAArchives.CaptionInfoArchive,
1392
- )
1393
- caption_info.super.CopyFrom(from_caption_info.super)
1394
- caption_info.super.super.CopyFrom(from_caption_info.super.super)
1395
- caption_info.super.super.super.CopyFrom(from_caption_info.super.super.super)
1396
- self.set_reference(caption_info.super.deprecated_storage, caption_storage_id)
1397
- self.set_reference(caption_info.super.owned_storage, caption_storage_id)
1398
1400
  sidecar_id, _ = self.objects.create_object_from_dict(
1399
1401
  "CalculationEngine",
1400
1402
  {"max_order": 1, "column_count": 0, "row_count": 0},
@@ -1480,13 +1482,12 @@ class _NumbersModel(Cacheable):
1480
1482
  )
1481
1483
  table_info.tableModel.MergeFrom(TSPMessages.Reference(identifier=table_model_id))
1482
1484
  table_info.super.MergeFrom(self.create_drawable(sheet_id, x, y))
1483
- caption_info.super.super.super.parent.MergeFrom(
1484
- TSPMessages.Reference(identifier=table_info_id)
1485
- )
1486
- table_info.super.caption.MergeFrom(TSPMessages.Reference(identifier=caption_info_id))
1485
+
1487
1486
  self.add_component_reference(
1488
1487
  table_info_id, location="Document", component_id=self.calc_engine_id()
1489
1488
  )
1489
+ self.create_caption_archive(table_model_id)
1490
+ self.caption_enabled(table_model_id, False)
1490
1491
 
1491
1492
  self.add_formula_owner(
1492
1493
  table_info_id,