Skip to content

Commit ba61278

Browse files
mikelyncattack68
andauthored
CLN: typing and CI clean ups (#185) (#1106)
Co-authored-by: Mike Lync <[email protected]> Co-authored-by: JHM Darbyshire <[email protected]> Co-authored-by: JHM Darbyshire (M1) <[email protected]>
1 parent 3bd35bb commit ba61278

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+668
-593
lines changed

pyproject.toml

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ ignore = [
137137

138138
[tool.ruff.lint.per-file-ignores]
139139
"__init__.py" = ["E402", "N801"]
140-
"typing.py" = ["E501"]
140+
"typing.py" = ["E501", "E402"]
141141
"python/tests/*" = ["F401", "B", "N", "S", "ANN", "D"]
142142
"rust/*" = ["D"]
143143

@@ -149,9 +149,7 @@ max-complexity = 14
149149
files = ["python/"]
150150
exclude = [
151151
"python/tests",
152-
"/instruments/components/bonds",
153-
"/instruments/fx_options",
154-
# "/instruments/components/protocols",
152+
# "/instruments/bonds/bond_future.py",
155153
]
156154
strict = true
157155
#packages = [
@@ -163,12 +161,3 @@ omit = [
163161
"/typing.py",
164162
# "python/tests/*"
165163
]
166-
167-
[tool.isort]
168-
profile = "black"
169-
line_length = 100
170-
src_paths = ["python"]
171-
172-
[tool.black]
173-
line-length = 100
174-
target-version = ['py310']

python/rateslib/curves/curves.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2982,7 +2982,7 @@ def _try_index_value(
29822982
return _index_value_from_mixed_series_and_curve(
29832983
index_lag=index_lag,
29842984
index_method=index_method,
2985-
index_fixings=fixings_series[1], # type: ignore[arg-type]
2985+
index_fixings=fixings_series[1],
29862986
index_date=index_date,
29872987
index_curve=index_curve,
29882988
)

python/rateslib/curves/rs.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@
2525
from rateslib.scheduling.convention import _get_convention
2626

2727
if TYPE_CHECKING:
28-
from rateslib.typing import CalInput, CurveInterpolator, DualTypes, Number
28+
from rateslib.typing import ( # pragma: no cover
29+
CalInput,
30+
CurveInterpolator,
31+
DualTypes,
32+
Number,
33+
)
2934

3035

3136
class CurveRs:

python/rateslib/instruments/bonds/bill.py

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from typing import TYPE_CHECKING
44

55
from rateslib import defaults
6+
from rateslib.curves._parsers import _validate_obj_not_no_input
67
from rateslib.dual import Variable, gradient
78
from rateslib.dual.utils import _dual_float, _to_number
89
from rateslib.enums.generics import NoInput, _drb
@@ -15,7 +16,7 @@
1516
from rateslib.instruments.protocols.kwargs import _convert_to_schedule_kwargs, _KWArgs
1617
from rateslib.instruments.protocols.pricing import (
1718
_Curves,
18-
_maybe_get_curve_or_dict_maybe_from_solver,
19+
_maybe_get_curve_maybe_from_solver,
1920
_Vol,
2021
)
2122
from rateslib.legs import FixedLeg
@@ -24,12 +25,12 @@
2425
if TYPE_CHECKING:
2526
from rateslib.typing import ( # pragma: no cover
2627
CalInput,
27-
CurveOption_,
28-
Curves_,
28+
CurvesT_,
2929
DualTypes,
3030
DualTypes_,
3131
FXForwards_,
3232
Number,
33+
Sequence,
3334
Solver_,
3435
VolT_,
3536
_BaseLeg,
@@ -200,7 +201,7 @@ def leg1(self) -> FixedLeg:
200201
return self._leg1
201202

202203
@property
203-
def legs(self) -> list[_BaseLeg]:
204+
def legs(self) -> Sequence[_BaseLeg]:
204205
"""A list of the *Legs* of the *Instrument*."""
205206
return self._legs
206207

@@ -217,7 +218,7 @@ def __init__(
217218
convention: str_ = NoInput(0),
218219
settle: int_ = NoInput(0),
219220
calc_mode: BillCalcMode | str_ = NoInput(0),
220-
curves: Curves_ = NoInput(0),
221+
curves: CurvesT_ = NoInput(0),
221222
spec: str_ = NoInput(0),
222223
metric: str = "price",
223224
):
@@ -271,7 +272,7 @@ def __init__(
271272
def _parse_vol(self, vol: VolT_) -> _Vol:
272273
return _Vol()
273274

274-
def _parse_curves(self, curves: CurveOption_) -> _Curves:
275+
def _parse_curves(self, curves: CurvesT_) -> _Curves:
275276
"""
276277
A Bill has one curve requirements: a disc_curve.
277278
@@ -298,23 +299,25 @@ def _parse_curves(self, curves: CurveOption_) -> _Curves:
298299
raise ValueError(
299300
f"{type(self).__name__} requires only 1 curve types. Got {len(curves)}."
300301
)
302+
elif isinstance(curves, _Curves):
303+
return curves
301304
else: # `curves` is just a single input which is copied across all curves
302305
return _Curves(
303-
disc_curve=curves,
306+
disc_curve=curves, # type: ignore[arg-type]
304307
)
305308

306309
def rate(
307310
self,
308311
*,
309-
curves: Curves_ = NoInput(0),
312+
curves: CurvesT_ = NoInput(0),
310313
solver: Solver_ = NoInput(0),
311314
fx: FXForwards_ = NoInput(0),
312315
vol: VolT_ = NoInput(0),
313316
base: str_ = NoInput(0),
314317
settlement: datetime_ = NoInput(0),
315318
forward: datetime_ = NoInput(0),
316319
metric: str_ = NoInput(0),
317-
) -> DualTypes_:
320+
) -> DualTypes:
318321
"""
319322
Return various pricing metrics of the security calculated from
320323
:class:`~rateslib.curves.Curve` s.
@@ -345,17 +348,20 @@ def rate(
345348
-------
346349
float, Dual, Dual2
347350
"""
348-
disc_curve_ = _maybe_get_curve_or_dict_maybe_from_solver(
349-
solver=solver,
350-
name="disc_curve",
351-
curves=self._parse_curves(curves),
352-
curves_meta=self.kwargs.meta["curves"],
351+
disc_curve_ = _validate_obj_not_no_input(
352+
_maybe_get_curve_maybe_from_solver(
353+
solver=solver,
354+
name="disc_curve",
355+
curves=self._parse_curves(curves),
356+
curves_meta=self.kwargs.meta["curves"],
357+
),
358+
"disc_curve",
353359
)
354360
settlement_ = self._maybe_get_settlement(settlement=settlement, disc_curve=disc_curve_)
355361

356362
# scale price to par 100 and make a fwd adjustment according to curve
357363
price = (
358-
self.npv(curves=curves, solver=solver, fx=fx, base=base, local=False)
364+
self.npv(curves=curves, solver=solver, local=False) # type: ignore[operator]
359365
* 100
360366
/ (-self.leg1.settlement_params.notional * disc_curve_[settlement_])
361367
)
@@ -387,7 +393,7 @@ def simple_rate(self, price: DualTypes, settlement: datetime) -> DualTypes:
387393
"""
388394
acc_frac = self.kwargs.meta["calc_mode"]._settle_accrual(self, settlement, 0)
389395
dcf = (1 - acc_frac) * self.leg1._regular_periods[0].period_params.dcf
390-
return ((100 / price - 1) / dcf) * 100
396+
return ((100 / price - 1) / dcf) * 100 # type: ignore[no-any-return]
391397

392398
def discount_rate(self, price: DualTypes, settlement: datetime) -> DualTypes:
393399
"""
@@ -407,7 +413,7 @@ def discount_rate(self, price: DualTypes, settlement: datetime) -> DualTypes:
407413
acc_frac = self.kwargs.meta["calc_mode"]._settle_accrual(self, settlement, 0)
408414
dcf = (1 - acc_frac) * self.leg1._regular_periods[0].period_params.dcf
409415
rate = ((1 - price / 100) / dcf) * 100
410-
return rate
416+
return rate # type: ignore[no-any-return]
411417

412418
def price(
413419
self,
@@ -444,14 +450,14 @@ def price(
444450
def _price_discount(self, rate: DualTypes, settlement: datetime) -> DualTypes:
445451
acc_frac = self.kwargs.meta["calc_mode"]._settle_accrual(self, settlement, 0)
446452
dcf = (1 - acc_frac) * self.leg1._regular_periods[0].period_params.dcf
447-
return 100 - rate * dcf
453+
return 100 - rate * dcf # type: ignore[no-any-return]
448454

449455
def _price_simple(self, rate: DualTypes, settlement: datetime) -> DualTypes:
450456
acc_frac = self.kwargs.meta["calc_mode"]._settle_accrual(self, settlement, 0)
451457
dcf = (1 - acc_frac) * self.leg1._regular_periods[0].period_params.dcf
452-
return 100 / (1 + rate * dcf / 100)
458+
return 100 / (1 + rate * dcf / 100) # type: ignore[no-any-return]
453459

454-
def ytm(
460+
def ytm( # type: ignore[override]
455461
self,
456462
price: DualTypes,
457463
settlement: datetime,
@@ -492,11 +498,11 @@ def ytm(
492498
while quasi_ustart > settlement:
493499
quasi_ustart = frequency.uprevious(quasi_ustart)
494500

495-
equiv_bond = FixedRateBond(
501+
equiv_bond = FixedRateBond( # type: ignore[abstract]
496502
effective=quasi_ustart,
497503
termination=self.leg1.schedule.utermination,
498504
fixed_rate=0.0,
499-
**calc_mode_._ytm_clone_kwargs,
505+
**calc_mode_._ytm_clone_kwargs, # type: ignore[arg-type]
500506
)
501507
return equiv_bond.ytm(price, settlement)
502508

@@ -527,9 +533,7 @@ def duration(self, ytm: DualTypes, settlement: datetime, metric: str = "risk") -
527533
# TODO: this is not AD safe: returns only float
528534
ytm_: float = _dual_float(ytm)
529535
if metric == "duration":
530-
price_: Dual | Dual2 = _to_number( # type: ignore[assignment]
531-
self.price(Variable(ytm_, ["y"]), settlement, dirty=True)
532-
)
536+
price_ = _to_number(self.price(Variable(ytm_, ["y"]), settlement, dirty=True))
533537
freq = _get_frequency(
534538
self.kwargs.meta["frequency"],
535539
self.leg1.schedule.utermination.day,

0 commit comments

Comments
 (0)