ynab 1.31.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/DEVELOPMENT.md +11 -0
  3. data/Gemfile +8 -0
  4. data/Gemfile.lock +42 -0
  5. data/README.md +3 -3
  6. data/Rakefile +58 -0
  7. data/config.json +9 -0
  8. data/docs/Account.md +25 -0
  9. data/docs/AccountResponse.md +8 -0
  10. data/docs/AccountResponseData.md +8 -0
  11. data/docs/AccountType.md +7 -0
  12. data/docs/AccountWrapper.md +8 -0
  13. data/docs/AccountsApi.md +70 -0
  14. data/docs/AccountsResponse.md +8 -0
  15. data/docs/AccountsResponseData.md +9 -0
  16. data/docs/AccountsWrapper.md +9 -0
  17. data/docs/BudgetDetail.md +24 -0
  18. data/docs/BudgetDetailAllOf.md +17 -0
  19. data/docs/BudgetDetailResponse.md +8 -0
  20. data/docs/BudgetDetailResponseData.md +9 -0
  21. data/docs/BudgetDetailWrapper.md +9 -0
  22. data/docs/BudgetSettings.md +9 -0
  23. data/docs/BudgetSettingsResponse.md +8 -0
  24. data/docs/BudgetSettingsResponseData.md +8 -0
  25. data/docs/BudgetSettingsWrapper.md +8 -0
  26. data/docs/BudgetSummary.md +15 -0
  27. data/docs/BudgetSummaryResponse.md +8 -0
  28. data/docs/BudgetSummaryResponseData.md +9 -0
  29. data/docs/BudgetSummaryWrapper.md +9 -0
  30. data/docs/BudgetsApi.md +68 -0
  31. data/docs/BulkIdWrapper.md +8 -0
  32. data/docs/BulkIds.md +9 -0
  33. data/docs/BulkResponse.md +8 -0
  34. data/docs/BulkResponseData.md +8 -0
  35. data/docs/BulkResponseDataBulk.md +9 -0
  36. data/docs/BulkTransactionCreateResponse.md +8 -0
  37. data/docs/BulkTransactionIds.md +8 -0
  38. data/docs/BulkTransactions.md +8 -0
  39. data/docs/CategoriesApi.md +94 -0
  40. data/docs/CategoriesResponse.md +8 -0
  41. data/docs/CategoriesResponseData.md +9 -0
  42. data/docs/Category.md +30 -0
  43. data/docs/CategoryGroup.md +11 -0
  44. data/docs/CategoryGroupWithCategories.md +12 -0
  45. data/docs/CategoryGroupWithCategoriesAllOf.md +8 -0
  46. data/docs/CategoryGroupsWrapper.md +9 -0
  47. data/docs/CategoryResponse.md +8 -0
  48. data/docs/CategoryResponseData.md +8 -0
  49. data/docs/CategoryWrapper.md +9 -0
  50. data/docs/CurrencyFormat.md +15 -0
  51. data/docs/DateFormat.md +8 -0
  52. data/docs/DeprecatedApi.md +28 -0
  53. data/docs/ErrorDetail.md +10 -0
  54. data/docs/ErrorResponse.md +8 -0
  55. data/docs/HybridTransaction.md +30 -0
  56. data/docs/HybridTransactionAllOf.md +12 -0
  57. data/docs/HybridTransactionsResponse.md +8 -0
  58. data/docs/HybridTransactionsResponseData.md +9 -0
  59. data/docs/HybridTransactionsWrapper.md +8 -0
  60. data/docs/LoanAccountPeriodicValue.md +7 -0
  61. data/docs/MonthDetail.md +16 -0
  62. data/docs/MonthDetailAllOf.md +8 -0
  63. data/docs/MonthDetailResponse.md +8 -0
  64. data/docs/MonthDetailResponseData.md +8 -0
  65. data/docs/MonthDetailWrapper.md +8 -0
  66. data/docs/MonthSummariesResponse.md +8 -0
  67. data/docs/MonthSummariesResponseData.md +9 -0
  68. data/docs/MonthSummariesWrapper.md +9 -0
  69. data/docs/MonthSummary.md +15 -0
  70. data/docs/MonthsApi.md +49 -0
  71. data/docs/PatchMonthCategoryWrapper.md +8 -0
  72. data/docs/PatchTransactionsWrapper.md +8 -0
  73. data/docs/Payee.md +11 -0
  74. data/docs/PayeeLocation.md +12 -0
  75. data/docs/PayeeLocationResponse.md +8 -0
  76. data/docs/PayeeLocationResponseData.md +8 -0
  77. data/docs/PayeeLocationWrapper.md +8 -0
  78. data/docs/PayeeLocationsApi.md +69 -0
  79. data/docs/PayeeLocationsResponse.md +8 -0
  80. data/docs/PayeeLocationsResponseData.md +8 -0
  81. data/docs/PayeeLocationsWrapper.md +8 -0
  82. data/docs/PayeeResponse.md +8 -0
  83. data/docs/PayeeResponseData.md +8 -0
  84. data/docs/PayeeWrapper.md +8 -0
  85. data/docs/PayeesApi.md +49 -0
  86. data/docs/PayeesResponse.md +8 -0
  87. data/docs/PayeesResponseData.md +9 -0
  88. data/docs/PayeesWrapper.md +9 -0
  89. data/docs/PostAccountWrapper.md +8 -0
  90. data/docs/PostTransactionsWrapper.md +9 -0
  91. data/docs/PutTransactionWrapper.md +8 -0
  92. data/docs/SaveAccount.md +10 -0
  93. data/docs/SaveAccountWrapper.md +8 -0
  94. data/docs/SaveCategoryResponse.md +8 -0
  95. data/docs/SaveCategoryResponseData.md +9 -0
  96. data/docs/SaveMonthCategory.md +8 -0
  97. data/docs/SaveMonthCategoryWrapper.md +8 -0
  98. data/docs/SaveSubTransaction.md +12 -0
  99. data/docs/SaveTransaction.md +19 -0
  100. data/docs/SaveTransactionWithId.md +20 -0
  101. data/docs/SaveTransactionWithIdAllOf.md +8 -0
  102. data/docs/SaveTransactionWithOptionalFields.md +19 -0
  103. data/docs/SaveTransactionWrapper.md +8 -0
  104. data/docs/SaveTransactionsResponse.md +8 -0
  105. data/docs/SaveTransactionsResponseData.md +12 -0
  106. data/docs/SaveTransactionsWrapper.md +9 -0
  107. data/docs/ScheduledSubTransaction.md +15 -0
  108. data/docs/ScheduledTransactionDetail.md +23 -0
  109. data/docs/ScheduledTransactionDetailAllOf.md +11 -0
  110. data/docs/ScheduledTransactionResponse.md +8 -0
  111. data/docs/ScheduledTransactionResponseData.md +8 -0
  112. data/docs/ScheduledTransactionSummary.md +19 -0
  113. data/docs/ScheduledTransactionWrapper.md +8 -0
  114. data/docs/ScheduledTransactionsApi.md +49 -0
  115. data/docs/ScheduledTransactionsResponse.md +8 -0
  116. data/docs/ScheduledTransactionsResponseData.md +9 -0
  117. data/docs/ScheduledTransactionsWrapper.md +8 -0
  118. data/docs/SubTransaction.md +18 -0
  119. data/docs/TransactionDetail.md +29 -0
  120. data/docs/TransactionDetailAllOf.md +11 -0
  121. data/docs/TransactionResponse.md +8 -0
  122. data/docs/TransactionResponseData.md +8 -0
  123. data/docs/TransactionSummary.md +25 -0
  124. data/docs/TransactionWrapper.md +8 -0
  125. data/docs/TransactionsApi.md +228 -0
  126. data/docs/TransactionsImportResponse.md +8 -0
  127. data/docs/TransactionsImportResponseData.md +8 -0
  128. data/docs/TransactionsResponse.md +8 -0
  129. data/docs/TransactionsResponseData.md +9 -0
  130. data/docs/TransactionsWrapper.md +9 -0
  131. data/docs/UpdateTransaction.md +20 -0
  132. data/docs/UpdateTransactionsWrapper.md +8 -0
  133. data/docs/User.md +8 -0
  134. data/docs/UserApi.md +25 -0
  135. data/docs/UserResponse.md +8 -0
  136. data/docs/UserResponseData.md +8 -0
  137. data/docs/UserWrapper.md +8 -0
  138. data/examples/budget-list.rb +21 -0
  139. data/examples/budget-month.rb +33 -0
  140. data/examples/category-balance.rb +23 -0
  141. data/examples/create-multiple-transactions.rb +42 -0
  142. data/examples/create-transaction.rb +30 -0
  143. data/examples/update-category-budgeted.rb +25 -0
  144. data/examples/update-multiple-transactions.rb +20 -0
  145. data/lib/ynab/api/accounts_api.rb +78 -41
  146. data/lib/ynab/api/budgets_api.rb +68 -36
  147. data/lib/ynab/api/categories_api.rb +108 -60
  148. data/lib/ynab/api/deprecated_api.rb +32 -17
  149. data/lib/ynab/api/months_api.rb +49 -28
  150. data/lib/ynab/api/payee_locations_api.rb +73 -41
  151. data/lib/ynab/api/payees_api.rb +49 -28
  152. data/lib/ynab/api/scheduled_transactions_api.rb +49 -28
  153. data/lib/ynab/api/transactions_api.rb +268 -140
  154. data/lib/ynab/api/user_api.rb +22 -12
  155. data/lib/ynab/api_client.rb +97 -95
  156. data/lib/ynab/configuration.rb +101 -14
  157. data/lib/ynab/models/account.rb +117 -55
  158. data/lib/ynab/models/account_response.rb +53 -18
  159. data/lib/ynab/models/account_response_data.rb +53 -18
  160. data/lib/ynab/models/account_type.rb +30 -20
  161. data/lib/ynab/models/accounts_response.rb +53 -18
  162. data/lib/ynab/models/accounts_response_data.rb +54 -19
  163. data/lib/ynab/models/budget_detail.rb +80 -35
  164. data/lib/ynab/models/budget_detail_all_of.rb +320 -0
  165. data/lib/ynab/models/budget_detail_response.rb +53 -18
  166. data/lib/ynab/models/budget_detail_response_data.rb +54 -19
  167. data/lib/ynab/models/budget_settings.rb +56 -29
  168. data/lib/ynab/models/budget_settings_response.rb +53 -18
  169. data/lib/ynab/models/budget_settings_response_data.rb +53 -18
  170. data/lib/ynab/models/budget_summary.rb +63 -26
  171. data/lib/ynab/models/budget_summary_response.rb +53 -18
  172. data/lib/ynab/models/budget_summary_response_data.rb +54 -20
  173. data/lib/ynab/models/bulk_response.rb +53 -18
  174. data/lib/ynab/models/bulk_response_data.rb +53 -18
  175. data/lib/ynab/models/bulk_response_data_bulk.rb +54 -19
  176. data/lib/ynab/models/bulk_transactions.rb +53 -18
  177. data/lib/ynab/models/categories_response.rb +53 -18
  178. data/lib/ynab/models/categories_response_data.rb +54 -19
  179. data/lib/ynab/models/category.rb +110 -48
  180. data/lib/ynab/models/category_group.rb +58 -23
  181. data/lib/ynab/models/category_group_with_categories.rb +67 -24
  182. data/lib/ynab/models/{save_month_category_wrapper.rb → category_group_with_categories_all_of.rb} +67 -29
  183. data/lib/ynab/models/category_response.rb +53 -18
  184. data/lib/ynab/models/category_response_data.rb +53 -18
  185. data/lib/ynab/models/currency_format.rb +62 -27
  186. data/lib/ynab/models/date_format.rb +53 -18
  187. data/lib/ynab/models/error_detail.rb +55 -20
  188. data/lib/ynab/models/error_response.rb +53 -18
  189. data/lib/ynab/models/hybrid_transaction.rb +118 -46
  190. data/lib/ynab/models/hybrid_transaction_all_of.rb +304 -0
  191. data/lib/ynab/models/hybrid_transactions_response.rb +53 -18
  192. data/lib/ynab/models/hybrid_transactions_response_data.rb +54 -19
  193. data/lib/ynab/models/month_detail.rb +72 -27
  194. data/lib/ynab/models/{update_transactions_wrapper.rb → month_detail_all_of.rb} +66 -30
  195. data/lib/ynab/models/month_detail_response.rb +53 -18
  196. data/lib/ynab/models/month_detail_response_data.rb +53 -18
  197. data/lib/ynab/models/month_summaries_response.rb +53 -18
  198. data/lib/ynab/models/month_summaries_response_data.rb +54 -19
  199. data/lib/ynab/models/month_summary.rb +63 -26
  200. data/lib/ynab/models/patch_month_category_wrapper.rb +53 -18
  201. data/lib/ynab/models/patch_transactions_wrapper.rb +53 -18
  202. data/lib/ynab/models/payee.rb +58 -22
  203. data/lib/ynab/models/payee_location.rb +58 -23
  204. data/lib/ynab/models/payee_location_response.rb +53 -18
  205. data/lib/ynab/models/payee_location_response_data.rb +53 -18
  206. data/lib/ynab/models/payee_locations_response.rb +53 -18
  207. data/lib/ynab/models/payee_locations_response_data.rb +53 -18
  208. data/lib/ynab/models/payee_response.rb +53 -18
  209. data/lib/ynab/models/payee_response_data.rb +53 -18
  210. data/lib/ynab/models/payees_response.rb +53 -18
  211. data/lib/ynab/models/payees_response_data.rb +54 -19
  212. data/lib/ynab/models/post_account_wrapper.rb +53 -18
  213. data/lib/ynab/models/post_transactions_wrapper.rb +54 -19
  214. data/lib/ynab/models/put_transaction_wrapper.rb +53 -18
  215. data/lib/ynab/models/save_account.rb +77 -20
  216. data/lib/ynab/models/save_category_response.rb +53 -18
  217. data/lib/ynab/models/save_category_response_data.rb +54 -19
  218. data/lib/ynab/models/save_month_category.rb +53 -18
  219. data/lib/ynab/models/save_sub_transaction.rb +61 -22
  220. data/lib/ynab/models/save_transaction.rb +88 -33
  221. data/lib/ynab/models/save_transaction_with_id.rb +102 -46
  222. data/lib/ynab/models/{save_transactions_wrapper.rb → save_transaction_with_id_all_of.rb} +60 -36
  223. data/lib/ynab/models/save_transaction_with_optional_fields.rb +81 -33
  224. data/lib/ynab/models/save_transactions_response.rb +53 -18
  225. data/lib/ynab/models/save_transactions_response_data.rb +57 -23
  226. data/lib/ynab/models/scheduled_sub_transaction.rb +66 -27
  227. data/lib/ynab/models/scheduled_transaction_detail.rb +94 -36
  228. data/lib/ynab/models/scheduled_transaction_detail_all_of.rb +262 -0
  229. data/lib/ynab/models/scheduled_transaction_response.rb +53 -18
  230. data/lib/ynab/models/scheduled_transaction_response_data.rb +53 -18
  231. data/lib/ynab/models/scheduled_transaction_summary.rb +80 -32
  232. data/lib/ynab/models/scheduled_transactions_response.rb +53 -18
  233. data/lib/ynab/models/scheduled_transactions_response_data.rb +54 -19
  234. data/lib/ynab/models/sub_transaction.rb +71 -29
  235. data/lib/ynab/models/transaction_detail.rb +112 -44
  236. data/lib/ynab/models/{save_transaction_wrapper.rb → transaction_detail_all_of.rb} +102 -29
  237. data/lib/ynab/models/transaction_response.rb +53 -18
  238. data/lib/ynab/models/transaction_response_data.rb +53 -18
  239. data/lib/ynab/models/transaction_summary.rb +98 -40
  240. data/lib/ynab/models/transactions_import_response.rb +53 -18
  241. data/lib/ynab/models/transactions_import_response_data.rb +53 -18
  242. data/lib/ynab/models/transactions_response.rb +53 -18
  243. data/lib/ynab/models/transactions_response_data.rb +54 -19
  244. data/lib/ynab/models/user.rb +53 -18
  245. data/lib/ynab/models/user_response.rb +53 -18
  246. data/lib/ynab/models/user_response_data.rb +53 -18
  247. data/lib/ynab/version.rb +1 -1
  248. data/lib/ynab.rb +19 -14
  249. data/open_api_spec.yaml +3012 -0
  250. data/templates/api_client.mustache +274 -0
  251. data/templates/api_client_typhoeus_partial.mustache +156 -0
  252. data/templates/api_doc.mustache +44 -0
  253. data/templates/gem.mustache +84 -0
  254. data/templates/partial_model_generic_doc.mustache +9 -0
  255. data/ynab.gemspec +38 -0
  256. metadata +192 -85
  257. data/lib/ynab/models/loan_account_periodic_value.rb +0 -175
  258. data/lib/ynab/models/save_account_wrapper.rb +0 -189
  259. data/lib/ynab/models/update_transaction.rb +0 -407
  260. data/spec/models/transaction_detail_spec.rb +0 -11
