Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion faker/providers/bank/fi_FI/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@


class Provider(BankProvider):
bban_format = '################'
bban_format = '##############'
country_code = 'FI'
14 changes: 11 additions & 3 deletions faker/providers/python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ def pyfloat(self, left_digits=None, right_digits=None, positive=False,
raise ValueError('Min value cannot be greater than max value')
if None not in (min_value, max_value) and min_value == max_value:
raise ValueError('Min and max value cannot be the same')
if positive and min_value is not None and min_value < 0:
raise ValueError(
'Cannot combine positive=True and negative min_value')

left_digits = left_digits if left_digits is not None else (
self.random_int(1, sys.float_info.dig))
Expand All @@ -77,7 +80,9 @@ def pyfloat(self, left_digits=None, right_digits=None, positive=False,
max_value += 1 # as the random_int will be generated up to max_value - 1
if min_value is not None and min_value < 0:
min_value += 1 # as we then append digits after the left_number
left_number = self._safe_random_int(min_value, max_value)
left_number = self._safe_random_int(
min_value, max_value, positive,
)
else:
sign = '+' if positive else self.random_element(('+', '-'))
left_number = self.random_number(left_digits)
Expand All @@ -88,16 +93,19 @@ def pyfloat(self, left_digits=None, right_digits=None, positive=False,
self.random_number(right_digits),
))

def _safe_random_int(self, min_value, max_value):
def _safe_random_int(self, min_value, max_value, positive):
orig_min_value = min_value
orig_max_value = max_value

if min_value is None:
min_value = max_value - self.random_int()
if max_value is None:
max_value = min_value + self.random_int()
if positive:
min_value = max(min_value, 0)

if min_value == max_value:
return self._safe_random_int(orig_min_value, orig_max_value)
return self._safe_random_int(orig_min_value, orig_max_value, positive)
else:
return self.random_int(min_value, max_value - 1)

Expand Down
2 changes: 1 addition & 1 deletion tests/providers/test_bank.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def setUp(self):

def test_bban(self):
bban = self.fake.bban()
assert re.match(r"\d{16}", bban)
assert re.match(r"\d{14}", bban)

def test_iban(self):
iban = self.fake.iban()
Expand Down
25 changes: 25 additions & 0 deletions tests/providers/test_python.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,31 @@ def test_max_value_should_be_greater_than_min_value(self):
message = str(raises.exception)
self.assertEqual(message, expected_message)

def test_max_value_and_positive(self):
"""
Combining the max_value and positive keyword arguments produces
numbers that obey both of those constraints.
"""

result = self.fake.pyfloat(positive=True, max_value=100)
self.assertLessEqual(result, 100)
self.assertGreaterEqual(result, 0)

def test_positive_and_min_value_incompatible(self):
"""
An exception should be raised if positive=True is set, but
a negative min_value is provided.
"""

expected_message = (
"Cannot combine positive=True and negative min_value"
)
with self.assertRaises(ValueError) as raises:
self.fake.pyfloat(min_value=-100, positive=True)

message = str(raises.exception)
self.assertEqual(message, expected_message)


class TestPystrFormat(unittest.TestCase):

Expand Down