freeclimb 4.0.0 → 4.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce9ee766863f3719656d6d09ccba0a61e19b729105d856370d0cd940c3ffef3a
4
- data.tar.gz: f8b434df5680d102601079c1a7e7adc44a1b48fe3fabeb4a104042403666cbeb
3
+ metadata.gz: 1935ef64917bf8f57f192700f55a1be2d9d72919e52a9575fb6a6927374a70b4
4
+ data.tar.gz: 0b5f639007c5014f4d8142d95cc09de4ba679b34d7d528a0ebf12b22f0260c79
5
5
  SHA512:
6
- metadata.gz: cc4cfa23f11cc76dee7555e83368f85f2c5fc1dc994079cd097d01507ee9224aaef370c9cacd62adcec8d8a69ebf2c9813aa41a0814a5f7b2646b839f547bc8e
7
- data.tar.gz: 560cda13db84b53413675f19a2f4b3f30b618bc832dad6f97bf93f3b9789da4b5a76f48d8d98113f5ca38e066414884ef1c4e6c06e6d4bd34a58e20af0e21ce5
6
+ metadata.gz: 6c3304b07b5ef6d666006a23d5555a6eeccfa4a84d30f7195d423f669c01fedd4806d51598cec39cf3e2c2f5aed1f806efa0fb67c7563cd2297fe6717034f97c
7
+ data.tar.gz: a910d4da9ae6f235c98cccd228a7ffb356013ad9d317faa9852d617141e88318b4d0ebe54531cea892f53aabe4cf48e1cebc33a7e52e25cc9c57ae606115f7b4
data/CHANGELOG.md CHANGED
@@ -6,6 +6,18 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
6
6
 
7
7
  ## [Unreleased]
8
8
  None
9
+ <a name="4.0.2"></a>
10
+ ## [4.0.2] - 2022-10-07
11
+ ### Added
12
+ - Add `playBeep` enum to `update_conference_request`
13
+
14
+ <a name="4.0.1"></a>
15
+ ## [4.0.1] - 2022-07-20
16
+ ### Added
17
+ - Add `Park` PerCL command
18
+ - Add `Unpark` PerCL command
19
+ ### Changed
20
+ - Default loop value for Say command is set to `1`
9
21
 
10
22
  <a name="4.0.0"></a>
11
23
  ## [4.0.0] - 2022-03-03
data/Gemfile CHANGED
@@ -8,5 +8,5 @@ group :development, :test do
8
8
  gem 'rubocop', '~> 0.66.0'
9
9
  gem "webmock", "~> 3.14"
10
10
  gem "factory_bot", "~> 6.2"
11
- gem 'rusty_camel', "~> 1.0.4"
11
+ gem "facets", "~> 3.1"
12
12
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- freeclimb (4.0.0)
4
+ freeclimb (4.0.2)
5
5
  typhoeus (~> 1.0, >= 1.0.1)
6
6
 
7
7
  GEM
@@ -23,13 +23,11 @@ GEM
23
23
  diff-lcs (1.3)
24
24
  ethon (0.15.0)
25
25
  ffi (>= 1.15.0)
26
+ facets (3.1.0)
26
27
  factory_bot (6.2.0)
27
28
  activesupport (>= 5.0.0)
28
29
  ffi (1.15.5)
29
30
  hashdiff (1.0.1)
30
- helix_runtime (0.5.0)
31
- rake (>= 10.0)
32
- thor (~> 0.19.4)
33
31
  i18n (1.9.1)
34
32
  concurrent-ruby (~> 1.0)
35
33
  jaro_winkler (1.5.4)
@@ -71,9 +69,6 @@ GEM
71
69
  ruby-progressbar (~> 1.7)
72
70
  unicode-display_width (>= 1.4.0, < 1.6)
73
71
  ruby-progressbar (1.10.1)
74
- rusty_camel (1.0.4)
75
- helix_runtime (~> 0.5.0)
76
- thor (0.19.4)
77
72
  typhoeus (1.4.0)
78
73
  ethon (>= 0.9.0)
79
74
  tzinfo (2.0.4)
