noresponse 8.2.0 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_response/accounts.rb +2 -2
  3. data/lib/no_response/assessments.rb +298 -5
  4. data/lib/no_response/models/operations/aggregateassessments_response.rb +32 -0
  5. data/lib/no_response/models/operations/aggregateassessments_response.rbi +20 -0
  6. data/lib/no_response/models/operations.rb +1 -0
  7. data/lib/no_response/models/shared/aggregatebucket.rb +73 -0
  8. data/lib/no_response/models/shared/aggregatebucket.rbi +38 -0
  9. data/lib/no_response/models/shared/aggregatedimension.rb +26 -0
  10. data/lib/no_response/models/shared/aggregatedimension.rbi +9 -0
  11. data/lib/no_response/models/shared/aggregategroup.rb +179 -0
  12. data/lib/no_response/models/shared/aggregategroup.rbi +74 -0
  13. data/lib/no_response/models/shared/aggregatelateflip.rb +83 -0
  14. data/lib/no_response/models/shared/aggregatelateflip.rbi +32 -0
  15. data/lib/no_response/models/shared/aggregatescorecount.rb +63 -0
  16. data/lib/no_response/models/shared/aggregatescorecount.rbi +32 -0
  17. data/lib/no_response/models/shared/answerrevision.rb +16 -0
  18. data/lib/no_response/models/shared/answerrevision.rbi +9 -0
  19. data/lib/no_response/models/shared/assessmentaggregate.rb +121 -0
  20. data/lib/no_response/models/shared/assessmentaggregate.rbi +62 -0
  21. data/lib/no_response/models/shared/assessmentaggregate_metric.rb +20 -0
  22. data/lib/no_response/models/shared/assessmentaggregate_metric.rbi +9 -0
  23. data/lib/no_response/models/shared/assessmentaggregaterequest.rb +163 -0
  24. data/lib/no_response/models/shared/assessmentaggregaterequest.rbi +74 -0
  25. data/lib/no_response/models/shared/assessmentaggregaterequest_metric.rb +17 -0
  26. data/lib/no_response/models/shared/assessmentaggregaterequest_metric.rbi +9 -0
  27. data/lib/no_response/models/shared/assessmentdetail.rb +10 -0
  28. data/lib/no_response/models/shared/assessmentdetail.rbi +6 -0
  29. data/lib/no_response/models/shared/assessmentsearchrequest.rb +17 -2
  30. data/lib/no_response/models/shared/assessmentsearchrequest.rbi +6 -0
  31. data/lib/no_response/models/shared/bucket.rb +20 -0
  32. data/lib/no_response/models/shared/bucket.rbi +9 -0
  33. data/lib/no_response/models/shared/decision.rb +5 -2
  34. data/lib/no_response/models/shared/delay.rb +23 -0
  35. data/lib/no_response/models/shared/delay.rbi +9 -0
  36. data/lib/no_response/models/shared/listmatch.rb +19 -0
  37. data/lib/no_response/models/shared/listmatch.rbi +9 -0
  38. data/lib/no_response/models/shared/sentidentifiers.rb +74 -0
  39. data/lib/no_response/models/shared/sentidentifiers.rbi +38 -0
  40. data/lib/no_response/models/shared.rb +14 -0
  41. data/lib/no_response/sdkconfiguration.rb +2 -2
  42. metadata +31 -1
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentAggregateMetric
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentAggregateMetric
9
+ end
@@ -0,0 +1,163 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # Count this environment's assessments created in [from,to) by bucket, from counts kept as each assessment is first answered, not by scanning assessments. Each assessment counts once, by its first answer (the answer served when it was first answered); later revisions and late results do not count it again, and late_flips counts its later account decision changes. from and to start a bucket (an hour, a UTC day, or a week from Monday 00:00 UTC), cover at most 366 days (31 for hour buckets) and from is inside the retention period. The filters are POST /v1/assessments/search's and describe the first answer, so a cell drills down to search with the same filters, revision first and the cell's bucket as from and to. Counts hold no identifier and stay when an assessment or account is deleted or erased; they expire with retention and go with the workspace. Reasons are counted by code and impact band, not by weight. No Idempotency-Key.
8
+ class AssessmentAggregateRequest
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The first bucket's start.
13
+ field :from, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("from"), required: true}}
14
+ # The end, excluded: the start of the bucket after the last.
15
+ field :to, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("to"), required: true}}
16
+ # The period each count covers, in UTC; a week starts on Monday.
17
+ field(
18
+ :bucket,
19
+ Models::Shared::Bucket,
20
+ {
21
+ 'format_json': {
22
+ 'letter_case': ::NoResponse::Utils.field_name("bucket"),
23
+ required: true,
24
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Bucket, false)
25
+ }
26
+ }
27
+ )
28
+ # At most two dimensions to count by, of which at most one is reason, lane, country or asn. An assessment counts once in each of its reasons and incomplete lanes, so those groups can add up to more than the bucket's count.
29
+ field(
30
+ :group_by,
31
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::AggregateDimension)),
32
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("group_by")}}
33
+ )
34
+ # count: each bucket's count and groups. score_histogram: first answers by flow and 5-point score bucket. late_flips: changes of an assessment's account decision for its flow after its first answer, by from, to and delay.
35
+ field(
36
+ :metrics,
37
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::AssessmentAggregateRequestMetric)),
38
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("metrics")}}
39
+ )
40
+ # The event an assessment is made for: account_creation (a user creates an account), login (a user returns to an existing account) or purchase (a payment or a credit grant). The account's risk is reported with the decision for this flow.
41
+ field(
42
+ :flow,
43
+ Crystalline::Nilable.new(Models::Shared::Flow),
44
+ {
45
+ 'format_json': {
46
+ 'letter_case': ::NoResponse::Utils.field_name("flow"),
47
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Flow, true)
48
+ }
49
+ }
50
+ )
51
+ # complete: final; nothing is still running. A lane that failed or missed its 10 s deadline stays listed in incomplete_sources, and confidence is lower. partial: a recommendation exists and at least one lane is still running or did not settle (see incomplete_sources). pending: nothing usable before the deadline; no recommendation yet, poll or wait for the webhook.
52
+ field(
53
+ :status,
54
+ Crystalline::Nilable.new(Models::Shared::Status),
55
+ {
56
+ 'format_json': {
57
+ 'letter_case': ::NoResponse::Utils.field_name("status"),
58
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Status, true)
59
+ }
60
+ }
61
+ )
62
+ # The recommended action: allow, step_up or review. Your application applies it.
63
+ field(
64
+ :recommendation,
65
+ Crystalline::Nilable.new(Models::Shared::Recommendation),
66
+ {
67
+ 'format_json': {
68
+ 'letter_case': ::NoResponse::Utils.field_name("recommendation"),
69
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Recommendation, true)
70
+ }
71
+ }
72
+ )
73
+ # An assessment's own decision: block when its stored risk.block is true, otherwise its recommendation. It is not the account's decision or held-admission state.
74
+ field(
75
+ :decision,
76
+ Crystalline::Nilable.new(Models::Shared::Decision),
77
+ {
78
+ 'format_json': {
79
+ 'letter_case': ::NoResponse::Utils.field_name("decision"),
80
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Decision, true)
81
+ }
82
+ }
83
+ )
84
+ # Which answer of each assessment the filters describe: latest, the latest stored revision, or first, the first answer, as served when the assessment was first answered (POST /v1/assessments/aggregate counts first answers). A cell of an aggregate drills down to POST /v1/assessments/search with the same filters, revision first and the cell's bucket as from and to.
85
+ field(
86
+ :revision,
87
+ Crystalline::Nilable.new(Models::Shared::AnswerRevision),
88
+ {
89
+ 'format_json': {
90
+ 'letter_case': ::NoResponse::Utils.field_name("revision"),
91
+ 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::AnswerRevision, true)
92
+ }
93
+ }
94
+ )
95
+ # The most groups answered: the largest over the whole range, then by value. groups_truncated says when there were more.
96
+ field(
97
+ :limit,
98
+ Crystalline::Nilable.new(::Integer),
99
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("limit")}}
100
+ )
101
+
102
+ sig {
103
+ params(
104
+ from: ::String,
105
+ to: ::String,
106
+ bucket: Models::Shared::Bucket,
107
+ group_by: T.nilable(T::Array[Models::Shared::AggregateDimension]),
108
+ metrics: T.nilable(T::Array[Models::Shared::AssessmentAggregateRequestMetric]),
109
+ flow: T.nilable(Models::Shared::Flow),
110
+ status: T.nilable(Models::Shared::Status),
111
+ recommendation: T.nilable(Models::Shared::Recommendation),
112
+ decision: T.nilable(Models::Shared::Decision),
113
+ revision: T.nilable(Models::Shared::AnswerRevision),
114
+ limit: T.nilable(::Integer)
115
+ )
116
+ .void
117
+ }
118
+ def initialize(
119
+ from:,
120
+ to:,
121
+ bucket:,
122
+ group_by: nil,
123
+ metrics: nil,
124
+ flow: nil,
125
+ status: nil,
126
+ recommendation: nil,
127
+ decision: nil,
128
+ revision: nil,
129
+ limit: 20
130
+ )
131
+ @from = from
132
+ @to = to
133
+ @bucket = bucket
134
+ @group_by = group_by
135
+ @metrics = metrics
136
+ @flow = flow
137
+ @status = status
138
+ @recommendation = recommendation
139
+ @decision = decision
140
+ @revision = revision
141
+ @limit = limit
142
+ end
143
+
144
+ sig { params(other: T.untyped).returns(T::Boolean) }
145
+ def ==(other)
146
+ return false unless other.is_a?(self.class)
147
+ return false unless @from == other.from
148
+ return false unless @to == other.to
149
+ return false unless @bucket == other.bucket
150
+ return false unless @group_by == other.group_by
151
+ return false unless @metrics == other.metrics
152
+ return false unless @flow == other.flow
153
+ return false unless @status == other.status
154
+ return false unless @recommendation == other.recommendation
155
+ return false unless @decision == other.decision
156
+ return false unless @revision == other.revision
157
+ return false unless @limit == other.limit
158
+ true
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,74 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentAggregateRequest
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentAggregateRequest
9
+ def from
10
+ end
11
+
12
+ def from=(str_)
13
+ end
14
+
15
+ def to
16
+ end
17
+
18
+ def to=(str_)
19
+ end
20
+
21
+ def bucket
22
+ end
23
+
24
+ def bucket=(str_)
25
+ end
26
+
27
+ def group_by
28
+ end
29
+
30
+ def group_by=(str_)
31
+ end
32
+
33
+ def metrics
34
+ end
35
+
36
+ def metrics=(str_)
37
+ end
38
+
39
+ def flow
40
+ end
41
+
42
+ def flow=(str_)
43
+ end
44
+
45
+ def status
46
+ end
47
+
48
+ def status=(str_)
49
+ end
50
+
51
+ def recommendation
52
+ end
53
+
54
+ def recommendation=(str_)
55
+ end
56
+
57
+ def decision
58
+ end
59
+
60
+ def decision=(str_)
61
+ end
62
+
63
+ def revision
64
+ end
65
+
66
+ def revision=(str_)
67
+ end
68
+
69
+ def limit
70
+ end
71
+
72
+ def limit=(str_)
73
+ end
74
+ end
@@ -0,0 +1,17 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+
8
+ class AssessmentAggregateRequestMetric < T::Enum
9
+ enums do
10
+ COUNT = new("count")
11
+ SCORE_HISTOGRAM = new("score_histogram")
12
+ LATE_FLIPS = new("late_flips")
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentAggregateRequestMetric
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentAggregateRequestMetric
9
+ end
@@ -93,6 +93,12 @@ module NoResponse
93
93
  ::String,
