numbers-parser 4.12.0__tar.gz → 4.12.1__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.1}/PKG-INFO +8 -3
  2. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/README.md +7 -2
  3. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/pyproject.toml +1 -1
  4. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/model.py +30 -36
  5. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/LICENSE.rst +0 -0
  6. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/__init__.py +0 -0
  7. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/_cat_numbers.py +0 -0
  8. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/_unpack_numbers.py +0 -0
  9. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/bullets.py +0 -0
  10. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/cell.py +0 -0
  11. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/constants.py +0 -0
  12. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/containers.py +0 -0
  13. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/currencies.py +0 -0
  14. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/data/empty.numbers +0 -0
  15. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/document.py +0 -0
  16. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/exceptions.py +0 -0
  17. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/experimental.py +0 -0
  18. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/formula.py +0 -0
  19. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TNArchives_pb2.py +0 -0
  20. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TNArchives_sos_pb2.py +0 -0
  21. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TNCommandArchives_pb2.py +0 -0
  22. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TNCommandArchives_sos_pb2.py +0 -0
  23. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSAArchives_pb2.py +0 -0
  24. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSAArchives_sos_pb2.py +0 -0
  25. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSACommandArchives_sos_pb2.py +0 -0
  26. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCEArchives_pb2.py +0 -0
  27. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCH3DArchives_pb2.py +0 -0
  28. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCHArchives_Common_pb2.py +0 -0
  29. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCHArchives_GEN_pb2.py +0 -0
  30. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCHArchives_pb2.py +0 -0
  31. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCHArchives_sos_pb2.py +0 -0
  32. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCHCommandArchives_pb2.py +0 -0
  33. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCHPreUFFArchives_pb2.py +0 -0
  34. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCKArchives_pb2.py +0 -0
  35. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSCKArchives_sos_pb2.py +0 -0
  36. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSDArchives_pb2.py +0 -0
  37. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSDArchives_sos_pb2.py +0 -0
  38. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSDCommandArchives_pb2.py +0 -0
  39. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSKArchives_pb2.py +0 -0
  40. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSPArchiveMessages_pb2.py +0 -0
  41. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSPDatabaseMessages_pb2.py +0 -0
  42. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSPMessages_pb2.py +0 -0
  43. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSSArchives_pb2.py +0 -0
  44. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSSArchives_sos_pb2.py +0 -0
  45. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSTArchives_pb2.py +0 -0
  46. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSTArchives_sos_pb2.py +0 -0
  47. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSTCommandArchives_pb2.py +0 -0
  48. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSTStylePropertyArchiving_pb2.py +0 -0
  49. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSWPArchives_pb2.py +0 -0
  50. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSWPArchives_sos_pb2.py +0 -0
  51. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/TSWPCommandArchives_pb2.py +0 -0
  52. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/__init__.py +0 -0
  53. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/fontmap.py +0 -0
  54. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/functionmap.py +0 -0
  55. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/generated/mapping.py +0 -0
  56. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/iwafile.py +0 -0
  57. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/iwork.py +0 -0
  58. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/src/numbers_parser/numbers_cache.py +0 -0
  59. {numbers_parser-4.12.0 → numbers_parser-4.12.1}/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.1
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.1"
16
16
 
17
17
  [tool.poetry.scripts]
18
18
  cat-numbers = "numbers_parser._cat_numbers:main"
@@ -331,10 +331,10 @@ class _NumbersModel(Cacheable):
331
331
  else:
332
332
  return not table_info.super.caption_hidden
333
333
 
334
- def captions_style_id(self):
335
- stylesheet = self.objects[self.find_refs("StylesheetArchive")[0]]
334
+ def find_style_id(self, style_substr: str):
335
+ stylesheet = self.objects[self.stylesheet_id()]
336
336
  caption_styles = [
337
- x for x in stylesheet.identifier_to_style_map if "Caption" in x.identifier
337
+ x for x in stylesheet.identifier_to_style_map if style_substr in x.identifier.lower()
338
338
  ]
339
339
  return caption_styles[0].style.identifier
340
340
 
@@ -354,6 +354,7 @@ class _NumbersModel(Cacheable):
354
354
  obj.MergeFrom(TSPMessages.Reference(identifier=id))
355
355
 
356
356
  def create_path_source_archive(self, table_id):
357
+ box_size = 100.0
357
358
  return TSDArchives.PathSourceArchive(
358
359
  horizontalFlip=False,
359
360
  verticalFlip=False,
@@ -367,15 +368,15 @@ class _NumbersModel(Cacheable):
367
368
  ),
368
369
  TSPMessages.Path.Element(
369
370
  type=TSPMessages.Path.ElementType.lineTo,
370
- points=[TSPMessages.Point(x=100.0, y=0.0)],
371
+ points=[TSPMessages.Point(x=box_size, y=0.0)],
371
372
  ),