@@ -88,13 +83,13 @@ PLATFORMS
88
83
  ruby
89
84
 
90
85
  DEPENDENCIES
86
+ facets (~> 3.1)
91
87
  factory_bot (~> 6.2)
92
88
  freeclimb!
93
89
  pry-byebug
94
90
  rake (~> 13.0.6)
95
91
  rspec (~> 3.6, >= 3.6.0)
96
92
  rubocop (~> 0.66.0)
97
- rusty_camel (~> 1.0.4)
98
93
  webmock (~> 3.14)
99
94
 
100
95
  BUNDLED WITH
data/README.md CHANGED
@@ -7,7 +7,7 @@ FreeClimb is a cloud-based application programming interface (API) that puts the
7
7
  This SDK is automatically generated by the [OpenAPI Generator](https://openapi-generator.tech) project:
8
8
 
9
9
  - API version: 1.0.0
10
- - Package version: 4.0.0
10
+ - Package version: 4.0.2
11
11
  - Build package: org.openapitools.codegen.languages.RubyClientCodegen
12
12
  For more information, please visit [https://www.freeclimb.com/support/](https://www.freeclimb.com/support/)
13
13
 
@@ -15,7 +15,7 @@ For more information, please visit [https://www.freeclimb.com/support/](https://
15
15
 
16
16
  Add this to the Gemfile:
17
17
 
18
- gem 'freeclimb', '~> 4.0.0'
18
+ gem 'freeclimb', '~> 4.0.2'
19
19
 
20
20
  and run from your terminal
21
21
 
@@ -44,9 +44,9 @@ gem build freeclimb.gemspec
44
44
  Then either install the gem locally:
45
45
 
46
46
  ```shell
47
- gem install ./freeclimb-4.0.0.gem
47
+ gem install ./freeclimb-4.0.2.gem
48
48
  ```
49
- (for development, run `gem install --dev ./freeclimb-4.0.0.gem` to install the development dependencies)
49
+ (for development, run `gem install --dev ./freeclimb-4.0.2.gem` to install the development dependencies)
50
50
 
51
51
  ## Getting Started
52
52
 
@@ -208,6 +208,8 @@ Class | Method | HTTP request | Description
208
208
  - [Freeclimb::OutDial](docs/OutDial.md)
209
209
  - [Freeclimb::OutDialAllOf](docs/OutDialAllOf.md)
210
210
  - [Freeclimb::PaginationModel](docs/PaginationModel.md)
211
+ - [Freeclimb::Park](docs/Park.md)
212
+ - [Freeclimb::ParkAllOf](docs/ParkAllOf.md)
211
213
  - [Freeclimb::Pause](docs/Pause.md)
212
214
  - [Freeclimb::PauseAllOf](docs/PauseAllOf.md)
213
215
  - [Freeclimb::PerclCommand](docs/PerclCommand.md)
@@ -249,6 +251,7 @@ Class | Method | HTTP request | Description
249
251
  - [Freeclimb::StartRecordCall](docs/StartRecordCall.md)
250
252
  - [Freeclimb::TerminateConference](docs/TerminateConference.md)
251
253
  - [Freeclimb::TerminateConferenceAllOf](docs/TerminateConferenceAllOf.md)
254
+ - [Freeclimb::Unpark](docs/Unpark.md)
252
255
  - [Freeclimb::UpdateCallRequest](docs/UpdateCallRequest.md)
253
256
  - [Freeclimb::UpdateConferenceParticipantRequest](docs/UpdateConferenceParticipantRequest.md)
254
257
  - [Freeclimb::UpdateConferenceRequest](docs/UpdateConferenceRequest.md)
@@ -5,6 +5,7 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **capabilities** | [**Capabilities**](Capabilities.md) | | [optional] |
8
+ | **campaign_id** | **String** | The campaign ID generated by the campaign registry | [optional] |
8
9
  | **phone_number** | **String** | The phone number, in E.164 format (+ country code and phone number: +18003608245). | [optional] |
9
10
  | **voice_enabled** | **Boolean** | Typically set to true for all numbers. | [optional] |
10
11
  | **sms_enabled** | **Boolean** | Indicates whether the phone number can send and receive SMS messages. | [optional] |
@@ -18,6 +19,7 @@ require 'freeclimb'
18
19
 
19
20
  instance = Freeclimb::AvailableNumber.new(
20
21
  capabilities: null,
22
+ campaign_id: null,
21
23
  phone_number: null,
22
24
  voice_enabled: null,
23
25
  sms_enabled: null,
@@ -9,6 +9,7 @@
9
9
  | **date_updated** | **String** | The date that this resource was last updated (GMT) in RFC 1123 format (e.g., Mon, 15 Jun 2009 20:45:30 GMT). | [optional] |
10
10
  | **revision** | **Integer** | Revision count for the resource. This count is set to 1 on creation and is incremented every time it is updated. | [optional] |
11
11
  | **capabilities** | [**Capabilities**](Capabilities.md) | | [optional] |
12
+ | **campaign_id** | **String** | The campaign ID generated by the campaign registry | [optional] |
12
13
  | **phone_number_id** | **String** | String that uniquely identifies this phone number resource. | [optional] |
13
14
  | **account_id** | **String** | ID of the account that owns this phone number. | [optional] |
14
15
  | **application_id** | **String** | ID of the Application that FreeClimb should contact if a Call or SMS arrives for this phone number or a Call from this number is placed. An incoming phone number is not useful until associated with an applicationId. | [optional] |
@@ -30,6 +31,7 @@ instance = Freeclimb::IncomingNumberResult.new(
30
31
  date_updated: null,
31
32
  revision: null,
32
33
  capabilities: null,
34
+ campaign_id: null,
33
35
  phone_number_id: null,
34
36
  account_id: null,
35
37
  application_id: null,
@@ -5,6 +5,7 @@
5
5
  | Name | Type | Description | Notes |
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **capabilities** | [**Capabilities**](Capabilities.md) | | [optional] |
8
+ | **campaign_id** | **String** | The campaign ID generated by the campaign registry | [optional] |
8
9
  | **phone_number_id** | **String** | String that uniquely identifies this phone number resource. | [optional] |
9
10
  | **account_id** | **String** | ID of the account that owns this phone number. | [optional] |
10
11
  | **application_id** | **String** | ID of the Application that FreeClimb should contact if a Call or SMS arrives for this phone number or a Call from this number is placed. An incoming phone number is not useful until associated with an applicationId. | [optional] |
@@ -22,6 +23,7 @@ require 'freeclimb'
22
23
 
23
24
  instance = Freeclimb::IncomingNumberResultAllOf.new(
24
25
  capabilities: null,
26
+ campaign_id: null,
25
27
  phone_number_id: null,
26
28
  account_id: null,
27
29
  application_id: null,
data/docs/Park.md ADDED
@@ -0,0 +1,22 @@
1
+ # Freeclimb::Park
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **wait_url** | **String** | Specifies a URL pointing to a PerCL script containing actions to be executed while the caller is Parked. Once the script returned by the waitUrl runs out of commands to execute, FreeClimb will re-request the waitUrl and start over, essentially looping the script requests indefinitely. | |
8
+ | **action_url** | **String** | A request is made to this URL when the Call is resumed, which can occur if the Call is resumed via the Unpark command, the REST API (POST to Call resource), or the caller hangs up. The PerCL script returned in response to the actionUrl will be executed on the resumed call. | |
9
+ | **notification_url** | **String** | URL to be invoked when the Call is parked. The request to the URL contains the standard request parameters. | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'freeclimb'
15
+
16
+ instance = Freeclimb::Park.new(
17
+ wait_url: null,
18
+ action_url: null,
19
+ notification_url: null
20
+ )
21
+ ```
22
+
data/docs/ParkAllOf.md ADDED
@@ -0,0 +1,22 @@
1
+ # Freeclimb::ParkAllOf
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+ | **wait_url** | **String** | Specifies a URL pointing to a PerCL script containing actions to be executed while the caller is Parked. Once the script returned by the waitUrl runs out of commands to execute, FreeClimb will re-request the waitUrl and start over, essentially looping the script requests indefinitely. | |
8
+ | **action_url** | **String** | A request is made to this URL when the Call is resumed, which can occur if the Call is resumed via the Unpark command, the REST API (POST to Call resource), or the caller hangs up. The PerCL script returned in response to the actionUrl will be executed on the resumed call. | |
9
+ | **notification_url** | **String** | URL to be invoked when the Call is parked. The request to the URL contains the standard request parameters. | [optional] |
10
+
11
+ ## Example
12
+
13
+ ```ruby
14
+ require 'freeclimb'
15
+
16
+ instance = Freeclimb::ParkAllOf.new(
17
+ wait_url: null,
18
+ action_url: null,
19
+ notification_url: null
20
+ )
21
+ ```
22
+
data/docs/Say.md CHANGED
@@ -6,7 +6,7 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **text** | **String** | The message to be played to the caller using TTS. The size of the string is limited to 4 KB (or 4,096 bytes). An empty string will cause the command to be skipped. | |
8
8
  | **language** | **String** | Language and (by implication) the locale to use. This implies the accent and pronunciations to be usde for the TTS. The complete list of valid values for the language attribute is shown below. | [optional] |
9
- | **loop** | **Integer** | Number of times the text is said. Specifying &#39;0&#39; causes the &#x60;Say&#x60; action to loop until the Call is hung up. | [optional] |
9
+ | **loop** | **Integer** | Number of times the text is said. Specifying &#39;0&#39; causes the &#x60;Say&#x60; action to loop until the Call is hung up. | [optional][default to 1] |
10
10
  | **conference_id** | **String** | D of the Conference the speech should be rendered to. If this is not specified, the speech is by default rendered to the Caller associated with the call leg that corresponds to the current PerCL execution context. The call leg associated with this command must be in the specified Conference or the command will return an error. | [optional] |
11
11
  | **privacy_mode** | **Boolean** | Parameter &#x60;privacyMode&#x60; will not log the &#x60;text&#x60; as required by PCI compliance. | [optional] |
12
12
 
data/docs/SayAllOf.md CHANGED
@@ -6,7 +6,7 @@
6
6
  | ---- | ---- | ----------- | ----- |
7
7
  | **text** | **String** | The message to be played to the caller using TTS. The size of the string is limited to 4 KB (or 4,096 bytes). An empty string will cause the command to be skipped. | |
8
8
  | **language** | **String** | Language and (by implication) the locale to use. This implies the accent and pronunciations to be usde for the TTS. The complete list of valid values for the language attribute is shown below. | [optional] |
9
- | **loop** | **Integer** | Number of times the text is said. Specifying &#39;0&#39; causes the &#x60;Say&#x60; action to loop until the Call is hung up. | [optional] |
9
+ | **loop** | **Integer** | Number of times the text is said. Specifying &#39;0&#39; causes the &#x60;Say&#x60; action to loop until the Call is hung up. | [optional][default to 1] |
10
10
  | **conference_id** | **String** | D of the Conference the speech should be rendered to. If this is not specified, the speech is by default rendered to the Caller associated with the call leg that corresponds to the current PerCL execution context. The call leg associated with this command must be in the specified Conference or the command will return an error. | [optional] |
11
11
  | **privacy_mode** | **Boolean** | Parameter &#x60;privacyMode&#x60; will not log the &#x60;text&#x60; as required by PCI compliance. | [optional] |
12
12
 
data/docs/Unpark.md ADDED
@@ -0,0 +1,15 @@
1
+ # Freeclimb::Unpark
2
+
3
+ ## Properties
4
+
5
+ | Name | Type | Description | Notes |
6
+ | ---- | ---- | ----------- | ----- |
7
+
8
+ ## Example
9
+
10
+ ```ruby
11
+ require 'freeclimb'
12
+
13
+ instance = Freeclimb::Unpark.new()
14
+ ```
15
+
@@ -17,6 +17,9 @@ module Freeclimb
17
17
  class AvailableNumber
18
18
  attr_accessor :capabilities
19
19
 
20
+ # The campaign ID generated by the campaign registry
21
+ attr_accessor :campaign_id
22
+
20
23
  # The phone number, in E.164 format (+ country code and phone number: +18003608245).
21
24
  attr_accessor :phone_number
22
25
 
@@ -36,6 +39,7 @@ module Freeclimb
36
39
  def self.attribute_map
37
40
  {
38
41
  :'capabilities' => :'capabilities',
42
+ :'campaign_id' => :'campaignId',
39
43
  :'phone_number' => :'phoneNumber',
40
44
  :'voice_enabled' => :'voiceEnabled',
41
45
  :'sms_enabled' => :'smsEnabled',
@@ -53,6 +57,7 @@ module Freeclimb
53
57
  def self.openapi_types
54
58
  {
55
59
  :'capabilities' => :'Capabilities',
60
+ :'campaign_id' => :'String',
56
61
  :'phone_number' => :'String',
57
62
  :'voice_enabled' => :'Boolean',
58
63
  :'sms_enabled' => :'Boolean',
@@ -64,6 +69,7 @@ module Freeclimb
64
69
  # List of attributes with nullable: true
65
70
  def self.openapi_nullable
66
71
  Set.new([
72
+ :'campaign_id',
67
73
  :'phone_number',
68
74
  :'voice_enabled',
69
75
  :'sms_enabled',
@@ -91,6 +97,10 @@ module Freeclimb
91
97
  self.capabilities = attributes[:'capabilities']
92
98
  end
93
99
 
100
+ if attributes.key?(:'campaign_id')
101
+ self.campaign_id = attributes[:'campaign_id']
102
+ end
103
+
94
104
  if attributes.key?(:'phone_number')
95
105
  self.phone_number = attributes[:'phone_number']
96
106
  end
@@ -131,6 +141,7 @@ module Freeclimb
131
141
  return true if self.equal?(o)
132
142
  self.class == o.class &&
133
143
  capabilities == o.capabilities &&
144
+ campaign_id == o.campaign_id &&
134
145
  phone_number == o.phone_number &&
135
146
  voice_enabled == o.voice_enabled &&
136
147
  sms_enabled == o.sms_enabled &&
@@ -147,7 +158,7 @@ module Freeclimb
147
158
  # Calculates hash code according to all attributes.
148
159
  # @return [Integer] Hash code
149
160
  def hash
150
- [capabilities, phone_number, voice_enabled, sms_enabled, region, country].hash
161
+ [capabilities, campaign_id, phone_number, voice_enabled, sms_enabled, region, country].hash
151
162
  end
152
163
 
153
164
  # Builds the object from hash
@@ -29,6 +29,9 @@ module Freeclimb
29
29
 
30
30
  attr_accessor :capabilities
31
31
 
32
+ # The campaign ID generated by the campaign registry
33
+ attr_accessor :campaign_id
34
+
32
35
  # String that uniquely identifies this phone number resource.
33
36
  attr_accessor :phone_number_id
34
37
 
@@ -64,6 +67,7 @@ module Freeclimb
64
67
  :'date_updated' => :'dateUpdated',
65
68
  :'revision' => :'revision',
66
69
  :'capabilities' => :'capabilities',
70
+ :'campaign_id' => :'campaignId',
67
71
  :'phone_number_id' => :'phoneNumberId',
68
72
  :'account_id' => :'accountId',
69
73
  :'application_id' => :'applicationId',
@@ -89,6 +93,7 @@ module Freeclimb
89
93
  :'date_updated' => :'String',
90
94
  :'revision' => :'Integer',
91
95
  :'capabilities' => :'Capabilities',
96
+ :'campaign_id' => :'String',
92
97
  :'phone_number_id' => :'String',
93
98
  :'account_id' => :'String',
94
99
  :'application_id' => :'String',
@@ -104,6 +109,7 @@ module Freeclimb
104
109
  # List of attributes with nullable: true
105
110
  def self.openapi_nullable
106
111
  Set.new([
112
+ :'campaign_id',
107
113
  :'phone_number_id',
108
114
  :'account_id',
109
115
  :'application_id',
@@ -159,6 +165,10 @@ module Freeclimb
159
165
  self.capabilities = attributes[:'capabilities']
160
166
  end
161
167
 
168
+ if attributes.key?(:'campaign_id')
169
+ self.campaign_id = attributes[:'campaign_id']
170
+ end
171
+
162
172
  if attributes.key?(:'phone_number_id')
163
173
  self.phone_number_id = attributes[:'phone_number_id']
164
174
  end
@@ -219,6 +229,7 @@ module Freeclimb
219
229
  date_updated == o.date_updated &&
220
230
  revision == o.revision &&
221
231
  capabilities == o.capabilities &&
232
+ campaign_id == o.campaign_id &&
222
233
  phone_number_id == o.phone_number_id &&
223
234
  account_id == o.account_id &&
224
235
  application_id == o.application_id &&
@@ -239,7 +250,7 @@ module Freeclimb
239
250
  # Calculates hash code according to all attributes.
240
251
  # @return [Integer] Hash code
241
252
  def hash
242
- [uri, date_created, date_updated, revision, capabilities, phone_number_id, account_id, application_id, phone_number, _alias, region, country, voice_enabled, sms_enabled].hash
253
+ [uri, date_created, date_updated, revision, capabilities, campaign_id, phone_number_id, account_id, application_id, phone_number, _alias, region, country, voice_enabled, sms_enabled].hash
243
254
  end
244
255
 
245
256
  # Builds the object from hash
@@ -17,6 +17,9 @@ module Freeclimb
17
17
  class IncomingNumberResultAllOf
18
18
  attr_accessor :capabilities
19
19
 
20
+ # The campaign ID generated by the campaign registry
21
+ attr_accessor :campaign_id
22
+
20
23
  # String that uniquely identifies this phone number resource.
21
24
  attr_accessor :phone_number_id
22
25
 
@@ -48,6 +51,7 @@ module Freeclimb
48
51
  def self.attribute_map
49
52
  {
50
53
  :'capabilities' => :'capabilities',
54
+ :'campaign_id' => :'campaignId',
51
55
  :'phone_number_id' => :'phoneNumberId',
52
56
  :'account_id' => :'accountId',
53
57
  :'application_id' => :'applicationId',
@@ -69,6 +73,7 @@ module Freeclimb
69
73
  def self.openapi_types
70
74
  {
71
75
  :'capabilities' => :'Capabilities',
76
+ :'campaign_id' => :'String',
72
77
  :'phone_number_id' => :'String',
73
78
  :'account_id' => :'String',
74
79
  :'application_id' => :'String',
@@ -84,6 +89,7 @@ module Freeclimb
84
89
  # List of attributes with nullable: true
85
90
  def self.openapi_nullable
86
91
  Set.new([
92
+ :'campaign_id',
87
93
  :'phone_number_id',
88
94
  :'account_id',
89
95
  :'application_id',
@@ -115,6 +121,10 @@ module Freeclimb
115
121
  self.capabilities = attributes[:'capabilities']
116
122
  end
117
123
 
124
+ if attributes.key?(:'campaign_id')
125
+ self.campaign_id = attributes[:'campaign_id']
126
+ end
127
+
118
128
  if attributes.key?(:'phone_number_id')
119
129
  self.phone_number_id = attributes[:'phone_number_id']
120
130
  end
@@ -171,6 +181,7 @@ module Freeclimb
171
181
  return true if self.equal?(o)
172
182
  self.class == o.class &&
173
183
  capabilities == o.capabilities &&
184
+ campaign_id == o.campaign_id &&
174
185
  phone_number_id == o.phone_number_id &&
175
186
  account_id == o.account_id &&
176
187
  application_id == o.application_id &&
@@ -191,7 +202,7 @@ module Freeclimb
191
202
  # Calculates hash code according to all attributes.
192
203
  # @return [Integer] Hash code
193
204
  def hash
194
- [capabilities, phone_number_id, account_id, application_id, phone_number, _alias, region, country, voice_enabled, sms_enabled].hash
205
+ [capabilities, campaign_id, phone_number_id, account_id, application_id, phone_number, _alias, region, country, voice_enabled, sms_enabled].hash
195
206
  end
196
207
 
197
208
  # Builds the object from hash