zernio-sdk 0.0.558 → 0.0.560

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 95b819606f8aa6f719429e45eb155a7f80139d338d97666f789560d210f691b0
4
- data.tar.gz: ef93873a14de4cfeaf1ef26cc3ed9003a8278ee130f1a00ac85d931e5b288759
3
+ metadata.gz: bcaa3f1e5d1d253bd1790b6e44de496391f7bf7b035f046c9382c8b31d650c8e
4
+ data.tar.gz: 68669d6d6a1d35f7fae39ce311632729e8f68c9682682f661cb61472e18e783d
5
5
  SHA512:
6
- metadata.gz: 4d39a820634b7047a18a835ce192297eeb7843b00a0f65c2004d396f183a7cecbd89e6162c6303cd7dc077ab69d3d93b688816d0941dd4305fdab42ed54404b1
7
- data.tar.gz: 31f9620161b4a8c22797586445fc6c6c765340ac49c5585058b9c43adf8953a854382e0bdaf88c0c53d093c2e856ab2b19cc5afa48e80e2e2dc6d98251ebc5d4
6
+ metadata.gz: 15bd978afe9fcd59818103203f456d93abcebf1e0e9e3caf7935b73a353e99c72464e841883329457c46ddf422fafa1eb0c5aeaa902d0e428f473e257480a9ac
7
+ data.tar.gz: f7ffc42d70ae75e14c4ded6a8fc1971975d0f1e0fd70a8152a41b65eae81220fedb9722d2e7128be6ae8037c30ce8ecc3d831cad81fbd16af85dacf5baa38423
data/docs/ProfilesApi.md CHANGED
@@ -13,11 +13,11 @@ All URIs are relative to *https://zernio.com/api*
13
13
 
14
14
  ## create_profile
15
15
 
16
- > <ProfileCreateResponse> create_profile(create_profile_request)
16
+ > <ProfileCreateResponse> create_profile(create_profile_request, opts)
17
17
 
18
18
  Create profile
19
19
 
20
- Creates a new profile with a name, optional description, and color.
20
+ Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
21
21
 
22
22
  ### Examples
23
23
 
@@ -32,10 +32,13 @@ end
32
32
 
33
33
  api_instance = Zernio::ProfilesApi.new
34
34
  create_profile_request = Zernio::CreateProfileRequest.new({name: 'name_example'}) # CreateProfileRequest |
35
+ opts = {
36
+ idempotency_key: 'idempotency_key_example' # String | Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
37
+ }
35
38
 
36
39
  begin
37
40
  # Create profile
38
- result = api_instance.create_profile(create_profile_request)
41
+ result = api_instance.create_profile(create_profile_request, opts)
39
42
  p result
40
43
  rescue Zernio::ApiError => e
41
44
  puts "Error when calling ProfilesApi->create_profile: #{e}"
@@ -46,12 +49,12 @@ end
46
49
 
47
50
  This returns an Array which contains the response data, status code and headers.
48
51
 
49
- > <Array(<ProfileCreateResponse>, Integer, Hash)> create_profile_with_http_info(create_profile_request)
52
+ > <Array(<ProfileCreateResponse>, Integer, Hash)> create_profile_with_http_info(create_profile_request, opts)
50
53
 
