authentik-api 2025.12.4 → 2026.2.2.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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/README_API.md +59 -7
  3. data/lib/authentik/api/api/core_api.rb +109 -12
  4. data/lib/authentik/api/api/crypto_api.rb +0 -3
  5. data/lib/authentik/api/api/endpoints_api.rb +459 -0
  6. data/lib/authentik/api/api/events_api.rb +3 -3
  7. data/lib/authentik/api/api/lifecycle_api.rb +681 -0
  8. data/lib/authentik/api/api/policies_api.rb +1 -1
  9. data/lib/authentik/api/api/providers_api.rb +705 -3
  10. data/lib/authentik/api/api/rbac_api.rb +6 -9
  11. data/lib/authentik/api/api/stages_api.rb +1 -1
  12. data/lib/authentik/api/models/alg_enum.rb +3 -1
  13. data/lib/authentik/api/models/app_enum.rb +4 -1
  14. data/lib/authentik/api/models/application.rb +1 -15
  15. data/lib/authentik/api/models/bulk_delete_session_response.rb +158 -0
  16. data/lib/authentik/api/models/certificate_key_pair.rb +5 -4
  17. data/lib/authentik/api/models/content_type_enum.rb +35 -0
  18. data/lib/authentik/api/models/contextual_flow_info_layout_enum.rb +3 -1
  19. data/lib/authentik/api/models/current_brand_flags.rb +53 -1
  20. data/lib/authentik/api/models/device_access_group.rb +15 -4
  21. data/lib/authentik/api/models/device_access_group_request.rb +15 -4
  22. data/lib/authentik/api/models/device_fact_snapshot.rb +53 -5
  23. data/lib/authentik/api/models/enrollment_token.rb +1 -15
  24. data/lib/authentik/api/models/event_actions.rb +6 -1
  25. data/lib/authentik/api/models/fleet_connector.rb +349 -0
  26. data/lib/authentik/api/models/fleet_connector_request.rb +294 -0
  27. data/lib/authentik/api/models/flow_layout_enum.rb +3 -1
  28. data/lib/authentik/api/models/identification_challenge.rb +20 -1
  29. data/lib/authentik/api/models/lifecycle_iteration.rb +525 -0
  30. data/lib/authentik/api/models/lifecycle_iteration_request.rb +181 -0
  31. data/lib/authentik/api/models/lifecycle_iteration_state_enum.rb +36 -0
  32. data/lib/authentik/api/models/lifecycle_rule.rb +440 -0
  33. data/lib/authentik/api/models/lifecycle_rule_request.rb +394 -0
  34. data/lib/authentik/api/models/model_enum.rb +6 -1
  35. data/lib/authentik/api/models/model_request.rb +4 -2
  36. data/lib/authentik/api/models/operating_system.rb +3 -0
  37. data/lib/authentik/api/models/operating_system_request.rb +3 -0
  38. data/lib/authentik/api/models/paginated_fleet_connector_list.rb +214 -0
  39. data/lib/authentik/api/models/paginated_lifecycle_iteration_list.rb +214 -0
  40. data/lib/authentik/api/models/paginated_lifecycle_rule_list.rb +214 -0
  41. data/lib/authentik/api/models/paginated_ws_federation_provider_list.rb +214 -0
  42. data/lib/authentik/api/models/patched_device_access_group_request.rb +15 -4
  43. data/lib/authentik/api/models/patched_fleet_connector_request.rb +273 -0
  44. data/lib/authentik/api/models/patched_lifecycle_rule_request.rb +353 -0
  45. data/lib/authentik/api/models/patched_role_request.rb +0 -9
  46. data/lib/authentik/api/models/patched_saml_provider_request.rb +1 -1
  47. data/lib/authentik/api/models/patched_scim_provider_request.rb +13 -11
  48. data/lib/authentik/api/models/patched_settings_request_flags.rb +53 -1
  49. data/lib/authentik/api/models/patched_ws_federation_provider_request.rb +457 -0
  50. data/lib/authentik/api/models/provider_model_enum.rb +2 -1
  51. data/lib/authentik/api/models/review.rb +247 -0
  52. data/lib/authentik/api/models/review_request.rb +184 -0
  53. data/lib/authentik/api/models/reviewer_group.rb +184 -0
  54. data/lib/authentik/api/models/reviewer_user.rb +258 -0
  55. data/lib/authentik/api/models/role.rb +0 -9
  56. data/lib/authentik/api/models/role_request.rb +0 -9
  57. data/lib/authentik/api/models/{saml_provider_logout_method_enum.rb → saml_logout_methods.rb} +3 -3
  58. data/lib/authentik/api/models/saml_metadata.rb +1 -15
  59. data/lib/authentik/api/models/saml_provider.rb +1 -1
  60. data/lib/authentik/api/models/saml_provider_request.rb +1 -1
  61. data/lib/authentik/api/models/scim_provider.rb +13 -11
  62. data/lib/authentik/api/models/scim_provider_request.rb +13 -11
  63. data/lib/authentik/api/models/task.rb +1 -1
  64. data/lib/authentik/api/models/{state_enum.rb → task_state_enum.rb} +3 -3
  65. data/lib/authentik/api/models/user_recovery_email_request.rb +187 -0
  66. data/lib/authentik/api/models/user_recovery_link_request.rb +161 -0
  67. data/lib/authentik/api/models/vendor_enum.rb +35 -0
  68. data/lib/authentik/api/models/ws_federation_provider.rb +668 -0
  69. data/lib/authentik/api/models/ws_federation_provider_request.rb +512 -0
  70. data/lib/authentik/api/version.rb +1 -1
  71. data/spec/api/core_api_spec.rb +21 -1
  72. data/spec/api/crypto_api_spec.rb +0 -1
  73. data/spec/api/endpoints_api_spec.rb +83 -0
  74. data/spec/api/lifecycle_api_spec.rb +144 -0
  75. data/spec/api/providers_api_spec.rb +137 -1
  76. data/spec/api/rbac_api_spec.rb +2 -3
  77. data/spec/models/bulk_delete_session_response_spec.rb +30 -0
  78. data/spec/models/content_type_enum_spec.rb +24 -0
  79. data/spec/models/current_brand_flags_spec.rb +12 -0
  80. data/spec/models/device_access_group_request_spec.rb +6 -0
  81. data/spec/models/device_access_group_spec.rb +6 -0
  82. data/spec/models/device_fact_snapshot_spec.rb +6 -0
  83. data/spec/models/fleet_connector_request_spec.rb +72 -0
  84. data/spec/models/fleet_connector_spec.rb +90 -0
  85. data/spec/models/identification_challenge_spec.rb +12 -0
  86. data/spec/models/lifecycle_iteration_request_spec.rb +30 -0
  87. data/spec/models/lifecycle_iteration_spec.rb +108 -0
  88. data/spec/models/lifecycle_iteration_state_enum_spec.rb +24 -0
  89. data/spec/models/lifecycle_rule_request_spec.rb +84 -0
  90. data/spec/models/lifecycle_rule_spec.rb +108 -0
  91. data/spec/models/paginated_fleet_connector_list_spec.rb +42 -0
  92. data/spec/models/paginated_lifecycle_iteration_list_spec.rb +42 -0
  93. data/spec/models/paginated_lifecycle_rule_list_spec.rb +42 -0
  94. data/spec/models/paginated_ws_federation_provider_list_spec.rb +42 -0
  95. data/spec/models/patched_device_access_group_request_spec.rb +6 -0
  96. data/spec/models/patched_fleet_connector_request_spec.rb +72 -0
  97. data/spec/models/patched_lifecycle_rule_request_spec.rb +84 -0
  98. data/spec/models/patched_scim_provider_request_spec.rb +3 -3
  99. data/spec/models/patched_settings_request_flags_spec.rb +12 -0
  100. data/spec/models/patched_ws_federation_provider_request_spec.rb +138 -0
  101. data/spec/models/review_request_spec.rb +36 -0
  102. data/spec/models/review_spec.rb +54 -0
  103. data/spec/models/reviewer_group_spec.rb +36 -0
  104. data/spec/models/reviewer_user_spec.rb +48 -0
  105. data/spec/models/saml_logout_methods_spec.rb +24 -0
  106. data/spec/models/scim_provider_request_spec.rb +3 -3
  107. data/spec/models/scim_provider_spec.rb +3 -3
  108. data/spec/models/task_state_enum_spec.rb +24 -0
  109. data/spec/models/user_recovery_email_request_spec.rb +36 -0
  110. data/spec/models/user_recovery_link_request_spec.rb +30 -0
  111. data/spec/models/{state_enum_spec.rb → vendor_enum_spec.rb} +6 -6
  112. data/spec/models/ws_federation_provider_request_spec.rb +138 -0
  113. data/spec/models/ws_federation_provider_spec.rb +204 -0
  114. metadata +85 -7
  115. data/spec/models/saml_provider_logout_method_enum_spec.rb +0 -24
