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.
- checksums.yaml +4 -4
- data/README.md +2 -8
- data/lib/finch-api/client.rb +1 -1
- data/lib/finch-api/individuals_page.rb +4 -4
- data/lib/finch-api/models/access_token_create_params.rb +1 -1
- data/lib/finch-api/models/account_disconnect_params.rb +1 -1
- data/lib/finch-api/models/account_introspect_params.rb +1 -1
- data/lib/finch-api/models/connect/session_new_params.rb +1 -1
- data/lib/finch-api/models/connect/session_reauthenticate_params.rb +1 -1
- data/lib/finch-api/models/hris/benefit_create_params.rb +1 -1
- data/lib/finch-api/models/hris/benefit_list_params.rb +1 -1
- data/lib/finch-api/models/hris/benefit_list_supported_benefits_params.rb +1 -1
- data/lib/finch-api/models/hris/benefit_retrieve_params.rb +1 -1
- data/lib/finch-api/models/hris/benefit_update_params.rb +1 -1
- data/lib/finch-api/models/hris/benefits/individual_enroll_many_params.rb +1 -1
- data/lib/finch-api/models/hris/benefits/individual_enrolled_ids_params.rb +1 -1
- data/lib/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rb +1 -1
- data/lib/finch-api/models/hris/benefits/individual_unenroll_many_params.rb +1 -1
- data/lib/finch-api/models/hris/company_retrieve_params.rb +1 -1
- data/lib/finch-api/models/hris/directory_list_individuals_params.rb +1 -1
- data/lib/finch-api/models/hris/directory_list_params.rb +1 -1
- data/lib/finch-api/models/hris/document_list_params.rb +1 -1
- data/lib/finch-api/models/hris/document_retreive_params.rb +1 -1
- data/lib/finch-api/models/hris/employment_retrieve_many_params.rb +1 -1
- data/lib/finch-api/models/hris/individual_retrieve_many_params.rb +1 -1
- data/lib/finch-api/models/hris/pay_statement_retrieve_many_params.rb +1 -1
- data/lib/finch-api/models/hris/payment_list_params.rb +1 -1
- data/lib/finch-api/models/introspection.rb +12 -1
- data/lib/finch-api/models/jobs/automated_create_params.rb +1 -1
- data/lib/finch-api/models/jobs/automated_list_params.rb +1 -1
- data/lib/finch-api/models/jobs/automated_retrieve_params.rb +1 -1
- data/lib/finch-api/models/jobs/manual_retrieve_params.rb +1 -1
- data/lib/finch-api/models/payroll/pay_group_list_params.rb +1 -1
- data/lib/finch-api/models/payroll/pay_group_retrieve_params.rb +1 -1
- data/lib/finch-api/models/provider_list_params.rb +1 -1
- data/lib/finch-api/models/request_forwarding_forward_params.rb +1 -1
- data/lib/finch-api/models/sandbox/company_update_params.rb +1 -1
- data/lib/finch-api/models/sandbox/connection_create_params.rb +1 -1
- data/lib/finch-api/models/sandbox/connections/account_create_params.rb +1 -1
- data/lib/finch-api/models/sandbox/connections/account_update_params.rb +1 -1
- data/lib/finch-api/models/sandbox/directory_create_params.rb +1 -1
- data/lib/finch-api/models/sandbox/employment_update_params.rb +1 -1
- data/lib/finch-api/models/sandbox/individual_update_params.rb +1 -1
- data/lib/finch-api/models/sandbox/job_create_params.rb +1 -1
- data/lib/finch-api/models/sandbox/jobs/configuration_retrieve_params.rb +1 -1
- data/lib/finch-api/models/sandbox/jobs/configuration_update_params.rb +1 -1
- data/lib/finch-api/models/sandbox/payment_create_params.rb +1 -1
- data/lib/finch-api/page.rb +4 -4
- data/lib/finch-api/request_options.rb +0 -33
- data/lib/finch-api/responses_page.rb +3 -3
- data/lib/finch-api/single_page.rb +3 -3
- data/lib/finch-api/transport/base_client.rb +459 -0
- data/lib/finch-api/transport/pooled_net_requester.rb +182 -0
- data/lib/finch-api/type/array_of.rb +110 -0
- data/lib/finch-api/type/base_model.rb +355 -0
- data/lib/finch-api/type/base_page.rb +61 -0
- data/lib/finch-api/type/boolean_model.rb +52 -0
- data/lib/finch-api/type/converter.rb +211 -0
- data/lib/finch-api/type/enum.rb +105 -0
- data/lib/finch-api/type/hash_of.rb +136 -0
- data/lib/finch-api/type/request_parameters.rb +38 -0
- data/lib/finch-api/type/union.rb +204 -0
- data/lib/finch-api/type/unknown.rb +56 -0
- data/lib/finch-api/type.rb +23 -0
- data/lib/finch-api/util.rb +3 -5
- data/lib/finch-api/version.rb +1 -1
- data/lib/finch-api.rb +13 -5
- data/rbi/lib/finch-api/client.rbi +1 -1
- data/rbi/lib/finch-api/individuals_page.rbi +1 -1
- data/rbi/lib/finch-api/models/access_token_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/account_disconnect_params.rbi +1 -1
- data/rbi/lib/finch-api/models/account_introspect_params.rbi +1 -1
- data/rbi/lib/finch-api/models/connect/session_new_params.rbi +1 -1
- data/rbi/lib/finch-api/models/connect/session_reauthenticate_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefit_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefit_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefit_list_supported_benefits_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefit_retrieve_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefit_update_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefits/individual_enroll_many_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefits/individual_enrolled_ids_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/benefits/individual_unenroll_many_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/company_retrieve_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/directory_list_individuals_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/directory_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/document_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/document_retreive_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/employment_retrieve_many_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/individual_retrieve_many_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/pay_statement_retrieve_many_params.rbi +1 -1
- data/rbi/lib/finch-api/models/hris/payment_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/introspection.rbi +20 -3
- data/rbi/lib/finch-api/models/jobs/automated_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/jobs/automated_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/jobs/automated_retrieve_params.rbi +1 -1
- data/rbi/lib/finch-api/models/jobs/manual_retrieve_params.rbi +1 -1
- data/rbi/lib/finch-api/models/payroll/pay_group_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/payroll/pay_group_retrieve_params.rbi +1 -1
- data/rbi/lib/finch-api/models/provider_list_params.rbi +1 -1
- data/rbi/lib/finch-api/models/request_forwarding_forward_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/company_update_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/connection_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/connections/account_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/connections/account_update_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/directory_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/directory_create_response.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/employment_update_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/individual_update_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/job_create_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/jobs/configuration_retrieve_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/jobs/configuration_retrieve_response.rbi +4 -1
- data/rbi/lib/finch-api/models/sandbox/jobs/configuration_update_params.rbi +1 -1
- data/rbi/lib/finch-api/models/sandbox/payment_create_params.rbi +1 -1
- data/rbi/lib/finch-api/page.rbi +1 -1
- data/rbi/lib/finch-api/request_options.rbi +0 -15
- data/rbi/lib/finch-api/responses_page.rbi +1 -1
- data/rbi/lib/finch-api/single_page.rbi +1 -1
- data/rbi/lib/finch-api/transport/base_client.rbi +204 -0
- data/rbi/lib/finch-api/transport/pooled_net_requester.rbi +64 -0
- data/rbi/lib/finch-api/type/array_of.rbi +82 -0
- data/rbi/lib/finch-api/type/base_model.rbi +191 -0
- data/rbi/lib/finch-api/type/base_page.rbi +38 -0
- data/rbi/lib/finch-api/type/boolean_model.rbi +41 -0
- data/rbi/lib/finch-api/type/converter.rbi +101 -0
- data/rbi/lib/finch-api/type/enum.rbi +58 -0
- data/rbi/lib/finch-api/type/hash_of.rbi +86 -0
- data/rbi/lib/finch-api/type/request_parameters.rbi +20 -0
- data/rbi/lib/finch-api/type/union.rbi +66 -0
- data/rbi/lib/finch-api/type/unknown.rbi +37 -0
- data/rbi/lib/finch-api/type.rbi +23 -0
- data/rbi/lib/finch-api/version.rbi +1 -1
- data/sig/finch-api/client.rbs +1 -1
- data/sig/finch-api/individuals_page.rbs +1 -1
- data/sig/finch-api/models/access_token_create_params.rbs +1 -1
- data/sig/finch-api/models/account_disconnect_params.rbs +1 -1
- data/sig/finch-api/models/account_introspect_params.rbs +1 -1
- data/sig/finch-api/models/connect/session_new_params.rbs +1 -1
- data/sig/finch-api/models/connect/session_reauthenticate_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefit_create_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefit_list_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefit_list_supported_benefits_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefit_retrieve_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefit_update_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefits/individual_enroll_many_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefits/individual_enrolled_ids_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefits/individual_retrieve_many_benefits_params.rbs +1 -1
- data/sig/finch-api/models/hris/benefits/individual_unenroll_many_params.rbs +1 -1
- data/sig/finch-api/models/hris/company_retrieve_params.rbs +1 -1
- data/sig/finch-api/models/hris/directory_list_individuals_params.rbs +1 -1
- data/sig/finch-api/models/hris/directory_list_params.rbs +1 -1
- data/sig/finch-api/models/hris/document_list_params.rbs +1 -1
- data/sig/finch-api/models/hris/document_retreive_params.rbs +1 -1
- data/sig/finch-api/models/hris/employment_retrieve_many_params.rbs +1 -1
- data/sig/finch-api/models/hris/individual_retrieve_many_params.rbs +1 -1
- data/sig/finch-api/models/hris/pay_statement_retrieve_many_params.rbs +1 -1
- data/sig/finch-api/models/hris/payment_list_params.rbs +1 -1
- data/sig/finch-api/models/introspection.rbs +10 -1
- data/sig/finch-api/models/jobs/automated_create_params.rbs +1 -1
- data/sig/finch-api/models/jobs/automated_list_params.rbs +1 -1
- data/sig/finch-api/models/jobs/automated_retrieve_params.rbs +1 -1
- data/sig/finch-api/models/jobs/manual_retrieve_params.rbs +1 -1
- data/sig/finch-api/models/payroll/pay_group_list_params.rbs +1 -1
- data/sig/finch-api/models/payroll/pay_group_retrieve_params.rbs +1 -1
- data/sig/finch-api/models/provider_list_params.rbs +1 -1
- data/sig/finch-api/models/request_forwarding_forward_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/company_update_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/connection_create_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/connections/account_create_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/connections/account_update_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/directory_create_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/employment_update_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/individual_update_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/job_create_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/jobs/configuration_retrieve_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/jobs/configuration_update_params.rbs +1 -1
- data/sig/finch-api/models/sandbox/payment_create_params.rbs +1 -1
- data/sig/finch-api/page.rbs +1 -1
- data/sig/finch-api/request_options.rbs +0 -10
- data/sig/finch-api/responses_page.rbs +1 -1
- data/sig/finch-api/single_page.rbs +1 -1
- data/sig/finch-api/transport/base_client.rbs +110 -0
- data/sig/finch-api/transport/pooled_net_requester.rbs +39 -0
- data/sig/finch-api/type/array_of.rbs +36 -0
- data/sig/finch-api/type/base_model.rbs +73 -0
- data/sig/finch-api/type/base_page.rbs +22 -0
- data/sig/finch-api/type/boolean_model.rbs +18 -0
- data/sig/finch-api/type/converter.rbs +36 -0
- data/sig/finch-api/type/enum.rbs +22 -0
- data/sig/finch-api/type/hash_of.rbs +36 -0
- data/sig/finch-api/type/request_parameters.rbs +13 -0
- data/sig/finch-api/type/union.rbs +37 -0
- data/sig/finch-api/type/unknown.rbs +18 -0
- data/sig/finch-api/type.rbs +22 -0
- data/sig/finch-api/version.rbs +1 -1
- metadata +41 -17
- data/lib/finch-api/base_client.rb +0 -457
- data/lib/finch-api/base_model.rb +0 -1226
- data/lib/finch-api/base_page.rb +0 -59
- data/lib/finch-api/extern.rb +0 -7
- data/lib/finch-api/pooled_net_requester.rb +0 -180
- data/rbi/lib/finch-api/base_client.rbi +0 -196
- data/rbi/lib/finch-api/base_model.rbi +0 -643
- data/rbi/lib/finch-api/base_page.rbi +0 -36
- data/rbi/lib/finch-api/extern.rbi +0 -7
- data/rbi/lib/finch-api/pooled_net_requester.rbi +0 -59
- data/sig/finch-api/base_client.rbs +0 -106
- data/sig/finch-api/base_model.rbs +0 -260
- data/sig/finch-api/base_page.rbs +0 -20
- data/sig/finch-api/extern.rbs +0 -4
- 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
|