warrant 1.2.0 → 2.0.0.rc1

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.
@@ -2,26 +2,24 @@
2
2
 
3
3
  module Warrant
4
4
  class Warrant
5
- attr_reader :id, :object_type, :object_id, :relation, :subject, :is_direct_match
5
+ attr_reader :id, :object_type, :object_id, :relation, :subject, :context, :is_direct_match
6
6
 
7
7
  # @!visibility private
8
- def initialize(object_type, object_id, relation, subject, is_direct_match = nil)
8
+ def initialize(object_type, object_id, relation, subject, context = nil, is_direct_match = nil)
9
9
  @object_type = object_type
10
10
  @object_id = object_id
11
11
  @relation = relation
12
12
  @subject = subject
13
+ @context = context
13
14
  @is_direct_match = is_direct_match
14
15
  end
15
16
 
16
17
  # Create a new warrant that associates an object (object_type and object_id) to a subject via a relation.
17
18
  #
18
- # @option params [String] :object_type The type of object. Must be one of your system's existing object types.
19
- # @option params [String] :object_id The id of the specific object.
20
- # @option params [String] :relation The relation for this object to subject association. The relation must be valid as per the object type definition.
21
- # @option params [Hash] :subject The specific subject (object, user etc.) to be associated with the object. A subject can either be a specific object (by id) or a group of objects defined by a set containing an objectType, objectId and relation.
22
- # * :object_type (String) - The type of object. Must be one of your system's existing object types.
23
- # * :object_id (String) - The id of the specific object.
24
- # * :relation (String) - The relation for this object to subject association. The relation must be valid as per the object type definition. (optional)
19
+ # @param object [WarrantObject] Object to check in the access check. Object must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`). The object type must be one of your system's existing object type.
20
+ # @param relation [String] The relation to check for this object to subject association. The relation must be valid as per the object type definition.
21
+ # @param subject [WarrantObject] Subject to check in the access check. Subject must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`).
22
+ # @param context [Hash] - Object containing key-value pairs that specifies the context the warrant should be created for. (optional)
25
23
  #
26
24
  # @return [Warrant] created warrant
27
25
  #
@@ -29,18 +27,27 @@ module Warrant
29
27
  # @raise [Warrant::InternalError]
30
28
  # @raise [Warrant::InvalidParameterError]
31
29
  # @raise [Warrant::InvalidRequestError]
32
- # @raise [Warrant::MissingRequiredParameterError]
33
30
  # @raise [Warrant::NotFoundError]
34
31
  # @raise [Warrant::UnauthorizedError]
35
32
  # @raise [Warrant::WarrantError]
36
- def self.create(params = {})
33
+ def self.create(object, relation, subject, context = nil)
34
+ params = {
35
+ object_type: object.warrant_object_type,
36
+ object_id: object.warrant_object_id,
37
+ relation: relation,
38
+ subject: {
39
+ object_type: subject.warrant_object_type,
40
+ object_id: subject.warrant_object_id
41
+ },
42
+ context: context
43
+ }
37
44
  res = APIOperations.post(URI.parse("#{::Warrant.config.api_base}/v1/warrants"), Util.normalize_params(params))
38
45
  res_json = JSON.parse(res.body)
39
46
 
40
47
  case res
41
48
  when Net::HTTPSuccess
42
49
  subject = Subject.new(res_json['subject']['objectType'], res_json['subject']['objectId'], res_json['subject']['relation'])
43
- Warrant.new(res_json['objectType'], res_json['objectId'], res_json['relation'], subject)
50
+ Warrant.new(res_json['objectType'], res_json['objectId'], res_json['relation'], subject, res_json['context'])
44
51
  else
45
52
  APIOperations.raise_error(res)
46
53
  end
@@ -48,24 +55,29 @@ module Warrant
48
55
 
49
56
  # Deletes a warrant specified by the combination of object_type, object_id, relation, and subject.
50
57
  #
