phrase 2.3.1 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +14 -3
  3. data/docs/Distribution.md +2 -0
  4. data/docs/DistributionCreateParameters.md +2 -0
  5. data/docs/DistributionUpdateParameters.md +2 -0
  6. data/docs/ICUApi.md +70 -0
  7. data/docs/Icu.md +17 -0
  8. data/docs/IcuSkeletonParameters.md +23 -0
  9. data/docs/Invitation.md +2 -0
  10. data/docs/InvitationCreateParameters.md +2 -0
  11. data/docs/InvitationUpdateParameters.md +2 -0
  12. data/docs/JobLocaleCompleteReviewParameters.md +17 -0
  13. data/docs/JobLocaleUpdateParameters.md +3 -1
  14. data/docs/JobLocalesApi.md +68 -0
  15. data/docs/JobLocalesCreateParameters.md +4 -2
  16. data/docs/Member.md +6 -0
  17. data/docs/Project.md +2 -0
  18. data/docs/ProjectDetails.md +2 -0
  19. data/docs/ProjectLocales.md +2 -0
  20. data/docs/ProjectMemberSpecific.md +27 -0
  21. data/docs/ReleaseCreateParameters.md +2 -0
  22. data/docs/Team1.md +23 -0
  23. data/docs/UserPreview.md +3 -1
  24. data/lib/phrase/api/icu_api.rb +78 -0
  25. data/lib/phrase/api/job_locales_api.rb +86 -0
  26. data/lib/phrase/models/distribution.rb +12 -1
  27. data/lib/phrase/models/distribution_create_parameters.rb +13 -1
  28. data/lib/phrase/models/distribution_update_parameters.rb +13 -1
  29. data/lib/phrase/models/icu.rb +195 -0
  30. data/lib/phrase/models/icu_skeleton_parameters.rb +227 -0
  31. data/lib/phrase/models/invitation.rb +12 -1
  32. data/lib/phrase/models/invitation_create_parameters.rb +13 -1
  33. data/lib/phrase/models/invitation_update_parameters.rb +13 -1
  34. data/lib/phrase/models/job_locale_complete_review_parameters.rb +195 -0
  35. data/lib/phrase/models/job_locale_update_parameters.rb +16 -4
  36. data/lib/phrase/models/job_locales_create_parameters.rb +17 -5
  37. data/lib/phrase/models/member.rb +30 -1
  38. data/lib/phrase/models/project.rb +10 -1
  39. data/lib/phrase/models/project_details.rb +10 -1
  40. data/lib/phrase/models/project_locales.rb +11 -2
  41. data/lib/phrase/models/project_member_specific.rb +239 -0
  42. data/lib/phrase/models/release_create_parameters.rb +13 -1
  43. data/lib/phrase/models/team1.rb +221 -0
  44. data/lib/phrase/models/user_preview.rb +13 -4
  45. data/lib/phrase/response.rb +1 -1
  46. data/lib/phrase/version.rb +1 -1
  47. data/lib/phrase.rb +6 -0
  48. data/phrase.gemspec +2 -2
  49. data/spec/api/icu_api_spec.rb +36 -0
  50. data/spec/api/job_locales_api_spec.rb +16 -0
  51. data/spec/models/distribution_create_parameters_spec.rb +6 -0
  52. data/spec/models/distribution_spec.rb +6 -0
  53. data/spec/models/distribution_update_parameters_spec.rb +6 -0
  54. data/spec/models/icu_skeleton_parameters_spec.rb +47 -0
  55. data/spec/models/icu_spec.rb +29 -0
  56. data/spec/models/invitation_create_parameters_spec.rb +6 -0
  57. data/spec/models/invitation_spec.rb +6 -0
  58. data/spec/models/invitation_update_parameters_spec.rb +6 -0
  59. data/spec/models/job_locale_complete_review_parameters_spec.rb +29 -0
  60. data/spec/models/job_locale_update_parameters_spec.rb +6 -0
  61. data/spec/models/job_locales_create_parameters_spec.rb +6 -0
  62. data/spec/models/member_spec.rb +18 -0
  63. data/spec/models/project_details_spec.rb +6 -0
  64. data/spec/models/project_locales_spec.rb +6 -0
  65. data/spec/models/project_member_specific_spec.rb +59 -0
  66. data/spec/models/project_spec.rb +6 -0
  67. data/spec/models/release_create_parameters_spec.rb +6 -0
  68. data/spec/models/team1_spec.rb +47 -0
  69. data/spec/models/user_preview_spec.rb +6 -0
  70. metadata +221 -197