51
54
  ```ruby
52
55
  begin
53
56
  # Create profile
54
- data, status_code, headers = api_instance.create_profile_with_http_info(create_profile_request)
57
+ data, status_code, headers = api_instance.create_profile_with_http_info(create_profile_request, opts)
55
58
  p status_code # => 2xx
56
59
  p headers # => { ... }
57
60
  p data # => <ProfileCreateResponse>
@@ -65,6 +68,7 @@ end
65
68
  | Name | Type | Description | Notes |
66
69
  | ---- | ---- | ----------- | ----- |
67
70
  | **create_profile_request** | [**CreateProfileRequest**](CreateProfileRequest.md) | | |
71
+ | **idempotency_key** | **String** | Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409. | [optional] |
68
72
 
69
73
  ### Return type
70
74
 
@@ -224,7 +228,7 @@ end
224
228
 
225
229
  List profiles
226
230
 
227
- Returns profiles sorted by creation date. Use includeOverLimit=true to include profiles that exceed the plan limit.
231
+ Returns profiles sorted default-first, then by creation date. Filter with name (exact match) and paginate with limit/skip; without those params the full list is returned unchanged. Use includeOverLimit=true to include profiles that exceed the plan limit.
228
232
 
229
233
  ### Examples
230
234
 
@@ -239,7 +243,10 @@ end
239
243
 
240
244
  api_instance = Zernio::ProfilesApi.new
241
245
  opts = {
242
- include_over_limit: true # Boolean | When true, includes over-limit profiles (marked with isOverLimit: true).
246
+ include_over_limit: true, # Boolean | When true, includes over-limit profiles (marked with isOverLimit: true).
247
+ name: 'name_example', # String | Exact-match filter on the profile name. Useful to recover a profile id after an ambiguous create (timeout followed by a 409 on retry).
248
+ limit: 56, # Integer | Page size. When limit or skip is present, the response includes total and skip (and echoes limit).
249
+ skip: 56 # Integer | Number of profiles to skip, applied after sorting and filtering.
243
250
  }
244
251
 
245
252
  begin
@@ -274,6 +281,9 @@ end
274
281
  | Name | Type | Description | Notes |
275
282
  | ---- | ---- | ----------- | ----- |
276
283
  | **include_over_limit** | **Boolean** | When true, includes over-limit profiles (marked with isOverLimit: true). | [optional][default to false] |
284
+ | **name** | **String** | Exact-match filter on the profile name. Useful to recover a profile id after an ambiguous create (timeout followed by a 409 on retry). | [optional] |
285
+ | **limit** | **Integer** | Page size. When limit or skip is present, the response includes total and skip (and echoes limit). | [optional] |
286
+ | **skip** | **Integer** | Number of profiles to skip, applied after sorting and filtering. | [optional] |
277
287
 
278
288
  ### Return type
279
289
 
@@ -5,6 +5,9 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **profiles** | [**Array&lt;Profile&gt;**](Profile.md) | | [optional] |
8
+ | **total** | **Integer** | Total matching profiles across all pages. Present only when limit or skip was passed. | [optional] |
9
+ | **skip** | **Integer** | Offset applied. Present only when limit or skip was passed. | [optional] |
10
+ | **limit** | **Integer** | Echo of the limit query param. Present only when it was passed. | [optional] |
8
11
 
9
12
  ## Example
10
13
 
@@ -12,7 +15,10 @@
12
15
  require 'zernio-sdk'
13
16
 
14
17
  instance = Zernio::ProfilesListResponse.new(
15
- profiles: null
18
+ profiles: null,
19
+ total: null,
20
+ skip: null,
21
+ limit: null
16
22
  )
17
23
  ```
18
24
 
@@ -20,9 +20,10 @@ module Zernio
20
20
  @api_client = api_client
21
21
  end
22
22
  # Create profile
23
- # Creates a new profile with a name, optional description, and color.
23
+ # Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
24
24
  # @param create_profile_request [CreateProfileRequest]
25
25
  # @param [Hash] opts the optional parameters
26
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
26
27
  # @return [ProfileCreateResponse]
27
28
  def create_profile(create_profile_request, opts = {})
28
29
  data, _status_code, _headers = create_profile_with_http_info(create_profile_request, opts)
@@ -30,9 +31,10 @@ module Zernio
30
31
  end
31
32
 
32
33
  # Create profile
33
- # Creates a new profile with a name, optional description, and color.
34
+ # Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
34
35
  # @param create_profile_request [CreateProfileRequest]
35
36
  # @param [Hash] opts the optional parameters
37
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
36
38
  # @return [Array<(ProfileCreateResponse, Integer, Hash)>] ProfileCreateResponse data, response status code and response headers