51
- # @option params [String] :object_type The type of object. Must be one of your system's existing object types.
52
- # @option params [String] :object_id The id of the specific object.
53
- # @option params [String] :relation The relation for this object to subject association. The relation must be valid as per the object type definition.
54
- # @option params [Hash] :subject The specific subject (object, user etc.) to be associated with the object. A subject can either be a specific object (by id) or a group of objects defined by a set containing an objectType, objectId and relation.
55
- # * :object_type [String] The type of object. Must be one of your system's existing object types.
56
- # * :object_id [String] The id of the specific object.
57
- # * :relation [String] The relation for this object to subject association. The relation must be valid as per the object type definition. (optional)
58
+ # @param object [WarrantObject] Object to check in the access check. Object must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`). The object type must be one of your system's existing object type.
59
+ # @param relation [String] The relation to check for this object to subject association. The relation must be valid as per the object type definition.
60
+ # @param subject [WarrantObject] Subject to check in the access check. Subject must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`).
61
+ # @param context [Hash] - Object containing key-value pairs that specifies the context the warrant should be deleted in. (optional)
58
62
  #
59
63
  # @return [nil] if delete was successful
60
64
  #
61
65
  # @raise [Warrant::InternalError]
62
- # @raise [Warrant::InvalidParameterError]
63
66
  # @raise [Warrant::InvalidRequestError]
64
- # @raise [Warrant::MissingRequiredParameterError]
65
67
  # @raise [Warrant::NotFoundError]
66
68
  # @raise [Warrant::UnauthorizedError]
67
69
  # @raise [Warrant::WarrantError]
68
- def self.delete(params = {})
70
+ def self.delete(object, relation, subject, context = nil)
71
+ params = {
72
+ object_type: object.warrant_object_type,
73
+ object_id: object.warrant_object_id,
74
+ relation: relation,
75
+ subject: {
76
+ object_type: subject.warrant_object_type,
77
+ object_id: subject.warrant_object_id
78
+ },
79
+ context: context
80
+ }
69
81
  res = APIOperations.delete(URI.parse("#{::Warrant.config.api_base}/v1/warrants"), Util.normalize_params(params))
70
82
 
71
83
  case res
@@ -76,34 +88,6 @@ module Warrant
76
88
  end
77
89
  end
78
90
 
79
- # List all warrants for your organization.
80
- #
81
- # @option filters [String] :object_type The type of object. Must be one of your system's existing object types. (optional)
82
- # @option filters [String] :object_id The id of the specific object. (optional)
83
- # @option filters [String] :relation The relation for this object to subject association. The relation must be valid as per the object type definition. (optional)
84
- #
85
- # @return [Array<Warrant>] list of all warrants with provided filters
86
- #
87
- # @raise [Warrant::InternalError]
88
- # @raise [Warrant::InvalidRequestError]
89
- # @raise [Warrant::NotFoundError]
90
- # @raise [Warrant::UnauthorizedError]
91
- # @raise [Warrant::WarrantError]
92
- def self.list(filters = {})
93
- res = APIOperations.get(URI.parse("#{::Warrant.config.api_base}/v1/warrants"), filters)
94
-
95
- case res
96
- when Net::HTTPSuccess
97
- warrants = JSON.parse(res.body)
98
- warrants.map{ |warrant|
99
- subject = Subject.new(warrant['subject']['objectType'], warrant['subject']['objectId'], warrant['subject']['relation'])
100
- Warrant.new(warrant['objectType'], warrant['objectId'], warrant['relation'], subject)
101
- }
102
- else
103
- APIOperations.raise_error(res)
104
- end
105
- end
106
-
107
91
  # Query to find all warrants for a given subject.
108
92
  #
109
93
  # @option params [String] :object_type The type of object. Must be one of your system's existing object types. (optional)
@@ -112,12 +96,14 @@ module Warrant
112
96
  # * subject (Hash) - The specific subject for which warrants will be queried for.
113
97
  # * object_type (String) - The type of object. Must be one of your system's existing object types.
114
98
  # * object_id (String) - The id of the specific object.
99
+ # @option params [Integer] :page A positive integer (starting with 1) representing the page of items to return in response. Used in conjunction with the limit param. (optional)
100
+ # @option params [Integer] :limit A positive integer representing the max number of items to return in response. (optional)
115
101
  #
116
102
  # @return [Array<Warrant>] list of all warrants with provided params
117
103
  #
118
104
  # @raise [Warrant::InternalError]
119
- # @raise [Warrant::InvalidRequestError]
120
- # @raise [Warrant::NotFoundError]
105
+ # @raise [Warrant::InvalidParameterError]
106
+ # @raise [Warrant::MissingRequiredParameterError]
121
107
  # @raise [Warrant::UnauthorizedError]
