Hello community,

here is the log from the commit of package python-openpyxl for openSUSE:Factory 
checked in at 2019-06-17 21:34:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-openpyxl (Old)
 and      /work/SRC/openSUSE:Factory/.python-openpyxl.new.4811 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-openpyxl"

Mon Jun 17 21:34:37 2019 rev:12 rq:710331 version:2.6.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-openpyxl/python-openpyxl.changes  
2019-03-12 09:54:50.991520895 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-openpyxl.new.4811/python-openpyxl.changes    
    2019-06-17 21:35:15.202998368 +0200
@@ -1,0 +2,11 @@
+Mon Jun 17 11:00:03 UTC 2019 - Tomáš Chvátal <tchva...@suse.com>
+
+- Update to 2.6.2:
+  * #1173 Workbook has no _date_formats attribute
+  * #1190 Cannot create charts for worksheets with quotes in the title
+  * #1228 MergedCells not removed when range is unmerged
+  * #1232 Link to pivot table lost from charts
+  * #1233 Chart colours change after saving
+  * #1236 Cannot use ws.cell in read-only mode with Python 2.7
+
+-------------------------------------------------------------------

Old:
----
  openpyxl-2.6.1.tar.gz

New:
----
  openpyxl-2.6.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-openpyxl.spec ++++++
--- /var/tmp/diff_new_pack.NEy8sD/_old  2019-06-17 21:35:15.682998259 +0200
+++ /var/tmp/diff_new_pack.NEy8sD/_new  2019-06-17 21:35:15.686998258 +0200
@@ -18,12 +18,12 @@
 
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-openpyxl
-Version:        2.6.1
+Version:        2.6.2
 Release:        0
 Summary:        A Python library to read/write Excel 2010 xlsx/xlsm files
 License:        MIT AND Python-2.0
 Group:          Development/Languages/Python
-Url:            http://openpyxl.readthedocs.org
+URL:            http://openpyxl.readthedocs.org
 Source:         
https://files.pythonhosted.org/packages/source/o/openpyxl/openpyxl-%{version}.tar.gz
 BuildRequires:  %{python_module devel}
 BuildRequires:  %{python_module et_xmlfile}
@@ -36,7 +36,6 @@
 # for embedded image support
 Recommends:     python-Pillow
 BuildArch:      noarch
-
 %python_subpackages
 
 %description

++++++ openpyxl-2.6.1.tar.gz -> openpyxl-2.6.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/PKG-INFO new/openpyxl-2.6.2/PKG-INFO
--- old/openpyxl-2.6.1/PKG-INFO 2019-03-04 13:10:58.000000000 +0100
+++ new/openpyxl-2.6.2/PKG-INFO 2019-03-29 15:30:36.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: openpyxl
-Version: 2.6.1
+Version: 2.6.2
 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-2.6.1/openpyxl/_constants.py 
new/openpyxl-2.6.2/openpyxl/_constants.py
--- old/openpyxl-2.6.1/openpyxl/_constants.py   2019-03-04 12:58:56.000000000 
+0100
+++ new/openpyxl-2.6.2/openpyxl/_constants.py   2019-03-29 15:29:44.000000000 
+0100
@@ -9,4 +9,4 @@
 __license__ = "MIT/Expat"
 __maintainer_email__ = "openpyxl-us...@googlegroups.com"
 __url__ = "https://openpyxl.readthedocs.io";
-__version__ = "2.6.1"
+__version__ = "2.6.2"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/cell/_writer.py 
new/openpyxl-2.6.2/openpyxl/cell/_writer.py
--- old/openpyxl-2.6.1/openpyxl/cell/_writer.py 2019-02-27 20:14:09.000000000 
+0100
+++ new/openpyxl-2.6.2/openpyxl/cell/_writer.py 2019-03-29 15:29:44.000000000 
+0100
@@ -2,7 +2,7 @@
 # Copyright (c) 2010-2019 openpyxl
 
 from openpyxl.compat import safe_string
-from openpyxl.xml.functions import Element, SubElement
+from openpyxl.xml.functions import Element, SubElement, whitespace, XML_NS, 
REL_NS
 from openpyxl import LXML
 from openpyxl.utils.datetime import to_excel, days_to_time
 from datetime import timedelta
