From 4ad7af50212e88528f7689cfae18e3e078165152 Mon Sep 17 00:00:00 2001
From: Hugo Mills <hugo@carfax.org.uk>
Date: Thu, 21 Feb 2019 16:37:49 +0000
Subject: [PATCH] Update use of collections module to avoid deprecated idiom

The use of the "collections" module to access the abstract base classes
has been deprecated in Python 3.7, and will be removed in Python 3.8.
The new idiom is to access the ABCs in "collections.abc". Update the code
throughout to use the new location.

Signed-off-by: Hugo Mills <hugo@nightglass.co.uk>
---
 examples/ndfd/forecast.py         |    7 +++++--
 pyxb/binding/basis.py             |   11 +++++++----
 pyxb/binding/content.py           |    8 ++++++--
 tests/drivers/test-mg-sequence.py |   15 +++++++++------
 tests/trac/test-trac-0069.py      |    1 -
 tests/trac/test-trac-0071.py      |    9 ++++++---
 6 files changed, 33 insertions(+), 18 deletions(-)

--- a/examples/ndfd/forecast.py
+++ b/examples/ndfd/forecast.py
@@ -5,7 +5,10 @@ import datetime
 import pyxb.binding.datatypes as xsd
 from pyxb.utils.six.moves.urllib.request import urlopen
 import time
-import collections
+try:
+    from collections.abc import MutableSequence
+except ImportError:
+    from collections import MutableSequence
 import sys
 
 # Get the next seven days forecast for two locations