122
108
  # @raise [Warrant::WarrantError]
123
109
  def self.query(params = {})
@@ -129,7 +115,7 @@ module Warrant
129
115
  warrants = JSON.parse(res.body)
130
116
  warrants.map{ |warrant|
131
117
  subject = Subject.new(warrant['subject']['objectType'], warrant['subject']['objectId'], warrant['subject']['relation'])
132
- Warrant.new(warrant['objectType'], warrant['objectId'], warrant['relation'], subject, warrant['isDirectMatch'])
118
+ Warrant.new(warrant['objectType'], warrant['objectId'], warrant['relation'], subject, warrant['context'], warrant['isDirectMatch'])
133
119
  }
134
120
  else
135
121
  APIOperations.raise_error(res)
@@ -148,7 +134,8 @@ module Warrant
148
134
  # * object_type (String) - The type of object. Must be one of your system's existing object types.
149
135
  # * object_id (String) - The id of the specific object.
150
136
  # * relation (String) - The relation for this object to subject association. The relation must be valid as per the object type definition. (optional)
151
- # @param consistentRead [Boolean] Boolean flag indicating whether or not to enforce strict consistency for this access check. Defaults to false. (optional)
137
+ # @param context [Hash] - Object containing key-value pairs that specifies the context the warrant should be checked in. (optional)
138
+ # @param consistent_read [Boolean] Boolean flag indicating whether or not to enforce strict consistency for this access check. Defaults to false. (optional)
152
139
  # @param debug [Boolean] Boolean flag indicating whether or not to return debug information for this access check. Defaults to false. (optional)
153
140
  #
154
141
  # @return [Boolean] whether or not the given access check is authorized
@@ -167,11 +154,8 @@ module Warrant
167
154
  #
168
155
  # @raise [Warrant::InternalError]
169
156
  # @raise [Warrant::InvalidParameterError]
170
- # @raise [Warrant::InvalidRequestError]
171
- # @raise [Warrant::MissingRequiredParameterError]
172
157
  # @raise [Warrant::NotFoundError]
173
158
  # @raise [Warrant::UnauthorizedError]
174
- # @raise [Warrant::WarrantError]
175
159
  def self.is_authorized?(params = {})
176
160
  unless ::Warrant.config.authorize_endpoint.nil?
177
161
  return edge_authorize?(params)
@@ -180,10 +164,142 @@ module Warrant
180
164
  return authorize?(params)
181
165
  end
182
166
 
