crowdin-api 1.0.0 → 1.1.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 +4 -4
- data/.gitignore +6 -3
- data/.rubocop_todo.yml +34 -13
- data/README.md +29 -22
- data/bin/crowdin-console +10 -7
- data/crowdin-api.gemspec +7 -4
- data/lib/crowdin-api/api-resources/languages.rb +3 -3
- data/lib/crowdin-api/api-resources/projects.rb +14 -7
- data/lib/crowdin-api/api-resources/source_files.rb +44 -54
- data/lib/crowdin-api/api-resources/source_strings.rb +74 -0
- data/lib/crowdin-api/api-resources/storages.rb +5 -5
- data/lib/crowdin-api/api-resources/translation_status.rb +14 -22
- data/lib/crowdin-api/api-resources/translations.rb +24 -30
- data/lib/crowdin-api/api-resources/workflows.rb +59 -0
- data/lib/crowdin-api/client/client.rb +32 -32
- data/lib/crowdin-api/client/configuration.rb +8 -5
- data/lib/crowdin-api/client/version.rb +1 -1
- data/lib/crowdin-api/core/api_errors_raiser.rb +29 -0
- data/lib/crowdin-api/core/errors.rb +1 -14
- data/lib/crowdin-api/core/request.rb +35 -11
- data/lib/crowdin-api.rb +4 -3
- data/spec/core/config-instance_spec.rb +50 -13
- data/spec/spec_helper.rb +6 -0
- metadata +25 -8
- data/lib/crowdin-api/core/payload.rb +0 -26
@@ -1,14 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
#
|
3
4
|
# The Crowdin::Client library is used for interactions with a crowdin.com website.
|
4
5
|
#
|
5
6
|
# == Example
|
6
7
|
#
|
7
|
-
#
|
8
|
+
# require 'crowdin-api'
|
9
|
+
#
|
10
|
+
# crowdin = Crowdin::Client.new do |config|
|
11
|
+
# config.api_token = 'YOUR_API_TOKEN'
|
12
|
+
# end
|
8
13
|
#
|
9
|
-
#
|
10
|
-
# config.api_token = 'YOUR_API_TOKEN'
|
11
|
-
# end
|
14
|
+
# crowdin.list_projects
|
12
15
|
#
|
13
16
|
module Crowdin
|
14
17
|
class Client
|
@@ -24,59 +27,56 @@ module Crowdin
|
|
24
27
|
include ApiResources::Storages
|
25
28
|
include ApiResources::TranslationStatus
|
26
29
|
include ApiResources::Translations
|
30
|
+
include ApiResources::Workflows
|
31
|
+
include ApiResources::SourceStrings
|
32
|
+
|
33
|
+
include Errors::ApiErrorsRaiser
|
34
|
+
|
35
|
+
attr_accessor :logger
|
27
36
|
|
28
37
|
attr_reader :config
|
29
|
-
attr_reader :options
|
30
38
|
attr_reader :connection
|
39
|
+
attr_reader :options
|
31
40
|
|
32
|
-
def initialize
|
33
|
-
|
34
|
-
|
35
|
-
@config = Crowdin::Configuration.new
|
36
|
-
yield config
|
41
|
+
def initialize(&block)
|
42
|
+
build_configuration(&block)
|
37
43
|
|
38
44
|
check_logger
|
45
|
+
check_rest_client_proxy
|
39
46
|
|
40
|
-
set_rest_client_proxy!
|
41
|
-
|
42
|
-
build_options
|
43
47
|
build_connection
|
44
48
|
end
|
45
49
|
|
46
50
|
def log!(message)
|
47
|
-
|
48
|
-
|
49
|
-
logger.debug(message)
|
51
|
+
!config.logger_enabled? || logger.debug(message)
|
50
52
|
end
|
51
53
|
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
private
|
55
|
+
|
56
|
+
def build_configuration
|
57
|
+
@config = Crowdin::Configuration.new
|
58
|
+
yield config if block_given?
|
55
59
|
end
|
56
60
|
|
57
|
-
|
61
|
+
def build_connection
|
62
|
+
@connection ||= ::RestClient::Resource.new(config.base_url, build_options)
|
63
|
+
end
|
58
64
|
|
59
65
|
def build_options
|
60
|
-
@options
|
61
|
-
options[:headers] = config.headers
|
66
|
+
@options ||= config.options.merge(headers: config.headers)
|
62
67
|
end
|
63
68
|
|
64
|
-
def
|
65
|
-
|
69
|
+
def set_default_logger
|
70
|
+
require 'logger'
|
71
|
+
@logger ||= Logger.new($stderr)
|
66
72
|
end
|
67
73
|
|
68
|
-
|
69
|
-
|
70
|
-
def set_rest_client_proxy!
|
74
|
+
def check_rest_client_proxy
|
71
75
|
ENV['http_proxy'] ? ::RestClient.proxy = ENV['http_proxy'] : false
|
72
76
|
end
|
73
77
|
|
74
78
|
def check_logger
|
75
|
-
config.enable_logger
|
76
|
-
end
|
77
|
-
|
78
|
-
def logger
|
79
|
-
@logger ||= Logger.new($stderr)
|
79
|
+
config.logger_enabled? ? set_default_logger : config.enable_logger = false
|
80
80
|
end
|
81
81
|
end
|
82
82
|
end
|
@@ -9,6 +9,9 @@ module Crowdin
|
|
9
9
|
|
10
10
|
attr_reader :target_api_url
|
11
11
|
|
12
|
+
alias logger_enabled? enable_logger
|
13
|
+
alias enterprise_mode? organization_domain
|
14
|
+
|
12
15
|
def initialize
|
13
16
|
@target_api_url = '/api/v2'
|
14
17
|
end
|
@@ -31,11 +34,11 @@ module Crowdin
|
|
31
34
|
end
|
32
35
|
|
33
36
|
def base_url
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
37
|
+
if enterprise_mode?
|
38
|
+
organization_domain.include?('.com') ? organization_domain : "https://#{organization_domain}.api.crowdin.com"
|
39
|
+
else
|
40
|
+
'https://api.crowdin.com'
|
41
|
+
end
|
39
42
|
end
|
40
43
|
end
|
41
44
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crowdin
|
4
|
+
module Errors
|
5
|
+
module ApiErrorsRaiser
|
6
|
+
def raise_only_for_enterprise_mode_error
|
7
|
+
raise(OnlyForEnterpriseMode, 'This method can be called only for Enterprise mode')
|
8
|
+
end
|
9
|
+
|
10
|
+
def raise_project_id_is_required_error
|
11
|
+
raise(ArgumentError, ':project_id is required in parameters or while Client initialization')
|
12
|
+
end
|
13
|
+
|
14
|
+
def raise_parameter_is_required_error(parameter)
|
15
|
+
raise(ArgumentError, ":#{parameter} is required")
|
16
|
+
end
|
17
|
+
|
18
|
+
# crowdin-console errors
|
19
|
+
|
20
|
+
def raise_api_token_is_required_error
|
21
|
+
raise(ArgumentError, '--api-token option is required')
|
22
|
+
end
|
23
|
+
|
24
|
+
def raise_organization_domain_is_required_error
|
25
|
+
raise(ArgumentError, '--organization-domain option is required for Enterprise mode')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -2,19 +2,6 @@
|
|
2
2
|
|
3
3
|
module Crowdin
|
4
4
|
module Errors
|
5
|
-
class
|
6
|
-
attr_reader :key, :error_code, :error_message
|
7
|
-
|
8
|
-
def initialize(key, error_code, error_message)
|
9
|
-
@key = key
|
10
|
-
@error_code = error_code.to_i
|
11
|
-
@error_message = error_message
|
12
|
-
@message = "#{key} => #{error_code}: #{error_message}"
|
13
|
-
end
|
14
|
-
|
15
|
-
def to_s
|
16
|
-
@message
|
17
|
-
end
|
18
|
-
end
|
5
|
+
class OnlyForEnterpriseMode < StandardError; end
|
19
6
|
end
|
20
7
|
end
|
@@ -9,7 +9,7 @@ module Crowdin
|
|
9
9
|
@client = client
|
10
10
|
@method = method
|
11
11
|
@full_path = client.config.target_api_url + path
|
12
|
-
@payload =
|
12
|
+
@payload = perform_payload(query)
|
13
13
|
@headers = headers
|
14
14
|
@destination = destination
|
15
15
|
@errors = []
|
@@ -20,13 +20,15 @@ module Crowdin
|
|
20
20
|
process_response!
|
21
21
|
end
|
22
22
|
|
23
|
+
private
|
24
|
+
|
23
25
|
def process_request!
|
24
26
|
return @response = client.connection[@full_path].delete if delete_request?
|
25
27
|
return @response = client.connection[@full_path].get(@payload) if get_request?
|
26
28
|
|
27
29
|
client.connection[@full_path].send(@method, @payload, @headers) { |response, _, _| @response = response }
|
28
30
|
rescue StandardError => error
|
29
|
-
client.log! error
|
31
|
+
client.log! error
|
30
32
|
|
31
33
|
@errors << "Something went wrong while proccessing request. Details - #{error.class}"
|
32
34
|
end
|
@@ -36,14 +38,19 @@ module Crowdin
|
|
36
38
|
|
37
39
|
begin
|
38
40
|
if @response
|
39
|
-
doc = JSON.parse(@response.body)
|
40
|
-
|
41
41
|
client.log! "args: #{@response.request.args}"
|
42
|
-
client.log! "body: #{doc}"
|
43
42
|
|
44
|
-
|
43
|
+
if @response.body.empty?
|
44
|
+
@response.code
|
45
|
+
else
|
46
|
+
doc = JSON.parse(@response.body)
|
47
|
+
|
48
|
+
client.log! "body: #{doc}"
|
45
49
|
|
46
|
-
|
50
|
+
data = fetch_response_data(doc)
|
51
|
+
|
52
|
+
@errors.any? ? fetch_errors : data
|
53
|
+
end
|
47
54
|
end
|
48
55
|
rescue StandardError => error
|
49
56
|
client.log! error
|
@@ -54,10 +61,10 @@ module Crowdin
|
|
54
61
|
end
|
55
62
|
end
|
56
63
|
|
57
|
-
|
64
|
+
def perform_payload(query)
|
65
|
+
return query if query.is_a?(File)
|
58
66
|
|
59
|
-
|
60
|
-
@errors.join(';')
|
67
|
+
get_request? ? { params: fetch_cleared_query(query) } : fetch_cleared_query(query).to_json
|
61
68
|
end
|
62
69
|
|
63
70
|
def download_file(url)
|
@@ -71,14 +78,31 @@ module Crowdin
|
|
71
78
|
@errors << "Something went wrong while downloading file. Details - #{error.class}"
|
72
79
|
end
|
73
80
|
|
81
|
+
def fetch_errors
|
82
|
+
@errors.join(';')
|
83
|
+
end
|
84
|
+
|
74
85
|
def fetch_response_data(doc)
|
75
|
-
if doc['data'].is_a?(Hash) && doc['data']['url'] && doc['data']['url'].
|
86
|
+
if doc['data'].is_a?(Hash) && doc['data']['url'] && doc['data']['url'].include?('response-content-disposition')
|
76
87
|
download_file(doc['data']['url'])
|
77
88
|
else
|
78
89
|
doc
|
79
90
|
end
|
80
91
|
end
|
81
92
|
|
93
|
+
def fetch_cleared_query(query)
|
94
|
+
case query
|
95
|
+
when Array
|
96
|
+
query.map do |el|
|
97
|
+
el.reject { |_, value| value.nil? }
|
98
|
+
end.reject(&:empty?)
|
99
|
+
when Hash
|
100
|
+
query.reject { |_, value| value.nil? }
|
101
|
+
else
|
102
|
+
query
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
82
106
|
def get_request?
|
83
107
|
@method.eql?(:get)
|
84
108
|
end
|
data/lib/crowdin-api.rb
CHANGED
@@ -2,14 +2,13 @@
|
|
2
2
|
|
3
3
|
# Libs
|
4
4
|
require 'json'
|
5
|
-
require 'logger'
|
6
5
|
require 'open-uri'
|
7
6
|
require 'rest-client'
|
8
7
|
|
9
8
|
# Core modules
|
10
|
-
require 'crowdin-api/core/payload'
|
11
|
-
require 'crowdin-api/core/request'
|
12
9
|
require 'crowdin-api/core/errors'
|
10
|
+
require 'crowdin-api/core/api_errors_raiser'
|
11
|
+
require 'crowdin-api/core/request'
|
13
12
|
|
14
13
|
# Api modules
|
15
14
|
require 'crowdin-api/api-resources/languages'
|
@@ -18,6 +17,8 @@ require 'crowdin-api/api-resources/source_files'
|
|
18
17
|
require 'crowdin-api/api-resources/storages'
|
19
18
|
require 'crowdin-api/api-resources/translation_status'
|
20
19
|
require 'crowdin-api/api-resources/translations'
|
20
|
+
require 'crowdin-api/api-resources/workflows'
|
21
|
+
require 'crowdin-api/api-resources/source_strings'
|
21
22
|
|
22
23
|
# Client
|
23
24
|
require 'crowdin-api/client/version'
|
@@ -1,35 +1,72 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
describe 'Config instance' do
|
4
|
-
|
4
|
+
before do
|
5
5
|
@crowdin = Crowdin::Client.new do |config|
|
6
|
+
config.api_token = 'api_token'
|
6
7
|
config.project_id = 1
|
7
8
|
end
|
9
|
+
end
|
8
10
|
|
11
|
+
it 'show have a #project_id' do
|
9
12
|
expect(@crowdin.config.project_id).to_not be_nil
|
10
13
|
end
|
11
14
|
|
12
|
-
it 'should have a api_token' do
|
13
|
-
@crowdin
|
14
|
-
|
15
|
+
it 'should have a #api_token' do
|
16
|
+
expect(@crowdin.config.api_token).to_not be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it '#target_api_url should equal /api/v2 by default' do
|
20
|
+
expect(@crowdin.config.target_api_url).to eq('/api/v2')
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#logger_enabled?' do
|
24
|
+
it 'should be false by default' do
|
25
|
+
expect(@crowdin.config.logger_enabled?).to be_falsey
|
15
26
|
end
|
16
27
|
|
17
|
-
|
28
|
+
it 'should equal specified argument' do
|
29
|
+
@crowdin = Crowdin::Client.new do |config|
|
30
|
+
config.enable_logger = true
|
31
|
+
end
|
32
|
+
|
33
|
+
expect(@crowdin.config.logger_enabled?).to be_truthy
|
34
|
+
end
|
18
35
|
end
|
19
36
|
|
20
|
-
|
21
|
-
|
22
|
-
config.
|
37
|
+
describe '#enterprise_mode?' do
|
38
|
+
it 'should be false by default' do
|
39
|
+
expect(@crowdin.config.enterprise_mode?).to be_falsey
|
23
40
|
end
|
24
41
|
|
25
|
-
|
42
|
+
it 'should equal specified arguments' do
|
43
|
+
@crowdin = Crowdin::Client.new do |config|
|
44
|
+
config.organization_domain = 'organization_domain'
|
45
|
+
end
|
46
|
+
|
47
|
+
expect(@crowdin.config.enterprise_mode?).to be_truthy
|
48
|
+
end
|
26
49
|
end
|
27
50
|
|
28
|
-
|
29
|
-
|
30
|
-
config.
|
51
|
+
describe '#base_url' do
|
52
|
+
it 'should equal https://api.crowdin.com by default' do
|
53
|
+
expect(@crowdin.config.base_url).to eq('https://api.crowdin.com')
|
31
54
|
end
|
32
55
|
|
33
|
-
|
56
|
+
it 'should equal specified organization domain' do
|
57
|
+
@crowdin = Crowdin::Client.new do |config|
|
58
|
+
config.organization_domain = 'organization_domain'
|
59
|
+
end
|
60
|
+
|
61
|
+
expect(@crowdin.config.base_url).to eq('https://organization_domain.api.crowdin.com')
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should equal full specified organization domain when user specify full url (with .com)' do
|
65
|
+
@crowdin = Crowdin::Client.new do |config|
|
66
|
+
config.organization_domain = 'organization_domain.com'
|
67
|
+
end
|
68
|
+
|
69
|
+
expect(@crowdin.config.base_url).to eq('organization_domain.com')
|
70
|
+
end
|
34
71
|
end
|
35
72
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crowdin-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Crowdin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: open-uri
|
@@ -70,6 +70,20 @@ dependencies:
|
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
72
|
version: 2.2.32
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: codecov
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 0.6.0
|
80
|
+
type: :development
|
81
|
+
prerelease: false
|
82
|
+
version_requirements: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - "~>"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: 0.6.0
|
73
87
|
- !ruby/object:Gem::Dependency
|
74
88
|
name: rake
|
75
89
|
requirement: !ruby/object:Gem::Requirement
|
@@ -146,9 +160,10 @@ dependencies:
|
|
146
160
|
- - "~>"
|
147
161
|
- !ruby/object:Gem::Version
|
148
162
|
version: '3.14'
|
149
|
-
description: Ruby Client
|
163
|
+
description: The Crowdin Ruby Client is used to interact with the Crowdin API from
|
164
|
+
Ruby
|
150
165
|
email:
|
151
|
-
- support@crowdin.
|
166
|
+
- support@crowdin.com
|
152
167
|
executables:
|
153
168
|
- crowdin-console
|
154
169
|
extensions: []
|
@@ -173,19 +188,21 @@ files:
|
|
173
188
|
- lib/crowdin-api/api-resources/languages.rb
|
174
189
|
- lib/crowdin-api/api-resources/projects.rb
|
175
190
|
- lib/crowdin-api/api-resources/source_files.rb
|
191
|
+
- lib/crowdin-api/api-resources/source_strings.rb
|
176
192
|
- lib/crowdin-api/api-resources/storages.rb
|
177
193
|
- lib/crowdin-api/api-resources/translation_status.rb
|
178
194
|
- lib/crowdin-api/api-resources/translations.rb
|
195
|
+
- lib/crowdin-api/api-resources/workflows.rb
|
179
196
|
- lib/crowdin-api/client/client.rb
|
180
197
|
- lib/crowdin-api/client/configuration.rb
|
181
198
|
- lib/crowdin-api/client/version.rb
|
199
|
+
- lib/crowdin-api/core/api_errors_raiser.rb
|
182
200
|
- lib/crowdin-api/core/errors.rb
|
183
|
-
- lib/crowdin-api/core/payload.rb
|
184
201
|
- lib/crowdin-api/core/request.rb
|
185
202
|
- spec/core/config-instance_spec.rb
|
186
203
|
- spec/crowdin-api_spec.rb
|
187
204
|
- spec/spec_helper.rb
|
188
|
-
homepage: https://github.com/crowdin/crowdin-api
|
205
|
+
homepage: https://github.com/crowdin/crowdin-api-client-ruby
|
189
206
|
licenses:
|
190
207
|
- MIT
|
191
208
|
metadata: {}
|
@@ -197,7 +214,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
197
214
|
requirements:
|
198
215
|
- - ">="
|
199
216
|
- !ruby/object:Gem::Version
|
200
|
-
version: '
|
217
|
+
version: '2.4'
|
201
218
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
202
219
|
requirements:
|
203
220
|
- - ">="
|
@@ -207,5 +224,5 @@ requirements: []
|
|
207
224
|
rubygems_version: 3.0.3.1
|
208
225
|
signing_key:
|
209
226
|
specification_version: 4
|
210
|
-
summary: Client
|
227
|
+
summary: Ruby Client for the Crowdin API
|
211
228
|
test_files: []
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Crowdin
|
4
|
-
module Web
|
5
|
-
class Payload
|
6
|
-
attr_reader :method, :query
|
7
|
-
|
8
|
-
def initialize(method, query)
|
9
|
-
@method = method
|
10
|
-
@query = query
|
11
|
-
end
|
12
|
-
|
13
|
-
def perform
|
14
|
-
return @query if @query.is_a?(File)
|
15
|
-
|
16
|
-
@method.eql?(:get) ? { params: fetch_cleared_query } : fetch_cleared_query.to_json
|
17
|
-
end
|
18
|
-
|
19
|
-
private
|
20
|
-
|
21
|
-
def fetch_cleared_query
|
22
|
-
@query.reject { |_, value| value.nil? }
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|