@@ -32,7 +35,7 @@ print('%s %s' % (product.title, product.
 source = r.head.source
 print(", ".join(source.production_center.content()))
 data = r.data
-if isinstance(data, collections.MutableSequence):
+if isinstance(data, MutableSequence):
     data = data.pop(0)
 print(data)
 
--- a/pyxb/binding/basis.py
+++ b/pyxb/binding/basis.py
@@ -17,7 +17,10 @@
 inherit, and that describe the content models of those schema."""
 
 import logging
-import collections
+try:
+    from collections.abc import Iterable
+except ImportError:
+    from collections import Iterable
 import xml.dom
 import pyxb
 from pyxb.utils import domutils, utility, six
@@ -1163,7 +1166,7 @@ class simpleTypeDefinition (_TypeBinding
             raise pyxb.SimpleTypeValueError(cls, value)
         value_class = cls
         if issubclass(cls, STD_list):
-            if not isinstance(value, collections.Iterable):
+            if not isinstance(value, Iterable):
                 raise pyxb.SimpleTypeValueError(cls, value)
             for v in value:
                 if not cls._ItemType._IsValidValue(v):
@@ -1363,7 +1366,7 @@ class STD_list (simpleTypeDefinition, si
             if isinstance(arg1, six.string_types):
                 args = (arg1.split(),) + args[1:]
                 arg1 = args[0]
-            if isinstance(arg1, collections.Iterable):
+            if isinstance(arg1, Iterable):
                 new_arg1 = [ cls._ValidatedItem(_v, kw) for _v in arg1 ]
                 args = (new_arg1,) + args[1:]
         super_fn = getattr(super(STD_list, cls), '_ConvertArguments_vx', lambda *a,**kw: args)
@@ -1646,7 +1649,7 @@ class element (utility._DeconflictSymbol
             return self.__defaultValue
         is_plural = kw.pop('is_plural', False)
         if is_plural:
-            if not isinstance(value, collections.Iterable):
+            if not isinstance(value, Iterable):
                 raise pyxb.SimplePluralValueError(self.typeDefinition(), value)
             return [ self.compatibleValue(_v) for _v in value ]
         compValue = self.typeDefinition()._CompatibleValue(value, **kw);
--- a/pyxb/binding/content.py
+++ b/pyxb/binding/content.py
@@ -796,7 +796,11 @@ class WildcardUse (_FACSymbol):
     def __str__ (self):
         return 'xs:any per %s' % (self.xsdLocation(),)
 
-import collections
+try:
+    from collections.abc import MutableSequence
+except ImportError:
+    from collections import MutableSequence
+
 
 # Do not inherit from list; that's obscene, and could cause problems with the
 # internal assumptions made by Python.  Instead delegate everything to an
@@ -804,7 +808,7 @@ import collections
 # represents list-style data structures so we can identify both lists and
 # these things which are not lists.
 @pyxb.utils.utility.BackfillComparisons
-class _PluralBinding (collections.MutableSequence):
+class _PluralBinding (MutableSequence):
     """Helper for element content that supports multiple occurences.
 
     This is an adapter for Python list.  Any operation that can mutate an item
--- a/tests/drivers/test-mg-sequence.py
+++ b/tests/drivers/test-mg-sequence.py
@@ -22,7 +22,10 @@ def ToDOM (instance, tag=None):
     return instance.toDOM().documentElement
 
 import unittest
-import collections
+try:
+    from collections.abc import MutableSequence
+except ImportError:
+    from collections import MutableSequence
 
 class TestMGSeq (unittest.TestCase):
     def setUp (self):
@@ -50,7 +53,7 @@ class TestMGSeq (unittest.TestCase):
         self.assertTrue(isinstance(instance.first, sequence._ElementMap['first'].elementBinding().typeDefinition()))
         self.assertTrue(isinstance(instance.second_opt, sequence._ElementMap['second_opt'].elementBinding().typeDefinition()))
         self.assertTrue(isinstance(instance.third, sequence._ElementMap['third'].elementBinding().typeDefinition()))
-        self.assertTrue(isinstance(instance.fourth_0_2, collections.MutableSequence))
+        self.assertTrue(isinstance(instance.fourth_0_2, MutableSequence))
         self.assertEqual(1, len(instance.fourth_0_2))
         self.assertTrue(isinstance(instance.fourth_0_2[0], sequence._ElementMap['fourth_0_2'].elementBinding().typeDefinition()))
         self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
@@ -63,7 +66,7 @@ class TestMGSeq (unittest.TestCase):
         self.assertTrue(isinstance(instance.first, sequence._ElementMap['first'].elementBinding().typeDefinition()))
         self.assertTrue(instance.second_opt is None)
         self.assertTrue(isinstance(instance.third, sequence._ElementMap['third'].elementBinding().typeDefinition()))
-        self.assertTrue(isinstance(instance.fourth_0_2, collections.MutableSequence))
+        self.assertTrue(isinstance(instance.fourth_0_2, MutableSequence))
         self.assertEqual(2, len(instance.fourth_0_2))
         self.assertTrue(isinstance(instance.fourth_0_2[0], sequence._ElementMap['fourth_0_2'].elementBinding().typeDefinition()))
         self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
@@ -73,7 +76,7 @@ class TestMGSeq (unittest.TestCase):
         xmld = xmlt.encode('utf-8')
         dom = pyxb.utils.domutils.StringToDOM(xmlt)
         instance = altwrapper.createFromDOM(dom.documentElement)
-        self.assertTrue(isinstance(instance.first, collections.MutableSequence))
+        self.assertTrue(isinstance(instance.first, MutableSequence))
         self.assertEqual(1, len(instance.first))
         self.assertEqual(2, len(instance.second_multi))
         self.assertTrue(isinstance(instance.third, altsequence._ElementMap['third'].elementBinding().typeDefinition()))
@@ -84,7 +87,7 @@ class TestMGSeq (unittest.TestCase):
         xmld = xmlt.encode('utf-8')
         dom = pyxb.utils.domutils.StringToDOM(xmlt)
         instance = altwrapper.createFromDOM(dom.documentElement)
-        self.assertTrue(isinstance(instance.first, collections.MutableSequence))
+        self.assertTrue(isinstance(instance.first, MutableSequence))
         self.assertEqual(2, len(instance.first))
         self.assertEqual(0, len(instance.second_multi))
         self.assertTrue(isinstance(instance.third, altsequence._ElementMap['third'].elementBinding().typeDefinition()))
@@ -100,7 +103,7 @@ class TestMGSeq (unittest.TestCase):
         self.assertTrue(isinstance(instance.first, sequence._ElementMap['first'].elementBinding().typeDefinition()))
         self.assertTrue(instance.second_opt is None)
         self.assertTrue(isinstance(instance.third, sequence._ElementMap['third'].elementBinding().typeDefinition()))
-        self.assertTrue(isinstance(instance.fourth_0_2, collections.MutableSequence))
+        self.assertTrue(isinstance(instance.fourth_0_2, MutableSequence))
         self.assertEqual(0, len(instance.fourth_0_2))
         self.assertEqual(ToDOM(instance).toxml("utf-8"), xmld)
 
--- a/tests/trac/test-trac-0069.py
+++ b/tests/trac/test-trac-0069.py
@@ -59,7 +59,6 @@ eval(rv)
 from pyxb.exceptions_ import *
 
 import unittest
-import collections
 
 # Pretend whoever created the schema was helpful and had normalized it
 metadatadoc_type = MetadataDocument.typeDefinition()
--- a/tests/trac/test-trac-0071.py
+++ b/tests/trac/test-trac-0071.py
@@ -59,7 +59,10 @@ eval(rv)
 from pyxb.exceptions_ import *
 
 import unittest
-import collections
+try:
+    from collections.abc import MutableSequence
+except ImportError:
+    from collections import MutableSequence
 
 # Pretend whoever created the schema was helpful and had normalized it
 metadatadoc_type = MetadataDocument.typeDefinition()
@@ -75,7 +78,7 @@ v_bind = pyxb.BIND('foo', lang='ENG')
 class TestTrac_0071 (unittest.TestCase):
     def testFieldConstructor (self):
         field = field_type('title', pyxb.BIND('foo', lang='ENG'), _element=field_element)
-        self.assertTrue(isinstance(field.value_, collections.MutableSequence))
+        self.assertTrue(isinstance(field.value_, MutableSequence))
         self.assertEqual(1, len(field.value_))
         self.assertTrue(isinstance(field.value_[0], value_type))
         field.validateBinding()
@@ -89,7 +92,7 @@ class TestTrac_0071 (unittest.TestCase):
 
         field = field_type(name='title', _element=field_element)
         field.value_.append(pyxb.BIND('foo', lang='ENG'))
-        self.assertTrue(isinstance(field.value_, collections.MutableSequence))
+        self.assertTrue(isinstance(field.value_, MutableSequence))
         self.assertEqual(1, len(field.value_))
         self.assertTrue(isinstance(field.value_[0], value_type))
         field.validateBinding()
