phrase 2.3.0 → 2.5.1

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 (73) 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 +21 -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/TranslationsVerifyParameters.md +3 -5
  24. data/docs/UserPreview.md +3 -1
  25. data/lib/phrase/api/icu_api.rb +78 -0
  26. data/lib/phrase/api/job_locales_api.rb +86 -0
  27. data/lib/phrase/models/distribution.rb +12 -1
  28. data/lib/phrase/models/distribution_create_parameters.rb +13 -1
  29. data/lib/phrase/models/distribution_update_parameters.rb +13 -1
  30. data/lib/phrase/models/icu.rb +195 -0
  31. data/lib/phrase/models/icu_skeleton_parameters.rb +217 -0
  32. data/lib/phrase/models/invitation.rb +12 -1
  33. data/lib/phrase/models/invitation_create_parameters.rb +13 -1
  34. data/lib/phrase/models/invitation_update_parameters.rb +13 -1
  35. data/lib/phrase/models/job_locale_complete_review_parameters.rb +195 -0
  36. data/lib/phrase/models/job_locale_update_parameters.rb +16 -4
  37. data/lib/phrase/models/job_locales_create_parameters.rb +17 -5
  38. data/lib/phrase/models/member.rb +30 -1
  39. data/lib/phrase/models/project.rb +10 -1
  40. data/lib/phrase/models/project_details.rb +10 -1
  41. data/lib/phrase/models/project_locales.rb +11 -2
  42. data/lib/phrase/models/project_member_specific.rb +239 -0
  43. data/lib/phrase/models/release_create_parameters.rb +13 -1
  44. data/lib/phrase/models/team1.rb +221 -0
  45. data/lib/phrase/models/translations_verify_parameters.rb +14 -24
  46. data/lib/phrase/models/user_preview.rb +13 -4
  47. data/lib/phrase/response.rb +1 -1
  48. data/lib/phrase/version.rb +1 -1
  49. data/lib/phrase.rb +6 -0
  50. data/phrase.gemspec +2 -2
  51. data/spec/api/icu_api_spec.rb +36 -0
  52. data/spec/api/job_locales_api_spec.rb +16 -0
  53. data/spec/models/distribution_create_parameters_spec.rb +6 -0
  54. data/spec/models/distribution_spec.rb +6 -0
  55. data/spec/models/distribution_update_parameters_spec.rb +6 -0
  56. data/spec/models/icu_skeleton_parameters_spec.rb +41 -0
  57. data/spec/models/icu_spec.rb +29 -0
  58. data/spec/models/invitation_create_parameters_spec.rb +6 -0
  59. data/spec/models/invitation_spec.rb +6 -0
  60. data/spec/models/invitation_update_parameters_spec.rb +6 -0
  61. data/spec/models/job_locale_complete_review_parameters_spec.rb +29 -0
  62. data/spec/models/job_locale_update_parameters_spec.rb +6 -0
  63. data/spec/models/job_locales_create_parameters_spec.rb +6 -0
  64. data/spec/models/member_spec.rb +18 -0
  65. data/spec/models/project_details_spec.rb +6 -0
  66. data/spec/models/project_locales_spec.rb +6 -0
  67. data/spec/models/project_member_specific_spec.rb +59 -0
  68. data/spec/models/project_spec.rb +6 -0
  69. data/spec/models/release_create_parameters_spec.rb +6 -0
  70. data/spec/models/team1_spec.rb +47 -0
  71. data/spec/models/translations_verify_parameters_spec.rb +2 -8
  72. data/spec/models/user_preview_spec.rb +6 -0
  73. metadata +218 -194
@@ -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