@@ -59,6 +59,8 @@
         inline_string = SubElement(el, 'is')
         text = SubElement(inline_string, 't')
         text.text = value
+        whitespace(text)
+
 
     else:
         cell_content = SubElement(el, 'v')
@@ -85,8 +87,14 @@
 
         if cell.data_type == 's':
             with xf.element("is"):
-                with xf.element("t"):
-                    xf.write(value)
+                attrs = {}
+                if value != value.strip():
+                    attrs["{%s}space" % XML_NS] = "preserve"
+                el = Element("t", attrs) # lxml can't handle xml-ns
+                el.text = value
+                xf.write(el)
+                #with xf.element("t", attrs):
+                    #xf.write(value)
         else:
             with xf.element("v"):
                 if value is not None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/chart/_chart.py 
new/openpyxl-2.6.2/openpyxl/chart/_chart.py
--- old/openpyxl-2.6.1/openpyxl/chart/_chart.py 2019-02-27 19:47:44.000000000 
+0100
+++ new/openpyxl-2.6.2/openpyxl/chart/_chart.py 2019-03-29 15:29:44.000000000 
+0100
@@ -51,7 +51,7 @@
     layout = Typed(expected_type=Layout, allow_none=True)
     roundedCorners = Bool(allow_none=True)
     axId = ValueSequence(expected_type=int)
-    visible_cells_only = Bool()
+    visible_cells_only = Bool(allow_none=True)
     display_blanks = Set(values=['span', 'gap', 'zero'])
 
     _series_type = ""
@@ -81,6 +81,10 @@
         self.plot_area = PlotArea()
         self.axId = axId
         self.display_blanks = 'gap'
+        self.pivotSource = None
+        self.pivotFormats = ()
+        self.visible_cells_only = True
+        self.idx_base = 0
 
 
     def __hash__(self):
@@ -111,7 +115,7 @@
         from .chartspace import ChartSpace, ChartContainer
         self.plot_area.layout = self.layout
 
-        idx_base = 0
+        idx_base = self.idx_base
         for chart in self._charts:
             if chart not in self.plot_area._charts:
                 chart.idx_base = idx_base
@@ -126,9 +130,11 @@
             container.backWall = chart.backWall
         container.plotVisOnly = self.visible_cells_only
         container.dispBlanksAs = self.display_blanks
+        container.pivotFmts = self.pivotFormats
         cs = ChartSpace(chart=container)
         cs.style = self.style
         cs.roundedCorners = self.roundedCorners
+        cs.pivotSource = self.pivotSource
         return cs.to_tree()
 
 
@@ -164,10 +170,9 @@
         else:
             values = data.cols
 
-        for v in values:
-            range_string = u"{0}!{1}:{2}".format(data.sheetname, v[0], v[-1])
-            series = SeriesFactory(range_string, 
title_from_data=titles_from_data)
-            self.ser.append(series)
+        for ref in values:
+            series = SeriesFactory(ref, title_from_data=titles_from_data)
+            self.series.append(series)
 
 
     def append(self, value):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/chart/chartspace.py 
new/openpyxl-2.6.2/openpyxl/chart/chartspace.py
--- old/openpyxl-2.6.1/openpyxl/chart/chartspace.py     2019-02-27 
19:47:44.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/chart/chartspace.py     2019-03-29 
15:29:44.000000000 +0100
@@ -34,6 +34,7 @@
     NestedMinMax,
     NestedText,
 )
+from openpyxl.descriptors.sequence import NestedSequence
 from openpyxl.xml.constants import CHART_NS
 
 from openpyxl.drawing.colors import ColorMapping
@@ -45,61 +46,20 @@
 from ._3d import _3DBase, View3D
 from .plotarea import PlotArea
 from .title import Title
+from .pivot import (
+    PivotFormat,
+    PivotSource,
+)
 from .print_settings import PrintSettings
 
 
