prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Enable python 3.7 in CI 
  At least for Linux
  
  
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `conans/pylint_plugin.py`
  Content:
  ```
  1 """Pylint plugin for ConanFile"""
  2 
  3 import astroid
  4 from astroid import MANAGER, scoped_nodes
  5 
  6 
  7 def register(linter):
  8     """Declare package as plugin
  9     
  10     This function needs to be declared so astroid treats
  11     current file as a plugin.
  12     """
  13     pass
  14 
  15 
  16 def transform_conanfile(node):
  17     """Transform definition of ConanFile class so dynamic fields are visible to pylint"""
  18 
  19     str_class = scoped_nodes.builtin_lookup("str")
  20     info_class = MANAGER.ast_from_module_name("conans.model.info").lookup(
  21         "ConanInfo")
  22     build_requires_class = MANAGER.ast_from_module_name(
  23         "conans.client.graph.graph_manager").lookup("_RecipeBuildRequires")
  24     file_copier_class = MANAGER.ast_from_module_name(
  25         "conans.client.file_copier").lookup("FileCopier")
  26     file_importer_class = MANAGER.ast_from_module_name(
  27         "conans.client.importer").lookup("_FileImporter")
  28 
  29     dynamic_fields = {
  30         "source_folder": str_class,
  31         "build_folder": str_class,
  32         "package_folder": str_class,
  33         "build_requires": build_requires_class,
  34         "info_build": info_class,
  35         "info": info_class,
  36         "copy": file_copier_class,
  37         "copy_deps": file_importer_class,
  38     }
  39 
  40     for f, t in dynamic_fields.items():
  41         node.locals[f] = [t]
  42 
  43 
  44 MANAGER.register_transform(
  45     scoped_nodes.Class, transform_conanfile,
  46     lambda node: node.qname() == "conans.model.conan_file.ConanFile")
  47
  ```
  
  Path: `.ci/jenkins/conf.py`
  Content:
  ```
  1 import argparse
  2 import os
  3 import platform
  4 from contextlib import contextmanager
  5 
  6 winpylocation = {"py27": "C:\\Python27\\python.exe",
  7                  "py34": "C:\\Python34\\python.exe",
  8                  "py36": "C:\\Python36\\python.exe"}
  9 
  10 macpylocation = {"py27": "/usr/bin/python",  # /Users/jenkins_ci/.pyenv/versions/2.7.11/bin/python",
  11                  "py34": "/Users/jenkins_ci/.pyenv/versions/3.4.7/bin/python",
  12                  "py36": "/Users/jenkins_ci/.pyenv/versions/3.6.5/bin/python"}
  13 
  14 linuxpylocation = {"py27": "/usr/bin/python2.7",
  15                    "py34": "/usr/bin/python3.4",
  16                    "py36": "/usr/bin/python3.6"}
  17 
  18 
  19 def get_environ(tmp_path):
  20     if platform.system() == "Windows":
  21         return {"CONAN_BASH_PATH": "c:/tools/msys64/usr/bin/bash",
  22                 "CONAN_USER_HOME_SHORT": os.path.join(tmp_path, ".conan")}
  23     return {}
  24 
  25 
  26 class Extender(argparse.Action):
  27     """Allows to use the same flag several times in a command and creates a list with the values.
  28        For example:
  29            conan install MyPackage/1.2@user/channel -o qt:value -o mode:2 -s cucumber:true
  30            It creates:
  31            options = ['qt:value', 'mode:2']
  32            settings = ['cucumber:true']
  33     """
  34     def __call__(self, parser, namespace, values, option_strings=None):  # @UnusedVariable
  35         # Need None here incase `argparse.SUPPRESS` was supplied for `dest`
  36         dest = getattr(namespace, self.dest, None)
  37         if not hasattr(dest, 'extend') or dest == self.default:
  38             dest = []
  39             setattr(namespace, self.dest, dest)
  40             # if default isn't set to None, this method might be called
  41             # with the default as `values` for other arguments which
  42             # share this destination.
  43             parser.set_defaults(**{self.dest: None})
  44 
  45         try:
  46             dest.extend(values)
  47         except ValueError:
  48             dest.append(values)
  49 
  50 
  51 @contextmanager
  52 def environment_append(env_vars):
  53     old_env = dict(os.environ)
  54     for name, value in env_vars.items():
  55         if isinstance(value, list):
  56             env_vars[name] = os.pathsep.join(value)
  57             if name in old_env:
  58                 env_vars[name] += os.pathsep + old_env[name]
  59     os.environ.update(env_vars)
  60     try:
  61         yield
  62     finally:
  63         os.environ.clear()
  64         os.environ.update(old_env)
  65 
  66 
  67 @contextmanager
  68 def chdir(newdir):
  69     old_path = os.getcwd()
  70     os.chdir(newdir)
  71     try:
  72         yield
  73     finally:
  74         os.chdir(old_path)
  75
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/.ci/jenkins/conf.py b/.ci/jenkins/conf.py
  --- a/.ci/jenkins/conf.py
  +++ b/.ci/jenkins/conf.py
  @@ -13,7 +13,8 @@
   
   linuxpylocation = {"py27": "/usr/bin/python2.7",
                      "py34": "/usr/bin/python3.4",
  -                   "py36": "/usr/bin/python3.6"}
  +                   "py36": "/usr/bin/python3.6",
  +                   "py37": "/usr/bin/python3.7"}
   
   
   def get_environ(tmp_path):
  diff --git a/conans/pylint_plugin.py b/conans/pylint_plugin.py
  --- a/conans/pylint_plugin.py
  +++ b/conans/pylint_plugin.py
  @@ -1,7 +1,6 @@
   """Pylint plugin for ConanFile"""
  -
   import astroid
  -from astroid import MANAGER, scoped_nodes
  +from astroid import MANAGER
   
   
   def register(linter):
  @@ -16,7 +15,7 @@
   def transform_conanfile(node):
       """Transform definition of ConanFile class so dynamic fields are visible to pylint"""
   
  -    str_class = scoped_nodes.builtin_lookup("str")
  +    str_class = astroid.builtin_lookup("str")
       info_class = MANAGER.ast_from_module_name("conans.model.info").lookup(
           "ConanInfo")
       build_requires_class = MANAGER.ast_from_module_name(
  @@ -42,5 +41,5 @@
   
   
   MANAGER.register_transform(
  -    scoped_nodes.Class, transform_conanfile,
  +    astroid.ClassDef, transform_conanfile,
       lambda node: node.qname() == "conans.model.conan_file.ConanFile")
  
verification_info: {"golden_diff": "diff --git a/.ci/jenkins/conf.py b/.ci/jenkins/conf.py\n--- a/.ci/jenkins/conf.py\n+++ b/.ci/jenkins/conf.py\n@@ -13,7 +13,8 @@\n \n linuxpylocation = {\"py27\": \"/usr/bin/python2.7\",\n                    \"py34\": \"/usr/bin/python3.4\",\n-                   \"py36\": \"/usr/bin/python3.6\"}\n+                   \"py36\": \"/usr/bin/python3.6\",\n+                   \"py37\": \"/usr/bin/python3.7\"}\n \n \n def get_environ(tmp_path):\ndiff --git a/conans/pylint_plugin.py b/conans/pylint_plugin.py\n--- a/conans/pylint_plugin.py\n+++ b/conans/pylint_plugin.py\n@@ -1,7 +1,6 @@\n \"\"\"Pylint plugin for ConanFile\"\"\"\n-\n import astroid\n-from astroid import MANAGER, scoped_nodes\n+from astroid import MANAGER\n \n \n def register(linter):\n@@ -16,7 +15,7 @@\n def transform_conanfile(node):\n     \"\"\"Transform definition of ConanFile class so dynamic fields are visible to pylint\"\"\"\n \n-    str_class = scoped_nodes.builtin_lookup(\"str\")\n+    str_class = astroid.builtin_lookup(\"str\")\n     info_class = MANAGER.ast_from_module_name(\"conans.model.info\").lookup(\n         \"ConanInfo\")\n     build_requires_class = MANAGER.ast_from_module_name(\n@@ -42,5 +41,5 @@\n \n \n MANAGER.register_transform(\n-    scoped_nodes.Class, transform_conanfile,\n+    astroid.ClassDef, transform_conanfile,\n     lambda node: node.qname() == \"conans.model.conan_file.ConanFile\")\n", "issue": "Enable python 3.7 in CI \nAt least for Linux\r\n\r\n\n", "before_files": [{"content": "\"\"\"Pylint plugin for ConanFile\"\"\"\n\nimport astroid\nfrom astroid import MANAGER, scoped_nodes\n\n\ndef register(linter):\n    \"\"\"Declare package as plugin\n    \n    This function needs to be declared so astroid treats\n    current file as a plugin.\n    \"\"\"\n    pass\n\n\ndef transform_conanfile(node):\n    \"\"\"Transform definition of ConanFile class so dynamic fields are visible to pylint\"\"\"\n\n    str_class = scoped_nodes.builtin_lookup(\"str\")\n    info_class = MANAGER.ast_from_module_name(\"conans.model.info\").lookup(\n        \"ConanInfo\")\n    build_requires_class = MANAGER.ast_from_module_name(\n        \"conans.client.graph.graph_manager\").lookup(\"_RecipeBuildRequires\")\n    file_copier_class = MANAGER.ast_from_module_name(\n        \"conans.client.file_copier\").lookup(\"FileCopier\")\n    file_importer_class = MANAGER.ast_from_module_name(\n        \"conans.client.importer\").lookup(\"_FileImporter\")\n\n    dynamic_fields = {\n        \"source_folder\": str_class,\n        \"build_folder\": str_class,\n        \"package_folder\": str_class,\n        \"build_requires\": build_requires_class,\n        \"info_build\": info_class,\n        \"info\": info_class,\n        \"copy\": file_copier_class,\n        \"copy_deps\": file_importer_class,\n    }\n\n    for f, t in dynamic_fields.items():\n        node.locals[f] = [t]\n\n\nMANAGER.register_transform(\n    scoped_nodes.Class, transform_conanfile,\n    lambda node: node.qname() == \"conans.model.conan_file.ConanFile\")\n", "path": "conans/pylint_plugin.py"}, {"content": "import argparse\nimport os\nimport platform\nfrom contextlib import contextmanager\n\nwinpylocation = {\"py27\": \"C:\\\\Python27\\\\python.exe\",\n                 \"py34\": \"C:\\\\Python34\\\\python.exe\",\n                 \"py36\": \"C:\\\\Python36\\\\python.exe\"}\n\nmacpylocation = {\"py27\": \"/usr/bin/python\",  # /Users/jenkins_ci/.pyenv/versions/2.7.11/bin/python\",\n                 \"py34\": \"/Users/jenkins_ci/.pyenv/versions/3.4.7/bin/python\",\n                 \"py36\": \"/Users/jenkins_ci/.pyenv/versions/3.6.5/bin/python\"}\n\nlinuxpylocation = {\"py27\": \"/usr/bin/python2.7\",\n                   \"py34\": \"/usr/bin/python3.4\",\n                   \"py36\": \"/usr/bin/python3.6\"}\n\n\ndef get_environ(tmp_path):\n    if platform.system() == \"Windows\":\n        return {\"CONAN_BASH_PATH\": \"c:/tools/msys64/usr/bin/bash\",\n                \"CONAN_USER_HOME_SHORT\": os.path.join(tmp_path, \".conan\")}\n    return {}\n\n\nclass Extender(argparse.Action):\n    \"\"\"Allows to use the same flag several times in a command and creates a list with the values.\n       For example:\n           conan install MyPackage/1.2@user/channel -o qt:value -o mode:2 -s cucumber:true\n           It creates:\n           options = ['qt:value', 'mode:2']\n           settings = ['cucumber:true']\n    \"\"\"\n    def __call__(self, parser, namespace, values, option_strings=None):  # @UnusedVariable\n        # Need None here incase `argparse.SUPPRESS` was supplied for `dest`\n        dest = getattr(namespace, self.dest, None)\n        if not hasattr(dest, 'extend') or dest == self.default:\n            dest = []\n            setattr(namespace, self.dest, dest)\n            # if default isn't set to None, this method might be called\n            # with the default as `values` for other arguments which\n            # share this destination.\n            parser.set_defaults(**{self.dest: None})\n\n        try:\n            dest.extend(values)\n        except ValueError:\n            dest.append(values)\n\n\n@contextmanager\ndef environment_append(env_vars):\n    old_env = dict(os.environ)\n    for name, value in env_vars.items():\n        if isinstance(value, list):\n            env_vars[name] = os.pathsep.join(value)\n            if name in old_env:\n                env_vars[name] += os.pathsep + old_env[name]\n    os.environ.update(env_vars)\n    try:\n        yield\n    finally:\n        os.environ.clear()\n        os.environ.update(old_env)\n\n\n@contextmanager\ndef chdir(newdir):\n    old_path = os.getcwd()\n    os.chdir(newdir)\n    try:\n        yield\n    finally:\n        os.chdir(old_path)\n", "path": ".ci/jenkins/conf.py"}], "after_files": [{"content": "\"\"\"Pylint plugin for ConanFile\"\"\"\nimport astroid\nfrom astroid import MANAGER\n\n\ndef register(linter):\n    \"\"\"Declare package as plugin\n    \n    This function needs to be declared so astroid treats\n    current file as a plugin.\n    \"\"\"\n    pass\n\n\ndef transform_conanfile(node):\n    \"\"\"Transform definition of ConanFile class so dynamic fields are visible to pylint\"\"\"\n\n    str_class = astroid.builtin_lookup(\"str\")\n    info_class = MANAGER.ast_from_module_name(\"conans.model.info\").lookup(\n        \"ConanInfo\")\n    build_requires_class = MANAGER.ast_from_module_name(\n        \"conans.client.graph.graph_manager\").lookup(\"_RecipeBuildRequires\")\n    file_copier_class = MANAGER.ast_from_module_name(\n        \"conans.client.file_copier\").lookup(\"FileCopier\")\n    file_importer_class = MANAGER.ast_from_module_name(\n        \"conans.client.importer\").lookup(\"_FileImporter\")\n\n    dynamic_fields = {\n        \"source_folder\": str_class,\n        \"build_folder\": str_class,\n        \"package_folder\": str_class,\n        \"build_requires\": build_requires_class,\n        \"info_build\": info_class,\n        \"info\": info_class,\n        \"copy\": file_copier_class,\n        \"copy_deps\": file_importer_class,\n    }\n\n    for f, t in dynamic_fields.items():\n        node.locals[f] = [t]\n\n\nMANAGER.register_transform(\n    astroid.ClassDef, transform_conanfile,\n    lambda node: node.qname() == \"conans.model.conan_file.ConanFile\")\n", "path": "conans/pylint_plugin.py"}, {"content": "import argparse\nimport os\nimport platform\nfrom contextlib import contextmanager\n\nwinpylocation = {\"py27\": \"C:\\\\Python27\\\\python.exe\",\n                 \"py34\": \"C:\\\\Python34\\\\python.exe\",\n                 \"py36\": \"C:\\\\Python36\\\\python.exe\"}\n\nmacpylocation = {\"py27\": \"/usr/bin/python\",  # /Users/jenkins_ci/.pyenv/versions/2.7.11/bin/python\",\n                 \"py34\": \"/Users/jenkins_ci/.pyenv/versions/3.4.7/bin/python\",\n                 \"py36\": \"/Users/jenkins_ci/.pyenv/versions/3.6.5/bin/python\"}\n\nlinuxpylocation = {\"py27\": \"/usr/bin/python2.7\",\n                   \"py34\": \"/usr/bin/python3.4\",\n                   \"py36\": \"/usr/bin/python3.6\",\n                   \"py37\": \"/usr/bin/python3.7\"}\n\n\ndef get_environ(tmp_path):\n    if platform.system() == \"Windows\":\n        return {\"CONAN_BASH_PATH\": \"c:/tools/msys64/usr/bin/bash\",\n                \"CONAN_USER_HOME_SHORT\": os.path.join(tmp_path, \".conan\")}\n    return {}\n\n\nclass Extender(argparse.Action):\n    \"\"\"Allows to use the same flag several times in a command and creates a list with the values.\n       For example:\n           conan install MyPackage/1.2@user/channel -o qt:value -o mode:2 -s cucumber:true\n           It creates:\n           options = ['qt:value', 'mode:2']\n           settings = ['cucumber:true']\n    \"\"\"\n    def __call__(self, parser, namespace, values, option_strings=None):  # @UnusedVariable\n        # Need None here incase `argparse.SUPPRESS` was supplied for `dest`\n        dest = getattr(namespace, self.dest, None)\n        if not hasattr(dest, 'extend') or dest == self.default:\n            dest = []\n            setattr(namespace, self.dest, dest)\n            # if default isn't set to None, this method might be called\n            # with the default as `values` for other arguments which\n            # share this destination.\n            parser.set_defaults(**{self.dest: None})\n\n        try:\n            dest.extend(values)\n        except ValueError:\n            dest.append(values)\n\n\n@contextmanager\ndef environment_append(env_vars):\n    old_env = dict(os.environ)\n    for name, value in env_vars.items():\n        if isinstance(value, list):\n            env_vars[name] = os.pathsep.join(value)\n            if name in old_env:\n                env_vars[name] += os.pathsep + old_env[name]\n    os.environ.update(env_vars)\n    try:\n        yield\n    finally:\n        os.environ.clear()\n        os.environ.update(old_env)\n\n\n@contextmanager\ndef chdir(newdir):\n    old_path = os.getcwd()\n    os.chdir(newdir)\n    try:\n        yield\n    finally:\n        os.chdir(old_path)\n", "path": ".ci/jenkins/conf.py"}]}