瀏覽代碼

Remove last py2 workarounds

python3 is the only supported version of python in depot_tools.

Changes include:
  * updating python version requirements
  * removing third_party/six

Bug: 1475402
Change-Id: Ib86231413fcac494ceb27d1783e53b9d86533c26
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/tools/depot_tools/+/4845292
Reviewed-by: Josip Sokcevic <sokcevic@chromium.org>
Commit-Queue: Gavin Mak <gavinmak@google.com>
Gavin Mak 1 年之前
父節點
當前提交
7f5b53ff8d

+ 1 - 1
README.md

@@ -1,6 +1,6 @@
 # depot_tools
 
-Tools for working with Chromium development. It requires python 2.7 or 3.8 for python 3 support.
+Tools for working with Chromium development. It requires python 3.8.
 
 
 ## Tools

+ 1 - 1
gclient.py

@@ -3986,7 +3986,7 @@ def path_contains_tilde():
 
 
 def can_run_gclient_and_helpers():
-    if sys.hexversion < 0x02060000:
+    if sys.version_info[0] < 3:
         print('\nYour python version %s is unsupported, please upgrade.\n' %
               sys.version.split(' ', 1)[0],
               file=sys.stderr)

+ 1 - 13
gclient_eval.py

@@ -405,14 +405,6 @@ def Exec(content, filename='<unknown>', vars_override=None, builtin_vars=None):
         _validate_statement(statement, statements)
         statements[statement.targets[0].id] = statement.value
 