-class PivotFormat(Serialisable):
-
-    tagname = "pivotFmt"
-
-    idx = NestedInteger(nested=True)
-    spPr = Typed(expected_type=GraphicalProperties, allow_none=True)
-    graphicalProperties = Alias("spPr")
-    txPr = Typed(expected_type=RichText, allow_none=True)
-    TextBody = Alias("txPr")
-    marker = Typed(expected_type=Marker, allow_none=True)
-    dLbl = Typed(expected_type=DataLabel, allow_none=True)
-    DataLabel = Alias("dLbl")
-    extLst = Typed(expected_type=ExtensionList, allow_none=True)
-
-    __elements__ = ('idx', 'spPr', 'txPr', 'marker', 'dLbl')
-
-    def __init__(self,
-                 idx=0,
-                 spPr=None,
-                 txPr=None,
-                 marker=None,
-                 dLbl=None,
-                 extLst=None,
-                ):
-        self.idx = idx
-        self.spPr = spPr
-        self.txPr = txPr
-        self.marker = marker
-        self.dLbl = dLbl
-
-
-class PivotFormatList(Serialisable):
-
-    tagname = "pivotFmts"
-
-    pivotFmt = Sequence(expected_type=PivotFormat, allow_none=True)
-
-    __elements__ = ('pivotFmt',)
-
-    def __init__(self,
-                 pivotFmt=(),
-                ):
-        self.pivotFmt = pivotFmt
-
-
 class ChartContainer(Serialisable):
 
     tagname = "chart"
 
     title = Typed(expected_type=Title, allow_none=True)
     autoTitleDeleted = NestedBool(allow_none=True)
-    pivotFmts = Typed(expected_type=PivotFormatList, allow_none=True)
+    pivotFmts = NestedSequence(expected_type=PivotFormat)
     view3D = _3DBase.view3D
     floor = _3DBase.floor
     sideWall = _3DBase.sideWall
