forked from Rust-related/RustPython
Mark version 3.13.0 (#5495)
* bump to 3.13.1 * fix some tests * strip left whitespace from doc * remove specific difflib test that was causing issues * fix test_enum Signed-off-by: Ashwin Naren <arihant2math@gmail.com>
This commit is contained in:
2
.github/workflows/ci.yaml
vendored
2
.github/workflows/ci.yaml
vendored
@@ -105,7 +105,7 @@ env:
|
||||
test_weakref
|
||||
test_yield_from
|
||||
# Python version targeted by the CI.
|
||||
PYTHON_VERSION: "3.12.3"
|
||||
PYTHON_VERSION: "3.13.1"
|
||||
|
||||
jobs:
|
||||
rust_tests:
|
||||
|
||||
2
.github/workflows/cron-ci.yaml
vendored
2
.github/workflows/cron-ci.yaml
vendored
@@ -7,7 +7,7 @@ name: Periodic checks/tasks
|
||||
|
||||
env:
|
||||
CARGO_ARGS: --no-default-features --features stdlib,zlib,importlib,encodings,ssl,jit
|
||||
PYTHON_VERSION: "3.12.0"
|
||||
PYTHON_VERSION: "3.13.1"
|
||||
|
||||
jobs:
|
||||
# codecov collects code coverage data from the rust tests, python snippets and python test suite.
|
||||
|
||||
474
Cargo.lock
generated
474
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@ RustPython requires the following:
|
||||
stable version: `rustup update stable`
|
||||
- If you do not have Rust installed, use [rustup](https://rustup.rs/) to
|
||||
do so.
|
||||
- CPython version 3.12 or higher
|
||||
- CPython version 3.13 or higher
|
||||
- CPython can be installed by your operating system's package manager,
|
||||
from the [Python website](https://www.python.org/downloads/), or
|
||||
using a third-party distribution, such as
|
||||
|
||||
19
Lib/difflib.py
vendored
19
Lib/difflib.py
vendored
@@ -1200,25 +1200,6 @@ def context_diff(a, b, fromfile='', tofile='',
|
||||
strings for 'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.
|
||||
The modification times are normally expressed in the ISO 8601 format.
|
||||
If not specified, the strings default to blanks.
|
||||
|
||||
Example:
|
||||
|
||||
>>> print(''.join(context_diff('one\ntwo\nthree\nfour\n'.splitlines(True),
|
||||
... 'zero\none\ntree\nfour\n'.splitlines(True), 'Original', 'Current')),
|
||||
... end="")
|
||||
*** Original
|
||||
--- Current
|
||||
***************
|
||||
*** 1,4 ****
|
||||
one
|
||||
! two
|
||||
! three
|
||||
four
|
||||
--- 1,4 ----
|
||||
+ zero
|
||||
one
|
||||
! tree
|
||||
four
|
||||
"""
|
||||
|
||||
_check_types(a, b, fromfile, tofile, fromfiledate, tofiledate, lineterm)
|
||||
|
||||
12
Lib/test/test_enum.py
vendored
12
Lib/test/test_enum.py
vendored
@@ -1369,6 +1369,8 @@ class TestSpecial(unittest.TestCase):
|
||||
[Outer.a, Outer.b, Outer.Inner],
|
||||
)
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'inner classes are still members',
|
||||
@@ -4555,9 +4557,11 @@ class TestInternals(unittest.TestCase):
|
||||
self.assertEqual(Color.green.value, 3)
|
||||
self.assertEqual(Color.yellow.value, 4)
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'mixed types with auto() will raise in 3.13',
|
||||
'inner classes are still members',
|
||||
)
|
||||
def test_auto_garbage_fail(self):
|
||||
with self.assertRaisesRegex(TypeError, 'will require all values to be sortable'):
|
||||
@@ -4565,9 +4569,11 @@ class TestInternals(unittest.TestCase):
|
||||
red = 'red'
|
||||
blue = auto()
|
||||
|
||||
# TODO: RUSTPYTHON
|
||||
@unittest.expectedFailure
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'mixed types with auto() will raise in 3.13',
|
||||
'inner classes are still members',
|
||||
)
|
||||
def test_auto_garbage_corrected_fail(self):
|
||||
with self.assertRaisesRegex(TypeError, 'will require all values to be sortable'):
|
||||
@@ -4599,7 +4605,7 @@ class TestInternals(unittest.TestCase):
|
||||
|
||||
@unittest.skipIf(
|
||||
python_version < (3, 13),
|
||||
'auto() will return highest value + 1 in 3.13',
|
||||
'inner classes are still members',
|
||||
)
|
||||
def test_auto_with_aliases(self):
|
||||
class Color(Enum):
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
# [RustPython](https://rustpython.github.io/)
|
||||
|
||||
A Python-3 (CPython >= 3.12.0) Interpreter written in Rust :snake: :scream:
|
||||
A Python-3 (CPython >= 3.13.0) Interpreter written in Rust :snake: :scream:
|
||||
:metal:.
|
||||
|
||||
[](https://github.com/RustPython/RustPython/actions?query=workflow%3ACI)
|
||||
|
||||
@@ -322,6 +322,37 @@ pub mod levenshtein {
|
||||
}
|
||||
}
|
||||
|
||||
/// Replace all tabs in a string with spaces, using the given tab size.
|
||||
pub fn expandtabs(input: &str, tab_size: usize) -> String {
|
||||
let tab_stop = tab_size;
|
||||
let mut expanded_str = String::with_capacity(input.len());
|
||||
let mut tab_size = tab_stop;
|
||||
let mut col_count = 0usize;
|
||||
for ch in input.chars() {
|
||||
match ch {
|
||||
'\t' => {
|
||||
let num_spaces = tab_size - col_count;
|
||||
col_count += num_spaces;
|
||||
let expand = " ".repeat(num_spaces);
|
||||
expanded_str.push_str(&expand);
|
||||
}
|
||||
'\r' | '\n' => {
|
||||
expanded_str.push(ch);
|
||||
col_count = 0;
|
||||
tab_size = 0;
|
||||
}
|
||||
_ => {
|
||||
expanded_str.push(ch);
|
||||
col_count += 1;
|
||||
}
|
||||
}
|
||||
if col_count >= tab_size {
|
||||
tab_size += tab_stop;
|
||||
}
|
||||
}
|
||||
expanded_str
|
||||
}
|
||||
|
||||
/// Creates an [`AsciiStr`][ascii::AsciiStr] from a string literal, throwing a compile error if the
|
||||
/// literal isn't actually ascii.
|
||||
///
|
||||
|
||||
@@ -11,6 +11,7 @@ license.workspace = true
|
||||
|
||||
[dependencies]
|
||||
rustpython-ast = { workspace = true, features=["unparse", "constant-optimization"] }
|
||||
rustpython-common = { workspace = true }
|
||||
rustpython-parser-core = { workspace = true }
|
||||
rustpython-compiler-core = { workspace = true }
|
||||
|
||||
|
||||
@@ -3368,17 +3368,51 @@ impl EmitArg<bytecode::Label> for ir::BlockIdx {
|
||||
}
|
||||
}
|
||||
|
||||
/// Strips leading whitespace from a docstring.
|
||||
///
|
||||
/// The code has been ported from `_PyCompile_CleanDoc` in cpython.
|
||||
/// `inspect.cleandoc` is also a good reference, but has a few incompatibilities.
|
||||
fn clean_doc(doc: &str) -> String {
|
||||
let doc = rustpython_common::str::expandtabs(doc, 8);
|
||||
// First pass: find minimum indentation of any non-blank lines
|
||||
// after first line.
|
||||
let margin = doc
|
||||
.lines()
|
||||
// Find the non-blank lines
|
||||
.filter(|line| !line.trim().is_empty())
|
||||
// get the one with the least indentation
|
||||
.map(|line| line.chars().take_while(|c| c == &' ').count())
|
||||
.min();
|
||||
if let Some(margin) = margin {
|
||||
let mut cleaned = String::with_capacity(doc.len());
|
||||
// copy first line without leading whitespace
|
||||
if let Some(first_line) = doc.lines().next() {
|
||||
cleaned.push_str(first_line.trim_start());
|
||||
}
|
||||
// copy subsequent lines without margin.
|
||||
for line in doc.split('\n').skip(1) {
|
||||
cleaned.push('\n');
|
||||
let cleaned_line = line.chars().skip(margin).collect::<String>();
|
||||
cleaned.push_str(&cleaned_line);
|
||||
}
|
||||
|
||||
cleaned
|
||||
} else {
|
||||
doc.to_owned()
|
||||
}
|
||||
}
|
||||
|
||||
fn split_doc<'a>(
|
||||
body: &'a [located_ast::Stmt],
|
||||
opts: &CompileOpts,
|
||||
) -> (Option<String>, &'a [located_ast::Stmt]) {
|
||||
if let Some((located_ast::Stmt::Expr(expr), body_rest)) = body.split_first() {
|
||||
if let Some(doc) = try_get_constant_string(std::slice::from_ref(&expr.value)) {
|
||||
if opts.optimize < 2 {
|
||||
return (Some(doc), body_rest);
|
||||
return if opts.optimize < 2 {
|
||||
(Some(clean_doc(&doc)), body_rest)
|
||||
} else {
|
||||
return (None, body_rest);
|
||||
}
|
||||
(None, body_rest)
|
||||
};
|
||||
}
|
||||
}
|
||||
(None, body)
|
||||
|
||||
@@ -7,9 +7,7 @@ myobj = MyObject()
|
||||
assert myobj == myobj
|
||||
assert not myobj != myobj
|
||||
|
||||
object.__subclasshook__() == NotImplemented
|
||||
object.__subclasshook__(1) == NotImplemented
|
||||
object.__subclasshook__(1, 2) == NotImplemented
|
||||
|
||||
assert MyObject().__eq__(MyObject()) == NotImplemented
|
||||
assert MyObject().__ne__(MyObject()) == NotImplemented
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# unittest for modified imghdr.py
|
||||
# Should be replace it into https://github.com/python/cpython/blob/main/Lib/test/test_imghdr.py
|
||||
import os
|
||||
import imghdr
|
||||
|
||||
|
||||
TEST_FILES = (
|
||||
#('python.png', 'png'),
|
||||
('python.gif', 'gif'),
|
||||
('python.bmp', 'bmp'),
|
||||
('python.ppm', 'ppm'),
|
||||
('python.pgm', 'pgm'),
|
||||
('python.pbm', 'pbm'),
|
||||
('python.jpg', 'jpeg'),
|
||||
('python.ras', 'rast'),
|
||||
#('python.sgi', 'rgb'),
|
||||
('python.tiff', 'tiff'),
|
||||
('python.xbm', 'xbm'),
|
||||
('python.webp', 'webp'),
|
||||
('python.exr', 'exr'),
|
||||
)
|
||||
|
||||
resource_dir = os.path.join(os.path.dirname(__file__), 'imghdrdata')
|
||||
|
||||
for fname, expected in TEST_FILES:
|
||||
res = imghdr.what(os.path.join(resource_dir, fname))
|
||||
assert res == expected
|
||||
@@ -1,12 +0,0 @@
|
||||
# This probably will be superceeded by the python unittests when that works.
|
||||
|
||||
import xdrlib
|
||||
|
||||
p = xdrlib.Packer()
|
||||
p.pack_int(1337)
|
||||
|
||||
d = p.get_buffer()
|
||||
|
||||
print(d)
|
||||
|
||||
# assert d == b'\x00\x00\x059'
|
||||
@@ -50,7 +50,7 @@ class Bar:
|
||||
assert x == 3
|
||||
|
||||
|
||||
assert Bar.__doc__ == " W00t "
|
||||
assert Bar.__doc__ == "W00t "
|
||||
|
||||
bar = Bar(42)
|
||||
assert bar.get_x.__doc__ == None
|
||||
@@ -147,7 +147,7 @@ class T3:
|
||||
test3
|
||||
"""
|
||||
|
||||
assert T3.__doc__ == "\n test3\n "
|
||||
assert T3.__doc__ == "\ntest3\n"
|
||||
|
||||
class T4:
|
||||
|
||||
|
||||
15
extra_tests/snippets/syntax_doc.py
Normal file
15
extra_tests/snippets/syntax_doc.py
Normal file
@@ -0,0 +1,15 @@
|
||||
|
||||
def f1():
|
||||
"""
|
||||
x
|
||||
\ty
|
||||
"""
|
||||
assert f1.__doc__ == '\nx\ny\n'
|
||||
|
||||
def f2():
|
||||
"""
|
||||
\t x
|
||||
\t\ty
|
||||
"""
|
||||
|
||||
assert f2.__doc__ == '\nx\n y\n'
|
||||
@@ -44,7 +44,7 @@ def f3():
|
||||
"""
|
||||
pass
|
||||
|
||||
assert f3.__doc__ == "\n test3\n "
|
||||
assert f3.__doc__ == "\ntest3\n"
|
||||
|
||||
def f4():
|
||||
"test4"
|
||||
|
||||
@@ -1125,33 +1125,7 @@ impl PyStr {
|
||||
|
||||
#[pymethod]
|
||||
fn expandtabs(&self, args: anystr::ExpandTabsArgs) -> String {
|
||||
let tab_stop = args.tabsize();
|
||||
let mut expanded_str = String::with_capacity(self.byte_len());
|
||||
let mut tab_size = tab_stop;
|
||||
let mut col_count = 0usize;
|
||||
for ch in self.as_str().chars() {
|
||||
match ch {
|
||||
'\t' => {
|
||||
let num_spaces = tab_size - col_count;
|
||||
col_count += num_spaces;
|
||||
let expand = " ".repeat(num_spaces);
|
||||
expanded_str.push_str(&expand);
|
||||
}
|
||||
'\r' | '\n' => {
|
||||
expanded_str.push(ch);
|
||||
col_count = 0;
|
||||
tab_size = 0;
|
||||
}
|
||||
_ => {
|
||||
expanded_str.push(ch);
|
||||
col_count += 1;
|
||||
}
|
||||
}
|
||||
if col_count >= tab_size {
|
||||
tab_size += tab_stop;
|
||||
}
|
||||
}
|
||||
expanded_str
|
||||
rustpython_common::str::expandtabs(self.as_str(), args.tabsize())
|
||||
}
|
||||
|
||||
#[pymethod]
|
||||
|
||||
@@ -4,9 +4,9 @@
|
||||
use chrono::{prelude::DateTime, Local};
|
||||
use std::time::{Duration, UNIX_EPOCH};
|
||||
|
||||
// = 3.12.0alpha
|
||||
// = 3.13.0alpha
|
||||
pub const MAJOR: usize = 3;
|
||||
pub const MINOR: usize = 12;
|
||||
pub const MINOR: usize = 13;
|
||||
pub const MICRO: usize = 0;
|
||||
pub const RELEASELEVEL: &str = "alpha";
|
||||
pub const RELEASELEVEL_N: usize = 0xA;
|
||||
|
||||
@@ -35,8 +35,8 @@ GENERATED_FILE = "extra_tests/not_impl.py"
|
||||
implementation = platform.python_implementation()
|
||||
if implementation != "CPython":
|
||||
sys.exit(f"whats_left.py must be run under CPython, got {implementation} instead")
|
||||
if sys.version_info[:2] < (3, 12):
|
||||
sys.exit(f"whats_left.py must be run under CPython 3.12 or newer, got {implementation} {sys.version} instead")
|
||||
if sys.version_info[:2] < (3, 13):
|
||||
sys.exit(f"whats_left.py must be run under CPython 3.13 or newer, got {implementation} {sys.version} instead")
|
||||
|
||||
def parse_args():
|
||||
parser = argparse.ArgumentParser(description="Process some integers.")
|
||||
|
||||
Reference in New Issue
Block a user