noresponse 5.1.1 → 6.0.1

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_response/accounts.rb +663 -71
  3. data/lib/no_response/late_results.rb +10 -8
  4. data/lib/no_response/models/operations/listaccounts_request.rb +52 -0
  5. data/lib/no_response/models/operations/listaccounts_request.rbi +26 -0
  6. data/lib/no_response/models/operations/listaccounts_response.rb +32 -0
  7. data/lib/no_response/models/operations/listaccounts_response.rbi +20 -0
  8. data/lib/no_response/models/operations/recordenforcement_request.rb +33 -0
  9. data/lib/no_response/models/operations/recordenforcement_request.rbi +20 -0
  10. data/lib/no_response/models/operations/recordenforcement_response.rb +32 -0
  11. data/lib/no_response/models/operations/recordenforcement_response.rbi +20 -0
  12. data/lib/no_response/models/operations.rb +4 -0
  13. data/lib/no_response/models/shared/accountdeleted.rb +49 -0
  14. data/lib/no_response/models/shared/accountdeleted.rbi +26 -0
  15. data/lib/no_response/models/shared/accountdeletedevent.rb +70 -0
  16. data/lib/no_response/models/shared/accountdeletedevent.rbi +38 -0
  17. data/lib/no_response/models/shared/accountlist.rb +40 -0
  18. data/lib/no_response/models/shared/accountlist.rbi +20 -0
  19. data/lib/no_response/models/shared/accountriskchanged.rb +44 -0
  20. data/lib/no_response/models/shared/accountriskchanged.rbi +20 -0
  21. data/lib/no_response/models/shared/accountriskchangedevent.rb +70 -0
  22. data/lib/no_response/models/shared/accountriskchangedevent.rbi +38 -0
  23. data/lib/no_response/models/shared/assessmentexpired.rb +82 -0
  24. data/lib/no_response/models/shared/assessmentexpired.rbi +38 -0
  25. data/lib/no_response/models/shared/assessmentupdateddata.rb +23 -0
  26. data/lib/no_response/models/shared/assessmentupdateddata.rbi +9 -0
  27. data/lib/no_response/models/shared/assessmentupdatedevent.rb +79 -0
  28. data/lib/no_response/models/shared/assessmentupdatedevent.rbi +38 -0
  29. data/lib/no_response/models/shared/conflicterrorcode.rb +1 -0
  30. data/lib/no_response/models/shared/endpointverification.rb +41 -0
  31. data/lib/no_response/models/shared/endpointverification.rbi +20 -0
  32. data/lib/no_response/models/shared/endpointverificationevent.rb +70 -0
  33. data/lib/no_response/models/shared/endpointverificationevent.rbi +38 -0
  34. data/lib/no_response/models/shared/enforcement.rb +156 -0
  35. data/lib/no_response/models/shared/enforcement.rbi +68 -0
  36. data/lib/no_response/models/shared/enforcementaction.rb +23 -0
  37. data/lib/no_response/models/shared/enforcementaction.rbi +9 -0
  38. data/lib/no_response/models/shared/enforcementprovider.rb +21 -0
  39. data/lib/no_response/models/shared/enforcementprovider.rbi +9 -0
  40. data/lib/no_response/models/shared/enforcementrequest.rb +122 -0
  41. data/lib/no_response/models/shared/enforcementrequest.rbi +50 -0
  42. data/lib/no_response/models/shared/enforcementstate.rb +22 -0
  43. data/lib/no_response/models/shared/enforcementstate.rbi +9 -0
  44. data/lib/no_response/models/shared/enforcementstatus.rb +19 -0
  45. data/lib/no_response/models/shared/enforcementstatus.rbi +9 -0
  46. data/lib/no_response/models/shared/environment.rb +16 -0
  47. data/lib/no_response/models/shared/environment.rbi +9 -0
  48. data/lib/no_response/models/shared/webhookendpointdisabled.rb +49 -0
  49. data/lib/no_response/models/shared/webhookendpointdisabled.rbi +26 -0
  50. data/lib/no_response/models/shared/webhookendpointdisabledevent.rb +70 -0
  51. data/lib/no_response/models/shared/webhookendpointdisabledevent.rbi +38 -0
  52. data/lib/no_response/models/shared/webhookevent.rb +23 -0
  53. data/lib/no_response/models/shared/webhookevent.rbi +9 -0
  54. data/lib/no_response/models/shared/webhookverificationresponse.rb +33 -0
  55. data/lib/no_response/models/shared/webhookverificationresponse.rbi +14 -0
  56. data/lib/no_response/models/shared/workspacedeleted.rb +55 -0
  57. data/lib/no_response/models/shared/workspacedeleted.rbi +26 -0
  58. data/lib/no_response/models/shared/workspacedeletedevent.rb +70 -0
  59. data/lib/no_response/models/shared/workspacedeletedevent.rbi +38 -0
  60. data/lib/no_response/models/shared.rb +23 -0
  61. data/lib/no_response/sdk_hooks/registration.rb +0 -1
  62. data/lib/no_response/sdkconfiguration.rb +2 -2
  63. data/lib/no_response/webhook_verification.rb +170 -0
  64. data/lib/noresponse.rb +2 -0
  65. metadata +56 -2
  66. data/lib/no_response/webhooks.rb +0 -264