94
94
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("schema_version"), required: true}}
95
95
  )
96
+ # The identifiers an assessment was sent: each member of the request's identifiers object exactly as received, before the server normalised it (the email domain keeps its case, the name its Unicode form). A member the request did not send is absent. NoResponse keeps them encrypted under the workspace's own key, does not index or log them, and deletes them with the assessment: on DELETE of the assessment or its account, at its expires_at, and with the workspace.
97
+ field(
98
+ :identifiers,
99
+ Crystalline::Nilable.new(Models::Shared::SentIdentifiers),
100
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("identifiers")}}
101
+ )
96
102
  # An optional provider correlation id, echoed back. It is not an idempotency key. Refuses an exact-shape JWT or a bare 40, 64 or 128 character hex digest; a UUID is accepted.
97
103
  field(
98
104
  :request_id,
@@ -155,6 +161,7 @@ module NoResponse
155
161
  expires_at: ::String,
156
162
  timing: Models::Shared::AssessmentDetailTiming,
157
163
  schema_version: ::String,
164
+ identifiers: T.nilable(Models::Shared::SentIdentifiers),
158
165
  request_id: T.nilable(::String),
159
166
  recommendation: T.nilable(Models::Shared::Recommendation),
160
167
  risk: T.nilable(Models::Shared::Risk),
@@ -178,6 +185,7 @@ module NoResponse
178
185
  expires_at:,
179
186
  timing:,
180
187
  schema_version: "1",
188
+ identifiers: nil,
181
189
  request_id: nil,
182
190
  recommendation: nil,
183
191
  risk: nil,
@@ -202,6 +210,7 @@ module NoResponse
202
210
  end
203
211
 
204
212
  @schema_version = "1"
213
+ @identifiers = identifiers
205
214
  @request_id = request_id
206
215
  @recommendation = recommendation
207
216
  @risk = risk
@@ -230,6 +239,7 @@ module NoResponse
230
239
  return false unless @expires_at == other.expires_at
231
240
  return false unless @timing == other.timing
232
241
  return false unless @schema_version == other.schema_version
242
+ return false unless @identifiers == other.identifiers
233
243
  return false unless @request_id == other.request_id
234
244
  return false unless @recommendation == other.recommendation
235
245
  return false unless @risk == other.risk
@@ -78,6 +78,12 @@ class NoResponse::Models::Shared::AssessmentDetail
78
78
  def schema_version=(str_)
79
79
  end
80
80
 
81
+ def identifiers
82
+ end
83
+
84
+ def identifiers=(str_)
85
+ end
86
+
81
87
  def request_id
82
88
  end
83
89
 
@@ -68,14 +68,25 @@ module NoResponse
68
68
  }
