web_translate_it 1.10.2 → 2.0.0.rc2

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.
data/history.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## Edge
2
+
3
+ * Backport of compatibility fix for ruby 1.8.7 from 1.x serie.
4
+ * Fix issue with new version system, which broke the gem. #86
5
+
6
+ ## Version 2.0.0.rc1 / 2012-04-16 (yanked)
7
+
8
+ **Important**: This release candidate introduce breaking changes in the String, Translation, Term and TermTranslation APIs. See [Extras](https://github.com/AtelierConvivialite/webtranslateit/wiki/Extras) if you use the String, Translation, Term and TermTranslation APIs to programmatically manage strings, translations and terms.
9
+
10
+ * Remove undeclared dependency on ActiveSupport. ActiveSupport was required to use the `WebTranslateIt::String`, `Translation`, `Term` and `TermTranslation` classes. #84
11
+ * Refactor `WebTranslateIt::String` and `WebTranslateIt::Translation` classes and add specs. #85
12
+ * Refactor `WebTranslateIt::Term` and `WebTranslateIt::TermTranslation` classes and add specs.
13
+
1
14
  ## Version 1.10.2 / 2012-04-17
2
15
 
3
16
  * Compatibility fix for ruby 1.8.7.
@@ -8,6 +8,8 @@ require 'web_translate_it/configuration'
8
8
  require 'web_translate_it/translation_file'
9
9
  require 'web_translate_it/string'
10
10
  require 'web_translate_it/translation'
11
+ require 'web_translate_it/term'
12
+ require 'web_translate_it/term_translation'
11
13
  require 'web_translate_it/auto_fetch'
12
14
  require 'web_translate_it/command_line'
13
15
  require 'web_translate_it/project'
@@ -2,26 +2,76 @@
2
2
  module WebTranslateIt
3
3
  class String
4
4
  require 'net/https'
5
+ require 'json'
5
6
 
6
- attr_accessor :id, :api_key
7
+ attr_accessor :api_key, :id, :key, :plural, :type, :dev_comment, :word_count, :status, :category, :label, :file,
8
+ :created_at, :updated_at, :translations, :new_record
7
9
 
8
- def initialize(id, api_key)
9
- self.id = id
10
- self.api_key = api_key
10
+ # Initialize a new WebTranslateIt::String
11
+ # The only mandatory parameter is `api_key`
12
+ #
13
+ # Implementation Example:
14
+ #
15
+ # WebTranslateIt::String.new('secret_api_token', { "key" => "product_name_123" })
16
+ #
17
+ # to instantiate a new String without any text.
18
+ #
19
+ # translation_en = WebTranslateIt::Translation.new({ "locale" => "en", "text" => "Hello" })
20
+ # translation_fr = WebTranslateIt::Translation.new({ "locale" => "fr", "text" => "Bonjour" })
21
+ # WebTranslateIt::String.new('secret_api_token', { "key" => "product_name_123", "translations" => [translation_en, translation_fr]})
22
+ #
23
+ # to instantiate a new String with a source and target translation.
24
+
25
+ def initialize(api_key, params = {})
26
+ self.api_key = api_key
27
+ self.id = params["id"] || nil
28
+ self.key = params["key"] || nil
29
+ self.plural = params["plural"] || nil
30
+ self.type = params["type"] || nil
31
+ self.dev_comment = params["dev_comment"] || nil
32
+ self.word_count = params["word_count"] || nil
33
+ self.status = params["status"] || nil
34
+ self.category = params["category"] || nil
35
+ self.label = params["label"] || nil
36
+ self.file = params["file"] || nil
37
+ self.created_at = params["created_at"] || nil
38
+ self.updated_at = params["updated_at"] || nil
39
+ self.translations = params["translations"] || []
40
+ self.new_record = true
11
41
  end
12
42
 
13
- def self.list(http_connection, api_key, params = {}, options = {})
14
- options.reverse_merge!(:format => 'yaml')
15
-
16
- url = "/api/projects/#{api_key}/strings.#{options[:format]}"
17
- url += '?' + HashUtil.to_param(params) unless params.blank?
43
+ # Find a String based on filters
44
+ # Needs a HTTPS Connection
45
+ #
46
+ # Implementation Example:
47
+ #
48
+ # WebTranslateIt::Util.http_connection do |connection|
49
+ # strings = WebTranslateIt::String.find_all(connection, 'secret_api_token', { "key" => "product_name_123" })
50
+ # end
51
+ #
52
+ # puts strings.inspect #=> An array of WebTranslateIt::String objects
53
+ #
54
+ # to find and instantiate an array of String which key is like `product_name_123`.
55
+ #
56
+ # TODO: Implement pagination
57
+
58
+ def self.find_all(http_connection, api_key, params = {})
59
+ url = "/api/projects/#{api_key}/strings.yaml"
60
+ url += '?' + HashUtil.to_params("filters" => params) unless params.empty?
18
61
 
19
62
  request = Net::HTTP::Get.new(url)
20
63
  request.add_field("X-Client-Name", "web_translate_it")
21
64
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
22
65
 
23
66
  begin
24
- Util.handle_response(http_connection.request(request), true)
67
+ response = Util.handle_response(http_connection.request(request), true)
68
+ strings = []
69
+ YAML.load(response).each do |string_response|
70
+ string = WebTranslateIt::String.new(api_key, string_response)
71
+ string.new_record = false
72
+ strings.push(string)
73
+ end
74
+ return strings
25
75
  rescue Timeout::Error
26
76
  puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
27
77
  sleep(5)
@@ -29,31 +79,73 @@ module WebTranslateIt
29
79
  end
30
80
  end
31
81
 
32
- def show(http_connection, options = {})
33
- options.reverse_merge!(:format => 'yaml')
34
-
35
- request = Net::HTTP::Get.new("/api/projects/#{self.api_key}/strings/#{self.id}.#{options[:format]}")
82
+ # Find a String based on its ID
83
+ # Needs a HTTPS Connection
84
+ #
85
+ # Implementation Example:
86
+ #
87
+ # WebTranslateIt::Util.http_connection do |connection|
88
+ # string = WebTranslateIt::String.find(connection, 'secret_api_token', 1234)
89
+ # end
90
+ #
91
+ # puts string.inspect #=> A WebTranslateIt::String object
92
+ #
93
+ # to find and instantiate the String which ID is `1234`.
94
+ #
95
+
96
+ def self.find(http_connection, api_key, id)
97
+ request = Net::HTTP::Get.new("/api/projects/#{api_key}/strings/#{id}.yaml")
36
98
  request.add_field("X-Client-Name", "web_translate_it")
37
99
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
38
100
 
39
101
  begin
40
- Util.handle_response(http_connection.request(request), true)
102
+ response = http_connection.request(request)
103
+ return nil if response.code.to_i == 404
104
+ string = WebTranslateIt::String.new(api_key, YAML.load(response.body))
105
+ string.new_record = false
106
+ return string
41
107
  rescue Timeout::Error
42
108
  puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
43
109
  sleep(5)
44
110
  retry
45
111
  end
46
112
  end
47
-
48
- def update(http_connection, params = {}, options = {})
49
- options.reverse_merge!(:format => 'yaml')
50
-
51
- request = Net::HTTP::Put.new("/api/projects/#{self.api_key}/strings/#{self.id}.#{options[:format]}")
113
+
114
+ # Update or create a String to WebTranslateIt.com
115
+ # Needs a HTTPS Connection
116
+ #
117
+ # Implementation Example:
118
+ #
119
+ # WebTranslateIt::Util.http_connection do |connection|
120
+ # string = WebTranslateIt::String.find(connection, 'secret_api_token', 1234)
121
+ # string.status = "status_obsolete"
122
+ # string.save(http_connection)
123
+ # end
124
+ #
125
+
126
+ def save(http_connection)
127
+ if self.new_record
128
+ self.create(http_connection)
129
+ else
130
+ self.update(http_connection)
131
+ end
132
+ end
133
+
134
+ # Delete a String on WebTranslateIt.com
135
+ # Needs a HTTPS Connection
136
+ #
137
+ # Implementation Example:
138
+ #
139
+ # WebTranslateIt::Util.http_connection do |connection|
140
+ # string = WebTranslateIt::String.find(connection, 'secret_api_token', 1234)
141
+ # string.delete(http_connection)
142
+ # end
143
+ #
144
+
145
+ def delete(http_connection)
146
+ request = Net::HTTP::Delete.new("/api/projects/#{self.api_key}/strings/#{self.id}")
52
147
  request.add_field("X-Client-Name", "web_translate_it")
53
148
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
54
- request.add_field("Content-Type", "application/json")
55
-
56
- request.body = params.to_json
57
149
 
58
150
  begin
59
151
  Util.handle_response(http_connection.request(request), true)
@@ -64,14 +156,55 @@ module WebTranslateIt
64
156
  end
65
157
  end
66
158
 
67
- def self.create(http_connection, api_key, params = {})
68
- request = Net::HTTP::Post.new("/api/projects/#{api_key}/strings")
159
+ # Gets a Translation for a String
160
+ # Needs a HTTPS Connection
161
+ #
162
+ # Implementation Example:
163
+ #
164
+ # WebTranslateIt::Util.http_connection do |connection|
165
+ # string = WebTranslateIt::String.find(connection, 'secret_api_token', 1234)
166
+ # puts string.translation_for(connection, "fr") #=> A Translation object
167
+ # end
168
+ #
169
+
170
+ def translation_for(http_connection, locale)
171
+ return self.translations unless self.translations == []
172
+ request = Net::HTTP::Get.new("/api/projects/#{self.api_key}/strings/#{self.id}/locales/#{locale}/translations.yaml")
69
173
  request.add_field("X-Client-Name", "web_translate_it")
70
174
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
71
- request.add_field("Content-Type", "application/json")
72
-
73
- request.body = params.to_json
74
175
 
176
+ begin
177
+ response = Util.handle_response(http_connection.request(request), true)
178
+ hash = YAML.load(response)
179
+ return nil if hash.empty?
180
+ translation = WebTranslateIt::Translation.new(api_key, hash)
181
+ return translation
182
+
183
+ rescue Timeout::Error
184
+ puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
185
+ sleep(5)
186
+ retry
187
+ end
188
+ end
189
+
190
+ protected
191
+
192
+ # Save the changes made to a String to WebTranslateIt.com
193
+ # Needs a HTTPS Connection
194
+ #
195
+
196
+ def update(http_connection)
197
+ request = Net::HTTP::Put.new("/api/projects/#{self.api_key}/strings/#{self.id}.yaml")
198
+ request.add_field("X-Client-Name", "web_translate_it")
199
+ request.add_field("X-Client-Version", WebTranslateIt::Util.version)
200
+ request.add_field("Content-Type", "application/json")
201
+ request.body = self.to_json
202
+
203
+ self.translations.each do |translation|
204
+ translation.string_id = self.id
205
+ translation.save(http_connection)
206
+ end
207
+
75
208
  begin
76
209
  Util.handle_response(http_connection.request(request), true)
77
210
  rescue Timeout::Error
@@ -80,20 +213,51 @@ module WebTranslateIt
80
213
  retry
81
214
  end
82
215
  end
83
-
84
- def delete(http_connection)
85
- request = Net::HTTP::Delete.new("/api/projects/#{self.api_key}/strings/#{self.id}")
216
+
217
+ # Create a new String to WebTranslateIt.com
218
+ # Needs a HTTPS Connection
219
+ #
220
+
221
+ def create(http_connection)
222
+ request = Net::HTTP::Post.new("/api/projects/#{self.api_key}/strings")
86
223
  request.add_field("X-Client-Name", "web_translate_it")
87
224
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
225
+ request.add_field("Content-Type", "application/json")
226
+ request.body = self.to_json(true)
88
227
 
89
228
  begin
90
- Util.handle_response(http_connection.request(request), true)
229
+ response = YAML.load(Util.handle_response(http_connection.request(request), true))
230
+ self.id = response["id"]
231
+ self.new_record = false
232
+ return true
91
233
  rescue Timeout::Error
92
234
  puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
93
235
  sleep(5)
94
236
  retry
95
237
  end
96
238
  end
97
-
239
+
240
+ def to_json(with_translations = false)
241
+ hash = {
242
+ "id" => id,
243
+ "key" => key,
244
+ "plural" => plural,
245
+ "type" => type,
246
+ "dev_comment" => dev_comment,
247
+ "status" => status,
248
+ "label" => label,
249
+ "category" => category,
250
+ "file" => {
251
+ "id" => file
252
+ }
253
+ }
254
+ if self.translations.any? && with_translations
255
+ hash.update({ "translations" => [] })
256
+ translations.each do |translation|
257
+ hash["translations"].push(translation.to_hash)
258
+ end
259
+ end
260
+ hash.to_json
261
+ end
98
262
  end
99
263
  end
@@ -2,26 +2,67 @@
2
2
  module WebTranslateIt
3
3
  class Term
4
4
  require 'net/https'
5
+ require 'json'
5
6
 
6
- attr_accessor :id, :api_key
7
+ attr_accessor :api_key, :id, :text, :description, :created_at, :updated_at, :translations, :new_record
7
8
 
8
- def initialize(id, api_key)
9
- self.id = id
10
- self.api_key = api_key
9
+ # Initialize a new WebTranslateIt::Term
10
+ # The only mandatory parameter is `api_key`
11
+ #
12
+ # Implementation Example:
13
+ #
14
+ # WebTranslateIt::Term.new('secret_api_token', { "text" => "Term Name" })
15
+ #
16
+ # to instantiate a new Term.
17
+ #
18
+ # translation_es = WebTranslateIt::TermTranslation.new({ "locale" => "es", "text" => "Hola" })
19
+ # translation_fr = WebTranslateIt::TermTranslation.new({ "locale" => "fr", "text" => "Bonjour" })
20
+ # WebTranslateIt::Term.new('secret_api_token', { "text" => "Hello", "translations" => [translation_es, translation_fr]})
21
+ #
22
+ # to instantiate a new Term with a Term Translations in Spanish and French.
23
+
24
+ def initialize(api_key, params = {})
25
+ self.api_key = api_key
26
+ self.id = params["id"] || nil
27
+ self.text = params["text"] || nil
28
+ self.description = params["description"] || nil
29
+ self.created_at = params["created_at"] || nil
30
+ self.updated_at = params["updated_at"] || nil
31
+ self.translations = params["translations"] || []
32
+ self.new_record = true
11
33
  end
12
34
 
13
- def self.list(http_connection, api_key, params = {}, options = {})
14
- options.reverse_merge!(:format => 'yaml')
15
-
16
- url = "/api/projects/#{api_key}/terms.#{options[:format]}"
17
- url += '?' + HashUtil.to_param(params) unless params.blank?
35
+ # Fetch all terms
36
+ # Needs a HTTPS Connection
37
+ #
38
+ # Implementation Example:
39
+ #
40
+ # WebTranslateIt::Util.http_connection do |connection|
41
+ # terms = WebTranslateIt::Term.find_all(connection, 'secret_api_token')
42
+ # end
43
+ #
44
+ # puts terms.inspect #=> An array of WebTranslateIt::Term objects
45
+ #
46
+ # TODO: Implement pagination
47
+
48
+ def self.find_all(http_connection, api_key, params = {})
49
+ url = "/api/projects/#{api_key}/terms.yaml"
50
+ url += '?' + HashUtil.to_params(params) unless params.empty?
18
51
 
19
52
  request = Net::HTTP::Get.new(url)
20
53
  request.add_field("X-Client-Name", "web_translate_it")
21
54
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
22
55
 
23
56
  begin
24
- Util.handle_response(http_connection.request(request), true)
57
+ response = Util.handle_response(http_connection.request(request), true)
58
+ terms = []
59
+ YAML.load(response).each do |term_response|
60
+ term = WebTranslateIt::Term.new(api_key, term_response)
61
+ term.new_record = false
62
+ terms.push(term)
63
+ end
64
+ return terms
65
+
25
66
  rescue Timeout::Error
26
67
  puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
27
68
  sleep(5)
@@ -29,15 +70,31 @@ module WebTranslateIt
29
70
  end
30
71
  end
31
72
 
32
- def show(http_connection, options = {})
33
- options.reverse_merge!(:format => 'yaml')
34
-
35
- request = Net::HTTP::Get.new("/api/projects/#{self.api_key}/terms/#{self.id}.#{options[:format]}")
73
+ # Find a Term based on its ID
74
+ # Needs a HTTPS Connection
75
+ #
76
+ # Implementation Example:
77
+ #
78
+ # WebTranslateIt::Util.http_connection do |connection|
79
+ # term = WebTranslateIt::Term.find(connection, 'secret_api_token', 1234)
80
+ # end
81
+ #
82
+ # puts term.inspect #=> A Term object
83
+ #
84
+ # to find and instantiate the Term which ID is `1234`.
85
+ #
86
+
87
+ def self.find(http_connection, api_key, term_id)
88
+ request = Net::HTTP::Get.new("/api/projects/#{api_key}/terms/#{term_id}.yaml")
36
89
  request.add_field("X-Client-Name", "web_translate_it")
37
90
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
38
91
 
39
92
  begin
40
- Util.handle_response(http_connection.request(request), true)
93
+ response = http_connection.request(request)
94
+ return nil if response.code.to_i == 404
95
+ term = WebTranslateIt::Term.new(api_key, YAML.load(response.body))
96
+ term.new_record = false
97
+ return term
41
98
  rescue Timeout::Error
42
99
  puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
43
100
  sleep(5)
@@ -45,15 +102,41 @@ module WebTranslateIt
45
102
  end
46
103
  end
47
104
 
48
- def update(http_connection, params = {}, options = {})
49
- options.reverse_merge!(:format => 'yaml')
105
+ # Update or create a Term to WebTranslateIt.com
106
+ # Needs a HTTPS Connection
107
+ #
108
+ # Implementation Example:
109
+ #
110
+ # WebTranslateIt::Util.http_connection do |connection|
111
+ # term = WebTranslateIt::Term.find(connection, 'secret_api_token', 1234)
112
+ # term.text = "Hello"
113
+ # term.save(http_connection)
114
+ # end
115
+ #
50
116
 
51
- request = Net::HTTP::Put.new("/api/projects/#{self.api_key}/terms/#{self.id}.#{options[:format]}")
117
+ def save(http_connection)
118
+ if self.new_record
119
+ self.create(http_connection)
120
+ else
121
+ self.update(http_connection)
122
+ end
123
+ end
124
+
125
+ # Delete a Term on WebTranslateIt.com
126
+ # Needs a HTTPS Connection
127
+ #
128
+ # Implementation Example:
129
+ #
130
+ # WebTranslateIt::Util.http_connection do |connection|
131
+ # term = WebTranslateIt::Term.find(connection, 'secret_api_token', 1234)
132
+ # term.delete(http_connection)
133
+ # end
134
+ #
135
+
136
+ def delete(http_connection)
137
+ request = Net::HTTP::Delete.new("/api/projects/#{self.api_key}/terms/#{self.id}")
52
138
  request.add_field("X-Client-Name", "web_translate_it")
53
139
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
54
- request.add_field("Content-Type", "application/json")
55
-
56
- request.body = params.to_json
57
140
 
58
141
  begin
59
142
  Util.handle_response(http_connection.request(request), true)
@@ -64,16 +147,34 @@ module WebTranslateIt
64
147
  end
65
148
  end
66
149
 
67
- def self.create(http_connection, api_key, params = {})
68
- request = Net::HTTP::Post.new("/api/projects/#{api_key}/terms")
150
+ # Gets a Translation for a Term
151
+ # Needs a HTTPS Connection
152
+ #
153
+ # Implementation Example:
154
+ #
155
+ # WebTranslateIt::Util.http_connection do |connection|
156
+ # term = WebTranslateIt::Term.find(connection, 'secret_api_token', 1234)
157
+ # puts term.translation_for(connection, "fr") #=> A TermTranslation object
158
+ # end
159
+ #
160
+
161
+ def translation_for(http_connection, locale)
162
+ return self.translations unless self.translations == []
163
+ request = Net::HTTP::Get.new("/api/projects/#{self.api_key}/terms/#{self.id}/locales/#{locale}/translations.yaml")
69
164
  request.add_field("X-Client-Name", "web_translate_it")
70
165
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
71
- request.add_field("Content-Type", "application/json")
72
-
73
- request.body = params.to_json
74
166
 
75
167
  begin
76
- Util.handle_response(http_connection.request(request), true)
168
+ response = Util.handle_response(http_connection.request(request), true)
169
+ array = YAML.load(response)
170
+ return nil if array.empty?
171
+ translations = []
172
+ array.each do |translation|
173
+ term_translation = WebTranslateIt::TermTranslation.new(api_key, translation)
174
+ translations.push(term_translation)
175
+ end
176
+ return translations
177
+
77
178
  rescue Timeout::Error
78
179
  puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
79
180
  sleep(5)
@@ -81,10 +182,20 @@ module WebTranslateIt
81
182
  end
82
183
  end
83
184
 
84
- def delete(http_connection)
85
- request = Net::HTTP::Delete.new("/api/projects/#{self.api_key}/terms/#{self.id}")
185
+ protected
186
+
187
+ def update(http_connection)
188
+ request = Net::HTTP::Put.new("/api/projects/#{self.api_key}/terms/#{self.id}.yaml")
86
189
  request.add_field("X-Client-Name", "web_translate_it")
87
190
  request.add_field("X-Client-Version", WebTranslateIt::Util.version)
191
+ request.add_field("Content-Type", "application/json")
192
+
193
+ request.body = self.to_json
194
+
195
+ self.translations.each do |translation|
196
+ translation.term_id = self.id
197
+ translation.save(http_connection)
198
+ end
88
199
 
89
200
  begin
90
201
  Util.handle_response(http_connection.request(request), true)
@@ -94,6 +205,41 @@ module WebTranslateIt
94
205
  retry
95
206
  end
96
207
  end
208
+
209
+ def create(http_connection)
210
+ request = Net::HTTP::Post.new("/api/projects/#{api_key}/terms")
211
+ request.add_field("X-Client-Name", "web_translate_it")
212
+ request.add_field("X-Client-Version", WebTranslateIt::Util.version)
213
+ request.add_field("Content-Type", "application/json")
214
+
215
+ request.body = self.to_json(true)
97
216
 
217
+ begin
218
+ response = YAML.load(Util.handle_response(http_connection.request(request), true))
219
+ self.id = response["id"]
220
+ self.new_record = false
221
+ return true
222
+
223
+ rescue Timeout::Error
224
+ puts "The request timed out. The service may be overloaded. We will retry in 5 seconds."
225
+ sleep(5)
226
+ retry
227
+ end
228
+ end
229
+
230
+ def to_json(with_translations = false)
231
+ hash = {
232
+ "id" => id,
233
+ "text" => text,
234
+ "description" => description
235
+ }
236
+ if self.translations.any? && with_translations
237
+ hash.update({ "translations" => [] })
238
+ translations.each do |translation|
239
+ hash["translations"].push(translation.to_hash)
240
+ end
241
+ end
242
+ hash.to_json
243
+ end
98
244
  end
99
245
  end