crowdin-api 0.4.0 → 1.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 -5
- data/.github/workflows/build-and-publish.yml +30 -0
- data/.github/workflows/test-and-lint.yml +31 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +5 -0
- data/.rubocop_todo.yml +118 -0
- data/CODE_OF_CONDUCT.md +128 -0
- data/CONTRIBUTING.md +71 -0
- data/Gemfile +5 -0
- data/LICENSE +1 -1
- data/README.md +107 -267
- data/Rakefile +19 -0
- data/bin/crowdin-console +51 -0
- data/bin/setup +6 -0
- data/crowdin-api.gemspec +30 -0
- data/lib/crowdin-api/api-resources/languages.rb +81 -0
- data/lib/crowdin-api/api-resources/projects.rb +127 -0
- data/lib/crowdin-api/api-resources/source_files.rb +313 -0
- data/lib/crowdin-api/api-resources/storages.rb +102 -0
- data/lib/crowdin-api/api-resources/translation_status.rb +97 -0
- data/lib/crowdin-api/api-resources/translations.rb +166 -0
- data/lib/crowdin-api/client/client.rb +82 -0
- data/lib/crowdin-api/client/configuration.rb +41 -0
- data/lib/crowdin-api/client/version.rb +7 -0
- data/lib/crowdin-api/core/errors.rb +20 -0
- data/lib/crowdin-api/core/payload.rb +26 -0
- data/lib/crowdin-api/core/request.rb +91 -0
- data/lib/crowdin-api.rb +22 -125
- data/spec/core/config-instance_spec.rb +35 -0
- data/spec/crowdin-api_spec.rb +7 -0
- data/spec/spec_helper.rb +3 -0
- metadata +125 -22
- data/lib/crowdin-api/errors.rb +0 -23
- data/lib/crowdin-api/methods.rb +0 -427
- data/lib/crowdin-api/version.rb +0 -5
@@ -0,0 +1,166 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crowdin
|
4
|
+
module ApiResources
|
5
|
+
module Translations
|
6
|
+
def pre_translation_status(pre_translation_id = nil, project_id = config.project_id)
|
7
|
+
pre_translation_id || raise(ArgumentError, ':pre_translation_id is required')
|
8
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
9
|
+
|
10
|
+
request = Web::Request.new(
|
11
|
+
self,
|
12
|
+
:get,
|
13
|
+
"/projects/#{project_id}/pre-translations/#{pre_translation_id}"
|
14
|
+
)
|
15
|
+
|
16
|
+
request.perform
|
17
|
+
end
|
18
|
+
|
19
|
+
def apply_pre_translation(query = {}, project_id = config.project_id)
|
20
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
21
|
+
|
22
|
+
request = Web::Request.new(
|
23
|
+
self,
|
24
|
+
:post,
|
25
|
+
"/projects/#{project_id}/pre-translations",
|
26
|
+
query
|
27
|
+
)
|
28
|
+
|
29
|
+
request.perform
|
30
|
+
end
|
31
|
+
|
32
|
+
def build_project_directory_translation(directory_id = nil, query = {})
|
33
|
+
project_id = query[:project_id] || config.project_id
|
34
|
+
|
35
|
+
directory_id || raise(ArgumentError, ':directory_id is required')
|
36
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
37
|
+
|
38
|
+
request = Web::Request.new(
|
39
|
+
self,
|
40
|
+
:post,
|
41
|
+
"/projects/#{project_id}/translations/builds/directories/#{directory_id}",
|
42
|
+
query
|
43
|
+
)
|
44
|
+
|
45
|
+
request.perform
|
46
|
+
end
|
47
|
+
|
48
|
+
def build_project_file_translation(file_id = nil, query = {})
|
49
|
+
project_id = query[:project_id] || config.project_id
|
50
|
+
|
51
|
+
file_id || raise(ArgumentError, ':file_id is required')
|
52
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
53
|
+
|
54
|
+
headers = query[:eTag] ? { 'If-None-Match' => query[:eTag] } : {}
|
55
|
+
|
56
|
+
request = Web::Request.new(
|
57
|
+
self,
|
58
|
+
:post,
|
59
|
+
"/projects/#{project_id}/translations/builds/files/#{file_id}",
|
60
|
+
query,
|
61
|
+
headers
|
62
|
+
)
|
63
|
+
|
64
|
+
request.perform
|
65
|
+
end
|
66
|
+
|
67
|
+
def list_project_builds(query = {}, project_id = config.project_id)
|
68
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
69
|
+
|
70
|
+
request = Web::Request.new(
|
71
|
+
self,
|
72
|
+
:get,
|
73
|
+
"/projects/#{project_id}/translations/builds",
|
74
|
+
query
|
75
|
+
)
|
76
|
+
|
77
|
+
request.perform
|
78
|
+
end
|
79
|
+
|
80
|
+
def build_project_translation(query = {}, project_id = config.project_id)
|
81
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
82
|
+
|
83
|
+
request = Web::Request.new(
|
84
|
+
self,
|
85
|
+
:post,
|
86
|
+
"/projects/#{project_id}/translations/builds",
|
87
|
+
query
|
88
|
+
)
|
89
|
+
|
90
|
+
request.perform
|
91
|
+
end
|
92
|
+
|
93
|
+
def upload_translations(language_id = nil, query = {})
|
94
|
+
project_id = query[:project_id] || config.project_id
|
95
|
+
|
96
|
+
language_id || raise(ArgumentError, ':language_id is required')
|
97
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
98
|
+
|
99
|
+
request = Web::Request.new(
|
100
|
+
self,
|
101
|
+
:post,
|
102
|
+
"/projects/#{project_id}/translations/#{language_id}",
|
103
|
+
query
|
104
|
+
)
|
105
|
+
|
106
|
+
request.perform
|
107
|
+
end
|
108
|
+
|
109
|
+
def download_project_translations(destinaton = nil, build_id = nil, project_id = config.project_id)
|
110
|
+
destinaton || raise(ArgumentError, ':destination is required for downlaods')
|
111
|
+
build_id || raise(ArgumentError, ':build_id is required')
|
112
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
113
|
+
|
114
|
+
request = Web::Request.new(
|
115
|
+
self,
|
116
|
+
:get,
|
117
|
+
"/projects/#{project_id}/translations/builds/#{build_id}/download",
|
118
|
+
{},
|
119
|
+
{},
|
120
|
+
destinaton
|
121
|
+
)
|
122
|
+
|
123
|
+
request.perform
|
124
|
+
end
|
125
|
+
|
126
|
+
def check_project_build_status(build_id = nil, project_id = config.project_id)
|
127
|
+
build_id || raise(ArgumentError, ':build_id is required')
|
128
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
129
|
+
|
130
|
+
request = Web::Request.new(
|
131
|
+
self,
|
132
|
+
:get,
|
133
|
+
"/projects/#{project_id}/translations/builds/#{build_id}"
|
134
|
+
)
|
135
|
+
|
136
|
+
request.perform
|
137
|
+
end
|
138
|
+
|
139
|
+
def cancel_build(build_id = nil, project_id = config.project_id)
|
140
|
+
build_id || raise(ArgumentError, ':build_id is required')
|
141
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
142
|
+
|
143
|
+
request = Web::Request.new(
|
144
|
+
self,
|
145
|
+
:delete,
|
146
|
+
"/projects/#{project_id}/translations/builds/#{build_id}"
|
147
|
+
)
|
148
|
+
|
149
|
+
request.perform
|
150
|
+
end
|
151
|
+
|
152
|
+
def export_project_translation(query = {}, project_id = config.project_id)
|
153
|
+
project_id || raise(ArgumentError, ':project_id is required in parameters or when initialize Client')
|
154
|
+
|
155
|
+
request = Web::Request.new(
|
156
|
+
self,
|
157
|
+
:post,
|
158
|
+
"/projects/#{project_id}/translations/exports",
|
159
|
+
query
|
160
|
+
)
|
161
|
+
|
162
|
+
request.perform
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# The Crowdin::Client library is used for interactions with a crowdin.com website.
|
4
|
+
#
|
5
|
+
# == Example
|
6
|
+
#
|
7
|
+
# require 'crowdin-api'
|
8
|
+
#
|
9
|
+
# crowdin = Crowdin::Client.new do |config|
|
10
|
+
# config.api_token = 'YOUR_API_TOKEN'
|
11
|
+
# end
|
12
|
+
#
|
13
|
+
module Crowdin
|
14
|
+
class Client
|
15
|
+
# A wrapper and interface to the Crowdin api. Please visit the Crowdin developers
|
16
|
+
# site for a full explanation of what each of the Crowdin api methods
|
17
|
+
# expect and perform.
|
18
|
+
#
|
19
|
+
# https://support.crowdin.com/api/v2/
|
20
|
+
#
|
21
|
+
include ApiResources::Languages
|
22
|
+
include ApiResources::Projects
|
23
|
+
include ApiResources::SourceFiles
|
24
|
+
include ApiResources::Storages
|
25
|
+
include ApiResources::TranslationStatus
|
26
|
+
include ApiResources::Translations
|
27
|
+
|
28
|
+
attr_reader :config
|
29
|
+
attr_reader :options
|
30
|
+
attr_reader :connection
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
raise ArgumentError, 'block with configurations not given' unless block_given?
|
34
|
+
|
35
|
+
@config = Crowdin::Configuration.new
|
36
|
+
yield config
|
37
|
+
|
38
|
+
check_logger
|
39
|
+
|
40
|
+
set_rest_client_proxy!
|
41
|
+
|
42
|
+
build_options
|
43
|
+
build_connection
|
44
|
+
end
|
45
|
+
|
46
|
+
def log!(message)
|
47
|
+
return true unless config.logger_enabled?
|
48
|
+
|
49
|
+
logger.debug(message)
|
50
|
+
end
|
51
|
+
|
52
|
+
def logger=(logger)
|
53
|
+
@logger = logger
|
54
|
+
config.enable_logger = true
|
55
|
+
end
|
56
|
+
|
57
|
+
protected
|
58
|
+
|
59
|
+
def build_options
|
60
|
+
@options = config.options
|
61
|
+
options[:headers] = config.headers
|
62
|
+
end
|
63
|
+
|
64
|
+
def build_connection
|
65
|
+
@connection = ::RestClient::Resource.new(config.base_url, options)
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def set_rest_client_proxy!
|
71
|
+
ENV['http_proxy'] ? ::RestClient.proxy = ENV['http_proxy'] : false
|
72
|
+
end
|
73
|
+
|
74
|
+
def check_logger
|
75
|
+
config.enable_logger ||= false
|
76
|
+
end
|
77
|
+
|
78
|
+
def logger
|
79
|
+
@logger ||= Logger.new($stderr)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crowdin
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :api_token
|
6
|
+
attr_accessor :project_id
|
7
|
+
attr_accessor :organization_domain
|
8
|
+
attr_accessor :enable_logger
|
9
|
+
|
10
|
+
attr_reader :target_api_url
|
11
|
+
|
12
|
+
def initialize
|
13
|
+
@target_api_url = '/api/v2'
|
14
|
+
end
|
15
|
+
|
16
|
+
def options
|
17
|
+
{
|
18
|
+
headers: {},
|
19
|
+
timeout: nil,
|
20
|
+
json: true
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
def headers
|
25
|
+
{
|
26
|
+
'Accept' => 'application/json',
|
27
|
+
'Authorization' => "Bearer #{api_token}",
|
28
|
+
'Content-Type' => 'application/json',
|
29
|
+
'User-Agent' => "crowdin-rb/#{Crowdin::Client::VERSION}/#{RUBY_VERSION}/#{RUBY_PLATFORM}"
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def base_url
|
34
|
+
organization_domain ? "https://#{organization_domain}.api.crowdin.com" : 'https://api.crowdin.com'
|
35
|
+
end
|
36
|
+
|
37
|
+
def logger_enabled?
|
38
|
+
enable_logger
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crowdin
|
4
|
+
module Errors
|
5
|
+
class Error < StandardError
|
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
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,26 @@
|
|
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
|
@@ -0,0 +1,91 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Crowdin
|
4
|
+
module Web
|
5
|
+
class Request
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
def initialize(client, method, path, query = {}, headers = {}, destination = nil)
|
9
|
+
@client = client
|
10
|
+
@method = method
|
11
|
+
@full_path = client.config.target_api_url + path
|
12
|
+
@payload = Payload.new(method, query).perform
|
13
|
+
@headers = headers
|
14
|
+
@destination = destination
|
15
|
+
@errors = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def perform
|
19
|
+
process_request!
|
20
|
+
process_response!
|
21
|
+
end
|
22
|
+
|
23
|
+
def process_request!
|
24
|
+
return @response = client.connection[@full_path].delete if delete_request?
|
25
|
+
return @response = client.connection[@full_path].get(@payload) if get_request?
|
26
|
+
|
27
|
+
client.connection[@full_path].send(@method, @payload, @headers) { |response, _, _| @response = response }
|
28
|
+
rescue StandardError => error
|
29
|
+
client.log! error.class
|
30
|
+
|
31
|
+
@errors << "Something went wrong while proccessing request. Details - #{error.class}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def process_response!
|
35
|
+
return fetch_errors if @errors.any?
|
36
|
+
|
37
|
+
begin
|
38
|
+
if @response
|
39
|
+
doc = JSON.parse(@response.body)
|
40
|
+
|
41
|
+
client.log! "args: #{@response.request.args}"
|
42
|
+
client.log! "body: #{doc}"
|
43
|
+
|
44
|
+
data = fetch_response_data(doc)
|
45
|
+
|
46
|
+
@errors.any? ? fetch_errors : data
|
47
|
+
end
|
48
|
+
rescue StandardError => error
|
49
|
+
client.log! error
|
50
|
+
|
51
|
+
@errors << "Something went wrong while proccessing response. Details - #{error.class}"
|
52
|
+
|
53
|
+
fetch_errors
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def fetch_errors
|
60
|
+
@errors.join(';')
|
61
|
+
end
|
62
|
+
|
63
|
+
def download_file(url)
|
64
|
+
download = URI.parse(url).open
|
65
|
+
IO.copy_stream(download, @destination)
|
66
|
+
|
67
|
+
@destination
|
68
|
+
rescue StandardError => error
|
69
|
+
client.log! error
|
70
|
+
|
71
|
+
@errors << "Something went wrong while downloading file. Details - #{error.class}"
|
72
|
+
end
|
73
|
+
|
74
|
+
def fetch_response_data(doc)
|
75
|
+
if doc['data'].is_a?(Hash) && doc['data']['url'] && doc['data']['url'].scan(/response-content-disposition/)
|
76
|
+
download_file(doc['data']['url'])
|
77
|
+
else
|
78
|
+
doc
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_request?
|
83
|
+
@method.eql?(:get)
|
84
|
+
end
|
85
|
+
|
86
|
+
def delete_request?
|
87
|
+
@method.eql?(:delete)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
data/lib/crowdin-api.rb
CHANGED
@@ -1,128 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Libs
|
1
4
|
require 'json'
|
5
|
+
require 'logger'
|
6
|
+
require 'open-uri'
|
2
7
|
require 'rest-client'
|
3
8
|
|
4
|
-
|
5
|
-
require
|
6
|
-
require
|
7
|
-
|
8
|
-
|
9
|
-
#
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
class << self
|
22
|
-
# Default logger for all Crowdin::API instances
|
23
|
-
#
|
24
|
-
# Crowdin::API.log = Logger.new($stderr)
|
25
|
-
#
|
26
|
-
attr_accessor :log
|
27
|
-
end
|
28
|
-
|
29
|
-
# Create a new API object using the given parameters.
|
30
|
-
#
|
31
|
-
# @param [String] api_key the authentication API key can be found on the project settings page
|
32
|
-
# @param [String] project_id the project identifier.
|
33
|
-
# @param [String] account_key the account API Key
|
34
|
-
# @param [String] base_url the url of the Crowdin API
|
35
|
-
#
|
36
|
-
def initialize(options = {})
|
37
|
-
@api_key = options.delete(:api_key)
|
38
|
-
@project_id = options.delete(:project_id)
|
39
|
-
@account_key = options.delete(:account_key)
|
40
|
-
@base_url = options.delete(:base_url) || 'https://api.crowdin.com'
|
41
|
-
|
42
|
-
@log = nil
|
43
|
-
|
44
|
-
options = {
|
45
|
-
:headers => {},
|
46
|
-
:params => {},
|
47
|
-
:timeout => nil,
|
48
|
-
:open_timeout => nil,
|
49
|
-
:key => @api_key,
|
50
|
-
:'account-key' => @account_key,
|
51
|
-
:json => true
|
52
|
-
}.merge(options)
|
53
|
-
|
54
|
-
options[:headers] = {
|
55
|
-
'Accept' => 'application/json',
|
56
|
-
'User-Agent' => "crowdin-rb/#{Crowdin::API::VERSION}",
|
57
|
-
'X-Ruby-Version' => RUBY_VERSION,
|
58
|
-
'X-Ruby-Platform' => RUBY_PLATFORM
|
59
|
-
}.merge(options[:headers])
|
60
|
-
|
61
|
-
options[:params] = {
|
62
|
-
:key => @api_key,
|
63
|
-
:'account-key' => @account_key,
|
64
|
-
:json => true
|
65
|
-
}.merge(options[:params])
|
66
|
-
|
67
|
-
RestClient.proxy = ENV['http_proxy'] if ENV['http_proxy']
|
68
|
-
@connection = RestClient::Resource.new(@base_url, options)
|
69
|
-
end
|
70
|
-
|
71
|
-
def request(params, &block)
|
72
|
-
# Returns a query hash with non nil values.
|
73
|
-
params[:query].reject! { |_, value| value.nil? } if params[:query]
|
74
|
-
|
75
|
-
case params[:method]
|
76
|
-
when :post
|
77
|
-
query = @connection.options.merge(params[:query] || {})
|
78
|
-
@connection[params[:path]].post(query) { |response, _, _|
|
79
|
-
@response = response
|
80
|
-
}
|
81
|
-
when :get
|
82
|
-
query = @connection.options[:params].merge(params[:query] || {})
|
83
|
-
@connection[params[:path]].get(:params => query) { |response, _, _|
|
84
|
-
@response = response
|
85
|
-
}
|
86
|
-
end
|
87
|
-
|
88
|
-
log.debug("args: #{@response.args}") if log
|
89
|
-
|
90
|
-
if @response.headers[:content_disposition]
|
91
|
-
filename = params[:output] || @response.headers[:content_disposition][/attachment; filename="(.+?)"/, 1]
|
92
|
-
body = @response.body
|
93
|
-
file = open(filename, 'wb')
|
94
|
-
file.write(body)
|
95
|
-
file.close
|
96
|
-
return true
|
97
|
-
else
|
98
|
-
doc = JSON.load(@response.body)
|
99
|
-
log.debug("body: #{doc}") if log
|
100
|
-
|
101
|
-
if doc.kind_of?(Hash) && doc['success'] == false
|
102
|
-
code = doc['error']['code']
|
103
|
-
message = doc['error']['message']
|
104
|
-
error = Crowdin::API::Errors::Error.new(code, message)
|
105
|
-
raise(error)
|
106
|
-
else
|
107
|
-
return doc
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
# The current logger. If no logger has been set Crowdin::API.log is used.
|
114
|
-
#
|
115
|
-
def log
|
116
|
-
@log || Crowdin::API.log
|
117
|
-
end
|
118
|
-
|
119
|
-
# Sets the +logger+ used by this instance of Crowdin::API
|
120
|
-
#
|
121
|
-
def log= logger
|
122
|
-
@log = logger
|
123
|
-
end
|
124
|
-
|
125
|
-
private
|
126
|
-
|
127
|
-
end
|
128
|
-
end
|
9
|
+
# Core modules
|
10
|
+
require 'crowdin-api/core/payload'
|
11
|
+
require 'crowdin-api/core/request'
|
12
|
+
require 'crowdin-api/core/errors'
|
13
|
+
|
14
|
+
# Api modules
|
15
|
+
require 'crowdin-api/api-resources/languages'
|
16
|
+
require 'crowdin-api/api-resources/projects'
|
17
|
+
require 'crowdin-api/api-resources/source_files'
|
18
|
+
require 'crowdin-api/api-resources/storages'
|
19
|
+
require 'crowdin-api/api-resources/translation_status'
|
20
|
+
require 'crowdin-api/api-resources/translations'
|
21
|
+
|
22
|
+
# Client
|
23
|
+
require 'crowdin-api/client/version'
|
24
|
+
require 'crowdin-api/client/configuration'
|
25
|
+
require 'crowdin-api/client/client'
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
describe 'Config instance' do
|
4
|
+
it 'should have a project_id' do
|
5
|
+
@crowdin = Crowdin::Client.new do |config|
|
6
|
+
config.project_id = 1
|
7
|
+
end
|
8
|
+
|
9
|
+
expect(@crowdin.config.project_id).to_not be_nil
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should have a api_token' do
|
13
|
+
@crowdin = Crowdin::Client.new do |config|
|
14
|
+
config.api_token = 'api_token'
|
15
|
+
end
|
16
|
+
|
17
|
+
expect(@crowdin.config.api_token).to_not be_nil
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should have a base_url' do
|
21
|
+
@crowdin = Crowdin::Client.new do |config|
|
22
|
+
config.api_token = 'api_token'
|
23
|
+
end
|
24
|
+
|
25
|
+
expect(@crowdin.config.base_url).to_not be_nil
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have a enable_logger set to false by default' do
|
29
|
+
@crowdin = Crowdin::Client.new do |config|
|
30
|
+
config.api_token = 'api_token'
|
31
|
+
end
|
32
|
+
|
33
|
+
expect(@crowdin.config.enable_logger).eql? false
|
34
|
+
end
|
35
|
+
end
|
data/spec/spec_helper.rb
ADDED