-    # The tokenized representation needs to end with a newline token, otherwise
-    # untokenization will trigger an assert later on.
-    # In Python 2.7 on Windows we need to ensure the input ends with a newline
-    # for a newline token to be generated.
-    # In other cases a newline token is always generated during tokenization so
-    # this has no effect.
-    # TODO: Remove this workaround after migrating to Python 3.
-    content += '\n'
     tokens = {
         token[2]: list(token)
         for token in tokenize.generate_tokens(StringIO(content).readline)
@@ -664,11 +656,7 @@ def EvaluateCondition(condition, variables, referenced_variables=None):
 
 def RenderDEPSFile(gclient_dict):
     contents = sorted(gclient_dict.tokens.values(), key=lambda token: token[2])
-    # The last token is a newline, which we ensure in Exec() for compatibility.
-    # However tests pass in inputs not ending with a newline and expect the same
-    # back, so for backwards compatibility need to remove that newline
-    # character. TODO: Fix tests to expect the newline
-    return tokenize.untokenize(contents)[:-1]
+    return tokenize.untokenize(contents)
 
 
 def _UpdateAstString(tokens, node, value):

+ 3 - 6
gclient_scm.py

@@ -1518,12 +1518,9 @@ class GitWrapper(SCMWrapper):
         # corruption -- we don't accidentally go corrupting parent git checks
         # too.  See https://crbug.com/1000825 for an example.
         if set_git_dir:
-            git_dir = os.path.abspath(os.path.join(self.checkout_path, '.git'))
-            # Depending on how the .gclient file was defined, self.checkout_path
-            # might be set to a unicode string, not a regular string; on Windows
-            # Python2, we can't set env vars to be unicode strings, so we
-            # forcibly cast the value to a string before setting it.
-            env.setdefault('GIT_DIR', str(git_dir))
+            env.setdefault(
+                'GIT_DIR',
+                os.path.abspath(os.path.join(self.checkout_path, '.git')))
         ret = subprocess2.check_output(['git'] + args, env=env,
                                        **kwargs).decode('utf-8')
         if strip:

+ 1 - 1
gerrit_client.py

@@ -510,7 +510,7 @@ class OptionParser(optparse.OptionParser):
 
 
 def main(argv):
-    if sys.hexversion < 0x02060000:
+    if sys.version_info[0] < 3:
         print('\nYour python version %s is unsupported, please upgrade.\n' %
               (sys.version.split(' ', 1)[0], ),
               file=sys.stderr)

+ 1 - 2
gerrit_util.py

@@ -21,6 +21,7 @@ import stat
 import sys
 import tempfile
 import time
+import urllib.parse
 from multiprocessing.pool import ThreadPool
 
 import auth
@@ -29,8 +30,6 @@ import metrics
 import metrics_utils
 import subprocess2
 
-from six.moves import urllib
-
 import http.cookiejar
 from io import StringIO
 

+ 7 - 9
git_cl.py

@@ -24,6 +24,8 @@ import sys
 import tempfile
 import textwrap
 import time
+import urllib.parse
+import urllib.request
 import uuid
 import webbrowser
 import zlib
@@ -59,7 +61,6 @@ import subprocess2
 import swift_format
 import watchlists
 
-from six.moves import urllib
 
 __version__ = '2.0'
 
@@ -6436,7 +6437,9 @@ def CMDformat(parser, args):
 
             tool_dir = os.path.join(top_dir, xml_dir)
             pretty_print_tool = os.path.join(tool_dir, 'pretty_print.py')
-            cmd = ['vpython3', pretty_print_tool, '--non-interactive']
+            cmd = [
+                shutil.which('vpython3'), pretty_print_tool, '--non-interactive'
+            ]
 
             # If the XML file is histograms.xml or enums.xml, add the xml path
             # to the command as histograms/pretty_print.py now needs a relative
@@ -6458,12 +6461,7 @@ def CMDformat(parser, args):
             if opts.dry_run or opts.diff:
                 cmd.append('--diff')
 
-            # TODO(isherman): Once this file runs only on Python 3.3+, drop the
-            # `shell` param and instead replace `'vpython'` with
-            # `shutil.which('frob')` above: https://stackoverflow.com/a/32799942
-            stdout = RunCommand(cmd,
-                                cwd=top_dir,
-                                shell=sys.platform.startswith('win32'))
+            stdout = RunCommand(cmd, cwd=top_dir)
             if opts.diff:
                 sys.stdout.write(stdout)
             if opts.dry_run and stdout:
@@ -6616,7 +6614,7 @@ class OptionParser(optparse.OptionParser):
 
 
 def main(argv):
-    if sys.hexversion < 0x02060000:
+    if sys.version_info[0] < 3:
         print('\nYour Python version %s is unsupported, please upgrade.\n' %
               (sys.version.split(' ', 1)[0], ),
               file=sys.stderr)

+ 5 - 5
ninjalog_uploader.py

@@ -25,8 +25,8 @@ import platform
 import subprocess
 import sys
 import time
+import urllib.request
 
-from third_party.six.moves.urllib import request
 
 # These build configs affect build performance.
 ALLOWLISTED_CONFIGS = ('symbol_level', 'use_goma', 'is_debug',
@@ -233,10 +233,10 @@ def main():
             logging.info('send metadata: %s', json.dumps(metadata))
             g.write(json.dumps(metadata).encode())
 
-    resp = request.urlopen(
-        request.Request('https://' + args.server + '/upload_ninja_log/',
-                        data=output.getvalue(),
-                        headers={'Content-Encoding': 'gzip'}))
+    resp = urllib.request.urlopen(
+        urllib.request.Request('https://' + args.server + '/upload_ninja_log/',
+                               data=output.getvalue(),
+                               headers={'Content-Encoding': 'gzip'}))
 
     if resp.status != 200:
         logging.warning("unexpected status code for response: %s", resp.status)

+ 148 - 132
tests/gclient_eval_unittest.py

@@ -3,7 +3,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-import collections
 import itertools
 import logging
 import os
@@ -12,13 +11,10 @@ import unittest
 
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 
-from third_party import schema
-
 import metrics_utils
 # We have to disable monitoring before importing gclient.
 metrics_utils.COLLECT_METRICS = False
 
-import gclient
 import gclient_eval
 import gclient_utils
 
@@ -26,6 +22,10 @@ import gclient_utils
 # pylint: disable=line-too-long
 
 
+def file_join(lines):
+    return ''.join([l + '\n' for l in lines])
+
+
 class GClientEvalTest(unittest.TestCase):
     def test_str(self):
         self.assertEqual('foo', gclient_eval._gclient_eval('"foo"'))
@@ -130,15 +130,16 @@ class ExecTest(unittest.TestCase):
             local_scope)
 
     def test_var(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '  "foo": "bar",',
-            '  "baz": Str("quux")',
-            '}',
-            'deps = {',
-            '  "a_dep": "a" + Var("foo") + "b" + Var("baz"),',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '  "foo": "bar",',
+                '  "baz": Str("quux")',
+                '}',
+                'deps = {',
+                '  "a_dep": "a" + Var("foo") + "b" + Var("baz"),',
+                '}',
+            ]))
         Str = gclient_eval.ConstantString
         self.assertEqual(
             {
@@ -152,15 +153,16 @@ class ExecTest(unittest.TestCase):
             }, local_scope)
 
     def test_braces_var(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '  "foo": "bar",',
-            '  "baz": Str("quux")',
-            '}',
-            'deps = {',
-            '  "a_dep": "a{foo}b{baz}",',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '  "foo": "bar",',
+                '  "baz": Str("quux")',
+                '}',
+                'deps = {',
+                '  "a_dep": "a{foo}b{baz}",',
+                '}',
+            ]))
         Str = gclient_eval.ConstantString
         self.assertEqual(
             {
@@ -178,7 +180,7 @@ class ExecTest(unittest.TestCase):
         self.assertEqual({'deps': {}}, local_scope)
 
     def test_overrides_vars(self):
-        local_scope = gclient_eval.Exec('\n'.join([
+        local_scope = gclient_eval.Exec(file_join([
             'vars = {',
             '  "foo": "bar",',
             '  "quux": Str("quuz")',
@@ -207,7 +209,7 @@ class ExecTest(unittest.TestCase):
 
     def test_doesnt_override_undeclared_vars(self):
         with self.assertRaises(KeyError) as cm:
-            gclient_eval.Exec('\n'.join([
+            gclient_eval.Exec(file_join([
                 'vars = {',
                 '  "foo": "bar",',
                 '}',
@@ -222,7 +224,7 @@ class ExecTest(unittest.TestCase):
     def test_doesnt_allow_duplicate_deps(self):
         with self.assertRaises(ValueError) as cm:
             gclient_eval.Parse(
-                '\n'.join([
+                file_join([
                     'deps = {',
                     '  "a_dep": {',
                     '    "url": "a_url@a_rev",',
@@ -438,10 +440,10 @@ class EvaluateConditionTest(unittest.TestCase):
 
 class VarTest(unittest.TestCase):
     def assert_adds_var(self, before, after):
-        local_scope = gclient_eval.Exec('\n'.join(before))
+        local_scope = gclient_eval.Exec(file_join(before))
         gclient_eval.AddVar(local_scope, 'baz', 'lemur')
         results = gclient_eval.RenderDEPSFile(local_scope)
-        self.assertEqual(results, '\n'.join(after))
+        self.assertEqual(results, file_join(after))
 
     def test_adds_var(self):
         before = [
@@ -458,18 +460,20 @@ class VarTest(unittest.TestCase):
         self.assert_adds_var(before, after)
 
     def test_adds_var_twice(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '  "foo": "bar",',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '  "foo": "bar",',
+                '}',
+            ]))
 
         gclient_eval.AddVar(local_scope, 'baz', 'lemur')
         gclient_eval.AddVar(local_scope, 'v8_revision', 'deadbeef')
         result = gclient_eval.RenderDEPSFile(local_scope)
 
         self.assertEqual(
-            result, '\n'.join([
+            result,
+            file_join([
                 'vars = {',
                 '  "v8_revision": "deadbeef",',
                 '  "baz": "lemur",',
@@ -478,12 +482,13 @@ class VarTest(unittest.TestCase):
             ]))
 
     def test_gets_and_sets_var(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '  "foo": "bar",',
-            '  "quux": Str("quuz")',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '  "foo": "bar",',
+                '  "quux": Str("quuz")',
+                '}',
+            ]))
 
         self.assertEqual(gclient_eval.GetVar(local_scope, 'foo'), "bar")
         self.assertEqual(gclient_eval.GetVar(local_scope, 'quux'), "quuz")
@@ -493,7 +498,8 @@ class VarTest(unittest.TestCase):
         result = gclient_eval.RenderDEPSFile(local_scope)
 
         self.assertEqual(
-            result, '\n'.join([
+            result,
+            file_join([
                 'vars = {',
                 '  "foo": "baz",',
                 '  "quux": Str("corge")',
@@ -501,11 +507,12 @@ class VarTest(unittest.TestCase):
             ]))
 
     def test_gets_and_sets_var_non_string(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '  "foo": True,',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '  "foo": True,',
+                '}',
+            ]))
 
         result = gclient_eval.GetVar(local_scope, 'foo')
         self.assertEqual(result, True)
@@ -513,11 +520,12 @@ class VarTest(unittest.TestCase):
         gclient_eval.SetVar(local_scope, 'foo', 'False')
         result = gclient_eval.RenderDEPSFile(local_scope)
 
-        self.assertEqual(result, '\n'.join([
-            'vars = {',
-            '  "foo": False,',
-            '}',
-        ]))
+        self.assertEqual(result,
+                         file_join([
+                             'vars = {',
+                             '  "foo": False,',
+                             '}',
+                         ]))
 
     def test_add_preserves_formatting(self):
         before = [
@@ -554,18 +562,20 @@ class VarTest(unittest.TestCase):
         self.assert_adds_var(before, after)
 
     def test_set_preserves_formatting(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '   # Comment with trailing space ',
-            ' "foo": \'bar\',',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '   # Comment with trailing space ',
+                ' "foo": \'bar\',',
+                '}',
+            ]))
 
         gclient_eval.SetVar(local_scope, 'foo', 'baz')
         result = gclient_eval.RenderDEPSFile(local_scope)
 
         self.assertEqual(
-            result, '\n'.join([
+            result,
+            file_join([
                 'vars = {',
                 '   # Comment with trailing space ',
                 ' "foo": \'baz\',',
@@ -575,24 +585,25 @@ class VarTest(unittest.TestCase):
 
 class CipdTest(unittest.TestCase):
     def test_gets_and_sets_cipd(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'deps = {',
-            '    "src/cipd/package": {',
-            '        "packages": [',
-            '            {',
-            '                "package": "some/cipd/package",',
-            '                "version": "deadbeef",',
-            '            },',
-            '            {',
-            '                "package": "another/cipd/package",',
-            '                "version": "version:5678",',
-            '            },',
-            '        ],',
-            '        "condition": "checkout_android",',
-            '        "dep_type": "cipd",',
-            '    },',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'deps = {',
+                '    "src/cipd/package": {',
+                '        "packages": [',
+                '            {',
+                '                "package": "some/cipd/package",',
+                '                "version": "deadbeef",',
+                '            },',
+                '            {',
+                '                "package": "another/cipd/package",',
+                '                "version": "version:5678",',
+                '            },',
+                '        ],',
+                '        "condition": "checkout_android",',
+                '        "dep_type": "cipd",',
+                '    },',
+                '}',
+            ]))
 
         self.assertEqual(
             gclient_eval.GetCIPD(local_scope, 'src/cipd/package',
@@ -609,7 +620,8 @@ class CipdTest(unittest.TestCase):
         result = gclient_eval.RenderDEPSFile(local_scope)
 
         self.assertEqual(
-            result, '\n'.join([
+            result,
+            file_join([
                 'deps = {',
                 '    "src/cipd/package": {',
                 '        "packages": [',
@@ -629,28 +641,29 @@ class CipdTest(unittest.TestCase):
             ]))
 
     def test_gets_and_sets_cipd_vars(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'vars = {',
-            '    "cipd-rev": "git_revision:deadbeef",',
-            '    "another-cipd-rev": "version:1.0.3",',
-            '}',
-            'deps = {',
-            '    "src/cipd/package": {',
-            '        "packages": [',
-            '            {',
-            '                "package": "some/cipd/package",',
-            '                "version": Var("cipd-rev"),',
-            '            },',
-            '            {',
-            '                "package": "another/cipd/package",',
-            '                "version": "{another-cipd-rev}",',
-            '            },',
-            '        ],',
-            '        "condition": "checkout_android",',
-            '        "dep_type": "cipd",',
-            '    },',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'vars = {',
+                '    "cipd-rev": "git_revision:deadbeef",',
+                '    "another-cipd-rev": "version:1.0.3",',
+                '}',
+                'deps = {',
+                '    "src/cipd/package": {',
+                '        "packages": [',
+                '            {',
+                '                "package": "some/cipd/package",',
+                '                "version": Var("cipd-rev"),',
+                '            },',
+                '            {',
+                '                "package": "another/cipd/package",',
+                '                "version": "{another-cipd-rev}",',
+                '            },',
+                '        ],',
+                '        "condition": "checkout_android",',
+                '        "dep_type": "cipd",',
+                '    },',
+                '}',
+            ]))
 
         self.assertEqual(
             gclient_eval.GetCIPD(local_scope, 'src/cipd/package',
@@ -667,7 +680,8 @@ class CipdTest(unittest.TestCase):
         result = gclient_eval.RenderDEPSFile(local_scope)
 
         self.assertEqual(
-            result, '\n'.join([
+            result,
+            file_join([
                 'vars = {',
                 '    "cipd-rev": "git_revision:foobar",',
                 '    "another-cipd-rev": "version:1.1.0",',
@@ -691,26 +705,28 @@ class CipdTest(unittest.TestCase):
             ]))
 
     def test_preserves_escaped_vars(self):
-        local_scope = gclient_eval.Exec('\n'.join([
-            'deps = {',
-            '    "src/cipd/package": {',
-            '        "packages": [',
-            '            {',
-            '                "package": "package/${{platform}}",',
-            '                "version": "version:abcd",',
-            '            },',
-            '        ],',
-            '        "dep_type": "cipd",',
-            '    },',
-            '}',
-        ]))
+        local_scope = gclient_eval.Exec(
+            file_join([
+                'deps = {',
+                '    "src/cipd/package": {',
+                '        "packages": [',
+                '            {',
+                '                "package": "package/${{platform}}",',
+                '                "version": "version:abcd",',
+                '            },',
+                '        ],',
+                '        "dep_type": "cipd",',
+                '    },',
+                '}',
+            ]))
 
         gclient_eval.SetCIPD(local_scope, 'src/cipd/package',
                              'package/${platform}', 'version:dcba')
         result = gclient_eval.RenderDEPSFile(local_scope)
 
         self.assertEqual(
-            result, '\n'.join([
+            result,
+            file_join([
                 'deps = {',
                 '    "src/cipd/package": {',
                 '        "packages": [',
@@ -730,13 +746,13 @@ class RevisionTest(unittest.TestCase):
                                       before,
                                       after,
                                       rev_before='deadbeef'):
-        local_scope = gclient_eval.Exec('\n'.join(before))
+        local_scope = gclient_eval.Exec(file_join(before))
 
         result = gclient_eval.GetRevision(local_scope, 'src/dep')
         self.assertEqual(result, rev_before)
 
         gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed')
-        self.assertEqual('\n'.join(after),
+        self.assertEqual(file_join(after),
                          gclient_eval.RenderDEPSFile(local_scope))
 
     def test_revision(self):
@@ -788,7 +804,7 @@ class RevisionTest(unittest.TestCase):
             '}',
         ]
         with self.assertRaises(ValueError) as e:
-            local_scope = gclient_eval.Exec('\n'.join(deps))
+            local_scope = gclient_eval.Exec(file_join(deps))
             gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed')
         self.assertEqual(
             'Can\'t update value for src/dep. Multiline strings and implicitly '
@@ -802,7 +818,7 @@ class RevisionTest(unittest.TestCase):
             '}',
         ]
         with self.assertRaises(ValueError) as e:
-            local_scope = gclient_eval.Exec('\n'.join(deps))
+            local_scope = gclient_eval.Exec(file_join(deps))
             gclient_eval.SetRevision(local_scope, 'src/dep', 'deadfeed')
         self.assertEqual(
             'Can\'t update value for src/dep. Multiline strings and implicitly '
@@ -952,7 +968,7 @@ class RevisionTest(unittest.TestCase):
 class ParseTest(unittest.TestCase):
     def callParse(self, vars_override=None):
         return gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'vars = {',
                 '  "foo": "bar",',
                 '}',
@@ -962,7 +978,7 @@ class ParseTest(unittest.TestCase):
             ]), '<unknown>', vars_override)
 
     def test_supports_vars_inside_vars(self):
-        deps_file = '\n'.join([
+        deps_file = file_join([
             'vars = {',
             '  "foo": "bar",',
             '  "baz": "\\"{foo}\\" == \\"bar\\"",',
@@ -992,7 +1008,7 @@ class ParseTest(unittest.TestCase):
 
     def test_has_builtin_vars(self):
         builtin_vars = {'builtin_var': 'foo'}
-        deps_file = '\n'.join([
+        deps_file = file_join([
             'deps = {',
             '  "a_dep": "a{builtin_var}b",',
             '}',
@@ -1011,7 +1027,7 @@ class ParseTest(unittest.TestCase):
 
     def test_declaring_builtin_var_has_no_effect(self):
         builtin_vars = {'builtin_var': 'foo'}
-        deps_file = '\n'.join([
+        deps_file = file_join([
             'vars = {',
             '  "builtin_var": "bar",',
             '}',
@@ -1037,7 +1053,7 @@ class ParseTest(unittest.TestCase):
     def test_override_builtin_var(self):
         builtin_vars = {'builtin_var': 'foo'}
         vars_override = {'builtin_var': 'override'}
-        deps_file = '\n'.join([
+        deps_file = file_join([
             'deps = {',
             '  "a_dep": "a{builtin_var}b",',
             '}',
@@ -1085,7 +1101,7 @@ class ParseTest(unittest.TestCase):
             }, local_scope)
 
     def test_no_extra_vars(self):
-        deps_file = '\n'.join([
+        deps_file = file_join([
             'vars = {',
             '  "foo": "bar",',
             '}',
@@ -1101,7 +1117,7 @@ class ParseTest(unittest.TestCase):
 
     def test_standardizes_deps_string_dep(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps = {',
                 '  "a_dep": "a_url@a_rev",',
                 '}',
@@ -1118,7 +1134,7 @@ class ParseTest(unittest.TestCase):
 
     def test_standardizes_deps_dict_dep(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps = {',
                 '  "a_dep": {',
                 '     "url": "a_url@a_rev",',
@@ -1139,7 +1155,7 @@ class ParseTest(unittest.TestCase):
 
     def test_ignores_none_in_deps_os(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps = {',
                 '  "a_dep": "a_url@a_rev",',
                 '}',
@@ -1161,7 +1177,7 @@ class ParseTest(unittest.TestCase):
 
     def test_merges_deps_os_extra_dep(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps = {',
                 '  "a_dep": "a_url@a_rev",',
                 '}',
@@ -1188,7 +1204,7 @@ class ParseTest(unittest.TestCase):
 
     def test_merges_deps_os_existing_dep_with_no_condition(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps = {',
                 '  "a_dep": "a_url@a_rev",',
                 '}',
@@ -1210,7 +1226,7 @@ class ParseTest(unittest.TestCase):
 
     def test_merges_deps_os_existing_dep_with_condition(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps = {',
                 '  "a_dep": {',
                 '    "url": "a_url@a_rev",',
@@ -1236,7 +1252,7 @@ class ParseTest(unittest.TestCase):
 
     def test_merges_deps_os_multiple_os(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'deps_os = {',
                 '  "win": {'
                 '     "a_dep": "a_url@a_rev"',
@@ -1260,7 +1276,7 @@ class ParseTest(unittest.TestCase):
     def test_fails_to_merge_same_dep_with_different_revisions(self):
         with self.assertRaises(gclient_eval.gclient_utils.Error) as cm:
             gclient_eval.Parse(
-                '\n'.join([
+                file_join([
                     'deps = {',
                     '  "a_dep": {',
                     '    "url": "a_url@a_rev",',
@@ -1277,7 +1293,7 @@ class ParseTest(unittest.TestCase):
 
     def test_merges_hooks_os(self):
         local_scope = gclient_eval.Parse(
-            '\n'.join([
+            file_join([
                 'hooks = [',
                 '  {',
                 '    "action": ["a", "action"],',

+ 5 - 7
tests/gclient_test.py

@@ -16,7 +16,6 @@ import sys
 import unittest
 from unittest import mock
 
-import six
 
 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 
@@ -27,7 +26,6 @@ metrics_utils.COLLECT_METRICS = False
 
 import gclient
 import gclient_eval
-import gclient_scm
 import gclient_utils
 from testing_support import trial_dir
 
@@ -840,7 +838,7 @@ class GclientTest(trial_dir.TestCase):
         options, _ = gclient.OptionParser().parse_args([])
         obj = gclient.GClient.LoadCurrentConfig(options)
         obj.RunOnDeps('None', [])
-        six.assertCountEqual(self, [
+        self.assertCountEqual([
             ('foo', 'svn://example.com/foo'),
             ('foo/bar', 'svn://example.com/override'),
             ('foo/foo/bar', 'svn://example.com/override'),
@@ -1264,10 +1262,10 @@ class GclientTest(trial_dir.TestCase):
         sol._should_sync = False
         sol.ParseDepsFile()
         self.assertEqual(1, len(sol.pre_deps_hooks))
-        six.assertCountEqual(self, expected_dep_names,
-                             [d.name for d in sol.dependencies])
-        six.assertCountEqual(self, expected_hook_names,
-                             [h.name for h in sol._deps_hooks])
+        self.assertCountEqual(expected_dep_names,
+                              [d.name for d in sol.dependencies])
+        self.assertCountEqual(expected_hook_names,
+                              [h.name for h in sol._deps_hooks])
 
     def testParseDepsFile_FalseShouldSync_NoCustoms(self):
         """Parse DEPS when should_sync is False and no custom hooks/deps."""

+ 1 - 5
tests/upload_to_google_storage_unittest.py

@@ -4,6 +4,7 @@
 # found in the LICENSE file.
 """Unit tests for upload_to_google_storage.py."""
 
+from io import StringIO
 import optparse
 import os
 import posixpath
@@ -21,12 +22,7 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 import upload_to_google_storage
 from download_from_google_storage_unittest import GsutilMock
 from download_from_google_storage_unittest import ChangedWorkingDirectory
-from third_party import six
 
-if six.PY2:
-    from cStringIO import StringIO
-else:
-    from io import StringIO
 
 # ../third_party/gsutil/gsutil
 GSUTIL_DEFAULT_PATH = os.path.join(

+ 0 - 18
third_party/six/LICENSE.txt

@@ -1,18 +0,0 @@
-Copyright (c) 2010-2020 Benjamin Peterson
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 0 - 11
third_party/six/README.chromium

@@ -1,11 +0,0 @@
-URL: https://pypi.python.org/pypi/six
-Version: 1.10.0
-License: MIT
-License File: LICENSE.txt
-Shipped: no
-
-Description:
-This directory contains the Python six module.
-
-Local Modifications:
-None

+ 0 - 868
third_party/six/__init__.py

@@ -1,868 +0,0 @@
-"""Utilities for writing code that runs on Python 2 and 3"""
-
-# Copyright (c) 2010-2015 Benjamin Peterson
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to deal
-# in the Software without restriction, including without limitation the rights
-# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-# copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in all
-# copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-# SOFTWARE.
-
-from __future__ import absolute_import
-
-import functools
-import itertools
-import operator
-import sys
-import types
-
-__author__ = "Benjamin Peterson <benjamin@python.org>"
-__version__ = "1.10.0"
-
-
-# Useful for very coarse version differentiation.
-PY2 = sys.version_info[0] == 2
-PY3 = sys.version_info[0] == 3
-PY34 = sys.version_info[0:2] >= (3, 4)
-
-if PY3:
-    string_types = str,
-    integer_types = int,
-    class_types = type,
-    text_type = str
-    binary_type = bytes
-
-    MAXSIZE = sys.maxsize
-else:
-    string_types = basestring,
-    integer_types = (int, long)
-    class_types = (type, types.ClassType)
-    text_type = unicode
-    binary_type = str
-
-    if sys.platform.startswith("java"):
-        # Jython always uses 32 bits.
-        MAXSIZE = int((1 << 31) - 1)
-    else:
-        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
-        class X(object):
-
-            def __len__(self):
-                return 1 << 31
-        try:
-            len(X())
-        except OverflowError:
-            # 32-bit
-            MAXSIZE = int((1 << 31) - 1)
-        else:
-            # 64-bit
-            MAXSIZE = int((1 << 63) - 1)
-        del X
-
-
-def _add_doc(func, doc):
-    """Add documentation to a function."""
-    func.__doc__ = doc
-
-
-def _import_module(name):
-    """Import module, returning the module after the last dot."""
-    __import__(name)
-    return sys.modules[name]
-
-
-class _LazyDescr(object):
-
-    def __init__(self, name):
-        self.name = name
-
-    def __get__(self, obj, tp):
-        result = self._resolve()
-        setattr(obj, self.name, result)  # Invokes __set__.
-        try:
-            # This is a bit ugly, but it avoids running this again by
-            # removing this descriptor.
-            delattr(obj.__class__, self.name)
-        except AttributeError:
-            pass
-        return result
-
-
-class MovedModule(_LazyDescr):
-
-    def __init__(self, name, old, new=None):
-        super(MovedModule, self).__init__(name)
-        if PY3:
-            if new is None:
-                new = name
-            self.mod = new
-        else:
-            self.mod = old
-
-    def _resolve(self):
-        return _import_module(self.mod)
-
-    def __getattr__(self, attr):
-        _module = self._resolve()
-        value = getattr(_module, attr)
-        setattr(self, attr, value)
-        return value
-
-
-class _LazyModule(types.ModuleType):
-
-    def __init__(self, name):
-        super(_LazyModule, self).__init__(name)
-        self.__doc__ = self.__class__.__doc__
-
-    def __dir__(self):
-        attrs = ["__doc__", "__name__"]
-        attrs += [attr.name for attr in self._moved_attributes]
-        return attrs
-
-    # Subclasses should override this
-    _moved_attributes = []
-
-
-class MovedAttribute(_LazyDescr):
-
-    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
-        super(MovedAttribute, self).__init__(name)
-        if PY3:
-            if new_mod is None:
-                new_mod = name
-            self.mod = new_mod
-            if new_attr is None:
-                if old_attr is None:
-                    new_attr = name
-                else:
-                    new_attr = old_attr
-            self.attr = new_attr
-        else:
-            self.mod = old_mod
-            if old_attr is None:
-                old_attr = name
-            self.attr = old_attr
-
-    def _resolve(self):
-        module = _import_module(self.mod)
-        return getattr(module, self.attr)
-
-
-class _SixMetaPathImporter(object):
-
-    """
-    A meta path importer to import six.moves and its submodules.
-
-    This class implements a PEP302 finder and loader. It should be compatible
-    with Python 2.5 and all existing versions of Python3
-    """
-
-    def __init__(self, six_module_name):
-        self.name = six_module_name
-        self.known_modules = {}
-
-    def _add_module(self, mod, *fullnames):
-        for fullname in fullnames:
-            self.known_modules[self.name + "." + fullname] = mod
-
-    def _get_module(self, fullname):
-        return self.known_modules[self.name + "." + fullname]
-
-    def find_module(self, fullname, path=None):
-        if fullname in self.known_modules:
-            return self
-        return None
-
-    def __get_module(self, fullname):
-        try:
-            return self.known_modules[fullname]
-        except KeyError:
-            raise ImportError("This loader does not know module " + fullname)
-
-    def load_module(self, fullname):
-        try:
-            # in case of a reload
-            return sys.modules[fullname]
-        except KeyError:
-            pass
-        mod = self.__get_module(fullname)
-        if isinstance(mod, MovedModule):
-            mod = mod._resolve()
-        else:
-            mod.__loader__ = self
-        sys.modules[fullname] = mod
-        return mod
-
-    def is_package(self, fullname):
-        """
-        Return true, if the named module is a package.
-
-        We need this method to get correct spec objects with
-        Python 3.4 (see PEP451)
-        """
-        return hasattr(self.__get_module(fullname), "__path__")
-
-    def get_code(self, fullname):
-        """Return None
-
-        Required, if is_package is implemented"""
-        self.__get_module(fullname)  # eventually raises ImportError
-        return None
-    get_source = get_code  # same as get_code
-
-_importer = _SixMetaPathImporter(__name__)
-
-
-class _MovedItems(_LazyModule):
-
-    """Lazy loading of moved objects"""
-    __path__ = []  # mark as package
-
-
-_moved_attributes = [
-    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
-    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
-    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
-    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
-    MovedAttribute("intern", "__builtin__", "sys"),
-    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
-    MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"),
-    MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"),
-    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
-    MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"),
-    MovedAttribute("reduce", "__builtin__", "functools"),
-    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
-    MovedAttribute("StringIO", "StringIO", "io"),
-    MovedAttribute("UserDict", "UserDict", "collections"),
-    MovedAttribute("UserList", "UserList", "collections"),
-    MovedAttribute("UserString", "UserString", "collections"),
-    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
-    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
-    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
-    MovedModule("builtins", "__builtin__"),
-    MovedModule("configparser", "ConfigParser"),
-    MovedModule("copyreg", "copy_reg"),
-    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
-    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
-    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
-    MovedModule("http_cookies", "Cookie", "http.cookies"),
-    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
-    MovedModule("html_parser", "HTMLParser", "html.parser"),
-    MovedModule("http_client", "httplib", "http.client"),
-    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
-    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
-    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
-    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
-    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
-    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
-    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
-    MovedModule("cPickle", "cPickle", "pickle"),
-    MovedModule("queue", "Queue"),
-    MovedModule("reprlib", "repr"),
-    MovedModule("socketserver", "SocketServer"),
-    MovedModule("_thread", "thread", "_thread"),
-    MovedModule("tkinter", "Tkinter"),
-    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
-    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
-    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
-    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
-    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
-    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
-    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
-    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
-    MovedModule("tkinter_colorchooser", "tkColorChooser",
-                "tkinter.colorchooser"),
-    MovedModule("tkinter_commondialog", "tkCommonDialog",
-                "tkinter.commondialog"),
-    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
-    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
-    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
-    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
-                "tkinter.simpledialog"),
-    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
-    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
-    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
-    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
-    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
-    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
-]
-# Add windows specific modules.
-if sys.platform == "win32":
-    _moved_attributes += [
-        MovedModule("winreg", "_winreg"),
-    ]
-
-for attr in _moved_attributes:
-    setattr(_MovedItems, attr.name, attr)
-    if isinstance(attr, MovedModule):
-        _importer._add_module(attr, "moves." + attr.name)
-del attr
-
-_MovedItems._moved_attributes = _moved_attributes
-
-moves = _MovedItems(__name__ + ".moves")
-_importer._add_module(moves, "moves")
-
-
-class Module_six_moves_urllib_parse(_LazyModule):
-
-    """Lazy loading of moved objects in six.moves.urllib_parse"""
-
-
-_urllib_parse_moved_attributes = [
-    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
-    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
-    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
-    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
-    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
-    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
-    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
-    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
-    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
-    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
-    MovedAttribute("quote", "urllib", "urllib.parse"),
-    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
-    MovedAttribute("unquote", "urllib", "urllib.parse"),
-    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
-    MovedAttribute("urlencode", "urllib", "urllib.parse"),
-    MovedAttribute("splitquery", "urllib", "urllib.parse"),
-    MovedAttribute("splittag", "urllib", "urllib.parse"),
-    MovedAttribute("splituser", "urllib", "urllib.parse"),
-    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
-    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
-    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
-    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
-    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
-]
-for attr in _urllib_parse_moved_attributes:
-    setattr(Module_six_moves_urllib_parse, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
-                      "moves.urllib_parse", "moves.urllib.parse")
-
-
-class Module_six_moves_urllib_error(_LazyModule):
-
-    """Lazy loading of moved objects in six.moves.urllib_error"""
-
-
-_urllib_error_moved_attributes = [
-    MovedAttribute("URLError", "urllib2", "urllib.error"),
-    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
-    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
-]
-for attr in _urllib_error_moved_attributes:
-    setattr(Module_six_moves_urllib_error, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
-                      "moves.urllib_error", "moves.urllib.error")
-
-
-class Module_six_moves_urllib_request(_LazyModule):
-
-    """Lazy loading of moved objects in six.moves.urllib_request"""
-
-
-_urllib_request_moved_attributes = [
-    MovedAttribute("urlopen", "urllib2", "urllib.request"),
-    MovedAttribute("install_opener", "urllib2", "urllib.request"),
-    MovedAttribute("build_opener", "urllib2", "urllib.request"),
-    MovedAttribute("pathname2url", "urllib", "urllib.request"),
-    MovedAttribute("url2pathname", "urllib", "urllib.request"),
-    MovedAttribute("getproxies", "urllib", "urllib.request"),
-    MovedAttribute("Request", "urllib2", "urllib.request"),
-    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
-    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
-    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
-    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
-    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
-    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
-    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
-    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
-    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
-    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
-    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
-    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
-    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
-    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
-    MovedAttribute("URLopener", "urllib", "urllib.request"),
-    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
-    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
-]
-for attr in _urllib_request_moved_attributes:
-    setattr(Module_six_moves_urllib_request, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
-                      "moves.urllib_request", "moves.urllib.request")
-
-
-class Module_six_moves_urllib_response(_LazyModule):
-
-    """Lazy loading of moved objects in six.moves.urllib_response"""
-
-
-_urllib_response_moved_attributes = [
-    MovedAttribute("addbase", "urllib", "urllib.response"),
-    MovedAttribute("addclosehook", "urllib", "urllib.response"),
-    MovedAttribute("addinfo", "urllib", "urllib.response"),
-    MovedAttribute("addinfourl", "urllib", "urllib.response"),
-]
-for attr in _urllib_response_moved_attributes:
-    setattr(Module_six_moves_urllib_response, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
-                      "moves.urllib_response", "moves.urllib.response")
-
-
-class Module_six_moves_urllib_robotparser(_LazyModule):
-
-    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
-
-
-_urllib_robotparser_moved_attributes = [
-    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
-]
-for attr in _urllib_robotparser_moved_attributes:
-    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
-del attr
-
-Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
-
-_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
-                      "moves.urllib_robotparser", "moves.urllib.robotparser")
-
-
-class Module_six_moves_urllib(types.ModuleType):
-
-    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
-    __path__ = []  # mark as package
-    parse = _importer._get_module("moves.urllib_parse")
-    error = _importer._get_module("moves.urllib_error")
-    request = _importer._get_module("moves.urllib_request")
-    response = _importer._get_module("moves.urllib_response")
-    robotparser = _importer._get_module("moves.urllib_robotparser")
-
-    def __dir__(self):
-        return ['parse', 'error', 'request', 'response', 'robotparser']
-
-_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
-                      "moves.urllib")
-
-
-def add_move(move):
-    """Add an item to six.moves."""
-    setattr(_MovedItems, move.name, move)
-
-
-def remove_move(name):
-    """Remove item from six.moves."""
-    try:
-        delattr(_MovedItems, name)
-    except AttributeError:
-        try:
-            del moves.__dict__[name]
-        except KeyError:
-            raise AttributeError("no such move, %r" % (name,))
-
-
-if PY3:
-    _meth_func = "__func__"
-    _meth_self = "__self__"
-
-    _func_closure = "__closure__"
-    _func_code = "__code__"
-    _func_defaults = "__defaults__"
-    _func_globals = "__globals__"
-else:
-    _meth_func = "im_func"
-    _meth_self = "im_self"
-
-    _func_closure = "func_closure"
-    _func_code = "func_code"
-    _func_defaults = "func_defaults"
-    _func_globals = "func_globals"
-
-
-try:
-    advance_iterator = next
-except NameError:
-    def advance_iterator(it):
-        return it.next()
-next = advance_iterator
-
-
-try:
-    callable = callable
-except NameError:
-    def callable(obj):
-        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
-
-
-if PY3:
-    def get_unbound_function(unbound):
-        return unbound
-
-    create_bound_method = types.MethodType
-
-    def create_unbound_method(func, cls):
-        return func
-
-    Iterator = object
-else:
-    def get_unbound_function(unbound):
-        return unbound.im_func
-
-    def create_bound_method(func, obj):
-        return types.MethodType(func, obj, obj.__class__)
-
-    def create_unbound_method(func, cls):
-        return types.MethodType(func, None, cls)
-
-    class Iterator(object):
-
-        def next(self):
-            return type(self).__next__(self)
-
-    callable = callable
-_add_doc(get_unbound_function,
-         """Get the function out of a possibly unbound function""")
-
-
-get_method_function = operator.attrgetter(_meth_func)
-get_method_self = operator.attrgetter(_meth_self)
-get_function_closure = operator.attrgetter(_func_closure)
-get_function_code = operator.attrgetter(_func_code)
-get_function_defaults = operator.attrgetter(_func_defaults)
-get_function_globals = operator.attrgetter(_func_globals)
-
-
-if PY3:
-    def iterkeys(d, **kw):
-        return iter(d.keys(**kw))
-
-    def itervalues(d, **kw):
-        return iter(d.values(**kw))
-
-    def iteritems(d, **kw):
-        return iter(d.items(**kw))
-
-    def iterlists(d, **kw):
-        return iter(d.lists(**kw))
-
-    viewkeys = operator.methodcaller("keys")
-
-    viewvalues = operator.methodcaller("values")
-
-    viewitems = operator.methodcaller("items")
-else:
-    def iterkeys(d, **kw):
-        return d.iterkeys(**kw)
-
-    def itervalues(d, **kw):
-        return d.itervalues(**kw)
-
-    def iteritems(d, **kw):
-        return d.iteritems(**kw)
-
-    def iterlists(d, **kw):
-        return d.iterlists(**kw)
-
-    viewkeys = operator.methodcaller("viewkeys")
-
-    viewvalues = operator.methodcaller("viewvalues")
-
-    viewitems = operator.methodcaller("viewitems")
-
-_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
-_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
-_add_doc(iteritems,
-         "Return an iterator over the (key, value) pairs of a dictionary.")
-_add_doc(iterlists,
-         "Return an iterator over the (key, [values]) pairs of a dictionary.")
-
-
-if PY3:
-    def b(s):
-        return s.encode("latin-1")
-
-    def u(s):
-        return s
-    unichr = chr
-    import struct
-    int2byte = struct.Struct(">B").pack
-    del struct
-    byte2int = operator.itemgetter(0)
-    indexbytes = operator.getitem
-    iterbytes = iter
-    import io
-    StringIO = io.StringIO
-    BytesIO = io.BytesIO
-    _assertCountEqual = "assertCountEqual"
-    if sys.version_info[1] <= 1:
-        _assertRaisesRegex = "assertRaisesRegexp"
-        _assertRegex = "assertRegexpMatches"
-    else:
-        _assertRaisesRegex = "assertRaisesRegex"
-        _assertRegex = "assertRegex"
-else:
-    def b(s):
-        return s
-    # Workaround for standalone backslash
-
-    def u(s):
-        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
-    unichr = unichr
-    int2byte = chr
-
-    def byte2int(bs):
-        return ord(bs[0])
-
-    def indexbytes(buf, i):
-        return ord(buf[i])
-    iterbytes = functools.partial(itertools.imap, ord)
-    import StringIO
-    StringIO = BytesIO = StringIO.StringIO
-    _assertCountEqual = "assertItemsEqual"
-    _assertRaisesRegex = "assertRaisesRegexp"
-    _assertRegex = "assertRegexpMatches"
-_add_doc(b, """Byte literal""")
-_add_doc(u, """Text literal""")
-
-
-def assertCountEqual(self, *args, **kwargs):
-    return getattr(self, _assertCountEqual)(*args, **kwargs)
-
-
-def assertRaisesRegex(self, *args, **kwargs):
-    return getattr(self, _assertRaisesRegex)(*args, **kwargs)
-
-
-def assertRegex(self, *args, **kwargs):
-    return getattr(self, _assertRegex)(*args, **kwargs)
-
-
-if PY3:
-    exec_ = getattr(moves.builtins, "exec")
-
-    def reraise(tp, value, tb=None):
-        if value is None:
-            value = tp()
-        if value.__traceback__ is not tb:
-            raise value.with_traceback(tb)
-        raise value
-
-else:
-    def exec_(_code_, _globs_=None, _locs_=None):
-        """Execute code in a namespace."""
-        if _globs_ is None:
-            frame = sys._getframe(1)
-            _globs_ = frame.f_globals
-            if _locs_ is None:
-                _locs_ = frame.f_locals
-            del frame
-        elif _locs_ is None:
-            _locs_ = _globs_
-        exec("""exec _code_ in _globs_, _locs_""")
-
-    exec_("""def reraise(tp, value, tb=None):
-    raise tp, value, tb
-""")
-
-
-if sys.version_info[:2] == (3, 2):
-    exec_("""def raise_from(value, from_value):
-    if from_value is None:
-        raise value
-    raise value from from_value
-""")
-elif sys.version_info[:2] > (3, 2):
-    exec_("""def raise_from(value, from_value):
-    raise value from from_value
-""")
-else:
-    def raise_from(value, from_value):
-        raise value
-
-
-print_ = getattr(moves.builtins, "print", None)
-if print_ is None:
-    def print_(*args, **kwargs):
-        """The new-style print function for Python 2.4 and 2.5."""
-        fp = kwargs.pop("file", sys.stdout)
-        if fp is None:
-            return
-
-        def write(data):
-            if not isinstance(data, basestring):
-                data = str(data)
-            # If the file has an encoding, encode unicode with it.
-            if (isinstance(fp, file) and
-                    isinstance(data, unicode) and
-                    fp.encoding is not None):
-                errors = getattr(fp, "errors", None)
-                if errors is None:
-                    errors = "strict"
-                data = data.encode(fp.encoding, errors)
-            fp.write(data)
-        want_unicode = False
-        sep = kwargs.pop("sep", None)
-        if sep is not None:
-            if isinstance(sep, unicode):
-                want_unicode = True
-            elif not isinstance(sep, str):
-                raise TypeError("sep must be None or a string")
-        end = kwargs.pop("end", None)
-        if end is not None:
-            if isinstance(end, unicode):
-                want_unicode = True
-            elif not isinstance(end, str):
-                raise TypeError("end must be None or a string")
-        if kwargs:
-            raise TypeError("invalid keyword arguments to print()")
-        if not want_unicode:
-            for arg in args:
-                if isinstance(arg, unicode):
-                    want_unicode = True
-                    break
-        if want_unicode:
-            newline = unicode("\n")
-            space = unicode(" ")
-        else:
-            newline = "\n"
-            space = " "
-        if sep is None:
-            sep = space
-        if end is None:
-            end = newline
-        for i, arg in enumerate(args):
-            if i:
-                write(sep)
-            write(arg)
-        write(end)
-if sys.version_info[:2] < (3, 3):
-    _print = print_
-
-    def print_(*args, **kwargs):
-        fp = kwargs.get("file", sys.stdout)
-        flush = kwargs.pop("flush", False)
-        _print(*args, **kwargs)
-        if flush and fp is not None:
-            fp.flush()
-
-_add_doc(reraise, """Reraise an exception.""")
-
-if sys.version_info[0:2] < (3, 4):
-    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
-              updated=functools.WRAPPER_UPDATES):
-        def wrapper(f):
-            f = functools.wraps(wrapped, assigned, updated)(f)
-            f.__wrapped__ = wrapped
-            return f
-        return wrapper
-else:
-    wraps = functools.wraps
-
-
-def with_metaclass(meta, *bases):
-    """Create a base class with a metaclass."""
-    # This requires a bit of explanation: the basic idea is to make a dummy
-    # metaclass for one level of class instantiation that replaces itself with
-    # the actual metaclass.
-    class metaclass(meta):
-
-        def __new__(cls, name, this_bases, d):
-            return meta(name, bases, d)
-    return type.__new__(metaclass, 'temporary_class', (), {})
-
-
-def add_metaclass(metaclass):
-    """Class decorator for creating a class with a metaclass."""
-    def wrapper(cls):
-        orig_vars = cls.__dict__.copy()
-        slots = orig_vars.get('__slots__')
-        if slots is not None:
-            if isinstance(slots, str):
-                slots = [slots]
-            for slots_var in slots:
-                orig_vars.pop(slots_var)
-        orig_vars.pop('__dict__', None)
-        orig_vars.pop('__weakref__', None)
-        return metaclass(cls.__name__, cls.__bases__, orig_vars)
-    return wrapper
-
-
-def python_2_unicode_compatible(klass):
-    """
-    A decorator that defines __unicode__ and __str__ methods under Python 2.
-    Under Python 3 it does nothing.
-
-    To support Python 2 and 3 with a single code base, define a __str__ method
-    returning text and apply this decorator to the class.
-    """
-    if PY2:
-        if '__str__' not in klass.__dict__:
-            raise ValueError("@python_2_unicode_compatible cannot be applied "
-                             "to %s because it doesn't define __str__()." %
-                             klass.__name__)
-        klass.__unicode__ = klass.__str__
-        klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
-    return klass
-
-
-# Complete the moves implementation.
-# This code is at the end of this module to speed up module loading.
-# Turn this module into a package.
-__path__ = []  # required for PEP 302 and PEP 451
-__package__ = __name__  # see PEP 366 @ReservedAssignment
-if globals().get("__spec__") is not None:
-    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
-# Remove other six meta path importers, since they cause problems. This can
-# happen if six is removed from sys.modules and then reloaded. (Setuptools does
-# this for some reason.)
-if sys.meta_path:
-    for i, importer in enumerate(sys.meta_path):
-        # Here's some real nastiness: Another "instance" of the six module might
-        # be floating around. Therefore, we can't use isinstance() to check for
-        # the six meta path importer, since the other six instance will have
-        # inserted an importer with different class.
-        if (type(importer).__name__ == "_SixMetaPathImporter" and
-                importer.name == __name__):
-            del sys.meta_path[i]
-            break
-    del i, importer
-# Finally, add the importer to the meta path import hook.
-sys.meta_path.append(_importer)