@@ -118,7 +78,7 @@
     def __init__(self,
                  title=None,
                  autoTitleDeleted=None,
-                 pivotFmts=None,
+                 pivotFmts=(),
                  view3D=None,
                  floor=None,
                  sideWall=None,
@@ -172,25 +132,6 @@
         self.userInterface = userInterface
 
 
-class PivotSource(Serialisable):
-
-    tagname = "pivotSource"
-
-    name = NestedText(expected_type=unicode)
-    fmtId = NestedInteger(expected_type=int)
-    extLst = Typed(expected_type=ExtensionList, allow_none=True)
-
-    __elements__ = ('name', 'fmtId')
-
-    def __init__(self,
-                 name=None,
-                 fmtId=None,
-                 extLst=None,
-                ):
-        self.name = name
-        self.fmtId = fmtId
-
-
 class ExternalData(Serialisable):
 
     tagname = "externalData"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/chart/pivot.py 
new/openpyxl-2.6.2/openpyxl/chart/pivot.py
--- old/openpyxl-2.6.1/openpyxl/chart/pivot.py  1970-01-01 01:00:00.000000000 
+0100
+++ new/openpyxl-2.6.2/openpyxl/chart/pivot.py  2019-03-29 15:29:44.000000000 
+0100
@@ -0,0 +1,66 @@
+from __future__ import absolute_import
+# Copyright (c) 2010-2019 openpyxl
+
+from openpyxl.compat import unicode
+from openpyxl.descriptors.serialisable import Serialisable
+from openpyxl.descriptors import (
+    Alias,
+    Typed,
+)
+from openpyxl.descriptors.nested import NestedInteger, NestedText
+from openpyxl.descriptors.excel import ExtensionList
+
+from .label import DataLabel
+from .marker import Marker
+from .shapes import GraphicalProperties
+from .text import RichText
+
+
+class PivotSource(Serialisable):
+
+    tagname = "pivotSource"
+
+    name = NestedText(expected_type=unicode)
+    fmtId = NestedInteger(expected_type=int)
+    extLst = Typed(expected_type=ExtensionList, allow_none=True)
+
+    __elements__ = ('name', 'fmtId')
+
+    def __init__(self,
+                 name=None,
+                 fmtId=None,
+                 extLst=None,
+                ):
+        self.name = name
+        self.fmtId = fmtId
+
+
+class PivotFormat(Serialisable):
+
+    tagname = "pivotFmt"
+
+    idx = NestedInteger(nested=True)
+    spPr = Typed(expected_type=GraphicalProperties, allow_none=True)
+    graphicalProperties = Alias("spPr")
+    txPr = Typed(expected_type=RichText, allow_none=True)
+    TextBody = Alias("txPr")
+    marker = Typed(expected_type=Marker, allow_none=True)
+    dLbl = Typed(expected_type=DataLabel, allow_none=True)
+    DataLabel = Alias("dLbl")
+    extLst = Typed(expected_type=ExtensionList, allow_none=True)
+
+    __elements__ = ('idx', 'spPr', 'txPr', 'marker', 'dLbl')
+
+    def __init__(self,
+                 idx=0,
+                 spPr=None,
+                 txPr=None,
+                 marker=None,
+                 dLbl=None,
+                 extLst=None,
+                ):
+        self.idx = idx
+        self.spPr = spPr
+        self.txPr = txPr
+        self.marker = marker
+        self.dLbl = dLbl
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/chart/reader.py 
new/openpyxl-2.6.2/openpyxl/chart/reader.py
--- old/openpyxl-2.6.1/openpyxl/chart/reader.py 2019-02-27 19:47:44.000000000 
+0100
+++ new/openpyxl-2.6.2/openpyxl/chart/reader.py 2019-03-29 15:29:44.000000000 
+0100
@@ -33,5 +33,8 @@
     chart.floor = cs.chart.floor
     chart.sideWall = cs.chart.sideWall
     chart.backWall = cs.chart.backWall
+    chart.pivotSource = cs.pivotSource
+    chart.pivotFormats = cs.chart.pivotFmts
+    chart.idx_base = min(s.idx for s in chart.series)
 
     return chart
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/chart/reference.py 
new/openpyxl-2.6.2/openpyxl/chart/reference.py
--- old/openpyxl-2.6.1/openpyxl/chart/reference.py      2019-02-27 
20:14:09.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/chart/reference.py      2019-03-29 
15:29:44.000000000 +0100
@@ -87,39 +87,33 @@
         return 1 + self.max_row - self.min_row
 
 
+    def __eq__(self, other):
+        return str(self) == str(other)
+
+
     @property
     def rows(self):
         """
-        Return all cells in range by column
+        Return all rows in the range
         """
         for row in range(self.min_row, self.max_row+1):
-            yield tuple('%s%d' % (get_column_letter(col), row)
-                    for col in range(self.min_col, self.max_col+1))
+            yield Reference(self.worksheet, self.min_col, row, self.max_col, 
row)
 
 
     @property
     def cols(self):
         """
-        Return all cells in range by row
+        Return all columns in the range
         """
         for col in range(self.min_col, self.max_col+1):
-            yield tuple('%s%d' % (get_column_letter(col), row)
-                        for row in range(self.min_row, self.max_row+1))
-
-
-    @property
-    def cells(self):
-        """
-        Return a flattened list of all cells (by column)
-        """
-        return chain.from_iterable(self.cols)
+            yield Reference(self.worksheet, col, self.min_row, col, 
self.max_row)
 
 
     def pop(self):
         """
         Return and remove the first cell
         """
-        cell = next(self.cells)
+        cell = "{0}{1}".format(get_column_letter(self.min_col), self.min_row)
         if self.min_row == self.max_row:
             self.min_col += 1
         else:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/descriptors/nested.py 
new/openpyxl-2.6.2/openpyxl/descriptors/nested.py
--- old/openpyxl-2.6.1/openpyxl/descriptors/nested.py   2019-02-27 
19:47:44.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/descriptors/nested.py   2019-03-29 
15:29:44.000000000 +0100
@@ -18,7 +18,7 @@
     )
 from .sequence import Sequence
 from openpyxl.compat import safe_string
-from openpyxl.xml.functions import Element, localname
+from openpyxl.xml.functions import Element, localname, whitespace
 
 
 class Nested(Descriptor):
@@ -73,6 +73,7 @@
                 tagname = "{%s}%s" % (namespace, tagname)
             el = Element(tagname)
             el.text = safe_string(value)
+            whitespace(el)
             return el
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/packaging/manifest.py 
new/openpyxl-2.6.2/openpyxl/packaging/manifest.py
--- old/openpyxl-2.6.1/openpyxl/packaging/manifest.py   2019-03-04 
12:58:56.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/packaging/manifest.py   2019-03-29 
15:29:44.000000000 +0100
@@ -4,7 +4,7 @@
 """
 File manifest
 """
