ruby-lokalise-api 2.8.0 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CODE_OF_CONDUCT.md +1 -1
- data/.github/CONTRIBUTING.md +2 -2
- data/CHANGELOG.md +46 -0
- data/Gemfile +2 -0
- data/README.md +293 -178
- data/Rakefile +6 -1
- data/lib/ruby-lokalise-api.rb +4 -0
- data/lib/ruby-lokalise-api/client.rb +18 -4
- data/lib/ruby-lokalise-api/collections/base.rb +6 -2
- data/lib/ruby-lokalise-api/collections/branch.rb +3 -1
- data/lib/ruby-lokalise-api/collections/contributor.rb +2 -0
- data/lib/ruby-lokalise-api/collections/custom_translation_status.rb +3 -1
- data/lib/ruby-lokalise-api/collections/file.rb +2 -0
- data/lib/ruby-lokalise-api/collections/key.rb +2 -0
- data/lib/ruby-lokalise-api/collections/key_comment.rb +2 -0
- data/lib/ruby-lokalise-api/collections/order.rb +2 -0
- data/lib/ruby-lokalise-api/collections/payment_card.rb +2 -0
- data/lib/ruby-lokalise-api/collections/project.rb +2 -0
- data/lib/ruby-lokalise-api/collections/project_comment.rb +2 -0
- data/lib/ruby-lokalise-api/collections/project_language.rb +2 -0
- data/lib/ruby-lokalise-api/collections/queued_process.rb +15 -0
- data/lib/ruby-lokalise-api/collections/screenshot.rb +2 -0
- data/lib/ruby-lokalise-api/collections/snapshot.rb +2 -0
- data/lib/ruby-lokalise-api/collections/system_language.rb +2 -0
- data/lib/ruby-lokalise-api/collections/task.rb +2 -0
- data/lib/ruby-lokalise-api/collections/team.rb +2 -0
- data/lib/ruby-lokalise-api/collections/team_user.rb +2 -0
- data/lib/ruby-lokalise-api/collections/team_user_group.rb +3 -1
- data/lib/ruby-lokalise-api/collections/translation.rb +2 -0
- data/lib/ruby-lokalise-api/collections/translation_provider.rb +2 -0
- data/lib/ruby-lokalise-api/collections/webhook.rb +2 -0
- data/lib/ruby-lokalise-api/connection.rb +3 -1
- data/lib/ruby-lokalise-api/data/attributes.json +28 -13
- data/lib/ruby-lokalise-api/error.rb +2 -0
- data/lib/ruby-lokalise-api/json_handler.rb +4 -0
- data/lib/ruby-lokalise-api/request.rb +10 -1
- data/lib/ruby-lokalise-api/resources/base.rb +53 -21
- data/lib/ruby-lokalise-api/resources/branch.rb +3 -1
- data/lib/ruby-lokalise-api/resources/contributor.rb +4 -2
- data/lib/ruby-lokalise-api/resources/custom_translation_status.rb +4 -2
- data/lib/ruby-lokalise-api/resources/file.rb +5 -1
- data/lib/ruby-lokalise-api/resources/key.rb +3 -1
- data/lib/ruby-lokalise-api/resources/key_comment.rb +5 -3
- data/lib/ruby-lokalise-api/resources/order.rb +4 -0
- data/lib/ruby-lokalise-api/resources/payment_card.rb +3 -1
- data/lib/ruby-lokalise-api/resources/project.rb +3 -1
- data/lib/ruby-lokalise-api/resources/project_comment.rb +3 -1
- data/lib/ruby-lokalise-api/resources/project_language.rb +5 -3
- data/lib/ruby-lokalise-api/resources/queued_process.rb +18 -0
- data/lib/ruby-lokalise-api/resources/screenshot.rb +3 -1
- data/lib/ruby-lokalise-api/resources/snapshot.rb +5 -1
- data/lib/ruby-lokalise-api/resources/system_language.rb +3 -1
- data/lib/ruby-lokalise-api/resources/task.rb +3 -1
- data/lib/ruby-lokalise-api/resources/team.rb +2 -0
- data/lib/ruby-lokalise-api/resources/team_user.rb +4 -2
- data/lib/ruby-lokalise-api/resources/team_user_group.rb +6 -3
- data/lib/ruby-lokalise-api/resources/translation.rb +3 -1
- data/lib/ruby-lokalise-api/resources/translation_provider.rb +5 -0
- data/lib/ruby-lokalise-api/resources/webhook.rb +13 -3
- data/lib/ruby-lokalise-api/rest/branches.rb +2 -0
- data/lib/ruby-lokalise-api/rest/comments.rb +7 -5
- data/lib/ruby-lokalise-api/rest/contributors.rb +7 -5
- data/lib/ruby-lokalise-api/rest/custom_translation_statuses.rb +8 -6
- data/lib/ruby-lokalise-api/rest/files.rb +5 -3
- data/lib/ruby-lokalise-api/rest/keys.rb +9 -7
- data/lib/ruby-lokalise-api/rest/languages.rb +8 -6
- data/lib/ruby-lokalise-api/rest/orders.rb +2 -0
- data/lib/ruby-lokalise-api/rest/payment_cards.rb +5 -3
- data/lib/ruby-lokalise-api/rest/projects.rb +8 -6
- data/lib/ruby-lokalise-api/rest/queued_processes.rb +26 -0
- data/lib/ruby-lokalise-api/rest/screenshots.rb +7 -5
- data/lib/ruby-lokalise-api/rest/snapshots.rb +6 -4
- data/lib/ruby-lokalise-api/rest/tasks.rb +7 -5
- data/lib/ruby-lokalise-api/rest/team_user_group.rb +6 -4
- data/lib/ruby-lokalise-api/rest/team_users.rb +6 -4
- data/lib/ruby-lokalise-api/rest/teams.rb +3 -1
- data/lib/ruby-lokalise-api/rest/translation_providers.rb +4 -2
- data/lib/ruby-lokalise-api/rest/translations.rb +5 -3
- data/lib/ruby-lokalise-api/rest/webhooks.rb +18 -5
- data/lib/ruby-lokalise-api/utils/attribute_helpers.rb +2 -0
- data/lib/ruby-lokalise-api/utils/endpoint_helpers.rb +2 -0
- data/lib/ruby-lokalise-api/utils/string_utils.rb +2 -0
- data/lib/ruby-lokalise-api/version.rb +3 -1
- data/ruby-lokalise-api.gemspec +9 -5
- data/spec/lib/ruby-lokalise-api/connection_spec.rb +10 -7
- data/spec/lib/ruby-lokalise-api/custom_json_parser_spec.rb +9 -5
- data/spec/lib/ruby-lokalise-api/error_spec.rb +15 -4
- data/spec/lib/ruby-lokalise-api/rest/branches_spec.rb +19 -5
- data/spec/lib/ruby-lokalise-api/rest/comments_spec.rb +19 -5
- data/spec/lib/ruby-lokalise-api/rest/contributors_spec.rb +18 -4
- data/spec/lib/ruby-lokalise-api/rest/custom_translation_statuses_spec.rb +18 -4
- data/spec/lib/ruby-lokalise-api/rest/files_spec.rb +21 -11
- data/spec/lib/ruby-lokalise-api/rest/keys_spec.rb +46 -26
- data/spec/lib/ruby-lokalise-api/rest/languages_spec.rb +20 -6
- data/spec/lib/ruby-lokalise-api/rest/orders_spec.rb +16 -2
- data/spec/lib/ruby-lokalise-api/rest/payment_cards_spec.rb +21 -5
- data/spec/lib/ruby-lokalise-api/rest/projects_spec.rb +18 -4
- data/spec/lib/ruby-lokalise-api/rest/queued_processes_spec.rb +57 -0
- data/spec/lib/ruby-lokalise-api/rest/screenshots_spec.rb +18 -4
- data/spec/lib/ruby-lokalise-api/rest/snapshots_spec.rb +31 -4
- data/spec/lib/ruby-lokalise-api/rest/tasks_spec.rb +18 -4
- data/spec/lib/ruby-lokalise-api/rest/team_user_groups_spec.rb +92 -6
- data/spec/lib/ruby-lokalise-api/rest/team_users_spec.rb +19 -4
- data/spec/lib/ruby-lokalise-api/rest/teams_spec.rb +2 -0
- data/spec/lib/ruby-lokalise-api/rest/translation_providers_spec.rb +9 -2
- data/spec/lib/ruby-lokalise-api/rest/translations_spec.rb +20 -6
- data/spec/lib/ruby-lokalise-api/rest/webhooks_spec.rb +54 -2
- data/spec/lib/ruby-lokalise-api/utils/snakecase_spec.rb +2 -0
- data/spec/lib/ruby-lokalise-api_spec.rb +12 -9
- data/spec/spec_helper.rb +8 -1
- data/spec/support/test_client.rb +2 -0
- data/spec/support/vcr.rb +2 -0
- metadata +59 -12
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class Base
|
@@ -6,25 +8,27 @@ module Lokalise
|
|
6
8
|
include Lokalise::Utils::AttributeHelpers
|
7
9
|
extend Lokalise::Utils::EndpointHelpers
|
8
10
|
|
9
|
-
attr_reader :raw_data, :project_id, :client, :path
|
11
|
+
attr_reader :raw_data, :project_id, :client, :path, :branch, :user_id, :team_id
|
10
12
|
|
11
|
-
# Initializes a new resource based on the response
|
13
|
+
# Initializes a new resource based on the response.
|
14
|
+
# `endpoint_generator` is used in cases when a new instance is generated
|
15
|
+
# from a different resource. For example, restoring from a snapshot
|
16
|
+
# creates a totally different project which should have a new path.
|
12
17
|
#
|
13
18
|
# @param response [Hash]
|
19
|
+
# @param endpoint_generator [Proc] Generate proper paths for certain resources
|
14
20
|
# @return [Lokalise::Resources::Base]
|
15
|
-
def initialize(response)
|
21
|
+
def initialize(response, endpoint_generator = nil)
|
16
22
|
populate_attributes_for response['content']
|
17
|
-
|
18
|
-
@raw_data = response['content']
|
19
|
-
@project_id = response['content']['project_id']
|
23
|
+
extract_common_attributes_for response['content']
|
20
24
|
@client = response['client']
|
21
|
-
@path = infer_path_from response
|
25
|
+
@path = infer_path_from response, endpoint_generator
|
22
26
|
end
|
23
27
|
|
24
28
|
class << self
|
25
|
-
# Dynamically
|
29
|
+
# Dynamically adds attribute readers for each inherited class.
|
26
30
|
# Attributes are defined in the `data/attributes.json` file.
|
27
|
-
# Also
|
31
|
+
# Also sets the `ATTRIBUTES` constant to assign values to each attribute later when
|
28
32
|
# the response arrives from the API
|
29
33
|
def inherited(subclass)
|
30
34
|
klass_attributes = attributes_for subclass
|
@@ -41,10 +45,16 @@ module Lokalise
|
|
41
45
|
# Usage: `supports :update, :destroy, [:complex_method, '/sub/path', :update]`
|
42
46
|
def supports(*methods)
|
43
47
|
methods.each do |m_data|
|
44
|
-
method_name
|
48
|
+
# `method_name` - the method that the resource should support
|
49
|
+
# `sub_path` - a string that has to be appended to a base path
|
50
|
+
# `c_method` - method name to delegate the work to
|
51
|
+
method_name, sub_path, c_method =
|
52
|
+
m_data.is_a?(Array) ? m_data : [m_data, '', m_data]
|
53
|
+
|
45
54
|
define_method method_name do |params = {}|
|
46
55
|
path = instance_variable_get(:@path)
|
47
|
-
# If there's a sub_path
|
56
|
+
# If there's a sub_path which is a string,
|
57
|
+
# preserve the initial path to allow further chaining
|
48
58
|
params = params.merge(_initial_path: path) if sub_path
|
49
59
|
self.class.send c_method, instance_variable_get(:@client),
|
50
60
|
path + sub_path, params
|
@@ -54,30 +64,34 @@ module Lokalise
|
|
54
64
|
|
55
65
|
# Fetches a single record
|
56
66
|
def find(client, path, params = {})
|
57
|
-
new get(path, client, params)
|
67
|
+
new get(path, client, prepare_params(params))
|
58
68
|
end
|
59
69
|
|
60
70
|
# Creates one or multiple records
|
61
71
|
def create(client, path, params)
|
62
|
-
response = post path, client, params
|
63
|
-
|
72
|
+
response = post path, client, prepare_params(params)
|
64
73
|
object_from response, params
|
65
74
|
end
|
66
75
|
|
67
76
|
# Updates one or multiple records
|
68
77
|
def update(client, path, params)
|
69
|
-
response = put path, client, params
|
70
|
-
|
78
|
+
response = put path, client, prepare_params(params)
|
71
79
|
object_from response, params
|
72
80
|
end
|
73
81
|
|
74
82
|
# Destroys records by given ids
|
75
83
|
def destroy(client, path, params = {})
|
76
|
-
delete(path, client, params)['content']
|
84
|
+
delete(path, client, prepare_params(params))['content']
|
77
85
|
end
|
78
86
|
|
79
87
|
private
|
80
88
|
|
89
|
+
# Filters out internal attributes that should not be sent to Lokalise
|
90
|
+
def prepare_params(params)
|
91
|
+
filter_attrs = %i[_initial_path]
|
92
|
+
params.reject { |key, _v| filter_attrs.include?(key) }
|
93
|
+
end
|
94
|
+
|
81
95
|
# Instantiates a new resource or collection based on the given response
|
82
96
|
def object_from(response, params)
|
83
97
|
model_class = name.base_class_name
|
@@ -94,7 +108,6 @@ module Lokalise
|
|
94
108
|
|
95
109
|
def produce_resource(model_class, response)
|
96
110
|
data_key_singular = data_key_for model_class
|
97
|
-
|
98
111
|
if response['content'].key? data_key_singular
|
99
112
|
data = response['content'].delete data_key_singular
|
100
113
|
response['content'].merge! data
|
@@ -109,20 +122,27 @@ module Lokalise
|
|
109
122
|
end
|
110
123
|
|
111
124
|
# Generates path for the individual resource based on the path for the collection
|
112
|
-
def infer_path_from(response)
|
125
|
+
def infer_path_from(response, endpoint_generator = nil)
|
113
126
|
id_key = id_key_for self.class.name.base_class_name
|
114
127
|
data_key = data_key_for self.class.name.base_class_name
|
115
128
|
|
116
|
-
path_with_id response, id_key, data_key
|
129
|
+
path_with_id response, id_key, data_key, endpoint_generator
|
117
130
|
end
|
118
131
|
|
119
|
-
def path_with_id(response, id_key, data_key)
|
132
|
+
def path_with_id(response, id_key, data_key, endpoint_generator = nil)
|
120
133
|
# Some resources do not have ids at all
|
121
134
|
return nil unless response['content'].key?(id_key) || response['content'].key?(data_key)
|
122
135
|
|
123
136
|
# ID of the resource
|
124
137
|
id = id_from response, id_key, data_key
|
125
138
|
|
139
|
+
# If `endpoint_generator` is present, generate a new path
|
140
|
+
# based on the fetched id
|
141
|
+
if endpoint_generator
|
142
|
+
path = endpoint_generator.call project_id, id
|
143
|
+
return path.remove_trailing_slash
|
144
|
+
end
|
145
|
+
|
126
146
|
path = response['path'] || response['base_path']
|
127
147
|
# If path already has id - just return it
|
128
148
|
return path if path.match?(/#{id}\z/)
|
@@ -156,6 +176,18 @@ module Lokalise
|
|
156
176
|
instance_variable_set "@#{attr}", value
|
157
177
|
end
|
158
178
|
end
|
179
|
+
|
180
|
+
# Extracts all common attributes that resources have.
|
181
|
+
# Some of them may be absent in certain cases.
|
182
|
+
# rubocop:disable Naming/MemoizedInstanceVariableName
|
183
|
+
def extract_common_attributes_for(content)
|
184
|
+
@raw_data = content
|
185
|
+
@project_id ||= content['project_id']
|
186
|
+
@user_id ||= content['user_id']
|
187
|
+
@team_id ||= content['team_id']
|
188
|
+
@branch ||= content['branch']
|
189
|
+
end
|
190
|
+
# rubocop:enable Naming/MemoizedInstanceVariableName
|
159
191
|
end
|
160
192
|
end
|
161
193
|
end
|
@@ -1,7 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class Branch < Base
|
4
|
-
supports :update, :destroy
|
6
|
+
supports :update, :destroy, [:reload_data, '', :find]
|
5
7
|
|
6
8
|
def merge(params = {})
|
7
9
|
self.class.merge @client, self.class.endpoint(project_id, branch_id, :merge), params
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class Contributor < Base
|
4
|
-
ID_KEY = 'user'
|
5
|
-
supports :update, :destroy
|
6
|
+
ID_KEY = 'user'
|
7
|
+
supports :update, :destroy, [:reload_data, '', :find]
|
6
8
|
|
7
9
|
class << self
|
8
10
|
def endpoint(project_id, contributor_id = nil)
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class CustomTranslationStatus < Base
|
4
|
-
ID_KEY = 'status'
|
5
|
-
supports :update, :destroy
|
6
|
+
ID_KEY = 'status'
|
7
|
+
supports :update, :destroy, [:reload_data, '', :find]
|
6
8
|
|
7
9
|
class << self
|
8
10
|
def colors(client, path, *_args)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class File < Base
|
@@ -7,7 +9,9 @@ module Lokalise
|
|
7
9
|
end
|
8
10
|
|
9
11
|
def upload(client, path, params)
|
10
|
-
|
12
|
+
klass = Lokalise::Resources::QueuedProcess
|
13
|
+
klass.new post(path, client, params),
|
14
|
+
->(project_id, id) { klass.endpoint(project_id, id) }
|
11
15
|
end
|
12
16
|
|
13
17
|
def endpoint(project_id, action = '')
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class KeyComment < Base
|
4
|
-
DATA_KEY = 'Comment'
|
5
|
-
ID_KEY = 'comment'
|
6
|
-
supports :destroy
|
6
|
+
DATA_KEY = 'Comment'
|
7
|
+
ID_KEY = 'comment'
|
8
|
+
supports :destroy, [:reload_data, '', :find]
|
7
9
|
|
8
10
|
class << self
|
9
11
|
def endpoint(project_id, key_id, comment_id = nil)
|
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class ProjectLanguage < Base
|
4
|
-
DATA_KEY = 'Language'
|
5
|
-
ID_KEY = 'lang'
|
6
|
-
supports :update, :destroy
|
6
|
+
DATA_KEY = 'Language'
|
7
|
+
ID_KEY = 'lang'
|
8
|
+
supports :update, :destroy, [:reload_data, '', :find]
|
7
9
|
|
8
10
|
class << self
|
9
11
|
def endpoint(project_id, language_id = nil)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lokalise
|
4
|
+
module Resources
|
5
|
+
class QueuedProcess < Base
|
6
|
+
DATA_KEY = 'Process'
|
7
|
+
ID_KEY = 'process'
|
8
|
+
supports [:reload_data, '', :find]
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def endpoint(project_id, process_id = nil)
|
12
|
+
path_from projects: project_id,
|
13
|
+
processes: process_id
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class Snapshot < Base
|
@@ -9,7 +11,9 @@ module Lokalise
|
|
9
11
|
|
10
12
|
class << self
|
11
13
|
def restore(client, path, *_args)
|
12
|
-
Lokalise::Resources::Project
|
14
|
+
klass = Lokalise::Resources::Project
|
15
|
+
klass.new post(path, client),
|
16
|
+
->(project_id, *_ids) { klass.endpoint(project_id) }
|
13
17
|
end
|
14
18
|
|
15
19
|
def endpoint(project_id, snapshot_id = nil)
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class TeamUser < Base
|
4
|
-
ID_KEY = 'user'
|
5
|
-
supports :update, :destroy
|
6
|
+
ID_KEY = 'user'
|
7
|
+
supports :update, :destroy, [:reload_data, '', :find]
|
6
8
|
|
7
9
|
class << self
|
8
10
|
def endpoint(team_id, team_user_id = nil)
|
@@ -1,13 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class TeamUserGroup < Base
|
4
|
-
DATA_KEY = 'Group'
|
5
|
-
ID_KEY = 'group'
|
6
|
+
DATA_KEY = 'Group'
|
7
|
+
ID_KEY = 'group'
|
6
8
|
supports :update, :destroy,
|
7
9
|
[:add_projects, '/projects/add', :update],
|
8
10
|
[:remove_projects, '/projects/remove', :update],
|
9
11
|
[:add_users, '/members/add', :update],
|
10
|
-
[:remove_users, '/members/remove', :update]
|
12
|
+
[:remove_users, '/members/remove', :update],
|
13
|
+
[:reload_data, '', :find]
|
11
14
|
|
12
15
|
class << self
|
13
16
|
def endpoint(team_id, team_user_group_id = nil, *actions)
|
@@ -1,12 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Lokalise
|
2
4
|
module Resources
|
3
5
|
class Webhook < Base
|
4
|
-
supports :update, :destroy
|
6
|
+
supports :update, :destroy, [:reload_data, '', :find]
|
7
|
+
|
8
|
+
def regenerate_secret
|
9
|
+
self.class.regenerate_secret @client, @path + '/secret/regenerate'
|
10
|
+
end
|
5
11
|
|
6
12
|
class << self
|
7
|
-
def
|
13
|
+
def regenerate_secret(client, path, *_args)
|
14
|
+
patch(path, client)['content']
|
15
|
+
end
|
16
|
+
|
17
|
+
def endpoint(project_id, webhook_id = nil, *actions)
|
8
18
|
path_from projects: project_id,
|
9
|
-
webhooks: webhook_id
|
19
|
+
webhooks: [webhook_id, *actions]
|
10
20
|
end
|
11
21
|
end
|
12
22
|
end
|