@@ -8,6 +8,10 @@ module Phrase
8
8
 
9
9
  attr_accessor :username
10
10
 
11
+ attr_accessor :created_at
12
+
13
+ attr_accessor :last_activity_at
14
+
11
15
  attr_accessor :role
12
16
 
13
17
  attr_accessor :projects
@@ -16,6 +20,8 @@ module Phrase
16
20
 
17
21
  attr_accessor :default_locale_codes
18
22
 
23
+ attr_accessor :teams
24
+
19
25
  attr_accessor :spaces
20
26
 
21
27
  # Attribute mapping from ruby-style variable name to JSON key.
@@ -24,10 +30,13 @@ module Phrase
24
30
  :'id' => :'id',
25
31
  :'email' => :'email',
26
32
  :'username' => :'username',
33
+ :'created_at' => :'created_at',
34
+ :'last_activity_at' => :'last_activity_at',
27
35
  :'role' => :'role',
28
36
  :'projects' => :'projects',
29
37
  :'permissions' => :'permissions',
30
38
  :'default_locale_codes' => :'default_locale_codes',
39
+ :'teams' => :'teams',
31
40
  :'spaces' => :'spaces'
32
41
  }
33
42
  end
@@ -38,10 +47,13 @@ module Phrase
38
47
  :'id' => :'String',
39
48
  :'email' => :'String',
40
49
  :'username' => :'String',
50
+ :'created_at' => :'DateTime',
51
+ :'last_activity_at' => :'DateTime',
41
52
  :'role' => :'String',
42
53
  :'projects' => :'Array<ProjectLocales>',
43
54
  :'permissions' => :'Object',
44
55
  :'default_locale_codes' => :'Array<String>',
56
+ :'teams' => :'Array<Team1>',
45
57
  :'spaces' => :'Array<MemberSpaces>'
46
58
  }
47
59
  end
@@ -79,6 +91,14 @@ module Phrase
79
91
  self.username = attributes[:'username']
80
92
  end
81
93
 
94
+ if attributes.key?(:'created_at')
95
+ self.created_at = attributes[:'created_at']
96
+ end
97
+
98
+ if attributes.key?(:'last_activity_at')
99
+ self.last_activity_at = attributes[:'last_activity_at']
100
+ end
101
+
82
102
  if attributes.key?(:'role')
83
103
  self.role = attributes[:'role']
84
104
  end
@@ -99,6 +119,12 @@ module Phrase
99
119
  end
100
120
  end
101
121
 
122
+ if attributes.key?(:'teams')
123
+ if (value = attributes[:'teams']).is_a?(Array)
124
+ self.teams = value
125
+ end
126
+ end
127
+
102
128
  if attributes.key?(:'spaces')
103
129
  if (value = attributes[:'spaces']).is_a?(Array)
104
130
  self.spaces = value
@@ -127,10 +153,13 @@ module Phrase
127
153
  id == o.id &&
128
154
  email == o.email &&
129
155
  username == o.username &&
156
+ created_at == o.created_at &&
157
+ last_activity_at == o.last_activity_at &&
130
158
  role == o.role &&
131
159
  projects == o.projects &&
132
160
  permissions == o.permissions &&
133
161
  default_locale_codes == o.default_locale_codes &&
162
+ teams == o.teams &&
134
163
  spaces == o.spaces
135
164
  end
136
165
 
@@ -143,7 +172,7 @@ module Phrase
143
172
  # Calculates hash code according to all attributes.
144
173
  # @return [Integer] Hash code
145
174
  def hash
146
- [id, email, username, role, projects, permissions, default_locale_codes, spaces].hash
175
+ [id, email, username, created_at, last_activity_at, role, projects, permissions, default_locale_codes, teams, spaces].hash
147
176
  end
148
177
 
149
178
  # Builds the object from hash
@@ -16,6 +16,8 @@ module Phrase
16
16
 
17
17
  attr_accessor :space
18
18
 