69
69
  }
70
70
  )
71
- # The decision of the assessment's latest stored revision: block when its stored risk.block is true, otherwise its recommendation. This is not the account's current decision or held-admission state. Combined with recommendation using AND.
71
+ # An assessment's own decision: block when its stored risk.block is true, otherwise its recommendation. It is not the account's decision or held-admission state.
72
72
  field(
73
73
  :decision,
74
74
  Crystalline::Nilable.new(Models::Shared::Decision),
75
75
  {
76
76
  'format_json': {
77
77
  'letter_case': ::NoResponse::Utils.field_name("decision"),
78
- 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::Decision, true)
78
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Decision, true)
79
+ }
80
+ }
81
+ )
82
+ # Which answer of each assessment the filters describe: latest, the latest stored revision, or first, the first answer, as served when the assessment was first answered (POST /v1/assessments/aggregate counts first answers). A cell of an aggregate drills down to POST /v1/assessments/search with the same filters, revision first and the cell's bucket as from and to.
83
+ field(
84
+ :revision,
85
+ Crystalline::Nilable.new(Models::Shared::AnswerRevision),
86
+ {
87
+ 'format_json': {
88
+ 'letter_case': ::NoResponse::Utils.field_name("revision"),
89
+ 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::AnswerRevision, true)
79
90
  }
80
91
  }