@@ -3,14 +3,14 @@
3
3
 
4
4
  #Our API uses a REST based design, leverages the JSON data format, and relies upon HTTPS for transport. We respond with meaningful HTTP response codes and if an error occurs, we include error details in the response body. API Documentation is at https://api.ynab.com
5
5
 
6
- OpenAPI spec version: 1.0.0
6
+ The version of the OpenAPI document: 1.0.0
7
7
 
8
- Generated by: https://github.com/swagger-api/swagger-codegen.git
9
- Swagger Codegen version: 2.4.14
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 6.6.0
10
10
 
11
11
  =end
12
12
 
13
- require 'uri'
13
+ require 'cgi'
14
14
 
15
15
  module YNAB
16
16
  class UserApi
@@ -31,7 +31,7 @@ module YNAB
31
31
  # User info
32
32
  # Returns authenticated user information
33
33
  # @param [Hash] opts the optional parameters
34
- # @return [Array<(UserResponse, Fixnum, Hash)>] UserResponse data, response status code and response headers
34
+ # @return [Array<(UserResponse, Integer, Hash)>] UserResponse data, response status code and response headers
35
35
  def get_user_with_http_info(opts = {})
36
36
  if @api_client.config.debugging
37
37
  @api_client.config.logger.debug 'Calling API: UserApi.get_user ...'