37
39
  def create_profile_with_http_info(create_profile_request, opts = {})
38
40
  if @api_client.config.debugging
@@ -42,6 +44,10 @@ module Zernio
42
44
  if @api_client.config.client_side_validation && create_profile_request.nil?
43
45
  fail ArgumentError, "Missing the required parameter 'create_profile_request' when calling ProfilesApi.create_profile"
44
46
  end
47
+ if @api_client.config.client_side_validation && !opts[:'idempotency_key'].nil? && opts[:'idempotency_key'].to_s.length > 255
48
+ fail ArgumentError, 'invalid value for "opts[:"idempotency_key"]" when calling ProfilesApi.create_profile, the character length must be smaller than or equal to 255.'
49
+ end
50
+
45
51
  # resource path
46
52
  local_var_path = '/v1/profiles'
47
53
 
@@ -57,6 +63,7 @@ module Zernio
57
63
  if !content_type.nil?
58
64
  header_params['Content-Type'] = content_type
59
65
  end
66
+ header_params[:'Idempotency-Key'] = opts[:'idempotency_key'] if !opts[:'idempotency_key'].nil?
60
67
 
61
68
  # form parameters
62
69
  form_params = opts[:form_params] || {}
@@ -214,9 +221,12 @@ module Zernio
214
221
  end
215
222
 
216
223
  # List profiles
217
- # Returns profiles sorted by creation date. Use includeOverLimit=true to include profiles that exceed the plan limit.
224
+ # Returns profiles sorted default-first, then by creation date. Filter with name (exact match) and paginate with limit/skip; without those params the full list is returned unchanged. Use includeOverLimit=true to include profiles that exceed the plan limit.
218
225
  # @param [Hash] opts the optional parameters
219
226
  # @option opts [Boolean] :include_over_limit When true, includes over-limit profiles (marked with isOverLimit: true). (default to false)
227
+ # @option opts [String] :name Exact-match filter on the profile name. Useful to recover a profile id after an ambiguous create (timeout followed by a 409 on retry).
228
+ # @option opts [Integer] :limit Page size. When limit or skip is present, the response includes total and skip (and echoes limit).
229
+ # @option opts [Integer] :skip Number of profiles to skip, applied after sorting and filtering.
220
230
  # @return [ProfilesListResponse]
221
231
  def list_profiles(opts = {})
222
232
  data, _status_code, _headers = list_profiles_with_http_info(opts)
@@ -224,20 +234,38 @@ module Zernio
224
234
  end
225
235
 
226
236
  # List profiles
227
- # Returns profiles sorted by creation date. Use includeOverLimit&#x3D;true to include profiles that exceed the plan limit.
237
+ # Returns profiles sorted default-first, then by creation date. Filter with name (exact match) and paginate with limit/skip; without those params the full list is returned unchanged. Use includeOverLimit&#x3D;true to include profiles that exceed the plan limit.
228
238
  # @param [Hash] opts the optional parameters
229
239
  # @option opts [Boolean] :include_over_limit When true, includes over-limit profiles (marked with isOverLimit: true). (default to false)
240
+ # @option opts [String] :name Exact-match filter on the profile name. Useful to recover a profile id after an ambiguous create (timeout followed by a 409 on retry).
241
+ # @option opts [Integer] :limit Page size. When limit or skip is present, the response includes total and skip (and echoes limit).
242
+ # @option opts [Integer] :skip Number of profiles to skip, applied after sorting and filtering.
230
243
  # @return [Array<(ProfilesListResponse, Integer, Hash)>] ProfilesListResponse data, response status code and response headers
231
244
  def list_profiles_with_http_info(opts = {})
232
245
  if @api_client.config.debugging
233
246
  @api_client.config.logger.debug 'Calling API: ProfilesApi.list_profiles ...'
234
247
  end
