(func, resultclass, number=None, **kwargs)
| 113 | |
| 114 | |
| 115 | def lazy_number(func, resultclass, number=None, **kwargs): |
| 116 | if isinstance(number, int): |
| 117 | kwargs["number"] = number |
| 118 | proxy = lazy(func, resultclass)(**kwargs) |
| 119 | else: |
| 120 | original_kwargs = kwargs.copy() |
| 121 | |
| 122 | class NumberAwareString(resultclass): |
| 123 | def __bool__(self): |
| 124 | return bool(kwargs["singular"]) |
| 125 | |
| 126 | def _get_number_value(self, values): |
| 127 | try: |
| 128 | return values[number] |
| 129 | except KeyError: |
| 130 | raise KeyError( |
| 131 | "Your dictionary lacks key '%s'. Please provide " |
| 132 | "it, because it is required to determine whether " |
| 133 | "string is singular or plural." % number |
| 134 | ) |
| 135 | |
| 136 | def _translate(self, number_value): |
| 137 | kwargs["number"] = number_value |
| 138 | return func(**kwargs) |
| 139 | |
| 140 | def format(self, *args, **kwargs): |
| 141 | number_value = ( |
| 142 | self._get_number_value(kwargs) if kwargs and number else args[0] |
| 143 | ) |
| 144 | return self._translate(number_value).format(*args, **kwargs) |
| 145 | |
| 146 | def __mod__(self, rhs): |
| 147 | if isinstance(rhs, dict) and number: |
| 148 | number_value = self._get_number_value(rhs) |
| 149 | else: |
| 150 | number_value = rhs |
| 151 | translated = self._translate(number_value) |
| 152 | try: |
| 153 | translated %= rhs |
| 154 | except TypeError: |
| 155 | # String doesn't contain a placeholder for the number. |
| 156 | pass |
| 157 | return translated |
| 158 | |
| 159 | proxy = lazy(lambda **kwargs: NumberAwareString(), NumberAwareString)(**kwargs) |
| 160 | proxy.__reduce__ = lambda: ( |
| 161 | _lazy_number_unpickle, |
| 162 | (func, resultclass, number, original_kwargs), |
| 163 | ) |
| 164 | return proxy |
| 165 | |
| 166 | |
| 167 | def _lazy_number_unpickle(func, resultclass, number, kwargs): |
no test coverage detected