Skip to content

Commit 44ec564

Browse files
authored
Add files via upload
1 parent f234294 commit 44ec564

27 files changed

+21712
-0
lines changed

__future__.py

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
"""Record of phased-in incompatible language changes.
2+
3+
Each line is of the form:
4+
5+
FeatureName = "_Feature(" OptionalRelease "," MandatoryRelease ","
6+
CompilerFlag ")"
7+
8+
where, normally, OptionalRelease < MandatoryRelease, and both are 5-tuples
9+
of the same form as sys.version_info:
10+
11+
(PY_MAJOR_VERSION, # the 2 in 2.1.0a3; an int
12+
PY_MINOR_VERSION, # the 1; an int
13+
PY_MICRO_VERSION, # the 0; an int
14+
PY_RELEASE_LEVEL, # "alpha", "beta", "candidate" or "final"; string
15+
PY_RELEASE_SERIAL # the 3; an int
16+
)
17+
18+
OptionalRelease records the first release in which
19+
20+
from __future__ import FeatureName
21+
22+
was accepted.
23+
24+
In the case of MandatoryReleases that have not yet occurred,
25+
MandatoryRelease predicts the release in which the feature will become part
26+
of the language.
27+
28+
Else MandatoryRelease records when the feature became part of the language;
29+
in releases at or after that, modules no longer need
30+
31+
from __future__ import FeatureName
32+
33+
to use the feature in question, but may continue to use such imports.
34+
35+
MandatoryRelease may also be None, meaning that a planned feature got
36+
dropped or that the release version is undetermined.
37+
38+
Instances of class _Feature have two corresponding methods,
39+
.getOptionalRelease() and .getMandatoryRelease().
40+
41+
CompilerFlag is the (bitfield) flag that should be passed in the fourth
42+
argument to the builtin function compile() to enable the feature in
43+
dynamically compiled code. This flag is stored in the .compiler_flag
44+
attribute on _Future instances. These values must match the appropriate
45+
#defines of CO_xxx flags in Include/cpython/compile.h.
46+
47+
No feature line is ever to be deleted from this file.
48+
"""
49+
50+
all_feature_names = [
51+
"nested_scopes",
52+
"generators",
53+
"division",
54+
"absolute_import",
55+
"with_statement",
56+
"print_function",
57+
"unicode_literals",
58+
"barry_as_FLUFL",
59+
"generator_stop",
60+
"annotations",
61+
]
62+
63+
__all__ = ["all_feature_names"] + all_feature_names
64+
65+
# The CO_xxx symbols are defined here under the same names defined in
66+
# code.h and used by compile.h, so that an editor search will find them here.
67+
# However, they're not exported in __all__, because they don't really belong to
68+
# this module.
69+
CO_NESTED = 0x0010 # nested_scopes
70+
CO_GENERATOR_ALLOWED = 0 # generators (obsolete, was 0x1000)
71+
CO_FUTURE_DIVISION = 0x20000 # division
72+
CO_FUTURE_ABSOLUTE_IMPORT = 0x40000 # perform absolute imports by default
73+
CO_FUTURE_WITH_STATEMENT = 0x80000 # with statement
74+
CO_FUTURE_PRINT_FUNCTION = 0x100000 # print function
75+
CO_FUTURE_UNICODE_LITERALS = 0x200000 # unicode string literals
76+
CO_FUTURE_BARRY_AS_BDFL = 0x400000
77+
CO_FUTURE_GENERATOR_STOP = 0x800000 # StopIteration becomes RuntimeError in generators
78+
CO_FUTURE_ANNOTATIONS = 0x1000000 # annotations become strings at runtime
79+
80+
81+
class _Feature:
82+
83+
def __init__(self, optionalRelease, mandatoryRelease, compiler_flag):
84+
self.optional = optionalRelease
85+
self.mandatory = mandatoryRelease
86+
self.compiler_flag = compiler_flag
87+
88+
def getOptionalRelease(self):
89+
"""Return first release in which this feature was recognized.
90+
91+
This is a 5-tuple, of the same form as sys.version_info.
92+
"""
93+
return self.optional
94+
95+
def getMandatoryRelease(self):
96+
"""Return release in which this feature will become mandatory.
97+
98+
This is a 5-tuple, of the same form as sys.version_info, or, if
99+
the feature was dropped, or the release date is undetermined, is None.
100+
"""
101+
return self.mandatory
102+
103+
def __repr__(self):
104+
return "_Feature" + repr((self.optional,
105+
self.mandatory,
106+
self.compiler_flag))
107+
108+
109+
nested_scopes = _Feature((2, 1, 0, "beta", 1),
110+
(2, 2, 0, "alpha", 0),
111+
CO_NESTED)
112+
113+
generators = _Feature((2, 2, 0, "alpha", 1),
114+
(2, 3, 0, "final", 0),
115+
CO_GENERATOR_ALLOWED)
116+
117+
division = _Feature((2, 2, 0, "alpha", 2),
118+
(3, 0, 0, "alpha", 0),
119+
CO_FUTURE_DIVISION)
120+
121+
absolute_import = _Feature((2, 5, 0, "alpha", 1),
122+
(3, 0, 0, "alpha", 0),
123+
CO_FUTURE_ABSOLUTE_IMPORT)
124+
125+
with_statement = _Feature((2, 5, 0, "alpha", 1),
126+
(2, 6, 0, "alpha", 0),
127+
CO_FUTURE_WITH_STATEMENT)
128+
129+
print_function = _Feature((2, 6, 0, "alpha", 2),
130+
(3, 0, 0, "alpha", 0),
131+
CO_FUTURE_PRINT_FUNCTION)
132+
133+
unicode_literals = _Feature((2, 6, 0, "alpha", 2),
134+
(3, 0, 0, "alpha", 0),
135+
CO_FUTURE_UNICODE_LITERALS)
136+
137+
barry_as_FLUFL = _Feature((3, 1, 0, "alpha", 2),
138+
(4, 0, 0, "alpha", 0),
139+
CO_FUTURE_BARRY_AS_BDFL)
140+
141+
generator_stop = _Feature((3, 5, 0, "beta", 1),
142+
(3, 7, 0, "alpha", 0),
143+
CO_FUTURE_GENERATOR_STOP)
144+
145+
annotations = _Feature((3, 7, 0, "beta", 1),
146+
None,
147+
CO_FUTURE_ANNOTATIONS)