@@ -40,26 +40,36 @@ module YNAB
40
40
  local_var_path = '/user'
41
41
 
42
42
  # query parameters
43
- query_params = {}
43
+ query_params = opts[:query_params] || {}
44
44
 
45
45
  # header parameters
46
- header_params = {}
46
+ header_params = opts[:header_params] || {}
47
47
  # HTTP header 'Accept' (if needed)
48
48
  header_params['Accept'] = @api_client.select_header_accept(['application/json'])
49
49
 
50
50
  # form parameters
51
- form_params = {}
51
+ form_params = opts[:form_params] || {}
52
52
 
53
53
  # http body (model)
54
- post_body = nil
55
- auth_names = ['bearer']
56
- data, status_code, headers = @api_client.call_api(:GET, local_var_path,
54
+ post_body = opts[:debug_body]
55
+
56
+ # return_type
57
+ return_type = opts[:debug_return_type] || 'UserResponse'
58
+
59
+ # auth_names
60
+ auth_names = opts[:debug_auth_names] || ['bearer']
61
+
62
+ new_options = opts.merge(
63
+ :operation => :"UserApi.get_user",
57
64
  :header_params => header_params,
58
65
  :query_params => query_params,
59
66
  :form_params => form_params,
60
67
  :body => post_body,
61
68
  :auth_names => auth_names,
62
- :return_type => 'UserResponse')
69
+ :return_type => return_type
70
+ )
71
+
72
+ data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options)
63
73
  if @api_client.config.debugging