19
+ attr_accessor :point_of_contact
20
+
19
21
  attr_accessor :created_at
20
22
 
21
23
  attr_accessor :updated_at
@@ -30,6 +32,7 @@ module Phrase
30
32
  :'project_image_url' => :'project_image_url',
31
33
  :'account' => :'account',
32
34
  :'space' => :'space',
35
+ :'point_of_contact' => :'point_of_contact',
33
36
  :'created_at' => :'created_at',
34
37
  :'updated_at' => :'updated_at'
35
38
  }
@@ -45,6 +48,7 @@ module Phrase
45
48
  :'project_image_url' => :'String',
46
49
  :'account' => :'Account',
47
50
  :'space' => :'Space1',
51
+ :'point_of_contact' => :'UserPreview',
48
52
  :'created_at' => :'DateTime',
49
53
  :'updated_at' => :'DateTime'
50
54
  }
@@ -99,6 +103,10 @@ module Phrase
99
103
  self.space = attributes[:'space']
100
104
  end
101
105
 
106
+ if attributes.key?(:'point_of_contact')
107
+ self.point_of_contact = attributes[:'point_of_contact']
108
+ end
109
+
102
110
  if attributes.key?(:'created_at')
103
111
  self.created_at = attributes[:'created_at']
104
112
  end
@@ -133,6 +141,7 @@ module Phrase
133
141
  project_image_url == o.project_image_url &&
134
142
  account == o.account &&
135
143
  space == o.space &&
144
+ point_of_contact == o.point_of_contact &&
136
145
  created_at == o.created_at &&
137
146
  updated_at == o.updated_at
138
147
  end
@@ -146,7 +155,7 @@ module Phrase
146
155
  # Calculates hash code according to all attributes.
147
156
  # @return [Integer] Hash code
148
157
  def hash
149
- [id, name, slug, main_format, project_image_url, account, space, created_at, updated_at].hash
158
+ [id, name, slug, main_format, project_image_url, account, space, point_of_contact, created_at, updated_at].hash
150
159
  end
151
160
 
152
161
  # Builds the object from hash
@@ -16,6 +16,8 @@ module Phrase
16
16
 
17
17
  attr_accessor :space
18
18
 
19
+ attr_accessor :point_of_contact
20
+
19
21
  attr_accessor :created_at
20
22
 
21
23
  attr_accessor :updated_at
@@ -32,6 +34,7 @@ module Phrase
32
34
  :'project_image_url' => :'project_image_url',
33
35
  :'account' => :'account',
34
36
  :'space' => :'space',
37
+ :'point_of_contact' => :'point_of_contact',
35
38
  :'created_at' => :'created_at',
36
39
  :'updated_at' => :'updated_at',
37
40
  :'shares_translation_memory' => :'shares_translation_memory'
@@ -48,6 +51,7 @@ module Phrase
48
51
  :'project_image_url' => :'String',
49
52
  :'account' => :'Account',
50
53
  :'space' => :'Space1',
54
+ :'point_of_contact' => :'UserPreview',
51
55
  :'created_at' => :'DateTime',
52
56
  :'updated_at' => :'DateTime',
53
57
  :'shares_translation_memory' => :'Boolean'
@@ -111,6 +115,10 @@ module Phrase
111
115
  self.space = attributes[:'space']
112
116
  end
113
117
 
118
+ if attributes.key?(:'point_of_contact')
119
+ self.point_of_contact = attributes[:'point_of_contact']
120
+ end
121
+
114
122
  if attributes.key?(:'created_at')
115
123
  self.created_at = attributes[:'created_at']
116
124
  end
@@ -149,6 +157,7 @@ module Phrase
149
157
  project_image_url == o.project_image_url &&
150
158
  account == o.account &&
151
159
  space == o.space &&
160
+ point_of_contact == o.point_of_contact &&
152
161
  created_at == o.created_at &&
153
162
  updated_at == o.updated_at &&
154
163
  shares_translation_memory == o.shares_translation_memory
@@ -163,7 +172,7 @@ module Phrase
163
172
  # Calculates hash code according to all attributes.
164
173
  # @return [Integer] Hash code
165
174
  def hash
166
- [id, name, slug, main_format, project_image_url, account, space, created_at, updated_at, shares_translation_memory].hash
175
+ [id, name, slug, main_format, project_image_url, account, space, point_of_contact, created_at, updated_at, shares_translation_memory].hash
167
176
  end
