From 36689f679e53f2d2eef1588fb73728838ded2278 Mon Sep 17 00:00:00 2001 From: Bharadwaj Date: Fri, 28 Oct 2016 03:23:37 +0000 Subject: [PATCH] Added number.random_() method --- CHANGELOG.rst | 1 + docs/example.rst | 13 +++++++++++++ sugar/__init__.py | 4 ++++ sugar/arrays.py | 2 +- sugar/number.py | 46 ++++++++++++++++++++++++++++++++++++++++++++ tests/test_number.py | 17 ++++++++++++++++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 sugar/number.py create mode 100644 tests/test_number.py diff --git a/CHANGELOG.rst b/CHANGELOG.rst index fba54d7..723de3b 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -20,6 +20,7 @@ Changelog - Add ``is_number()``. - Add ``is_string()``. - Add ``last()``. +- Add ``random_()``. v0.1.1 (2016-10-10) diff --git a/docs/example.rst b/docs/example.rst index 22c2e27..5271b81 100644 --- a/docs/example.rst +++ b/docs/example.rst @@ -140,3 +140,16 @@ Arrays >>> _.subtract([1, 2, 3], 4) [1, 2, 3] +Numbers +------- + +.. code-block:: python + + >>> import sugar as _ + + >>> result = random_(5, 6) + >>> assert 5 <= result <= 6 + >>> result = random_(5) + >>> assert 0 <= result <= 5 + + \ No newline at end of file diff --git a/sugar/__init__.py b/sugar/__init__.py index a20cecf..0997747 100644 --- a/sugar/__init__.py +++ b/sugar/__init__.py @@ -32,6 +32,10 @@ subtract ) +from .number import ( + random_ +) + from .predicates import ( is_array, is_boolean, diff --git a/sugar/arrays.py b/sugar/arrays.py index ce5b62a..00fc453 100644 --- a/sugar/arrays.py +++ b/sugar/arrays.py @@ -516,7 +516,7 @@ def subtract(array, item): return [element for element in array if element not in item] # -# Utility methods not a part of the main API +# Helper methods not a part of the main API # diff --git a/sugar/number.py b/sugar/number.py new file mode 100644 index 0000000..647e8f2 --- /dev/null +++ b/sugar/number.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- + +from __future__ import absolute_import + +import sys +import random +import math + + +def random_(n1=None, n2=None): + """Returns a random integer/float from :attr:`n1` to :attr:`n2` (both + inclusive) + + Args: + n1 (int/float/str): Value given by the user. + n2 (int/float/str): Value given by the user. + + Returns: + int/float: Random integer/float value between :attr:`n1` and + :attr:`n2`. + + Example: + + >>> result = random_(5, 6) + >>> assert 5 <= result <= 6 + >>> result = random_(5) + >>> assert 0 <= result <= 5 + + .. versionadded:: TODO + """ + n1 = 0 if not n1 else n1 + n2 = 0 if not n2 else n2 + + n1 = float(n1) + n2 = float(n2) + + max_value = max(n1, n2) + min_value = min(n1, n2) + diff = max_value - min_value + + result = (random.random() * diff) + min_value + + if diff <= 1 or (diff > 1 and math.ceil(result) > max_value): + return round(result, 2) + else: + return math.ceil(result) diff --git a/tests/test_number.py b/tests/test_number.py new file mode 100644 index 0000000..85b0cfc --- /dev/null +++ b/tests/test_number.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- + +from .fixtures import parametrize + +import sugar as _ +import time + + +@parametrize('args', [ + (0, 5), + (2, 5), + (-6, 0), + (5.5, 11.7), + (5.5, 6.5) +]) +def test_random(args): + assert args[0] <= _.random_(*args) <= args[1]