64
74
  @api_client.config.logger.debug "API called: UserApi#get_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}"
65
75
  end
@@ -3,10 +3,10 @@
3
3
 
4
4
  #Our API uses a REST based design, leverages the JSON data format, and relies upon HTTPS for transport. We respond with meaningful HTTP response codes and if an error occurs, we include error details in the response body. API Documentation is at https://api.ynab.com
5
5
 
6
- OpenAPI spec version: 1.0.0
6
+ The version of the OpenAPI document: 1.0.0
7
7
 
8
- Generated by: https://github.com/swagger-api/swagger-codegen.git
9
- Swagger Codegen version: 2.4.14
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 6.6.0
10
10
 
11
11
  =end
12
12
 
@@ -14,8 +14,8 @@ require 'date'
14
14
  require 'json'
15
15
  require 'logger'
16
16
  require 'tempfile'
17
+ require 'time'
17
18
  require 'typhoeus'
18
- require 'uri'
19
19
 
20
20
  module YNAB
21
21
  class ApiClient
@@ -35,7 +35,7 @@ module YNAB
35
35
  @config = config
36
36
  @user_agent = "api_client/ruby/#{VERSION}"
37
37
  @default_headers = {
38
- 'Content-Type' => "application/json",
38
+ 'Content-Type' => 'application/json',
39
39
  'User-Agent' => @user_agent
40
40
  }