-import mimetypes
+from mimetypes import MimeTypes
 import os.path
 
 from openpyxl.descriptors.serialisable import Serialisable
@@ -40,8 +40,7 @@
 from openpyxl.xml.functions import tostring
 
 # initialise mime-types
-if not mimetypes.inited:
-    mimetypes.init()
+mimetypes = MimeTypes()
 mimetypes.add_type('application/xml', ".xml")
 mimetypes.add_type('application/vnd.openxmlformats-package.relationships+xml', 
".rels")
 mimetypes.add_type("application/vnd.ms-office.vbaProject", ".bin")
@@ -120,7 +119,7 @@
         Skip parts without extensions
         """
         exts = set([os.path.splitext(part.PartName)[-1] for part in 
self.Override])
-        return [(ext[1:], mimetypes.types_map[ext]) for ext in sorted(exts) if 
ext]
+        return [(ext[1:], mimetypes.types_map[True][ext]) for ext in 
sorted(exts) if ext]
 
 
     def to_tree(self):
@@ -192,7 +191,7 @@
             ext = os.path.splitext(fn)[-1]
             if not ext:
                 continue
-            mime = mimetypes.types_map[ext]
+            mime = mimetypes.types_map[True][ext]
             fe = FileExtension(ext[1:], mime)
             self.Default.append(fe)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/workbook/workbook.py 
new/openpyxl-2.6.2/openpyxl/workbook/workbook.py
--- old/openpyxl-2.6.1/openpyxl/workbook/workbook.py    2019-02-27 
20:14:09.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/workbook/workbook.py    2019-03-29 
15:29:44.000000000 +0100
@@ -75,7 +75,6 @@
         self.loaded_theme = None
         self.vba_archive = None
         self.is_template = False
-        self._differential_styles = DifferentialStyleList()
         self.code_name = None
         self.epoch = CALENDAR_WINDOWS_1900
         self.encoding = "utf-8"
@@ -105,6 +104,7 @@
         self._fills.add(DEFAULT_GRAY_FILL)
 
         self._number_formats = IndexedList()
+        self._date_formats = {}
 
         self._protections = IndexedList([Protection()])
 
@@ -113,6 +113,7 @@
         self._named_styles = NamedStyleList()
         self.add_named_style(NamedStyle(font=copy(DEFAULT_FONT), builtinId=0))
         self._table_styles = TableStyleList()
+        self._differential_styles = DifferentialStyleList()
 
 
     @property
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/worksheet/_read_only.py 
new/openpyxl-2.6.2/openpyxl/worksheet/_read_only.py
--- old/openpyxl-2.6.1/openpyxl/worksheet/_read_only.py 2019-03-04 
12:58:56.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/worksheet/_read_only.py 2019-03-29 
15:29:44.000000000 +0100
@@ -17,10 +17,6 @@
     _min_row = 1
     _max_column = _max_row = None
 
-    cell = Worksheet.cell
-    __iter__ = Worksheet.__iter__
-
-
     def __init__(self, parent_workbook, title, worksheet_path, shared_strings):
         self.parent = parent_workbook
         self.title = title
@@ -33,10 +29,17 @@
         self.iter_rows = Worksheet.iter_rows.__get__(self)
         self.values = Worksheet.values.__get__(self)
         self.rows = Worksheet.rows.__get__(self)
+        self.cell = Worksheet.cell.__get__(self)
+
+
+    def __iter__(self):
+        # 2.7 compat
+        meth = Worksheet.__iter__.__get__(self)
+        return meth()
 
 
     def __getitem__(self, key):
-        # use protected method from Worksheet
+        # 2.7 compat
         meth = Worksheet.__getitem__.__get__(self)
         return meth(key)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/worksheet/_reader.py 
new/openpyxl-2.6.2/openpyxl/worksheet/_reader.py
--- old/openpyxl-2.6.1/openpyxl/worksheet/_reader.py    2019-03-04 
12:58:56.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/worksheet/_reader.py    2019-03-29 
15:29:44.000000000 +0100
@@ -351,9 +351,9 @@
     def bind_merged_cells(self):
         if not self.parser.merged_cells:
             return
-        self.ws.merged_cells.ranges = self.parser.merged_cells.mergeCell
+
         for cr in self.parser.merged_cells.mergeCell:
-            self.ws._clean_merge_range(cr)
+            self.ws.merge_cells(cr.ref)
 
 
     def bind_hyperlinks(self):
@@ -365,7 +365,10 @@
                 # range of cells
                 for row in self.ws[link.ref]:
                     for cell in row:
-                        cell.hyperlink = link
+                        try:
+                            cell.hyperlink = link
+                        except AttributeError:
+                            pass
             else:
                 self.ws[link.ref].hyperlink = link
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/worksheet/cell_range.py 
new/openpyxl-2.6.2/openpyxl/worksheet/cell_range.py
--- old/openpyxl-2.6.1/openpyxl/worksheet/cell_range.py 2019-02-27 
20:14:09.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/worksheet/cell_range.py 2019-03-29 
15:29:44.000000000 +0100
@@ -93,6 +93,23 @@
             max_row=self.max_row
         )
 
+    @property
+    def rows(self):
+        """
+        Return cell coordinates as rows
+        """
+        for row in range(self.min_row, self.max_row+1):
+            yield [(row, col) for col in range(self.min_col, self.max_col+1)]
+
+
+    @property
+    def cols(self):
+        """
+        Return cell coordinates as columns
+        """
+        for col in range(self.min_col, self.max_col+1):
+            yield [(row, col) for row in range(self.min_row, self.max_row+1)]
+
 
     def _check_title(self, other):
         """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/worksheet/worksheet.py 