@@ -0,0 +1,294 @@
1
+ =begin
2
+ This file is automatically generated by: https://openapi-generator.tech.
3
+ Any manual changes will be lost when the OpenAPI scheme changes.
4
+
5
+ =end
6
+
7
+ require 'date'
8
+ require 'time'
9
+
10
+ module Authentik::Api
11
+ # FleetConnector Serializer
12
+ class FleetConnectorRequest < ApiModelBase
13
+ attr_accessor :connector_uuid
14
+
15
+ attr_accessor :name
16
+
17
+ attr_accessor :enabled
18
+
19
+ attr_accessor :url
20
+
21
+ attr_accessor :token
22
+
23
+ # Configure additional headers to be sent. Mapping should return a dictionary of key-value pairs
24
+ attr_accessor :headers_mapping
25
+
26
+ attr_accessor :map_users
27
+
28
+ attr_accessor :map_teams_access_group
29
+
30
+ # Attribute mapping from ruby-style variable name to JSON key.
31
+ def self.attribute_map
32
+ {
33
+ :'connector_uuid' => :'connector_uuid',
34
+ :'name' => :'name',
35
+ :'enabled' => :'enabled',
36
+ :'url' => :'url',
37
+ :'token' => :'token',
38
+ :'headers_mapping' => :'headers_mapping',
39
+ :'map_users' => :'map_users',
40
+ :'map_teams_access_group' => :'map_teams_access_group'
41
+ }
42
+ end
43
+
44
+ # Returns attribute mapping this model knows about
45
+ def self.acceptable_attribute_map
46
+ attribute_map
47
+ end
48
+
49
+ # Returns all the JSON keys this model knows about
50
+ def self.acceptable_attributes
51
+ acceptable_attribute_map.values
52
+ end
53
+
54
+ # Attribute type mapping.
55
+ def self.openapi_types
56
+ {
57
+ :'connector_uuid' => :'String',
58
+ :'name' => :'String',
59
+ :'enabled' => :'Boolean',
60
+ :'url' => :'String',
61
+ :'token' => :'String',
62
+ :'headers_mapping' => :'String',
63
+ :'map_users' => :'Boolean',
64
+ :'map_teams_access_group' => :'Boolean'
65
+ }
66
+ end
67
+
68
+ # List of attributes with nullable: true
69
+ def self.openapi_nullable
70
+ Set.new([
71
+ :'headers_mapping',
72
+ ])
73
+ end
74
+
75
+ # Initializes the object
76
+ # @param [Hash] attributes Model attributes in the form of hash
77
+ def initialize(attributes = {})
78
+ if (!attributes.is_a?(Hash))
79
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Authentik::Api::FleetConnectorRequest` initialize method"
80
+ end
81
+
82
+ # check to see if the attribute exists and convert string to symbol for hash key
83
+ acceptable_attribute_map = self.class.acceptable_attribute_map
84
+ attributes = attributes.each_with_object({}) { |(k, v), h|
85
+ if (!acceptable_attribute_map.key?(k.to_sym))
86
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Authentik::Api::FleetConnectorRequest`. Please check the name to make sure it's valid. List of attributes: " + acceptable_attribute_map.keys.inspect
87
+ end
88
+ h[k.to_sym] = v
89
+ }
90
+
91
+ if attributes.key?(:'connector_uuid')
92
+ self.connector_uuid = attributes[:'connector_uuid']
93
+ end
94
+
95
+ if attributes.key?(:'name')
96
+ self.name = attributes[:'name']
97
+ else
98
+ self.name = nil
99
+ end
100
+
101
+ if attributes.key?(:'enabled')
102
+ self.enabled = attributes[:'enabled']
103
+ end
104
+
105
+ if attributes.key?(:'url')
106
+ self.url = attributes[:'url']
107
+ else
108
+ self.url = nil
109
+ end
110
+
111
+ if attributes.key?(:'token')
112
+ self.token = attributes[:'token']
113
+ else
114
+ self.token = nil
115
+ end
116
+
117
+ if attributes.key?(:'headers_mapping')
118
+ self.headers_mapping = attributes[:'headers_mapping']
119
+ end
120
+
121
+ if attributes.key?(:'map_users')
122
+ self.map_users = attributes[:'map_users']
123
+ end
124
+
125
+ if attributes.key?(:'map_teams_access_group')
126
+ self.map_teams_access_group = attributes[:'map_teams_access_group']
127
+ end
128
+ end
129
+
130
+ # Show invalid properties with the reasons. Usually used together with valid?
131
+ # @return Array for valid properties with the reasons
132
+ def list_invalid_properties
133
+ warn '[DEPRECATED] the `list_invalid_properties` method is obsolete'
134
+ invalid_properties = Array.new
135
+ if @name.nil?
136
+ invalid_properties.push('invalid value for "name", name cannot be nil.')
137
+ end
138
+
139
+ if @name.to_s.length < 1
140
+ invalid_properties.push('invalid value for "name", the character length must be greater than or equal to 1.')
141
+ end
142
+
143
+ if @url.nil?
144
+ invalid_properties.push('invalid value for "url", url cannot be nil.')
145
+ end
146
+
147
+ if @url.to_s.length > 200
148
+ invalid_properties.push('invalid value for "url", the character length must be smaller than or equal to 200.')
149
+ end
150
+
151
+ if @url.to_s.length < 1
152
+ invalid_properties.push('invalid value for "url", the character length must be greater than or equal to 1.')
153
+ end
154
+
155
+ if @token.nil?
156
+ invalid_properties.push('invalid value for "token", token cannot be nil.')
157
+ end
158
+
159
+ if @token.to_s.length < 1
160
+ invalid_properties.push('invalid value for "token", the character length must be greater than or equal to 1.')
161
+ end
162
+
163
+ invalid_properties
164
+ end
165
+
166
+ # Check to see if the all the properties in the model are valid
167
+ # @return true if the model is valid
168
+ def valid?
169
+ warn '[DEPRECATED] the `valid?` method is obsolete'
170
+ return false if @name.nil?
171
+ return false if @name.to_s.length < 1
172
+ return false if @url.nil?
173
+ return false if @url.to_s.length > 200
174
+ return false if @url.to_s.length < 1
175
+ return false if @token.nil?
176
+ return false if @token.to_s.length < 1
177
+ true
178
+ end
179
+
180
+ # Custom attribute writer method with validation
181
+ # @param [Object] name Value to be assigned
182
+ def name=(name)
183
+ if name.nil?
184
+ fail ArgumentError, 'name cannot be nil'
185
+ end
186
+
187
+ if name.to_s.length < 1
188
+ fail ArgumentError, 'invalid value for "name", the character length must be greater than or equal to 1.'
189
+ end
190
+
191
+ @name = name
192
+ end
193
+
194
+ # Custom attribute writer method with validation
195
+ # @param [Object] url Value to be assigned
196
+ def url=(url)
197
+ if url.nil?
198
+ fail ArgumentError, 'url cannot be nil'
199
+ end
200
+
201
+ if url.to_s.length > 200
202
+ fail ArgumentError, 'invalid value for "url", the character length must be smaller than or equal to 200.'
203
+ end
204
+
205
+ if url.to_s.length < 1
206
+ fail ArgumentError, 'invalid value for "url", the character length must be greater than or equal to 1.'
207
+ end
208
+
209
+ @url = url
210
+ end
211
+
212
+ # Custom attribute writer method with validation
213
+ # @param [Object] token Value to be assigned
214
+ def token=(token)
215
+ if token.nil?
216
+ fail ArgumentError, 'token cannot be nil'
217
+ end
218
+
219
+ if token.to_s.length < 1
220
+ fail ArgumentError, 'invalid value for "token", the character length must be greater than or equal to 1.'
221
+ end
222
+
223
+ @token = token
224
+ end
225
+
226
+ # Checks equality by comparing each attribute.
227
+ # @param [Object] Object to be compared
228
+ def ==(o)
229
+ return true if self.equal?(o)
230
+ self.class == o.class &&
231
+ connector_uuid == o.connector_uuid &&
232
+ name == o.name &&
233
+ enabled == o.enabled &&
234
+ url == o.url &&
235
+ token == o.token &&
236
+ headers_mapping == o.headers_mapping &&
237
+ map_users == o.map_users &&
238
+ map_teams_access_group == o.map_teams_access_group
239
+ end
240
+
241
+ # @see the `==` method
242
+ # @param [Object] Object to be compared
243
+ def eql?(o)
244
+ self == o
245
+ end
246
+
247
+ # Calculates hash code according to all attributes.
248
+ # @return [Integer] Hash code
249
+ def hash
250
+ [connector_uuid, name, enabled, url, token, headers_mapping, map_users, map_teams_access_group].hash
251
+ end
252
+
253
+ # Builds the object from hash
254
+ # @param [Hash] attributes Model attributes in the form of hash
255
+ # @return [Object] Returns the model itself
256
+ def self.build_from_hash(attributes)
257
+ return nil unless attributes.is_a?(Hash)
258
+ attributes = attributes.transform_keys(&:to_sym)
259
+ transformed_hash = {}
260
+ openapi_types.each_pair do |key, type|
261
+ if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil?
262
+ transformed_hash["#{key}"] = nil
263
+ elsif type =~ /\AArray<(.*)>/i
264
+ # check to ensure the input is an array given that the attribute
265
+ # is documented as an array but the input is not
266
+ if attributes[attribute_map[key]].is_a?(Array)
267
+ transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) }
268
+ end
269
+ elsif !attributes[attribute_map[key]].nil?
270
+ transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]])
271
+ end
272
+ end
273
+ new(transformed_hash)
274
+ end
275
+
276
+ # Returns the object in the form of hash
277
+ # @return [Hash] Returns the object in the form of hash
278
+ def to_hash
279
+ hash = {}
280
+ self.class.attribute_map.each_pair do |attr, param|
281
+ value = self.send(attr)
282
+ if value.nil?
283
+ is_nullable = self.class.openapi_nullable.include?(attr)
284
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
285
+ end
286
+
287
+ hash[param] = _to_hash(value)
288
+ end
289
+ hash
290
+ end
291
+
292
+ end
293
+
294
+ end
@@ -14,9 +14,11 @@ module Authentik::Api
14
14
  CONTENT_RIGHT = "content_right".freeze
