We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Enables min and max values for pydecimal
Currently is not possible to set min or max values to `pydecimal` or `pyfloat`. It would be nice if we could pass these parameters.

If it makes senses I can open a PR.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `faker/providers/python/__init__.py`
Content:
```
1 # coding=utf-8
2 
3 from __future__ import unicode_literals
4 
5 from decimal import Decimal
6 import sys
7 
8 import six
9 
10 from .. import BaseProvider
11 
12 
13 class Provider(BaseProvider):
14     def pybool(self):
15         return self.random_int(0, 1) == 1
16 
17     def pystr(self, min_chars=None, max_chars=20):
18         """
19         Generates a random string of upper and lowercase letters.
20         :type min_chars: int
21         :type max_chars: int
22         :return: String. Random of random length between min and max characters.
23         """
24         if min_chars is None:
25             return "".join(self.random_letters(length=max_chars))
26         else:
27             assert (
28                 max_chars >= min_chars), "Maximum length must be greater than or equal to minium length"
29             return "".join(
30                 self.random_letters(
31                     length=self.generator.random.randint(min_chars, max_chars),
32                 ),
33             )
34 
35     def pyfloat(self, left_digits=None, right_digits=None, positive=False):
36         if left_digits is not None and left_digits < 0:
37             raise ValueError(
38                 'A float number cannot have less than 0 digits in its '
39                 'integer part')
40         if right_digits is not None and right_digits < 0:
41             raise ValueError(
42                 'A float number cannot have less than 0 digits in its '
43                 'fractional part')
44         if left_digits == 0 and right_digits == 0:
45             raise ValueError(
46                 'A float number cannot have less than 0 digits in total')
47 
48         left_digits = left_digits if left_digits is not None else (
49             self.random_int(1, sys.float_info.dig))
50         right_digits = right_digits if right_digits is not None else (
51             self.random_int(0, sys.float_info.dig - left_digits))
52         sign = 1 if positive else self.random_element((-1, 1))
53 
54         return float("{0}.{1}".format(
55             sign * self.random_number(left_digits),
56             self.random_number(right_digits),
57         ))
58 
59     def pyint(self):
60         return self.generator.random_int()
61 
62     def pydecimal(self, left_digits=None, right_digits=None, positive=False):
63         return Decimal(str(self.pyfloat(left_digits, right_digits, positive)))
64 
65     def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types):
66         return tuple(
67             self.pyset(
68                 nb_elements,
69                 variable_nb_elements,
70                 *value_types))
71 
72     def pyset(self, nb_elements=10, variable_nb_elements=True, *value_types):
73         return set(
74             self._pyiterable(
75                 nb_elements,
76                 variable_nb_elements,
77                 *value_types))
78 
79     def pylist(self, nb_elements=10, variable_nb_elements=True, *value_types):
80         return list(
81             self._pyiterable(
82                 nb_elements,
83                 variable_nb_elements,
84                 *value_types))
85 
86     def pyiterable(
87             self,
88             nb_elements=10,
89             variable_nb_elements=True,
90             *value_types):
91         return self.random_element([self.pylist, self.pytuple, self.pyset])(
92             nb_elements, variable_nb_elements, *value_types)
93 
94     def _random_type(self, type_list):
95         value_type = self.random_element(type_list)
96 
97         method_name = "py{0}".format(value_type)
98         if hasattr(self, method_name):
99             value_type = method_name
100 
101         return self.generator.format(value_type)
102 
103     def _pyiterable(
104             self,
105             nb_elements=10,
106             variable_nb_elements=True,
107             *value_types):
108 
109         value_types = [t if isinstance(t, six.string_types) else getattr(t, '__name__', type(t).__name__).lower()
110                        for t in value_types
111                        # avoid recursion
112                        if t not in ['iterable', 'list', 'tuple', 'dict', 'set']]
113         if not value_types:
114             value_types = ['str', 'str', 'str', 'str', 'float',
115                            'int', 'int', 'decimal', 'date_time', 'uri', 'email']
116 
117         if variable_nb_elements:
118             nb_elements = self.randomize_nb_elements(nb_elements, min=1)
119 
120         for _ in range(nb_elements):
121             yield self._random_type(value_types)
122 
123     def pydict(self, nb_elements=10, variable_nb_elements=True, *value_types):
124         """
125         Returns a dictionary.
126 
127         :nb_elements: number of elements for dictionary
128         :variable_nb_elements: is use variable number of elements for dictionary
129         :value_types: type of dictionary values
130         """
131         if variable_nb_elements:
132             nb_elements = self.randomize_nb_elements(nb_elements, min=1)
133 
134         return dict(zip(
135             self.generator.words(nb_elements),
136             self._pyiterable(nb_elements, False, *value_types),
137         ))
138 
139     def pystruct(self, count=10, *value_types):
140 
141         value_types = [t if isinstance(t, six.string_types) else getattr(t, '__name__', type(t).__name__).lower()
142                        for t in value_types
143                        # avoid recursion
144                        if t != 'struct']
145         if not value_types:
146             value_types = ['str', 'str', 'str', 'str', 'float',
147                            'int', 'int', 'decimal', 'date_time', 'uri', 'email']
148 
149         types = []
150         d = {}
151         nd = {}
152         for i in range(count):
153             d[self.generator.word()] = self._random_type(value_types)
154             types.append(self._random_type(value_types))
155             nd[self.generator.word()] = {i: self._random_type(value_types),
156                                          i + 1: [self._random_type(value_types),
157                                                  self._random_type(value_types),
158                                                  self._random_type(value_types)],
159                                          i + 2: {i: self._random_type(value_types),
160                                                  i + 1: self._random_type(value_types),
161                                                  i + 2: [self._random_type(value_types),
162                                                          self._random_type(value_types)]}}
163         return types, d, nd
164
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/faker/providers/python/__init__.py b/faker/providers/python/__init__.py
--- a/faker/providers/python/__init__.py
+++ b/faker/providers/python/__init__.py
@@ -32,7 +32,9 @@
                 ),
             )
 
-    def pyfloat(self, left_digits=None, right_digits=None, positive=False):
+    def pyfloat(self, left_digits=None, right_digits=None, positive=False,
+                min_value=None, max_value=None):
+
         if left_digits is not None and left_digits < 0:
             raise ValueError(
                 'A float number cannot have less than 0 digits in its '
@@ -44,6 +46,8 @@
         if left_digits == 0 and right_digits == 0:
             raise ValueError(
                 'A float number cannot have less than 0 digits in total')
+        if None not in (min_value, max_value) and min_value > max_value:
+            raise ValueError('Min value cannot be greater than max value')
 
         left_digits = left_digits if left_digits is not None else (
             self.random_int(1, sys.float_info.dig))
@@ -51,16 +55,30 @@
             self.random_int(0, sys.float_info.dig - left_digits))
         sign = 1 if positive else self.random_element((-1, 1))
 
+        if (min_value is not None) or (max_value is not None):
+            if min_value is None:
+                min_value = max_value - self.random_int()
+            if max_value is None:
+                max_value = min_value + self.random_int()
+
+            left_number = self.random_int(min_value, max_value)
+        else:
+            left_number = sign * self.random_number(left_digits)
+
         return float("{0}.{1}".format(
-            sign * self.random_number(left_digits),
+            left_number,
             self.random_number(right_digits),
         ))
 
     def pyint(self):
         return self.generator.random_int()
 
-    def pydecimal(self, left_digits=None, right_digits=None, positive=False):
-        return Decimal(str(self.pyfloat(left_digits, right_digits, positive)))
+    def pydecimal(self, left_digits=None, right_digits=None, positive=False,
+                  min_value=None, max_value=None):
+
+        float_ = self.pyfloat(
+            left_digits, right_digits, positive, min_value, max_value)
+        return Decimal(str(float_))
 
     def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types):
         return tuple(

{"golden_diff": "diff --git a/faker/providers/python/__init__.py b/faker/providers/python/__init__.py\n--- a/faker/providers/python/__init__.py\n+++ b/faker/providers/python/__init__.py\n@@ -32,7 +32,9 @@\n                 ),\n             )\n \n-    def pyfloat(self, left_digits=None, right_digits=None, positive=False):\n+    def pyfloat(self, left_digits=None, right_digits=None, positive=False,\n+                min_value=None, max_value=None):\n+\n         if left_digits is not None and left_digits < 0:\n             raise ValueError(\n                 'A float number cannot have less than 0 digits in its '\n@@ -44,6 +46,8 @@\n         if left_digits == 0 and right_digits == 0:\n             raise ValueError(\n                 'A float number cannot have less than 0 digits in total')\n+        if None not in (min_value, max_value) and min_value > max_value:\n+            raise ValueError('Min value cannot be greater than max value')\n \n         left_digits = left_digits if left_digits is not None else (\n             self.random_int(1, sys.float_info.dig))\n@@ -51,16 +55,30 @@\n             self.random_int(0, sys.float_info.dig - left_digits))\n         sign = 1 if positive else self.random_element((-1, 1))\n \n+        if (min_value is not None) or (max_value is not None):\n+            if min_value is None:\n+                min_value = max_value - self.random_int()\n+            if max_value is None:\n+                max_value = min_value + self.random_int()\n+\n+            left_number = self.random_int(min_value, max_value)\n+        else:\n+            left_number = sign * self.random_number(left_digits)\n+\n         return float(\"{0}.{1}\".format(\n-            sign * self.random_number(left_digits),\n+            left_number,\n             self.random_number(right_digits),\n         ))\n \n     def pyint(self):\n         return self.generator.random_int()\n \n-    def pydecimal(self, left_digits=None, right_digits=None, positive=False):\n-        return Decimal(str(self.pyfloat(left_digits, right_digits, positive)))\n+    def pydecimal(self, left_digits=None, right_digits=None, positive=False,\n+                  min_value=None, max_value=None):\n+\n+        float_ = self.pyfloat(\n+            left_digits, right_digits, positive, min_value, max_value)\n+        return Decimal(str(float_))\n \n     def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types):\n         return tuple(\n", "issue": "Enables min and max values for pydecimal\nCurrently is not possible to set min or max values to `pydecimal` or `pyfloat`. It would be nice if we could pass these parameters.\r\n\r\nIf it makes senses I can open a PR.\n", "before_files": [{"content": "# coding=utf-8\n\nfrom __future__ import unicode_literals\n\nfrom decimal import Decimal\nimport sys\n\nimport six\n\nfrom .. import BaseProvider\n\n\nclass Provider(BaseProvider):\n    def pybool(self):\n        return self.random_int(0, 1) == 1\n\n    def pystr(self, min_chars=None, max_chars=20):\n        \"\"\"\n        Generates a random string of upper and lowercase letters.\n        :type min_chars: int\n        :type max_chars: int\n        :return: String. Random of random length between min and max characters.\n        \"\"\"\n        if min_chars is None:\n            return \"\".join(self.random_letters(length=max_chars))\n        else:\n            assert (\n                max_chars >= min_chars), \"Maximum length must be greater than or equal to minium length\"\n            return \"\".join(\n                self.random_letters(\n                    length=self.generator.random.randint(min_chars, max_chars),\n                ),\n            )\n\n    def pyfloat(self, left_digits=None, right_digits=None, positive=False):\n        if left_digits is not None and left_digits < 0:\n            raise ValueError(\n                'A float number cannot have less than 0 digits in its '\n                'integer part')\n        if right_digits is not None and right_digits < 0:\n            raise ValueError(\n                'A float number cannot have less than 0 digits in its '\n                'fractional part')\n        if left_digits == 0 and right_digits == 0:\n            raise ValueError(\n                'A float number cannot have less than 0 digits in total')\n\n        left_digits = left_digits if left_digits is not None else (\n            self.random_int(1, sys.float_info.dig))\n        right_digits = right_digits if right_digits is not None else (\n            self.random_int(0, sys.float_info.dig - left_digits))\n        sign = 1 if positive else self.random_element((-1, 1))\n\n        return float(\"{0}.{1}\".format(\n            sign * self.random_number(left_digits),\n            self.random_number(right_digits),\n        ))\n\n    def pyint(self):\n        return self.generator.random_int()\n\n    def pydecimal(self, left_digits=None, right_digits=None, positive=False):\n        return Decimal(str(self.pyfloat(left_digits, right_digits, positive)))\n\n    def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        return tuple(\n            self.pyset(\n                nb_elements,\n                variable_nb_elements,\n                *value_types))\n\n    def pyset(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        return set(\n            self._pyiterable(\n                nb_elements,\n                variable_nb_elements,\n                *value_types))\n\n    def pylist(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        return list(\n            self._pyiterable(\n                nb_elements,\n                variable_nb_elements,\n                *value_types))\n\n    def pyiterable(\n            self,\n            nb_elements=10,\n            variable_nb_elements=True,\n            *value_types):\n        return self.random_element([self.pylist, self.pytuple, self.pyset])(\n            nb_elements, variable_nb_elements, *value_types)\n\n    def _random_type(self, type_list):\n        value_type = self.random_element(type_list)\n\n        method_name = \"py{0}\".format(value_type)\n        if hasattr(self, method_name):\n            value_type = method_name\n\n        return self.generator.format(value_type)\n\n    def _pyiterable(\n            self,\n            nb_elements=10,\n            variable_nb_elements=True,\n            *value_types):\n\n        value_types = [t if isinstance(t, six.string_types) else getattr(t, '__name__', type(t).__name__).lower()\n                       for t in value_types\n                       # avoid recursion\n                       if t not in ['iterable', 'list', 'tuple', 'dict', 'set']]\n        if not value_types:\n            value_types = ['str', 'str', 'str', 'str', 'float',\n                           'int', 'int', 'decimal', 'date_time', 'uri', 'email']\n\n        if variable_nb_elements:\n            nb_elements = self.randomize_nb_elements(nb_elements, min=1)\n\n        for _ in range(nb_elements):\n            yield self._random_type(value_types)\n\n    def pydict(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        \"\"\"\n        Returns a dictionary.\n\n        :nb_elements: number of elements for dictionary\n        :variable_nb_elements: is use variable number of elements for dictionary\n        :value_types: type of dictionary values\n        \"\"\"\n        if variable_nb_elements:\n            nb_elements = self.randomize_nb_elements(nb_elements, min=1)\n\n        return dict(zip(\n            self.generator.words(nb_elements),\n            self._pyiterable(nb_elements, False, *value_types),\n        ))\n\n    def pystruct(self, count=10, *value_types):\n\n        value_types = [t if isinstance(t, six.string_types) else getattr(t, '__name__', type(t).__name__).lower()\n                       for t in value_types\n                       # avoid recursion\n                       if t != 'struct']\n        if not value_types:\n            value_types = ['str', 'str', 'str', 'str', 'float',\n                           'int', 'int', 'decimal', 'date_time', 'uri', 'email']\n\n        types = []\n        d = {}\n        nd = {}\n        for i in range(count):\n            d[self.generator.word()] = self._random_type(value_types)\n            types.append(self._random_type(value_types))\n            nd[self.generator.word()] = {i: self._random_type(value_types),\n                                         i + 1: [self._random_type(value_types),\n                                                 self._random_type(value_types),\n                                                 self._random_type(value_types)],\n                                         i + 2: {i: self._random_type(value_types),\n                                                 i + 1: self._random_type(value_types),\n                                                 i + 2: [self._random_type(value_types),\n                                                         self._random_type(value_types)]}}\n        return types, d, nd\n", "path": "faker/providers/python/__init__.py"}], "after_files": [{"content": "# coding=utf-8\n\nfrom __future__ import unicode_literals\n\nfrom decimal import Decimal\nimport sys\n\nimport six\n\nfrom .. import BaseProvider\n\n\nclass Provider(BaseProvider):\n    def pybool(self):\n        return self.random_int(0, 1) == 1\n\n    def pystr(self, min_chars=None, max_chars=20):\n        \"\"\"\n        Generates a random string of upper and lowercase letters.\n        :type min_chars: int\n        :type max_chars: int\n        :return: String. Random of random length between min and max characters.\n        \"\"\"\n        if min_chars is None:\n            return \"\".join(self.random_letters(length=max_chars))\n        else:\n            assert (\n                max_chars >= min_chars), \"Maximum length must be greater than or equal to minium length\"\n            return \"\".join(\n                self.random_letters(\n                    length=self.generator.random.randint(min_chars, max_chars),\n                ),\n            )\n\n    def pyfloat(self, left_digits=None, right_digits=None, positive=False,\n                min_value=None, max_value=None):\n\n        if left_digits is not None and left_digits < 0:\n            raise ValueError(\n                'A float number cannot have less than 0 digits in its '\n                'integer part')\n        if right_digits is not None and right_digits < 0:\n            raise ValueError(\n                'A float number cannot have less than 0 digits in its '\n                'fractional part')\n        if left_digits == 0 and right_digits == 0:\n            raise ValueError(\n                'A float number cannot have less than 0 digits in total')\n        if None not in (min_value, max_value) and min_value > max_value:\n            raise ValueError('Min value cannot be greater than max value')\n\n        left_digits = left_digits if left_digits is not None else (\n            self.random_int(1, sys.float_info.dig))\n        right_digits = right_digits if right_digits is not None else (\n            self.random_int(0, sys.float_info.dig - left_digits))\n        sign = 1 if positive else self.random_element((-1, 1))\n\n        if (min_value is not None) or (max_value is not None):\n            if min_value is None:\n                min_value = max_value - self.random_int()\n            if max_value is None:\n                max_value = min_value + self.random_int()\n\n            left_number = self.random_int(min_value, max_value)\n        else:\n            left_number = sign * self.random_number(left_digits)\n\n        return float(\"{0}.{1}\".format(\n            left_number,\n            self.random_number(right_digits),\n        ))\n\n    def pyint(self):\n        return self.generator.random_int()\n\n    def pydecimal(self, left_digits=None, right_digits=None, positive=False,\n                  min_value=None, max_value=None):\n\n        float_ = self.pyfloat(\n            left_digits, right_digits, positive, min_value, max_value)\n        return Decimal(str(float_))\n\n    def pytuple(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        return tuple(\n            self.pyset(\n                nb_elements,\n                variable_nb_elements,\n                *value_types))\n\n    def pyset(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        return set(\n            self._pyiterable(\n                nb_elements,\n                variable_nb_elements,\n                *value_types))\n\n    def pylist(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        return list(\n            self._pyiterable(\n                nb_elements,\n                variable_nb_elements,\n                *value_types))\n\n    def pyiterable(\n            self,\n            nb_elements=10,\n            variable_nb_elements=True,\n            *value_types):\n        return self.random_element([self.pylist, self.pytuple, self.pyset])(\n            nb_elements, variable_nb_elements, *value_types)\n\n    def _random_type(self, type_list):\n        value_type = self.random_element(type_list)\n\n        method_name = \"py{0}\".format(value_type)\n        if hasattr(self, method_name):\n            value_type = method_name\n\n        return self.generator.format(value_type)\n\n    def _pyiterable(\n            self,\n            nb_elements=10,\n            variable_nb_elements=True,\n            *value_types):\n\n        value_types = [t if isinstance(t, six.string_types) else getattr(t, '__name__', type(t).__name__).lower()\n                       for t in value_types\n                       # avoid recursion\n                       if t not in ['iterable', 'list', 'tuple', 'dict', 'set']]\n        if not value_types:\n            value_types = ['str', 'str', 'str', 'str', 'float',\n                           'int', 'int', 'decimal', 'date_time', 'uri', 'email']\n\n        if variable_nb_elements:\n            nb_elements = self.randomize_nb_elements(nb_elements, min=1)\n\n        for _ in range(nb_elements):\n            yield self._random_type(value_types)\n\n    def pydict(self, nb_elements=10, variable_nb_elements=True, *value_types):\n        \"\"\"\n        Returns a dictionary.\n\n        :nb_elements: number of elements for dictionary\n        :variable_nb_elements: is use variable number of elements for dictionary\n        :value_types: type of dictionary values\n        \"\"\"\n        if variable_nb_elements:\n            nb_elements = self.randomize_nb_elements(nb_elements, min=1)\n\n        return dict(zip(\n            self.generator.words(nb_elements),\n            self._pyiterable(nb_elements, False, *value_types),\n        ))\n\n    def pystruct(self, count=10, *value_types):\n\n        value_types = [t if isinstance(t, six.string_types) else getattr(t, '__name__', type(t).__name__).lower()\n                       for t in value_types\n                       # avoid recursion\n                       if t != 'struct']\n        if not value_types:\n            value_types = ['str', 'str', 'str', 'str', 'float',\n                           'int', 'int', 'decimal', 'date_time', 'uri', 'email']\n\n        types = []\n        d = {}\n        nd = {}\n        for i in range(count):\n            d[self.generator.word()] = self._random_type(value_types)\n            types.append(self._random_type(value_types))\n            nd[self.generator.word()] = {i: self._random_type(value_types),\n                                         i + 1: [self._random_type(value_types),\n                                                 self._random_type(value_types),\n                                                 self._random_type(value_types)],\n                                         i + 2: {i: self._random_type(value_types),\n                                                 i + 1: self._random_type(value_types),\n                                                 i + 2: [self._random_type(value_types),\n                                                         self._random_type(value_types)]}}\n        return types, d, nd\n", "path": "faker/providers/python/__init__.py"}]}