crowdin-api 0.6.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/build-and-publish.yml +30 -0
  3. data/.github/workflows/test-and-lint.yml +31 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +2 -0
  6. data/.rubocop.yml +5 -0
  7. data/.rubocop_todo.yml +146 -0
  8. data/CODE_OF_CONDUCT.md +128 -0
  9. data/CONTRIBUTING.md +71 -0
  10. data/Gemfile +5 -0
  11. data/LICENSE +1 -1
  12. data/README.md +120 -280
  13. data/Rakefile +19 -0
  14. data/bin/crowdin-console +54 -0
  15. data/bin/setup +6 -0
  16. data/crowdin-api.gemspec +33 -0
  17. data/lib/crowdin-api/api-resources/dictionaries.rb +34 -0
  18. data/lib/crowdin-api/api-resources/distributions.rb +99 -0
  19. data/lib/crowdin-api/api-resources/glossaries.rb +217 -0
  20. data/lib/crowdin-api/api-resources/labels.rb +117 -0
  21. data/lib/crowdin-api/api-resources/languages.rb +82 -0
  22. data/lib/crowdin-api/api-resources/machine_translation_engines.rb +74 -0
  23. data/lib/crowdin-api/api-resources/projects.rb +148 -0
  24. data/lib/crowdin-api/api-resources/reports.rb +138 -0
  25. data/lib/crowdin-api/api-resources/screenshots.rb +186 -0
  26. data/lib/crowdin-api/api-resources/source_files.rb +304 -0
  27. data/lib/crowdin-api/api-resources/source_strings.rb +74 -0
  28. data/lib/crowdin-api/api-resources/storages.rb +106 -0
  29. data/lib/crowdin-api/api-resources/string_comments.rb +73 -0
  30. data/lib/crowdin-api/api-resources/string_translations.rb +220 -0
  31. data/lib/crowdin-api/api-resources/tasks.rb +113 -0
  32. data/lib/crowdin-api/api-resources/teams.rb +144 -0
  33. data/lib/crowdin-api/api-resources/translation_memory.rb +145 -0
  34. data/lib/crowdin-api/api-resources/translation_status.rb +89 -0
  35. data/lib/crowdin-api/api-resources/translations.rb +161 -0
  36. data/lib/crowdin-api/api-resources/users.rb +129 -0
  37. data/lib/crowdin-api/api-resources/vendors.rb +21 -0
  38. data/lib/crowdin-api/api-resources/webhooks.rb +73 -0
  39. data/lib/crowdin-api/api-resources/workflows.rb +62 -0
  40. data/lib/crowdin-api/client/client.rb +95 -0
  41. data/lib/crowdin-api/client/configuration.rb +48 -0
  42. data/lib/crowdin-api/client/version.rb +7 -0
  43. data/lib/crowdin-api/core/errors.rb +8 -0
  44. data/lib/crowdin-api/core/errors_raisers.rb +39 -0
  45. data/lib/crowdin-api/core/request.rb +118 -0
  46. data/lib/crowdin-api/core/utils.rb +10 -0
  47. data/lib/crowdin-api.rb +39 -126
  48. data/spec/client/client-instance_spec.rb +14 -0
  49. data/spec/client/configuration-instance_spec.rb +72 -0
  50. data/spec/spec_helper.rb +9 -0
  51. metadata +130 -47
  52. data/lib/crowdin-api/errors.rb +0 -23
  53. data/lib/crowdin-api/methods.rb +0 -452
  54. data/lib/crowdin-api/version.rb +0 -5