__hello__.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
initialized = True
2+
3+
class TestFrozenUtf8_1:
4+
"""\u00b6"""
5+
6+
class TestFrozenUtf8_2:
7+
"""\u03c0"""
8+
9+
class TestFrozenUtf8_4:
10+
"""\U0001f600"""
11+
12+
def main():
13+
print("Hello world!")
14+
15+
if __name__ == '__main__':
16+
main()

_aix_support.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
"""Shared AIX support functions."""
2+
3+
import sys
4+
import sysconfig
5+
6+
try:
7+
import subprocess
8+
except ImportError: # pragma: no cover
9+
# _aix_support is used in distutils by setup.py to build C extensions,
10+
# before subprocess dependencies like _posixsubprocess are available.
11+
import _bootsubprocess as subprocess
12+
13+
14+
def _aix_tag(vrtl, bd):
15+
# type: (List[int], int) -> str
16+
# Infer the ABI bitwidth from maxsize (assuming 64 bit as the default)
17+
_sz = 32 if sys.maxsize == (2**31-1) else 64
18+
_bd = bd if bd != 0 else 9988
19+
# vrtl[version, release, technology_level]
20+
return "aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(vrtl[0], vrtl[1], vrtl[2], _bd, _sz)
21+
22+
23+
# extract version, release and technology level from a VRMF string
24+
def _aix_vrtl(vrmf):
25+
# type: (str) -> List[int]
26+
v, r, tl = vrmf.split(".")[:3]
27+
return [int(v[-1]), int(r), int(tl)]
28+
29+
30+
def _aix_bos_rte():
31+
# type: () -> Tuple[str, int]
32+
"""
33+
Return a Tuple[str, int] e.g., ['7.1.4.34', 1806]
34+
The fileset bos.rte represents the current AIX run-time level. It's VRMF and
35+
builddate reflect the current ABI levels of the runtime environment.
36+
If no builddate is found give a value that will satisfy pep425 related queries
37+
"""
38+
# All AIX systems to have lslpp installed in this location
39+
out = subprocess.check_output(["/usr/bin/lslpp", "-Lqc", "bos.rte"])
40+
out = out.decode("utf-8")
41+
out = out.strip().split(":") # type: ignore
42+
_bd = int(out[-1]) if out[-1] != '' else 9988
43+
return (str(out[2]), _bd)
44+
45+
46+
def aix_platform():
47+
# type: () -> str
48+
"""
49+
AIX filesets are identified by four decimal values: V.R.M.F.
50+
V (version) and R (release) can be retrieved using ``uname``
51+
Since 2007, starting with AIX 5.3 TL7, the M value has been
52+
included with the fileset bos.rte and represents the Technology
53+
Level (TL) of AIX. The F (Fix) value also increases, but is not
54+
relevant for comparing releases and binary compatibility.
55+
For binary compatibility the so-called builddate is needed.
56+
Again, the builddate of an AIX release is associated with bos.rte.
57+
AIX ABI compatibility is described as guaranteed at: https://www.ibm.com/\
58+
support/knowledgecenter/en/ssw_aix_72/install/binary_compatability.html
59+
60+
For pep425 purposes the AIX platform tag becomes:
61+
"aix-{:1x}{:1d}{:02d}-{:04d}-{}".format(v, r, tl, builddate, bitsize)
62+
e.g., "aix-6107-1415-32" for AIX 6.1 TL7 bd 1415, 32-bit
63+
and, "aix-6107-1415-64" for AIX 6.1 TL7 bd 1415, 64-bit
64+
"""
65+
vrmf, bd = _aix_bos_rte()
66+
return _aix_tag(_aix_vrtl(vrmf), bd)
67+
68+
69+
# extract vrtl from the BUILD_GNU_TYPE as an int
70+
def _aix_bgt():
71+
# type: () -> List[int]
72+
gnu_type = sysconfig.get_config_var("BUILD_GNU_TYPE")
73+
if not gnu_type:
74+
raise ValueError("BUILD_GNU_TYPE is not defined")
75+
return _aix_vrtl(vrmf=gnu_type)
76+
77+
78+
def aix_buildtag():
79+
# type: () -> str
80+
"""
81+
Return the platform_tag of the system Python was built on.
82+
"""
83+
# AIX_BUILDDATE is defined by configure with:
84+
# lslpp -Lcq bos.rte | awk -F: '{ print $NF }'
85+
build_date = sysconfig.get_config_var("AIX_BUILDDATE")
86+
try:
87+
build_date = int(build_date)
88+
except (ValueError, TypeError):
89+
raise ValueError(f"AIX_BUILDDATE is not defined or invalid: "
90+
f"{build_date!r}")
91+
return _aix_tag(_aix_bgt(), build_date)