372
373
  TSPMessages.Path.Element(
373
374
  type=TSPMessages.Path.ElementType.lineTo,
374
- points=[TSPMessages.Point(x=100.0, y=100.0)],
375
+ points=[TSPMessages.Point(x=box_size, y=box_size)],
375
376
  ),
376
377
  TSPMessages.Path.Element(
377
378
  type=TSPMessages.Path.ElementType.lineTo,
378
- points=[TSPMessages.Point(x=0.0, y=100.0)],
379
+ points=[TSPMessages.Point(x=0.0, y=box_size)],
379
380
  ),
380
381
  TSPMessages.Path.Element(
381
382
  type=TSPMessages.Path.ElementType.closeSubpath,
@@ -395,8 +396,8 @@ class _NumbersModel(Cacheable):
395
396
  caption_placement_id, _ = self.objects.create_object_from_dict(
396
397
  "CalculationEngine",
397
398
  {
398
- "caption_anchor_location": 1,
399
- "drawable_anchor_location": 7,
399
+ "caption_anchor_location": 1, # UPPER_LEFT
400
+ "drawable_anchor_location": 7, # LOWER_LEFT
400
401
  },
401
402
  TSAArchives.CaptionPlacementArchive,
402
403
  )
@@ -419,13 +420,26 @@ class _NumbersModel(Cacheable):
419
420
  }
420
421
  ]
421
422
  },
423
+ "table_list_style": {
424
+ "entries": [
425
+ {
426
+ "character_index": 0,
427
+ "object": {"identifier": self.find_style_id("liststyle")},
428
+ }
429
+ ]
430
+ },
422
431
  "table_para_starts": {"entries": [{"character_index": 0, "first": 0, "second": 0}]},
423
432
  "table_para_bidi": {"entries": [{"character_index": 0, "first": 0, "second": 0}]},
424
433
  "table_drop_cap_style": {"entries": [{"character_index": 0}]},
425
434
  },
426
435
  TSWPArchives.StorageArchive,
427
436
  )
428
- for object_id in [storage_id, self.captions_style_id(), self.caption_paragraph_style_id()]:
437
+ for object_id in [
438
+ storage_id,
439
+ self.find_style_id("caption"),
440
+ self.find_style_id("liststyle"),
441
+ self.caption_paragraph_style_id(),
442
+ ]:
429
443
  self.add_component_reference(
430
444
  object_id, location="CalculationEngine", component_id=self.stylesheet_id()
431
445
  )
@@ -435,8 +449,8 @@ class _NumbersModel(Cacheable):
435
449
  owned_storage=TSPMessages.Reference(identifier=storage_id),
436
450
  deprecated_storage=TSPMessages.Reference(identifier=storage_id),
437
451
  super=TSDArchives.ShapeArchive(
438
- super=self.create_drawable(table_info_id, 0, 0, flags=1),
439
- style={"identifier": self.captions_style_id()},
452
+ super=self.create_drawable(table_info_id, 0, 500, flags=1),
453
+ style={"identifier": self.find_style_id("caption")},
440
454
  strokePatternOffsetDistance=0.0,
441
455
  pathsource=self.create_path_source_archive(table_id),
442
456
  ),
@@ -465,11 +479,11 @@ class _NumbersModel(Cacheable):
465
479
  caption_archive = self.objects[caption_info_id]
466
480
 
467
481
  caption_storage_id = caption_archive.super.owned_storage.identifier
468
- caption_text = self.objects[caption_storage_id].text
469
482
  if caption is not None:
470
- caption_text[0] = caption
483
+ clear_field_container(self.objects[caption_storage_id].text)
484
+ self.objects[caption_storage_id].text.append(caption)
471
485
  else:
472
- return caption_text[0]
486
+ return self.objects[caption_storage_id].text[0]
473
487
 
474
488
  @cache()
475
489
  def table_tiles(self, table_id):
@@ -1377,24 +1391,6 @@ class _NumbersModel(Cacheable):
1377
1391
  "Tables/HeaderStorageBucket-{}",
1378
1392
  )
1379
1393
 
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
1394
  sidecar_id, _ = self.objects.create_object_from_dict(
1399
1395
  "CalculationEngine",
1400
1396
  {"max_order": 1, "column_count": 0, "row_count": 0},
@@ -1480,13 +1476,11 @@ class _NumbersModel(Cacheable):
1480
1476
  )
1481
1477
  table_info.tableModel.MergeFrom(TSPMessages.Reference(identifier=table_model_id))
1482
1478
  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))
1479
+
1487
1480
  self.add_component_reference(
1488
1481
  table_info_id, location="Document", component_id=self.calc_engine_id()
1489
1482
  )
1483
+ self.create_caption_archive(table_model_id)
1490
1484
 
1491
1485
  self.add_formula_owner(
1492
1486
  table_info_id,