mirror of
https://github.com/RustPython/RustPython.git
synced 2026-10-28 18:59:04 +08:00
Align collections and testing libraries with Python 3.15 (#9192)
* Align collections and testing libraries with Python 3.15 Refresh twelve production modules and canonical tests through scripts/update_lib at CPython d220409a13b77de7a6c30abe16ea90db01528edc. Preserve existing RustPython unittest helpers and test guards. Accept frozendict in native defaultdict and OrderedDict union slots, matching upstream PyAnyDict_Check without changing constructors, factories, or update order. Validated as a local stack on the exact #9189 regex/dataclasses/typing prerequisite; this dependency avoids eager typing.ByteString deprecation during unittest warning tests. Assisted-by: OpenAI Codex: model version unavailable * Synchronize regression runner with doctest subtest reporting Refresh the canonical test_regrtest consumer and its direct runner/pythoninfo closure through scripts/update_lib at CPython d220409a13b77de7a6c30abe16ea90db01528edc. Preserve both existing expected-failure markers. This aligns the runner test with doctest reporting two failed examples and one skipped example. Assisted-by: OpenAI Codex: model version unavailable
This commit is contained in:
1 parent
e7e3dfd6ce
commit
feca6f2004
33 files changed
+2316
-745
No files matched your search
Vendored
+73
-34
@@ -33,6 +33,7 @@ __all__ = ['get_close_matches', 'ndiff', 'restore', 'SequenceMatcher',
|
||||
from heapq import nlargest as _nlargest
|
||||
from collections import namedtuple as _namedtuple
|
||||
from types import GenericAlias
|
||||
lazy from _colorize import can_colorize, get_theme
|
||||
|
||||
Match = _namedtuple('Match', 'a b size')
|
||||
|
||||
@@ -637,15 +638,15 @@ class SequenceMatcher:
|
||||
# avail[x] is the number of times x appears in 'b' less the
|
||||
# number of times we've seen it in 'a' so far ... kinda
|
||||
avail = {}
|
||||
availhas, matches = avail.__contains__, 0
|
||||
matches = 0
|
||||
for elt in self.a:
|
||||
if availhas(elt):
|
||||
if elt in avail:
|
||||
numb = avail[elt]
|
||||
else:
|
||||
numb = fullbcount.get(elt, 0)
|
||||
avail[elt] = numb - 1
|
||||
if numb > 0:
|
||||
matches = matches + 1
|
||||
matches += 1
|
||||
return _calculate_ratio(matches, len(self.a) + len(self.b))
|
||||
|
||||
def real_quick_ratio(self):
|
||||
@@ -701,10 +702,12 @@ def get_close_matches(word, possibilities, n=3, cutoff=0.6):
|
||||
s.set_seq2(word)
|
||||
for x in possibilities:
|
||||
s.set_seq1(x)
|
||||
if s.real_quick_ratio() >= cutoff and \
|
||||
s.quick_ratio() >= cutoff and \
|
||||
s.ratio() >= cutoff:
|
||||
result.append((s.ratio(), x))
|
||||
if s.real_quick_ratio() < cutoff or s.quick_ratio() < cutoff:
|
||||
continue
|
||||
|
||||
ratio = s.ratio()
|
||||
if ratio >= cutoff:
|
||||
result.append((ratio, x))
|
||||
|
||||
# Move the best scorers to head of list
|
||||
result = _nlargest(n, result)
|
||||
@@ -939,10 +942,12 @@ class Differ:
|
||||
cruncher.set_seq1(a[i])
|
||||
# Ordering by cheapest to most expensive ratio is very
|
||||
# valuable, most often getting out early.
|
||||
if (crqr() > best_ratio
|
||||
and cqr() > best_ratio
|
||||
and cr() > best_ratio):
|
||||
best_i, best_j, best_ratio = i, j, cr()
|
||||
if crqr() <= best_ratio or cqr() <= best_ratio:
|
||||
continue
|
||||
|
||||
ratio = cr()
|
||||
if ratio > best_ratio:
|
||||
best_i, best_j, best_ratio = i, j, ratio
|
||||
|
||||
if best_i is None:
|
||||
# found nothing to synch on yet - move to next j
|
||||
@@ -1094,7 +1099,7 @@ def _format_range_unified(start, stop):
|
||||
return '{},{}'.format(beginning, length)
|
||||
|
||||
def unified_diff(a, b, fromfile='', tofile='', fromfiledate='',
|
||||
tofiledate='', n=3, lineterm='\n'):
|
||||
tofiledate='', n=3, lineterm='\n', *, color=False):
|
||||
r"""
|
||||
Compare two sequences of lines; generate the delta as a unified diff.
|
||||
|
||||
@@ -1111,6 +1116,10 @@ def unified_diff(a, b, fromfile='', tofile='', fromfiledate='',
|
||||
For inputs that do not have trailing newlines, set the lineterm
|
||||
argument to "" so that the output will be uniformly newline free.
|
||||
|
||||
Set 'color' to True to enable output in color, similar to
|
||||
'git diff --color'. Even if enabled, it can be
|
||||
controlled using environment variables such as 'NO_COLOR'.
|
||||
|
||||
The unidiff format normally has a header for filenames and modification
|
||||
times. Any or all of these may be specified using strings for
|
||||
'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.
|
||||
@@ -1134,6 +1143,11 @@ def unified_diff(a, b, fromfile='', tofile='', fromfiledate='',
|
||||
four
|
||||
"""
|
||||
|
||||
if color and can_colorize():
|
||||
t = get_theme(force_color=True).difflib
|
||||
else:
|
||||
t = get_theme(force_no_color=True).difflib
|
||||
|
||||
_check_types(a, b, fromfile, tofile, fromfiledate, tofiledate, lineterm)
|
||||
started = False
|
||||
for group in SequenceMatcher(None,a,b).get_grouped_opcodes(n):
|
||||
@@ -1141,25 +1155,25 @@ def unified_diff(a, b, fromfile='', tofile='', fromfiledate='',
|
||||
started = True
|
||||
fromdate = '\t{}'.format(fromfiledate) if fromfiledate else ''
|
||||
todate = '\t{}'.format(tofiledate) if tofiledate else ''
|
||||
yield '--- {}{}{}'.format(fromfile, fromdate, lineterm)
|
||||
yield '+++ {}{}{}'.format(tofile, todate, lineterm)
|
||||
yield f'{t.header}--- {fromfile}{fromdate}{lineterm}{t.reset}'
|
||||
yield f'{t.header}+++ {tofile}{todate}{lineterm}{t.reset}'
|
||||
|
||||
first, last = group[0], group[-1]
|
||||
file1_range = _format_range_unified(first[1], last[2])
|
||||
file2_range = _format_range_unified(first[3], last[4])
|
||||
yield '@@ -{} +{} @@{}'.format(file1_range, file2_range, lineterm)
|
||||
yield f'{t.hunk}@@ -{file1_range} +{file2_range} @@{lineterm}{t.reset}'
|
||||
|
||||
for tag, i1, i2, j1, j2 in group:
|
||||
if tag == 'equal':
|
||||
for line in a[i1:i2]:
|
||||
yield ' ' + line
|
||||
yield f'{t.context} {line}{t.reset}'
|
||||
continue
|
||||
if tag in {'replace', 'delete'}:
|
||||
for line in a[i1:i2]:
|
||||
yield '-' + line
|
||||
yield f'{t.removed}-{line}{t.reset}'
|
||||
if tag in {'replace', 'insert'}:
|
||||
for line in b[j1:j2]:
|
||||
yield '+' + line
|
||||
yield f'{t.added}+{line}{t.reset}'
|
||||
|
||||
|
||||
########################################################################
|
||||
@@ -1615,16 +1629,13 @@ def _mdiff(fromlines, tolines, context=None, linejunk=None,
|
||||
|
||||
|
||||
_file_template = """
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
|
||||
<html>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type"
|
||||
content="text/html; charset=%(charset)s" />
|
||||
<title></title>
|
||||
<style type="text/css">%(styles)s
|
||||
<meta charset="%(charset)s">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>Diff comparison</title>
|
||||
<style>%(styles)s
|
||||
</style>
|
||||
</head>
|
||||
|
||||
@@ -1636,13 +1647,36 @@ _file_template = """
|
||||
|
||||
_styles = """
|
||||
:root {color-scheme: light dark}
|
||||
table.diff {font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace; border:medium}
|
||||
.diff_header {background-color:#e0e0e0}
|
||||
td.diff_header {text-align:right}
|
||||
.diff_next {background-color:#c0c0c0}
|
||||
table.diff {
|
||||
font-family: Menlo, Consolas, Monaco, Liberation Mono, Lucida Console, monospace;
|
||||
border: medium;
|
||||
}
|
||||
.diff_header {
|
||||
background-color: #e0e0e0;
|
||||
font-weight: bold;
|
||||
}
|
||||
td.diff_header {
|
||||
text-align: right;
|
||||
padding: 0 8px;
|
||||
}
|
||||
.diff_next {
|
||||
background-color: #c0c0c0;
|
||||
padding: 4px 0;
|
||||
}
|
||||
.diff_add {background-color:palegreen}
|
||||
.diff_chg {background-color:#ffff77}
|
||||
.diff_sub {background-color:#ffaaaa}
|
||||
table.diff[summary="Legends"] {
|
||||
margin-top: 20px;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
table.diff[summary="Legends"] th {
|
||||
background-color: #e0e0e0;
|
||||
padding: 4px 8px;
|
||||
}
|
||||
table.diff[summary="Legends"] td {
|
||||
padding: 4px 8px;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.diff_header {background-color:#666}
|
||||
@@ -1650,6 +1684,8 @@ _styles = """
|
||||
.diff_add {background-color:darkgreen}
|
||||
.diff_chg {background-color:#847415}
|
||||
.diff_sub {background-color:darkred}
|
||||
table.diff[summary="Legends"] {border-color:#555}
|
||||
table.diff[summary="Legends"] th{background-color:#666}
|
||||
}"""
|
||||
|
||||
_table_template = """
|
||||
@@ -1692,7 +1728,7 @@ class HtmlDiff(object):
|
||||
make_table -- generates HTML for a single side by side table
|
||||
make_file -- generates complete HTML file with a single side by side table
|
||||
|
||||
See tools/scripts/diff.py for an example usage of this class.
|
||||
See Doc/includes/diff.py for an example usage of this class.
|
||||
"""
|
||||
|
||||
_file_template = _file_template
|
||||
@@ -1892,8 +1928,11 @@ class HtmlDiff(object):
|
||||
# make space non-breakable so they don't get compressed or line wrapped
|
||||
text = text.replace(' ',' ').rstrip()
|
||||
|
||||
return '<td class="diff_header"%s>%s</td><td nowrap="nowrap">%s</td>' \
|
||||
% (id,linenum,text)
|
||||
# add a class to the td tag if there is a difference on the line
|
||||
css_class = ' class="diff_changed" ' if flag else ' '
|
||||
|
||||
return f'<td class="diff_header"{id}>{linenum}</td>' \
|
||||
+ f'<td{css_class}nowrap="nowrap">{text}</td>'
|
||||
|
||||
def _make_prefix(self):
|
||||
"""Create unique anchor prefixes"""
|
||||
|
||||
Reference in new issue
Block a user