smartling 1.0.1 → 2.0.0
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.
- checksums.yaml +5 -13
- data/README.md +2 -1
- data/lib/smartling.rb +1 -0
- data/lib/smartling/api.rb +101 -33
- data/lib/smartling/fileapi.rb +90 -27
- data/lib/smartling/projectapi.rb +35 -0
- data/lib/smartling/uri.rb +2 -2
- data/lib/smartling/version.rb +1 -1
- data/samples/file_api.rb +69 -23
- data/tests/api_test.rb +19 -14
- data/tests/srv_fileapi_test.rb +8 -10
- data/tests/test_helper.rb +1 -0
- data/tests/uri_test.rb +6 -6
- metadata +16 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
NDdmYzYwMDZmZjIyMTI1MWY4MjJkN2VkOThiODFjYjdjZTVhMmFjZQ==
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8eef838728d1e03aa7d98db81a5ea35742cea69d
|
4
|
+
data.tar.gz: 14e8bb96b9d86a81ae3dcc56c95d2f9f161fbf8b
|
7
5
|
SHA512:
|
8
|
-
metadata.gz:
|
9
|
-
|
10
|
-
NTgwOWFiNDI2OGNhNGExZjg1NzJmMjM2YzAxYjUyMTk4ZTU3MzNjNjcwNWRm
|
11
|
-
MWVlOTE4MGEyZGMwZDc1OGEwNGZjZTBjM2Q1ZmIyZDc2ZjZhZDE=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OGIzODdjYmMzZTZjNTAyYjkxOGNmOGRjNDIyMThjNWRkMTA5OTYzZGJjMTIz
|
14
|
-
OTZmYjg3ZjMxNDg0ZGI3NjFmNjg0NTZkOTNjZDA1ZmE2MzliYTJhODBhMTE1
|
15
|
-
Y2VjYzZiMjljYmZhNDNkZDM1OWRlYWJmMmFlYjA2M2JiMTAzZjQ=
|
6
|
+
metadata.gz: cfeaaeb1640b4c0710fbd7cb36032614802802f510ba971ef6546eb017dbb2d70d3ff053240ab844ed17b7193b287e68268ca4a65a3c0c597223b7a01f72af3c
|
7
|
+
data.tar.gz: 8d334b6681522832884c12328648afc9e262a8ae2ccdf67b2328b804bb6056b3829c841cd8078978b659b15438f14493e8e54dcc8804bc82c289596064e44e5e
|
data/README.md
CHANGED
@@ -44,12 +44,13 @@ Authors
|
|
44
44
|
-------
|
45
45
|
|
46
46
|
* [Pavel Ivashkov](https://github.com/paiv)
|
47
|
+
* [Emilien Huet](https://github.com/emilienh)
|
47
48
|
|
48
49
|
|
49
50
|
Copyright and license
|
50
51
|
---------------------
|
51
52
|
|
52
|
-
Copyright 2012 Smartling, Inc.
|
53
|
+
Copyright 2012 - 2016 Smartling, Inc.
|
53
54
|
|
54
55
|
Licensed under the Apache License, Version 2.0 (the "License");
|
55
56
|
you may not use this file except in compliance with the License.
|
data/lib/smartling.rb
CHANGED
data/lib/smartling/api.rb
CHANGED
@@ -19,18 +19,16 @@ require 'smartling/uri'
|
|
19
19
|
module Smartling
|
20
20
|
|
21
21
|
module Endpoints
|
22
|
-
|
23
|
-
|
24
|
-
CURRENT = V1
|
25
|
-
SANDBOX = SANDBOX_V1
|
22
|
+
CURRENT = 'https://api.smartling.com/'
|
23
|
+
SANDBOX = 'https://api.stg.smartling.net/'
|
26
24
|
end
|
27
25
|
|
28
26
|
class Api
|
29
|
-
attr_accessor :
|
27
|
+
attr_accessor :baseUrl, :prefix
|
30
28
|
|
31
29
|
def initialize(args = {})
|
32
|
-
@
|
33
|
-
@
|
30
|
+
@userId = args[:userId]
|
31
|
+
@userSecret = args[:userSecret]
|
34
32
|
@baseUrl = args[:baseUrl] || Endpoints::CURRENT
|
35
33
|
end
|
36
34
|
|
@@ -40,25 +38,33 @@ module Smartling
|
|
40
38
|
|
41
39
|
def uri(path, params1 = nil, params2 = nil)
|
42
40
|
uri = Uri.new(@baseUrl, path)
|
43
|
-
params = {
|
41
|
+
params = {}
|
44
42
|
params.merge!(params1) if params1
|
45
43
|
params.merge!(params2) if params2
|
46
44
|
uri.params = params
|
47
|
-
uri.require(:apiKey, :projectId)
|
48
45
|
return uri
|
49
46
|
end
|
50
47
|
|
51
48
|
def check_response(res)
|
52
49
|
return if res.code == 200
|
53
|
-
|
50
|
+
format_api_error(res.body)
|
51
|
+
raise 'API_ERROR'
|
54
52
|
end
|
55
53
|
|
56
54
|
def process(res)
|
57
55
|
check_response(res)
|
58
56
|
body = MultiJson.decode(res.body)
|
59
|
-
|
60
|
-
|
61
|
-
|
57
|
+
if body['response']
|
58
|
+
body = body['response']
|
59
|
+
if body['code'] == 'SUCCESS'
|
60
|
+
return body['data']
|
61
|
+
else
|
62
|
+
format_api_error(res.body)
|
63
|
+
raise 'API_ERROR'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
raise 'API_ERROR'
|
67
|
+
return nil
|
62
68
|
end
|
63
69
|
|
64
70
|
def format_api_error(res)
|
@@ -66,34 +72,50 @@ module Smartling
|
|
66
72
|
body = MultiJson.decode(res.body)
|
67
73
|
rescue
|
68
74
|
end
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
|
76
|
+
if body && body['response']
|
77
|
+
body = body['response']
|
78
|
+
STDERR.puts "\e[31m#{body['code']}\e[0m"
|
79
|
+
if body['errors']
|
80
|
+
body['errors'].each do |e|
|
81
|
+
STDERR.puts "\e[31m#{e['message']}\e[0m"
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
75
85
|
end
|
76
86
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
87
|
+
def call(uri, method, auth, upload, download, params = nil)
|
88
|
+
headers = {}
|
89
|
+
headers[:Authorization] = token_header() if auth
|
90
|
+
headers[:content_type] = :json unless upload
|
91
|
+
headers[:accept] = :json unless download
|
92
|
+
RestClient::Request.execute(:method => method,
|
93
|
+
:url => uri.to_s,
|
94
|
+
:payload => params,
|
95
|
+
:headers => headers) {|res, _, _|
|
96
|
+
if download
|
97
|
+
check_response(res)
|
98
|
+
res.body
|
99
|
+
else
|
100
|
+
process(res)
|
101
|
+
end
|
80
102
|
}
|
81
103
|
end
|
104
|
+
|
105
|
+
def get(uri)
|
106
|
+
call(uri, :get, true, false, false)
|
107
|
+
end
|
82
108
|
def get_raw(uri)
|
83
|
-
|
84
|
-
check_response(res)
|
85
|
-
res.body
|
86
|
-
}
|
109
|
+
call(uri, :get, true, false, true)
|
87
110
|
end
|
88
111
|
def post(uri, params = nil)
|
89
|
-
|
90
|
-
process(res)
|
91
|
-
}
|
112
|
+
call(uri, :post, true, false, false, params.to_json)
|
92
113
|
end
|
93
|
-
def
|
94
|
-
|
95
|
-
|
96
|
-
|
114
|
+
def post_file(uri, params = nil)
|
115
|
+
call(uri, :post, true, true, false, params)
|
116
|
+
end
|
117
|
+
def post_file_raw(uri, params = nil)
|
118
|
+
call(uri, :post, true, true, true, params)
|
97
119
|
end
|
98
120
|
|
99
121
|
def log=(v)
|
@@ -102,6 +124,52 @@ module Smartling
|
|
102
124
|
def proxy=(v)
|
103
125
|
RestClient.proxy = v
|
104
126
|
end
|
127
|
+
|
128
|
+
# auth
|
129
|
+
|
130
|
+
def token_header()
|
131
|
+
t = token()
|
132
|
+
raise 'AUTH_ERROR' if t.nil?
|
133
|
+
return "Bearer #{t}"
|
134
|
+
end
|
135
|
+
|
136
|
+
def process_auth(response)
|
137
|
+
now = Time.new.to_i
|
138
|
+
@token = response['accessToken']
|
139
|
+
@token_expiration = now + response['expiresIn'].to_i
|
140
|
+
@refresh = response['refreshToken']
|
141
|
+
@refresh_expiration = now + response['refreshExpiresIn'].to_i
|
142
|
+
end
|
143
|
+
|
144
|
+
# Authenticate - /auth-api/v2/authenticate (POST)
|
145
|
+
def token()
|
146
|
+
# Check if current token is still valid
|
147
|
+
if @token
|
148
|
+
now = Time.new.to_i
|
149
|
+
if @token_expiration > now
|
150
|
+
return @token
|
151
|
+
elsif @refresh && @refresh_expiration > now
|
152
|
+
return refresh()
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# Otherwise call authenticate endpoint
|
157
|
+
uri = uri('auth-api/v2/authenticate', {}, {})
|
158
|
+
RestClient.post(uri.to_s, {:userIdentifier => @userId, :userSecret => @userSecret}.to_json, {:content_type => :json, :accept => :json}) {|res, _, _|
|
159
|
+
process_auth(process(res))
|
160
|
+
return @token
|
161
|
+
}
|
162
|
+
end
|
163
|
+
|
164
|
+
# Refresh Authentication - /auth-api/v2/authenticate/refresh (POST)
|
165
|
+
def refresh()
|
166
|
+
uri = uri('auth-api/v2/authenticate/refresh', {}, {})
|
167
|
+
RestClient.post(uri.to_s, {:refreshToken => @refreshToken}.to_json, {:content_type => :json, :accept => :json}) {|res, _, _|
|
168
|
+
process_auth(process(res))
|
169
|
+
return @token
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
105
173
|
end
|
106
174
|
|
107
175
|
end
|
data/lib/smartling/fileapi.rb
CHANGED
@@ -16,60 +16,123 @@ require 'smartling/api'
|
|
16
16
|
|
17
17
|
module Smartling
|
18
18
|
|
19
|
-
module Services
|
20
|
-
FILE_LIST = 'file/list'
|
21
|
-
FILE_STATUS = 'file/status'
|
22
|
-
FILE_GET = 'file/get'
|
23
|
-
FILE_UPLOAD = 'file/upload'
|
24
|
-
FILE_RENAME = 'file/rename'
|
25
|
-
FILE_DELETE = 'file/delete'
|
26
|
-
FILE_IMPORT = 'file/import'
|
27
|
-
end
|
28
|
-
|
29
19
|
class File < Api
|
30
|
-
alias :api_delete :delete
|
31
20
|
|
21
|
+
def initialize(args = {})
|
22
|
+
super(args)
|
23
|
+
@projectId = args[:projectId]
|
24
|
+
end
|
25
|
+
|
26
|
+
# List Files - /files-api/v2/projects/{projectId}/files/list (GET)
|
32
27
|
def list(params = nil)
|
33
|
-
uri = uri(
|
34
|
-
return get(uri
|
28
|
+
uri = uri("files-api/v2/projects/#{@projectId}/files/list", params)
|
29
|
+
return get(uri)
|
30
|
+
end
|
31
|
+
|
32
|
+
# List File Types - /files-api/v2/projects/{projectId}/file-types (GET)
|
33
|
+
def list_types(params = nil)
|
34
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file-types", params)
|
35
|
+
return get(uri)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Status - All Locales - /files-api/v2/projects/{projectId}/file/status (GET)
|
39
|
+
def status_all(name)
|
40
|
+
keys = { :fileUri => name }
|
41
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file/status", keys, {}).require(:fileUri)
|
42
|
+
return get(uri)
|
35
43
|
end
|
36
44
|
|
37
|
-
|
45
|
+
# Status - Single Locale / Extended Response - /files-api/v2/projects/{projectId}/locales/{localeId}/file/status (GET)
|
46
|
+
def status(name, locale)
|
38
47
|
keys = { :fileUri => name }
|
39
|
-
uri = uri(
|
40
|
-
return get(uri
|
48
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/#{locale}/file/status", keys, {}).require(:fileUri)
|
49
|
+
return get(uri)
|
41
50
|
end
|
42
51
|
|
52
|
+
# Download Original File - /files-api/v2/projects/{projectId}/file (GET)
|
43
53
|
def download(name, params = nil)
|
44
54
|
keys = { :fileUri => name }
|
45
|
-
uri = uri(
|
46
|
-
return get_raw(uri
|
55
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file", keys, params).require(:fileUri)
|
56
|
+
return get_raw(uri)
|
57
|
+
end
|
58
|
+
|
59
|
+
# Download Translated File - Single Locale - /files-api/v2/projects/{projectId}/locales/{localeId}/file (GET)
|
60
|
+
def download_translated(name, locale, params = nil)
|
61
|
+
keys = { :fileUri => name }
|
62
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/#{locale}/file", keys, params).require(:fileUri)
|
63
|
+
return get_raw(uri)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Download Translated Files - Multiple Locales as .ZIP - /files-api/v2/projects/{projectId}/files/zip (GET)
|
67
|
+
def download_translated_zip(names, params = nil)
|
68
|
+
keys = { :fileUris => names, :localeIds => locales }
|
69
|
+
uri = uri("files-api/v2/projects/#{@projectId}/files/zip", keys, params).require(:fileUris, :localeIds)
|
70
|
+
return get_raw(uri)
|
47
71
|
end
|
48
72
|
|
73
|
+
# Download Translated File - All Locales as .ZIP - /files-api/v2/projects/{projectId}/locales/all/file/zip (GET)
|
74
|
+
def download_all_translated_zip(name, params = nil)
|
75
|
+
keys = { :fileUri => name }
|
76
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/all/file/zip", keys, params).require(:fileUri)
|
77
|
+
return get_raw(uri)
|
78
|
+
end
|
79
|
+
|
80
|
+
# Download Translated File - All Locales in one File - CSV - /files-api/v2/projects/{projectId}/locales/all/file (GET)
|
81
|
+
def download_all_translated_csv(name, params = nil)
|
82
|
+
keys = { :fileUri => name }
|
83
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/all/file", keys, params).require(:fileUri)
|
84
|
+
return get_raw(uri)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Upload File - /files-api/v2/projects/{projectId}/file (POST)
|
49
88
|
def upload(file, name, type, params = nil)
|
50
89
|
keys = { :fileUri => name, :fileType => type }
|
51
|
-
uri = uri(
|
90
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file", keys, params).require(:fileUri, :fileType)
|
52
91
|
file = ::File.open(file, 'rb') if file.is_a?(String)
|
53
|
-
return
|
92
|
+
return post_file(uri, :file => file)
|
54
93
|
end
|
55
94
|
|
95
|
+
# Rename - /files-api/v2/projects/{projectId}/file/rename (POST)
|
56
96
|
def rename(name, newname, params = nil)
|
57
97
|
keys = { :fileUri => name, :newFileUri => newname }
|
58
|
-
uri = uri(
|
59
|
-
return post(uri
|
98
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file/rename", keys, params).require(:fileUri, :newFileUri)
|
99
|
+
return post(uri)
|
60
100
|
end
|
61
101
|
|
102
|
+
# Delete - /files-api/v2/projects/{projectId}/file/delete (POST)
|
62
103
|
def delete(name, params = nil)
|
63
104
|
keys = { :fileUri => name }
|
64
|
-
uri = uri(
|
65
|
-
return
|
105
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file/delete", keys, params).require(:fileUri)
|
106
|
+
return post(uri)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Last Modified (by locale) - /files-api/v2/projects/{projectId}/locales/{localeId}/file/last-modified (GET)
|
110
|
+
def last_modified(name, locale, params = nil)
|
111
|
+
keys = { :fileUri => name }
|
112
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/#{locale}/file/last-modified", keys, params).require(:fileUri)
|
113
|
+
return get(uri)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Last Modified (all locales) - /files-api/v2/projects/{projectId}/file/last-modified (GET)
|
117
|
+
def last_modified_all(name, params = nil)
|
118
|
+
keys = { :fileUri => name }
|
119
|
+
uri = uri("files-api/v2/projects/#{@projectId}/file/last-modified", keys, params).require(:fileUri)
|
120
|
+
return get(uri)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Get Translations - /files-api/v2/projects/{projectId}/locales/{localeId}/file/get-translations (POST)
|
124
|
+
def translations(locale, file, fileUri, params = nil)
|
125
|
+
keys = { :fileUri => fileUri }
|
126
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/#{locale}/file/get-translations", keys, params).require(:fileUri)
|
127
|
+
return post_file_raw(uri, :file => file)
|
66
128
|
end
|
67
129
|
|
68
|
-
|
130
|
+
# Import Translations - /files-api/v2/projects/{projectId}/locales/{localeId}/file/import (POST or PUT)
|
131
|
+
def import(locale, file, name, type, state, params = nil)
|
69
132
|
keys = { :fileUri => name, :fileType => type, :translationState => state}
|
70
|
-
uri = uri(
|
133
|
+
uri = uri("files-api/v2/projects/#{@projectId}/locales/#{locale}/file/import", keys, params).require(:fileUri, :fileType, :translationState)
|
71
134
|
file = ::File.open(file, 'rb') if file.is_a?(String)
|
72
|
-
return
|
135
|
+
return post_file(uri, :file => file)
|
73
136
|
end
|
74
137
|
end
|
75
138
|
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright 2016 Smartling, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
require 'smartling/api'
|
16
|
+
|
17
|
+
module Smartling
|
18
|
+
|
19
|
+
class Project < Api
|
20
|
+
|
21
|
+
# List Projects - /accounts-api/v2/accounts/{accountUid}/projects (GET)
|
22
|
+
def list(accountUid, params = nil)
|
23
|
+
uri = uri('accounts-api/v2/accounts/' + accountUid + '/projects', params)
|
24
|
+
return get(uri)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Project Details - /projects-api/v2/projects/{projectId} (GET)
|
28
|
+
def details(projectId, params = nil)
|
29
|
+
uri = uri('projects-api/v2/projects/' + projectId, params)
|
30
|
+
return get(uri)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
data/lib/smartling/uri.rb
CHANGED
@@ -52,7 +52,7 @@ module Smartling
|
|
52
52
|
params.map {|k,v|
|
53
53
|
if v.respond_to?(:to_ary)
|
54
54
|
v.to_ary.map {|w|
|
55
|
-
k.to_s + '=' + format_value(w)
|
55
|
+
k.to_s + '[]=' + format_value(w)
|
56
56
|
}.join('&')
|
57
57
|
else
|
58
58
|
k.to_s + '=' + format_value(v)
|
@@ -66,7 +66,7 @@ module Smartling
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def format_time(t)
|
69
|
-
t.utc.
|
69
|
+
t.utc.iso8601
|
70
70
|
end
|
71
71
|
|
72
72
|
end
|
data/lib/smartling/version.rb
CHANGED
data/samples/file_api.rb
CHANGED
@@ -21,92 +21,138 @@ def print_msg(msg)
|
|
21
21
|
puts msg
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
24
|
+
# change these values to use those found on the Project Settings -> API page in dashboard
|
25
|
+
USER_ID = 'USERID'
|
26
|
+
USER_SECRET = 'USERSECRET'
|
27
|
+
PROJECT_ID = 'PROJECTID'
|
26
28
|
|
27
29
|
print_msg "Smartling Ruby client #{Smartling::VERSION}"
|
28
30
|
|
29
|
-
# Initialize client to use File API on Sandbox
|
30
|
-
sl = Smartling::File.sandbox(:apiKey => API_KEY, :projectId => PROJECT_ID)
|
31
31
|
|
32
32
|
# Initialize client to use File API on Production
|
33
|
-
#
|
33
|
+
# To test in a sandbox account, create a new Files SANDBOX project in the Smartling dashboard and use the API key and project ID from that.
|
34
|
+
sl = Smartling::File.sandbox(:userId => USER_ID, :userSecret => USER_SECRET, :projectId => PROJECT_ID)
|
34
35
|
|
35
36
|
# Basic usage
|
36
37
|
|
38
|
+
begin
|
39
|
+
print_msg 'Listing all project files...'
|
40
|
+
res = sl.list
|
41
|
+
p res
|
42
|
+
rescue
|
43
|
+
end
|
44
|
+
|
37
45
|
file = 'data.yaml' # your data file
|
38
46
|
file_uri = 'my_files/data.yaml' # unique identifier given to the uploaded file
|
39
47
|
file_type = 'YAML' # file type
|
40
48
|
|
49
|
+
begin
|
41
50
|
print_msg "Uploading file '#{file}' using file URI '#{file_uri}' and file type '#{file_type}'..."
|
42
51
|
res = sl.upload(file, file_uri, file_type)
|
43
52
|
p res
|
53
|
+
rescue
|
54
|
+
end
|
44
55
|
|
56
|
+
begin
|
45
57
|
print_msg 'Listing all project files...'
|
46
58
|
res = sl.list
|
47
59
|
p res
|
60
|
+
rescue
|
61
|
+
end
|
48
62
|
|
49
|
-
lang = '
|
63
|
+
lang = 'fr-FR' # any language that exists in your project
|
50
64
|
state = 'PUBLISHED' # state at which imported strings are imported as
|
51
65
|
|
66
|
+
begin
|
52
67
|
print_msg "Getting status for file URI '#{file_uri}' and language '#{lang}'..."
|
53
|
-
res = sl.status(file_uri,
|
68
|
+
res = sl.status(file_uri, lang)
|
54
69
|
p res
|
70
|
+
rescue
|
71
|
+
end
|
55
72
|
|
73
|
+
begin
|
56
74
|
print_msg "Importing translation file '#{file}' using file URI '#{file_uri}' and file type '#{file_type}' and language '#{lang}' as '#{state}'..."
|
57
|
-
res = sl.import(file, file_uri, file_type, state
|
75
|
+
res = sl.import(lang, file, file_uri, file_type, state)
|
76
|
+
rescue
|
77
|
+
end
|
58
78
|
|
79
|
+
begin
|
59
80
|
print_msg "Downloading translations for file URI '#{file_uri}' and language '#{lang}'..."
|
60
|
-
data = sl.
|
81
|
+
data = sl.download_translated(file_uri, lang)
|
61
82
|
puts data
|
83
|
+
rescue
|
84
|
+
end
|
62
85
|
|
63
|
-
new_file_uri = 'my_files/
|
86
|
+
new_file_uri = 'my_files/newdata.yaml' # new uri to uniquely identify the previously uploaded file
|
64
87
|
|
88
|
+
begin
|
65
89
|
print_msg "Renaming file from '#{file_uri}' to '#{new_file_uri}'..."
|
66
90
|
sl.rename(file_uri, new_file_uri)
|
91
|
+
rescue
|
92
|
+
end
|
67
93
|
|
94
|
+
begin
|
68
95
|
print_msg "Deleting file '#{new_file_uri}'..."
|
69
96
|
sl.delete(new_file_uri)
|
97
|
+
rescue
|
98
|
+
end
|
70
99
|
|
71
100
|
# Extended parameters
|
72
|
-
|
101
|
+
begin
|
73
102
|
print_msg 'Uploading file with callback URL provided...'
|
74
103
|
res = sl.upload(file, 'name.yaml', 'YAML', :callbackUrl => 'http://yourdomain.com/someservice')
|
75
104
|
p res
|
105
|
+
rescue
|
106
|
+
end
|
76
107
|
|
108
|
+
begin
|
77
109
|
print_msg 'Uploading file with approved flag provided...'
|
78
|
-
res = sl.upload(file, 'name.yaml', 'YAML', :
|
110
|
+
res = sl.upload(file, 'name.yaml', 'YAML', :authorize => true)
|
79
111
|
p res
|
112
|
+
rescue
|
113
|
+
end
|
80
114
|
|
115
|
+
begin
|
81
116
|
print_msg 'Listing files using URI mask filter...'
|
82
117
|
res = sl.list(:uriMask => '%.yaml')
|
83
118
|
p res
|
119
|
+
rescue
|
120
|
+
end
|
84
121
|
|
122
|
+
begin
|
85
123
|
print_msg 'Listing files using file type filter...'
|
86
124
|
res = sl.list(:fileTypes => ['yaml', 'ios'])
|
87
125
|
p res
|
126
|
+
rescue
|
127
|
+
end
|
88
128
|
|
89
|
-
|
90
|
-
res = sl.list(:orderBy => ['fileUri', 'wordCount_desc'])
|
91
|
-
p res
|
92
|
-
|
129
|
+
begin
|
93
130
|
print_msg 'Listing paginated files...'
|
94
131
|
page, size = 2, 10
|
95
132
|
res = sl.list(:offset => (page - 1) * size, :limit => size)
|
96
133
|
p res
|
134
|
+
rescue
|
135
|
+
end
|
97
136
|
|
137
|
+
begin
|
98
138
|
print_msg 'Listing files uploaded after a certain date...'
|
99
|
-
res = sl.list(:lastUploadedAfter => Time.utc(
|
139
|
+
res = sl.list(:lastUploadedAfter => Time.utc(2016, 10, 30))
|
100
140
|
p res
|
141
|
+
rescue
|
142
|
+
end
|
101
143
|
|
144
|
+
begin
|
102
145
|
print_msg 'Listing files uploaded between a date range...'
|
103
|
-
res = sl.list(:lastUploadedAfter => Time.utc(
|
104
|
-
p res
|
105
|
-
|
106
|
-
print_msg 'Listing files using translation status...'
|
107
|
-
res = sl.list(:conditions => ['haveAllTranslated', 'haveAtLeastOneUnapproved'])
|
146
|
+
res = sl.list(:lastUploadedAfter => Time.utc(2016, 10, 30), :lastUploadedBefore => Time.utc(2016, 11, 10))
|
108
147
|
p res
|
148
|
+
rescue
|
149
|
+
end
|
109
150
|
|
151
|
+
begin
|
110
152
|
print_msg 'Listing files while combining multiple parameters...'
|
111
|
-
res = sl.list(:
|
153
|
+
res = sl.list(:uriMask => '%.yaml', :fileTypes => [:ios, :yaml],
|
154
|
+
:lastUploadedAfter => Time.now - 3600, :lastUploadedBefore => Time.now + 24*3600,
|
155
|
+
:offset => 0, :limit => 2)
|
112
156
|
p res
|
157
|
+
rescue
|
158
|
+
end
|
data/tests/api_test.rb
CHANGED
@@ -17,29 +17,34 @@ $:.unshift File.expand_path('../', __FILE__)
|
|
17
17
|
require 'test_helper'
|
18
18
|
|
19
19
|
module SmartlingTests
|
20
|
+
class StubResponse
|
21
|
+
attr_accessor :code, :body
|
22
|
+
end
|
23
|
+
|
20
24
|
class SmartlingApiTest < Test::Unit::TestCase
|
21
25
|
|
22
26
|
def stub_response(code, body)
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
RestClient::Response.create(body, status, {})
|
28
|
-
end
|
27
|
+
response = StubResponse.new()
|
28
|
+
response.code = code
|
29
|
+
response.body = body
|
30
|
+
return response
|
29
31
|
end
|
30
32
|
|
31
33
|
def test_endpoints
|
34
|
+
base = 'https://api.smartling.com/'
|
35
|
+
sb = 'https://api.stg.smartling.net/'
|
36
|
+
|
32
37
|
sl = Smartling::Api.new()
|
33
|
-
assert_equal(
|
38
|
+
assert_equal(base, sl.baseUrl)
|
34
39
|
|
35
|
-
sl = Smartling::Api.new(:baseUrl =>
|
36
|
-
assert_equal(
|
40
|
+
sl = Smartling::Api.new(:baseUrl => base)
|
41
|
+
assert_equal(base, sl.baseUrl)
|
37
42
|
|
38
|
-
sl = Smartling::Api.new(:baseUrl =>
|
39
|
-
assert_equal(
|
43
|
+
sl = Smartling::Api.new(:baseUrl => sb)
|
44
|
+
assert_equal(sb, sl.baseUrl)
|
40
45
|
|
41
46
|
sl = Smartling::Api.sandbox()
|
42
|
-
assert_equal(
|
47
|
+
assert_equal(sb, sl.baseUrl)
|
43
48
|
|
44
49
|
sl = Smartling::Api.new(:baseUrl => 'custom')
|
45
50
|
assert_equal('custom', sl.baseUrl)
|
@@ -63,10 +68,10 @@ module SmartlingTests
|
|
63
68
|
res = stub_response(200, '{"response":{"code":"SUCCESS", "data":"foo"}}')
|
64
69
|
assert_equal('foo', sl.process(res))
|
65
70
|
|
66
|
-
res = stub_response(200, '{"response":{"code":"ERROR", "
|
71
|
+
res = stub_response(200, '{"response":{"code":"ERROR", "errors":[]}}')
|
67
72
|
assert_raise RuntimeError do sl.process(res) end
|
68
73
|
|
69
|
-
res = stub_response(500, '{"response":{"code":"ERROR", "
|
74
|
+
res = stub_response(500, '{"response":{"code":"ERROR", "errors":[]}}')
|
70
75
|
assert_raise RuntimeError do sl.process(res) end
|
71
76
|
|
72
77
|
res = stub_response(500, '{"response":{"code":"ERROR"}}')
|
data/tests/srv_fileapi_test.rb
CHANGED
@@ -77,7 +77,7 @@ we have: cookies
|
|
77
77
|
|
78
78
|
res = nil
|
79
79
|
assert_nothing_raised do
|
80
|
-
res = sl.
|
80
|
+
res = sl.status_all(TEST_FILE_YAML)
|
81
81
|
end
|
82
82
|
@log.debug res.inspect
|
83
83
|
end
|
@@ -88,18 +88,18 @@ we have: cookies
|
|
88
88
|
|
89
89
|
res = nil
|
90
90
|
assert_nothing_raised do
|
91
|
-
res = sl.
|
91
|
+
res = sl.download_translated(TEST_FILE_YAML, 'en-US')
|
92
92
|
end
|
93
93
|
@log.debug res.inspect
|
94
94
|
end
|
95
95
|
|
96
96
|
def test_5_download_ru
|
97
|
-
@log.debug '-> FileAPI:download
|
97
|
+
@log.debug '-> FileAPI:download FR'
|
98
98
|
sl = Smartling::File.new(@config)
|
99
99
|
|
100
100
|
res = nil
|
101
101
|
assert_nothing_raised do
|
102
|
-
res = sl.
|
102
|
+
res = sl.download_translated(TEST_FILE_YAML, 'fr-FR')
|
103
103
|
end
|
104
104
|
@log.debug res.inspect
|
105
105
|
end
|
@@ -120,15 +120,13 @@ we have: cookies
|
|
120
120
|
|
121
121
|
@log.debug '-> FileAPI UTF-16 download EN'
|
122
122
|
assert_nothing_raised do
|
123
|
-
res = sl.download(TEST_FILE_UTF16
|
123
|
+
res = sl.download(TEST_FILE_UTF16)
|
124
124
|
end
|
125
125
|
@log.debug res.inspect
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
@log.debug '-> FileAPI UTF-16 download RU'
|
127
|
+
@log.debug '-> FileAPI UTF-16 download FR'
|
130
128
|
assert_nothing_raised do
|
131
|
-
res = sl.
|
129
|
+
res = sl.download_translated(TEST_FILE_UTF16, 'fr-FR')
|
132
130
|
end
|
133
131
|
@log.debug res.inspect
|
134
132
|
end
|
@@ -138,7 +136,7 @@ we have: cookies
|
|
138
136
|
sl = Smartling::File.new(@config)
|
139
137
|
res = nil
|
140
138
|
assert_nothing_raised do
|
141
|
-
res = sl.list(:
|
139
|
+
res = sl.list(:uriMask => '%.yaml', :fileTypes => [:ios, :yaml],
|
142
140
|
:lastUploadedAfter => Time.now - 3600, :lastUploadedBefore => Time.now + 24*3600,
|
143
141
|
:offset => 0, :limit => 2)
|
144
142
|
end
|
data/tests/test_helper.rb
CHANGED
data/tests/uri_test.rb
CHANGED
@@ -42,23 +42,23 @@ module SmartlingTests
|
|
42
42
|
|
43
43
|
uri = Smartling::Uri.new('http://hello.wo/')
|
44
44
|
uri.params = {:foo => Time.utc(2012, 04, 05, 11, 19, 59)}
|
45
|
-
assert_equal('http://hello.wo/?foo=2012-04-05T11:19:
|
45
|
+
assert_equal('http://hello.wo/?foo=2012-04-05T11:19:59Z', uri.to_s)
|
46
46
|
|
47
47
|
uri = Smartling::Uri.new('http://hello.wo/')
|
48
48
|
uri.params = {:foo => Time.utc(2012, 04, 05, 11, 49, 17).localtime}
|
49
|
-
assert_equal('http://hello.wo/?foo=2012-04-05T11:49:
|
49
|
+
assert_equal('http://hello.wo/?foo=2012-04-05T11:49:17Z', uri.to_s)
|
50
50
|
|
51
51
|
uri = Smartling::Uri.new('http://hello.wo/')
|
52
52
|
uri.params = {:foo => ['hello']}
|
53
|
-
assert_equal('http://hello.wo/?foo=hello', uri.to_s)
|
53
|
+
assert_equal('http://hello.wo/?foo[]=hello', uri.to_s)
|
54
54
|
|
55
55
|
uri = Smartling::Uri.new('http://hello.wo/')
|
56
56
|
uri.params = {:foo => ['hello', 'world']}
|
57
|
-
assert_equal('http://hello.wo/?foo=hello&foo=world', uri.to_s)
|
57
|
+
assert_equal('http://hello.wo/?foo[]=hello&foo[]=world', uri.to_s)
|
58
58
|
|
59
59
|
uri = Smartling::Uri.new('http://hello.wo/')
|
60
60
|
uri.params = {:foo => ['hello', 'world', 'of', Time.utc(2012)]}
|
61
|
-
assert_equal('http://hello.wo/?foo=hello&foo=world&foo=of&foo=2012-01-01T00:00:
|
61
|
+
assert_equal('http://hello.wo/?foo[]=hello&foo[]=world&foo[]=of&foo[]=2012-01-01T00:00:00Z', uri.to_s)
|
62
62
|
end
|
63
63
|
|
64
64
|
def test_require
|
@@ -90,7 +90,7 @@ module SmartlingTests
|
|
90
90
|
def test_encode
|
91
91
|
uri = Smartling::Uri.new('http://hello.wo/')
|
92
92
|
uri.params = {:foo => ['hello & world!']}
|
93
|
-
assert_equal('http://hello.wo/?foo=hello%20%26%20world%21', uri.to_s)
|
93
|
+
assert_equal('http://hello.wo/?foo[]=hello%20%26%20world%21', uri.to_s)
|
94
94
|
end
|
95
95
|
|
96
96
|
end
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartling
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Emilien Huet
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rest-client
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '2.0'
|
41
41
|
description: A Ruby library to utilize Smartling services
|
42
42
|
email:
|
43
43
|
- hi@smartling.com
|
@@ -50,6 +50,7 @@ files:
|
|
50
50
|
- lib/smartling.rb
|
51
51
|
- lib/smartling/api.rb
|
52
52
|
- lib/smartling/fileapi.rb
|
53
|
+
- lib/smartling/projectapi.rb
|
53
54
|
- lib/smartling/uri.rb
|
54
55
|
- lib/smartling/version.rb
|
55
56
|
- samples/data.yaml
|
@@ -69,23 +70,23 @@ require_paths:
|
|
69
70
|
- lib
|
70
71
|
required_ruby_version: !ruby/object:Gem::Requirement
|
71
72
|
requirements:
|
72
|
-
- -
|
73
|
+
- - ">="
|
73
74
|
- !ruby/object:Gem::Version
|
74
|
-
version: 1
|
75
|
+
version: '2.1'
|
75
76
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
76
77
|
requirements:
|
77
|
-
- -
|
78
|
+
- - ">="
|
78
79
|
- !ruby/object:Gem::Version
|
79
80
|
version: '0'
|
80
81
|
requirements: []
|
81
82
|
rubyforge_project:
|
82
|
-
rubygems_version: 2.
|
83
|
+
rubygems_version: 2.6.6
|
83
84
|
signing_key:
|
84
85
|
specification_version: 4
|
85
86
|
summary: Smartling SDK
|
86
87
|
test_files:
|
87
|
-
- tests/test_helper.rb
|
88
88
|
- tests/uri_test.rb
|
89
|
-
- tests/api_test.rb
|
90
89
|
- tests/config.sample
|
90
|
+
- tests/api_test.rb
|
91
|
+
- tests/test_helper.rb
|
91
92
|
- tests/srv_fileapi_test.rb
|