summaryrefslogtreecommitdiff
path: root/astroid/brain/brain_subprocess.py
blob: 6c46c82f5bf57a7d76cb9d4481b2107256b47abf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# Copyright (c) 2016-2017 Claudiu Popa <pcmanticore@gmail.com>
# Copyright (c) 2017 Hugo <hugovk@users.noreply.github.com>
# Copyright (c) 2018 Bryce Guinta <bryce.paul.guinta@gmail.com>

# Licensed under the LGPL: https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html
# For details: https://github.com/PyCQA/astroid/blob/master/COPYING.LESSER

import sys
import textwrap

import six

import astroid


PY37 = sys.version_info >= (3, 7)
PY36 = sys.version_info >= (3, 6)
PY34 = sys.version_info >= (3, 4)
PY33 = sys.version_info >= (3, 3)


def _subprocess_transform():
    if six.PY3:
        communicate = (bytes("string", "ascii"), bytes("string", "ascii"))
        communicate_signature = "def communicate(self, input=None, timeout=None)"
        if PY37:
            init = """
            def __init__(self, args, bufsize=0, executable=None,
                         stdin=None, stdout=None, stderr=None,
                         preexec_fn=None, close_fds=False, shell=False,
                         cwd=None, env=None, universal_newlines=False,
                         startupinfo=None, creationflags=0, restore_signals=True,
                         start_new_session=False, pass_fds=(), *,
                         encoding=None, errors=None, text=None):
                pass
            """
        elif PY36:
            init = """
            def __init__(self, args, bufsize=0, executable=None,
                         stdin=None, stdout=None, stderr=None,
                         preexec_fn=None, close_fds=False, shell=False,
                         cwd=None, env=None, universal_newlines=False,
                         startupinfo=None, creationflags=0, restore_signals=True,
                         start_new_session=False, pass_fds=(), *,
                         encoding=None, errors=None):
                pass
            """
        else:
            init = """
            def __init__(self, args, bufsize=0, executable=None,
                         stdin=None, stdout=None, stderr=None,
                         preexec_fn=None, close_fds=False, shell=False,
                         cwd=None, env=None, universal_newlines=False,
                         startupinfo=None, creationflags=0, restore_signals=True,
                         start_new_session=False, pass_fds=()):
                pass
            """
    else:
        communicate = ("string", "string")
        communicate_signature = "def communicate(self, input=None)"
        init = """
        def __init__(self, args, bufsize=0, executable=None,
                     stdin=None, stdout=None, stderr=None,
                     preexec_fn=None, close_fds=False, shell=False,
                     cwd=None, env=None, universal_newlines=False,
                     startupinfo=None, creationflags=0):
            pass
        """
    if PY34:
        wait_signature = "def wait(self, timeout=None)"
    else:
        wait_signature = "def wait(self)"
    if six.PY3:
        ctx_manager = """
        def __enter__(self): return self
        def __exit__(self, *args): pass
        """
    else:
        ctx_manager = ""
    py3_args = ""
    if PY33:
        py3_args = "args = []"
    code = textwrap.dedent(
        """
    class Popen(object):
        returncode = pid = 0
        stdin = stdout = stderr = file()
        %(py3_args)s

        %(communicate_signature)s:
            return %(communicate)r
        %(wait_signature)s:
            return self.returncode
        def poll(self):
            return self.returncode
        def send_signal(self, signal):
            pass
        def terminate(self):
            pass
        def kill(self):
            pass
        %(ctx_manager)s
       """
        % {
            "communicate": communicate,
            "communicate_signature": communicate_signature,
            "wait_signature": wait_signature,
            "ctx_manager": ctx_manager,
            "py3_args": py3_args,
        }
    )

    init_lines = textwrap.dedent(init).splitlines()
    indented_init = "\n".join(" " * 4 + line for line in init_lines)
    code += indented_init
    return astroid.parse(code)


astroid.register_module_extender(astroid.MANAGER, "subprocess", _subprocess_transform)