81
92
  )
@@ -97,6 +108,7 @@ module NoResponse
97
108
  cursor: T.nilable(::String),
98
109
  response_mode: T.nilable(Models::Shared::ResponseMode),
99
110
  decision: T.nilable(Models::Shared::Decision),
111
+ revision: T.nilable(Models::Shared::AnswerRevision),
100
112
  limit: T.nilable(::Integer)
101
113
  )
102
114
  .void
@@ -111,6 +123,7 @@ module NoResponse
111
123
  cursor: nil,
112
124
  response_mode: nil,
113
125
  decision: nil,
126
+ revision: nil,
114
127
  limit: 20
115
128
  )
116
129
  @from = from
@@ -122,6 +135,7 @@ module NoResponse
122
135
  @cursor = cursor
123
136
  @response_mode = response_mode
124
137
  @decision = decision
138
+ @revision = revision
125
139
  @limit = limit
126
140
  end
127
141
 
@@ -137,6 +151,7 @@ module NoResponse
137
151
  return false unless @cursor == other.cursor
138
152
  return false unless @response_mode == other.response_mode
139
153
  return false unless @decision == other.decision
154
+ return false unless @revision == other.revision
140
155
  return false unless @limit == other.limit
141
156
  true
142
157
  end
@@ -60,6 +60,12 @@ class NoResponse::Models::Shared::AssessmentSearchRequest
60
60
  def decision=(str_)
61
61
  end
62
62
 
63
+ def revision
64
+ end
65
+
66
+ def revision=(str_)
67
+ end
68
+
63
69
  def limit
64
70
  end
65
71
 
