python-pptx2 2.18.0__py3-none-any.whl → 2.20.0__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.
pptx2/__init__.py CHANGED
@@ -57,7 +57,7 @@ from pptx2.parts.slide import (
57
57
  if TYPE_CHECKING:
58
58
  from pptx2.opc.package import Part
59
59
 
60
- __version__ = "2.18.0"
60
+ __version__ = "2.20.0"
61
61
 
62
62
  sys.modules["pptx2.exceptions"] = exceptions
63
63
  del sys
pptx2/_agent_friendly.py CHANGED
@@ -23,23 +23,21 @@ caller bug and still raises.
23
23
  from __future__ import annotations
24
24
 
25
25
  import difflib
26
+ import functools
27
+ import inspect
26
28
 
27
29
  # Canonical kwarg -> spellings other ecosystems use for the same thing.
28
30
  SYNONYMS: dict[str, tuple[str, ...]] = {
29
31
  "text": ("txt", "string", "content", "label", "caption", "value"),
30
- "font": ("font_family", "fontfamily", "font_name", "fontname", "typeface", "family", "face"),
32
+ "font": (
33
+ "font_family", "fontfamily", "font_name", "fontname", "typeface", "family", "face",
34
+ ),
31
35
  "size_pt": ("size", "font_size", "fontsize", "pt_size", "point_size"),
32
36
  "align": ("halign", "ha", "horizontal_align", "horizontal_alignment", "text_align", "text_alignment"),
33
37
  "anchor": ("valign", "va", "vertical_align", "vertical_alignment", "v_align"),
34
38
  "color": (
35
- "colour",
36
- "font_color",
37
- "font_colour",
38
- "text_color",
39
- "text_colour",
40
- "fg_color",
41
- "line_color",
42
- "stroke_color",
39
+ "colour", "font_color", "font_colour", "text_color", "text_colour",
40
+ "fg_color", "line_color", "stroke_color",
43
41
  ),
44
42
  "weight_pt": ("weight", "line_weight", "width_pt", "stroke_width"),
45
43
  "bold": ("font_bold", "is_bold"),
@@ -53,6 +51,8 @@ SYNONYMS: dict[str, tuple[str, ...]] = {
53
51
  "height": ("h",),
54
52
  "start": ("begin", "start_point", "start_shape", "from", "source"),
55
53
  "end": ("to", "end_point", "end_shape", "target"),
54
+ "image_file": ("image", "img", "path", "file", "filename", "image_path", "file_path"),
55
+ "steps": ("items", "stages", "nodes", "boxes"),
56
56
  }
57
57
 
58
58
  _ALIAS_TO_CANONICAL: dict[str, str] = {
@@ -89,17 +89,28 @@ def absorb_agent_kwargs(
89
89
  method: str,
90
90
  kwargs: dict,
91
91
  canonical_names: "list[str] | tuple[str, ...]",
92
+ extra_synonyms: "dict[str, tuple[str, ...]] | None" = None,
93
+ pass_through_unknown: bool = False,
92
94
  ) -> dict:
93
95
  """Map alias / near-miss *kwargs* onto canonical names; raise else.
94
96
 
95
97
  *canonical_names* lists the kwargs the method actually understands
96
- (including any already-bound explicit parameters). Returns a dict
97
- containing only canonical names. A synonym that matches a canonical
98
- the caller already supplied with a *different* value raises
98
+ (including any already-bound explicit parameters). *extra_synonyms*
99
+ adds call-site-specific spellings (e.g. ``{"cx": ("width", "w")}``
100
+ for ``add_chart``). Returns a dict containing only canonical names
101
+ — unless *pass_through_unknown* is set (for functions that accept
102
+ ``**kwargs`` themselves), in which case unabsorbable names are
103
+ passed through verbatim. A synonym that matches a canonical the
104
+ caller already supplied with a *different* value raises
99
105
  ``TypeError``; equal values are fine.
100
106
  """
101
107
  known = list(canonical_names)
102
- alias_space = [a for a in _ALIAS_TO_CANONICAL if a not in known]
108
+ alias_map = dict(_ALIAS_TO_CANONICAL)
109
+ if extra_synonyms:
110
+ for canonical, aliases in extra_synonyms.items():
111
+ for alias in aliases:
112
+ alias_map[alias] = canonical
113
+ alias_space = [a for a in alias_map if a not in known]
103
114
  candidates = known + alias_space
104
115
 
105
116
  resolved: dict = {}
@@ -112,7 +123,7 @@ def absorb_agent_kwargs(
112
123
  )
113
124
  resolved[name] = value
114
125
  continue
115
- canonical = _ALIAS_TO_CANONICAL.get(name)
126
+ canonical = alias_map.get(name)
116
127
  if canonical is not None and canonical not in known:
117
128
  # The alias resolves to an argument this method doesn't take
118
129
  # (e.g. ``to=`` on add_text); fall through to the fuzzy/error
@@ -121,6 +132,9 @@ def absorb_agent_kwargs(
121
132
  if canonical is None:
122
133
  canonical = _did_you_mean(name, candidates, known)
123
134
  if canonical is None:
135
+ if pass_through_unknown:
136
+ resolved[name] = value
137
+ continue
124
138
  raise TypeError(
125
139
  f"{method}(): got an unexpected keyword argument {name!r}. "
126
140
  f"Accepted: {', '.join(sorted(known))} "
@@ -134,3 +148,63 @@ def absorb_agent_kwargs(
134
148
  )
135
149
  resolved[canonical] = value
136
150
  return resolved
151
+
152
+
153
+ def agent_friendly(extra_synonyms=None):
154
+ """Decorator: make a method/function absorb alias and fuzzy kwargs.
155
+
156
+ Wrap any public helper so its keyword arguments get the full
157
+ treatment from :func:`absorb_agent_kwargs` — global synonyms,
158
+ per-call *extra_synonyms*, fuzzy near-misses, and didactic errors —
159
+ without touching its body. Usable bare (``@agent_friendly``) or
160
+ with per-method synonyms. A keyword that repeats a value already
161
+ bound positionally (through a synonym or exact name) is dropped when
162
+ equal and raises ``TypeError`` when it contradicts::
163
+
164
+ @agent_friendly({"cx": ("width", "w"), "cy": ("height", "h")})
165
+ def add_chart(self, x, y, cx, cy, chart_type, chart_data): ...
166
+ """
167
+ if callable(extra_synonyms): # used bare: @agent_friendly above def
168
+ return _decorate_friendly(extra_synonyms, None)
169
+
170
+ def decorator(func):
171
+ return _decorate_friendly(func, extra_synonyms)
172
+
173
+ return decorator
174
+
175
+
176
+ def _decorate_friendly(func, extra_synonyms):
177
+ sig = inspect.signature(func)
178
+ has_self = bool(sig.parameters) and next(iter(sig.parameters)) in ("self", "cls")
179
+ param_list = [
180
+ p
181
+ for p in sig.parameters.values()
182
+ if p.kind not in (inspect.Parameter.VAR_POSITIONAL, inspect.Parameter.VAR_KEYWORD)
183
+ and p.name not in ("self", "cls")
184
+ ]
185
+ known = tuple(p.name for p in param_list)
186
+ takes_var_kw = any(
187
+ p.kind == inspect.Parameter.VAR_KEYWORD for p in sig.parameters.values()
188
+ )
189
+
190
+ @functools.wraps(func)
191
+ def wrapper(*args, **kwargs):
192
+ if kwargs:
193
+ kwargs = absorb_agent_kwargs(
194
+ func.__name__, kwargs, known, extra_synonyms,
195
+ pass_through_unknown=takes_var_kw,
196
+ )
197
+ offset = 1 if has_self else 0
198
+ for i, p in enumerate(param_list[: len(args) - offset]):
199
+ if p.name in kwargs:
200
+ if kwargs[p.name] != args[offset + i]:
201
+ raise TypeError(
202
+ f"{func.__name__}(): {p.name} given positionally "
203
+ f"({args[offset + i]!r}) and by keyword "
204
+ f"({kwargs[p.name]!r}) with different values"
205
+ )
206
+ del kwargs[p.name]
207
+ return func(*args, **kwargs)
208
+
209
+ return wrapper
210
+
pptx2/_color.py CHANGED
@@ -41,6 +41,9 @@ def coerce_color(value: Any) -> RGBColor:
41
41
  return value
42
42
  if isinstance(value, str):
43
43
  s = value.lstrip("#")
44
+ if len(s) == 3:
45
+ # CSS shorthand: '#888' -> '#888888' (a common generator habit)
46
+ s = "".join(ch * 2 for ch in s)
44
47
  if len(s) != 6:
45
48
  raise ValueError(
46
49
  "color hex string must be 6 digits "
pptx2/diagrams.py CHANGED
@@ -32,6 +32,7 @@ import math
32
32
  from dataclasses import dataclass, field
33
33
  from typing import TYPE_CHECKING, Any, Sequence
34
34
 
35
+ from pptx2._agent_friendly import agent_friendly
35
36
  from pptx2.enum.shapes import MSO_SHAPE
36
37
  from pptx2.geometry import BBox
37
38
  from pptx2.util import Emu, Inches, Pt
@@ -245,6 +246,14 @@ def _card(
245
246
  # ----------------------------------------------------------------------------- pipelines
246
247
 
247
248
 
249
+ @agent_friendly(
250
+ {
251
+ "text_color": ("color", "colour", "fg_color", "text_colour"),
252
+ "accent": ("accent_color", "primary", "primary_color"),
253
+ "fill": ("fill_color", "background", "bg"),
254
+ }
255
+
256
+ )
248
257
  def horizontal_pipeline(
249
258
  slide,
250
259
  bbox: BBox,
@@ -312,6 +321,14 @@ def horizontal_pipeline(
312
321
  return PipelineResult(cards=cards, arrows=arrows)
313
322
 
314
323
 
324
+ @agent_friendly(
325
+ {
326
+ "text_color": ("color", "colour", "fg_color", "text_colour"),
327
+ "accent": ("accent_color", "primary", "primary_color"),
328
+ "fill": ("fill_color", "background", "bg"),
329
+ }
330
+
331
+ )
315
332
  def vertical_pipeline(
316
333
  slide,
317
334
  bbox: BBox,
@@ -371,6 +388,15 @@ def vertical_pipeline(
371
388
  # ----------------------------------------------------------------------------- hub
372
389
 
373
390
 
391
+ @agent_friendly(
392
+ {
393
+ "text_color": ("color", "colour", "fg_color", "text_colour"),
394
+ "accent": ("accent_color", "primary", "primary_color"),
395
+ "fill": ("fill_color", "background", "bg"),
396
+ "spokes": ("items", "stages", "nodes"),
397
+ "centre": ("center", "hub", "hub_label", "title"),
398
+ }
399
+ )
374
400
  def hub_and_spoke(
375
401
  slide,
376
402
  bbox: BBox,
@@ -479,6 +505,14 @@ def hub_and_spoke(
479
505
  # ----------------------------------------------------------------------------- cycle
480
506
 
481
507
 
508
+ @agent_friendly(
509
+ {
510
+ "text_color": ("color", "colour", "fg_color", "text_colour"),
511
+ "accent": ("accent_color", "primary", "primary_color"),
512
+ "fill": ("fill_color", "background", "bg"),
513
+ }
514
+
515
+ )
482
516
  def cycle(
483
517
  slide,
484
518
  bbox: BBox,
@@ -553,6 +587,15 @@ def cycle(
553
587
  # ----------------------------------------------------------------------------- decision tree
554
588
 
555
589
 
590
+ @agent_friendly(
591
+ {
592
+ "text_color": ("color", "colour", "fg_color", "text_colour"),
593
+ "accent": ("accent_color", "primary", "primary_color"),
594
+ "fill": ("fill_color", "background", "bg"),
595
+ "branches": ("items", "nodes", "children", "steps"),
596
+ "root": ("root_label", "title", "center"),
597
+ }
598
+ )
556
599
  def decision_tree(
557
600
  slide,
558
601
  bbox: BBox,
@@ -675,6 +718,14 @@ def decision_tree(
675
718
  # ----------------------------------------------------------------------------- columns
676
719
 
677
720
 
721
+ @agent_friendly(
722
+ {
723
+ "text_color": ("color", "colour", "fg_color", "text_colour"),
724
+ "accent": ("accent_color", "primary", "primary_color"),
725
+ "fill": ("fill_color", "background", "bg"),
726
+ "columns": ("items", "cols", "sections"),
727
+ }
728
+ )
678
729
  def comparison_columns(
679
730
  slide,
680
731
  bbox: BBox,
pptx2/shapes/shapetree.py CHANGED
@@ -34,6 +34,7 @@ from pptx2.shapes.placeholder import (
34
34
  TablePlaceholder,
35
35
  )
36
36
  from pptx2.shared import ParentedElementProxy
37
+ from pptx2._agent_friendly import agent_friendly
37
38
  from pptx2.util import Emu, _coerce_emu, lazyproperty
38
39
 
39
40
  if TYPE_CHECKING:
@@ -567,6 +568,7 @@ class _BaseGroupShapes(_BaseShapes):
567
568
  super(_BaseGroupShapes, self).__init__(grpSp, parent)
568
569
  self._grpSp = grpSp
569
570
 
571
+ @agent_friendly({"cx": ("width", "w"), "cy": ("height", "h"), "chart_data": ("data", "chartdata"), "chart_type": ("type", "charttype")})
570
572
  def add_chart(
571
573
  self,
572
574
  chart_type: XL_CHART_TYPE,
@@ -601,6 +603,7 @@ class _BaseGroupShapes(_BaseShapes):
601
603
  _apply_horizontal_bar_default(shape, chart_type)
602
604
  return cast("Chart", shape)
603
605
 
606
+ @agent_friendly({"connector_type": ("type", "kind", "connector"), "begin_x": ("x1", "start_x"), "begin_y": ("y1", "start_y"), "end_x": ("x2", "to_x"), "end_y": ("y2", "to_y")})
604
607
  def add_connector(
605
608
  self,
606
609
  connector_type: MSO_CONNECTOR_TYPE,
@@ -621,6 +624,7 @@ class _BaseGroupShapes(_BaseShapes):
621
624
  self._recalculate_extents()
622
625
  return cast(Connector, self._shape_factory(cxnSp))
623
626
 
627
+ @agent_friendly({"shapes": ("items", "members")})
624
628
  def add_group_shape(self, shapes: Iterable[BaseShape] = ()) -> GroupShape:
625
629
  """Return a |GroupShape| object newly appended to this shape tree.
626
630
 
@@ -639,6 +643,7 @@ class _BaseGroupShapes(_BaseShapes):
639
643
  grpSp.recalculate_extents()
640
644
  return cast(GroupShape, self._shape_factory(grpSp))
641
645
 
646
+ @agent_friendly
642
647
  def add_ole_object(
643
648
  self,
644
649
  object_file: str | IO[bytes],
@@ -700,6 +705,7 @@ class _BaseGroupShapes(_BaseShapes):
700
705
  self._recalculate_extents()
701
706
  return cast(GraphicFrame, self._shape_factory(graphicFrame))
702
707
 
708
+ @agent_friendly
703
709
  def add_picture(
704
710
  self,
705
711
  image_file: str | os.PathLike[str] | IO[bytes],
@@ -762,6 +768,7 @@ class _BaseGroupShapes(_BaseShapes):
762
768
  picture.top = Emu(ct + new_top)
763
769
  return picture
764
770
 
771
+ @agent_friendly({"svg_file": ("svg", "svg_path", "svg_source")})
765
772
  def add_svg_picture(
766
773
  self,
767
774
  svg_file,
@@ -825,6 +832,7 @@ class _BaseGroupShapes(_BaseShapes):
825
832
  self._recalculate_extents()
826
833
  return cast(Picture, self._shape_factory(pic))
827
834
 
835
+ @agent_friendly({"autoshape_type_id": ("shape_type", "autoshape_type", "shape", "preset_shape")})
828
836
  def add_shape(
829
837
  self,
830
838
  autoshape_type_id: MSO_SHAPE,
@@ -863,6 +871,7 @@ class _BaseGroupShapes(_BaseShapes):
863
871
  shape.top = Emu(ct + new_top)
864
872
  return shape
865
873
 
874
+ @agent_friendly
866
875
  def add_textbox(
867
876
  self,
868
877
  left: Length,
@@ -1498,6 +1507,7 @@ class _BaseGroupShapes(_BaseShapes):
1498
1507
  sp = self._spTree.add_textbox(id_, name, x, y, cx, cy)
1499
1508
  return sp
1500
1509
 
1510
+ @agent_friendly({"cols": ("columns", "num_cols", "col_count"), "rows": ("num_rows", "row_count")})
1501
1511
  def add_table(
1502
1512
  self,
1503
1513
  rows: int,
@@ -1549,6 +1559,7 @@ class _BaseGroupShapes(_BaseShapes):
1549
1559
  tbl.vert_banding = False
1550
1560
  return shape
1551
1561
 
1562
+ @agent_friendly({"movie_file": ("video", "video_file", "movie", "path", "file")})
1552
1563
  def add_movie(
1553
1564
  self,
1554
1565
  movie_file: str | IO[bytes],
@@ -452,9 +452,13 @@ end. `move` raises `IndexError` out of range; `reorder` raises
452
452
 
453
453
  ### Forgiving keyword arguments
454
454
 
455
- The one-call helpers (`add_text`, `add_equation`, `add_arrow`) absorb
456
- cross-library and near-miss kwargs, so the `font_family=` / `halign=` /
457
- `fontsize=` / `colour` / `x,y,w,h` / `begin,to` habits of other
458
- ecosystems just work. Synonyms substitute, never contradict (two
459
- different values for the same logical argument still raise), and a
460
- truly unknown kwarg raises a `TypeError` listing every accepted name.
455
+ Every shape helper (`add_text`, `add_shape`, `add_picture`,
456
+ `add_table`, `add_chart`, `add_textbox`, `add_connector`, `add_movie`,
457
+ `add_arrow`, `add_equation`, ...) and the diagram recipes
458
+ (`horizontal_pipeline`, `hub_and_spoke`, ...) absorb cross-library and
459
+ near-miss kwargs: `font_family=`, `halign=`/`valign=`, `fontsize=`,
460
+ `colour`, `x,y,w,h` geometry keywords, `shape_type=`, `image=`,
461
+ `columns=`, `data=`, `begin=`/`to=`, `items=`/`nodes=` ... Synonyms
462
+ substitute, never contradict (two different values for the same
463
+ logical argument still raise), and a truly unknown kwarg raises a
464
+ `TypeError` listing every accepted name.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-pptx2
3
- Version: 2.18.0
3
+ Version: 2.20.0
4
4
  Summary: Create, read, and update PowerPoint 2007+ (.pptx) files. Fork of power-pptx / python-pptx, published as python-pptx2.
5
5
  Author: Matěj Štágl
6
6
  Author-email: stagl@wattlescript.org
@@ -1,6 +1,6 @@
1
- pptx2/__init__.py,sha256=RLbdJA33KyGpbpK-EK8th847D5voP73QPHz9FaEVq2M,4076
2
- pptx2/_agent_friendly.py,sha256=zysyr-CLIM6saCk7m-fp8CcMJOaaIMPbqpmWMOibBCA,5663
3
- pptx2/_color.py,sha256=Ureg4dSEdHbwpVZ5eJIyt0kLx_W3mGftmznejth_oLQ,2889
1
+ pptx2/__init__.py,sha256=_KJ9gsIp318yaKTw-u0laId2F7NL8RZupvZ6ub-hRwk,4076
2
+ pptx2/_agent_friendly.py,sha256=wYh9LmVuZMVlwOxzyd1mw0NmtPKQ2cTC21Y1Ww8ehO8,8834
3
+ pptx2/_color.py,sha256=u7L9h98k05RaPX3ufJKA-BXqVl-LHc3SXHqPJPT7WpM,3033
4
4
  pptx2/_slide_importer.py,sha256=Ot3lW20eS7fMKsaGaeqPyeS9zVzt5D1WkovwozWwbYY,27033
5
5
  pptx2/_svg.py,sha256=pMURsUQaJ9-dqRl4nEZKt1VECNpA8Ghp4EwNRWcBG-c,5973
6
6
  pptx2/_template_applier.py,sha256=H1pu7bgUMUhJzTvABuQFT7zkjSWas5NfdJIipamCvXw,12699
@@ -10,7 +10,7 @@ pptx2/action.py,sha256=BiDtM80P6oFsNOtLIT1nX82LXEvaGOg4Usaf5CA7kNY,9648
10
10
  pptx2/animation.py,sha256=g0OxAkCoGu0QEx3QB9Yu4BOnGLjD3tcLpKoYBAtUW6s,83756
11
11
  pptx2/api.py,sha256=n98a5qUhVxSwZ_yG_aXxtDCxtnEp37LPsSIsYsbwsfA,1841
12
12
  pptx2/audit.py,sha256=xg1QAs-ByW3xwBEcJ-Y9ptYe2WHKmVuVWAgRKQZfcr8,11276
13
- pptx2/diagrams.py,sha256=5NqGg-CMj6ZYoEsI9pBD1UHmwQhSAK8oAFYD89NPsVg,24654
13
+ pptx2/diagrams.py,sha256=4NmdFBg367hRjfFh7pQCVivScspmyvPnp94IyncJgCc,26277
14
14
  pptx2/exc.py,sha256=k6p-e9h5cKal09-sAv3E1QTXmVDuF8FqewW1CKFQmfw,1276
15
15
  pptx2/formats.py,sha256=w0b8YXBjBbPhDu1UV9-1iUJdL62d9_gcQSp9sHKVr_s,5081
16
16
  pptx2/geometry.py,sha256=X1tzwqTxXCMPPRpZhHSax6PKGy_-64MAudMI9h3ILJk,15221
@@ -137,12 +137,12 @@ pptx2/shapes/graphfrm.py,sha256=mwA9Wb4WRKBy6sA7KzOZFl3aHlpN-TmWRcE-kiMoqRI,1189
137
137
  pptx2/shapes/group.py,sha256=xlcGi3MAzBHX2IM16IATxRgw8NwsPFzTMVbRPYQ7OKg,11036
138
138
  pptx2/shapes/picture.py,sha256=U7rwiy7OXn0RgFSEdh07bdhIplWsI82OjFk-mt975J0,14938
139
139
  pptx2/shapes/placeholder.py,sha256=9tIeNscnV46hWyMr8ZSiZO3TZr-tt4kZgx6BRB0tCvc,17838
140
- pptx2/shapes/shapetree.py,sha256=m1tVELFeK7Ha7uEMU1vtzxHXAZzGyk5bgTmiR8tgWlQ,90442
140
+ pptx2/shapes/shapetree.py,sha256=ZXO1mE2-sMF8Era-EA4mT61Mcj2Hfsr8v-7xOZM_oBw,91287
141
141
  pptx2/skill/SKILL.md,sha256=6w7sWflZvhYYIzBsXLjx2uVKqB0793ZTvoZ_SUfzQxg,23668
142
142
  pptx2/skill/__init__.py,sha256=bUkfMETwf3K6J7GSE-tLQjdNziS_JceunComLiLIeGI,2665
143
143
  pptx2/skill/__main__.py,sha256=ohMLGy1jbjKV5_FqY6aGj4tm_isJ6fznvqUKiE1H6s8,1777
144
144
  pptx2/skill/references/animations.md,sha256=ca02l5XCtOQpD-uSCItQixGaW0yONIY0P55yy-T-J1Q,5875
145
- pptx2/skill/references/basics.md,sha256=XhdtDY93gQ9_dzPCITsgORFVLZNBaEnSQLMuK06dDio,14583
145
+ pptx2/skill/references/basics.md,sha256=O2ODa85fIK6mkom4aK2ehb2laEsogmtQ31RF5ckh6B0,14806
146
146
  pptx2/skill/references/charts.md,sha256=skCS4Kn1j49mlIQJYDAkcu2VHc3S1mzwqkGT3ZE94wg,8119
147
147
  pptx2/skill/references/compose.md,sha256=AfFwqAyQ9ggR140laqRDIUE3OcmTtXpIZH1oPcTOunA,8088
148
148
  pptx2/skill/references/design.md,sha256=ne3xVyIwqpkhEkd8XK74QEija040eHve5zBHBx9LeNo,11706
@@ -171,9 +171,9 @@ pptx2/text/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
171
171
  pptx2/text/fonts.py,sha256=ECa9HuBfeTqOi-uJTz_bu7eurC7e1_64RTwDatxmkpk,16498
172
172
  pptx2/text/layout.py,sha256=k8bqod6GyshHJtfoqFtH9W-eHTI43IB0e6SLT1ibSUU,12815
173
173
  pptx2/text/text.py,sha256=LPqF1B4GSQNSnSlVMm1v7pgtHCymOJPTUG_Kdt5_ou4,55039
174
- python_pptx2-2.18.0.dist-info/licenses/LICENSE,sha256=hLdud18ZPS9iSG3kBCBLiGYzj4A6zedCHiDejIDBXNg,1230
175
- python_pptx2-2.18.0.dist-info/METADATA,sha256=iiglSWLjdpEaY77K99QiNh0yJ_jaDzrU9so-vNplp0k,14374
176
- python_pptx2-2.18.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
177
- python_pptx2-2.18.0.dist-info/entry_points.txt,sha256=UpD1_pA-2BPeN0iDeD-u4NZ_yC78TvBdWu3V1xLsSRE,105
178
- python_pptx2-2.18.0.dist-info/top_level.txt,sha256=NDdhJ4rOySlDU-cw4g-bQMoZCiy41WszlRXmIiReSRs,6
179
- python_pptx2-2.18.0.dist-info/RECORD,,
174
+ python_pptx2-2.20.0.dist-info/licenses/LICENSE,sha256=hLdud18ZPS9iSG3kBCBLiGYzj4A6zedCHiDejIDBXNg,1230
175
+ python_pptx2-2.20.0.dist-info/METADATA,sha256=Wzd9mQJVacBNBjINUvhQsmmfvFBOetyLlGxLaJc57-U,14374
176
+ python_pptx2-2.20.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
177
+ python_pptx2-2.20.0.dist-info/entry_points.txt,sha256=UpD1_pA-2BPeN0iDeD-u4NZ_yC78TvBdWu3V1xLsSRE,105
178
+ python_pptx2-2.20.0.dist-info/top_level.txt,sha256=NDdhJ4rOySlDU-cw4g-bQMoZCiy41WszlRXmIiReSRs,6
179
+ python_pptx2-2.20.0.dist-info/RECORD,,