167
+ # Checks whether a specified access check is authorized or not.
168
+ #
169
+ # @param object [WarrantObject] Object to check in the access check. Object must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`). The object type must be one of your system's existing object type.
170
+ # @param relation [String] The relation to check for this object to subject association. The relation must be valid as per the object type definition.
171
+ # @param subject [WarrantObject] Subject to check in the access check. Subject must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`).
172
+ # @option options [Hash] :context Object containing key-value pairs that specifies the context the warrant should be checked in. (optional) (optional)
173
+ # @option options [Boolean] :consistent_read Boolean flag indicating whether or not to enforce strict consistency for this access check. Defaults to false. (optional)
174
+ # @option options [Boolean] :debug Boolean flag indicating whether or not to return debug information for this access check. Defaults to false. (optional)
175
+ #
176
+ # @return [Boolean] whether or not the given access check is authorized
177
+ #
178
+ # @example Check whether the user has "viewer" relation to report. `Report` and `User` here are both classes in your application that include `WarrantObject`.
179
+ # my_report = Report.get("some-report")
180
+ # current_user = User.get("llm-128")
181
+ # Warrant::Warrant.is_authorized?(my_report, "viewer", current_user)
182
+ #
183
+ # @raise [Warrant::InternalError]
184
+ # @raise [Warrant::InvalidParameterError]
185
+ # @raise [Warrant::NotFoundError]
186
+ # @raise [Warrant::UnauthorizedError]
187
+ def self.check(object, relation, subject, options = {})
188
+ if subject.instance_of?(Subject)
189
+ subject = {
190
+ object_type: subject.object_type,
191
+ object_id: subject.object_id,
192
+ relation: subject.relation
193
+ }.compact!
194
+ else
195
+ subject = {
196
+ object_type: subject.warrant_object_type,
197
+ object_id: subject.warrant_object_id
198
+ }
199
+ end
200
+
201
+ unless ::Warrant.config.authorize_endpoint.nil?
202
+ return edge_authorize?(
203
+ warrants: [{
204
+ object_type: object.warrant_object_type,
205
+ object_id: object.warrant_object_id,
206
+ relation: relation,
207
+ subject: subject,
208
+ context: options[:context]
209
+ }],
210
+ consistent_read: options[:consistent_read],
211
+ debug: options[:debug]
212
+ )
213
+ end
214
+
215
+ return authorize?(
216
+ warrants: [{
217
+ object_type: object.warrant_object_type,
218
+ object_id: object.warrant_object_id,
219
+ relation: relation,
220
+ subject: subject,
221
+ context: options[:context]
222
+ }],
223
+ consistent_read: options[:consistent_read],
224
+ debug: options[:debug]
225
+ )
226
+ end
227
+
228
+ # Checks whether multiple access checks are authorized or not.
229
+ #
230
+ # @param op [String] Logical operator to perform on warrants. Can be 'anyOf' or 'allOf'.
231
+ # @param warrants [Array] Array of warrants to check access for.
232
+ # * object (WarrantObject) - Object to check in the access check. Object must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`). The object type must be one of your system's existing object type.
233
+ # * relation (String) - The relation to check for this object to subject association. The relation must be valid as per the object type definition.
234
+ # * subject (WarrantObject) Subject to check in the access check. Subject must include WarrantObject module and implements its methods (`warrant_object_type` and `warrant_object_id`).
235
+ # @option options [Hash] :context Object containing key-value pairs that specifies the context the warrant should be checked in. (optional)
236
+ # @option options [Boolean] :consistent_read Boolean flag indicating whether or not to enforce strict consistency for this access check. Defaults to false. (optional)
237
+ # @option options [Boolean] :debug Boolean flag indicating whether or not to return debug information for this access check. Defaults to false. (optional)
238
+ #
239
+ # @return [Boolean] whether or not the given access check is authorized
240
+ #
241
+ # @example Check whether the current user has "viewer" relation to report and is a "member" of the customer account "superstore". `Report`, `CustomerAccount` and `User` here are all classes in your application that include `WarrantObject`.
242
+ # my_report = Report.get("some-report")
243
+ # customer_account = CustomerAccount.get("superstore")
244
+ # current_user = User.get("llm-128")
245
+ # Warrant::Warrant.check_many(
246
+ # "allOf",
247
+ # [
248
+ # { object: my_report, relation: "viewer", subject: current_user },
249
+ # { object: customer_account, relation: "member", subject: current_user }
250
+ # ]
251
+ # )
252
+ #
253
+ # @raise [Warrant::InternalError]
254
+ # @raise [Warrant::InvalidParameterError]
255
+ # @raise [Warrant::NotFoundError]
256
+ # @raise [Warrant::UnauthorizedError]
257
+ def self.check_many(op, warrants, options = {})
258
+ normalized_warrants = warrants.map do |warrant|
259
+ if warrant[:subject].instance_of?(Subject)
260
+ subject = {
261
+ object_type: warrant[:subject].object_type,
262
+ object_id: warrant[:subject].object_id,
263
+ relation: warrant[:subject].relation
264
+ }.compact!
265
+ else
266
+ subject = {
267
+ object_type: warrant[:subject].warrant_object_type,
268
+ object_id: warrant[:subject].warrant_object_id
269
+ }
270
+ end
271
+
272
+ {
273
+ object_type: warrant[:object].warrant_object_type,
274
+ object_id: warrant[:object].warrant_object_id,
275
+ relation: warrant[:relation],
276
+ subject: subject,
277
+ context: warrant[:context]
278
+ }
279
+ end
280
+
281
+ unless ::Warrant.config.authorize_endpoint.nil?
282
+ return edge_authorize?(
283
+ op: op,
284
+ warrants: normalized_warrants,
285
+ consistent_read: options[:consistent_read],
286
+ debug: options[:debug]
287
+ )
288
+ end
289
+
290
+ return authorize?(
291
+ op: op,
292
+ warrants: normalized_warrants,
293
+ consistent_read: options[:consistent_read],
294
+ debug: options[:debug]
295
+ )
296
+ end
297
+
183
298
  # Checks whether a given user has a given permission.
