Blob Blame History Raw
From 5ea93bc9ab7ae9829ed596e2d53976962164ba78 Mon Sep 17 00:00:00 2001
From: Vighnesh Shenoy <vighneshq@gmail.com>
Date: Sun, 9 Jun 2019 23:34:21 +0530
Subject: [PATCH] Issue #16977, fix more compatibility issues with Python3.8.

xml.dom.minidom preserves attribute order in Python3.8 which causes
some test failures. Modified the order of attribute insertion to
ensure that tests run on both 3.8 & earlier versions. Modified the use
of officially removed time.clock with a conditional import in
sympy/core/compatibility.py
---
 examples/advanced/pidigits.py            |  2 +-
 examples/advanced/pyglet_plotting.py     |  4 ++--
 sympy/core/compatibility.py              |  5 ++++
 sympy/plotting/pygletplot/plot_window.py |  2 +-
 sympy/printing/mathml.py                 | 30 ++++++++++++------------
 5 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/examples/advanced/pidigits.py b/examples/advanced/pidigits.py
index 430ea5aaf83..e444ba2276b 100755
--- a/examples/advanced/pidigits.py
+++ b/examples/advanced/pidigits.py
@@ -10,7 +10,7 @@ from mpmath import libmp, pi
 from mpmath import functions as mpf_funs
 
 import math
-from time import clock
+from sympy.core.compatibility import clock
 import sys
 
 
diff --git a/examples/advanced/pyglet_plotting.py b/examples/advanced/pyglet_plotting.py
index 16d13ac5137..c12ed54f5b1 100755
--- a/examples/advanced/pyglet_plotting.py
+++ b/examples/advanced/pyglet_plotting.py
@@ -8,10 +8,10 @@ Suggested Usage:    python -i pyglet_plo
 
 
 from sympy import symbols, sin, cos, pi, sqrt
-from sympy.core.compatibility import range
+from sympy.core.compatibility import range, clock
 from sympy.plotting.pygletplot import PygletPlot
 
-from time import sleep, clock
+from time import sleep
 
 
 def main():
diff --git a/sympy/core/compatibility.py b/sympy/core/compatibility.py
index 2827b40ca17..9b6a644d847 100644
--- a/sympy/core/compatibility.py
+++ b/sympy/core/compatibility.py
@@ -945,3 +945,8 @@ try:
 except ImportError:  # Python 2.7
     def filterfalse(pred, itr):
         return filter(lambda x: not pred(x), itr)
+
+try:
+    from time import clock
+except ImportError: # Python 3.8+
+    from time import perf_counter as clock
diff --git a/sympy/plotting/pygletplot/plot_window.py b/sympy/plotting/pygletplot/plot_window.py
index 91bf42cc532..193093229b4 100644
--- a/sympy/plotting/pygletplot/plot_window.py
+++ b/sympy/plotting/pygletplot/plot_window.py
@@ -1,6 +1,6 @@
 from __future__ import print_function, division
 
-from time import clock
+from sympy.core.compatibility import clock
 
 import pyglet.gl as pgl
 