@@ -0,0 +1,20 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # Bucket - The period each count covers, in UTC; a week starts on Monday.
8
+ class Bucket
9
+ include ::Crystalline::Enum
10
+ enums do
11
+ HOUR = new("hour")
12
+ DAY = new("day")
13
+ WEEK = new("week")
14
+ end
15
+
16
+ open!
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::Bucket
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::Bucket
9
+ end
@@ -4,14 +4,17 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # Decision - The decision of the assessment's latest stored revision: block when its stored risk.block is true, otherwise its recommendation. This is not the account's current decision or held-admission state. Combined with recommendation using AND.
8
- class Decision < T::Enum
7
+ # Decision - An assessment's own decision: block when its stored risk.block is true, otherwise its recommendation. It is not the account's decision or held-admission state.
8
+ class Decision
9
+ include ::Crystalline::Enum
9
10
  enums do
10
11
  ALLOW = new("allow")
11
12
  STEP_UP = new("step_up")
12
13
  REVIEW = new("review")
13
14
  BLOCK = new("block")
14
15
  end
16
+
17
+ open!
15
18
  end
16
19
  end
17
20
  end
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # Delay - How long after the assessment's creation the change was made.
8
+ class Delay
9
+ include ::Crystalline::Enum
10
+ enums do
11
+ UNDER_10S = new("under_10s")
12
+ UNDER_1M = new("under_1m")
13
+ UNDER_10M = new("under_10m")
14
+ UNDER_1H = new("under_1h")
15
+ UNDER_1D = new("under_1d")
16
+ OVER_1D = new("over_1d")
17
+ end
18
+
19
+ open!
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::Delay
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::Delay
9
+ end
@@ -0,0 +1,19 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # ListMatch - The action of the list entry that decided the account.
8
+ class ListMatch
9
+ include ::Crystalline::Enum
10
+ enums do
11
+ BLOCK = new("block")
12
+ ALLOW = new("allow")
13
+ end
14
+
15
+ open!
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,9 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::ListMatch
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::ListMatch
9
+ end
@@ -0,0 +1,74 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The identifiers an assessment was sent: each member of the request's identifiers object exactly as received, before the server normalised it (the email domain keeps its case, the name its Unicode form). A member the request did not send is absent. NoResponse keeps them encrypted under the workspace's own key, does not index or log them, and deletes them with the assessment: on DELETE of the assessment or its account, at its expires_at, and with the workspace.
8
+ class SentIdentifiers
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # identifiers.email as the request sent it.
13
+ field(
14
+ :email,
15
+ Crystalline::Nilable.new(::String),
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("email")}}
17
+ )
18
+ # identifiers.username as the request sent it.
19
+ field(
20
+ :username,
21
+ Crystalline::Nilable.new(::String),
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("username")}}
23
+ )
24
+ # identifiers.phone as the request sent it.
25
+ field(
26
+ :phone,
27
+ Crystalline::Nilable.new(::String),
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("phone")}}
29
+ )
30
+ # identifiers.name as the request sent it, before NFC normalisation.
31
+ field(
32
+ :name,
33
+ Crystalline::Nilable.new(::String),
34
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("name")}}
35
+ )
36
+ # identifiers.ip as the request sent it.
37
+ field(
38
+ :ip,
39
+ Crystalline::Nilable.new(::String),
40
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("ip")}}
41
+ )
42
+
43
+ sig {
44
+ params(
45
+ email: T.nilable(::String),
46
+ username: T.nilable(::String),
47
+ phone: T.nilable(::String),
48
+ name: T.nilable(::String),
49
+ ip: T.nilable(::String)
50
+ )
51
+ .void
52
+ }
53
+ def initialize(email: nil, username: nil, phone: nil, name: nil, ip: nil)
54
+ @email = email
55
+ @username = username
56
+ @phone = phone
57
+ @name = name
58
+ @ip = ip
59
+ end
60
+
61
+ sig { params(other: T.untyped).returns(T::Boolean) }
62
+ def ==(other)
63
+ return false unless other.is_a?(self.class)
64
+ return false unless @email == other.email
65
+ return false unless @username == other.username
66
+ return false unless @phone == other.phone
67
+ return false unless @name == other.name
68
+ return false unless @ip == other.ip
69
+ true
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::SentIdentifiers
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::SentIdentifiers
9
+ def email
10
+ end
11
+
12
+ def email=(str_)
13
+ end
14
+
15
+ def username
16
+ end
17
+
18
+ def username=(str_)
19
+ end
20
+
21
+ def phone
22
+ end
23
+
24
+ def phone=(str_)
25
+ end
26
+
27
+ def name
28
+ end
29
+
30
+ def name=(str_)
31
+ end
32
+
33
+ def ip
34
+ end
35
+
36
+ def ip=(str_)
37
+ end
38
+ end