_bootsubprocess.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
"""
2+
Basic subprocess implementation for POSIX which only uses os functions. Only
3+
implement features required by setup.py to build C extension modules when
4+
subprocess is unavailable. setup.py is not used on Windows.
5+
"""
6+
import os
7+
8+
9+
# distutils.spawn used by distutils.command.build_ext
10+
# calls subprocess.Popen().wait()
11+
class Popen:
12+
def __init__(self, cmd, env=None):
13+
self._cmd = cmd
14+
self._env = env
15+
self.returncode = None
16+
17+
def wait(self):
18+
pid = os.fork()
19+
if pid == 0:
20+
# Child process
21+
try:
22+
if self._env is not None:
23+
os.execve(self._cmd[0], self._cmd, self._env)
24+
else:
25+
os.execv(self._cmd[0], self._cmd)
26+
finally:
27+
os._exit(1)
28+
else:
29+
# Parent process
30+
_, status = os.waitpid(pid, 0)
31+
self.returncode = os.waitstatus_to_exitcode(status)
32+
33+
return self.returncode
34+
35+
36+
def _check_cmd(cmd):
37+
# Use regex [a-zA-Z0-9./-]+: reject empty string, space, etc.
38+
safe_chars = []
39+
for first, last in (("a", "z"), ("A", "Z"), ("0", "9")):
40+
for ch in range(ord(first), ord(last) + 1):
41+
safe_chars.append(chr(ch))
42+
safe_chars.append("./-")
43+
safe_chars = ''.join(safe_chars)
44+
45+
if isinstance(cmd, (tuple, list)):
46+
check_strs = cmd
47+
elif isinstance(cmd, str):
48+
check_strs = [cmd]
49+
else:
50+
return False
51+
52+
for arg in check_strs:
53+
if not isinstance(arg, str):
54+
return False
55+
if not arg:
56+
# reject empty string
57+
return False
58+
for ch in arg:
59+
if ch not in safe_chars:
60+
return False
61+
62+
return True
63+
64+
65+
# _aix_support used by distutil.util calls subprocess.check_output()
66+
def check_output(cmd, **kwargs):
67+
if kwargs:
68+
raise NotImplementedError(repr(kwargs))
69+
70+
if not _check_cmd(cmd):
71+
raise ValueError(f"unsupported command: {cmd!r}")
72+
73+
tmp_filename = "check_output.tmp"
74+
if not isinstance(cmd, str):
75+
cmd = " ".join(cmd)
76+
cmd = f"{cmd} >{tmp_filename}"
77+
78+
try:
79+
# system() spawns a shell
80+
status = os.system(cmd)
81+
exitcode = os.waitstatus_to_exitcode(status)
82+
if exitcode:
83+
raise ValueError(f"Command {cmd!r} returned non-zero "
84+
f"exit status {exitcode!r}")
85+
86+
try:
87+
with open(tmp_filename, "rb") as fp:
88+
stdout = fp.read()
89+
except FileNotFoundError:
90+
stdout = b''
91+
finally:
92+
try:
93+
os.unlink(tmp_filename)
94+
except OSError:
95+
pass
96+
97+
return stdout

0 commit comments

Comments
 (0)