policyengine-api-simulation-client 0.20251210.56__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. policyengine_api_simulation_client/__init__.py +8 -0
  2. policyengine_api_simulation_client/api/__init__.py +1 -0
  3. policyengine_api_simulation_client/api/default/__init__.py +1 -0
  4. policyengine_api_simulation_client/api/default/alive_ping_alive_get.py +139 -0
  5. policyengine_api_simulation_client/api/default/ping_ping_post.py +174 -0
  6. policyengine_api_simulation_client/api/default/simulate_simulate_economy_comparison_post.py +166 -0
  7. policyengine_api_simulation_client/api/default/started_ping_started_get.py +129 -0
  8. policyengine_api_simulation_client/client.py +268 -0
  9. policyengine_api_simulation_client/errors.py +16 -0
  10. policyengine_api_simulation_client/models/__init__.py +109 -0
  11. policyengine_api_simulation_client/models/age_group_baseline_reform_values.py +91 -0
  12. policyengine_api_simulation_client/models/baseline_reform_values.py +69 -0
  13. policyengine_api_simulation_client/models/budgetary_impact.py +101 -0
  14. policyengine_api_simulation_client/models/cliff_impact.py +75 -0
  15. policyengine_api_simulation_client/models/cliff_impact_in_simulation.py +69 -0
  16. policyengine_api_simulation_client/models/decile_impact.py +77 -0
  17. policyengine_api_simulation_client/models/decile_impact_average.py +46 -0
  18. policyengine_api_simulation_client/models/decile_impact_relative.py +46 -0
  19. policyengine_api_simulation_client/models/economy_comparison.py +338 -0
  20. policyengine_api_simulation_client/models/economy_comparison_detailed_budget_type_0.py +59 -0
  21. policyengine_api_simulation_client/models/gender_baseline_reform_values.py +75 -0
  22. policyengine_api_simulation_client/models/health_status.py +83 -0
  23. policyengine_api_simulation_client/models/hours_response.py +93 -0
  24. policyengine_api_simulation_client/models/http_validation_error.py +79 -0
  25. policyengine_api_simulation_client/models/inequality_impact.py +83 -0
  26. policyengine_api_simulation_client/models/intra_decile_impact.py +77 -0
  27. policyengine_api_simulation_client/models/intra_decile_impact_all.py +46 -0
  28. policyengine_api_simulation_client/models/intra_decile_impact_deciles.py +53 -0
  29. policyengine_api_simulation_client/models/intra_wealth_decile_impact_with_values.py +77 -0
  30. policyengine_api_simulation_client/models/intra_wealth_decile_impact_with_values_all.py +46 -0
  31. policyengine_api_simulation_client/models/intra_wealth_decile_impact_with_values_deciles.py +53 -0
  32. policyengine_api_simulation_client/models/labor_supply_response.py +119 -0
  33. policyengine_api_simulation_client/models/labor_supply_response_decile.py +63 -0
  34. policyengine_api_simulation_client/models/labor_supply_response_decile_additional_property.py +65 -0
  35. policyengine_api_simulation_client/models/labor_supply_response_decile_additional_property_additional_property.py +46 -0
  36. policyengine_api_simulation_client/models/labor_supply_response_relative_lsr.py +46 -0
  37. policyengine_api_simulation_client/models/parameter_change_dict.py +53 -0
  38. policyengine_api_simulation_client/models/parametric_reform.py +80 -0
  39. policyengine_api_simulation_client/models/ping_request.py +61 -0
  40. policyengine_api_simulation_client/models/ping_response.py +61 -0
  41. policyengine_api_simulation_client/models/poverty_gender_breakdown.py +75 -0
  42. policyengine_api_simulation_client/models/poverty_impact.py +75 -0
  43. policyengine_api_simulation_client/models/poverty_racial_breakdown_with_values.py +67 -0
  44. policyengine_api_simulation_client/models/probe_status.py +91 -0
  45. policyengine_api_simulation_client/models/program_specific_impact.py +77 -0
  46. policyengine_api_simulation_client/models/racial_baseline_reform_values.py +91 -0
  47. policyengine_api_simulation_client/models/simulation_options.py +309 -0
  48. policyengine_api_simulation_client/models/simulation_options_country.py +9 -0
  49. policyengine_api_simulation_client/models/simulation_options_data_type_1.py +46 -0
  50. policyengine_api_simulation_client/models/simulation_options_scope.py +9 -0
  51. policyengine_api_simulation_client/models/system_status.py +91 -0
  52. policyengine_api_simulation_client/models/uk_constituency_breakdown_by_constituency.py +85 -0
  53. policyengine_api_simulation_client/models/uk_constituency_breakdown_with_values.py +85 -0
  54. policyengine_api_simulation_client/models/uk_constituency_breakdown_with_values_by_constituency.py +59 -0
  55. policyengine_api_simulation_client/models/uk_constituency_breakdown_with_values_outcomes_by_region.py +67 -0
  56. policyengine_api_simulation_client/models/uk_constituency_breakdown_with_values_outcomes_by_region_additional_property.py +46 -0
  57. policyengine_api_simulation_client/models/validation_error.py +90 -0
  58. policyengine_api_simulation_client/models/wealth_decile_impact_with_values.py +77 -0
  59. policyengine_api_simulation_client/models/wealth_decile_impact_with_values_average.py +46 -0
  60. policyengine_api_simulation_client/models/wealth_decile_impact_with_values_relative.py +46 -0
  61. policyengine_api_simulation_client/py.typed +1 -0
  62. policyengine_api_simulation_client/types.py +54 -0
  63. policyengine_api_simulation_client-0.20251210.56.dist-info/METADATA +141 -0
  64. policyengine_api_simulation_client-0.20251210.56.dist-info/RECORD +65 -0
  65. policyengine_api_simulation_client-0.20251210.56.dist-info/WHEEL +4 -0