41
41
  end
@@ -46,7 +46,7 @@ module YNAB
46
46
 
47
47
  # Call an API with given options.
48
48
  #
49
- # @return [Array<(Object, Fixnum, Hash)>] an array of 3 elements:
49
+ # @return [Array<(Object, Integer, Hash)>] an array of 3 elements:
50
50
  # the data deserialized from response body (could be nil), response status code and response headers.
51
51
  def call_api(http_method, path, opts = {})
52
52
  request = build_request(http_method, path, opts)
@@ -90,12 +90,13 @@ module YNAB
90
90
  # @option opts [Object] :body HTTP body (JSON/XML)
91
91
  # @return [Typhoeus::Request] A Typhoeus Request
92
92
  def build_request(http_method, path, opts = {})
93
- url = build_request_url(path)
93
+ url = build_request_url(path, opts)
94
94
  http_method = http_method.to_sym.downcase
95
95
 
96
96
  header_params = @default_headers.merge(opts[:header_params] || {})
97
97
  query_params = opts[:query_params] || {}
98
98
  form_params = opts[:form_params] || {}
99
+ follow_location = opts[:follow_location] || true
99
100
 
100
101
  update_params_for_auth! header_params, query_params, opts[:auth_names]
101
102
 
@@ -112,7 +113,8 @@ module YNAB
112
113
  :ssl_verifyhost => _verify_ssl_host,
113
114
  :sslcert => @config.cert_file,
114
115
  :sslkey => @config.key_file,
115
- :verbose => @config.debugging
116
+ :verbose => @config.debugging,
117
+ :followlocation => follow_location
116
118
  }
117
119
 
118
120
  # set custom cert, if provided
@@ -131,6 +133,72 @@ module YNAB
131
133
  request
132
134
  end
133
135
 
136
+ # Builds the HTTP request body
137
+ #
138
+ # @param [Hash] header_params Header parameters
139
+ # @param [Hash] form_params Query parameters
140
+ # @param [Object] body HTTP body (JSON/XML)
141
+ # @return [String] HTTP body data in the form of string
142
+ def build_request_body(header_params, form_params, body)
143
+ # http form
144
+ if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
145
+ header_params['Content-Type'] == 'multipart/form-data'
146
+ data = {}
147
+ form_params.each do |key, value|
148
+ case value
149
+ when ::File, ::Array, nil
150
+ # let typhoeus handle File, Array and nil parameters
151
+ data[key] = value
152
+ else
153
+ data[key] = value.to_s
154
+ end
155
+ end
156
+ elsif body
157
+ data = body.is_a?(String) ? body : body.to_json
158
+ else
159
+ data = nil
160
+ end
161
+ data
162
+ end
163
+
164
+ # Save response body into a file in (the defined) temporary folder, using the filename
165
+ # from the "Content-Disposition" header if provided, otherwise a random filename.
166
+ # The response body is written to the file in chunks in order to handle files which
167
+ # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
168
+ # process can use.
169
+ #
170
+ # @see Configuration#temp_folder_path
171
+ def download_file(request)
172
+ tempfile = nil
173
+ encoding = nil
174
+ request.on_headers do |response|
175
+ content_disposition = response.headers['Content-Disposition']
176
+ if content_disposition && content_disposition =~ /filename=/i
177
+ filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
178
+ prefix = sanitize_filename(filename)
179
+ else
180
+ prefix = 'download-'
181
+ end
182
+ prefix = prefix + '-' unless prefix.end_with?('-')
183
+ encoding = response.body.encoding
184
+ tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
185
+ @tempfile = tempfile
186
+ end
187
+ request.on_body do |chunk|
188
+ chunk.force_encoding(encoding)
189
+ tempfile.write(chunk)
190
+ end
191
+ request.on_complete do |response|
192
+ if tempfile
193
+ tempfile.close
194
+ @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
195
+ "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
196
+ "will be deleted automatically with GC. It's also recommended to delete the temp file "\
197
+ "explicitly with `tempfile.delete`"
198
+ end
199
+ end
200
+ end
201
+
134
202
  # Check if the given MIME is a JSON MIME.