diff --git a/sympy/printing/mathml.py b/sympy/printing/mathml.py
index c1eba60b3d4..e5012efe74d 100644
--- a/sympy/printing/mathml.py
+++ b/sympy/printing/mathml.py
@@ -654,8 +654,8 @@ class MathMLPresentationPrinter(MathMLPr
             return table
         brac = self.dom.createElement('mfenced')
         if self._settings["mat_delim"] == "[":
-            brac.setAttribute('open', '[')
             brac.setAttribute('close', ']')
+            brac.setAttribute('open', '[')
         brac.appendChild(table)
         return brac
 
@@ -961,8 +961,8 @@ class MathMLPresentationPrinter(MathMLPr
 
     def _print_AccumulationBounds(self, i):
         brac = self.dom.createElement('mfenced')
-        brac.setAttribute('open', u'\u27e8')
         brac.setAttribute('close', u'\u27e9')
+        brac.setAttribute('open', u'\u27e8')
         brac.appendChild(self._print(i.min))
         brac.appendChild(self._print(i.max))
         return brac
@@ -1106,19 +1106,19 @@ class MathMLPresentationPrinter(MathMLPr
         brac = self.dom.createElement('mfenced')
         if i.start == i.end:
             # Most often, this type of Interval is converted to a FiniteSet
-            brac.setAttribute('open', '{')
             brac.setAttribute('close', '}')
+            brac.setAttribute('open', '{')
             brac.appendChild(self._print(i.start))
         else:
-            if i.left_open:
-                brac.setAttribute('open', '(')
-            else:
-                brac.setAttribute('open', '[')
-
             if i.right_open:
                 brac.setAttribute('close', ')')
             else:
                 brac.setAttribute('close', ']')
+
+            if i.left_open:
+                brac.setAttribute('open', '(')
+            else:
+                brac.setAttribute('open', '[')
             brac.appendChild(self._print(i.start))
             brac.appendChild(self._print(i.end))
 
@@ -1128,8 +1128,8 @@ class MathMLPresentationPrinter(MathMLPr
     def _print_Abs(self, expr, exp=None):
         mrow = self.dom.createElement('mrow')
         x = self.dom.createElement('mfenced')
-        x.setAttribute('open', '|')
         x.setAttribute('close', '|')
+        x.setAttribute('open', '|')
         x.appendChild(self._print(expr.args[0]))
         mrow.appendChild(x)
         return mrow
@@ -1191,8 +1191,8 @@ class MathMLPresentationPrinter(MathMLPr
     def _print_set(self, s):
         items = sorted(s, key=default_sort_key)
         brac = self.dom.createElement('mfenced')
-        brac.setAttribute('open', '{')
         brac.setAttribute('close', '}')
+        brac.setAttribute('open', '{')
         for item in items:
             brac.appendChild(self._print(item))
         return brac
@@ -1309,8 +1309,8 @@ class MathMLPresentationPrinter(MathMLPr
     def _print_Range(self, s):
         dots = u"\u2026"
         brac = self.dom.createElement('mfenced')
-        brac.setAttribute('open', '{')
         brac.setAttribute('close', '}')
+        brac.setAttribute('open', '{')
 
         if s.start.is_infinite:
             printset = dots, s[-1] - s.step, s[-1]
@@ -1507,8 +1507,8 @@ class MathMLPresentationPrinter(MathMLPr
         power = expr.args[2]
         sup = self.dom.createElement('msup')
         brac = self.dom.createElement('mfenced')
-        brac.setAttribute('open', u'\u27e8')
         brac.setAttribute('close', u'\u27e9')
+        brac.setAttribute('open', u'\u27e8')
         brac.appendChild(self._print(shift))
         sup.appendChild(brac)
         sup.appendChild(self._print(power))
@@ -1674,8 +1674,8 @@ class MathMLPresentationPrinter(MathMLPr
     def _print_floor(self, e):
         mrow = self.dom.createElement('mrow')
         x = self.dom.createElement('mfenced')
-        x.setAttribute('open', u'\u230A')
         x.setAttribute('close', u'\u230B')
+        x.setAttribute('open', u'\u230A')
         x.appendChild(self._print(e.args[0]))
         mrow.appendChild(x)
         return mrow
@@ -1683,8 +1683,8 @@ class MathMLPresentationPrinter(MathMLPr
     def _print_ceiling(self, e):
         mrow = self.dom.createElement('mrow')
         x = self.dom.createElement('mfenced')
-        x.setAttribute('open', u'\u2308')
         x.setAttribute('close', u'\u2309')
+        x.setAttribute('open', u'\u2308')
         x.appendChild(self._print(e.args[0]))
         mrow.appendChild(x)
         return mrow
@@ -1727,8 +1727,8 @@ class MathMLPresentationPrinter(MathMLPr
         x = self.dom.createElement('msub')
         x.appendChild(self.parenthesize(e.parent, PRECEDENCE["Atom"], strict = True))
         brac = self.dom.createElement('mfenced')
-        brac.setAttribute("open", "")
         brac.setAttribute("close", "")
+        brac.setAttribute("open", "")
         for i in e.indices:
             brac.appendChild(self._print(i))
         x.appendChild(brac)