248
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 1000
249
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling ProfilesApi.list_profiles, must be smaller than or equal to 1000.'
250
+ end
251
+
252
+ if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1
253
+ fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling ProfilesApi.list_profiles, must be greater than or equal to 1.'
254
+ end
255
+
256
+ if @api_client.config.client_side_validation && !opts[:'skip'].nil? && opts[:'skip'] < 0
257
+ fail ArgumentError, 'invalid value for "opts[:"skip"]" when calling ProfilesApi.list_profiles, must be greater than or equal to 0.'
258
+ end
259
+
235
260
  # resource path
236
261
  local_var_path = '/v1/profiles'
237
262
 
238
263
  # query parameters
239
264
  query_params = opts[:query_params] || {}
240
265
  query_params[:'includeOverLimit'] = opts[:'include_over_limit'] if !opts[:'include_over_limit'].nil?
266
+ query_params[:'name'] = opts[:'name'] if !opts[:'name'].nil?
267
+ query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil?
268
+ query_params[:'skip'] = opts[:'skip'] if !opts[:'skip'].nil?
241
269
 
242
270
  # header parameters
243
271
  header_params = opts[:header_params] || {}
@@ -17,10 +17,22 @@ module Zernio
17
17
  class ProfilesListResponse < ApiModelBase
18
18
  attr_accessor :profiles
19
19
 
20
+ # Total matching profiles across all pages. Present only when limit or skip was passed.
21
+ attr_accessor :total
22
+
23
+ # Offset applied. Present only when limit or skip was passed.
24
+ attr_accessor :skip
25
+
26
+ # Echo of the limit query param. Present only when it was passed.
27
+ attr_accessor :limit
28
+
20
29
  # Attribute mapping from ruby-style variable name to JSON key.
21
30
  def self.attribute_map
22
31
  {
23
- :'profiles' => :'profiles'
32
+ :'profiles' => :'profiles',
33
+ :'total' => :'total',
34
+ :'skip' => :'skip',
35
+ :'limit' => :'limit'
24
36
  }
25
37
  end
26
38
 
@@ -37,7 +49,10 @@ module Zernio
37
49
  # Attribute type mapping.
38
50
  def self.openapi_types
39
51
  {
40
- :'profiles' => :'Array<Profile>'
52
+ :'profiles' => :'Array<Profile>',
53
+ :'total' => :'Integer',
54
+ :'skip' => :'Integer',
55
+ :'limit' => :'Integer'
41
56
  }
42
57
  end
43
58
 
@@ -68,6 +83,18 @@ module Zernio
68
83
  self.profiles = value
69
84
  end
70
85
  end
86
+
87
+ if attributes.key?(:'total')
88
+ self.total = attributes[:'total']
89
+ end
90
+
91
+ if attributes.key?(:'skip')
92
+ self.skip = attributes[:'skip']
93
+ end
94
+
95
+ if attributes.key?(:'limit')
96
+ self.limit = attributes[:'limit']
97
+ end
71
98
  end
72
99
 
73
100
  # Show invalid properties with the reasons. Usually used together with valid?
@@ -90,7 +117,10 @@ module Zernio
90
117
  def ==(o)
91
118
  return true if self.equal?(o)
92
119
  self.class == o.class &&
93
- profiles == o.profiles
120
+ profiles == o.profiles &&
121
+ total == o.total &&
122
+ skip == o.skip &&
123
+ limit == o.limit
94
124
  end
95
125
 
96
126
  # @see the `==` method
@@ -102,7 +132,7 @@ module Zernio
102
132
  # Calculates hash code according to all attributes.
103
133
  # @return [Integer] Hash code
104
134
  def hash
105
- [profiles].hash
135
+ [profiles, total, skip, limit].hash
106
136
  end
107
137
 
108
138
  # Builds the object from hash
@@ -11,5 +11,5 @@ Generator version: 7.19.0
11
11
  =end
12
12
 
13
13
  module Zernio
14
- VERSION = '0.0.558'
14
+ VERSION = '0.0.560'
15
15
  end