135
203
  # JSON MIME examples:
136
204
  # application/json
@@ -140,13 +208,13 @@ module YNAB
140
208
  # @param [String] mime MIME
141
209
  # @return [Boolean] True if the MIME is application/json
142
210
  def json_mime?(mime)
143
- (mime == "*/*") || !(mime =~ /Application\/.*json(?!p)(;.*)?/i).nil?
211
+ (mime == '*/*') || !(mime =~ /Application\/.*json(?!p)(;.*)?/i).nil?
144
212
  end
145
213
 
146
214
  # Deserialize the response to the given return type.
147
215
  #
148
216
  # @param [Response] response HTTP response
149
- # @param [String] return_type some examples: "User", "Array[User]", "Hash[String,Integer]"
217
+ # @param [String] return_type some examples: "User", "Array<User>", "Hash<String, Integer>"
150
218
  def deserialize(response, return_type)
151
219
  body = response.body
152
220
 
@@ -167,7 +235,7 @@ module YNAB
167
235
  begin
168
236
  data = JSON.parse("[#{body}]", :symbolize_names => true)[0]
169
237
  rescue JSON::ParserError => e
170
- if %w(String Date DateTime).include?(return_type)
238
+ if %w(String Date Time).include?(return_type)
171
239
  data = body
172
240
  else
173
241
  raise e
@@ -190,11 +258,11 @@ module YNAB
190
258
  data.to_i
191
259
  when 'Float'
192
260
  data.to_f
193
- when 'BOOLEAN'
261
+ when 'Boolean'
194
262
  data == true
195
- when 'DateTime'
263
+ when 'Time'
196
264
  # parse date time (expecting ISO 8601 format)
197
- DateTime.parse data
265
+ Time.parse data
198
266
  when 'Date'
199
267
  # parse date time (expecting ISO 8601 format)
200
268
  Date.parse data
@@ -204,54 +272,17 @@ module YNAB
204
272
  when /\AArray<(.+)>\z/
205
273
  # e.g. Array<Pet>
206
274
  sub_type = $1
207
- data.map {|item| convert_to_type(item, sub_type) }
275
+ data.map { |item| convert_to_type(item, sub_type) }
208
276
  when /\AHash\<String, (.+)\>\z/
209
277
  # e.g. Hash<String, Integer>
210
278
  sub_type = $1
211
279
  {}.tap do |hash|
212
- data.each {|k, v| hash[k] = convert_to_type(v, sub_type) }
280
+ data.each { |k, v| hash[k] = convert_to_type(v, sub_type) }
213
281
  end
214
282
  else
215
- # models, e.g. Pet
216
- YNAB.const_get(return_type).new.tap do |model|
217
- model.build_from_hash data
218
- end
219
- end
220
- end
221
-
222
- # Save response body into a file in (the defined) temporary folder, using the filename
223
- # from the "Content-Disposition" header if provided, otherwise a random filename.
224
- # The response body is written to the file in chunks in order to handle files which
225
- # size is larger than maximum Ruby String or even larger than the maximum memory a Ruby
226
- # process can use.
227
- #
228
- # @see Configuration#temp_folder_path
229
- def download_file(request)
230
- tempfile = nil
231
- encoding = nil
232
- request.on_headers do |response|
233
- content_disposition = response.headers['Content-Disposition']
234
- if content_disposition and content_disposition =~ /filename=/i
235
- filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
236
- prefix = sanitize_filename(filename)
237
- else
238
- prefix = 'download-'
239
- end
240
- prefix = prefix + '-' unless prefix.end_with?('-')
241
- encoding = response.body.encoding
242
- tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
243
- @tempfile = tempfile
244
- end
245
- request.on_body do |chunk|
246
- chunk.force_encoding(encoding)
247
- tempfile.write(chunk)
248
- end
249
- request.on_complete do |response|
250
- tempfile.close
251
- @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
252
- "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
253
- "will be deleted automatically with GC. It's also recommended to delete the temp file "\
254
- "explicitly with `tempfile.delete`"
283
+ # models (e.g. Pet) or oneOf
284
+ klass = YNAB.const_get(return_type)
285
+ klass.respond_to?(:openapi_one_of) ? klass.build(data) : klass.build_from_hash(data)
255
286
  end
256
287
  end
257
288
 
@@ -264,42 +295,13 @@ module YNAB
264
295
  filename.gsub(/.*[\/\\]/, '')
265
296
  end
266
297
 
267
- def build_request_url(path)
298
+ def build_request_url(path, opts = {})
268
299
  # Add leading and trailing slashes to path
269
300
  path = "/#{path}".gsub(/\/+/, '/')