168
177
 
169
178
  # Builds the object from hash
@@ -6,6 +6,8 @@ module Phrase
6
6
 
7
7
  attr_accessor :name
8
8
 
9
+ attr_accessor :project_role
10
+
9
11
  attr_accessor :main_format
10
12
 
11
13
  attr_accessor :created_at
@@ -19,6 +21,7 @@ module Phrase
19
21
  {
20
22
  :'id' => :'id',
21
23
  :'name' => :'name',
24
+ :'project_role' => :'project_role',
22
25
  :'main_format' => :'main_format',
23
26
  :'created_at' => :'created_at',
24
27
  :'updated_at' => :'updated_at',
@@ -31,6 +34,7 @@ module Phrase
31
34
  {
32
35
  :'id' => :'String',
33
36
  :'name' => :'String',
37
+ :'project_role' => :'String',
34
38
  :'main_format' => :'String',
35
39
  :'created_at' => :'DateTime',
36
40
  :'updated_at' => :'DateTime',
@@ -48,7 +52,7 @@ module Phrase
48
52
  def self.openapi_all_of
49
53
  [
50
54
  :'ProjectLocales1',
51
- :'ProjectShort'
55
+ :'ProjectMemberSpecific'
52
56
  ]
53
57
  end
54
58
 
@@ -75,6 +79,10 @@ module Phrase
75
79
  self.name = attributes[:'name']
76
80
  end
77
81
 
82
+ if attributes.key?(:'project_role')
83
+ self.project_role = attributes[:'project_role']
84
+ end
85
+
78
86
  if attributes.key?(:'main_format')
79
87
  self.main_format = attributes[:'main_format']
80
88
  end
@@ -114,6 +122,7 @@ module Phrase
114
122
  self.class == o.class &&
115
123
  id == o.id &&
116
124
  name == o.name &&
125
+ project_role == o.project_role &&
117
126
  main_format == o.main_format &&
118
127
  created_at == o.created_at &&
119
128
  updated_at == o.updated_at &&
@@ -129,7 +138,7 @@ module Phrase
129
138
  # Calculates hash code according to all attributes.
130
139
  # @return [Integer] Hash code
131
140
  def hash
132
- [id, name, main_format, created_at, updated_at, locales].hash
141
+ [id, name, project_role, main_format, created_at, updated_at, locales].hash
133
142
  end
134
143
 
135
144
  # Builds the object from hash
@@ -0,0 +1,239 @@
1
+ require 'date'
2
+
3
+ module Phrase
4
+ class ProjectMemberSpecific
5
+ attr_accessor :id
6
+
7
+ attr_accessor :name
8
+
9
+ attr_accessor :project_role
10
+
11
+ attr_accessor :main_format
12
+
13
+ attr_accessor :created_at
14
+
15
+ attr_accessor :updated_at
16
+
17
+ # Attribute mapping from ruby-style variable name to JSON key.
18
+ def self.attribute_map
19
+ {
20
+ :'id' => :'id',
21
+ :'name' => :'name',
22
+ :'project_role' => :'project_role',
23
+ :'main_format' => :'main_format',
24
+ :'created_at' => :'created_at',
25
+ :'updated_at' => :'updated_at'
26
+ }
27
+ end
28
+
29
+ # Attribute type mapping.
30
+ def self.openapi_types
31
+ {
32
+ :'id' => :'String',
33
+ :'name' => :'String',
34
+ :'project_role' => :'String',
35
+ :'main_format' => :'String',
36
+ :'created_at' => :'DateTime',
37
+ :'updated_at' => :'DateTime'
38
+ }
39
+ end
40
+
41
+ # List of attributes with nullable: true
42
+ def self.openapi_nullable
43
+ Set.new([
44
+ ])
45
+ end
46
+
47
+ # Initializes the object
48
+ # @param [Hash] attributes Model attributes in the form of hash
49
+ def initialize(attributes = {})
50
+ if (!attributes.is_a?(Hash))
51
+ fail ArgumentError, "The input argument (attributes) must be a hash in `Phrase::ProjectMemberSpecific` initialize method"
52
+ end
53
+
54
+ # check to see if the attribute exists and convert string to symbol for hash key
55
+ attributes = attributes.each_with_object({}) { |(k, v), h|
56
+ if (!self.class.attribute_map.key?(k.to_sym))
57
+ fail ArgumentError, "`#{k}` is not a valid attribute in `Phrase::ProjectMemberSpecific`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect
58
+ end
59
+ h[k.to_sym] = v
60
+ }
61
+
62
+ if attributes.key?(:'id')
63
+ self.id = attributes[:'id']
64
+ end
65
+
66
+ if attributes.key?(:'name')
67
+ self.name = attributes[:'name']
68
+ end
69
+
70
+ if attributes.key?(:'project_role')
71
+ self.project_role = attributes[:'project_role']
72
+ end
73
+
74
+ if attributes.key?(:'main_format')
75
+ self.main_format = attributes[:'main_format']
76
+ end
77
+
78
+ if attributes.key?(:'created_at')
79
+ self.created_at = attributes[:'created_at']
80
+ end
81
+
82
+ if attributes.key?(:'updated_at')
83
+ self.updated_at = attributes[:'updated_at']
84
+ end
85
+ end
86
+
87
+ # Show invalid properties with the reasons. Usually used together with valid?
88
+ # @return Array for valid properties with the reasons
89
+ def list_invalid_properties
90
+ invalid_properties = Array.new
91
+ invalid_properties
92
+ end
93
+
94
+ # Check to see if the all the properties in the model are valid
95
+ # @return true if the model is valid
96
+ def valid?
97
+ true
98
+ end
99
+
100
+ # Checks equality by comparing each attribute.
101
+ # @param [Object] Object to be compared
102
+ def ==(o)
103
+ return true if self.equal?(o)
104
+ self.class == o.class &&
105
+ id == o.id &&
106
+ name == o.name &&
107
+ project_role == o.project_role &&
108
+ main_format == o.main_format &&
109
+ created_at == o.created_at &&
110
+ updated_at == o.updated_at
111
+ end
112
+
113
+ # @see the `==` method
114
+ # @param [Object] Object to be compared
115
+ def eql?(o)
116
+ self == o
117
+ end
118
+
119
+ # Calculates hash code according to all attributes.
120
+ # @return [Integer] Hash code
121
+ def hash
122
+ [id, name, project_role, main_format, created_at, updated_at].hash
123
+ end
124
+
125
+ # Builds the object from hash
126
+ # @param [Hash] attributes Model attributes in the form of hash
127
+ # @return [Object] Returns the model itself
128
+ def self.build_from_hash(attributes)
129
+ new.build_from_hash(attributes)
130
+ end
131
+
132
+ # Builds the object from hash
133
+ # @param [Hash] attributes Model attributes in the form of hash
134
+ # @return [Object] Returns the model itself
135
+ def build_from_hash(attributes)
136
+ return nil unless attributes.is_a?(Hash)
137
+ self.class.openapi_types.each_pair do |key, type|
138
+ if type =~ /\AArray<(.*)>/i
139
+ # check to ensure the input is an array given that the attribute
140
+ # is documented as an array but the input is not
141
+ if attributes[self.class.attribute_map[key]].is_a?(Array)
142
+ self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) })
143
+ end
144
+ elsif !attributes[self.class.attribute_map[key]].nil?
145
+ self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]]))
146
+ end # or else data not found in attributes(hash), not an issue as the data can be optional
147
+ end
148
+
149
+ self
150
+ end
151
+
152
+ # Deserializes the data based on type
153
+ # @param string type Data type
154
+ # @param string value Value to be deserialized
155
+ # @return [Object] Deserialized data
156
+ def _deserialize(type, value)
157
+ case type.to_sym
158
+ when :DateTime
159
+ DateTime.parse(value)
160
+ when :Date
161
+ Date.parse(value)
162
+ when :String
163
+ value.to_s
164
+ when :Integer
165
+ value.to_i
166
+ when :Float
167
+ value.to_f
168
+ when :Boolean
169
+ if value.to_s =~ /\A(true|t|yes|y|1)\z/i
170
+ true
171
+ else
172
+ false
173
+ end
174
+ when :Object
175
+ # generic object (usually a Hash), return directly
176
+ value
177
+ when /\AArray<(?<inner_type>.+)>\z/
178
+ inner_type = Regexp.last_match[:inner_type]
179
+ value.map { |v| _deserialize(inner_type, v) }
180
+ when /\AHash<(?<k_type>.+?), (?<v_type>.+)>\z/
181
+ k_type = Regexp.last_match[:k_type]
182
+ v_type = Regexp.last_match[:v_type]
183
+ {}.tap do |hash|
184
+ value.each do |k, v|
185
+ hash[_deserialize(k_type, k)] = _deserialize(v_type, v)
186
+ end
187
+ end
188
+ else # model
189
+ Phrase.const_get(type).build_from_hash(value)
190
+ end
191
+ end
192
+
193
+ # Returns the string representation of the object
194
+ # @return [String] String presentation of the object
195
+ def to_s
196
+ to_hash.to_s
197
+ end
198
+
199
+ # to_body is an alias to to_hash (backward compatibility)
200
+ # @return [Hash] Returns the object in the form of hash
201
+ def to_body
202
+ to_hash
203
+ end
204
+
205
+ # Returns the object in the form of hash
206
+ # @return [Hash] Returns the object in the form of hash
207
+ def to_hash
208
+ hash = {}
209
+ self.class.attribute_map.each_pair do |attr, param|
210
+ value = self.send(attr)
211
+ if value.nil?
212
+ is_nullable = self.class.openapi_nullable.include?(attr)
213
+ next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}"))
214
+ end
215
+
216
+ hash[param] = _to_hash(value)
217
+ end
218
+ hash
219
+ end
220
+
221
+ # Outputs non-array value in the form of hash
222
+ # For object, use to_hash. Otherwise, just return the value
223
+ # @param [Object] value Any valid value
224
+ # @return [Hash] Returns the value in the form of hash
225
+ def _to_hash(value)
226
+ if value.is_a?(Array)
227
+ value.compact.map { |v| _to_hash(v) }
228
+ elsif value.is_a?(Hash)
229
+ {}.tap do |hash|
230
+ value.each { |k, v| hash[k] = _to_hash(v) }
231
+ end
232
+ elsif value.respond_to? :to_hash
233
+ value.to_hash
234
+ else
235
+ value
236
+ end
237
+ end
238
+ end
239
+ end
@@ -8,6 +8,9 @@ module Phrase
8
8
  # List of platforms the release should support.
