Skip to content

Commit 483594b

Browse files
committed
-
1 parent 88db75c commit 483594b

File tree

6 files changed

+28
-69
lines changed

6 files changed

+28
-69
lines changed

misc/IDE files/Wing/python_toolbox_py3.wpr

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ debug.launch-configs = (1,
2121
'rundir': ('default',
2222
u'')})})
2323
proj.directory-list = [{'dirloc': loc('../../..'),
24-
'excludes': [u'source_py2',
25-
u'nosetests.xml',
24+
'excludes': [u'dist',
25+
u'source_py2',
2626
u'.coverage_html_report',
2727
u'build',
28-
u'dist',
28+
u'source_py3/.coverage_html_report',
29+
u'nosetests.xml',
2930
u'docs/_build',
3031
u'python_toolbox.egg-info'],
3132
'filter': '*',

source_py3/python_toolbox/combi/perm_space.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -148,21 +148,22 @@ def __init__(self, iterable_or_length, domain=None, n_elements=None,
148148
# #
149149
if isinstance(iterable_or_length, numbers.Integral):
150150
self.is_rapplied = False
151-
self.sequence = range(iterable_or_length)
151+
self.sequence = sequence_tools.CuteRange(iterable_or_length)
152152
self.sequence_length = iterable_or_length
153153
else:
154154
assert isinstance(iterable_or_length, collections.Iterable)
155155
self.sequence = sequence_tools. \
156156
ensure_iterable_is_immutable_sequence(iterable_or_length)
157-
range_candidate = range(len(self.sequence))
157+
range_candidate = sequence_tools.CuteRange(len(self.sequence))
158158

159159
self.is_rapplied = not (
160160
cute_iter_tools.are_equal(self.sequence,
161161
range_candidate)
162162
)
163163
self.sequence_length = len(self.sequence)
164164
if not self.is_rapplied:
165-
self.sequence = range(self.sequence_length)
165+
self.sequence = sequence_tools.CuteRange(self.sequence_length)
166+
166167

167168
if self.is_rapplied and (len(set(self.sequence)) < len(self.sequence)):
168169
# Can implement this later by calculating the actual length.
@@ -181,7 +182,7 @@ def __init__(self, iterable_or_length, domain=None, n_elements=None,
181182
self.sequence_length)
182183
self.is_partial = (self.n_elements < self.sequence_length)
183184

184-
self.indices = sequence_tools.CuteRange(self.n_elements)
185+
self.indices = sequence_tools.CuteRange(self.n_elements)
185186

186187
# #
187188
### Finished figuring out number of elements. #########################

source_py3/python_toolbox/logic_tools.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,18 @@ def all_equal(iterable, exhaustive=False):
2424
# todo: Maybe I should simply check if `len(set(iterable)) == 1`? Will not
2525
# work for unhashables.
2626

27-
items = tuple(iterable)
28-
if len(items) <= 1:
29-
return True
3027

3128
if exhaustive is True:
29+
items = tuple(iterable)
30+
if len(items) <= 1:
31+
return True
3232
from python_toolbox import combi
3333
pairs = tuple(
3434
tuple(items[i] for i in comb) for comb in
3535
combi.CombSpace(len(items), 2)
3636
)
3737
else: # exhaustive is False
38-
pairs = cute_iter_tools.iterate_overlapping_subsequences(items)
38+
pairs = cute_iter_tools.iterate_overlapping_subsequences(iterable)
3939

4040
return all(a==b for (a, b) in pairs)
4141

source_py3/python_toolbox/sequence_tools/cute_range.py

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -75,39 +75,8 @@ def _is_integral_or_none(thing):
7575
return isinstance(thing, (numbers.Integral, NoneType))
7676

7777

78-
class CuteRangeType(abc.ABCMeta):
79-
'''Metaclass for `CuteRange`, see its docstring for details.'''
80-
def __call__(cls, *args, _avoid_built_in_range=False):
81-
# Our job here is to decide whether to instantiate using the built-in
82-
# `range` or our kickass `Range`.
83-
from python_toolbox import math_tools
84-
85-
if (cls is CuteRange) and (not _avoid_built_in_range):
86-
start, stop, step = parse_range_args(*args)
87-
88-
use_builtin_range = True # Until challenged.
89-
90-
if not all(map(_is_integral_or_none, (start, stop, step))):
91-
# If any of `(start, stop, step)` are not integers or `None`, we
92-
# definitely need `Range`.
93-
use_builtin_range = False
94-
95-
if (step > 0 and stop == infinity) or \
96-
(step < 0 and stop == (-infinity)):
97-
# If the range of numbers is infinite, we sure as shit need
98-
# `Range`.
99-
use_builtin_range = False
100-
101-
if use_builtin_range:
102-
return range(*args)
103-
else:
104-
return super().__call__(*args)
105-
106-
else: # (cls is not Range) or _avoid_built_in_range
107-
return super().__call__(*args)
108-
10978

110-
class CuteRange(CuteSequence, metaclass=CuteRangeType):
79+
class CuteRange(CuteSequence):
11180
'''
11281
Improved version of Python's `range` that has extra features.
11382
@@ -118,8 +87,7 @@ class CuteRange(CuteSequence, metaclass=CuteRangeType):
11887
allows you to use floating-point numbers (or decimals), and it allows you
11988
to use infinite numbers to produce infinite ranges.
12089
121-
122-
90+
blocktododoc add examples
12391
'''
12492
def __init__(self, *args):
12593
self.start, self.stop, self.step = parse_range_args(*args)
@@ -227,6 +195,4 @@ def index(self, i):
227195
raise ValueError
228196

229197
is_infinity = caching.CachedProperty(lambda self: self.length == infinity)
230-
231-
232-
CuteRange.register(range)
198+

source_py3/test_python_toolbox/test_combi/test_perm_space.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ def test_perm_spaces():
2121
assert pure_0a == pure_0b == pure_0c == pure_0d
2222
assert len(pure_0a) == len(pure_0b) == len(pure_0c) == len(pure_0d)
2323
assert repr(pure_0a) == repr(pure_0b) == repr(pure_0c) == \
24-
repr(pure_0d) == '<PermSpace: range(0, 4)>'
24+
repr(pure_0d) == '<PermSpace: CuteRange(0, 4)>'
2525

2626
assert cute_iter_tools.are_equal(pure_0a, pure_0b, pure_0c, pure_0d)
2727

@@ -280,11 +280,14 @@ def test_dapplied_perm_space():
280280
assert not dapplied_perm_space._just_fixed.is_combination
281281
assert not dapplied_perm_space._just_fixed.is_degreed
282282

283-
assert repr(dapplied_perm_space) == "<PermSpace: 'growl' => range(0, 5)>"
283+
assert repr(dapplied_perm_space) == \
284+
"<PermSpace: 'growl' => CuteRange(0, 5)>"
284285

285286
# Testing `repr` shortening:
286-
assert repr(PermSpace(20, domain=tuple(range(20, 0, -1)))) == \
287-
'<PermSpace: (20, 19, 18, 17, 16, 15, 14, 13, 12 ... ) => range(0, 20)>'
287+
assert repr(PermSpace(20, domain=tuple(range(20, 0, -1)))) == (
288+
'<PermSpace: (20, 19, 18, 17, 16, 15, 14, 13, 12 ... ) => '
289+
'CuteRange(0, 20)>'
290+
)
288291

289292
def test_degreed_perm_space():
290293
assert PermSpace(3, degrees=0).length == 1

source_py3/test_python_toolbox/test_sequence_tools/test_cute_range.py

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,14 @@
99
infinity = float('inf')
1010

1111

12-
def test_built_in():
13-
built_in_range_arguments_tuples = (
12+
def test_finite():
13+
finite_range_arguments_tuples = (
1414
(10,), (3,), (20, 30), (20, 30, 2), (20, 30, -2)
1515
)
1616

17-
for built_in_range_arguments_tuple in built_in_range_arguments_tuples:
18-
cr0 = CuteRange(*built_in_range_arguments_tuple)
19-
assert type(cr0) == range
20-
assert isinstance(cr0, range)
21-
assert isinstance(cr0, CuteRange)
22-
cr1 = CuteRange(*built_in_range_arguments_tuple, _avoid_built_in_range=True)
23-
assert cr1.length == len(cr1)
24-
assert type(cr1) == CuteRange
25-
assert not isinstance(cr1, range)
26-
assert isinstance(cr1, CuteRange)
27-
assert tuple(cr0) == tuple(cr1)
28-
if cr0:
29-
assert cr0[0] == cr1[0]
30-
assert cr0[-1] == cr1[-1]
31-
assert repr(cr0)[1:] == repr(cr1)[5:]
17+
for finite_range_arguments_tuple in finite_range_arguments_tuples:
18+
cr0 = CuteRange(*finite_range_arguments_tuple)
19+
assert type(cr0) == CuteRange
3220

3321
def test_infinite():
3422
infinite_range_arguments_tuples = (

0 commit comments

Comments
 (0)