15
15
  SIDEBAR_LEFT = "sidebar_left".freeze
16
16
  SIDEBAR_RIGHT = "sidebar_right".freeze
17
+ SIDEBAR_LEFT_FRAME_BACKGROUND = "sidebar_left_frame_background".freeze
18
+ SIDEBAR_RIGHT_FRAME_BACKGROUND = "sidebar_right_frame_background".freeze
17
19
 
18
20
  def self.all_vars
19
- @all_vars ||= [STACKED, CONTENT_LEFT, CONTENT_RIGHT, SIDEBAR_LEFT, SIDEBAR_RIGHT].freeze
21
+ @all_vars ||= [STACKED, CONTENT_LEFT, CONTENT_RIGHT, SIDEBAR_LEFT, SIDEBAR_RIGHT, SIDEBAR_LEFT_FRAME_BACKGROUND, SIDEBAR_RIGHT_FRAME_BACKGROUND].freeze
20
22
  end
21
23
 
22
24
  # Builds the enum from string
@@ -18,12 +18,16 @@ module Authentik::Api
18
18
 
19
19
  attr_accessor :user_fields
20
20
 
21
+ attr_accessor :pending_user_identifier
22
+
21
23
  attr_accessor :password_fields
22
24
 
23
25
  attr_accessor :allow_show_password