@@ -0,0 +1,75 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import TYPE_CHECKING, Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ if TYPE_CHECKING:
10
+ from ..models.cliff_impact_in_simulation import CliffImpactInSimulation
11
+
12
+
13
+ T = TypeVar("T", bound="CliffImpact")
14
+
15
+
16
+ @_attrs_define
17
+ class CliffImpact:
18
+ """
19
+ Attributes:
20
+ baseline (CliffImpactInSimulation):
21
+ reform (CliffImpactInSimulation):
22
+ """
23
+
24
+ baseline: CliffImpactInSimulation
25
+ reform: CliffImpactInSimulation
26
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
27
+
28
+ def to_dict(self) -> dict[str, Any]:
29
+ baseline = self.baseline.to_dict()
30
+
31
+ reform = self.reform.to_dict()
32
+
33
+ field_dict: dict[str, Any] = {}
34
+ field_dict.update(self.additional_properties)
35
+ field_dict.update(
36
+ {
37
+ "baseline": baseline,
38
+ "reform": reform,
39
+ }
40
+ )
41
+
42
+ return field_dict
43
+
44
+ @classmethod
45
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
46
+ from ..models.cliff_impact_in_simulation import CliffImpactInSimulation
47
+
48
+ d = dict(src_dict)
49
+ baseline = CliffImpactInSimulation.from_dict(d.pop("baseline"))
50
+
51
+ reform = CliffImpactInSimulation.from_dict(d.pop("reform"))
52
+
53
+ cliff_impact = cls(
54
+ baseline=baseline,
55
+ reform=reform,
56
+ )
57
+
58
+ cliff_impact.additional_properties = d
59
+ return cliff_impact
60
+
61
+ @property
62
+ def additional_keys(self) -> list[str]:
63
+ return list(self.additional_properties.keys())
64
+
65
+ def __getitem__(self, key: str) -> Any:
66
+ return self.additional_properties[key]
67
+
68
+ def __setitem__(self, key: str, value: Any) -> None:
69
+ self.additional_properties[key] = value
70
+
71
+ def __delitem__(self, key: str) -> None:
72
+ del self.additional_properties[key]
73
+
74
+ def __contains__(self, key: str) -> bool:
75
+ return key in self.additional_properties
@@ -0,0 +1,69 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ T = TypeVar("T", bound="CliffImpactInSimulation")
10
+
11
+
12
+ @_attrs_define
13
+ class CliffImpactInSimulation:
14
+ """
15
+ Attributes:
16
+ cliff_gap (float):
17
+ cliff_share (float):
18
+ """
19
+
20
+ cliff_gap: float
21
+ cliff_share: float
22
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
23
+
24
+ def to_dict(self) -> dict[str, Any]:
25
+ cliff_gap = self.cliff_gap
26
+
27
+ cliff_share = self.cliff_share
28
+
29
+ field_dict: dict[str, Any] = {}
30
+ field_dict.update(self.additional_properties)
31
+ field_dict.update(
32
+ {
33
+ "cliff_gap": cliff_gap,
34
+ "cliff_share": cliff_share,
35
+ }
36
+ )
37
+
38
+ return field_dict
39
+
40
+ @classmethod
41
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
42
+ d = dict(src_dict)
43
+ cliff_gap = d.pop("cliff_gap")
44
+
45
+ cliff_share = d.pop("cliff_share")
46
+
47
+ cliff_impact_in_simulation = cls(
48
+ cliff_gap=cliff_gap,
49
+ cliff_share=cliff_share,
50
+ )
51
+
52
+ cliff_impact_in_simulation.additional_properties = d
53
+ return cliff_impact_in_simulation
54
+
55
+ @property
56
+ def additional_keys(self) -> list[str]:
57
+ return list(self.additional_properties.keys())
58
+
59
+ def __getitem__(self, key: str) -> Any:
60
+ return self.additional_properties[key]
61
+
62
+ def __setitem__(self, key: str, value: Any) -> None:
63
+ self.additional_properties[key] = value
64
+
65
+ def __delitem__(self, key: str) -> None:
66
+ del self.additional_properties[key]
67
+
68
+ def __contains__(self, key: str) -> bool:
69
+ return key in self.additional_properties
@@ -0,0 +1,77 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import TYPE_CHECKING, Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ if TYPE_CHECKING:
10
+ from ..models.decile_impact_average import DecileImpactAverage
11
+ from ..models.decile_impact_relative import DecileImpactRelative
12
+
13
+
14
+ T = TypeVar("T", bound="DecileImpact")
15
+
16
+
17
+ @_attrs_define
18
+ class DecileImpact:
19
+ """
20
+ Attributes:
21
+ relative (DecileImpactRelative):
22
+ average (DecileImpactAverage):
23
+ """
24
+
25
+ relative: DecileImpactRelative
26
+ average: DecileImpactAverage
27
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
28
+
29
+ def to_dict(self) -> dict[str, Any]:
30
+ relative = self.relative.to_dict()
31
+
32
+ average = self.average.to_dict()
33
+
34
+ field_dict: dict[str, Any] = {}
35
+ field_dict.update(self.additional_properties)
36
+ field_dict.update(
37
+ {
38
+ "relative": relative,
39
+ "average": average,
40
+ }
41
+ )
42
+
43
+ return field_dict
44
+
45
+ @classmethod
46
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
47
+ from ..models.decile_impact_average import DecileImpactAverage
48
+ from ..models.decile_impact_relative import DecileImpactRelative
49
+
50
+ d = dict(src_dict)
51
+ relative = DecileImpactRelative.from_dict(d.pop("relative"))
52
+
53
+ average = DecileImpactAverage.from_dict(d.pop("average"))
54
+
55
+ decile_impact = cls(
56
+ relative=relative,
57
+ average=average,
58
+ )
59
+
60
+ decile_impact.additional_properties = d
61
+ return decile_impact
62
+
63
+ @property
64
+ def additional_keys(self) -> list[str]:
65
+ return list(self.additional_properties.keys())
66
+
67
+ def __getitem__(self, key: str) -> Any:
68
+ return self.additional_properties[key]
69
+
70
+ def __setitem__(self, key: str, value: Any) -> None:
71
+ self.additional_properties[key] = value
72
+
73
+ def __delitem__(self, key: str) -> None:
74
+ del self.additional_properties[key]
75
+
76
+ def __contains__(self, key: str) -> bool:
77
+ return key in self.additional_properties
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ T = TypeVar("T", bound="DecileImpactAverage")
10
+
11
+
12
+ @_attrs_define
13
+ class DecileImpactAverage:
14
+ """ """
15
+
16
+ additional_properties: dict[str, float] = _attrs_field(init=False, factory=dict)
17
+
18
+ def to_dict(self) -> dict[str, Any]:
19
+ field_dict: dict[str, Any] = {}
20
+ field_dict.update(self.additional_properties)
21
+
22
+ return field_dict
23
+
24
+ @classmethod
25
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
26
+ d = dict(src_dict)
27
+ decile_impact_average = cls()
28
+
29
+ decile_impact_average.additional_properties = d
30
+ return decile_impact_average
31
+
32
+ @property
33
+ def additional_keys(self) -> list[str]:
34
+ return list(self.additional_properties.keys())
35
+
36
+ def __getitem__(self, key: str) -> float:
37
+ return self.additional_properties[key]
38
+
39
+ def __setitem__(self, key: str, value: float) -> None:
40
+ self.additional_properties[key] = value
41
+
42
+ def __delitem__(self, key: str) -> None:
43
+ del self.additional_properties[key]
44
+
45
+ def __contains__(self, key: str) -> bool:
46
+ return key in self.additional_properties
@@ -0,0 +1,46 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import Any, TypeVar
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ T = TypeVar("T", bound="DecileImpactRelative")
10
+
11
+
12
+ @_attrs_define
13
+ class DecileImpactRelative:
14
+ """ """
15
+
16
+ additional_properties: dict[str, float] = _attrs_field(init=False, factory=dict)
17
+
18
+ def to_dict(self) -> dict[str, Any]:
19
+ field_dict: dict[str, Any] = {}
20
+ field_dict.update(self.additional_properties)
21
+
22
+ return field_dict
23
+
24
+ @classmethod
25
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
26
+ d = dict(src_dict)
27
+ decile_impact_relative = cls()
28
+
29
+ decile_impact_relative.additional_properties = d
30
+ return decile_impact_relative
31
+
32
+ @property
33
+ def additional_keys(self) -> list[str]:
34
+ return list(self.additional_properties.keys())
35
+
36
+ def __getitem__(self, key: str) -> float:
37
+ return self.additional_properties[key]
38
+
39
+ def __setitem__(self, key: str, value: float) -> None:
40
+ self.additional_properties[key] = value
41
+
42
+ def __delitem__(self, key: str) -> None:
43
+ del self.additional_properties[key]
44
+
45
+ def __contains__(self, key: str) -> bool:
46
+ return key in self.additional_properties
@@ -0,0 +1,338 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+ from typing import TYPE_CHECKING, Any, TypeVar, cast
5
+
6
+ from attrs import define as _attrs_define
7
+ from attrs import field as _attrs_field
8
+
9
+ from ..types import UNSET, Unset
10
+
11
+ if TYPE_CHECKING:
12
+ from ..models.budgetary_impact import BudgetaryImpact
13
+ from ..models.cliff_impact import CliffImpact
14
+ from ..models.decile_impact import DecileImpact
15
+ from ..models.economy_comparison_detailed_budget_type_0 import EconomyComparisonDetailedBudgetType0
16
+ from ..models.inequality_impact import InequalityImpact
17
+ from ..models.intra_decile_impact import IntraDecileImpact
18
+ from ..models.intra_wealth_decile_impact_with_values import IntraWealthDecileImpactWithValues
19
+ from ..models.labor_supply_response import LaborSupplyResponse
20
+ from ..models.poverty_gender_breakdown import PovertyGenderBreakdown
21
+ from ..models.poverty_impact import PovertyImpact
22
+ from ..models.poverty_racial_breakdown_with_values import PovertyRacialBreakdownWithValues
23
+ from ..models.uk_constituency_breakdown_with_values import UKConstituencyBreakdownWithValues
24
+ from ..models.wealth_decile_impact_with_values import WealthDecileImpactWithValues
25
+
26
+
27
+ T = TypeVar("T", bound="EconomyComparison")
28
+
29
+
30
+ @_attrs_define
31
+ class EconomyComparison:
32
+ """
33
+ Attributes:
34
+ budget (BudgetaryImpact):
35
+ detailed_budget (EconomyComparisonDetailedBudgetType0 | None):
36
+ decile (DecileImpact):
37
+ inequality (InequalityImpact):
38
+ poverty (PovertyImpact):
39
+ poverty_by_gender (PovertyGenderBreakdown):
40
+ poverty_by_race (None | PovertyRacialBreakdownWithValues):
41
+ intra_decile (IntraDecileImpact):
42
+ wealth_decile (None | WealthDecileImpactWithValues):
43
+ intra_wealth_decile (IntraWealthDecileImpactWithValues | None):
44
+ labor_supply_response (LaborSupplyResponse):
45
+ constituency_impact (None | UKConstituencyBreakdownWithValues):
46
+ cliff_impact (CliffImpact | None):
47
+ model_version (None | str | Unset):
48
+ data_version (None | str | Unset):
49
+ """
50
+
51
+ budget: BudgetaryImpact
52
+ detailed_budget: EconomyComparisonDetailedBudgetType0 | None
53
+ decile: DecileImpact
54
+ inequality: InequalityImpact
55
+ poverty: PovertyImpact
56
+ poverty_by_gender: PovertyGenderBreakdown
57
+ poverty_by_race: None | PovertyRacialBreakdownWithValues
58
+ intra_decile: IntraDecileImpact
59
+ wealth_decile: None | WealthDecileImpactWithValues
60
+ intra_wealth_decile: IntraWealthDecileImpactWithValues | None
61
+ labor_supply_response: LaborSupplyResponse
62
+ constituency_impact: None | UKConstituencyBreakdownWithValues
63
+ cliff_impact: CliffImpact | None
64
+ model_version: None | str | Unset = UNSET
65
+ data_version: None | str | Unset = UNSET
66
+ additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)
67
+
68
+ def to_dict(self) -> dict[str, Any]:
69
+ from ..models.cliff_impact import CliffImpact
70
+ from ..models.economy_comparison_detailed_budget_type_0 import EconomyComparisonDetailedBudgetType0
71
+ from ..models.intra_wealth_decile_impact_with_values import IntraWealthDecileImpactWithValues
72
+ from ..models.poverty_racial_breakdown_with_values import PovertyRacialBreakdownWithValues
73
+ from ..models.uk_constituency_breakdown_with_values import UKConstituencyBreakdownWithValues
74
+ from ..models.wealth_decile_impact_with_values import WealthDecileImpactWithValues
75
+
76
+ budget = self.budget.to_dict()
77
+
78
+ detailed_budget: dict[str, Any] | None
79
+ if isinstance(self.detailed_budget, EconomyComparisonDetailedBudgetType0):
80
+ detailed_budget = self.detailed_budget.to_dict()
81
+ else:
82
+ detailed_budget = self.detailed_budget
83
+
84
+ decile = self.decile.to_dict()
85
+
86
+ inequality = self.inequality.to_dict()
87
+
88
+ poverty = self.poverty.to_dict()
89
+
90
+ poverty_by_gender = self.poverty_by_gender.to_dict()
91
+
92
+ poverty_by_race: dict[str, Any] | None
93
+ if isinstance(self.poverty_by_race, PovertyRacialBreakdownWithValues):
94
+ poverty_by_race = self.poverty_by_race.to_dict()
95
+ else:
96
+ poverty_by_race = self.poverty_by_race
97
+
98
+ intra_decile = self.intra_decile.to_dict()
99
+
100
+ wealth_decile: dict[str, Any] | None
101
+ if isinstance(self.wealth_decile, WealthDecileImpactWithValues):
102
+ wealth_decile = self.wealth_decile.to_dict()
103
+ else:
104
+ wealth_decile = self.wealth_decile
105
+
106
+ intra_wealth_decile: dict[str, Any] | None
107
+ if isinstance(self.intra_wealth_decile, IntraWealthDecileImpactWithValues):
108
+ intra_wealth_decile = self.intra_wealth_decile.to_dict()
109
+ else:
110
+ intra_wealth_decile = self.intra_wealth_decile
111
+
112
+ labor_supply_response = self.labor_supply_response.to_dict()
113
+
114
+ constituency_impact: dict[str, Any] | None
115
+ if isinstance(self.constituency_impact, UKConstituencyBreakdownWithValues):
116
+ constituency_impact = self.constituency_impact.to_dict()
117
+ else:
118
+ constituency_impact = self.constituency_impact
119
+
120
+ cliff_impact: dict[str, Any] | None
121
+ if isinstance(self.cliff_impact, CliffImpact):
122
+ cliff_impact = self.cliff_impact.to_dict()
123
+ else:
124
+ cliff_impact = self.cliff_impact
125
+
126
+ model_version: None | str | Unset
127
+ if isinstance(self.model_version, Unset):
128
+ model_version = UNSET
129
+ else:
130
+ model_version = self.model_version
131
+
132
+ data_version: None | str | Unset
133
+ if isinstance(self.data_version, Unset):
134
+ data_version = UNSET
135
+ else:
136
+ data_version = self.data_version
137
+
138
+ field_dict: dict[str, Any] = {}
139
+ field_dict.update(self.additional_properties)
140
+ field_dict.update(
141
+ {
142
+ "budget": budget,
143
+ "detailed_budget": detailed_budget,
144
+ "decile": decile,
145
+ "inequality": inequality,
146
+ "poverty": poverty,
147
+ "poverty_by_gender": poverty_by_gender,
148
+ "poverty_by_race": poverty_by_race,
149
+ "intra_decile": intra_decile,
150
+ "wealth_decile": wealth_decile,
151
+ "intra_wealth_decile": intra_wealth_decile,
152
+ "labor_supply_response": labor_supply_response,
153
+ "constituency_impact": constituency_impact,
154
+ "cliff_impact": cliff_impact,
155
+ }
156
+ )
157
+ if model_version is not UNSET:
158
+ field_dict["model_version"] = model_version
159
+ if data_version is not UNSET:
160
+ field_dict["data_version"] = data_version
161
+
162
+ return field_dict
163
+
164
+ @classmethod
165
+ def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
166
+ from ..models.budgetary_impact import BudgetaryImpact
167
+ from ..models.cliff_impact import CliffImpact
168
+ from ..models.decile_impact import DecileImpact
169
+ from ..models.economy_comparison_detailed_budget_type_0 import EconomyComparisonDetailedBudgetType0
170
+ from ..models.inequality_impact import InequalityImpact
171
+ from ..models.intra_decile_impact import IntraDecileImpact
172
+ from ..models.intra_wealth_decile_impact_with_values import IntraWealthDecileImpactWithValues
173
+ from ..models.labor_supply_response import LaborSupplyResponse
174
+ from ..models.poverty_gender_breakdown import PovertyGenderBreakdown
175
+ from ..models.poverty_impact import PovertyImpact
176
+ from ..models.poverty_racial_breakdown_with_values import PovertyRacialBreakdownWithValues
177
+ from ..models.uk_constituency_breakdown_with_values import UKConstituencyBreakdownWithValues
178
+ from ..models.wealth_decile_impact_with_values import WealthDecileImpactWithValues
179
+
180
+ d = dict(src_dict)
181
+ budget = BudgetaryImpact.from_dict(d.pop("budget"))
182
+
183
+ def _parse_detailed_budget(data: object) -> EconomyComparisonDetailedBudgetType0 | None:
184
+ if data is None:
185
+ return data
186
+ try:
187
+ if not isinstance(data, dict):
188
+ raise TypeError()
189
+ detailed_budget_type_0 = EconomyComparisonDetailedBudgetType0.from_dict(data)
190
+
191
+ return detailed_budget_type_0
192
+ except (TypeError, ValueError, AttributeError, KeyError):
193
+ pass
194
+ return cast(EconomyComparisonDetailedBudgetType0 | None, data)
195
+
196
+ detailed_budget = _parse_detailed_budget(d.pop("detailed_budget"))
197
+
198
+ decile = DecileImpact.from_dict(d.pop("decile"))
199
+
200
+ inequality = InequalityImpact.from_dict(d.pop("inequality"))
201
+
202
+ poverty = PovertyImpact.from_dict(d.pop("poverty"))
203
+
204
+ poverty_by_gender = PovertyGenderBreakdown.from_dict(d.pop("poverty_by_gender"))
205
+
206
+ def _parse_poverty_by_race(data: object) -> None | PovertyRacialBreakdownWithValues:
207
+ if data is None:
208
+ return data
209
+ try:
210
+ if not isinstance(data, dict):
211
+ raise TypeError()
212
+ poverty_by_race_type_0 = PovertyRacialBreakdownWithValues.from_dict(data)
213
+
214
+ return poverty_by_race_type_0
215
+ except (TypeError, ValueError, AttributeError, KeyError):
216
+ pass
217
+ return cast(None | PovertyRacialBreakdownWithValues, data)
218
+
219
+ poverty_by_race = _parse_poverty_by_race(d.pop("poverty_by_race"))
220
+
221
+ intra_decile = IntraDecileImpact.from_dict(d.pop("intra_decile"))
222
+
223
+ def _parse_wealth_decile(data: object) -> None | WealthDecileImpactWithValues:
224
+ if data is None:
225
+ return data
226
+ try:
227
+ if not isinstance(data, dict):
228
+ raise TypeError()
229
+ wealth_decile_type_0 = WealthDecileImpactWithValues.from_dict(data)
230
+
231
+ return wealth_decile_type_0
232
+ except (TypeError, ValueError, AttributeError, KeyError):
233
+ pass
234
+ return cast(None | WealthDecileImpactWithValues, data)
235
+
236
+ wealth_decile = _parse_wealth_decile(d.pop("wealth_decile"))
237
+
238
+ def _parse_intra_wealth_decile(data: object) -> IntraWealthDecileImpactWithValues | None:
239
+ if data is None:
240
+ return data
241
+ try:
242
+ if not isinstance(data, dict):
243
+ raise TypeError()
244
+ intra_wealth_decile_type_0 = IntraWealthDecileImpactWithValues.from_dict(data)
245
+
246
+ return intra_wealth_decile_type_0
247
+ except (TypeError, ValueError, AttributeError, KeyError):
248
+ pass
249
+ return cast(IntraWealthDecileImpactWithValues | None, data)
250
+
251
+ intra_wealth_decile = _parse_intra_wealth_decile(d.pop("intra_wealth_decile"))
252
+
253
+ labor_supply_response = LaborSupplyResponse.from_dict(d.pop("labor_supply_response"))
254
+
255
+ def _parse_constituency_impact(data: object) -> None | UKConstituencyBreakdownWithValues:
256
+ if data is None:
257
+ return data
258
+ try:
259
+ if not isinstance(data, dict):
260
+ raise TypeError()
261
+ constituency_impact_type_0 = UKConstituencyBreakdownWithValues.from_dict(data)
262
+
263
+ return constituency_impact_type_0
264
+ except (TypeError, ValueError, AttributeError, KeyError):
265
+ pass
266
+ return cast(None | UKConstituencyBreakdownWithValues, data)
267
+
268
+ constituency_impact = _parse_constituency_impact(d.pop("constituency_impact"))
269
+
270
+ def _parse_cliff_impact(data: object) -> CliffImpact | None:
271
+ if data is None:
272
+ return data
273
+ try:
274
+ if not isinstance(data, dict):
275
+ raise TypeError()
276
+ cliff_impact_type_0 = CliffImpact.from_dict(data)
277
+
278
+ return cliff_impact_type_0
279
+ except (TypeError, ValueError, AttributeError, KeyError):
280
+ pass
281
+ return cast(CliffImpact | None, data)
282
+
283
+ cliff_impact = _parse_cliff_impact(d.pop("cliff_impact"))
284
+
285
+ def _parse_model_version(data: object) -> None | str | Unset:
286
+ if data is None:
287
+ return data
288
+ if isinstance(data, Unset):
289
+ return data
290
+ return cast(None | str | Unset, data)
291
+
292
+ model_version = _parse_model_version(d.pop("model_version", UNSET))
293
+
294
+ def _parse_data_version(data: object) -> None | str | Unset:
295
+ if data is None:
296
+ return data
297
+ if isinstance(data, Unset):
298
+ return data
299
+ return cast(None | str | Unset, data)
300
+
301
+ data_version = _parse_data_version(d.pop("data_version", UNSET))
302
+
303
+ economy_comparison = cls(
304
+ budget=budget,
305
+ detailed_budget=detailed_budget,
306
+ decile=decile,
307
+ inequality=inequality,
308
+ poverty=poverty,
309
+ poverty_by_gender=poverty_by_gender,
310
+ poverty_by_race=poverty_by_race,
311
+ intra_decile=intra_decile,
312
+ wealth_decile=wealth_decile,
313
+ intra_wealth_decile=intra_wealth_decile,
314
+ labor_supply_response=labor_supply_response,
315
+ constituency_impact=constituency_impact,
316
+ cliff_impact=cliff_impact,
317
+ model_version=model_version,
318
+ data_version=data_version,
319
+ )
320
+
321
+ economy_comparison.additional_properties = d
322
+ return economy_comparison
323
+
324
+ @property
325
+ def additional_keys(self) -> list[str]:
326
+ return list(self.additional_properties.keys())
327
+
328
+ def __getitem__(self, key: str) -> Any:
329
+ return self.additional_properties[key]
330
+
331
+ def __setitem__(self, key: str, value: Any) -> None:
332
+ self.additional_properties[key] = value
333
+
334
+ def __delitem__(self, key: str) -> None:
335
+ del self.additional_properties[key]
336
+
337
+ def __contains__(self, key: str) -> bool:
338
+ return key in self.additional_properties