270
- URI.encode_www_form_component(path).gsub('+', '%20')
271
- @config.base_url + path
272
- end
273
-
274
- # Builds the HTTP request body
275
- #
276
- # @param [Hash] header_params Header parameters
277
- # @param [Hash] form_params Query parameters
278
- # @param [Object] body HTTP body (JSON/XML)
279
- # @return [String] HTTP body data in the form of string
280
- def build_request_body(header_params, form_params, body)
281
- # http form
282
- if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
283
- header_params['Content-Type'] == 'multipart/form-data'
284
- data = {}
285
- form_params.each do |key, value|
286
- case value
287
- when ::File, ::Array, nil
288
- # let typhoeus handle File, Array and nil parameters
289
- data[key] = value
290
- else
291
- data[key] = value.to_s
292
- end
293
- end
294
- elsif body
295
- data = body.is_a?(String) ? body : body.to_json
296
- else
297
- data = nil
298
- end
299
- data
301
+ @config.base_url(opts[:operation]) + path
300
302
  end
301
303
 
302
- # Update hearder and query params based on authentication settings.
304
+ # Update header and query params based on authentication settings.
303
305
  #
304
306
  # @param [Hash] header_params Header parameters
305
307
  # @param [Hash] query_params Query parameters
@@ -311,14 +313,14 @@ module YNAB
311
313
  case auth_setting[:in]
312
314
  when 'header' then header_params[auth_setting[:key]] = auth_setting[:value]
313
315
  when 'query' then query_params[auth_setting[:key]] = auth_setting[:value]
314
- else fail ArgumentError, 'Authentication token must be in `query` of `header`'
316
+ else fail ArgumentError, 'Authentication token must be in `query` or `header`'
315
317
  end
316
318
  end
317
319
  end
318
320
 
319
321
  # Sets user agent in HTTP header
320
322
  #
321
- # @param [String] user_agent User agent (e.g. swagger-codegen/ruby/1.0.0)
323
+ # @param [String] user_agent User agent (e.g. openapi-generator/ruby/1.0.0)
322
324
  def user_agent=(user_agent)
323
325
  @user_agent = user_agent
324
326
  @default_headers['User-Agent'] = @user_agent
@@ -331,18 +333,18 @@ module YNAB
331
333
  return nil if accepts.nil? || accepts.empty?
332
334
  # use JSON when present, otherwise use all of the provided
333
335
  json_accept = accepts.find { |s| json_mime?(s) }
334
- return json_accept || accepts.join(',')
336
+ json_accept || accepts.join(',')
335
337
  end
336
338
 
337
339
  # Return Content-Type header based on an array of content types provided.
338
340
  # @param [Array] content_types array for Content-Type
339
341
  # @return [String] the Content-Type header (e.g. application/json)
340
342
  def select_header_content_type(content_types)
341
- # use application/json by default
342
- return 'application/json' if content_types.nil? || content_types.empty?
343
+ # return nil by default
344
+ return if content_types.nil? || content_types.empty?
343
345
  # use JSON when present, otherwise use the first one
344
346
  json_content_type = content_types.find { |s| json_mime?(s) }
345
- return json_content_type || content_types.first
347
+ json_content_type || content_types.first
346
348
  end
347
349
 
348
350
  # Convert object (array, hash, object, etc) to JSON string.
@@ -352,7 +354,7 @@ module YNAB
352
354
  return model if model.nil? || model.is_a?(String)
353
355
  local_body = nil
354
356
  if model.is_a?(Array)
355
- local_body = model.map{|m| object_to_hash(m) }
357
+ local_body = model.map { |m| object_to_hash(m) }
356
358
  else
357
359
  local_body = object_to_hash(model)
358
360
  end
@@ -3,15 +3,13 @@
3
3
 
4
4
  #Our API uses a REST based design, leverages the JSON data format, and relies upon HTTPS for transport. We respond with meaningful HTTP response codes and if an error occurs, we include error details in the response body. API Documentation is at https://api.ynab.com
5
5
 
6
- OpenAPI spec version: 1.0.0
6
+ The version of the OpenAPI document: 1.0.0
7
7
 
8
- Generated by: https://github.com/swagger-api/swagger-codegen.git
9
- Swagger Codegen version: 2.4.14
8
+ Generated by: https://openapi-generator.tech
9
+ OpenAPI Generator version: 6.6.0
10
10
 
11
11
  =end
12
12
 
13
- require 'uri'
14
-
15
13
  module YNAB
16
14
  class Configuration
17
15
  # Defines url scheme
@@ -23,6 +21,18 @@ module YNAB
23
21
  # Defines url base path
24
22
  attr_accessor :base_path
25
23
 
24
+ # Define server configuration index
25
+ attr_accessor :server_index
26
+
27
+ # Define server operation configuration index
28
+ attr_accessor :server_operation_index
29
+
30
+ # Default server variables
31
+ attr_accessor :server_variables
32
+
33
+ # Default server operation variables
34
+ attr_accessor :server_operation_variables
35
+
26
36
  # Defines API keys used with API Key authentications.
27
37
  #
28
38
  # @return [Hash] key: parameter name, value: parameter value (API key)
@@ -52,6 +62,16 @@ module YNAB
52
62
  # Defines the access token (Bearer) used with OAuth2.
53
63
  attr_accessor :access_token
54
64
 