184
299
  #
185
300
  # @param user_id [String] Id of the user to check
186
301
  # @param permission_id [String] Id of the permission to check on the user
302
+ # @param context [Hash] - Object containing key-value pairs that specifies the context the warrant should be checked in. (optional)
187
303
  # @param consistentRead [Boolean] Boolean flag indicating whether or not to enforce strict consistency for this access check. Defaults to false. (optional)
188
304
  # @param debug [Boolean] Boolean flag indicating whether or not to return debug information for this access check. Defaults to false. (optional)
189
305
  #
@@ -191,11 +307,8 @@ module Warrant
191
307
  #
192
308
  # @raise [Warrant::InternalError]
193
309
  # @raise [Warrant::InvalidParameterError]
194
- # @raise [Warrant::InvalidRequestError]
195
- # @raise [Warrant::MissingRequiredParameterError]
196
310
  # @raise [Warrant::NotFoundError]
197
311
  # @raise [Warrant::UnauthorizedError]
198
- # @raise [Warrant::WarrantError]
199
312
  def self.user_has_permission?(params = {})
200
313
  return is_authorized?(
201
314
  warrants: [{
@@ -205,13 +318,47 @@ module Warrant
205
318
  subject: {
206
319
  object_type: "user",
207
320
  object_id: params[:user_id]
208
- }
321
+ },
322
+ context: params[:context]
209
323
  }],
210
324
  consistentRead: params[:consistentRead],
211
325
  debug: params[:debug]
212
326
  )
213
327
  end
214
328
 
329
+ # Checks whether a given subject has a given feature.
330
+ #
331
+ # @param subject (Hash) - The specific subject for which feature access will be checked.
332
+ # * object_type (String) - The type of object. Must be one of your system's existing object types.
333
+ # * object_id (String) - The id of the specific object.
334
+ # @param feature_id [String] Id of the feature to check on the subject
335
+ # @param context [Hash] - Object containing key-value pairs that specifies the context the warrant should be checked in. (optional)
336
+ # @param consistent_read [Boolean] Boolean flag indicating whether or not to enforce strict consistency for this access check. Defaults to false. (optional)
337
+ # @param debug [Boolean] Boolean flag indicating whether or not to return debug information for this access check. Defaults to false. (optional)
338
+ #
339
+ # @return [Boolean] whether or not the user has the given permission
340
+ #
341
+ # @raise [Warrant::InternalError]
342
+ # @raise [Warrant::InvalidParameterError]
343
+ # @raise [Warrant::NotFoundError]
344
+ # @raise [Warrant::UnauthorizedError]
345
+ def self.has_feature?(params = {})
346
+ return is_authorized?(
347
+ warrants: [{
348
+ object_type: "feature",
349
+ object_id: params[:feature_id],
350
+ relation: "member",
351
+ subject: {
352
+ object_type: params[:subject][:object_type],
353
+ object_id: params[:subject][:object_id]
354
+ },
355
+ context: params[:context]
356
+ }],
357
+ consistent_read: params[:consistent_read],
358
+ debug: params[:debug]
359
+ )
360
+ end
361
+
215
362
  private
216
363
 
217
364
  def self.authorize?(params = {})
data/lib/warrant/util.rb CHANGED
@@ -15,28 +15,29 @@ module Warrant
15
15
  .downcase
16
16
  end
17
17
 
18
- def normalize_options(opts)
19
- new_opts = opts.each_with_object({}) do |(k, v), new_opts|
20
- new_key = Util.camelcase(k.to_s)
21
-
22
- new_opts[new_key] = v
23
- end
24
- end
25
-
26
18
  def normalize_params(params)
27
- new_opts = params.each_with_object({}) do |(k, v), new_opts|
28
- new_key = Util.camelcase(k.to_s)
19
+ params.compact!
20
+
21
+ case params
22
+ when Hash
23
+ params.each_with_object({}) do |(k, v), new_opts|
24
+ new_key = Util.camelcase(k.to_s)
29
25
 