@@ -0,0 +1,70 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The account.risk_changed event.
8
+ class AccountRiskChangedEvent
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The event id, equal to the NR-Webhook-Id header and across redeliveries and every endpoint the event fans out to.
13
+ field :id, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("id"), required: true}}
14
+ # When the event was created. Equal across redeliveries; the signing timestamp header is per delivery.
15
+ field(
16
+ :created_at,
17
+ ::String,
18
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
19
+ )
20
+ # The account's decision for at least one flow changed. account is the account as GET /v1/accounts/{account_id} answers it for the revision that made the change: its new score, decision, reasons and decisions_by_flow, and the assessment the risk comes from. previous_decisions_by_flow are the decisions it replaced, so account.decisions_by_flow differs from them for at least one flow. On the account's first decision, previous_decisions_by_flow is allow for every flow. Events of one account are not ordered: account.risk_version orders them, so keep the account with the highest risk_version and ignore an event whose account is older than the one held.
21
+ field(
22
+ :data,
23
+ Models::Shared::AccountRiskChanged,
24
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("data"), required: true}}
25
+ )
26
+ # Always account.risk_changed.
27
+ field :type, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("type"), required: true}}
28
+ # Present, and true, only on an event sent by POST /v1/webhooks/{endpoint_id}/test: its data is a fixed example assessment, not one of the workspace's, so a receiver acknowledges it and applies nothing. Real events have no test member.
29
+ field(
30
+ :test,
31
+ Crystalline::Nilable.new(Crystalline::Boolean.new),
32
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("test")}}
33
+ )
34
+
35
+ sig {
36
+ params(
37
+ id: ::String,
38
+ created_at: ::String,
39
+ data: Models::Shared::AccountRiskChanged,
40
+ type: ::String,
41
+ test: T.nilable(T::Boolean)
42
+ )
43
+ .void
44
+ }
45
+ def initialize(id:, created_at:, data:, type: "account.risk_changed", test: nil)
46
+ @id = id
47
+ @created_at = created_at
48
+ @data = data
49
+ unless type == "account.risk_changed"
50
+ raise ArgumentError, "Invalid value for type"
51
+ end
52
+
53
+ @type = "account.risk_changed"
54
+ @test = test
55
+ end
56
+
57
+ sig { params(other: T.untyped).returns(T::Boolean) }
58
+ def ==(other)
59
+ return false unless other.is_a?(self.class)
60
+ return false unless @id == other.id
61
+ return false unless @created_at == other.created_at
62
+ return false unless @data == other.data
63
+ return false unless @type == other.type
64
+ return false unless @test == other.test
65
+ true
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AccountRiskChangedEvent
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AccountRiskChangedEvent
9
+ def id
10
+ end
11
+
12
+ def id=(str_)
13
+ end
14
+
15
+ def created_at
16
+ end
17
+
18
+ def created_at=(str_)
19
+ end
20
+
21
+ def data
22
+ end
23
+
24
+ def data=(str_)
25
+ end
26
+
27
+ def type
28
+ end
29
+
30
+ def type=(str_)
31
+ end
32
+
33
+ def test
34
+ end
35
+
36
+ def test=(str_)
37
+ end
38
+ end
@@ -0,0 +1,82 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # Terminal. Nothing to fetch; the consumer deletes its state for assessment_id.
8
+ class AssessmentExpired
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # Opaque, server-assigned assessment id: 'asm_' and a 26-character Crockford base32 ULID. Unique within the workspace; another workspace's assessment id answers 404.
13
+ field(
14
+ :assessment_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("assessment_id"), required: true}}
17
+ )
18
+ # Your own opaque identifier for the account being checked, scoped to your workspace. Use an id you mint, with no direct identifier (email, phone, name or national id) in it. '|' is accepted so an Auth0 user id such as 'auth0|64abc' passes unchanged; '@', '+', '$' and whitespace are refused by the pattern, as is an exact-shape JWT; a hex digest such as a SHA-256 is allowed, because hashing an internal id is a common pseudonymous scheme. A value such as '07700900123' or 'jane.doe.gmail.com' cannot be told apart from an opaque id. It travels in bodies, and in a URL only as the path segment of GET /v1/accounts/{account_id} and its /assessments. An assessment requested by a provider hook at pre_registration, which has no account yet, carries the server-issued account_id pre: followed by its assessment_id.
19
+ field(
20
+ :account_id,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("account_id"), required: true}}
23
+ )
24
+ # The last served version: expiry is not a revision.
25
+ field(
26
+ :assessment_version,
27
+ ::Integer,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("assessment_version"), required: true}}
29
+ )
30
+
31
+ field(
32
+ :status,
33
+ ::String,
34
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("status"), required: true}}
35
+ )
36
+
37
+ field(
38
+ :change_reason,
39
+ ::String,
40
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("change_reason"), required: true}}
41
+ )
42
+
43
+ sig {
44
+ params(
45
+ assessment_id: ::String,
46
+ account_id: ::String,
47
+ assessment_version: ::Integer,
48
+ status: ::String,
49
+ change_reason: ::String
50
+ )
51
+ .void
52
+ }
53
+ def initialize(assessment_id:, account_id:, assessment_version:, status: "expired", change_reason: "expired")
54
+ @assessment_id = assessment_id
55
+ @account_id = account_id
56
+ @assessment_version = assessment_version
57
+ unless status == "expired"
58
+ raise ArgumentError, "Invalid value for status"
59
+ end
60
+
61
+ @status = "expired"
62
+ unless change_reason == "expired"
63
+ raise ArgumentError, "Invalid value for change_reason"
64
+ end
65
+
66
+ @change_reason = "expired"
67
+ end
68
+
69
+ sig { params(other: T.untyped).returns(T::Boolean) }
70
+ def ==(other)
71
+ return false unless other.is_a?(self.class)
72
+ return false unless @assessment_id == other.assessment_id
73
+ return false unless @account_id == other.account_id
74
+ return false unless @assessment_version == other.assessment_version
75
+ return false unless @status == other.status
76
+ return false unless @change_reason == other.change_reason
77
+ true
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentExpired
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentExpired
9
+ def assessment_id
10
+ end
11
+
12
+ def assessment_id=(str_)
13
+ end
14
+
15
+ def account_id
16
+ end
17
+
18
+ def account_id=(str_)
19
+ end
20
+
21
+ def assessment_version
22
+ end
23
+
24
+ def assessment_version=(str_)
25
+ end
26
+
27
+ def status
28
+ end
29
+
30
+ def status=(str_)
31
+ end
32
+
33
+ def change_reason
34
+ end
35
+
36
+ def change_reason=(str_)
37
+ end
38
+ end
@@ -0,0 +1,23 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The assessment, or the minimal notice that it expired.
8
+ class AssessmentUpdatedData
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ def initialize
13
+ end
14
+
15
+ sig { params(other: T.untyped).returns(T::Boolean) }
16
+ def ==(other)
17
+ return false unless other.is_a?(self.class)
18
+ true
19
+ end
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::AssessmentUpdatedData
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentUpdatedData
9
+ end
@@ -0,0 +1,79 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The assessment.updated event.
8
+ class AssessmentUpdatedEvent
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The event id, equal to the NR-Webhook-Id header and across redeliveries and every endpoint the event fans out to.
13
+ field :id, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("id"), required: true}}
14
+ # When the event was created. Equal across redeliveries; the signing timestamp header is per delivery.
15
+ field(
16
+ :created_at,
17
+ ::String,
18
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
19
+ )
20
+ # The assessment, or the minimal notice that it expired.
21
+ field(
22
+ :data,
23
+ Crystalline::Union.new(Models::Shared::Assessment, Models::Shared::AssessmentExpired),
24
+ {
25
+ 'format_json': {'letter_case': ::NoResponse::Utils.field_name("data"), required: true},
26
+ 'discriminator': "status",
27
+ 'discriminator_mapping': {
28
+ "complete" => Models::Shared::Assessment,
29
+ "partial" => Models::Shared::Assessment,
30
+ "pending" => Models::Shared::Assessment,
31
+ "expired" => Models::Shared::AssessmentExpired
32
+ }
33
+ }
34
+ )
35
+ # Always assessment.updated.
36
+ field :type, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("type"), required: true}}
37
+ # Present, and true, only on an event sent by POST /v1/webhooks/{endpoint_id}/test: its data is a fixed example assessment, not one of the workspace's, so a receiver acknowledges it and applies nothing. Real events have no test member.
38
+ field(
39
+ :test,
40
+ Crystalline::Nilable.new(Crystalline::Boolean.new),
41
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("test")}}
42
+ )
43
+
44
+ sig {
45
+ params(
46
+ id: ::String,
47
+ created_at: ::String,
48
+ data: T.any(Models::Shared::Assessment, Models::Shared::AssessmentExpired),
49
+ type: ::String,
50
+ test: T.nilable(T::Boolean)
51
+ )
52
+ .void
53
+ }
54
+ def initialize(id:, created_at:, data:, type: "assessment.updated", test: nil)
55
+ @id = id
56
+ @created_at = created_at
57
+ @data = data
58
+ unless type == "assessment.updated"
59
+ raise ArgumentError, "Invalid value for type"
60
+ end
61
+
62
+ @type = "assessment.updated"
63
+ @test = test
64
+ end
65
+
66
+ sig { params(other: T.untyped).returns(T::Boolean) }
67
+ def ==(other)
68
+ return false unless other.is_a?(self.class)
69
+ return false unless @id == other.id
70
+ return false unless @created_at == other.created_at
71
+ return false unless @data == other.data
72
+ return false unless @type == other.type
73
+ return false unless @test == other.test
74
+ true
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentUpdatedEvent
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentUpdatedEvent
9
+ def id
10
+ end
11
+
12
+ def id=(str_)
13
+ end
14
+
15
+ def created_at
16
+ end
17
+
18
+ def created_at=(str_)
19
+ end
20
+
21
+ def data
22
+ end
23
+
24
+ def data=(str_)
25
+ end
26
+
27
+ def type
28
+ end
29
+
30
+ def type=(str_)
31
+ end
32
+
33
+ def test
34
+ end
35
+
36
+ def test=(str_)
37
+ end
38
+ end
@@ -13,6 +13,7 @@ module NoResponse
13
13
  WEBHOOK_ENDPOINT_LIMIT_REACHED = new("webhook_endpoint_limit_reached")