24
26
 
25
27
  attr_accessor :application_pre
26
28
 
29
+ attr_accessor :application_pre_launch
30
+
27
31
  attr_accessor :flow_designation
28
32
 
29
33
  attr_accessor :captcha_stage
@@ -73,9 +77,11 @@ module Authentik::Api
73
77
  :'component' => :'component',
74
78
  :'response_errors' => :'response_errors',
75
79
  :'user_fields' => :'user_fields',
80
+ :'pending_user_identifier' => :'pending_user_identifier',
76
81
  :'password_fields' => :'password_fields',
77
82
  :'allow_show_password' => :'allow_show_password',
78
83
  :'application_pre' => :'application_pre',
84
+ :'application_pre_launch' => :'application_pre_launch',
79
85
  :'flow_designation' => :'flow_designation',
80
86
  :'captcha_stage' => :'captcha_stage',
81
87
  :'enroll_url' => :'enroll_url',
@@ -106,9 +112,11 @@ module Authentik::Api
106
112
  :'component' => :'String',
107
113
  :'response_errors' => :'Hash<String, Array<ErrorDetail>>',
108
114
  :'user_fields' => :'Array<String>',
115
+ :'pending_user_identifier' => :'String',
109
116
  :'password_fields' => :'Boolean',
110
117
  :'allow_show_password' => :'Boolean',
