finch-api 0.1.0.pre.alpha.3 → 0.1.0.pre.alpha.5

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 (211) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -8
  3. data/lib/finch-api/client.rb +1 -1
  4. data/lib/finch-api/individuals_page.rb +4 -4
  5. data/lib/finch-api/models/access_token_create_params.rb +1 -1
  6. data/lib/finch-api/models/account_disconnect_params.rb +1 -1
  7. data/lib/finch-api/models/account_introspect_params.rb +1 -1
  8. data/lib/finch-api/models/connect/session_new_params.rb +1 -1
  9. data/lib/finch-api/models/connect/session_reauthenticate_params.rb +1 -1
  10. data/lib/finch-api/models/hris/benefit_create_params.rb +1 -1
  11. data/lib/finch-api/models/hris/benefit_list_params.rb +1 -1
  12. data/lib/finch-api/models/hris/benefit_list_supported_benefits_params.rb +1 -1
  13. data/lib/finch-api/models/hris/benefit_retrieve_params.rb +1 -1
  14. data/lib/finch-api/models/hris/benefit_update_params.rb +1 -1
  15. data/lib/finch-api/models/hris/benefits/individual_enroll_many_params.rb +1 -1
  16. data/lib/finch-api/models/hris/benefits/individual_enrolled_ids_params.rb +1 -1
  17. data/lib/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rb +1 -1
  18. data/lib/finch-api/models/hris/benefits/individual_unenroll_many_params.rb +1 -1
  19. data/lib/finch-api/models/hris/company_retrieve_params.rb +1 -1
  20. data/lib/finch-api/models/hris/directory_list_individuals_params.rb +1 -1
  21. data/lib/finch-api/models/hris/directory_list_params.rb +1 -1
  22. data/lib/finch-api/models/hris/document_list_params.rb +1 -1
  23. data/lib/finch-api/models/hris/document_retreive_params.rb +1 -1
  24. data/lib/finch-api/models/hris/employment_retrieve_many_params.rb +1 -1
  25. data/lib/finch-api/models/hris/individual_retrieve_many_params.rb +1 -1
  26. data/lib/finch-api/models/hris/pay_statement_retrieve_many_params.rb +1 -1
  27. data/lib/finch-api/models/hris/payment_list_params.rb +1 -1
  28. data/lib/finch-api/models/introspection.rb +12 -1
  29. data/lib/finch-api/models/jobs/automated_create_params.rb +1 -1
  30. data/lib/finch-api/models/jobs/automated_list_params.rb +1 -1
  31. data/lib/finch-api/models/jobs/automated_retrieve_params.rb +1 -1
  32. data/lib/finch-api/models/jobs/manual_retrieve_params.rb +1 -1
  33. data/lib/finch-api/models/payroll/pay_group_list_params.rb +1 -1
  34. data/lib/finch-api/models/payroll/pay_group_retrieve_params.rb +1 -1
  35. data/lib/finch-api/models/provider_list_params.rb +1 -1
  36. data/lib/finch-api/models/request_forwarding_forward_params.rb +1 -1
  37. data/lib/finch-api/models/sandbox/company_update_params.rb +1 -1
  38. data/lib/finch-api/models/sandbox/connection_create_params.rb +1 -1
  39. data/lib/finch-api/models/sandbox/connections/account_create_params.rb +1 -1
  40. data/lib/finch-api/models/sandbox/connections/account_update_params.rb +1 -1
  41. data/lib/finch-api/models/sandbox/directory_create_params.rb +1 -1
  42. data/lib/finch-api/models/sandbox/employment_update_params.rb +1 -1
  43. data/lib/finch-api/models/sandbox/individual_update_params.rb +1 -1
  44. data/lib/finch-api/models/sandbox/job_create_params.rb +1 -1
  45. data/lib/finch-api/models/sandbox/jobs/configuration_retrieve_params.rb +1 -1
  46. data/lib/finch-api/models/sandbox/jobs/configuration_update_params.rb +1 -1
  47. data/lib/finch-api/models/sandbox/payment_create_params.rb +1 -1
  48. data/lib/finch-api/page.rb +4 -4
  49. data/lib/finch-api/request_options.rb +0 -33
  50. data/lib/finch-api/responses_page.rb +3 -3
  51. data/lib/finch-api/single_page.rb +3 -3
  52. data/lib/finch-api/transport/base_client.rb +459 -0
  53. data/lib/finch-api/transport/pooled_net_requester.rb +182 -0
  54. data/lib/finch-api/type/array_of.rb +110 -0
  55. data/lib/finch-api/type/base_model.rb +355 -0
  56. data/lib/finch-api/type/base_page.rb +61 -0
  57. data/lib/finch-api/type/boolean_model.rb +52 -0
  58. data/lib/finch-api/type/converter.rb +211 -0
  59. data/lib/finch-api/type/enum.rb +105 -0
  60. data/lib/finch-api/type/hash_of.rb +136 -0
  61. data/lib/finch-api/type/request_parameters.rb +38 -0
  62. data/lib/finch-api/type/union.rb +204 -0
  63. data/lib/finch-api/type/unknown.rb +56 -0
  64. data/lib/finch-api/type.rb +23 -0
  65. data/lib/finch-api/util.rb +3 -5
  66. data/lib/finch-api/version.rb +1 -1
  67. data/lib/finch-api.rb +13 -5
  68. data/rbi/lib/finch-api/client.rbi +1 -1
  69. data/rbi/lib/finch-api/individuals_page.rbi +1 -1
  70. data/rbi/lib/finch-api/models/access_token_create_params.rbi +1 -1
  71. data/rbi/lib/finch-api/models/account_disconnect_params.rbi +1 -1
  72. data/rbi/lib/finch-api/models/account_introspect_params.rbi +1 -1
  73. data/rbi/lib/finch-api/models/connect/session_new_params.rbi +1 -1
  74. data/rbi/lib/finch-api/models/connect/session_reauthenticate_params.rbi +1 -1
  75. data/rbi/lib/finch-api/models/hris/benefit_create_params.rbi +1 -1
  76. data/rbi/lib/finch-api/models/hris/benefit_list_params.rbi +1 -1
  77. data/rbi/lib/finch-api/models/hris/benefit_list_supported_benefits_params.rbi +1 -1
  78. data/rbi/lib/finch-api/models/hris/benefit_retrieve_params.rbi +1 -1
  79. data/rbi/lib/finch-api/models/hris/benefit_update_params.rbi +1 -1
  80. data/rbi/lib/finch-api/models/hris/benefits/individual_enroll_many_params.rbi +1 -1
  81. data/rbi/lib/finch-api/models/hris/benefits/individual_enrolled_ids_params.rbi +1 -1
  82. data/rbi/lib/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rbi +1 -1
  83. data/rbi/lib/finch-api/models/hris/benefits/individual_unenroll_many_params.rbi +1 -1
  84. data/rbi/lib/finch-api/models/hris/company_retrieve_params.rbi +1 -1
  85. data/rbi/lib/finch-api/models/hris/directory_list_individuals_params.rbi +1 -1
  86. data/rbi/lib/finch-api/models/hris/directory_list_params.rbi +1 -1
  87. data/rbi/lib/finch-api/models/hris/document_list_params.rbi +1 -1
  88. data/rbi/lib/finch-api/models/hris/document_retreive_params.rbi +1 -1
  89. data/rbi/lib/finch-api/models/hris/employment_retrieve_many_params.rbi +1 -1
  90. data/rbi/lib/finch-api/models/hris/individual_retrieve_many_params.rbi +1 -1
  91. data/rbi/lib/finch-api/models/hris/pay_statement_retrieve_many_params.rbi +1 -1
  92. data/rbi/lib/finch-api/models/hris/payment_list_params.rbi +1 -1
  93. data/rbi/lib/finch-api/models/introspection.rbi +20 -3
  94. data/rbi/lib/finch-api/models/jobs/automated_create_params.rbi +1 -1
  95. data/rbi/lib/finch-api/models/jobs/automated_list_params.rbi +1 -1
  96. data/rbi/lib/finch-api/models/jobs/automated_retrieve_params.rbi +1 -1
  97. data/rbi/lib/finch-api/models/jobs/manual_retrieve_params.rbi +1 -1
  98. data/rbi/lib/finch-api/models/payroll/pay_group_list_params.rbi +1 -1
  99. data/rbi/lib/finch-api/models/payroll/pay_group_retrieve_params.rbi +1 -1
  100. data/rbi/lib/finch-api/models/provider_list_params.rbi +1 -1
  101. data/rbi/lib/finch-api/models/request_forwarding_forward_params.rbi +1 -1
  102. data/rbi/lib/finch-api/models/sandbox/company_update_params.rbi +1 -1
  103. data/rbi/lib/finch-api/models/sandbox/connection_create_params.rbi +1 -1
  104. data/rbi/lib/finch-api/models/sandbox/connections/account_create_params.rbi +1 -1
  105. data/rbi/lib/finch-api/models/sandbox/connections/account_update_params.rbi +1 -1
  106. data/rbi/lib/finch-api/models/sandbox/directory_create_params.rbi +1 -1
  107. data/rbi/lib/finch-api/models/sandbox/directory_create_response.rbi +1 -1
  108. data/rbi/lib/finch-api/models/sandbox/employment_update_params.rbi +1 -1
  109. data/rbi/lib/finch-api/models/sandbox/individual_update_params.rbi +1 -1
  110. data/rbi/lib/finch-api/models/sandbox/job_create_params.rbi +1 -1
  111. data/rbi/lib/finch-api/models/sandbox/jobs/configuration_retrieve_params.rbi +1 -1
  112. data/rbi/lib/finch-api/models/sandbox/jobs/configuration_retrieve_response.rbi +4 -1
  113. data/rbi/lib/finch-api/models/sandbox/jobs/configuration_update_params.rbi +1 -1
  114. data/rbi/lib/finch-api/models/sandbox/payment_create_params.rbi +1 -1
  115. data/rbi/lib/finch-api/page.rbi +1 -1
  116. data/rbi/lib/finch-api/request_options.rbi +0 -15
  117. data/rbi/lib/finch-api/responses_page.rbi +1 -1
  118. data/rbi/lib/finch-api/single_page.rbi +1 -1
  119. data/rbi/lib/finch-api/transport/base_client.rbi +204 -0
  120. data/rbi/lib/finch-api/transport/pooled_net_requester.rbi +64 -0
  121. data/rbi/lib/finch-api/type/array_of.rbi +82 -0
  122. data/rbi/lib/finch-api/type/base_model.rbi +191 -0
  123. data/rbi/lib/finch-api/type/base_page.rbi +38 -0
  124. data/rbi/lib/finch-api/type/boolean_model.rbi +41 -0
  125. data/rbi/lib/finch-api/type/converter.rbi +101 -0
  126. data/rbi/lib/finch-api/type/enum.rbi +58 -0
  127. data/rbi/lib/finch-api/type/hash_of.rbi +86 -0
  128. data/rbi/lib/finch-api/type/request_parameters.rbi +20 -0
  129. data/rbi/lib/finch-api/type/union.rbi +66 -0
  130. data/rbi/lib/finch-api/type/unknown.rbi +37 -0
  131. data/rbi/lib/finch-api/type.rbi +23 -0
  132. data/rbi/lib/finch-api/version.rbi +1 -1
  133. data/sig/finch-api/client.rbs +1 -1
  134. data/sig/finch-api/individuals_page.rbs +1 -1
  135. data/sig/finch-api/models/access_token_create_params.rbs +1 -1
  136. data/sig/finch-api/models/account_disconnect_params.rbs +1 -1
  137. data/sig/finch-api/models/account_introspect_params.rbs +1 -1
  138. data/sig/finch-api/models/connect/session_new_params.rbs +1 -1
  139. data/sig/finch-api/models/connect/session_reauthenticate_params.rbs +1 -1
  140. data/sig/finch-api/models/hris/benefit_create_params.rbs +1 -1
  141. data/sig/finch-api/models/hris/benefit_list_params.rbs +1 -1
  142. data/sig/finch-api/models/hris/benefit_list_supported_benefits_params.rbs +1 -1
  143. data/sig/finch-api/models/hris/benefit_retrieve_params.rbs +1 -1
  144. data/sig/finch-api/models/hris/benefit_update_params.rbs +1 -1
  145. data/sig/finch-api/models/hris/benefits/individual_enroll_many_params.rbs +1 -1
  146. data/sig/finch-api/models/hris/benefits/individual_enrolled_ids_params.rbs +1 -1
  147. data/sig/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rbs +1 -1
  148. data/sig/finch-api/models/hris/benefits/individual_unenroll_many_params.rbs +1 -1
  149. data/sig/finch-api/models/hris/company_retrieve_params.rbs +1 -1
  150. data/sig/finch-api/models/hris/directory_list_individuals_params.rbs +1 -1
  151. data/sig/finch-api/models/hris/directory_list_params.rbs +1 -1
  152. data/sig/finch-api/models/hris/document_list_params.rbs +1 -1
  153. data/sig/finch-api/models/hris/document_retreive_params.rbs +1 -1
  154. data/sig/finch-api/models/hris/employment_retrieve_many_params.rbs +1 -1
  155. data/sig/finch-api/models/hris/individual_retrieve_many_params.rbs +1 -1
  156. data/sig/finch-api/models/hris/pay_statement_retrieve_many_params.rbs +1 -1
  157. data/sig/finch-api/models/hris/payment_list_params.rbs +1 -1
  158. data/sig/finch-api/models/introspection.rbs +10 -1
  159. data/sig/finch-api/models/jobs/automated_create_params.rbs +1 -1
  160. data/sig/finch-api/models/jobs/automated_list_params.rbs +1 -1
  161. data/sig/finch-api/models/jobs/automated_retrieve_params.rbs +1 -1
  162. data/sig/finch-api/models/jobs/manual_retrieve_params.rbs +1 -1
  163. data/sig/finch-api/models/payroll/pay_group_list_params.rbs +1 -1
  164. data/sig/finch-api/models/payroll/pay_group_retrieve_params.rbs +1 -1
  165. data/sig/finch-api/models/provider_list_params.rbs +1 -1
  166. data/sig/finch-api/models/request_forwarding_forward_params.rbs +1 -1
  167. data/sig/finch-api/models/sandbox/company_update_params.rbs +1 -1
  168. data/sig/finch-api/models/sandbox/connection_create_params.rbs +1 -1
  169. data/sig/finch-api/models/sandbox/connections/account_create_params.rbs +1 -1
  170. data/sig/finch-api/models/sandbox/connections/account_update_params.rbs +1 -1
  171. data/sig/finch-api/models/sandbox/directory_create_params.rbs +1 -1
  172. data/sig/finch-api/models/sandbox/employment_update_params.rbs +1 -1
  173. data/sig/finch-api/models/sandbox/individual_update_params.rbs +1 -1
  174. data/sig/finch-api/models/sandbox/job_create_params.rbs +1 -1
  175. data/sig/finch-api/models/sandbox/jobs/configuration_retrieve_params.rbs +1 -1
  176. data/sig/finch-api/models/sandbox/jobs/configuration_update_params.rbs +1 -1
  177. data/sig/finch-api/models/sandbox/payment_create_params.rbs +1 -1
  178. data/sig/finch-api/page.rbs +1 -1
  179. data/sig/finch-api/request_options.rbs +0 -10
  180. data/sig/finch-api/responses_page.rbs +1 -1
  181. data/sig/finch-api/single_page.rbs +1 -1
  182. data/sig/finch-api/transport/base_client.rbs +110 -0
  183. data/sig/finch-api/transport/pooled_net_requester.rbs +39 -0
  184. data/sig/finch-api/type/array_of.rbs +36 -0
  185. data/sig/finch-api/type/base_model.rbs +73 -0
  186. data/sig/finch-api/type/base_page.rbs +22 -0
  187. data/sig/finch-api/type/boolean_model.rbs +18 -0
  188. data/sig/finch-api/type/converter.rbs +36 -0
  189. data/sig/finch-api/type/enum.rbs +22 -0
  190. data/sig/finch-api/type/hash_of.rbs +36 -0
  191. data/sig/finch-api/type/request_parameters.rbs +13 -0
  192. data/sig/finch-api/type/union.rbs +37 -0
  193. data/sig/finch-api/type/unknown.rbs +18 -0
  194. data/sig/finch-api/type.rbs +22 -0
  195. data/sig/finch-api/version.rbs +1 -1
  196. metadata +41 -17
  197. data/lib/finch-api/base_client.rb +0 -457
  198. data/lib/finch-api/base_model.rb +0 -1226
  199. data/lib/finch-api/base_page.rb +0 -59
  200. data/lib/finch-api/extern.rb +0 -7
  201. data/lib/finch-api/pooled_net_requester.rb +0 -180
  202. data/rbi/lib/finch-api/base_client.rbi +0 -196
  203. data/rbi/lib/finch-api/base_model.rbi +0 -643
  204. data/rbi/lib/finch-api/base_page.rbi +0 -36
  205. data/rbi/lib/finch-api/extern.rbi +0 -7
  206. data/rbi/lib/finch-api/pooled_net_requester.rbi +0 -59
  207. data/sig/finch-api/base_client.rbs +0 -106
  208. data/sig/finch-api/base_model.rbs +0 -260
  209. data/sig/finch-api/base_page.rbs +0 -20
  210. data/sig/finch-api/extern.rbs +0 -4
  211. data/sig/finch-api/pooled_net_requester.rbs +0 -37
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FinchAPI
4
+ module Type
5
+ # @api private
6
+ #
7
+ # @abstract
8
+ #
9
+ # Array of items of a given type.
10
+ class ArrayOf
11
+ include FinchAPI::Type::Converter
12
+
13
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Type::Converter, Class]
14
+ #
15
+ # @param spec [Hash{Symbol=>Object}] .
16
+ #
17
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
18
+ #
19
+ # @option spec [Proc] :enum
20
+ #
21
+ # @option spec [Proc] :union
22
+ #
23
+ # @option spec [Boolean] :"nil?"
24
+ def self.[](type_info, spec = {}) = new(type_info, spec)
25
+
26
+ # @param other [Object]
27
+ #
28
+ # @return [Boolean]
29
+ def ===(other) = other.is_a?(Array) && other.all?(item_type)
30
+
31
+ # @param other [Object]
32
+ #
33
+ # @return [Boolean]
34
+ def ==(other) = other.is_a?(FinchAPI::ArrayOf) && other.nilable? == nilable? && other.item_type == item_type
35
+
36
+ # @api private
37
+ #
38
+ # @param value [Enumerable, Object]
39
+ #
40
+ # @param state [Hash{Symbol=>Object}] .
41
+ #
42
+ # @option state [Boolean, :strong] :strictness
43
+ #
44
+ # @option state [Hash{Symbol=>Object}] :exactness
45
+ #
46
+ # @option state [Integer] :branched
47
+ #
48
+ # @return [Array<Object>, Object]
49
+ def coerce(value, state:)
50
+ exactness = state.fetch(:exactness)
51
+
52
+ unless value.is_a?(Array)
53
+ exactness[:no] += 1
54
+ return value
55
+ end
56
+
57
+ target = item_type
58
+ exactness[:yes] += 1
59
+ value
60
+ .map do |item|
61
+ case [nilable?, item]
62
+ in [true, nil]
63
+ exactness[:yes] += 1
64
+ nil
65
+ else
66
+ FinchAPI::Type::Converter.coerce(target, item, state: state)
67
+ end
68
+ end
69
+ end
70
+
71
+ # @api private
72
+ #
73
+ # @param value [Enumerable, Object]
74
+ #
75
+ # @return [Array<Object>, Object]
76
+ def dump(value)
77
+ target = item_type
78
+ value.is_a?(Array) ? value.map { FinchAPI::Type::Converter.dump(target, _1) } : super
79
+ end
80
+
81
+ # @api private
82
+ #
83
+ # @return [FinchAPI::Type::Converter, Class]
84
+ protected def item_type = @item_type_fn.call
85
+
86
+ # @api private
87
+ #
88
+ # @return [Boolean]
89
+ protected def nilable? = @nilable
90
+
91
+ # @api private
92
+ #
93
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Type::Converter, Class]
94
+ #
95
+ # @param spec [Hash{Symbol=>Object}] .
96
+ #
97
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
98
+ #
99
+ # @option spec [Proc] :enum
100
+ #
101
+ # @option spec [Proc] :union
102
+ #
103
+ # @option spec [Boolean] :"nil?"
104
+ def initialize(type_info, spec = {})
105
+ @item_type_fn = FinchAPI::Type::Converter.type_info(type_info || spec)
106
+ @nilable = spec[:nil?]
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,355 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FinchAPI
4
+ module Type
5
+ # @abstract
6
+ #
7
+ # @example
8
+ # # `operation_support_matrix` is a `FinchAPI::Models::OperationSupportMatrix`
9
+ # operation_support_matrix => {
10
+ # create: create,
11
+ # delete: delete,
12
+ # read: read
13
+ # }
14
+ class BaseModel
15
+ extend FinchAPI::Type::Converter
16
+
17
+ class << self
18
+ # @api private
19
+ #
20
+ # Assumes superclass fields are totally defined before fields are accessed /
21
+ # defined on subclasses.
22
+ #
23
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
24
+ def known_fields
25
+ @known_fields ||= (self < FinchAPI::BaseModel ? superclass.known_fields.dup : {})
26
+ end
27
+
28
+ # @api private
29
+ #
30
+ # @return [Hash{Symbol=>Hash{Symbol=>Object}}]
31
+ def fields
32
+ known_fields.transform_values do |field|
33
+ {**field.except(:type_fn), type: field.fetch(:type_fn).call}
34
+ end
35
+ end
36
+
37
+ # @api private
38
+ #
39
+ # @param name_sym [Symbol]
40
+ #
41
+ # @param required [Boolean]
42
+ #
43
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Type::Converter, Class]
44
+ #
45
+ # @param spec [Hash{Symbol=>Object}] .
46
+ #
47
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
48
+ #
49
+ # @option spec [Proc] :enum
50
+ #
51
+ # @option spec [Proc] :union
52
+ #
53
+ # @option spec [Boolean] :"nil?"
54
+ private def add_field(name_sym, required:, type_info:, spec:)
55
+ type_fn, info =
56
+ case type_info
57
+ in Proc | FinchAPI::Type::Converter | Class
58
+ [FinchAPI::Type::Converter.type_info({**spec, union: type_info}), spec]
59
+ in Hash
60
+ [FinchAPI::Type::Converter.type_info(type_info), type_info]
61
+ end
62
+
63
+ setter = "#{name_sym}="
64
+ api_name = info.fetch(:api_name, name_sym)
65
+ nilable = info[:nil?]
66
+ const = required && !nilable ? info.fetch(:const, FinchAPI::Util::OMIT) : FinchAPI::Util::OMIT
67
+
68
+ [name_sym, setter].each { undef_method(_1) } if known_fields.key?(name_sym)
69
+
70
+ known_fields[name_sym] =
71
+ {
72
+ mode: @mode,
73
+ api_name: api_name,
74
+ required: required,
75
+ nilable: nilable,
76
+ const: const,
77
+ type_fn: type_fn
78
+ }
79
+
80
+ define_method(setter) { @data.store(name_sym, _1) }
81
+
82
+ define_method(name_sym) do
83
+ target = type_fn.call
84
+ value = @data.fetch(name_sym) { const == FinchAPI::Util::OMIT ? nil : const }
85
+ state = {strictness: :strong, exactness: {yes: 0, no: 0, maybe: 0}, branched: 0}
86
+ if (nilable || !required) && value.nil?
87
+ nil
88
+ else
89
+ FinchAPI::Type::Converter.coerce(
90
+ target,
91
+ value,
92
+ state: state
93
+ )
94
+ end
95
+ rescue StandardError
96
+ cls = self.class.name.split("::").last
97
+ message = "Failed to parse #{cls}.#{__method__} from #{value.class} to #{target.inspect}. To get the unparsed API response, use #{cls}[:#{__method__}]."
98
+ raise FinchAPI::ConversionError.new(message)
99
+ end
100
+ end
101
+
102
+ # @api private
103
+ #
104
+ # @param name_sym [Symbol]
105
+ #
106
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Type::Converter, Class]
107
+ #
108
+ # @param spec [Hash{Symbol=>Object}] .
109
+ #
110
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
111
+ #
112
+ # @option spec [Proc] :enum
113
+ #
114
+ # @option spec [Proc] :union
115
+ #
116
+ # @option spec [Boolean] :"nil?"
117
+ def required(name_sym, type_info, spec = {})
118
+ add_field(name_sym, required: true, type_info: type_info, spec: spec)
119
+ end
120
+
121
+ # @api private
122
+ #
123
+ # @param name_sym [Symbol]
124
+ #
125
+ # @param type_info [Hash{Symbol=>Object}, Proc, FinchAPI::Type::Converter, Class]
126
+ #
127
+ # @param spec [Hash{Symbol=>Object}] .
128
+ #
129
+ # @option spec [NilClass, TrueClass, FalseClass, Integer, Float, Symbol] :const
130
+ #
131
+ # @option spec [Proc] :enum
132
+ #
133
+ # @option spec [Proc] :union
134
+ #
135
+ # @option spec [Boolean] :"nil?"
136
+ def optional(name_sym, type_info, spec = {})
137
+ add_field(name_sym, required: false, type_info: type_info, spec: spec)
138
+ end
139
+
140
+ # @api private
141
+ #
142
+ # `request_only` attributes not excluded from `.#coerce` when receiving responses
143
+ # even if well behaved servers should not send them
144
+ #
145
+ # @param blk [Proc]
146
+ private def request_only(&blk)
147
+ @mode = :dump
148
+ blk.call
149
+ ensure
150
+ @mode = nil
151
+ end
152
+
153
+ # @api private
154
+ #
155
+ # `response_only` attributes are omitted from `.#dump` when making requests
156
+ #
157
+ # @param blk [Proc]
158
+ private def response_only(&blk)
159
+ @mode = :coerce
160
+ blk.call
161
+ ensure
162
+ @mode = nil
163
+ end
164
+
165
+ # @param other [Object]
166
+ #
167
+ # @return [Boolean]
168
+ def ==(other) = other.is_a?(Class) && other <= FinchAPI::BaseModel && other.fields == fields
169
+ end
170
+
171
+ # @param other [Object]
172
+ #
173
+ # @return [Boolean]
174
+ def ==(other) = self.class == other.class && @data == other.to_h
175
+
176
+ class << self
177
+ # @api private
178
+ #
179
+ # @param value [FinchAPI::BaseModel, Hash{Object=>Object}, Object]
180
+ #
181
+ # @param state [Hash{Symbol=>Object}] .
182
+ #
183
+ # @option state [Boolean, :strong] :strictness
184
+ #
185
+ # @option state [Hash{Symbol=>Object}] :exactness
186
+ #
187
+ # @option state [Integer] :branched
188
+ #
189
+ # @return [FinchAPI::BaseModel, Object]
190
+ def coerce(value, state:)
191
+ exactness = state.fetch(:exactness)
192
+
193
+ if value.is_a?(self.class)
194
+ exactness[:yes] += 1
195
+ return value
196
+ end
197
+
198
+ unless (val = FinchAPI::Util.coerce_hash(value)).is_a?(Hash)
199
+ exactness[:no] += 1
200
+ return value
201
+ end
202
+ exactness[:yes] += 1
203
+
204
+ keys = val.keys.to_set
205
+ instance = new
206
+ data = instance.to_h
207
+
208
+ fields.each do |name, field|
209
+ mode, required, target = field.fetch_values(:mode, :required, :type)
210
+ api_name, nilable, const = field.fetch_values(:api_name, :nilable, :const)
211
+
212
+ unless val.key?(api_name)
213
+ if const != FinchAPI::Util::OMIT
214
+ exactness[:yes] += 1
215
+ elsif required && mode != :dump
216
+ exactness[nilable ? :maybe : :no] += 1
217
+ else
218
+ exactness[:yes] += 1
219
+ end
220
+ next
221
+ end
222
+
223
+ item = val.fetch(api_name)
224
+ keys.delete(api_name)
225
+
226
+ converted =
227
+ if item.nil? && (nilable || !required)
228
+ exactness[nilable ? :yes : :maybe] += 1
229
+ nil
230
+ else
231
+ coerced = FinchAPI::Type::Converter.coerce(target, item, state: state)
232
+ case target
233
+ in FinchAPI::Type::Converter | Symbol
234
+ coerced
235
+ else
236
+ item
237
+ end
238
+ end
239
+ data.store(name, converted)
240
+ end
241
+
242
+ keys.each { data.store(_1, val.fetch(_1)) }
243
+ instance
244
+ end
245
+
246
+ # @api private
247
+ #
248
+ # @param value [FinchAPI::BaseModel, Object]
249
+ #
250
+ # @return [Hash{Object=>Object}, Object]
251
+ def dump(value)
252
+ unless (coerced = FinchAPI::Util.coerce_hash(value)).is_a?(Hash)
253
+ return super
254
+ end
255
+
256
+ acc = {}
257
+
258
+ coerced.each do |key, val|
259
+ name = key.is_a?(String) ? key.to_sym : key
260
+ case (field = known_fields[name])
261
+ in nil
262
+ acc.store(name, super(val))
263
+ else
264
+ mode, api_name, type_fn = field.fetch_values(:mode, :api_name, :type_fn)
265
+ case mode
266
+ in :coerce
267
+ next
268
+ else
269
+ target = type_fn.call
270
+ acc.store(api_name, FinchAPI::Type::Converter.dump(target, val))
271
+ end
272
+ end
273
+ end
274
+
275
+ known_fields.each_value do |field|
276
+ mode, api_name, const = field.fetch_values(:mode, :api_name, :const)
277
+ next if mode == :coerce || acc.key?(api_name) || const == FinchAPI::Util::OMIT
278
+ acc.store(api_name, const)
279
+ end
280
+
281
+ acc
282
+ end
283
+ end
284
+
285
+ # Returns the raw value associated with the given key, if found. Otherwise, nil is
286
+ # returned.
287
+ #
288
+ # It is valid to lookup keys that are not in the API spec, for example to access
289
+ # undocumented features. This method does not parse response data into
290
+ # higher-level types. Lookup by anything other than a Symbol is an ArgumentError.
291
+ #
292
+ # @param key [Symbol]
293
+ #
294
+ # @return [Object, nil]
295
+ def [](key)
296
+ unless key.instance_of?(Symbol)
297
+ raise ArgumentError.new("Expected symbol key for lookup, got #{key.inspect}")
298
+ end
299
+
300
+ @data[key]
301
+ end
302
+
303
+ # Returns a Hash of the data underlying this object. O(1)
304
+ #
305
+ # Keys are Symbols and values are the raw values from the response. The return
306
+ # value indicates which values were ever set on the object. i.e. there will be a
307
+ # key in this hash if they ever were, even if the set value was nil.
308
+ #
309
+ # This method is not recursive. The returned value is shared by the object, so it
310
+ # should not be mutated.
311
+ #
312
+ # @return [Hash{Symbol=>Object}]
313
+ def to_h = @data
314
+
315
+ alias_method :to_hash, :to_h
316
+
317
+ # @param keys [Array<Symbol>, nil]
318
+ #
319
+ # @return [Hash{Symbol=>Object}]
320
+ def deconstruct_keys(keys)
321
+ (keys || self.class.known_fields.keys)
322
+ .filter_map do |k|
323
+ unless self.class.known_fields.key?(k)
324
+ next
325
+ end
326
+
327
+ [k, public_send(k)]
328
+ end
329
+ .to_h
330
+ end
331
+
332
+ # Create a new instance of a model.
333
+ #
334
+ # @param data [Hash{Symbol=>Object}, FinchAPI::BaseModel]
335
+ def initialize(data = {})
336
+ case FinchAPI::Util.coerce_hash(data)
337
+ in Hash => coerced
338
+ @data = coerced
339
+ else
340
+ raise ArgumentError.new("Expected a #{Hash} or #{FinchAPI::BaseModel}, got #{data.inspect}")
341
+ end
342
+ end
343
+
344
+ # @return [String]
345
+ def inspect
346
+ rows = self.class.known_fields.keys.map do
347
+ "#{_1}=#{@data.key?(_1) ? public_send(_1) : ''}"
348
+ rescue FinchAPI::ConversionError
349
+ "#{_1}=#{@data.fetch(_1)}"
350
+ end
351
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} #{rows.join(' ')}>"
352
+ end
353
+ end
354
+ end
355
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FinchAPI
4
+ module Type
5
+ # @example
6
+ # if page.has_next?
7
+ # page = page.next_page
8
+ # end
9
+ #
10
+ # @example
11
+ # page.auto_paging_each do |access_token|
12
+ # puts(access_token)
13
+ # end
14
+ #
15
+ # @example
16
+ # access_tokens =
17
+ # page
18
+ # .to_enum
19
+ # .lazy
20
+ # .select { _1.object_id.even? }
21
+ # .map(&:itself)
22
+ # .take(2)
23
+ # .to_a
24
+ #
25
+ # access_tokens => Array
26
+ module BasePage
27
+ # rubocop:disable Lint/UnusedMethodArgument
28
+
29
+ # @return [Boolean]
30
+ def next_page? = (raise NotImplementedError)
31
+
32
+ # @raise [FinchAPI::APIError]
33
+ # @return [FinchAPI::Type::BasePage]
34
+ def next_page = (raise NotImplementedError)
35
+
36
+ # @param blk [Proc]
37
+ #
38
+ # @return [void]
39
+ def auto_paging_each(&) = (raise NotImplementedError)
40
+
41
+ # @return [Enumerable]
42
+ def to_enum = super(:auto_paging_each)
43
+
44
+ alias_method :enum_for, :to_enum
45
+
46
+ # @api private
47
+ #
48
+ # @param client [FinchAPI::Transport::BaseClient]
49
+ # @param req [Hash{Symbol=>Object}]
50
+ # @param headers [Hash{String=>String}, Net::HTTPHeader]
51
+ # @param page_data [Object]
52
+ def initialize(client:, req:, headers:, page_data:)
53
+ @client = client
54
+ @req = req
55
+ super()
56
+ end
57
+
58
+ # rubocop:enable Lint/UnusedMethodArgument
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FinchAPI
4
+ module Type
5
+ # @api private
6
+ #
7
+ # @abstract
8
+ #
9
+ # Ruby has no Boolean class; this is something for models to refer to.
10
+ class BooleanModel
11
+ extend FinchAPI::Type::Converter
12
+
13
+ # @param other [Object]
14
+ #
15
+ # @return [Boolean]
16
+ def self.===(other) = other == true || other == false
17
+
18
+ # @param other [Object]
19
+ #
20
+ # @return [Boolean]
21
+ def self.==(other) = other.is_a?(Class) && other <= FinchAPI::BooleanModel
22
+
23
+ class << self
24
+ # @api private
25
+ #
26
+ # @param value [Boolean, Object]
27
+ #
28
+ # @param state [Hash{Symbol=>Object}] .
29
+ #
30
+ # @option state [Boolean, :strong] :strictness
31
+ #
32
+ # @option state [Hash{Symbol=>Object}] :exactness
33
+ #
34
+ # @option state [Integer] :branched
35
+ #
36
+ # @return [Boolean, Object]
37
+ def coerce(value, state:)
38
+ state.fetch(:exactness)[value == true || value == false ? :yes : :no] += 1
39
+ value
40
+ end
41
+
42
+ # @!parse
43
+ # # @api private
44
+ # #
45
+ # # @param value [Boolean, Object]
46
+ # #
47
+ # # @return [Boolean, Object]
48
+ # def dump(value) = super
49
+ end
50
+ end
51
+ end
52
+ end