Hello community, here is the log from the commit of package python-openpyxl for openSUSE:Factory checked in at 2020-02-03 11:11:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-openpyxl (Old) and /work/SRC/openSUSE:Factory/.python-openpyxl.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-openpyxl" Mon Feb 3 11:11:57 2020 rev:15 rq:768796 version:3.0.3 Changes: -------- --- /work/SRC/openSUSE:Factory/python-openpyxl/python-openpyxl.changes 2019-11-24 23:46:20.560026385 +0100 +++ /work/SRC/openSUSE:Factory/.python-openpyxl.new.26092/python-openpyxl.changes 2020-02-03 11:12:10.197810107 +0100 @@ -1,0 +2,18 @@ +Thu Jan 30 15:02:50 UTC 2020 - Todd R <toddrme2...@gmail.com> + +- Update to 3.0.3: + + Bugfixes + * Exception when handling merged cells with hyperlinks + * Problems when both lxml and defusedxml are installed + * CFVO with incorrect values cannot be processed +- Update to 3.0.2: + + Bugfixes + * DeprecationError if both defusedxml and lxml are installed + * ws._current_row is higher than ws.max_row + * Border bottom style is not optional when it should be + * Empty cells in read-only, values-only mode are sometimes returned as ReadOnlyCells + * Cannot add page breaks to existing worksheets if none exist already + + Pull Requests + * Improvements to the documentation + +------------------------------------------------------------------- Old: ---- openpyxl-3.0.1.tar.gz New: ---- openpyxl-3.0.3.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-openpyxl.spec ++++++ --- /var/tmp/diff_new_pack.ZdcA9r/_old 2020-02-03 11:12:11.169810599 +0100 +++ /var/tmp/diff_new_pack.ZdcA9r/_new 2020-02-03 11:12:11.173810600 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-openpyxl # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2020 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,11 +19,11 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-openpyxl -Version: 3.0.1 +Version: 3.0.3 Release: 0 Summary: A Python library to read/write Excel 2010 xlsx/xlsm files License: MIT AND Python-2.0 -URL: https://openpyxl.readthedocs.org +URL: https://bitbucket.org/openpyxl/openpyxl/ Source: https://files.pythonhosted.org/packages/source/o/openpyxl/openpyxl-%{version}.tar.gz BuildRequires: %{python_module et_xmlfile} BuildRequires: %{python_module jdcal} ++++++ openpyxl-3.0.1.tar.gz -> openpyxl-3.0.3.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/AUTHORS.rst new/openpyxl-3.0.3/AUTHORS.rst --- old/openpyxl-3.0.1/AUTHORS.rst 2019-09-25 16:19:46.000000000 +0200 +++ new/openpyxl-3.0.3/AUTHORS.rst 2020-01-10 17:42:44.000000000 +0100 @@ -26,6 +26,7 @@ * Dmitriy Chernyshov * Dominik Geldmacher * Don Freeman +* Eirikur Fannar Torfason * Elias Rabel * Eric Chlebek * Eric Gazoni diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/PKG-INFO new/openpyxl-3.0.3/PKG-INFO --- old/openpyxl-3.0.1/PKG-INFO 2019-11-14 14:10:34.000000000 +0100 +++ new/openpyxl-3.0.3/PKG-INFO 2020-01-10 17:44:02.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: openpyxl -Version: 3.0.1 +Version: 3.0.3 Summary: A Python library to read/write Excel 2010 xlsx/xlsm files Home-page: https://openpyxl.readthedocs.io Author: See AUTHORS diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/_constants.py new/openpyxl-3.0.3/openpyxl/_constants.py --- old/openpyxl-3.0.1/openpyxl/_constants.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/_constants.py 2020-01-10 17:42:44.000000000 +0100 @@ -1,7 +1,7 @@ # Copyright (c) 2010-2019 openpyxl """ -Package medata +Package metadata """ __author__ = "See AUTHORS" @@ -9,4 +9,4 @@ __license__ = "MIT" __maintainer_email__ = "openpyxl-us...@googlegroups.com" __url__ = "https://openpyxl.readthedocs.io" -__version__ = "3.0.1" +__version__ = "3.0.3" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/cell/cell.py new/openpyxl-3.0.3/openpyxl/cell/cell.py --- old/openpyxl-3.0.1/openpyxl/cell/cell.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/cell/cell.py 2020-01-10 17:42:44.000000000 +0100 @@ -15,35 +15,15 @@ import datetime import re -from itertools import islice, product from openpyxl.compat import ( NUMERIC_TYPES, deprecated, ) -from openpyxl.utils.units import ( - DEFAULT_ROW_HEIGHT, - DEFAULT_COLUMN_WIDTH -) -from openpyxl.utils.datetime import ( - to_excel, - time_to_days, - timedelta_to_days, - from_excel - ) -from openpyxl.utils.exceptions import ( - IllegalCharacterError -) -from openpyxl.utils.units import points_to_pixels -from openpyxl.utils import ( - get_column_letter, - column_index_from_string, -) -from openpyxl.utils.inference import ( - cast_numeric, - cast_percentage, - cast_percentage, -) + +from openpyxl.utils.exceptions import IllegalCharacterError + +from openpyxl.utils import get_column_letter from openpyxl.styles import numbers, is_date_format from openpyxl.styles.styleable import StyleableObject from openpyxl.worksheet.hyperlink import Hyperlink @@ -160,9 +140,6 @@ def base_date(self): return self.parent.parent.epoch - @property - def guess_types(self): - return getattr(self.parent.parent, 'guess_types', False) def __repr__(self): return "<Cell {0!r}.{1}>".format(self.parent.title, self.coordinate) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/conftest.py new/openpyxl-3.0.3/openpyxl/conftest.py --- old/openpyxl-3.0.1/openpyxl/conftest.py 2019-09-25 16:19:47.000000000 +0200 +++ new/openpyxl-3.0.3/openpyxl/conftest.py 2020-01-10 17:42:44.000000000 +0100 @@ -5,7 +5,9 @@ ### Markers ### + def pytest_runtest_setup(item): + from openpyxl import DEFUSEDXML, LXML if isinstance(item, pytest.Function): try: from PIL import Image @@ -18,11 +20,9 @@ elif item.get_closest_marker("not_py33"): pytest.skip("Ordering is not a given in Python 3") elif item.get_closest_marker("defusedxml_required"): - from openpyxl import DEFUSEDXML - if not DEFUSEDXML: + if LXML or not DEFUSEDXML: pytest.skip("defusedxml is required to guard against these vulnerabilities") elif item.get_closest_marker("lxml_required"): - from openpyxl import LXML if not LXML: pytest.skip("LXML is required for some features such as schema validation") elif item.get_closest_marker("lxml_buffering"): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/formatting/rule.py new/openpyxl-3.0.3/openpyxl/formatting/rule.py --- old/openpyxl-3.0.1/openpyxl/formatting/rule.py 2019-11-13 10:08:15.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/formatting/rule.py 2020-01-10 17:42:44.000000000 +0100 @@ -11,7 +11,7 @@ Integer, Float, ) -from openpyxl.descriptors.excel import HexBinary, ExtensionList +from openpyxl.descriptors.excel import ExtensionList from openpyxl.styles.colors import Color, ColorDescriptor from openpyxl.styles.differential import DifferentialStyle diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/reader/excel.py new/openpyxl-3.0.3/openpyxl/reader/excel.py --- old/openpyxl-3.0.1/openpyxl/reader/excel.py 2019-11-13 10:08:15.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/reader/excel.py 2019-11-25 18:57:01.000000000 +0100 @@ -295,9 +295,6 @@ :param keep_vba: preseve vba content (this does NOT mean you can use it) :type keep_vba: bool - :param guess_types: guess cell content type and do not read it from the file - :type guess_types: bool - :param data_only: controls whether cells with formulae have either the formula (default) or the value stored the last time Excel read the sheet :type data_only: bool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/styles/borders.py new/openpyxl-3.0.3/openpyxl/styles/borders.py --- old/openpyxl-3.0.1/openpyxl/styles/borders.py 2019-11-13 10:08:15.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/styles/borders.py 2019-11-25 18:57:01.000000000 +0100 @@ -75,7 +75,7 @@ left = Typed(expected_type=Side, allow_none=True) right = Typed(expected_type=Side, allow_none=True) top = Typed(expected_type=Side, allow_none=True) - bottom = Typed(expected_type=Side) + bottom = Typed(expected_type=Side, allow_none=True) diagonal = Typed(expected_type=Side, allow_none=True) vertical = Typed(expected_type=Side, allow_none=True) horizontal = Typed(expected_type=Side, allow_none=True) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/utils/units.py new/openpyxl-3.0.3/openpyxl/utils/units.py --- old/openpyxl-3.0.1/openpyxl/utils/units.py 2019-11-13 10:08:15.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/utils/units.py 2019-11-25 18:57:01.000000000 +0100 @@ -7,8 +7,9 @@ #constants DEFAULT_ROW_HEIGHT = 15. # Default row height measured in point size. -BASE_COL_WIDTH = 13 # in characters -DEFAULT_COLUMN_WIDTH = 51.85 # in points, should be characters +BASE_COL_WIDTH = 8 # in characters +DEFAULT_COLUMN_WIDTH = BASE_COL_WIDTH + 5 +# = baseColumnWidth + {margin padding (2 pixels on each side, totalling 4 pixels)} + {gridline (1pixel)} DEFAULT_LEFT_MARGIN = 0.7 # in inches, = right margin diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/workbook/workbook.py new/openpyxl-3.0.3/openpyxl/workbook/workbook.py --- old/openpyxl-3.0.1/openpyxl/workbook/workbook.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/workbook/workbook.py 2020-01-10 17:42:44.000000000 +0100 @@ -129,22 +129,6 @@ @property - def guess_types(self): - return getattr(self, '__guess_types', False) - - - @guess_types.setter - def guess_types(self, value): - self.__guess_types = value - - - @deprecated("Use the .active property") - def get_active_sheet(self): - """Returns the current active sheet.""" - return self.active - - - @property def excel_base_date(self): return self.epoch diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/worksheet/_read_only.py new/openpyxl-3.0.3/openpyxl/worksheet/_read_only.py --- old/openpyxl-3.0.1/openpyxl/worksheet/_read_only.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/worksheet/_read_only.py 2019-11-25 18:57:01.000000000 +0100 @@ -115,7 +115,9 @@ counter = cell['column'] if min_col <= counter <= max_col: idx = counter - min_col # position in list of cells returned - new_row[idx] = values_only and cell['value'] or ReadOnlyCell(self, **cell) + new_row[idx] = cell['value'] + if not values_only: + new_row[idx] = ReadOnlyCell(self, **cell) return tuple(new_row) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/worksheet/_reader.py new/openpyxl-3.0.3/openpyxl/worksheet/_reader.py --- old/openpyxl-3.0.1/openpyxl/worksheet/_reader.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/worksheet/_reader.py 2020-01-10 17:42:44.000000000 +0100 @@ -1,13 +1,14 @@ # Copyright (c) 2010-2019 openpyxl """Reader for a single worksheet.""" +import traceback from warnings import warn # compatibility imports from openpyxl.xml.functions import iterparse # package imports -from openpyxl.cell import Cell +from openpyxl.cell import Cell, MergedCell from openpyxl.cell.text import Text from openpyxl.worksheet.dimensions import ( ColumnDimension, @@ -85,14 +86,14 @@ def __init__(self, src, shared_strings, data_only=False, epoch=WINDOWS_EPOCH, date_formats=set()): - self.min_row = self.min_col = self.max_row = self.max_column = None + self.min_row = self.min_col = None self.epoch = epoch self.source = src self.shared_strings = shared_strings self.data_only = data_only self.shared_formulae = {} self.array_formulae = {} - self.max_row = self.max_column = 0 + self.row_counter = self.col_counter = 0 self.tables = TablePartList() self.date_formats = date_formats self.row_dimensions = {} @@ -103,7 +104,8 @@ self.formatting = [] self.legacy_drawing = None self.merged_cells = None - self.page_breaks = [] + self.row_breaks = RowBreak() + self.col_breaks = ColBreak() def parse(self): @@ -132,6 +134,7 @@ TABLE_TAG: ('tables', TablePartList), HYPERLINK_TAG: ('hyperlinks', HyperlinkList), MERGE_TAG: ('merged_cells', MergeCells), + } it = iterparse(self.source) @@ -172,7 +175,7 @@ def parse_cell(self, element): data_type = element.get('t', 'n') coordinate = element.get('r') - self.max_column += 1 + self.col_counter += 1 style_id = element.get('s', 0) if style_id: style_id = int(style_id) @@ -185,7 +188,7 @@ if coordinate: row, column = coordinate_to_tuple(coordinate) else: - row, column = self.max_row, self.max_column + row, column = self.row_counter, self.col_counter if not self.data_only and element.find(FORMULA_TAG) is not None: data_type = 'f' @@ -258,22 +261,27 @@ attrs = dict(row.attrib) if "r" in attrs: - self.max_row = int(attrs['r']) + self.row_counter = int(attrs['r']) else: - self.max_row += 1 + self.row_counter += 1 + self.col_counter = 0 keys = {k for k in attrs if not k.startswith('{')} - if keys != {'r', 'spans'} and keys != {'r'}: + if keys - {'r', 'spans'}: # don't create dimension objects unless they have relevant information - self.row_dimensions[attrs['r']] = attrs + self.row_dimensions[str(self.row_counter)] = attrs cells = [self.parse_cell(el) for el in row] - return self.max_row, cells + return self.row_counter, cells def parse_formatting(self, element): - cf = ConditionalFormatting.from_tree(element) - self.formatting.append(cf) + try: + cf = ConditionalFormatting.from_tree(element) + self.formatting.append(cf) + except TypeError: + msg = f"Failed to load a conditional formatting rule. It will be discarded. Cause: {traceback.format_exc()}" + warn(msg) def parse_sheet_protection(self, element): @@ -299,17 +307,19 @@ def parse_row_breaks(self, element): brk = RowBreak.from_tree(element) - self.page_breaks.append(brk) + self.row_breaks = brk def parse_col_breaks(self, element): brk = ColBreak.from_tree(element) - self.page_breaks.append(brk) + self.col_breaks = brk def parse_custom_views(self, element): - # clear page_breaks to avoid duplication - self.page_breaks = [] + # clear page_breaks to avoid duplication which Excel doesn't like + # basically they're ignored in custom views + self.row_breaks = RowBreak() + self.col_breaks = ColBreak() class WorksheetReader(object): @@ -332,7 +342,8 @@ c.data_type = cell['data_type'] self.ws._cells[(cell['row'], cell['column'])] = c self.ws.formula_attributes = self.parser.array_formulae - self.ws._current_row = self.parser.max_row + if self.ws._cells: + self.ws._current_row = self.ws.max_row # use cells not row dimensions def bind_formatting(self): @@ -371,8 +382,19 @@ except AttributeError: pass else: - self.ws[link.ref].hyperlink = link + cell = self.ws[link.ref] + if isinstance(cell, MergedCell): + cell = self.normalize_merged_cell_link(cell.coordinate) + cell.hyperlink = link + def normalize_merged_cell_link(self, coord): + """ + Returns the appropriate cell to which a hyperlink, which references a merged cell at the specified coordinates, + should be bound. + """ + for rng in self.ws.merged_cells: + if coord in rng: + return self.ws.cell(*rng.top[0]) def bind_col_dimensions(self): for col, cd in self.parser.column_dimensions.items(): @@ -394,7 +416,7 @@ for k in ('print_options', 'page_margins', 'page_setup', 'HeaderFooter', 'auto_filter', 'data_validations', 'sheet_properties', 'views', 'sheet_format', - 'page_breaks', 'scenarios', 'legacy_drawing'): + 'row_breaks', 'col_breaks', 'scenarios', 'legacy_drawing'): v = getattr(self.parser, k, None) if v is not None: setattr(self.ws, k, v) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/worksheet/_writer.py new/openpyxl-3.0.3/openpyxl/worksheet/_writer.py --- old/openpyxl-3.0.1/openpyxl/worksheet/_writer.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/worksheet/_writer.py 2019-11-25 18:57:01.000000000 +0100 @@ -234,7 +234,7 @@ def write_breaks(self): - brks = self.ws.page_breaks + brks = (self.ws.row_breaks, self.ws.col_breaks) for brk in brks: if brk: self.xf.send(brk.to_tree()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/worksheet/dimensions.py new/openpyxl-3.0.3/openpyxl/worksheet/dimensions.py --- old/openpyxl-3.0.1/openpyxl/worksheet/dimensions.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/worksheet/dimensions.py 2019-11-25 18:57:01.000000000 +0100 @@ -8,6 +8,7 @@ column_index_from_string, range_boundaries, ) +from openpyxl.utils.units import DEFAULT_COLUMN_WIDTH from openpyxl.descriptors import ( Integer, Float, @@ -134,7 +135,7 @@ def __init__(self, worksheet, index='A', - width=0, + width=DEFAULT_COLUMN_WIDTH, bestFit=False, hidden=False, outlineLevel=0, @@ -227,20 +228,19 @@ return value.min el = Element('cols') - obj = None outlines = set() for col in sorted(self.values(), key=sorter): obj = col.to_tree() - outlines.add(col.outlineLevel) if obj is not None: + outlines.add(col.outlineLevel) el.append(obj) if outlines: self.max_outline = max(outlines) - if obj is not None: - return el + if len(el): + return el # must have at least one child class SheetFormatProperties(Serialisable): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/worksheet/worksheet.py new/openpyxl-3.0.3/openpyxl/worksheet/worksheet.py --- old/openpyxl-3.0.1/openpyxl/worksheet/worksheet.py 2019-11-14 14:10:24.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/worksheet/worksheet.py 2019-11-25 18:57:01.000000000 +0100 @@ -102,7 +102,6 @@ default_factory=self._add_column) self.row_breaks = RowBreak() self.col_breaks = ColBreak() - self.page_breaks = (self.row_breaks, self.col_breaks) self._cells = {} self._charts = [] self._images = [] @@ -150,6 +149,12 @@ def active_cell(self): return self.sheet_view.selection[0].activeCell + + @property + def page_breaks(self): + return (self.row_breaks, self.col_breaks) # legacy, remove at some point + + @property def show_gridlines(self): return self.sheet_view.showGridLines diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl/xml/functions.py new/openpyxl-3.0.3/openpyxl/xml/functions.py --- old/openpyxl-3.0.1/openpyxl/xml/functions.py 2019-11-13 10:08:15.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl/xml/functions.py 2020-01-10 17:42:44.000000000 +0100 @@ -7,59 +7,39 @@ # Python stdlib imports import re from functools import partial -# compatibility -# package imports from openpyxl import DEFUSEDXML, LXML if LXML is True: from lxml.etree import ( Element, - ElementTree, SubElement, register_namespace, QName, xmlfile, XMLParser, ) - from lxml.etree import XMLSyntaxError - - if DEFUSEDXML is True: - from defusedxml.common import DefusedXmlException - from defusedxml.cElementTree import iterparse - from defusedxml.lxml import fromstring as _fromstring, tostring - - def fromstring(*args, **kwargs): - try: - return _fromstring(*args, **kwargs) - except XMLSyntaxError as e: - raise DefusedXmlException(str(e)) - else: - from lxml.etree import fromstring, tostring - from xml.etree.cElementTree import iterparse - # do not resolve entities - safe_parser = XMLParser(resolve_entities=False) - fromstring = partial(fromstring, parser=safe_parser) + from lxml.etree import fromstring, tostring + # do not resolve entities + safe_parser = XMLParser(resolve_entities=False) + fromstring = partial(fromstring, parser=safe_parser) else: from xml.etree.ElementTree import ( - ElementTree, Element, SubElement, fromstring, tostring, - iterparse, QName, register_namespace ) - if DEFUSEDXML is True: - from defusedxml.cElementTree import ( - fromstring, - tostring, - iterparse, - ) from et_xmlfile import xmlfile + if DEFUSEDXML is True: + from defusedxml.ElementTree import fromstring +from xml.etree.ElementTree import iterparse +if DEFUSEDXML is True: + from defusedxml.ElementTree import iterparse from openpyxl.xml.constants import ( CHART_NS, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openpyxl-3.0.1/openpyxl.egg-info/PKG-INFO new/openpyxl-3.0.3/openpyxl.egg-info/PKG-INFO --- old/openpyxl-3.0.1/openpyxl.egg-info/PKG-INFO 2019-11-14 14:10:34.000000000 +0100 +++ new/openpyxl-3.0.3/openpyxl.egg-info/PKG-INFO 2020-01-10 17:44:02.000000000 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.2 Name: openpyxl -Version: 3.0.1 +Version: 3.0.3 Summary: A Python library to read/write Excel 2010 xlsx/xlsm files Home-page: https://openpyxl.readthedocs.io Author: See AUTHORS