111
118
  :'application_pre' => :'String',
119
+ :'application_pre_launch' => :'String',
112
120
  :'flow_designation' => :'FlowDesignationEnum',
113
121
  :'captcha_stage' => :'CaptchaChallenge',
114
122
  :'enroll_url' => :'String',
@@ -126,6 +134,7 @@ module Authentik::Api
126
134
  def self.openapi_nullable
127
135
  Set.new([
128
136
  :'user_fields',
137
+ :'pending_user_identifier',
129
138
  :'captcha_stage',
130
139
  :'passkey_challenge'
131
140
  ])
@@ -171,6 +180,10 @@ module Authentik::Api
171
180
  self.user_fields = nil
172
181
  end
173
182
 
183
+ if attributes.key?(:'pending_user_identifier')
184
+ self.pending_user_identifier = attributes[:'pending_user_identifier']
185
+ end
186
+
174
187
  if attributes.key?(:'password_fields')
175
188
  self.password_fields = attributes[:'password_fields']
176
189
  else
@@ -187,6 +200,10 @@ module Authentik::Api
187
200
  self.application_pre = attributes[:'application_pre']
188
201
  end
189
202
 
203
+ if attributes.key?(:'application_pre_launch')
204
+ self.application_pre_launch = attributes[:'application_pre_launch']
205
+ end
206
+
190
207
  if attributes.key?(:'flow_designation')
