smartling 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +14 -0
- data/README.md +62 -0
- data/lib/smartling/api.rb +108 -0
- data/lib/smartling/fileapi.rb +69 -0
- data/lib/smartling/uri.rb +74 -0
- data/lib/smartling/version.rb +19 -0
- data/lib/smartling.rb +17 -0
- data/samples/file_api.rb +99 -0
- data/tests/api_test.rb +83 -0
- data/tests/config.sample +6 -0
- data/tests/srv_fileapi_test.rb +175 -0
- data/tests/test_helper.rb +60 -0
- data/tests/uri_test.rb +92 -0
- metadata +97 -0
data/LICENSE
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
Copyright 2012 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
|
+
|
data/README.md
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
[Smartling Translation API](http://docs.smartling.com)
|
2
|
+
=================
|
3
|
+
|
4
|
+
This repository contains the Ruby SDK for accessing the Smartling Translation API.
|
5
|
+
|
6
|
+
The Smartling Translation API lets developers to internationalize their website or app by automating the translation and integration of their site content.
|
7
|
+
Developers can upload resource files and download the translated files in a language of their choosing. There are options to allow for professional translation, community translation and machine translation.
|
8
|
+
|
9
|
+
For a full description of the Smartling Translation API, please read the docs at: http://docs.smartling.com
|
10
|
+
|
11
|
+
|
12
|
+
Quick start
|
13
|
+
-----------
|
14
|
+
|
15
|
+
Install latest gem package from RubyGems
|
16
|
+
|
17
|
+
`gem install smartling`
|
18
|
+
|
19
|
+
Follow the [sample code](https://github.com/Smartling/api-sdk-ruby/tree/master/samples) to upload and manage your files.
|
20
|
+
|
21
|
+
|
22
|
+
Bug tracker
|
23
|
+
-----------
|
24
|
+
|
25
|
+
Have a bug? Please create an issue here on GitHub!
|
26
|
+
|
27
|
+
https://github.com/Smartling/api-sdk-ruby/issues
|
28
|
+
|
29
|
+
|
30
|
+
Hacking
|
31
|
+
-------
|
32
|
+
|
33
|
+
To get source code, clone the repo:
|
34
|
+
|
35
|
+
`git clone git@github.com:Smartling/api-sdk-ruby.git`
|
36
|
+
|
37
|
+
To contribute, fork it and follow [general GitHub guidelines](http://help.github.com/fork-a-repo/) with pull request.
|
38
|
+
|
39
|
+
|
40
|
+
Authors
|
41
|
+
-------
|
42
|
+
|
43
|
+
* [Pavel Ivashkov](https://github.com/paiv)
|
44
|
+
|
45
|
+
|
46
|
+
Copyright and license
|
47
|
+
---------------------
|
48
|
+
|
49
|
+
Copyright 2012 Smartling, Inc.
|
50
|
+
|
51
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
52
|
+
you may not use this file except in compliance with the License.
|
53
|
+
You may obtain a copy of the License at
|
54
|
+
|
55
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
56
|
+
|
57
|
+
Unless required by applicable law or agreed to in writing, software
|
58
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
59
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
60
|
+
See the License for the specific language governing permissions and
|
61
|
+
limitations under the License.
|
62
|
+
|
@@ -0,0 +1,108 @@
|
|
1
|
+
# Copyright 2012 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 'rest-client'
|
16
|
+
require 'multi_json'
|
17
|
+
require 'smartling/uri'
|
18
|
+
|
19
|
+
module Smartling
|
20
|
+
|
21
|
+
module Endpoints
|
22
|
+
V1 = 'https://api.smartling.com/v1/'
|
23
|
+
SANDBOX_V1 = 'https://sandbox-api.smartling.com/v1/'
|
24
|
+
CURRENT = V1
|
25
|
+
SANDBOX = SANDBOX_V1
|
26
|
+
end
|
27
|
+
|
28
|
+
class Api
|
29
|
+
attr_accessor :apiKey, :projectId, :baseUrl
|
30
|
+
|
31
|
+
def initialize(args = {})
|
32
|
+
@apiKey = args[:apiKey]
|
33
|
+
@projectId = args[:projectId]
|
34
|
+
@baseUrl = args[:baseUrl] || Endpoints::CURRENT
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.sandbox(args = {})
|
38
|
+
new(args.merge(:baseUrl => Endpoints::SANDBOX))
|
39
|
+
end
|
40
|
+
|
41
|
+
def uri(path, params1 = nil, params2 = nil)
|
42
|
+
uri = Uri.new(@baseUrl, path)
|
43
|
+
params = { :apiKey => @apiKey, :projectId => @projectId }
|
44
|
+
params.merge!(params1) if params1
|
45
|
+
params.merge!(params2) if params2
|
46
|
+
uri.params = params
|
47
|
+
uri.require(:apiKey, :projectId)
|
48
|
+
return uri
|
49
|
+
end
|
50
|
+
|
51
|
+
def check_response(res)
|
52
|
+
return if res.code == 200
|
53
|
+
raise format_api_error(res.body)
|
54
|
+
end
|
55
|
+
|
56
|
+
def process(res)
|
57
|
+
check_response(res)
|
58
|
+
body = MultiJson.decode(res.body)
|
59
|
+
body = body['response']
|
60
|
+
raise format_api_error(res.body) unless body && body['code'] == 'SUCCESS'
|
61
|
+
return body['data']
|
62
|
+
end
|
63
|
+
|
64
|
+
def format_api_error(res)
|
65
|
+
begin
|
66
|
+
body = MultiJson.decode(res.body)
|
67
|
+
rescue
|
68
|
+
end
|
69
|
+
body = body['response'] if body
|
70
|
+
code = body['code'] if body
|
71
|
+
msg = body['messages'] if body
|
72
|
+
msg = msg.join(' -- ') if msg.is_a?(Array)
|
73
|
+
return "API error: #{code} #{msg}" if code
|
74
|
+
return res.description
|
75
|
+
end
|
76
|
+
|
77
|
+
def get(uri)
|
78
|
+
RestClient.get(uri) {|res, _, _|
|
79
|
+
process(res)
|
80
|
+
}
|
81
|
+
end
|
82
|
+
def get_raw(uri)
|
83
|
+
RestClient.get(uri) {|res, _, _|
|
84
|
+
check_response(res)
|
85
|
+
res.body
|
86
|
+
}
|
87
|
+
end
|
88
|
+
def post(uri, params = nil)
|
89
|
+
RestClient.post(uri, params) {|res, _, _|
|
90
|
+
process(res)
|
91
|
+
}
|
92
|
+
end
|
93
|
+
def delete(uri)
|
94
|
+
RestClient.delete(uri) {|res, _, _|
|
95
|
+
process(res)
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
def log=(v)
|
100
|
+
RestClient.log = v
|
101
|
+
end
|
102
|
+
def proxy=(v)
|
103
|
+
RestClient.proxy = v
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Copyright 2012 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
|
+
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
|
+
end
|
27
|
+
|
28
|
+
class File < Api
|
29
|
+
alias :api_delete :delete
|
30
|
+
|
31
|
+
def list(params = nil)
|
32
|
+
uri = uri(Services::FILE_LIST, params)
|
33
|
+
return get(uri.to_s)
|
34
|
+
end
|
35
|
+
|
36
|
+
def status(name, params)
|
37
|
+
keys = { :fileUri => name }
|
38
|
+
uri = uri(Services::FILE_STATUS, keys, params).require(:fileUri, :locale)
|
39
|
+
return get(uri.to_s)
|
40
|
+
end
|
41
|
+
|
42
|
+
def download(name, params = nil)
|
43
|
+
keys = { :fileUri => name }
|
44
|
+
uri = uri(Services::FILE_GET, keys, params).require(:fileUri)
|
45
|
+
return get_raw(uri.to_s)
|
46
|
+
end
|
47
|
+
|
48
|
+
def upload(file, name, type, params = nil)
|
49
|
+
keys = { :fileUri => name, :fileType => type }
|
50
|
+
uri = uri(Services::FILE_UPLOAD, keys, params).require(:fileUri, :fileType)
|
51
|
+
file = ::File.open(file, 'rb') if file.is_a?(String)
|
52
|
+
return post(uri.to_s, :file => file)
|
53
|
+
end
|
54
|
+
|
55
|
+
def rename(name, newname, params = nil)
|
56
|
+
keys = { :fileUri => name, :newFileUri => newname }
|
57
|
+
uri = uri(Services::FILE_RENAME, keys, params).require(:fileUri, :newFileUri)
|
58
|
+
return post(uri.to_s)
|
59
|
+
end
|
60
|
+
|
61
|
+
def delete(name, params = nil)
|
62
|
+
keys = { :fileUri => name }
|
63
|
+
uri = uri(Services::FILE_DELETE, keys, params).require(:fileUri)
|
64
|
+
return api_delete(uri.to_s)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# Copyright 2012 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
|
+
module Smartling
|
16
|
+
class Uri
|
17
|
+
attr_accessor :base, :path, :params, :required
|
18
|
+
|
19
|
+
def initialize(base, path = nil)
|
20
|
+
@base = base
|
21
|
+
@path = path
|
22
|
+
@required = []
|
23
|
+
end
|
24
|
+
|
25
|
+
def require(*args)
|
26
|
+
@required += args
|
27
|
+
return self
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_uri
|
31
|
+
params = @params || {}
|
32
|
+
required = @required || []
|
33
|
+
params.delete_if {|k,v| v.nil? || v.to_s.size <= 0 }
|
34
|
+
missing = required - params.keys
|
35
|
+
raise ArgumentError, "Missing parameters: " + missing.inspect if missing.size > 0
|
36
|
+
|
37
|
+
uri = URI.parse(@base)
|
38
|
+
uri.merge!(@path) if @path
|
39
|
+
if params.size > 0
|
40
|
+
uri.query = format_query(params)
|
41
|
+
end
|
42
|
+
return uri
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
to_uri.to_s
|
47
|
+
end
|
48
|
+
|
49
|
+
def format_query(params)
|
50
|
+
# TODO: UTF-8 encode keys and values
|
51
|
+
# URI.encode_www_form(params)
|
52
|
+
params.map {|k,v|
|
53
|
+
if v.respond_to?(:to_ary)
|
54
|
+
v.to_ary.map {|w|
|
55
|
+
k.to_s + '=' + format_value(w)
|
56
|
+
}.join('&')
|
57
|
+
else
|
58
|
+
k.to_s + '=' + format_value(v)
|
59
|
+
end
|
60
|
+
}.join('&')
|
61
|
+
end
|
62
|
+
|
63
|
+
def format_value(v)
|
64
|
+
v.is_a?(Time) ? format_time(v) :
|
65
|
+
URI.escape(v.to_s)
|
66
|
+
end
|
67
|
+
|
68
|
+
def format_time(t)
|
69
|
+
t.utc.strftime('%Y-%m-%dT%H:%M:%S')
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright 2012 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
|
+
module Smartling
|
16
|
+
# This follows Semantic Versioning http://semver.org/
|
17
|
+
VERSION = '0.5.1'
|
18
|
+
end
|
19
|
+
|
data/lib/smartling.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
# Copyright 2012 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/version'
|
16
|
+
require 'smartling/fileapi'
|
17
|
+
|
data/samples/file_api.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Copyright 2012 Smartling, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require 'rubygems'
|
17
|
+
require 'smartling'
|
18
|
+
|
19
|
+
API_KEY = 'YOUR_APIKEY'
|
20
|
+
PROJECT_ID = 'YOUR_PROJECTID'
|
21
|
+
|
22
|
+
puts 'Smartling Ruby client ' + Smartling::VERSION
|
23
|
+
|
24
|
+
|
25
|
+
# Initialize client to sandbox
|
26
|
+
sl = Smartling::File.sandbox(:apiKey => API_KEY, :projectId => PROJECT_ID)
|
27
|
+
|
28
|
+
# Initialize client for production File API
|
29
|
+
#sl = Smartling::File.new(:apiKey => API_KEY, :projectId => PROJECT_ID)
|
30
|
+
|
31
|
+
# Upload YAML file
|
32
|
+
res = sl.upload('source_file.yaml', 'name.yaml', 'YAML')
|
33
|
+
p res
|
34
|
+
|
35
|
+
# Get list of uploaded files
|
36
|
+
res = sl.list()
|
37
|
+
p res
|
38
|
+
|
39
|
+
name = 'path/file_name.yaml'
|
40
|
+
lang = 'es-ES'
|
41
|
+
|
42
|
+
# Request translation status of the file
|
43
|
+
res = sl.status(name, :locale => lang)
|
44
|
+
p res
|
45
|
+
|
46
|
+
# Download translated file in specified language
|
47
|
+
data = sl.download(name, :locale => lang)
|
48
|
+
puts data
|
49
|
+
|
50
|
+
# Rename file
|
51
|
+
newname = 'path/newname.yaml'
|
52
|
+
sl.rename(name, newname)
|
53
|
+
|
54
|
+
# Delete file
|
55
|
+
sl.delete(name)
|
56
|
+
|
57
|
+
# Extended parameters
|
58
|
+
|
59
|
+
# Upload with callback URL
|
60
|
+
res = sl.upload('source_file.yaml', 'name.yaml', 'YAML', :callbackUrl => 'http://yourdomain/someservice')
|
61
|
+
p res
|
62
|
+
|
63
|
+
# Upload with approved flag
|
64
|
+
res = sl.upload('source_file.yaml', 'name.yaml', 'YAML', :approved => true)
|
65
|
+
p res
|
66
|
+
|
67
|
+
# Filter list by mask
|
68
|
+
res = sl.list(:uriMask => '%.yaml')
|
69
|
+
p res
|
70
|
+
|
71
|
+
# Filter list by file type
|
72
|
+
res = sl.list(:fileTypes => ['yaml', 'ios'])
|
73
|
+
p res
|
74
|
+
|
75
|
+
# Order list by attribute
|
76
|
+
res = sl.list(:orderBy => ['fileUri', 'wordCount_desc'])
|
77
|
+
p res
|
78
|
+
|
79
|
+
# Page by page list
|
80
|
+
page, size = 2, 10
|
81
|
+
res = sl.list(:offset => (page - 1) * size, :limit => size)
|
82
|
+
p res
|
83
|
+
|
84
|
+
# Filter list by upload date
|
85
|
+
res = sl.list(:lastUploadedAfter => Time.utc(2012, 04, 05))
|
86
|
+
p res
|
87
|
+
|
88
|
+
# Filter list by upload date range
|
89
|
+
res = sl.list(:lastUploadedAfter => Time.utc(2012, 04, 01), :lastUploadedBefore => Time.utc(2012, 05, 01))
|
90
|
+
p res
|
91
|
+
|
92
|
+
# Filter by translation status
|
93
|
+
res = sl.list(:conditions => ['haveAllTranslated', 'haveAtLeastOneUnapproved'])
|
94
|
+
p res
|
95
|
+
|
96
|
+
# Combine multiple filter parameters in a single query
|
97
|
+
res = sl.list(:fileTypes => 'yaml', :orderBy => 'fileUri', :offset => 20, :limit => 10)
|
98
|
+
p res
|
99
|
+
|
data/tests/api_test.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Copyright 2012 Smartling, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
$:.unshift File.expand_path('../', __FILE__)
|
17
|
+
require 'test_helper'
|
18
|
+
|
19
|
+
module SmartlingTests
|
20
|
+
class SmartlingApiTest < Test::Unit::TestCase
|
21
|
+
|
22
|
+
def stub_response(code, body)
|
23
|
+
status = Net::HTTPResponse.new('', code, '')
|
24
|
+
RestClient::Response.create(body, status, {})
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_endpoints
|
28
|
+
sl = Smartling::Api.new()
|
29
|
+
assert_equal(Smartling::Endpoints::CURRENT, sl.baseUrl)
|
30
|
+
|
31
|
+
sl = Smartling::Api.new(:baseUrl => Smartling::Endpoints::V1)
|
32
|
+
assert_equal(Smartling::Endpoints::V1, sl.baseUrl)
|
33
|
+
|
34
|
+
sl = Smartling::Api.new(:baseUrl => Smartling::Endpoints::SANDBOX)
|
35
|
+
assert_equal(Smartling::Endpoints::SANDBOX, sl.baseUrl)
|
36
|
+
|
37
|
+
sl = Smartling::Api.sandbox()
|
38
|
+
assert_equal(Smartling::Endpoints::SANDBOX, sl.baseUrl)
|
39
|
+
|
40
|
+
sl = Smartling::Api.new(:baseUrl => 'custom')
|
41
|
+
assert_equal('custom', sl.baseUrl)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_response_format
|
45
|
+
sl = Smartling::Api.new()
|
46
|
+
|
47
|
+
res = stub_response(200, '{"response":{"code":"SUCCESS", "data":"foo"}}')
|
48
|
+
assert_equal('foo', sl.process(res))
|
49
|
+
|
50
|
+
res = stub_response(200, '{"response":{"code":"SUCCESS", "data":null}}')
|
51
|
+
res = sl.process(res)
|
52
|
+
assert(res.nil?)
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_error_response
|
57
|
+
sl = Smartling::Api.new()
|
58
|
+
|
59
|
+
res = stub_response(200, '{"response":{"code":"SUCCESS", "data":"foo"}}')
|
60
|
+
assert_equal('foo', sl.process(res))
|
61
|
+
|
62
|
+
res = stub_response(200, '{"response":{"code":"ERROR", "messages":[]}}')
|
63
|
+
assert_raise RuntimeError do sl.process(res) end
|
64
|
+
|
65
|
+
res = stub_response(500, '{"response":{"code":"ERROR", "messages":[]}}')
|
66
|
+
assert_raise RuntimeError do sl.process(res) end
|
67
|
+
|
68
|
+
res = stub_response(500, '{"response":{"code":"ERROR"}}')
|
69
|
+
assert_raise RuntimeError do sl.process(res) end
|
70
|
+
|
71
|
+
res = stub_response(500, '{"response":null}')
|
72
|
+
assert_raise RuntimeError do sl.process(res) end
|
73
|
+
|
74
|
+
res = stub_response(500, '{}')
|
75
|
+
assert_raise RuntimeError do sl.process(res) end
|
76
|
+
|
77
|
+
res = stub_response(200, '{}')
|
78
|
+
assert_raise RuntimeError do sl.process(res) end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
data/tests/config.sample
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Copyright 2012 Smartling, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
$:.unshift File.expand_path('../', __FILE__)
|
17
|
+
require 'test_helper'
|
18
|
+
require 'iconv'
|
19
|
+
|
20
|
+
module SmartlingTests
|
21
|
+
class SmartlingFileApiTest < Test::Unit::TestCase
|
22
|
+
|
23
|
+
TEST_FILE_YAML = 'tests/upload.yaml'
|
24
|
+
TEST_FILE_UTF16 = 'tests/utf16.yaml'
|
25
|
+
|
26
|
+
def setup
|
27
|
+
@config = SmartlingTests.server_config
|
28
|
+
@log = SmartlingTests.logger
|
29
|
+
end
|
30
|
+
|
31
|
+
def yaml_file(encoding = nil)
|
32
|
+
data = <<-EOL
|
33
|
+
hello: world
|
34
|
+
we have: cookies
|
35
|
+
EOL
|
36
|
+
data = Iconv.conv(encoding, 'US-ASCII', data) if encoding
|
37
|
+
f = Tempfile.new('smartling_tests')
|
38
|
+
f.write(data)
|
39
|
+
f.flush
|
40
|
+
f.pos = 0
|
41
|
+
return f
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_1_list
|
45
|
+
@log.debug '<- FileAPI:list'
|
46
|
+
sl = Smartling::File.new(@config)
|
47
|
+
res = nil
|
48
|
+
assert_nothing_raised do res = sl.list end
|
49
|
+
@log.debug res.inspect
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_2_upload
|
53
|
+
@log.debug '<- FileAPI:upload'
|
54
|
+
sl = Smartling::File.new(@config)
|
55
|
+
|
56
|
+
res = nil
|
57
|
+
assert_nothing_raised do
|
58
|
+
res = sl.upload(yaml_file, TEST_FILE_YAML, 'YAML')
|
59
|
+
end
|
60
|
+
@log.debug res.inspect
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_3_status
|
64
|
+
@log.debug '<- FileAPI:status'
|
65
|
+
sl = Smartling::File.new(@config)
|
66
|
+
|
67
|
+
res = nil
|
68
|
+
assert_nothing_raised do
|
69
|
+
res = sl.status(TEST_FILE_YAML, :locale => 'en-US')
|
70
|
+
end
|
71
|
+
@log.debug res.inspect
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_4_download_en
|
75
|
+
@log.debug '-> FileAPI:download EN'
|
76
|
+
sl = Smartling::File.new(@config)
|
77
|
+
|
78
|
+
res = nil
|
79
|
+
assert_nothing_raised do
|
80
|
+
res = sl.download(TEST_FILE_YAML, :locale => 'en-US')
|
81
|
+
end
|
82
|
+
@log.debug res.inspect
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_5_download_ru
|
86
|
+
@log.debug '-> FileAPI:download RU'
|
87
|
+
sl = Smartling::File.new(@config)
|
88
|
+
|
89
|
+
res = nil
|
90
|
+
assert_nothing_raised do
|
91
|
+
res = sl.download(TEST_FILE_YAML, :locale => 'ru-RU')
|
92
|
+
end
|
93
|
+
@log.debug res.inspect
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_6_utf16
|
97
|
+
@log.debug '<- FileAPI UTF-16 upload'
|
98
|
+
sl = Smartling::File.new(@config)
|
99
|
+
|
100
|
+
file = yaml_file('UTF-16')
|
101
|
+
data = file.read
|
102
|
+
file.pos = 0
|
103
|
+
|
104
|
+
res = nil
|
105
|
+
assert_nothing_raised do
|
106
|
+
res = sl.upload(file, TEST_FILE_UTF16, 'YAML')
|
107
|
+
end
|
108
|
+
@log.debug res.inspect
|
109
|
+
|
110
|
+
@log.debug '-> FileAPI UTF-16 download EN'
|
111
|
+
assert_nothing_raised do
|
112
|
+
res = sl.download(TEST_FILE_UTF16, :locale => 'en-US')
|
113
|
+
end
|
114
|
+
@log.debug res.inspect
|
115
|
+
|
116
|
+
assert_equal(YAML.load(data), YAML.load(res))
|
117
|
+
|
118
|
+
@log.debug '-> FileAPI UTF-16 download RU'
|
119
|
+
assert_nothing_raised do
|
120
|
+
res = sl.download(TEST_FILE_UTF16, :locale => 'ru-RU')
|
121
|
+
end
|
122
|
+
@log.debug res.inspect
|
123
|
+
end
|
124
|
+
|
125
|
+
def test_7_filter
|
126
|
+
@log.debug '-> FileAPI full filter test'
|
127
|
+
sl = Smartling::File.new(@config)
|
128
|
+
res = nil
|
129
|
+
assert_nothing_raised do
|
130
|
+
res = sl.list(:locale => 'ru-RU', :uriMask => '%.yaml', :fileTypes => [:ios, :yaml],
|
131
|
+
:lastUploadedAfter => Time.now - 3600, :lastUploadedBefore => Time.now + 24*3600,
|
132
|
+
:offset => 0, :limit => 2)
|
133
|
+
end
|
134
|
+
@log.debug res.inspect
|
135
|
+
# FIXME: when sandbox adds support for filter parameters
|
136
|
+
assert(res['fileCount'] <= 2) unless sl.baseUrl == Smartling::Endpoints::SANDBOX
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_8_rename
|
140
|
+
@log.debug '-> FileAPI rename file'
|
141
|
+
sl = Smartling::File.new(@config)
|
142
|
+
res = nil
|
143
|
+
assert_nothing_raised do
|
144
|
+
res = sl.rename(TEST_FILE_YAML, 'foo/foo/foo')
|
145
|
+
res = sl.rename('foo/foo/foo', TEST_FILE_YAML)
|
146
|
+
end
|
147
|
+
@log.debug res.inspect
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_9_callbackurl
|
151
|
+
@log.debug '-> FileAPI upload with callback URL'
|
152
|
+
sl = Smartling::File.new(@config)
|
153
|
+
res = nil
|
154
|
+
assert_nothing_raised do
|
155
|
+
res = sl.upload(yaml_file, TEST_FILE_YAML, 'YAML', :callbackUrl => 'http://google.com/?q=hello')
|
156
|
+
end
|
157
|
+
@log.debug res.inspect
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_99_delete
|
161
|
+
# NOTE: might break the tests following this and uploading with the same name
|
162
|
+
# until server actually deletes the file.
|
163
|
+
@log.debug '<- FileAPI:delete'
|
164
|
+
sl = Smartling::File.new(@config)
|
165
|
+
|
166
|
+
res = nil
|
167
|
+
assert_nothing_raised do
|
168
|
+
res = sl.delete(TEST_FILE_YAML)
|
169
|
+
end
|
170
|
+
@log.debug res.inspect
|
171
|
+
end
|
172
|
+
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Copyright 2012 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
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
16
|
+
require 'rubygems'
|
17
|
+
require 'logger'
|
18
|
+
require 'smartling'
|
19
|
+
require 'test/unit'
|
20
|
+
require 'yaml'
|
21
|
+
|
22
|
+
class Hash
|
23
|
+
def keysym!
|
24
|
+
keys.each {|key|
|
25
|
+
self[(key.to_sym rescue key) || key] = delete(key)
|
26
|
+
}
|
27
|
+
self
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module SmartlingTests
|
32
|
+
CONFIG = 'tests/config'
|
33
|
+
|
34
|
+
class << self
|
35
|
+
|
36
|
+
def config
|
37
|
+
return @config if @config
|
38
|
+
return unless File.exists?(CONFIG)
|
39
|
+
h = YAML.load_file(CONFIG)
|
40
|
+
@config = h.keysym!
|
41
|
+
end
|
42
|
+
|
43
|
+
def server_config
|
44
|
+
cfg = config() or raise 'Missing config file for server tests'
|
45
|
+
h = cfg[:server]
|
46
|
+
h.keysym!
|
47
|
+
end
|
48
|
+
|
49
|
+
def logger
|
50
|
+
l = Logger.new($stderr)
|
51
|
+
l.level = config[:loglevel]
|
52
|
+
l.formatter = proc {|sev, dt, prg, msg|
|
53
|
+
"#{sev}: #{msg}\n"
|
54
|
+
}
|
55
|
+
return l
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
data/tests/uri_test.rb
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
# Copyright 2012 Smartling, Inc.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
$:.unshift File.expand_path('../', __FILE__)
|
17
|
+
require 'test_helper'
|
18
|
+
|
19
|
+
module SmartlingTests
|
20
|
+
class SmartlingUriTest < Test::Unit::TestCase
|
21
|
+
|
22
|
+
def test_base
|
23
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
24
|
+
assert_equal('http://hello.wo/', uri.to_s)
|
25
|
+
|
26
|
+
uri = Smartling::Uri.new('http://hello.wo/', 'foo/bar')
|
27
|
+
assert_equal('http://hello.wo/foo/bar', uri.to_s)
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_params
|
31
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
32
|
+
uri.params = {:foo => 'x'}
|
33
|
+
assert_equal('http://hello.wo/?foo=x', uri.to_s)
|
34
|
+
|
35
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
36
|
+
uri.params = {:foo => 18}
|
37
|
+
assert_equal('http://hello.wo/?foo=18', uri.to_s)
|
38
|
+
|
39
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
40
|
+
uri.params = {:foo => true}
|
41
|
+
assert_equal('http://hello.wo/?foo=true', uri.to_s)
|
42
|
+
|
43
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
44
|
+
uri.params = {:foo => Time.utc(2012, 04, 05, 11, 19, 59)}
|
45
|
+
assert_equal('http://hello.wo/?foo=2012-04-05T11:19:59', uri.to_s)
|
46
|
+
|
47
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
48
|
+
uri.params = {:foo => Time.utc(2012, 04, 05, 11, 49, 17).localtime}
|
49
|
+
assert_equal('http://hello.wo/?foo=2012-04-05T11:49:17', uri.to_s)
|
50
|
+
|
51
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
52
|
+
uri.params = {:foo => ['hello']}
|
53
|
+
assert_equal('http://hello.wo/?foo=hello', uri.to_s)
|
54
|
+
|
55
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
56
|
+
uri.params = {:foo => ['hello', 'world']}
|
57
|
+
assert_equal('http://hello.wo/?foo=hello&foo=world', uri.to_s)
|
58
|
+
|
59
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
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:00', uri.to_s)
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_require
|
65
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
66
|
+
uri.require(:foo, :bar)
|
67
|
+
assert_raise ArgumentError do uri.to_s end
|
68
|
+
|
69
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
70
|
+
uri.params = {:foo => 'x', :bar => 'y'}
|
71
|
+
uri.require(:foo, :bar)
|
72
|
+
assert_nothing_raised do uri.to_s end
|
73
|
+
|
74
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
75
|
+
uri.params = {:foo => 'x', :baz => 'z'}
|
76
|
+
uri.require(:foo, :bar)
|
77
|
+
assert_raise ArgumentError do uri.to_s end
|
78
|
+
|
79
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
80
|
+
uri.params = {:bar => 'y', :baz => 'z', :foo => 'x'}
|
81
|
+
uri.require(:foo, :baz)
|
82
|
+
assert_nothing_raised do uri.to_s end
|
83
|
+
|
84
|
+
uri = Smartling::Uri.new('http://hello.wo/')
|
85
|
+
uri.require()
|
86
|
+
assert_nothing_raised do uri.to_s end
|
87
|
+
assert_equal('http://hello.wo/', uri.to_s)
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: smartling
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Pavel Ivashkov
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-04-29 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: multi_json
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - "~>"
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '1.0'
|
21
|
+
none: false
|
22
|
+
requirement: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
none: false
|
28
|
+
prerelease: false
|
29
|
+
type: :runtime
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rest-client
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - "~>"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '1.6'
|
37
|
+
none: false
|
38
|
+
requirement: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.6'
|
43
|
+
none: false
|
44
|
+
prerelease: false
|
45
|
+
type: :runtime
|
46
|
+
description: A Ruby library to utilize Smartling services
|
47
|
+
email:
|
48
|
+
- hi@smartling.com
|
49
|
+
executables: []
|
50
|
+
extensions: []
|
51
|
+
extra_rdoc_files: []
|
52
|
+
files:
|
53
|
+
- README.md
|
54
|
+
- LICENSE
|
55
|
+
- lib/smartling.rb
|
56
|
+
- lib/smartling/api.rb
|
57
|
+
- lib/smartling/fileapi.rb
|
58
|
+
- lib/smartling/uri.rb
|
59
|
+
- lib/smartling/version.rb
|
60
|
+
- samples/file_api.rb
|
61
|
+
- tests/api_test.rb
|
62
|
+
- tests/config.sample
|
63
|
+
- tests/srv_fileapi_test.rb
|
64
|
+
- tests/test_helper.rb
|
65
|
+
- tests/uri_test.rb
|
66
|
+
homepage: https://docs.smartling.com
|
67
|
+
licenses:
|
68
|
+
- LICENSE
|
69
|
+
post_install_message:
|
70
|
+
rdoc_options: []
|
71
|
+
require_paths:
|
72
|
+
- lib
|
73
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 1.8.6
|
78
|
+
none: false
|
79
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: !binary |-
|
84
|
+
MA==
|
85
|
+
none: false
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 1.8.24
|
89
|
+
signing_key:
|
90
|
+
specification_version: 3
|
91
|
+
summary: Smartling SDK
|
92
|
+
test_files:
|
93
|
+
- tests/api_test.rb
|
94
|
+
- tests/config.sample
|
95
|
+
- tests/srv_fileapi_test.rb
|
96
|
+
- tests/test_helper.rb
|
97
|
+
- tests/uri_test.rb
|