30
- case v
31
- when Hash
32
- new_opts[new_key] = normalize_params(v)
33
- when Array
34
- new_opts[new_key] = v.map { |i| normalize_params(i) }
35
- when Subject
36
- new_opts[new_key] = "#{v.object_type}:#{v.object_id}"
37
- else
38
- new_opts[new_key] = v
26
+ case v
27
+ when Hash
28
+ new_opts[new_key] = normalize_params(v)
29
+ when Array
30
+ new_opts[new_key] = v.map { |i| normalize_params(i) }
31
+ when Subject
32
+ new_opts[new_key] = "#{v.object_type}:#{v.object_id}"
33
+ else
34
+ new_opts[new_key] = v
35
+ end
39
36
  end
37
+ when Array
38
+ params.map { |i| normalize_params(i) }
39
+ else
40
+ params
40
41
  end
41
42
  end
42
43
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Warrant
4
- VERSION = "1.2.0"
4
+ VERSION = "2.0.0.rc1"
5
5
  end
@@ -3,13 +3,13 @@
3
3
  module Warrant
4
4
  # @!visibility private
5
5
  class WarrantConfiguration
6
- attr_accessor :api_key
7
- attr_accessor :authorize_endpoint
6
+ attr_accessor :api_key, :api_base, :authorize_endpoint
8
7
 
9
- attr_reader :api_base, :self_service_dash_url_base
8
+ attr_reader :self_service_dash_url_base
10
9
 
11
10
  def initialize
12
11
  @api_base = "https://api.warrant.dev"
12
+ @authorize_endpoint = "https://api.warrant.dev"
13
13
  @self_service_dash_url_base = "https://self-serve.warrant.dev"
14
14
  end
15
15
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Warrant
4
+ module WarrantObject
5
+ def warrant_object_type
6
+ raise "IMPLEMENT OBJECT TYPE!"
7
+ end
8
+
9
+ def warrant_object_id
10
+ raise "IMPLEMENT OBJECT ID!"
11
+ end
12
+ end
13
+ end
data/lib/warrant.rb CHANGED
@@ -6,9 +6,13 @@ require "net/http"
6
6
  require "json"
7
7
  require "forwardable"
8
8
 
9
+ require "warrant/warrant_object"
10
+
9
11
  require "warrant/api_operations"
10
12
  require "warrant/errors"
13
+ require "warrant/models/feature"
11
14
  require "warrant/models/permission"
15
+ require "warrant/models/pricing_tier"
12
16
  require "warrant/models/role"
13
17
  require "warrant/models/session"
14
18
  require "warrant/models/subject"
@@ -26,6 +30,6 @@ module Warrant
26
30
 
27
31
  attr_reader :config
28
32
 
29
- def_delegators :@config, :api_key, :api_key=, :authorize_endpoint, :authorize_endpoint=
33
+ def_delegators :@config, :api_key, :api_key=, :api_base, :api_base=, :authorize_endpoint, :authorize_endpoint=
30
34
  end
31
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: warrant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 2.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Warrant
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-12-12 00:00:00.000000000 Z
11
+ date: 2022-12-21 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Ruby library for the Warrant API at https://warrant.dev.
14
14
  email: hello@warrant.dev
@@ -28,7 +28,9 @@ files:
28
28
  - lib/warrant.rb
29
29
  - lib/warrant/api_operations.rb
30
30
  - lib/warrant/errors.rb
31
+ - lib/warrant/models/feature.rb
31
32
  - lib/warrant/models/permission.rb
33
+ - lib/warrant/models/pricing_tier.rb
32
34
  - lib/warrant/models/role.rb
33
35
  - lib/warrant/models/session.rb
34
36
  - lib/warrant/models/subject.rb
@@ -38,6 +40,7 @@ files:
38
40
  - lib/warrant/util.rb
39
41
  - lib/warrant/version.rb
40
42
  - lib/warrant/warrant_configuration.rb
43
+ - lib/warrant/warrant_object.rb
41
44
  homepage: https://github.com/warrant-dev/warrant-ruby
42
45
  licenses:
43
46
  - MIT
@@ -57,11 +60,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
60
  version: 2.3.0
58
61
  required_rubygems_version: !ruby/object:Gem::Requirement
59
62
  requirements:
60
- - - ">="
63
+ - - ">"
61
64
  - !ruby/object:Gem::Version
62
- version: '0'
65
+ version: 1.3.1
63
66
  requirements: []
64
- rubygems_version: 3.2.32
67
+ rubygems_version: 3.1.4
65
68
  signing_key:
66
69
  specification_version: 4
67
70
  summary: Warrant Ruby Library