9
9
  attr_accessor :platforms
10
10
 
11
+ # List of locale ids that will be included in the release. If empty, distribution locales will be used
12
+ attr_accessor :locale_ids
13
+
11
14
  # Branch used for release
12
15
  attr_accessor :branch
13
16
 
@@ -16,6 +19,7 @@ module Phrase
16
19
  {
17
20
  :'description' => :'description',
18
21
  :'platforms' => :'platforms',
22
+ :'locale_ids' => :'locale_ids',
19
23
  :'branch' => :'branch'
20
24
  }
21
25
  end
@@ -25,6 +29,7 @@ module Phrase
25
29
  {
26
30
  :'description' => :'String',
27
31
  :'platforms' => :'Array<String>',
32
+ :'locale_ids' => :'Array<String>',
28
33
  :'branch' => :'String'
29
34
  }
30
35
  end
@@ -60,6 +65,12 @@ module Phrase
60
65
  end
61
66
  end
62
67
 
68
+ if attributes.key?(:'locale_ids')
69
+ if (value = attributes[:'locale_ids']).is_a?(Array)
70
+ self.locale_ids = value
71
+ end
72
+ end
73
+
63
74
  if attributes.key?(:'branch')
64
75
  self.branch = attributes[:'branch']
65
76
  end
@@ -85,6 +96,7 @@ module Phrase
85
96
  self.class == o.class &&
86
97
  description == o.description &&
87
98
  platforms == o.platforms &&
99
+ locale_ids == o.locale_ids &&
88
100
  branch == o.branch
89
101
  end
90
102
 
@@ -97,7 +109,7 @@ module Phrase
97
109
  # Calculates hash code according to all attributes.
98
110
  # @return [Integer] Hash code
99
111
  def hash
100
- [description, platforms, branch].hash
112
+ [description, platforms, locale_ids, branch].hash
101
113
  end
102
114
 
103
115
  # Builds the object from hash