data/openapi.yaml CHANGED
@@ -6112,6 +6112,15 @@ components:
6112
6112
  type: array
6113
6113
  items:
6114
6114
  $ref: '#/components/schemas/Profile'
6115
+ total:
6116
+ type: integer
6117
+ description: 'Total matching profiles across all pages. Present only when limit or skip was passed.'
6118
+ skip:
6119
+ type: integer
6120
+ description: 'Offset applied. Present only when limit or skip was passed.'
6121
+ limit:
6122
+ type: integer
6123
+ description: Echo of the limit query param. Present only when it was passed.
6115
6124
  ProfileCreateResponse:
6116
6125
  type: object
6117
6126
  properties:
@@ -13287,7 +13296,11 @@ paths:
13287
13296
  operationId: listProfiles
13288
13297
  tags: [Profiles]
13289
13298
  summary: List profiles
13290
- description: Returns profiles sorted by creation date. Use includeOverLimit=true to include profiles that exceed the plan limit.
13299
+ description: >-
13300
+ Returns profiles sorted default-first, then by creation date. Filter
13301
+ with name (exact match) and paginate with limit/skip; without those
13302
+ params the full list is returned unchanged. Use includeOverLimit=true
13303
+ to include profiles that exceed the plan limit.
13291
13304
  parameters:
13292
13305
  - name: includeOverLimit
13293
13306
  in: query
@@ -13296,6 +13309,21 @@ paths:
13296
13309
  type: boolean
13297
13310
  default: false
13298
13311
  description: "When true, includes over-limit profiles (marked with isOverLimit: true)."
13312
+ - name: name
13313
+ in: query
13314
+ required: false
13315
+ schema: { type: string }
13316
+ description: 'Exact-match filter on the profile name. Useful to recover a profile id after an ambiguous create (timeout followed by a 409 on retry).'
13317
+ - name: limit
13318
+ in: query
13319
+ required: false
13320
+ schema: { type: integer, minimum: 1, maximum: 1000 }
13321
+ description: 'Page size. When limit or skip is present, the response includes total and skip (and echoes limit).'
13322
+ - name: skip
13323
+ in: query
13324
+ required: false
13325
+ schema: { type: integer, minimum: 0 }
13326
+ description: 'Number of profiles to skip, applied after sorting and filtering.'
13299
13327
  responses:
13300
13328
  '200':
13301
13329
  description: Profiles
@@ -13311,12 +13339,29 @@ paths:
13311
13339
  name: "Personal Brand"
13312
13340
  color: "#ffeda0"
13313
13341
  isDefault: true
13342
+ '400': { $ref: '#/components/responses/BadRequest' }
13314
13343
  '401': { $ref: '#/components/responses/Unauthorized' }
13315
13344
  post:
13316
13345
  operationId: createProfile
13317
13346
  tags: [Profiles]
13318
13347
  summary: Create profile
13319
- description: Creates a new profile with a name, optional description, and color.
13348
+ description: >-
13349
+ Creates a new profile with a name, optional description, and color.
13350
+ Names are unique per workspace: a duplicate returns a 409 whose
13351
+ details.existingProfileId carries the id of the existing profile.
13352
+ Send an Idempotency-Key header to make retries safe: a retried create
13353
+ with the same key and body replays the original 201 (same _id)
13354
+ instead of conflicting.
13355
+ parameters:
13356
+ - name: Idempotency-Key
13357
+ in: header
13358
+ required: false
13359
+ schema: { type: string, maxLength: 255 }
13360
+ description: >-
13361
+ Optional client-generated unique key (e.g. a UUID) that makes
13362
+ create retries safe. Same key + same body replays the original
13363
+ response; same key + different body → 422; key still processing →
13364
+ 409.
13320
13365
  requestBody:
13321
13366
  required: true
13322
13367
  content:
@@ -13353,7 +13398,8 @@ paths:
13353
13398
  '401': { $ref: '#/components/responses/Unauthorized' }