new/openpyxl-2.6.2/openpyxl/worksheet/worksheet.py
--- old/openpyxl-2.6.1/openpyxl/worksheet/worksheet.py  2019-03-04 
12:58:56.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/worksheet/worksheet.py  2019-03-29 
15:29:44.000000000 +0100
@@ -5,7 +5,7 @@
 
 
 # Python stdlib imports
-from itertools import islice, product
+from itertools import islice, product, chain
 from operator import itemgetter
 from inspect import isgenerator
 
@@ -139,7 +139,6 @@
         self.legacy_drawing = None
         self.sheet_properties = WorksheetProperties()
         self.sheet_format = SheetFormatProperties()
-        self._merged_cell_range = {}
         self.scenarios = ScenarioList()
 
 
@@ -570,32 +569,24 @@
 
 
     def merge_cells(self, range_string=None, start_row=None, 
start_column=None, end_row=None, end_column=None):
+        """ Set merge on a cell range.  Range is a cell range (e.g. A1:E1) """
         cr = CellRange(range_string=range_string, min_col=start_column, 
min_row=start_row,
                       max_col=end_column, max_row=end_row)
-        """ Set merge on a cell range.  Range is a cell range (e.g. A1:E1) """
-
-        self.merged_cells.add(cr.coord)
+        self.merged_cells.add(cr)
         self._clean_merge_range(cr)
 
 
     def _clean_merge_range(self, cr):
         """
         Remove all but the top left-cell from a range of merged cells
-        and creates a MergedCellRange object to recreate the lost border
-        information.
-        After deletion of cells a reformat is issued.
+        and recreate the lost border information.
+        Borders are then applied
         """
-
-        min_col, min_row, max_col, max_row = cr.bounds
-
         mcr = MergedCellRange(self, cr.coord)
-        self._merged_cell_range.update({cr.bounds:mcr})
-
-        rows = range(min_row, max_row+1)
-        cols = range(min_col, max_col+1)
-        cells = product(rows, cols)
+        cells = chain.from_iterable(mcr.rows)
+        next(cells) # skip first cell
 
-        for row, col in islice(cells, 1, None):
+        for row, col in cells:
             self._cells[row, col] = MergedCell(self, row, col)
         mcr.format()
 
@@ -617,8 +608,11 @@
 
         self.merged_cells.remove(cr)
 
-        # Deletes the MergedCellRange.
-        del self._merged_cell_range[cr.bounds]
+        cells = chain.from_iterable(cr.rows)
+        next(cells) # skip first cell
+
+        for row, col in cells:
+            del self._cells[(row, col)]
 
 
     def append(self, iterable):
