Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
grumpy
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
grumpy
Commits
9beb7e8a
Commit
9beb7e8a
authored
Jan 21, 2017
by
YOU
Committed by
Dylan Trotter
Jan 21, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add UserList, UserString to stdlib (#184)
parent
a821eae2
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
325 additions
and
3 deletions
+325
-3
third_party/stdlib/UserList.py
third_party/stdlib/UserList.py
+88
-0
third_party/stdlib/UserString.py
third_party/stdlib/UserString.py
+230
-0
third_party/stdlib/test/string_tests.py
third_party/stdlib/test/string_tests.py
+3
-1
third_party/stdlib/test/test_string.py
third_party/stdlib/test/test_string.py
+3
-1
third_party/stdlib/warnings.py
third_party/stdlib/warnings.py
+1
-1
No files found.
third_party/stdlib/UserList.py
0 → 100644
View file @
9beb7e8a
"""A more or less complete user-defined wrapper around list objects."""
import
collections
class
UserList
(
collections
.
MutableSequence
):
def
__init__
(
self
,
initlist
=
None
):
self
.
data
=
[]
if
initlist
is
not
None
:
# XXX should this accept an arbitrary sequence?
if
type
(
initlist
)
==
type
(
self
.
data
):
self
.
data
[:]
=
initlist
elif
isinstance
(
initlist
,
UserList
):
self
.
data
[:]
=
initlist
.
data
[:]
else
:
self
.
data
=
list
(
initlist
)
def
__repr__
(
self
):
return
repr
(
self
.
data
)
def
__lt__
(
self
,
other
):
return
self
.
data
<
self
.
__cast
(
other
)
def
__le__
(
self
,
other
):
return
self
.
data
<=
self
.
__cast
(
other
)
def
__eq__
(
self
,
other
):
return
self
.
data
==
self
.
__cast
(
other
)
def
__ne__
(
self
,
other
):
return
self
.
data
!=
self
.
__cast
(
other
)
def
__gt__
(
self
,
other
):
return
self
.
data
>
self
.
__cast
(
other
)
def
__ge__
(
self
,
other
):
return
self
.
data
>=
self
.
__cast
(
other
)
def
__cast
(
self
,
other
):
if
isinstance
(
other
,
UserList
):
return
other
.
data
else
:
return
other
def
__cmp__
(
self
,
other
):
return
cmp
(
self
.
data
,
self
.
__cast
(
other
))
__hash__
=
None
# Mutable sequence, so not hashable
def
__contains__
(
self
,
item
):
return
item
in
self
.
data
def
__len__
(
self
):
return
len
(
self
.
data
)
def
__getitem__
(
self
,
i
):
return
self
.
data
[
i
]
def
__setitem__
(
self
,
i
,
item
):
self
.
data
[
i
]
=
item
def
__delitem__
(
self
,
i
):
del
self
.
data
[
i
]
def
__getslice__
(
self
,
i
,
j
):
i
=
max
(
i
,
0
);
j
=
max
(
j
,
0
)
return
self
.
__class__
(
self
.
data
[
i
:
j
])
def
__setslice__
(
self
,
i
,
j
,
other
):
i
=
max
(
i
,
0
);
j
=
max
(
j
,
0
)
if
isinstance
(
other
,
UserList
):
self
.
data
[
i
:
j
]
=
other
.
data
elif
isinstance
(
other
,
type
(
self
.
data
)):
self
.
data
[
i
:
j
]
=
other
else
:
self
.
data
[
i
:
j
]
=
list
(
other
)
def
__delslice__
(
self
,
i
,
j
):
i
=
max
(
i
,
0
);
j
=
max
(
j
,
0
)
del
self
.
data
[
i
:
j
]
def
__add__
(
self
,
other
):
if
isinstance
(
other
,
UserList
):
return
self
.
__class__
(
self
.
data
+
other
.
data
)
elif
isinstance
(
other
,
type
(
self
.
data
)):
return
self
.
__class__
(
self
.
data
+
other
)
else
:
return
self
.
__class__
(
self
.
data
+
list
(
other
))
def
__radd__
(
self
,
other
):
if
isinstance
(
other
,
UserList
):
return
self
.
__class__
(
other
.
data
+
self
.
data
)
elif
isinstance
(
other
,
type
(
self
.
data
)):
return
self
.
__class__
(
other
+
self
.
data
)
else
:
return
self
.
__class__
(
list
(
other
)
+
self
.
data
)
def
__iadd__
(
self
,
other
):
if
isinstance
(
other
,
UserList
):
self
.
data
+=
other
.
data
elif
isinstance
(
other
,
type
(
self
.
data
)):
self
.
data
+=
other
else
:
self
.
data
+=
list
(
other
)
return
self
def
__mul__
(
self
,
n
):
return
self
.
__class__
(
self
.
data
*
n
)
__rmul__
=
__mul__
def
__imul__
(
self
,
n
):
self
.
data
*=
n
return
self
def
append
(
self
,
item
):
self
.
data
.
append
(
item
)
def
insert
(
self
,
i
,
item
):
self
.
data
.
insert
(
i
,
item
)
def
pop
(
self
,
i
=-
1
):
return
self
.
data
.
pop
(
i
)
def
remove
(
self
,
item
):
self
.
data
.
remove
(
item
)
def
count
(
self
,
item
):
return
self
.
data
.
count
(
item
)
def
index
(
self
,
item
,
*
args
):
return
self
.
data
.
index
(
item
,
*
args
)
def
reverse
(
self
):
self
.
data
.
reverse
()
def
sort
(
self
,
*
args
,
**
kwds
):
self
.
data
.
sort
(
*
args
,
**
kwds
)
def
extend
(
self
,
other
):
if
isinstance
(
other
,
UserList
):
self
.
data
.
extend
(
other
.
data
)
else
:
self
.
data
.
extend
(
other
)
third_party/stdlib/UserString.py
0 → 100755
View file @
9beb7e8a
#!/usr/bin/env python
## vim:ts=4:et:nowrap
"""A user-defined wrapper around string objects
Note: string objects have grown methods in Python 1.6
This module requires Python 1.6 or later.
"""
import
sys
import
collections
__all__
=
[
"UserString"
,
"MutableString"
]
class
UserString
(
collections
.
Sequence
):
def
__init__
(
self
,
seq
):
if
isinstance
(
seq
,
basestring
):
self
.
data
=
seq
elif
isinstance
(
seq
,
UserString
):
self
.
data
=
seq
.
data
[:]
else
:
self
.
data
=
str
(
seq
)
def
__str__
(
self
):
return
str
(
self
.
data
)
def
__repr__
(
self
):
return
repr
(
self
.
data
)
def
__int__
(
self
):
return
int
(
self
.
data
)
def
__long__
(
self
):
return
long
(
self
.
data
)
def
__float__
(
self
):
return
float
(
self
.
data
)
def
__complex__
(
self
):
return
complex
(
self
.
data
)
def
__hash__
(
self
):
return
hash
(
self
.
data
)
def
__cmp__
(
self
,
string
):
if
isinstance
(
string
,
UserString
):
return
cmp
(
self
.
data
,
string
.
data
)
else
:
return
cmp
(
self
.
data
,
string
)
def
__contains__
(
self
,
char
):
return
char
in
self
.
data
def
__len__
(
self
):
return
len
(
self
.
data
)
def
__getitem__
(
self
,
index
):
return
self
.
__class__
(
self
.
data
[
index
])
def
__getslice__
(
self
,
start
,
end
):
start
=
max
(
start
,
0
);
end
=
max
(
end
,
0
)
return
self
.
__class__
(
self
.
data
[
start
:
end
])
def
__add__
(
self
,
other
):
if
isinstance
(
other
,
UserString
):
return
self
.
__class__
(
self
.
data
+
other
.
data
)
elif
isinstance
(
other
,
basestring
):
return
self
.
__class__
(
self
.
data
+
other
)
else
:
return
self
.
__class__
(
self
.
data
+
str
(
other
))
def
__radd__
(
self
,
other
):
if
isinstance
(
other
,
basestring
):
return
self
.
__class__
(
other
+
self
.
data
)
else
:
return
self
.
__class__
(
str
(
other
)
+
self
.
data
)
def
__mul__
(
self
,
n
):
return
self
.
__class__
(
self
.
data
*
n
)
__rmul__
=
__mul__
def
__mod__
(
self
,
args
):
return
self
.
__class__
(
self
.
data
%
args
)
# the following methods are defined in alphabetical order:
def
capitalize
(
self
):
return
self
.
__class__
(
self
.
data
.
capitalize
())
def
center
(
self
,
width
,
*
args
):
return
self
.
__class__
(
self
.
data
.
center
(
width
,
*
args
))
def
count
(
self
,
sub
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
count
(
sub
,
start
,
end
)
def
decode
(
self
,
encoding
=
None
,
errors
=
None
):
# XXX improve this?
if
encoding
:
if
errors
:
return
self
.
__class__
(
self
.
data
.
decode
(
encoding
,
errors
))
else
:
return
self
.
__class__
(
self
.
data
.
decode
(
encoding
))
else
:
return
self
.
__class__
(
self
.
data
.
decode
())
def
encode
(
self
,
encoding
=
None
,
errors
=
None
):
# XXX improve this?
if
encoding
:
if
errors
:
return
self
.
__class__
(
self
.
data
.
encode
(
encoding
,
errors
))
else
:
return
self
.
__class__
(
self
.
data
.
encode
(
encoding
))
else
:
return
self
.
__class__
(
self
.
data
.
encode
())
def
endswith
(
self
,
suffix
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
endswith
(
suffix
,
start
,
end
)
def
expandtabs
(
self
,
tabsize
=
8
):
return
self
.
__class__
(
self
.
data
.
expandtabs
(
tabsize
))
def
find
(
self
,
sub
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
find
(
sub
,
start
,
end
)
def
index
(
self
,
sub
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
index
(
sub
,
start
,
end
)
def
isalpha
(
self
):
return
self
.
data
.
isalpha
()
def
isalnum
(
self
):
return
self
.
data
.
isalnum
()
def
isdecimal
(
self
):
return
self
.
data
.
isdecimal
()
def
isdigit
(
self
):
return
self
.
data
.
isdigit
()
def
islower
(
self
):
return
self
.
data
.
islower
()
def
isnumeric
(
self
):
return
self
.
data
.
isnumeric
()
def
isspace
(
self
):
return
self
.
data
.
isspace
()
def
istitle
(
self
):
return
self
.
data
.
istitle
()
def
isupper
(
self
):
return
self
.
data
.
isupper
()
def
join
(
self
,
seq
):
return
self
.
data
.
join
(
seq
)
def
ljust
(
self
,
width
,
*
args
):
return
self
.
__class__
(
self
.
data
.
ljust
(
width
,
*
args
))
def
lower
(
self
):
return
self
.
__class__
(
self
.
data
.
lower
())
def
lstrip
(
self
,
chars
=
None
):
return
self
.
__class__
(
self
.
data
.
lstrip
(
chars
))
def
partition
(
self
,
sep
):
return
self
.
data
.
partition
(
sep
)
def
replace
(
self
,
old
,
new
,
maxsplit
=-
1
):
return
self
.
__class__
(
self
.
data
.
replace
(
old
,
new
,
maxsplit
))
def
rfind
(
self
,
sub
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
rfind
(
sub
,
start
,
end
)
def
rindex
(
self
,
sub
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
rindex
(
sub
,
start
,
end
)
def
rjust
(
self
,
width
,
*
args
):
return
self
.
__class__
(
self
.
data
.
rjust
(
width
,
*
args
))
def
rpartition
(
self
,
sep
):
return
self
.
data
.
rpartition
(
sep
)
def
rstrip
(
self
,
chars
=
None
):
return
self
.
__class__
(
self
.
data
.
rstrip
(
chars
))
def
split
(
self
,
sep
=
None
,
maxsplit
=-
1
):
return
self
.
data
.
split
(
sep
,
maxsplit
)
def
rsplit
(
self
,
sep
=
None
,
maxsplit
=-
1
):
return
self
.
data
.
rsplit
(
sep
,
maxsplit
)
def
splitlines
(
self
,
keepends
=
0
):
return
self
.
data
.
splitlines
(
keepends
)
def
startswith
(
self
,
prefix
,
start
=
0
,
end
=
sys
.
maxint
):
return
self
.
data
.
startswith
(
prefix
,
start
,
end
)
def
strip
(
self
,
chars
=
None
):
return
self
.
__class__
(
self
.
data
.
strip
(
chars
))
def
swapcase
(
self
):
return
self
.
__class__
(
self
.
data
.
swapcase
())
def
title
(
self
):
return
self
.
__class__
(
self
.
data
.
title
())
def
translate
(
self
,
*
args
):
return
self
.
__class__
(
self
.
data
.
translate
(
*
args
))
def
upper
(
self
):
return
self
.
__class__
(
self
.
data
.
upper
())
def
zfill
(
self
,
width
):
return
self
.
__class__
(
self
.
data
.
zfill
(
width
))
class
MutableString
(
UserString
,
collections
.
MutableSequence
):
"""mutable string objects
Python strings are immutable objects. This has the advantage, that
strings may be used as dictionary keys. If this property isn't needed
and you insist on changing string values in place instead, you may cheat
and use MutableString.
But the purpose of this class is an educational one: to prevent
people from inventing their own mutable string class derived
from UserString and than forget thereby to remove (override) the
__hash__ method inherited from UserString. This would lead to
errors that would be very hard to track down.
A faster and better solution is to rewrite your program using lists."""
def
__init__
(
self
,
string
=
""
):
# from warnings import warnpy3k
import
warnings
warnpy3k
=
warnings
.
warnpy3k
warnpy3k
(
'the class UserString.MutableString has been removed in '
'Python 3.0'
,
stacklevel
=
2
)
self
.
data
=
string
# We inherit object.__hash__, so we must deny this explicitly
__hash__
=
None
def
__setitem__
(
self
,
index
,
sub
):
if
isinstance
(
index
,
slice
):
if
isinstance
(
sub
,
UserString
):
sub
=
sub
.
data
elif
not
isinstance
(
sub
,
basestring
):
sub
=
str
(
sub
)
start
,
stop
,
step
=
index
.
indices
(
len
(
self
.
data
))
if
step
==
-
1
:
start
,
stop
=
stop
+
1
,
start
+
1
sub
=
sub
[::
-
1
]
elif
step
!=
1
:
# XXX(twouters): I guess we should be reimplementing
# the extended slice assignment/deletion algorithm here...
raise
TypeError
,
"invalid step in slicing assignment"
start
=
min
(
start
,
stop
)
self
.
data
=
self
.
data
[:
start
]
+
sub
+
self
.
data
[
stop
:]
else
:
if
index
<
0
:
index
+=
len
(
self
.
data
)
if
index
<
0
or
index
>=
len
(
self
.
data
):
raise
IndexError
self
.
data
=
self
.
data
[:
index
]
+
sub
+
self
.
data
[
index
+
1
:]
def
__delitem__
(
self
,
index
):
if
isinstance
(
index
,
slice
):
start
,
stop
,
step
=
index
.
indices
(
len
(
self
.
data
))
if
step
==
-
1
:
start
,
stop
=
stop
+
1
,
start
+
1
elif
step
!=
1
:
# XXX(twouters): see same block in __setitem__
raise
TypeError
,
"invalid step in slicing deletion"
start
=
min
(
start
,
stop
)
self
.
data
=
self
.
data
[:
start
]
+
self
.
data
[
stop
:]
else
:
if
index
<
0
:
index
+=
len
(
self
.
data
)
if
index
<
0
or
index
>=
len
(
self
.
data
):
raise
IndexError
self
.
data
=
self
.
data
[:
index
]
+
self
.
data
[
index
+
1
:]
def
__setslice__
(
self
,
start
,
end
,
sub
):
start
=
max
(
start
,
0
);
end
=
max
(
end
,
0
)
if
isinstance
(
sub
,
UserString
):
self
.
data
=
self
.
data
[:
start
]
+
sub
.
data
+
self
.
data
[
end
:]
elif
isinstance
(
sub
,
basestring
):
self
.
data
=
self
.
data
[:
start
]
+
sub
+
self
.
data
[
end
:]
else
:
self
.
data
=
self
.
data
[:
start
]
+
str
(
sub
)
+
self
.
data
[
end
:]
def
__delslice__
(
self
,
start
,
end
):
start
=
max
(
start
,
0
);
end
=
max
(
end
,
0
)
self
.
data
=
self
.
data
[:
start
]
+
self
.
data
[
end
:]
def
immutable
(
self
):
return
UserString
(
self
.
data
)
def
__iadd__
(
self
,
other
):
if
isinstance
(
other
,
UserString
):
self
.
data
+=
other
.
data
elif
isinstance
(
other
,
basestring
):
self
.
data
+=
other
else
:
self
.
data
+=
str
(
other
)
return
self
def
__imul__
(
self
,
n
):
self
.
data
*=
n
return
self
def
insert
(
self
,
index
,
value
):
self
[
index
:
index
]
=
value
# if __name__ == "__main__":
# # execute the regression test to stdout, if called as a script:
# import os
# called_in_dir, called_as = os.path.split(sys.argv[0])
# called_as, py = os.path.splitext(called_as)
# if '-q' in sys.argv:
# from test import test_support
# test_support.verbose = 0
# __import__('test.test_' + called_as.lower())
third_party/stdlib/test/string_tests.py
View file @
9beb7e8a
...
...
@@ -7,6 +7,8 @@ import unittest, string, sys
import
_struct
as
struct
from
test
import
test_support
# from UserList import UserList
import
UserList
as
_UserList
UserList
=
_UserList
.
UserList
class
Sequence
(
object
):
def
__init__
(
self
,
seq
=
'wxyz'
):
self
.
seq
=
seq
...
...
@@ -1094,7 +1096,7 @@ class MixinStrUnicodeUserStringTest(NonStringModuleTest):
self
.
checkequal
(
'ac'
,
''
,
'join'
,
(
'a'
,
''
,
'c'
,
''
))
self
.
checkequal
(
'w x y z'
,
' '
,
'join'
,
Sequence
())
self
.
checkequal
(
'abc'
,
'a'
,
'join'
,
(
'abc'
,))
#
self.checkequal('z', 'a', 'join', UserList(['z']))
self
.
checkequal
(
'z'
,
'a'
,
'join'
,
UserList
([
'z'
]))
if
test_support
.
have_unicode
:
self
.
checkequal
(
unicode
(
'a.b.c'
),
unicode
(
'.'
),
'join'
,
[
'a'
,
'b'
,
'c'
])
self
.
checkequal
(
unicode
(
'a.b.c'
),
'.'
,
'join'
,
[
unicode
(
'a'
),
'b'
,
'c'
])
...
...
third_party/stdlib/test/test_string.py
View file @
9beb7e8a
...
...
@@ -4,6 +4,8 @@ import string
Template
=
string
.
Template
from
test
import
test_support
,
string_tests
# from UserList import UserList
import
UserList
as
_UserList
UserList
=
_UserList
.
UserList
class
StringTest
(
string_tests
.
CommonTest
,
...
...
@@ -35,7 +37,7 @@ class StringTest(
self
.
checkequal
(
'abcd'
,
(
'a'
,
'b'
,
'c'
,
'd'
),
'join'
,
''
)
self
.
checkequal
(
'w x y z'
,
string_tests
.
Sequence
(),
'join'
,
' '
)
self
.
checkequal
(
'abc'
,
(
'abc'
,),
'join'
,
'a'
)
#
self.checkequal('z', UserList(['z']), 'join', 'a')
self
.
checkequal
(
'z'
,
UserList
([
'z'
]),
'join'
,
'a'
)
if
test_support
.
have_unicode
:
self
.
checkequal
(
unicode
(
'a.b.c'
),
[
'a'
,
'b'
,
'c'
],
'join'
,
unicode
(
'.'
))
self
.
checkequal
(
unicode
(
'a.b.c'
),
[
unicode
(
'a'
),
'b'
,
'c'
],
'join'
,
'.'
)
...
...
third_party/stdlib/warnings.py
View file @
9beb7e8a
...
...
@@ -10,7 +10,7 @@ import types
__all__
=
[
"warn"
,
"warn_explicit"
,
"showwarning"
,
"formatwarning"
,
"filterwarnings"
,
"simplefilter"
,
"resetwarnings"
,
"catch_warnings"
]
"resetwarnings"
,
"catch_warnings"
,
"warnpy3k"
]
def
warnpy3k
(
message
,
category
=
None
,
stacklevel
=
1
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment