proton_api 1.8.0

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 (292) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +7 -0
  3. data/README.md +246 -0
  4. data/Rakefile +8 -0
  5. data/docs/AccumulationGoalDepositConfig.md +14 -0
  6. data/docs/AnnuitiesApi.md +344 -0
  7. data/docs/AnnuityCalculatorAccumulationHorizonRequest.md +19 -0
  8. data/docs/AnnuityCalculatorAnnuityAmountRequest.md +19 -0
  9. data/docs/AnnuityCalculatorDecumulationHorizonRequest.md +19 -0
  10. data/docs/AnnuityCalculatorDepositAmountRequest.md +19 -0
  11. data/docs/AnnuityCalculatorInitialBalanceRequest.md +19 -0
  12. data/docs/AnnuityDepositSchedule.md +10 -0
  13. data/docs/BacktestRequest.md +17 -0
  14. data/docs/BeneficiaryBequestConfig.md +10 -0
  15. data/docs/BudgetAggregationAccount.md +8 -0
  16. data/docs/BudgetCalculatorRequest.md +16 -0
  17. data/docs/BudgetComponent.md +10 -0
  18. data/docs/BudgetDetails.md +17 -0
  19. data/docs/BusinessFinancialHealthCheckRequest.md +22 -0
  20. data/docs/BusinessFinancialManagementApi.md +288 -0
  21. data/docs/BusinessInvoiceAnalysisRequest.md +20 -0
  22. data/docs/CalculatorDepositSchedule.md +9 -0
  23. data/docs/CalculatorDepositSchedule1.md +10 -0
  24. data/docs/CardLimitCheckRequest.md +9 -0
  25. data/docs/CardTransactionAuthorizationRequest.md +19 -0
  26. data/docs/CardsApi.md +120 -0
  27. data/docs/CashAnalysisRequest.md +17 -0
  28. data/docs/CashFlowAnalysisRequest.md +20 -0
  29. data/docs/ChildrenEducationConfig.md +9 -0
  30. data/docs/CustomerAnalysisRequest.md +17 -0
  31. data/docs/DecumulationGoalDepositConfig.md +14 -0
  32. data/docs/DimensionalRiskScoreRequest.md +16 -0
  33. data/docs/DiversificationScoreRequest.md +19 -0
  34. data/docs/EducationCalculatorAnnualCostRequest.md +18 -0
  35. data/docs/EducationCalculatorDepositAmountRequest.md +19 -0
  36. data/docs/EducationCalculatorPercentCoveredRequest.md +18 -0
  37. data/docs/EducationConfig.md +10 -0
  38. data/docs/EmergencyFundCalculatorRequest.md +24 -0
  39. data/docs/EventStudyRequest.md +18 -0
  40. data/docs/FeeAnalysisRequest.md +13 -0
  41. data/docs/FinancialHealthApi.md +232 -0
  42. data/docs/FinancialHealthCheckRequest.md +17 -0
  43. data/docs/FinancialPictureRequest.md +16 -0
  44. data/docs/FinancialPlanningApi.md +680 -0
  45. data/docs/FinancialStatementAnalysisRequest.md +22 -0
  46. data/docs/GoalAccumulationAllocationRequest.md +33 -0
  47. data/docs/GoalAccumulationRecommendationRequest.md +28 -0
  48. data/docs/GoalAccumulationStatusRequest.md +28 -0
  49. data/docs/GoalConfig.md +9 -0
  50. data/docs/GoalDecumulationAllocationRequest.md +34 -0
  51. data/docs/GoalDecumulationRecommendationRequest.md +29 -0
  52. data/docs/GoalDecumulationStatusRequest.md +29 -0
  53. data/docs/GoalWithdrawalConfig.md +14 -0
  54. data/docs/GoalsApi.md +344 -0
  55. data/docs/GuaranteedRateBenefit.md +11 -0
  56. data/docs/IncomeConfig.md +10 -0
  57. data/docs/LifeInsuranceApi.md +64 -0
  58. data/docs/LifeInsuranceNeedsCalculatorRequest.md +22 -0
  59. data/docs/MonteCarloRequest.md +29 -0
  60. data/docs/MortgageCalculatorDownPaymentRequest.md +11 -0
  61. data/docs/MortgageCalculatorHomePriceRequest.md +11 -0
  62. data/docs/MortgageCalculatorPeriodicPaymentRequest.md +11 -0
  63. data/docs/MvoRequest.md +18 -0
  64. data/docs/OptConfig.md +14 -0
  65. data/docs/OptConfig1.md +12 -0
  66. data/docs/Periods.md +9 -0
  67. data/docs/PersonalFinancialManagementApi.md +288 -0
  68. data/docs/PortfolioConstructionApi.md +64 -0
  69. data/docs/PortfolioManagementApi.md +64 -0
  70. data/docs/PortfolioOptimizationScoreRequest.md +21 -0
  71. data/docs/PortfolioWhatIfRequest.md +21 -0
  72. data/docs/PurchaseCalculatorAmountRequest.md +16 -0
  73. data/docs/PurchaseCalculatorDepositAmountRequest.md +17 -0
  74. data/docs/PurchaseCalculatorHorizonRequest.md +15 -0
  75. data/docs/RatioTargets.md +13 -0
  76. data/docs/RatioTargets1.md +13 -0
  77. data/docs/RebalancingSignalRequest.md +13 -0
  78. data/docs/RecommendationConfig.md +15 -0
  79. data/docs/RecommendationConfig1.md +14 -0
  80. data/docs/RecurringTransactionAnalysisRequest.md +19 -0
  81. data/docs/RetirementCalculatorDepositAmountRequest.md +20 -0
  82. data/docs/RetirementCalculatorExpensesRequest.md +19 -0
  83. data/docs/RetirementCalculatorPercentCoveredRequest.md +19 -0
  84. data/docs/RiskAllocationRequest.md +14 -0
  85. data/docs/RiskScoreRequest.md +13 -0
  86. data/docs/RiskScoringApi.md +176 -0
  87. data/docs/SavingsCalculatorRequest.md +17 -0
  88. data/docs/SavingsDepositSchedule.md +11 -0
  89. data/docs/ScenarioAnalysisRequest.md +22 -0
  90. data/docs/SensitivityAnalysisRequest.md +22 -0
  91. data/docs/SensitivityFactor.md +11 -0
  92. data/docs/Settings.md +13 -0
  93. data/docs/SimulationsApi.md +400 -0
  94. data/docs/VariableAnnuityRequest.md +34 -0
  95. data/docs/WConfig.md +12 -0
  96. data/docs/WConfig1.md +12 -0
  97. data/git_push.sh +55 -0
  98. data/lib/proton_api.rb +132 -0
  99. data/lib/proton_api/api/annuities_api.rb +347 -0
  100. data/lib/proton_api/api/business_financial_management_api.rb +293 -0
  101. data/lib/proton_api/api/cards_api.rb +131 -0
  102. data/lib/proton_api/api/financial_health_api.rb +239 -0
  103. data/lib/proton_api/api/financial_planning_api.rb +671 -0
  104. data/lib/proton_api/api/goals_api.rb +347 -0
  105. data/lib/proton_api/api/life_insurance_api.rb +77 -0
  106. data/lib/proton_api/api/personal_financial_management_api.rb +293 -0
  107. data/lib/proton_api/api/portfolio_construction_api.rb +77 -0
  108. data/lib/proton_api/api/portfolio_management_api.rb +77 -0
  109. data/lib/proton_api/api/risk_scoring_api.rb +185 -0
  110. data/lib/proton_api/api/simulations_api.rb +401 -0
  111. data/lib/proton_api/api_client.rb +391 -0
  112. data/lib/proton_api/api_error.rb +38 -0
  113. data/lib/proton_api/auth_configuration.rb +177 -0
  114. data/lib/proton_api/configuration.rb +209 -0
  115. data/lib/proton_api/models/accumulation_goal_deposit_config.rb +338 -0
  116. data/lib/proton_api/models/annuity_calculator_accumulation_horizon_request.rb +462 -0
  117. data/lib/proton_api/models/annuity_calculator_annuity_amount_request.rb +464 -0
  118. data/lib/proton_api/models/annuity_calculator_decumulation_horizon_request.rb +462 -0
  119. data/lib/proton_api/models/annuity_calculator_deposit_amount_request.rb +471 -0
  120. data/lib/proton_api/models/annuity_calculator_initial_balance_request.rb +471 -0
  121. data/lib/proton_api/models/annuity_deposit_schedule.rb +257 -0
  122. data/lib/proton_api/models/backtest_request.rb +298 -0
  123. data/lib/proton_api/models/beneficiary_bequest_config.rb +260 -0
  124. data/lib/proton_api/models/budget_aggregation_account.rb +189 -0
  125. data/lib/proton_api/models/budget_calculator_request.rb +315 -0
  126. data/lib/proton_api/models/budget_component.rb +231 -0
  127. data/lib/proton_api/models/budget_details.rb +340 -0
  128. data/lib/proton_api/models/business_financial_health_check_request.rb +478 -0
  129. data/lib/proton_api/models/business_invoice_analysis_request.rb +355 -0
  130. data/lib/proton_api/models/calculator_deposit_schedule.rb +231 -0
  131. data/lib/proton_api/models/calculator_deposit_schedule1.rb +257 -0
  132. data/lib/proton_api/models/card_limit_check_request.rb +203 -0
  133. data/lib/proton_api/models/card_transaction_authorization_request.rb +359 -0
  134. data/lib/proton_api/models/cash_analysis_request.rb +321 -0
  135. data/lib/proton_api/models/cash_flow_analysis_request.rb +338 -0
  136. data/lib/proton_api/models/children_education_config.rb +224 -0
  137. data/lib/proton_api/models/customer_analysis_request.rb +286 -0
  138. data/lib/proton_api/models/decumulation_goal_deposit_config.rb +338 -0
  139. data/lib/proton_api/models/dimensional_risk_score_request.rb +285 -0
  140. data/lib/proton_api/models/diversification_score_request.rb +327 -0
  141. data/lib/proton_api/models/education_calculator_annual_cost_request.rb +453 -0
  142. data/lib/proton_api/models/education_calculator_deposit_amount_request.rb +486 -0
  143. data/lib/proton_api/models/education_calculator_percent_covered_request.rb +451 -0
  144. data/lib/proton_api/models/education_config.rb +274 -0
  145. data/lib/proton_api/models/emergency_fund_calculator_request.rb +564 -0
  146. data/lib/proton_api/models/event_study_request.rb +320 -0
  147. data/lib/proton_api/models/fee_analysis_request.rb +231 -0
  148. data/lib/proton_api/models/financial_health_check_request.rb +387 -0
  149. data/lib/proton_api/models/financial_picture_request.rb +269 -0
  150. data/lib/proton_api/models/financial_statement_analysis_request.rb +455 -0
  151. data/lib/proton_api/models/goal_accumulation_allocation_request.rb +732 -0
  152. data/lib/proton_api/models/goal_accumulation_recommendation_request.rb +625 -0
  153. data/lib/proton_api/models/goal_accumulation_status_request.rb +625 -0
  154. data/lib/proton_api/models/goal_config.rb +225 -0
  155. data/lib/proton_api/models/goal_decumulation_allocation_request.rb +767 -0
  156. data/lib/proton_api/models/goal_decumulation_recommendation_request.rb +660 -0
  157. data/lib/proton_api/models/goal_decumulation_status_request.rb +660 -0
  158. data/lib/proton_api/models/goal_withdrawal_config.rb +338 -0
  159. data/lib/proton_api/models/guaranteed_rate_benefit.rb +275 -0
  160. data/lib/proton_api/models/income_config.rb +269 -0
  161. data/lib/proton_api/models/life_insurance_needs_calculator_request.rb +518 -0
  162. data/lib/proton_api/models/monte_carlo_request.rb +507 -0
  163. data/lib/proton_api/models/mortgage_calculator_down_payment_request.rb +302 -0
  164. data/lib/proton_api/models/mortgage_calculator_home_price_request.rb +302 -0
  165. data/lib/proton_api/models/mortgage_calculator_periodic_payment_request.rb +302 -0
  166. data/lib/proton_api/models/mvo_request.rb +369 -0
  167. data/lib/proton_api/models/opt_config.rb +303 -0
  168. data/lib/proton_api/models/opt_config1.rb +263 -0
  169. data/lib/proton_api/models/periods.rb +223 -0
  170. data/lib/proton_api/models/portfolio_optimization_score_request.rb +359 -0
  171. data/lib/proton_api/models/portfolio_what_if_request.rb +354 -0
  172. data/lib/proton_api/models/purchase_calculator_amount_request.rb +404 -0
  173. data/lib/proton_api/models/purchase_calculator_deposit_amount_request.rb +437 -0
  174. data/lib/proton_api/models/purchase_calculator_horizon_request.rb +359 -0
  175. data/lib/proton_api/models/ratio_targets.rb +331 -0
  176. data/lib/proton_api/models/ratio_targets1.rb +331 -0
  177. data/lib/proton_api/models/rebalancing_signal_request.rb +241 -0
  178. data/lib/proton_api/models/recommendation_config.rb +360 -0
  179. data/lib/proton_api/models/recommendation_config1.rb +349 -0
  180. data/lib/proton_api/models/recurring_transaction_analysis_request.rb +370 -0
  181. data/lib/proton_api/models/retirement_calculator_deposit_amount_request.rb +512 -0
  182. data/lib/proton_api/models/retirement_calculator_expenses_request.rb +479 -0
  183. data/lib/proton_api/models/retirement_calculator_percent_covered_request.rb +477 -0
  184. data/lib/proton_api/models/risk_allocation_request.rb +319 -0
  185. data/lib/proton_api/models/risk_score_request.rb +242 -0
  186. data/lib/proton_api/models/savings_calculator_request.rb +398 -0
  187. data/lib/proton_api/models/savings_deposit_schedule.rb +279 -0
  188. data/lib/proton_api/models/scenario_analysis_request.rb +404 -0
  189. data/lib/proton_api/models/sensitivity_analysis_request.rb +402 -0
  190. data/lib/proton_api/models/sensitivity_factor.rb +281 -0
  191. data/lib/proton_api/models/settings.rb +290 -0
  192. data/lib/proton_api/models/variable_annuity_request.rb +703 -0
  193. data/lib/proton_api/models/w_config.rb +385 -0
  194. data/lib/proton_api/models/w_config1.rb +350 -0
  195. data/lib/proton_api/version.rb +15 -0
  196. data/proton_api.gemspec +46 -0
  197. data/spec/api/annuities_api_spec.rb +107 -0
  198. data/spec/api/business_financial_management_api_spec.rb +95 -0
  199. data/spec/api/cards_api_spec.rb +59 -0
  200. data/spec/api/financial_health_api_spec.rb +83 -0
  201. data/spec/api/financial_planning_api_spec.rb +179 -0
  202. data/spec/api/goals_api_spec.rb +107 -0
  203. data/spec/api/life_insurance_api_spec.rb +47 -0
  204. data/spec/api/personal_financial_management_api_spec.rb +95 -0
  205. data/spec/api/portfolio_construction_api_spec.rb +47 -0
  206. data/spec/api/portfolio_management_api_spec.rb +47 -0
  207. data/spec/api/risk_scoring_api_spec.rb +71 -0
  208. data/spec/api/simulations_api_spec.rb +119 -0
  209. data/spec/api_client_spec.rb +243 -0
  210. data/spec/configuration_spec.rb +42 -0
  211. data/spec/models/accumulation_goal_deposit_config_spec.rb +89 -0
  212. data/spec/models/annuity_calculator_accumulation_horizon_request_spec.rb +111 -0
  213. data/spec/models/annuity_calculator_annuity_amount_request_spec.rb +111 -0
  214. data/spec/models/annuity_calculator_decumulation_horizon_request_spec.rb +111 -0
  215. data/spec/models/annuity_calculator_deposit_amount_request_spec.rb +111 -0
  216. data/spec/models/annuity_calculator_initial_balance_request_spec.rb +111 -0
  217. data/spec/models/annuity_deposit_schedule_spec.rb +57 -0
  218. data/spec/models/backtest_request_spec.rb +95 -0
  219. data/spec/models/beneficiary_bequest_config_spec.rb +53 -0
  220. data/spec/models/budget_aggregation_account_spec.rb +41 -0
  221. data/spec/models/budget_calculator_request_spec.rb +93 -0
  222. data/spec/models/budget_component_spec.rb +53 -0
  223. data/spec/models/budget_details_spec.rb +99 -0
  224. data/spec/models/business_financial_health_check_request_spec.rb +137 -0
  225. data/spec/models/business_invoice_analysis_request_spec.rb +117 -0
  226. data/spec/models/calculator_deposit_schedule1_spec.rb +57 -0
  227. data/spec/models/calculator_deposit_schedule_spec.rb +51 -0
  228. data/spec/models/card_limit_check_request_spec.rb +47 -0
  229. data/spec/models/card_transaction_authorization_request_spec.rb +115 -0
  230. data/spec/models/cash_analysis_request_spec.rb +103 -0
  231. data/spec/models/cash_flow_analysis_request_spec.rb +117 -0
  232. data/spec/models/children_education_config_spec.rb +47 -0
  233. data/spec/models/customer_analysis_request_spec.rb +95 -0
  234. data/spec/models/decumulation_goal_deposit_config_spec.rb +89 -0
  235. data/spec/models/dimensional_risk_score_request_spec.rb +89 -0
  236. data/spec/models/diversification_score_request_spec.rb +111 -0
  237. data/spec/models/education_calculator_annual_cost_request_spec.rb +101 -0
  238. data/spec/models/education_calculator_deposit_amount_request_spec.rb +107 -0
  239. data/spec/models/education_calculator_percent_covered_request_spec.rb +101 -0
  240. data/spec/models/education_config_spec.rb +53 -0
  241. data/spec/models/emergency_fund_calculator_request_spec.rb +141 -0
  242. data/spec/models/event_study_request_spec.rb +109 -0
  243. data/spec/models/fee_analysis_request_spec.rb +71 -0
  244. data/spec/models/financial_health_check_request_spec.rb +95 -0
  245. data/spec/models/financial_picture_request_spec.rb +89 -0
  246. data/spec/models/financial_statement_analysis_request_spec.rb +149 -0
  247. data/spec/models/goal_accumulation_allocation_request_spec.rb +215 -0
  248. data/spec/models/goal_accumulation_recommendation_request_spec.rb +173 -0
  249. data/spec/models/goal_accumulation_status_request_spec.rb +173 -0
  250. data/spec/models/goal_config_spec.rb +47 -0
  251. data/spec/models/goal_decumulation_allocation_request_spec.rb +221 -0
  252. data/spec/models/goal_decumulation_recommendation_request_spec.rb +179 -0
  253. data/spec/models/goal_decumulation_status_request_spec.rb +179 -0
  254. data/spec/models/goal_withdrawal_config_spec.rb +89 -0
  255. data/spec/models/guaranteed_rate_benefit_spec.rb +59 -0
  256. data/spec/models/income_config_spec.rb +53 -0
  257. data/spec/models/life_insurance_needs_calculator_request_spec.rb +125 -0
  258. data/spec/models/monte_carlo_request_spec.rb +179 -0
  259. data/spec/models/mortgage_calculator_down_payment_request_spec.rb +59 -0
  260. data/spec/models/mortgage_calculator_home_price_request_spec.rb +59 -0
  261. data/spec/models/mortgage_calculator_periodic_payment_request_spec.rb +59 -0
  262. data/spec/models/mvo_request_spec.rb +113 -0
  263. data/spec/models/opt_config1_spec.rb +69 -0
  264. data/spec/models/opt_config_spec.rb +81 -0
  265. data/spec/models/periods_spec.rb +47 -0
  266. data/spec/models/portfolio_optimization_score_request_spec.rb +127 -0
  267. data/spec/models/portfolio_what_if_request_spec.rb +123 -0
  268. data/spec/models/purchase_calculator_amount_request_spec.rb +93 -0
  269. data/spec/models/purchase_calculator_deposit_amount_request_spec.rb +99 -0
  270. data/spec/models/purchase_calculator_horizon_request_spec.rb +83 -0
  271. data/spec/models/ratio_targets1_spec.rb +71 -0
  272. data/spec/models/ratio_targets_spec.rb +71 -0
  273. data/spec/models/rebalancing_signal_request_spec.rb +71 -0
  274. data/spec/models/recommendation_config1_spec.rb +77 -0
  275. data/spec/models/recommendation_config_spec.rb +83 -0
  276. data/spec/models/recurring_transaction_analysis_request_spec.rb +111 -0
  277. data/spec/models/retirement_calculator_deposit_amount_request_spec.rb +113 -0
  278. data/spec/models/retirement_calculator_expenses_request_spec.rb +107 -0
  279. data/spec/models/retirement_calculator_percent_covered_request_spec.rb +107 -0
  280. data/spec/models/risk_allocation_request_spec.rb +85 -0
  281. data/spec/models/risk_score_request_spec.rb +71 -0
  282. data/spec/models/savings_calculator_request_spec.rb +99 -0
  283. data/spec/models/savings_deposit_schedule_spec.rb +63 -0
  284. data/spec/models/scenario_analysis_request_spec.rb +133 -0
  285. data/spec/models/sensitivity_analysis_request_spec.rb +133 -0
  286. data/spec/models/sensitivity_factor_spec.rb +59 -0
  287. data/spec/models/settings_spec.rb +79 -0
  288. data/spec/models/variable_annuity_request_spec.rb +209 -0
  289. data/spec/models/w_config1_spec.rb +65 -0
  290. data/spec/models/w_config_spec.rb +65 -0
  291. data/spec/spec_helper.rb +111 -0
  292. metadata +628 -0
@@ -0,0 +1,703 @@
1
+ =begin
2
+ #Hydrogen Proton API
3
+
4
+ #Financial engineering module of Hydrogen Atom
5
+
6
+ OpenAPI spec version: 1.8.0
7
+ Contact: info@hydrogenplatform.com
8
+ Generated by: https://github.com/swagger-api/swagger-codegen.git
9
+ Swagger Codegen version: 2.4.17
10
+
11
+ =end
12
+
13
+ require 'date'
14
+
15
+ module ProtonApi
16
+ class VariableAnnuityRequest
17
+ attr_accessor :portfolio_id
18
+
19
+ attr_accessor :result_type
20
+
21
+ attr_accessor :inflation_rate
22
+
23
+ attr_accessor :remove_outliers
24
+
25
+ attr_accessor :deposit_schedule
26
+
27
+ attr_accessor :annuitization_rate
28
+
29
+ attr_accessor :end_date
30
+
31
+ attr_accessor :market_data_source
32
+
33
+ attr_accessor :tax_rate
34
+
35
+ attr_accessor :p
36
+
37
+ attr_accessor :allocation_id
38
+
39
+ attr_accessor :use_proxy_data
40
+
41
+ attr_accessor :start_date
42
+
43
+ attr_accessor :aggregation_account_id
44
+
45
+ attr_accessor :initial_balance
46
+
47
+ attr_accessor :create_log
48
+
49
+ attr_accessor :decumulation_horizon
50
+
51
+ attr_accessor :account_id
52
+
53
+ attr_accessor :accumulation_horizon
54
+
55
+ attr_accessor :trading_days_per_year
56
+
57
+ attr_accessor :portfolio_weights
58
+
59
+ attr_accessor :guaranteed_accumulation_benefit
60
+
61
+ attr_accessor :portfolio_tickers
62
+
63
+ attr_accessor :guaranteed_rate_benefit
64
+
65
+ attr_accessor :model_id
66
+
67
+ attr_accessor :n
68
+
69
+ attr_accessor :frequency_interval
70
+
71
+ class EnumAttributeValidator
72
+ attr_reader :datatype
73
+ attr_reader :allowable_values
74
+
75
+ def initialize(datatype, allowable_values)
76
+ @allowable_values = allowable_values.map do |value|
77
+ case datatype.to_s
78
+ when /Integer/i
79
+ value.to_i
80
+ when /Float/i
81
+ value.to_f
82
+ else
83
+ value
84
+ end
85
+ end
86
+ end
87
+
88
+ def valid?(value)
89
+ !value || allowable_values.include?(value)
90
+ end
91
+ end
92
+
93
+ # Attribute mapping from ruby-style variable name to JSON key.
94
+ def self.attribute_map
95
+ {
96
+ :'portfolio_id' => :'portfolio_id',
97
+ :'result_type' => :'result_type',
98
+ :'inflation_rate' => :'inflation_rate',
99
+ :'remove_outliers' => :'remove_outliers',
100
+ :'deposit_schedule' => :'deposit_schedule',
101
+ :'annuitization_rate' => :'annuitization_rate',
102
+ :'end_date' => :'end_date',
103
+ :'market_data_source' => :'market_data_source',
104
+ :'tax_rate' => :'tax_rate',
105
+ :'p' => :'p',
106
+ :'allocation_id' => :'allocation_id',
107
+ :'use_proxy_data' => :'use_proxy_data',
108
+ :'start_date' => :'start_date',
109
+ :'aggregation_account_id' => :'aggregation_account_id',
110
+ :'initial_balance' => :'initial_balance',
111
+ :'create_log' => :'create_log',
112
+ :'decumulation_horizon' => :'decumulation_horizon',
113
+ :'account_id' => :'account_id',
114
+ :'accumulation_horizon' => :'accumulation_horizon',
115
+ :'trading_days_per_year' => :'trading_days_per_year',
116
+ :'portfolio_weights' => :'portfolio_weights',
117
+ :'guaranteed_accumulation_benefit' => :'guaranteed_accumulation_benefit',
118
+ :'portfolio_tickers' => :'portfolio_tickers',
119
+ :'guaranteed_rate_benefit' => :'guaranteed_rate_benefit',
120
+ :'model_id' => :'model_id',
121
+ :'n' => :'n',
122
+ :'frequency_interval' => :'frequency_interval'
123
+ }
124
+ end
125
+
126
+ # Attribute type mapping.
127
+ def self.swagger_types
128
+ {
129
+ :'portfolio_id' => :'String',
130
+ :'result_type' => :'String',
131
+ :'inflation_rate' => :'Float',
132
+ :'remove_outliers' => :'BOOLEAN',
133
+ :'deposit_schedule' => :'AnnuityDepositSchedule',
134
+ :'annuitization_rate' => :'Float',
135
+ :'end_date' => :'String',
136
+ :'market_data_source' => :'String',
137
+ :'tax_rate' => :'Float',
138
+ :'p' => :'Float',
139
+ :'allocation_id' => :'String',
140
+ :'use_proxy_data' => :'BOOLEAN',
141
+ :'start_date' => :'String',
142
+ :'aggregation_account_id' => :'String',
143
+ :'initial_balance' => :'Float',
144
+ :'create_log' => :'BOOLEAN',
145
+ :'decumulation_horizon' => :'Integer',
146
+ :'account_id' => :'String',
147
+ :'accumulation_horizon' => :'Integer',
148
+ :'trading_days_per_year' => :'Integer',
149
+ :'portfolio_weights' => :'Array<Float>',
150
+ :'guaranteed_accumulation_benefit' => :'Float',
151
+ :'portfolio_tickers' => :'Array<String>',
152
+ :'guaranteed_rate_benefit' => :'Array<GuaranteedRateBenefit>',
153
+ :'model_id' => :'String',
154
+ :'n' => :'Integer',
155
+ :'frequency_interval' => :'String'
156
+ }
157
+ end
158
+
159
+ # Initializes the object
160
+ # @param [Hash] attributes Model attributes in the form of hash
161
+ def initialize(attributes = {})
162
+ return unless attributes.is_a?(Hash)
163
+
164
+ # convert string to symbol for hash key
165
+ attributes = attributes.each_with_object({}) { |(k, v), h| h[k.to_sym] = v }
166
+
167
+ if attributes.has_key?(:'portfolio_id')
168
+ self.portfolio_id = attributes[:'portfolio_id']
169
+ end
170
+
171
+ if attributes.has_key?(:'result_type')
172
+ self.result_type = attributes[:'result_type']
173
+ else
174
+ self.result_type = 'median'
175
+ end
176
+
177
+ if attributes.has_key?(:'inflation_rate')
178
+ self.inflation_rate = attributes[:'inflation_rate']
179
+ else
180
+ self.inflation_rate = 0.0
181
+ end
182
+
183
+ if attributes.has_key?(:'remove_outliers')
184
+ self.remove_outliers = attributes[:'remove_outliers']
185
+ else
186
+ self.remove_outliers = false
187
+ end
188
+
189
+ if attributes.has_key?(:'deposit_schedule')
190
+ self.deposit_schedule = attributes[:'deposit_schedule']
191
+ end
192
+
193
+ if attributes.has_key?(:'annuitization_rate')
194
+ self.annuitization_rate = attributes[:'annuitization_rate']
195
+ else
196
+ self.annuitization_rate = 0.0
197
+ end
198
+
199
+ if attributes.has_key?(:'end_date')
200
+ self.end_date = attributes[:'end_date']
201
+ end
202
+
203
+ if attributes.has_key?(:'market_data_source')
204
+ self.market_data_source = attributes[:'market_data_source']
205
+ else
206
+ self.market_data_source = 'nucleus'
207
+ end
208
+
209
+ if attributes.has_key?(:'tax_rate')
210
+ self.tax_rate = attributes[:'tax_rate']
211
+ else
212
+ self.tax_rate = 0.0
213
+ end
214
+
215
+ if attributes.has_key?(:'p')
216
+ self.p = attributes[:'p']
217
+ end
218
+
219
+ if attributes.has_key?(:'allocation_id')
220
+ self.allocation_id = attributes[:'allocation_id']
221
+ end
222
+
223
+ if attributes.has_key?(:'use_proxy_data')
224
+ self.use_proxy_data = attributes[:'use_proxy_data']
225
+ else
226
+ self.use_proxy_data = false
227
+ end
228
+
229
+ if attributes.has_key?(:'start_date')
230
+ self.start_date = attributes[:'start_date']
231
+ end
232
+
233
+ if attributes.has_key?(:'aggregation_account_id')
234
+ self.aggregation_account_id = attributes[:'aggregation_account_id']
235
+ end
236
+
237
+ if attributes.has_key?(:'initial_balance')
238
+ self.initial_balance = attributes[:'initial_balance']
239
+ else
240
+ self.initial_balance = 0.0
241
+ end
242
+
243
+ if attributes.has_key?(:'create_log')
244
+ self.create_log = attributes[:'create_log']
245
+ else
246
+ self.create_log = false
247
+ end
248
+
249
+ if attributes.has_key?(:'decumulation_horizon')
250
+ self.decumulation_horizon = attributes[:'decumulation_horizon']
251
+ end
252
+
253
+ if attributes.has_key?(:'account_id')
254
+ self.account_id = attributes[:'account_id']
255
+ end
256
+
257
+ if attributes.has_key?(:'accumulation_horizon')
258
+ self.accumulation_horizon = attributes[:'accumulation_horizon']
259
+ end
260
+
261
+ if attributes.has_key?(:'trading_days_per_year')
262
+ self.trading_days_per_year = attributes[:'trading_days_per_year']
263
+ else
264
+ self.trading_days_per_year = 252
265
+ end
266
+
267
+ if attributes.has_key?(:'portfolio_weights')
268
+ if (value = attributes[:'portfolio_weights']).is_a?(Array)
269
+ self.portfolio_weights = value
270
+ end
271
+ end
272
+
273
+ if attributes.has_key?(:'guaranteed_accumulation_benefit')
274
+ self.guaranteed_accumulation_benefit = attributes[:'guaranteed_accumulation_benefit']
275
+ else
276
+ self.guaranteed_accumulation_benefit = 0.0
277
+ end
278
+
279
+ if attributes.has_key?(:'portfolio_tickers')
280
+ if (value = attributes[:'portfolio_tickers']).is_a?(Array)
281
+ self.portfolio_tickers = value
282
+ end
283
+ end
284
+
285
+ if attributes.has_key?(:'guaranteed_rate_benefit')
286
+ if (value = attributes[:'guaranteed_rate_benefit']).is_a?(Array)
287
+ self.guaranteed_rate_benefit = value
288
+ end
289
+ end
290
+
291
+ if attributes.has_key?(:'model_id')
292
+ self.model_id = attributes[:'model_id']
293
+ end
294
+
295
+ if attributes.has_key?(:'n')
296
+ self.n = attributes[:'n']
297
+ else
298
+ self.n = 1000
299
+ end
300
+
301
+ if attributes.has_key?(:'frequency_interval')
302
+ self.frequency_interval = attributes[:'frequency_interval']
303
+ else
304
+ self.frequency_interval = 'year'
305
+ end
306
+ end
307
+
308
+ # Show invalid properties with the reasons. Usually used together with valid?
309
+ # @return Array for valid properties with the reasons
310
+ def list_invalid_properties
311
+ invalid_properties = Array.new
312
+ if !@inflation_rate.nil? && @inflation_rate > 20
313
+ invalid_properties.push('invalid value for "inflation_rate", must be smaller than or equal to 20.')
314
+ end
315
+
316
+ if !@inflation_rate.nil? && @inflation_rate < -1
317
+ invalid_properties.push('invalid value for "inflation_rate", must be greater than or equal to -1.')
318
+ end
319
+
320
+ if !@annuitization_rate.nil? && @annuitization_rate < -1
321
+ invalid_properties.push('invalid value for "annuitization_rate", must be greater than or equal to -1.')
322
+ end
323
+
324
+ if !@tax_rate.nil? && @tax_rate > 1
325
+ invalid_properties.push('invalid value for "tax_rate", must be smaller than or equal to 1.')
326
+ end
327
+
328
+ if !@tax_rate.nil? && @tax_rate < 0
329
+ invalid_properties.push('invalid value for "tax_rate", must be greater than or equal to 0.')
330
+ end
331
+
332
+ if !@p.nil? && @p > 100
333
+ invalid_properties.push('invalid value for "p", must be smaller than or equal to 100.')
334
+ end
335
+
336
+ if !@p.nil? && @p < 0
337
+ invalid_properties.push('invalid value for "p", must be greater than or equal to 0.')
338
+ end
339
+
340
+ if !@initial_balance.nil? && @initial_balance < 0
341
+ invalid_properties.push('invalid value for "initial_balance", must be greater than or equal to 0.')
342
+ end
343
+
344
+ if @decumulation_horizon.nil?
345
+ invalid_properties.push('invalid value for "decumulation_horizon", decumulation_horizon cannot be nil.')
346
+ end
347
+
348
+ if @decumulation_horizon < 1
349
+ invalid_properties.push('invalid value for "decumulation_horizon", must be greater than or equal to 1.')
350
+ end
351
+
352
+ if @accumulation_horizon.nil?
353
+ invalid_properties.push('invalid value for "accumulation_horizon", accumulation_horizon cannot be nil.')
354
+ end
355
+
356
+ if @accumulation_horizon < 0
357
+ invalid_properties.push('invalid value for "accumulation_horizon", must be greater than or equal to 0.')
358
+ end
359
+
360
+ if !@trading_days_per_year.nil? && @trading_days_per_year < 1
361
+ invalid_properties.push('invalid value for "trading_days_per_year", must be greater than or equal to 1.')
362
+ end
363
+
364
+ if !@guaranteed_accumulation_benefit.nil? && @guaranteed_accumulation_benefit < 0
365
+ invalid_properties.push('invalid value for "guaranteed_accumulation_benefit", must be greater than or equal to 0.')
366
+ end
367
+
368
+ if !@n.nil? && @n < 1
369
+ invalid_properties.push('invalid value for "n", must be greater than or equal to 1.')
370
+ end
371
+
372
+ invalid_properties
373
+ end
374
+
375
+ # Check to see if the all the properties in the model are valid
376
+ # @return true if the model is valid
377
+ def valid?
378
+ result_type_validator = EnumAttributeValidator.new('String', ['mean', 'median', 'custom'])
379
+ return false unless result_type_validator.valid?(@result_type)
380
+ return false if !@inflation_rate.nil? && @inflation_rate > 20
381
+ return false if !@inflation_rate.nil? && @inflation_rate < -1
382
+ return false if !@annuitization_rate.nil? && @annuitization_rate < -1
383
+ market_data_source_validator = EnumAttributeValidator.new('String', ['nucleus', 'integration'])
384
+ return false unless market_data_source_validator.valid?(@market_data_source)
385
+ return false if !@tax_rate.nil? && @tax_rate > 1
386
+ return false if !@tax_rate.nil? && @tax_rate < 0
387
+ return false if !@p.nil? && @p > 100
388
+ return false if !@p.nil? && @p < 0
389
+ return false if !@initial_balance.nil? && @initial_balance < 0
390
+ return false if @decumulation_horizon.nil?
391
+ return false if @decumulation_horizon < 1
392
+ return false if @accumulation_horizon.nil?
393
+ return false if @accumulation_horizon < 0
394
+ return false if !@trading_days_per_year.nil? && @trading_days_per_year < 1
395
+ return false if !@guaranteed_accumulation_benefit.nil? && @guaranteed_accumulation_benefit < 0
396
+ return false if !@n.nil? && @n < 1
397
+ frequency_interval_validator = EnumAttributeValidator.new('String', ['year', 'quarter', 'month', 'week', 'day'])
398
+ return false unless frequency_interval_validator.valid?(@frequency_interval)
399
+ true
400
+ end
401
+
402
+ # Custom attribute writer method checking allowed values (enum).
403
+ # @param [Object] result_type Object to be assigned
404
+ def result_type=(result_type)
405
+ validator = EnumAttributeValidator.new('String', ['mean', 'median', 'custom'])
406
+ unless validator.valid?(result_type)
407
+ fail ArgumentError, 'invalid value for "result_type", must be one of #{validator.allowable_values}.'
408
+ end
409
+ @result_type = result_type
410
+ end
411
+
412
+ # Custom attribute writer method with validation
413
+ # @param [Object] inflation_rate Value to be assigned
414
+ def inflation_rate=(inflation_rate)
415
+ if !inflation_rate.nil? && inflation_rate > 20
416
+ fail ArgumentError, 'invalid value for "inflation_rate", must be smaller than or equal to 20.'
417
+ end
418
+
419
+ if !inflation_rate.nil? && inflation_rate < -1
420
+ fail ArgumentError, 'invalid value for "inflation_rate", must be greater than or equal to -1.'
421
+ end
422
+
423
+ @inflation_rate = inflation_rate
424
+ end
425
+
426
+ # Custom attribute writer method with validation
427
+ # @param [Object] annuitization_rate Value to be assigned
428
+ def annuitization_rate=(annuitization_rate)
429
+ if !annuitization_rate.nil? && annuitization_rate < -1
430
+ fail ArgumentError, 'invalid value for "annuitization_rate", must be greater than or equal to -1.'
431
+ end
432
+
433
+ @annuitization_rate = annuitization_rate
434
+ end
435
+
436
+ # Custom attribute writer method checking allowed values (enum).
437
+ # @param [Object] market_data_source Object to be assigned
438
+ def market_data_source=(market_data_source)
439
+ validator = EnumAttributeValidator.new('String', ['nucleus', 'integration'])
440
+ unless validator.valid?(market_data_source)
441
+ fail ArgumentError, 'invalid value for "market_data_source", must be one of #{validator.allowable_values}.'
442
+ end
443
+ @market_data_source = market_data_source
444
+ end
445
+
446
+ # Custom attribute writer method with validation
447
+ # @param [Object] tax_rate Value to be assigned
448
+ def tax_rate=(tax_rate)
449
+ if !tax_rate.nil? && tax_rate > 1
450
+ fail ArgumentError, 'invalid value for "tax_rate", must be smaller than or equal to 1.'
451
+ end
452
+
453
+ if !tax_rate.nil? && tax_rate < 0
454
+ fail ArgumentError, 'invalid value for "tax_rate", must be greater than or equal to 0.'
455
+ end
456
+
457
+ @tax_rate = tax_rate
458
+ end
459
+
460
+ # Custom attribute writer method with validation
461
+ # @param [Object] p Value to be assigned
462
+ def p=(p)
463
+ if !p.nil? && p > 100
464
+ fail ArgumentError, 'invalid value for "p", must be smaller than or equal to 100.'
465
+ end
466
+
467
+ if !p.nil? && p < 0
468
+ fail ArgumentError, 'invalid value for "p", must be greater than or equal to 0.'
469
+ end
470
+
471
+ @p = p
472
+ end
473
+
474
+ # Custom attribute writer method with validation
475
+ # @param [Object] initial_balance Value to be assigned
476
+ def initial_balance=(initial_balance)
477
+ if !initial_balance.nil? && initial_balance < 0
478
+ fail ArgumentError, 'invalid value for "initial_balance", must be greater than or equal to 0.'
479
+ end
480
+
481
+ @initial_balance = initial_balance
482
+ end
483
+
484
+ # Custom attribute writer method with validation
485
+ # @param [Object] decumulation_horizon Value to be assigned
486
+ def decumulation_horizon=(decumulation_horizon)
487
+ if decumulation_horizon.nil?
488
+ fail ArgumentError, 'decumulation_horizon cannot be nil'
489
+ end
490
+
491
+ if decumulation_horizon < 1
492
+ fail ArgumentError, 'invalid value for "decumulation_horizon", must be greater than or equal to 1.'
493
+ end
494
+
495
+ @decumulation_horizon = decumulation_horizon
496
+ end
497
+
498
+ # Custom attribute writer method with validation
499
+ # @param [Object] accumulation_horizon Value to be assigned
500
+ def accumulation_horizon=(accumulation_horizon)
501
+ if accumulation_horizon.nil?
502
+ fail ArgumentError, 'accumulation_horizon cannot be nil'
503
+ end
504
+
505
+ if accumulation_horizon < 0
506
+ fail ArgumentError, 'invalid value for "accumulation_horizon", must be greater than or equal to 0.'
507
+ end
508
+
509
+ @accumulation_horizon = accumulation_horizon
510
+ end
511
+
512
+ # Custom attribute writer method with validation
513
+ # @param [Object] trading_days_per_year Value to be assigned
514
+ def trading_days_per_year=(trading_days_per_year)
515
+ if !trading_days_per_year.nil? && trading_days_per_year < 1
516
+ fail ArgumentError, 'invalid value for "trading_days_per_year", must be greater than or equal to 1.'
517
+ end
518
+
519
+ @trading_days_per_year = trading_days_per_year
520
+ end
521
+
522
+ # Custom attribute writer method with validation
523
+ # @param [Object] guaranteed_accumulation_benefit Value to be assigned
524
+ def guaranteed_accumulation_benefit=(guaranteed_accumulation_benefit)
525
+ if !guaranteed_accumulation_benefit.nil? && guaranteed_accumulation_benefit < 0
526
+ fail ArgumentError, 'invalid value for "guaranteed_accumulation_benefit", must be greater than or equal to 0.'
527
+ end
528
+
529
+ @guaranteed_accumulation_benefit = guaranteed_accumulation_benefit
530
+ end
531
+
532
+ # Custom attribute writer method with validation
533
+ # @param [Object] n Value to be assigned
534
+ def n=(n)
535
+ if !n.nil? && n < 1
536
+ fail ArgumentError, 'invalid value for "n", must be greater than or equal to 1.'
537
+ end
538
+
539
+ @n = n
540
+ end
541
+
542
+ # Custom attribute writer method checking allowed values (enum).
543
+ # @param [Object] frequency_interval Object to be assigned
544
+ def frequency_interval=(frequency_interval)
545
+ validator = EnumAttributeValidator.new('String', ['year', 'quarter', 'month', 'week', 'day'])
546
+ unless validator.valid?(frequency_interval)
547
+ fail ArgumentError, 'invalid value for "frequency_interval", must be one of #{validator.allowable_values}.'
548
+ end
549
+ @frequency_interval = frequency_interval
550
+ end
551
+
552
+ # Checks equality by comparing each attribute.
553
+ # @param [Object] Object to be compared
554
+ def ==(o)
555
+ return true if self.equal?(o)
556
+ self.class == o.class &&
557
+ portfolio_id == o.portfolio_id &&
558
+ result_type == o.result_type &&
559
+ inflation_rate == o.inflation_rate &&
560
+ remove_outliers == o.remove_outliers &&
561
+ deposit_schedule == o.deposit_schedule &&
562
+ annuitization_rate == o.annuitization_rate &&
563
+ end_date == o.end_date &&
564
+ market_data_source == o.market_data_source &&
565
+ tax_rate == o.tax_rate &&
566
+ p == o.p &&
567
+ allocation_id == o.allocation_id &&
568
+ use_proxy_data == o.use_proxy_data &&
569
+ start_date == o.start_date &&
570
+ aggregation_account_id == o.aggregation_account_id &&
571
+ initial_balance == o.initial_balance &&
572
+ create_log == o.create_log &&
573
+ decumulation_horizon == o.decumulation_horizon &&
574
+ account_id == o.account_id &&
575
+ accumulation_horizon == o.accumulation_horizon &&
576
+ trading_days_per_year == o.trading_days_per_year &&
577
+ portfolio_weights == o.portfolio_weights &&
578
+ guaranteed_accumulation_benefit == o.guaranteed_accumulation_benefit &&
579
+ portfolio_tickers == o.portfolio_tickers &&
580
+ guaranteed_rate_benefit == o.guaranteed_rate_benefit &&
581
+ model_id == o.model_id &&
582
+ n == o.n &&
583
+ frequency_interval == o.frequency_interval
584
+ end
585
+
586
+ # @see the `==` method
587
+ # @param [Object] Object to be compared
588
+ def eql?(o)
589
+ self == o
590
+ end
591
+
592
+ # Calculates hash code according to all attributes.
593
+ # @return [Fixnum] Hash code
594
+ def hash
595
+ [portfolio_id, result_type, inflation_rate, remove_outliers, deposit_schedule, annuitization_rate, end_date, market_data_source, tax_rate, p, allocation_id, use_proxy_data, start_date, aggregation_account_id, initial_balance, create_log, decumulation_horizon, account_id, accumulation_horizon, trading_days_per_year, portfolio_weights, guaranteed_accumulation_benefit, portfolio_tickers, guaranteed_rate_benefit, model_id, n, frequency_interval].hash
596
+ end
597
+
598
+ # Builds the object from hash
599
+ # @param [Hash] attributes Model attributes in the form of hash
600
+ # @return [Object] Returns the model itself
601
+ def build_from_hash(attributes)
602
+ return nil unless attributes.is_a?(Hash)
603
+ self.class.swagger_types.each_pair do |key, type|
604
+ if type =~ /\AArray<(.*)>/i
605
+ # check to ensure the input is an array given that the attribute
606
+ # is documented as an array but the input is not
607
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
608
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
609
+ end
610
+ elsif !attributes[self.class.attribute_map[key]].nil?
611
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
612
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
613
+ end
614
+
615
+ self
616
+ end
617
+
618
+ # Deserializes the data based on type
619
+ # @param string type Data type
620
+ # @param string value Value to be deserialized
621
+ # @return [Object] Deserialized data
622
+ def _deserialize(type, value)
623
+ case type.to_sym
624
+ when :DateTime
625
+ DateTime.parse(value)
626
+ when :Date
627
+ Date.parse(value)
628
+ when :String
629
+ value.to_s
630
+ when :Integer
631
+ value.to_i
632
+ when :Float
633
+ value.to_f
634
+ when :BOOLEAN
635
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
636
+ true
637
+ else
638
+ false
639
+ end
640
+ when :Object
641
+ # generic object (usually a Hash), return directly
642
+ value
643
+ when /\AArray<(?<inner_type>.+)>\z/
644
+ inner_type = Regexp.last_match[:inner_type]
645
+ value.map { |v| _deserialize(inner_type, v) }
646
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
647
+ k_type = Regexp.last_match[:k_type]
648
+ v_type = Regexp.last_match[:v_type]
649
+ {}.tap do |hash|
650
+ value.each do |k, v|
651
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
652
+ end
653
+ end
654
+ else # model
655
+ temp_model = ProtonApi.const_get(type).new
656
+ temp_model.build_from_hash(value)
657
+ end
658
+ end
659
+
660
+ # Returns the string representation of the object
661
+ # @return [String] String presentation of the object
662
+ def to_s
663
+ to_hash.to_s
664
+ end
665
+
666
+ # to_body is an alias to to_hash (backward compatibility)
667
+ # @return [Hash] Returns the object in the form of hash
668
+ def to_body
669
+ to_hash
670
+ end
671
+
672
+ # Returns the object in the form of hash
673
+ # @return [Hash] Returns the object in the form of hash
674
+ def to_hash
675
+ hash = {}
676
+ self.class.attribute_map.each_pair do |attr, param|
677
+ value = self.send(attr)
678
+ next if value.nil?
679
+ hash[param] = _to_hash(value)
680
+ end
681
+ hash
682
+ end
683
+
684
+ # Outputs non-array value in the form of hash
685
+ # For object, use to_hash. Otherwise, just return the value
686
+ # @param [Object] value Any valid value
687
+ # @return [Hash] Returns the value in the form of hash
688
+ def _to_hash(value)
689
+ if value.is_a?(Array)
690
+ value.compact.map { |v| _to_hash(v) }
691
+ elsif value.is_a?(Hash)
692
+ {}.tap do |hash|
693
+ value.each { |k, v| hash[k] = _to_hash(v) }
694
+ end
695
+ elsif value.respond_to? :to_hash
696
+ value.to_hash
697
+ else
698
+ value
699
+ end
700
+ end
701
+
702
+ end
703
+ end