191
208
  self.flow_designation = attributes[:'flow_designation']
192
209
  else
@@ -324,9 +341,11 @@ module Authentik::Api
324
341
  component == o.component &&
325
342
  response_errors == o.response_errors &&
326
343
  user_fields == o.user_fields &&
344
+ pending_user_identifier == o.pending_user_identifier &&
327
345
  password_fields == o.password_fields &&
328
346
  allow_show_password == o.allow_show_password &&
329
347
  application_pre == o.application_pre &&
348
+ application_pre_launch == o.application_pre_launch &&
330
349
  flow_designation == o.flow_designation &&
331
350
  captcha_stage == o.captcha_stage &&
332
351
  enroll_url == o.enroll_url &&
@@ -348,7 +367,7 @@ module Authentik::Api
348
367
  # Calculates hash code according to all attributes.
349
368
  # @return [Integer] Hash code
350
369
  def hash
351
- [flow_info, component, response_errors, user_fields, password_fields, allow_show_password, application_pre, flow_designation, captcha_stage, enroll_url, recovery_url, passwordless_url, primary_action, sources, show_source_labels, enable_remember_me, passkey_challenge].hash
370
+ [flow_info, component, response_errors, user_fields, pending_user_identifier, password_fields, allow_show_password, application_pre, application_pre_launch, flow_designation, captcha_stage, enroll_url, recovery_url, passwordless_url, primary_action, sources, show_source_labels, enable_remember_me, passkey_challenge].hash
352
371
  end
353
372
 
354
373
  # Builds the object from hash