14
14
  WEBHOOK_ENDPOINT_UNVERIFIED = new("webhook_endpoint_unverified")
15
15
  TOO_MANY_INTEGRATIONS = new("too_many_integrations")
16
+ RISK_VERSION_AHEAD = new("risk_version_ahead")
16
17
  end
17
18
 
18
19
  open!
@@ -0,0 +1,41 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+
8
+ class EndpointVerification
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # Opaque id of the endpoint registration being verified.
13
+ field(
14
+ :endpoint_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("endpoint_id"), required: true}}
17
+ )
18
+ # Endpoint verification nonce: 32 random bytes, unpadded base64url (43 characters). Fresh per verification.
19
+ field(
20
+ :challenge,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("challenge"), required: true}}
23
+ )
24
+
25
+ sig { params(endpoint_id: ::String, challenge: ::String).void }
26
+ def initialize(endpoint_id:, challenge:)
27
+ @endpoint_id = endpoint_id
28
+ @challenge = challenge
29
+ end
30
+
31
+ sig { params(other: T.untyped).returns(T::Boolean) }
32
+ def ==(other)
33
+ return false unless other.is_a?(self.class)
34
+ return false unless @endpoint_id == other.endpoint_id
35
+ return false unless @challenge == other.challenge
36
+ true
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,20 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::EndpointVerification
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::EndpointVerification
9
+ def endpoint_id
10
+ end
11
+
12
+ def endpoint_id=(str_)
13
+ end
14
+
15
+ def challenge
16
+ end
17
+
18
+ def challenge=(str_)
19
+ end
20
+ end
@@ -0,0 +1,70 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The endpoint.verification event.
8
+ class EndpointVerificationEvent
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # The event id, equal to the NR-Webhook-Id header and across redeliveries and every endpoint the event fans out to.
13
+ field :id, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("id"), required: true}}
14
+ # When the event was created. Equal across redeliveries; the signing timestamp header is per delivery.
15
+ field(
16
+ :created_at,
17
+ ::String,
18
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
19
+ )
20
+
21
+ field(
22
+ :data,
23
+ Models::Shared::EndpointVerification,
24
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("data"), required: true}}
25
+ )
26
+ # Always endpoint.verification.
27
+ field :type, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("type"), required: true}}
28
+ # Present, and true, only on an event sent by POST /v1/webhooks/{endpoint_id}/test: its data is a fixed example assessment, not one of the workspace's, so a receiver acknowledges it and applies nothing. Real events have no test member.
29
+ field(
30
+ :test,
31
+ Crystalline::Nilable.new(Crystalline::Boolean.new),
32
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("test")}}
33
+ )
34
+
35
+ sig {
36
+ params(
37
+ id: ::String,
38
+ created_at: ::String,
39
+ data: Models::Shared::EndpointVerification,
40
+ type: ::String,
41
+ test: T.nilable(T::Boolean)
42
+ )
43
+ .void
44
+ }
45
+ def initialize(id:, created_at:, data:, type: "endpoint.verification", test: nil)
46
+ @id = id
47
+ @created_at = created_at
48
+ @data = data
49
+ unless type == "endpoint.verification"
50
+ raise ArgumentError, "Invalid value for type"
51
+ end
52
+
53
+ @type = "endpoint.verification"
54
+ @test = test
55
+ end
56
+
57
+ sig { params(other: T.untyped).returns(T::Boolean) }
58
+ def ==(other)
59
+ return false unless other.is_a?(self.class)
60
+ return false unless @id == other.id
61
+ return false unless @created_at == other.created_at
62
+ return false unless @data == other.data
63
+ return false unless @type == other.type
64
+ return false unless @test == other.test
65
+ true
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::EndpointVerificationEvent
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::EndpointVerificationEvent
9
+ def id
10
+ end
11
+
12
+ def id=(str_)
13
+ end
14
+
15
+ def created_at
16
+ end
17
+
18
+ def created_at=(str_)
19
+ end
20
+
21
+ def data
22
+ end
23
+
24
+ def data=(str_)
25
+ end
26
+
27
+ def type
28
+ end
29
+
30
+ def type=(str_)
31
+ end
32
+
33
+ def test
34
+ end
35
+
36
+ def test=(str_)
37
+ end
38
+ end