@@ -0,0 +1,161 @@
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_parameter_is_required_error(:pre_translation_id)
8
+ project_id || raise_project_id_is_required_error
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_project_id_is_required_error
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 = {}, project_id = config.project_id)
33
+ directory_id || raise_parameter_is_required_error(:directory_id)
34
+ project_id || raise_project_id_is_required_error
35
+
36
+ request = Web::Request.new(
37
+ self,
38
+ :post,
39
+ "/projects/#{project_id}/translations/builds/directories/#{directory_id}",
40
+ query
41
+ )
42
+
43
+ request.perform
44
+ end
45
+
46
+ def build_project_file_translation(file_id = nil, query = {}, project_id = config.project_id)
47
+ file_id || raise_parameter_is_required_error(:file_id)
48
+ project_id || raise_project_id_is_required_error
49
+
50
+ headers = query[:eTag] ? { 'If-None-Match' => query[:eTag] } : {}
51
+
52
+ request = Web::Request.new(
53
+ self,
54
+ :post,
55
+ "/projects/#{project_id}/translations/builds/files/#{file_id}",
56
+ query,
57
+ headers
58
+ )
59
+
60
+ request.perform
61
+ end
62
+
63
+ def list_project_builds(query = {}, project_id = config.project_id)
64
+ project_id || raise_project_id_is_required_error
65
+
66
+ request = Web::Request.new(
67
+ self,
68
+ :get,
69
+ "/projects/#{project_id}/translations/builds",
70
+ query
71
+ )
72
+
73
+ request.perform
74
+ end
75
+
76
+ def build_project_translation(query = {}, project_id = config.project_id)
77
+ project_id || raise_project_id_is_required_error
78
+
79
+ request = Web::Request.new(
80
+ self,
81
+ :post,
82
+ "/projects/#{project_id}/translations/builds",
83
+ query
84
+ )
85
+
86
+ request.perform
87
+ end
88
+
89
+ def upload_translations(language_id = nil, query = {}, project_id = config.project_id)
90
+ language_id || raise_parameter_is_required_error(:language_id)
91
+ project_id || raise_project_id_is_required_error
92
+
93
+ request = Web::Request.new(
94
+ self,
95
+ :post,
96
+ "/projects/#{project_id}/translations/#{language_id}",
97
+ query
98
+ )
99
+
100
+ request.perform
101
+ end
102
+
103
+ def download_project_translations(build_id = nil, destination = nil, project_id = config.project_id)
104
+ build_id || raise_parameter_is_required_error(:build_id)
105
+ project_id || raise_project_id_is_required_error
106
+
107
+ request = Web::Request.new(
108
+ self,
109
+ :get,
110
+ "/projects/#{project_id}/translations/builds/#{build_id}/download",
111
+ {},
112
+ {},
113
+ destination
114
+ )
115
+
116
+ request.perform
117
+ end
118
+
119
+ def check_project_build_status(build_id = nil, project_id = config.project_id)
120
+ build_id || raise_parameter_is_required_error(:build_id)
121
+ project_id || raise_project_id_is_required_error
122
+
123
+ request = Web::Request.new(
124
+ self,
125
+ :get,
126
+ "/projects/#{project_id}/translations/builds/#{build_id}"
127
+ )
128
+
129
+ request.perform
130
+ end
131
+
132
+ def cancel_build(build_id = nil, project_id = config.project_id)
133
+ build_id || raise_parameter_is_required_error(:build_id)
134
+ project_id || raise_project_id_is_required_error
135
+
136
+ request = Web::Request.new(
137
+ self,
138
+ :delete,
139
+ "/projects/#{project_id}/translations/builds/#{build_id}"
140
+ )
141
+
142
+ request.perform
143
+ end
144
+
145
+ def export_project_translation(query = {}, destination = nil, project_id = config.project_id)
146
+ project_id || raise_project_id_is_required_error
147
+
148
+ request = Web::Request.new(
149
+ self,
150
+ :post,
151
+ "/projects/#{project_id}/translations/exports",
152
+ query,
153
+ {},
154
+ destination
155
+ )
156
+
157
+ request.perform
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,129 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ module ApiResources
5
+ module Users
6
+ def get_authenticated_user
7
+ request = Web::Request.new(
8
+ self,
9
+ :get,
10
+ '/user'
11
+ )
12
+
13
+ request.perform
14
+ end
15
+
16
+ def list_project_members(query = {}, project_id = config.project_id)
17
+ project_id || raise_project_id_is_required_error
18
+
19
+ request = Web::Request.new(
20
+ self,
21
+ :get,
22
+ "/projects/#{project_id}/members",
23
+ query
24
+ )
25
+
26
+ request.perform
27
+ end
28
+
29
+ def get_member_info(member_id = nil, project_id = config.project_id)
30
+ member_id || raise_parameter_is_required_error(:member_id)
31
+ project_id || raise_project_id_is_required_error
32
+
33
+ request = Web::Request.new(
34
+ self,
35
+ :get,
36
+ "/projects/#{project_id}/members/#{member_id}"
37
+ )
38
+
39
+ request.perform
40
+ end
41
+
42
+ # -- For Enterprise mode only --
43
+
44
+ def add_project_member(query = {}, project_id = config.project_id)
45
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
46
+ project_id || raise_project_id_is_required_error
47
+
48
+ request = Web::Request.new(
49
+ self,
50
+ :post,
51
+ "/projects/#{project_id}/members",
52
+ query
53
+ )
54
+
55
+ request.perform
56
+ end
57
+
58
+ def get_project_member_permissions(member_id = nil, project_id = config.project_id)
59
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
60
+ member_id || raise_parameter_is_required_error(:member_id)
61
+ project_id || raise_project_id_is_required_error
62
+
63
+ request = Web::Request.new(
64
+ self,
65
+ :get,
66
+ "/projects/#{project_id}/members/#{member_id}"
67
+ )
68
+
69
+ request.perform
70
+ end
71
+
72
+ def replace_project_permissions(member_id = nil, query = {}, project_id = config.project_id)
73
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
74
+ member_id || raise_parameter_is_required_error(:member_id)
75
+ project_id || raise_project_id_is_required_error
76
+
77
+ request = Web::Request.new(
78
+ self,
79
+ :put,
80
+ "/projects/#{project_id}/members/#{member_id}",
81
+ query
82
+ )
83
+
84
+ request.perform
85
+ end
86
+
87
+ def delete_member_from_project(member_id = nil, query = {}, project_id = config.project_id)
88
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
89
+ member_id || raise_parameter_is_required_error(:member_id)
90
+ project_id || raise_project_id_is_required_error
91
+
92
+ request = Web::Request.new(
93
+ self,
94
+ :delete,
95
+ "/projects/#{project_id}/members/#{member_id}",
96
+ query
97
+ )
98
+
99
+ request.perform
100
+ end
101
+
102
+ def list_users(query = {})
103
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
104
+
105
+ request = Web::Request.new(
106
+ self,
107
+ :get,
108
+ '/users',
109
+ query
110
+ )
111
+
112
+ request.perform
113
+ end
114
+
115
+ def get_user(user_id = nil)
116
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
117
+ user_id || raise_parameter_is_required_error(:user_id)
118
+
119
+ request = Web::Request.new(
120
+ self,
121
+ :get,
122
+ "/users/#{user_id}"
123
+ )
124
+
125
+ request.perform
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ module ApiResources
5
+ # -- For Enterprise mode only --
6
+ module Vendors
7
+ def list_vendors(query = {})
8
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
9
+
10
+ request = Web::Request.new(
11
+ self,
12
+ :get,
13
+ '/vendors',
14
+ query
15
+ )
16
+
17
+ request.perform
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ module ApiResources
5
+ module Webhooks
6
+ def list_webhooks(query = {}, project_id = config.project_id)
7
+ project_id || raise_project_id_is_required_error
8
+
9
+ request = Web::Request.new(
10
+ self,
11
+ :get,
12
+ "/projects/#{project_id}/webhooks",
13
+ query
14
+ )
15
+
16
+ request.perform
17
+ end
18
+
19
+ def add_webhook(query = {}, project_id = config.project_id)
20
+ project_id || raise_project_id_is_required_error
21
+
22
+ request = Web::Request.new(
23
+ self,
24
+ :post,
25
+ "/projects/#{project_id}/webhooks",
26
+ query
27
+ )
28
+
29
+ request.perform
30
+ end
31
+
32
+ def get_webhook(webhook_id = nil, project_id = config.project_id)
33
+ webhook_id || raise_parameter_is_required_error(:webhook_id)
34
+ project_id || raise_project_id_is_required_error
35
+
36
+ request = Web::Request.new(
37
+ self,
38
+ :get,
39
+ "/projects/#{project_id}/webhooks/#{webhook_id}"
40
+ )
41
+
42
+ request.perform
43
+ end
44
+
45
+ def delete_webhook(webhook_id = nil, project_id = config.project_id)
46
+ webhook_id || raise_parameter_is_required_error(:webhook_id)
47
+ project_id || raise_project_id_is_required_error
48
+
49
+ request = Web::Request.new(
50
+ self,
51
+ :delete,
52
+ "/projects/#{project_id}/webhooks/#{webhook_id}"
53
+ )
54
+
55
+ request.perform
56
+ end
57
+
58
+ def edit_screenshot(webhook_id = nil, query = {}, project_id = config.project_id)
59
+ webhook_id || raise_parameter_is_required_error(:webhook_id)
60
+ project_id || raise_project_id_is_required_error
61
+
62
+ request = Web::Request.new(
63
+ self,
64
+ :patch,
65
+ "/projects/#{project_id}/webhooks/#{webhook_id}",
66
+ query
67
+ )
68
+
69
+ request.perform
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ module ApiResources
5
+ # -- For Enterprise mode only --
6
+ module Workflows
7
+ def list_workflow_steps(query = {}, project_id = config.project_id)
8
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
9
+ project_id || raise_project_id_is_required_error
10
+
11
+ request = Web::Request.new(
12
+ self,
13
+ :get,
14
+ "/projects/#{project_id}/workflow-steps",
15
+ query
16
+ )
17
+
18
+ request.perform
19
+ end
20
+
21
+ def get_workflow_step(step_id = nil, project_id = config.project_id)
22
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
23
+ step_id || raise_parameter_is_required_error(:step_id)
24
+ project_id || raise_project_id_is_required_error
25
+
26
+ request = Web::Request.new(
27
+ self,
28
+ :get,
29
+ "/projects/#{project_id}/workflow-steps/#{step_id}"
30
+ )
31
+
32
+ request.perform
33
+ end
34
+
35
+ def list_workflow_templates(query = {})
36
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
37
+
38
+ request = Web::Request.new(
39
+ self,
40
+ :get,
41
+ '/workflow-templates',
42
+ query
43
+ )
44
+
45
+ request.perform
46
+ end
47
+
48
+ def get_workflow_template(template_id = nil)
49
+ config.enterprise_mode? || raise_only_for_enterprise_mode_error
50
+ template_id || raise_parameter_is_required_error(:template_id)
51
+
52
+ request = Web::Request.new(
53
+ self,
54
+ :get,
55
+ "/workflow-templates/#{template_id}"
56
+ )
57
+
58
+ request.perform
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ #
4
+ # A wrapper and interface to the Crowdin API. Please visit the Crowdin developers site
5
+ # for a full explanation of what each of the Crowdin api methods expect and perform.
6
+ #
7
+ # https://support.crowdin.com/api/v2/
8
+ # https://support.crowdin.com/enterprise/api/
9
+ #
10
+ module Crowdin
11
+ #
12
+ # === Example
13
+ #
14
+ # require 'crowdin-api'
15
+ #
16
+ # crowdin = Crowdin::Client.new do |config|
17
+ # config.api_token = 'YOUR_API_TOKEN'
18
+ # end
19
+ #
20
+ # crowdin.list_projects
21
+ #
22
+ class Client
23
+ extend Utils
24
+
25
+ # API Resources modules
26
+ API_RESOURCES_MODULES = %i[Storages Languages Projects Workflows SourceFiles Translations SourceStrings
27
+ StringTranslations StringComments Screenshots Glossaries TranslationMemory
28
+ MachineTranslationEngines Reports Tasks Users Teams Vendors Webhooks
29
+ Dictionaries Distributions Labels TranslationStatus].freeze
30
+
31
+ # Error Raisers modules
32
+ ERROR_RAISERS_MODULES = %i[ApiErrorsRaiser ClientErrorsRaiser].freeze
33
+
34
+ # Processing all API Resources modules to include them to the Client
35
+ API_RESOURCES_MODULES.each do |module_name|
36
+ Client.send(:include, fetch_module_full_name_from_string("Crowdin::ApiResources::#{module_name}"))
37
+ end
38
+
39
+ # Processing all Error Raisers modules to include them to the Client
40
+ ERROR_RAISERS_MODULES.each do |module_name|
41
+ Client.send(:include, fetch_module_full_name_from_string("Crowdin::Errors::#{module_name}"))
42
+ end
43
+
44
+ attr_reader :config
45
+ attr_reader :connection
46
+ attr_reader :options
47
+ attr_reader :logger
48
+
49
+ def initialize(&block)
50
+ build_configuration(&block)
51
+
52
+ check_logger
53
+ check_rest_client_proxy
54
+
55
+ build_connection
56
+ end
57
+
58
+ def log!(message)
59
+ !config.logger_enabled? || logger.debug(message)
60
+ end
61
+
62
+ def logger=(logger)
63
+ raise_logger_are_not_enabled_error unless config.logger_enabled?
64
+ @logger = logger
65
+ end
66
+
67
+ private
68
+
69
+ def build_configuration
70
+ @config = Crowdin::Configuration.new
71
+ yield config if block_given?
72
+ end
73
+
74
+ def build_connection
75
+ @connection ||= ::RestClient::Resource.new(config.base_url, build_options)
76
+ end
77
+
78
+ def build_options
79
+ @options ||= config.options.merge(headers: config.headers)
80
+ end
81
+
82
+ def set_default_logger
83
+ require 'logger'
84
+ @logger ||= Logger.new($stderr)
85
+ end
86
+
87
+ def check_rest_client_proxy
88
+ ENV['http_proxy'] ? ::RestClient.proxy = ENV['http_proxy'] : false
89
+ end
90
+
91
+ def check_logger
92
+ config.logger_enabled? ? set_default_logger : config.enable_logger = false
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,48 @@
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
+ alias logger_enabled? enable_logger
13
+
14
+ def initialize
15
+ @target_api_url = '/api/v2'
16
+ end
17
+
18
+ def options
19
+ {
20
+ headers: {},
21
+ timeout: nil,
22
+ json: true
23
+ }
24
+ end
25
+
26
+ def headers
27
+ {
28
+ 'Accept' => 'application/json',
29
+ 'Authorization' => "Bearer #{api_token}",
30
+ 'Content-Type' => 'application/json',
31
+ 'User-Agent' => "crowdin-rb/#{Crowdin::Client::VERSION}/#{RUBY_VERSION}/#{RUBY_PLATFORM}"
32
+ }
33
+ end
34
+
35
+ def base_url
36
+ if enterprise_mode?
37
+ organization_domain.include?('.com') ? organization_domain : "https://#{organization_domain}.api.crowdin.com"
38
+ else
39
+ 'https://api.crowdin.com'
40
+ end
41
+ end
42
+
43
+ def organization_domain?
44
+ !!organization_domain
45
+ end
46
+ alias enterprise_mode? organization_domain?
47
+ end
48
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ class Client
5
+ VERSION = '1.2.0'
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ module Errors
5
+ class OnlyForEnterpriseModeError < StandardError; end
6
+ class LoggerAreNotEnabledError < StandardError; end
7
+ end
8
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Crowdin
4
+ module Errors
5
+ # Client errors raiser
6
+ module ClientErrorsRaiser
7
+ def raise_logger_are_not_enabled_error
8
+ raise(LoggerAreNotEnabledError, 'Logger are not enabled in your Client configuration, enable it ' \
9
+ 'before setting your own logger')
10
+ end
11
+ end
12
+
13
+ # Command-Line Client errors raiser
14
+ module ClcErrorsRaiser
15
+ def raise_api_token_is_required_error
16
+ raise(ArgumentError, '--api-token option is required')
17
+ end
18
+
19
+ def raise_organization_domain_is_required_error
20
+ raise(ArgumentError, '--organization-domain option is required for Enterprise mode')
21
+ end
22
+ end
23
+
24
+ # API errors raiser
25
+ module ApiErrorsRaiser
26
+ def raise_only_for_enterprise_mode_error
27
+ raise(OnlyForEnterpriseModeError, 'This method can be called only for Enterprise mode')
28
+ end
29
+
30
+ def raise_project_id_is_required_error
31
+ raise(ArgumentError, ':project_id is required in parameters or while Client initialization')
32
+ end
33
+
34
+ def raise_parameter_is_required_error(parameter)
35
+ raise(ArgumentError, ":#{parameter} is required")
36
+ end
37
+ end
38
+ end
39
+ end