@@ -759,16 +753,20 @@
             raise ValueError("Only CellRange objects can be moved")
         if not rows and not cols:
             return
-        min_col, min_row, max_col, max_row = cell_range.bounds
-        # rebase moved range
-        cell_range.shift(row_shift=rows, col_shift=cols)
 
         down = rows > 0
         right = cols > 0
-        r = sorted(range(min_row, max_row+1), reverse=down)
-        c = sorted(range(min_col, max_col+1), reverse=right)
-        for row, column in product(r, c):
-            self._move_cell(row, column, rows, cols, translate)
+
+        if rows:
+            cells = sorted(cell_range.rows, reverse=down)
+        else:
+            cells = sorted(cell_range.cols, reverse=right)
+
+        for row, col in chain.from_iterable(cells):
+            self._move_cell(row, col, rows, cols, translate)
+
+        # rebase moved range
+        cell_range.shift(row_shift=rows, col_shift=cols)
 
 
     def _move_cell(self, row, column, row_offset, col_offset, translate=False):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/xml/constants.py 
new/openpyxl-2.6.2/openpyxl/xml/constants.py
--- old/openpyxl-2.6.1/openpyxl/xml/constants.py        2019-03-04 
12:58:56.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/xml/constants.py        2019-03-29 
15:29:44.000000000 +0100
@@ -36,6 +36,8 @@
 ARC_CUSTOM_UI = 'customUI/customUI.xml'
 
 ## namespaces
+# XML
+XML_NS = "http://www.w3.org/XML/1998/namespace";
 # Dublin Core
 DCORE_NS = 'http://purl.org/dc/elements/1.1/'
 DCTERMS_NS = 'http://purl.org/dc/terms/'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl/xml/functions.py 
new/openpyxl-2.6.2/openpyxl/xml/functions.py
--- old/openpyxl-2.6.1/openpyxl/xml/functions.py        2019-02-27 
20:14:09.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl/xml/functions.py        2019-03-29 
15:29:44.000000000 +0100
@@ -96,7 +96,8 @@
     VTYPES_NS,
     COREPROPS_NS,
     DCTERMS_NS,
-    DCTERMS_PREFIX
+    DCTERMS_PREFIX,
+    XML_NS
 )
 
 register_namespace(DCTERMS_PREFIX, DCTERMS_NS)
@@ -109,6 +110,7 @@
 register_namespace('vt', VTYPES_NS)
 register_namespace('xdr', SHEET_DRAWING_NS)
 register_namespace('cdr', CHART_DRAWING_NS)
+register_namespace('xml', XML_NS)
 
 
 tostring = partial(tostring, encoding="utf-8")
@@ -120,3 +122,8 @@
         return "comment"
     m = NS_REGEX.match(node.tag)
     return m.group('localname')
+
+
+def whitespace(node):
+    if node.text != node.text.strip():
+        node.set("{%s}space" % XML_NS, "preserve")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/openpyxl-2.6.1/openpyxl.egg-info/PKG-INFO 
new/openpyxl-2.6.2/openpyxl.egg-info/PKG-INFO
--- old/openpyxl-2.6.1/openpyxl.egg-info/PKG-INFO       2019-03-04 
13:10:57.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl.egg-info/PKG-INFO       2019-03-29 
15:30:35.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: openpyxl
-Version: 2.6.1
+Version: 2.6.2
 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-2.6.1/openpyxl.egg-info/SOURCES.txt 
new/openpyxl-2.6.2/openpyxl.egg-info/SOURCES.txt
--- old/openpyxl-2.6.1/openpyxl.egg-info/SOURCES.txt    2019-03-04 
13:10:57.000000000 +0100
+++ new/openpyxl-2.6.2/openpyxl.egg-info/SOURCES.txt    2019-03-29 
15:30:36.000000000 +0100
@@ -35,6 +35,7 @@
 openpyxl/chart/marker.py
 openpyxl/chart/picture.py
 openpyxl/chart/pie_chart.py
+openpyxl/chart/pivot.py
 openpyxl/chart/plotarea.py
 openpyxl/chart/print_settings.py
 openpyxl/chart/radar_chart.py


Reply via email to