13354
13399
  '402': { $ref: '#/components/responses/PaymentRequired' }
13355
13400
  '403': { description: Profile limit exceeded }
13356
- '409': { description: "A profile with this name already exists (code: profile_name_conflict)." }
13401
+ '409': { description: 'A profile with this name already exists (code: profile_name_conflict); details.existingProfileId carries the id of the existing profile. Also returned while a request with the same Idempotency-Key is still processing.' }
13402
+ '422': { description: Idempotency-Key reused with a different body }
13357
13403
  /v1/profiles/{profileId}:
13358
13404
  get:
13359
13405
  operationId: getProfile
@@ -33536,6 +33582,7 @@ paths:
33536
33582
  type: array
33537
33583
  items: { $ref: '#/components/schemas/AdCampaign' }
33538
33584
  pagination: { $ref: '#/components/schemas/Pagination' }
33585
+ '400': { $ref: '#/components/responses/BadRequest' }
33539
33586
  '401': { $ref: '#/components/responses/Unauthorized' }
33540
33587
  '403':
33541
33588
  description: Ads access required. Legacy plans need the Ads add-on; included by default on usage-based plans.
@@ -34,9 +34,10 @@ describe 'ProfilesApi' do
34
34
 
35
35
  # unit tests for create_profile
36
36
  # Create profile
37
- # Creates a new profile with a name, optional description, and color.
37
+ # Creates a new profile with a name, optional description, and color. Names are unique per workspace: a duplicate returns a 409 whose details.existingProfileId carries the id of the existing profile. Send an Idempotency-Key header to make retries safe: a retried create with the same key and body replays the original 201 (same _id) instead of conflicting.
38
38
  # @param create_profile_request
39
39
  # @param [Hash] opts the optional parameters
40
+ # @option opts [String] :idempotency_key Optional client-generated unique key (e.g. a UUID) that makes create retries safe. Same key + same body replays the original response; same key + different body → 422; key still processing → 409.
40
41
  # @return [ProfileCreateResponse]
41
42
  describe 'create_profile test' do
42
43
  it 'should work' do
@@ -70,9 +71,12 @@ describe 'ProfilesApi' do
70
71
 
71
72
  # unit tests for list_profiles
72
73
  # List profiles
73
- # Returns profiles sorted by creation date. Use includeOverLimit&#x3D;true to include profiles that exceed the plan limit.
74
+ # Returns profiles sorted default-first, then by creation date. Filter with name (exact match) and paginate with limit/skip; without those params the full list is returned unchanged. Use includeOverLimit&#x3D;true to include profiles that exceed the plan limit.
74
75
  # @param [Hash] opts the optional parameters
75
76
  # @option opts [Boolean] :include_over_limit When true, includes over-limit profiles (marked with isOverLimit: true).
77
+ # @option opts [String] :name Exact-match filter on the profile name. Useful to recover a profile id after an ambiguous create (timeout followed by a 409 on retry).
78
+ # @option opts [Integer] :limit Page size. When limit or skip is present, the response includes total and skip (and echoes limit).
79
+ # @option opts [Integer] :skip Number of profiles to skip, applied after sorting and filtering.
76
80
  # @return [ProfilesListResponse]
77
81
  describe 'list_profiles test' do
78
82
  it 'should work' do
@@ -33,4 +33,22 @@ describe Zernio::ProfilesListResponse do
33
33
  end
34
34
  end
35
35
 
36
+ describe 'test attribute "total"' do
37
+ it 'should work' do
38
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
39
+ end
40
+ end
41
+
42
+ describe 'test attribute "skip"' do
43
+ it 'should work' do
44
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
45
+ end
46
+ end
47
+
48
+ describe 'test attribute "limit"' do
49
+ it 'should work' do
50
+ # assertion here. ref: https://rspec.info/features/3-12/rspec-expectations/built-in-matchers/
51
+ end
52
+ end
53
+
36
54
  end