65
+ # Defines a Proc used to fetch or refresh access tokens (Bearer) used with OAuth2.
66
+ # Overrides the access_token if set
67
+ # @return [Proc]
68
+ attr_accessor :access_token_getter
69
+
70
+ # Set this to return data as binary instead of downloading a temp file. When enabled (set to true)
71
+ # HTTP responses with return type `File` will be returned as a stream of binary data.
72
+ # Default to false.
73
+ attr_accessor :return_binary_data
74
+
55
75
  # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
56
76
  # details will be logged with `logger.debug` (see the `logger` attribute).
57
77
  # Default to false.
@@ -123,6 +143,7 @@ module YNAB
123
143
  # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
124
144
  attr_accessor :params_encoding
125
145
 
146
+
126
147
  attr_accessor :inject_format
127
148
 
128
149
  attr_accessor :force_ending_format
@@ -131,15 +152,19 @@ module YNAB
131
152
  @scheme = 'https'
132
153
  @host = 'api.ynab.com'
133
154
  @base_path = '/v1'
155
+ @server_index = 0
156
+ @server_operation_index = {}
157
+ @server_variables = {}
158
+ @server_operation_variables = {}
134
159
  @api_key = {}
135
160
  @api_key_prefix = {}
136
- @timeout = 0
137
161
  @client_side_validation = true
138
162
  @verify_ssl = true
139
163
  @verify_ssl_host = true
140
- @params_encoding = nil
141
164
  @cert_file = nil
142
165
  @key_file = nil
166
+ @timeout = 0
167
+ @params_encoding = nil
143
168
  @debugging = false
144
169
  @inject_format = false
145
170
  @force_ending_format = false
@@ -173,20 +198,32 @@ module YNAB
173
198
  @base_path = '' if @base_path == '/'
174
199
  end
175
200
 
176
- def base_url
177
- "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '')
201
+ # Returns base URL for specified operation based on server settings
202
+ def base_url(operation = nil)
203
+ index = server_operation_index[operation]
204
+ return "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') if index == nil
205
+
206
+ server_url(index, server_operation_variables.fetch(operation, server_variables), operation_server_settings[operation])
178
207
  end
179
208
 
180
209
  # Gets API key (with prefix if set).
181
210
  # @param [String] param_name the parameter name of API key auth
182
- def api_key_with_prefix(param_name)
211
+ def api_key_with_prefix(param_name, param_alias = nil)
212
+ key = @api_key[param_name]
213
+ key = @api_key.fetch(param_alias, key) unless param_alias.nil?
183
214
  if @api_key_prefix[param_name]
184
- "#{@api_key_prefix[param_name]} #{@api_key[param_name]}"
215
+ "#{@api_key_prefix[param_name]} #{key}"
185
216
  else
186
- @api_key[param_name]
217
+ key
187
218
  end
188
219
  end
189
220
 
221
+ # Gets access_token using access_token_getter or uses the static access_token
222
+ def access_token_with_refresh
223
+ return access_token if access_token_getter.nil?
224
+ access_token_getter.call
225
+ end
226
+
190
227
  # Gets Basic Auth token string
191
228
  def basic_auth_token
192
229
  'Basic ' + ["#{username}:#{password}"].pack('m').delete("\r\n")
@@ -197,12 +234,62 @@ module YNAB
197
234
  {
198
235
  'bearer' =>
199
236
  {
200
- type: 'api_key',
237
+ type: 'bearer',
201
238
  in: 'header',
202
239
  key: 'Authorization',
203
- value: api_key_with_prefix('Authorization')
240
+ value: "Bearer #{access_token_with_refresh}"
204
241
  },
205
242
  }
206
243
  end
244
+
245
+ # Returns an array of Server setting
246
+ def server_settings
247
+ [
248
+ {
249
+ url: "https://api.ynab.com/v1",
250
+ description: "No description provided",
251
+ }
252
+ ]
253
+ end
254
+
255
+ def operation_server_settings
256
+ {
257
+ }
258
+ end
259
+
260
+ # Returns URL based on server settings
261
+ #
262
+ # @param index array index of the server settings
263
+ # @param variables hash of variable and the corresponding value
264
+ def server_url(index, variables = {}, servers = nil)
265
+ servers = server_settings if servers == nil
266
+
267
+ # check array index out of bound
268
+ if (index < 0 || index >= servers.size)
269
+ fail ArgumentError, "Invalid index #{index} when selecting the server. Must be less than #{servers.size}"
270
+ end
271
+
272
+ server = servers[index]
273
+ url = server[:url]
274
+
275
+ return url unless server.key? :variables
276
+
277
+ # go through variable and assign a value
278
+ server[:variables].each do |name, variable|
279
+ if variables.key?(name)
280
+ if (!server[:variables][name].key?(:enum_values) || server[:variables][name][:enum_values].include?(variables[name]))
281
+ url.gsub! "{" + name.to_s + "}", variables[name]
282
+ else
283
+ fail ArgumentError, "The variable `#{name}` in the server URL has invalid value #{variables[name]}. Must be #{server[:variables][name][:enum_values]}."
284
+ end
285
+ else
286
+ # use default value
287
+ url.gsub! "{" + name.to_s + "}", server[:variables][name][:default_value]
288
+ end
289
+ end
290
+
291
+ url
292
+ end
293
+
207
294
  end
208
295
  end