lokalise_manager 5.0.0 → 5.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/LICENSE +1 -1
- data/README.md +10 -5
- data/lib/lokalise_manager/error.rb +3 -1
- data/lib/lokalise_manager/global_config.rb +21 -22
- data/lib/lokalise_manager/task_definitions/base.rb +28 -25
- data/lib/lokalise_manager/task_definitions/exporter.rb +25 -13
- data/lib/lokalise_manager/task_definitions/importer.rb +35 -34
- data/lib/lokalise_manager/version.rb +1 -1
- data/lib/lokalise_manager.rb +16 -16
- data/lokalise_manager.gemspec +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82874b49ae901318d91845641a40e1c0b085764e53179799dffb54f84e205fc0
|
4
|
+
data.tar.gz: 5c8035fed54faf4dbd82eba23acaf172af60bf0d0cd4f4b0705bace632b1049a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 473fc616ce635982fe180396a3f2be51c974fd05bbca4e5f1a4780cdda9f10951a0763ce1c366abccae96ba618a20f7d9d94b150c4f9423ba72d678dec2f53cf
|
7
|
+
data.tar.gz: 24b1bd4791c79ef2ff0e6f1fc096b23a50a63878f55c66c10b0830d4ac614e76890a7b50d376cef649dae6970ded2215088ca95b9c96ee3124574b7594eda086
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 5.1.1
|
4
|
+
|
5
|
+
* Update documentation, minor code fixes
|
6
|
+
|
7
|
+
## 5.1.0 (09-Feb-2024)
|
8
|
+
|
9
|
+
* Handle rare case when the server returns HTML instead of JSON which happens when too many requests are sent
|
10
|
+
|
3
11
|
## 5.0.0 (09-Nov-2023)
|
4
12
|
|
5
13
|
* **Breaking change**: require Ruby 3+. Version 2.7 has reached end-of-life and thus we are not planning to support it anymore. If you need support for Ruby 2.7, please stay on 4.0.0.
|
data/LICENSE
CHANGED
data/README.md
CHANGED
@@ -6,17 +6,22 @@
|
|
6
6
|
[![Maintainability](https://api.codeclimate.com/v1/badges/9b682367a274ee3dcdee/maintainability)](https://codeclimate.com/github/bodrovis/lokalise_manager/maintainability)
|
7
7
|
![Downloads total](https://img.shields.io/gem/dt/lokalise_manager)
|
8
8
|
|
9
|
-
|
9
|
+
The LokaliseManager gem provides seamless integration with [Lokalise](http://lokalise.com), enabling easy exchange of translation files between your Ruby project and the Lokalise translation management system (TMS). It leverages the [ruby-lokalise-api](https://lokalise.github.io/ruby-lokalise-api) to send and manage APIv2 requests.
|
10
10
|
|
11
|
-
|
11
|
+
For integration directly with Rails applications, refer to [lokalise_rails](https://github.com/bodrovis/lokalise_rails), which offers a suite of Rake tasks specifically designed for importing and exporting translation files.
|
12
12
|
|
13
|
-
## Getting
|
13
|
+
## Getting Started
|
14
14
|
|
15
15
|
### Requirements
|
16
16
|
|
17
|
-
|
17
|
+
- **Ruby version**: Ruby 3.0 or higher is required.
|
18
|
+
- **Lokalise account**: You must have an active [Lokalise account](https://app.lokalise.com/signup).
|
19
|
+
- **Project setup**: Create a [translation project](https://docs.lokalise.com/en/articles/1400460-projects) within your Lokalise account.
|
20
|
+
- **API token**: Obtain a read/write [API token](https://docs.lokalise.com/en/articles/1929556-api-tokens) from your Lokalise profile.
|
18
21
|
|
19
|
-
|
22
|
+
### Optional
|
23
|
+
|
24
|
+
- **OAuth 2 token**: If you prefer using an OAuth 2 token instead of a standard API token, set the `:use_oauth2_token` option to `true` in your configuration settings.
|
20
25
|
|
21
26
|
### Installation
|
22
27
|
|
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module LokaliseManager
|
4
|
-
#
|
4
|
+
# The Error class provides a custom exception type for the LokaliseManager,
|
5
|
+
# allowing the library to raise specific errors that can be easily identified
|
6
|
+
# and handled separately from other StandardError exceptions in Ruby.
|
5
7
|
class Error < StandardError
|
6
8
|
# Initializes a new Error object
|
7
9
|
def initialize(message = '')
|
@@ -1,7 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module LokaliseManager
|
4
|
-
#
|
4
|
+
# GlobalConfig provides a central place to manage configuration settings for LokaliseManager.
|
5
|
+
# It allows setting various operational parameters such as API tokens, paths, and behavior modifiers.
|
5
6
|
class GlobalConfig
|
6
7
|
class << self
|
7
8
|
attr_accessor :api_token, :project_id
|
@@ -11,58 +12,57 @@ module LokaliseManager
|
|
11
12
|
:max_retries_export, :max_retries_import, :use_oauth2_token, :silent_mode,
|
12
13
|
:raise_on_export_fail
|
13
14
|
|
14
|
-
#
|
15
|
+
# Yield self to block for configuration
|
15
16
|
def config
|
16
17
|
yield self
|
17
18
|
end
|
18
19
|
|
19
|
-
#
|
20
|
+
# Return whether to raise on export failure
|
20
21
|
def raise_on_export_fail
|
21
|
-
@raise_on_export_fail
|
22
|
+
@raise_on_export_fail.nil? ? true : @raise_on_export_fail
|
22
23
|
end
|
23
24
|
|
24
|
-
#
|
25
|
+
# Return whether debugging information is suppressed
|
25
26
|
def silent_mode
|
26
27
|
@silent_mode || false
|
27
28
|
end
|
28
29
|
|
29
|
-
#
|
30
|
-
# rather than via Lokalise profile
|
30
|
+
# Return whether to use OAuth2 tokens instead of regular API tokens
|
31
31
|
def use_oauth2_token
|
32
32
|
@use_oauth2_token || false
|
33
33
|
end
|
34
34
|
|
35
|
-
#
|
35
|
+
# Return the path to locales
|
36
36
|
def locales_path
|
37
37
|
@locales_path || "#{Dir.getwd}/locales"
|
38
38
|
end
|
39
39
|
|
40
|
-
#
|
40
|
+
# Return the project branch
|
41
41
|
def branch
|
42
42
|
@branch || ''
|
43
43
|
end
|
44
44
|
|
45
|
-
#
|
45
|
+
# Return API request timeouts
|
46
46
|
def timeouts
|
47
47
|
@timeouts || {}
|
48
48
|
end
|
49
49
|
|
50
|
-
#
|
50
|
+
# Return the max retries for export
|
51
51
|
def max_retries_export
|
52
52
|
@max_retries_export || 5
|
53
53
|
end
|
54
54
|
|
55
|
-
#
|
55
|
+
# Return the max retries for import
|
56
56
|
def max_retries_import
|
57
57
|
@max_retries_import || 5
|
58
58
|
end
|
59
59
|
|
60
|
-
#
|
60
|
+
# Return the regex for file extensions
|
61
61
|
def file_ext_regexp
|
62
62
|
@file_ext_regexp || /\.ya?ml\z/i
|
63
63
|
end
|
64
64
|
|
65
|
-
#
|
65
|
+
# Return import options with defaults
|
66
66
|
def import_opts
|
67
67
|
@import_opts || {
|
68
68
|
format: 'ruby_yaml',
|
@@ -74,33 +74,32 @@ module LokaliseManager
|
|
74
74
|
}
|
75
75
|
end
|
76
76
|
|
77
|
-
#
|
77
|
+
# Return export options
|
78
78
|
def export_opts
|
79
79
|
@export_opts || {}
|
80
80
|
end
|
81
81
|
|
82
|
-
#
|
82
|
+
# Return whether import should check if target is empty
|
83
83
|
def import_safe_mode
|
84
84
|
@import_safe_mode.nil? ? false : @import_safe_mode
|
85
85
|
end
|
86
86
|
|
87
|
-
#
|
87
|
+
# Return whether to skip file export based on a lambda condition
|
88
88
|
def skip_file_export
|
89
89
|
@skip_file_export || ->(_) { false }
|
90
90
|
end
|
91
91
|
|
92
|
+
# Load translations from raw data
|
92
93
|
def translations_loader
|
93
|
-
@translations_loader || ->(raw_data) { YAML.safe_load
|
94
|
+
@translations_loader || ->(raw_data) { YAML.safe_load(raw_data) }
|
94
95
|
end
|
95
96
|
|
96
|
-
#
|
97
|
+
# Convert raw translation data to YAML format
|
97
98
|
def translations_converter
|
98
99
|
@translations_converter || ->(raw_data) { YAML.dump(raw_data).gsub('\\\\n', '\n') }
|
99
100
|
end
|
100
101
|
|
101
|
-
#
|
102
|
-
# The lambda expects to accept the raw contents of the translation file
|
103
|
-
# and the full path to the file (instance of the `Pathname` class)
|
102
|
+
# Infer language ISO code from translation file
|
104
103
|
def lang_iso_inferer
|
105
104
|
@lang_iso_inferer || ->(data, _path) { YAML.safe_load(data)&.keys&.first }
|
106
105
|
end
|
@@ -5,17 +5,18 @@ require 'pathname'
|
|
5
5
|
|
6
6
|
module LokaliseManager
|
7
7
|
module TaskDefinitions
|
8
|
-
# Base class for LokaliseManager task definitions
|
8
|
+
# Base class for LokaliseManager task definitions, including common methods and logic.
|
9
|
+
# This class serves as the foundation for importer and exporter classes, handling API
|
10
|
+
# client interactions and configuration merging.
|
9
11
|
class Base
|
10
12
|
using LokaliseManager::Utils::HashUtils
|
11
13
|
|
12
14
|
attr_accessor :config
|
13
15
|
|
14
|
-
#
|
15
|
-
# with the global config (custom config take precendence)
|
16
|
+
# Initializes a new task object by merging custom and global configurations.
|
16
17
|
#
|
17
|
-
# @param custom_opts [Hash]
|
18
|
-
# @param global_config [Object]
|
18
|
+
# @param custom_opts [Hash] Custom configurations for specific tasks.
|
19
|
+
# @param global_config [Object] Reference to the global configuration.
|
19
20
|
def initialize(custom_opts = {}, global_config = LokaliseManager::GlobalConfig)
|
20
21
|
primary_opts = global_config
|
21
22
|
.singleton_methods
|
@@ -32,10 +33,12 @@ module LokaliseManager
|
|
32
33
|
@config = config_klass.new all_opts
|
33
34
|
end
|
34
35
|
|
35
|
-
# Creates a Lokalise API client
|
36
|
+
# Creates or retrieves a Lokalise API client based on configuration.
|
36
37
|
#
|
37
|
-
# @return [RubyLokaliseApi::Client]
|
38
|
+
# @return [RubyLokaliseApi::Client] Lokalise API client.
|
38
39
|
def api_client
|
40
|
+
return @api_client if @api_client
|
41
|
+
|
39
42
|
client_opts = [config.api_token, config.timeouts]
|
40
43
|
client_method = config.use_oauth2_token ? :oauth2_client : :client
|
41
44
|
|
@@ -51,51 +54,51 @@ module LokaliseManager
|
|
51
54
|
|
52
55
|
private
|
53
56
|
|
54
|
-
# Checks task options
|
55
|
-
#
|
56
|
-
# @return Array
|
57
|
+
# Checks and validates task options, raising errors if configurations are missing.
|
57
58
|
def check_options_errors!
|
58
59
|
errors = []
|
59
60
|
errors << 'Project ID is not set!' if config.project_id.nil? || config.project_id.empty?
|
60
61
|
errors << 'Lokalise API token is not set!' if config.api_token.nil? || config.api_token.empty?
|
61
|
-
|
62
|
-
raise(LokaliseManager::Error, errors.join(' ')) if errors.any?
|
62
|
+
raise LokaliseManager::Error, errors.join(' ') if errors.any?
|
63
63
|
end
|
64
64
|
|
65
|
-
#
|
65
|
+
# Determines if the file has the correct extension based on the configuration.
|
66
66
|
#
|
67
|
-
# @
|
68
|
-
# @
|
67
|
+
# @param raw_path [String, Pathname] Path to check.
|
68
|
+
# @return [Boolean] True if the extension matches, false otherwise.
|
69
69
|
def proper_ext?(raw_path)
|
70
70
|
path = raw_path.is_a?(Pathname) ? raw_path : Pathname.new(raw_path)
|
71
71
|
config.file_ext_regexp.match? path.extname
|
72
72
|
end
|
73
73
|
|
74
|
-
#
|
74
|
+
# Extracts the directory and filename from a given path.
|
75
75
|
#
|
76
|
-
# @
|
77
|
-
# @
|
76
|
+
# @param entry [String] The file path.
|
77
|
+
# @return [Array] Contains [Pathname, Pathname] representing the directory and filename.
|
78
78
|
def subdir_and_filename_for(entry)
|
79
79
|
Pathname.new(entry).split
|
80
80
|
end
|
81
81
|
|
82
|
-
#
|
82
|
+
# Constructs a project identifier string that may include a branch.
|
83
83
|
#
|
84
|
-
# @return [String]
|
84
|
+
# @return [String] Project identifier potentially including the branch.
|
85
85
|
def project_id_with_branch
|
86
|
-
|
87
|
-
|
88
|
-
"#{config.project_id}:#{config.branch}"
|
86
|
+
config.branch.to_s.strip.empty? ? config.project_id.to_s : "#{config.project_id}:#{config.branch}"
|
89
87
|
end
|
90
88
|
|
91
|
-
#
|
89
|
+
# In rare cases the server might return HTML instead of JSON.
|
90
|
+
# It happens when too many requests are being sent.
|
91
|
+
# Until this is fixed, we revert to this quick'n'dirty solution.
|
92
|
+
EXCEPTIONS = [JSON::ParserError, RubyLokaliseApi::Error::TooManyRequests].freeze
|
93
|
+
|
94
|
+
# Implements an exponential backoff strategy for handling retries after failures.
|
92
95
|
def with_exp_backoff(max_retries)
|
93
96
|
return unless block_given?
|
94
97
|
|
95
98
|
retries = 0
|
96
99
|
begin
|
97
100
|
yield
|
98
|
-
rescue
|
101
|
+
rescue *EXCEPTIONS => e
|
99
102
|
raise(e.class, "Gave up after #{retries} retries") if retries >= max_retries
|
100
103
|
|
101
104
|
sleep 2**retries
|
@@ -4,14 +4,14 @@ require 'base64'
|
|
4
4
|
|
5
5
|
module LokaliseManager
|
6
6
|
module TaskDefinitions
|
7
|
-
#
|
7
|
+
# Class to handle exporting translation files from a local project to Lokalise.
|
8
8
|
class Exporter < Base
|
9
|
-
#
|
9
|
+
# Maximum number of concurrent uploads to avoid exceeding Lokalise API rate limits.
|
10
10
|
MAX_THREADS = 6
|
11
11
|
|
12
|
-
#
|
12
|
+
# Exports translation files to Lokalise and handles any necessary concurrency and error checking.
|
13
13
|
#
|
14
|
-
# @return [Array]
|
14
|
+
# @return [Array] An array of process statuses for each file uploaded.
|
15
15
|
def export!
|
16
16
|
check_options_errors!
|
17
17
|
|
@@ -25,16 +25,21 @@ module LokaliseManager
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
print_completion_message unless config.silent_mode
|
29
29
|
|
30
30
|
queued_processes
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
34
|
|
35
|
+
# Handles parallel uploads of a group of files, utilizing threading.
|
36
|
+
#
|
37
|
+
# @param files_group [Array] Group of files to be uploaded.
|
38
|
+
# @return [Array] Array of threads handling the file uploads.
|
39
|
+
|
35
40
|
def parallel_upload(files_group)
|
36
41
|
files_group.map do |file_data|
|
37
|
-
do_upload(*file_data)
|
42
|
+
Thread.new { do_upload(*file_data) }
|
38
43
|
end.map(&:value)
|
39
44
|
end
|
40
45
|
|
@@ -44,21 +49,28 @@ module LokaliseManager
|
|
44
49
|
raise(thread.error.class, "Error while trying to upload #{thread.path}: #{thread.error.message}")
|
45
50
|
end
|
46
51
|
|
47
|
-
# Performs the actual file
|
48
|
-
#
|
52
|
+
# Performs the actual upload of a file to Lokalise.
|
53
|
+
#
|
54
|
+
# @param f_path [Pathname] Full path to the file.
|
55
|
+
# @param r_path [Pathname] Relative path of the file within the project.
|
56
|
+
# @return [Struct] A struct with the success status, process details, and any error information.
|
49
57
|
def do_upload(f_path, r_path)
|
50
58
|
proc_klass = Struct.new(:success, :process, :path, :error, keyword_init: true)
|
51
|
-
|
52
|
-
Thread.new do
|
59
|
+
begin
|
53
60
|
process = with_exp_backoff(config.max_retries_export) do
|
54
|
-
api_client.upload_file
|
61
|
+
api_client.upload_file(project_id_with_branch, opts(f_path, r_path))
|
55
62
|
end
|
56
|
-
proc_klass.new
|
63
|
+
proc_klass.new(success: true, process: process, path: f_path)
|
57
64
|
rescue StandardError => e
|
58
|
-
proc_klass.new
|
65
|
+
proc_klass.new(success: false, path: f_path, error: e)
|
59
66
|
end
|
60
67
|
end
|
61
68
|
|
69
|
+
# Prints a completion message to standard output.
|
70
|
+
def print_completion_message
|
71
|
+
$stdout.print('Task complete!')
|
72
|
+
end
|
73
|
+
|
62
74
|
# Gets translation files from the specified directory
|
63
75
|
def all_files
|
64
76
|
loc_path = config.locales_path
|
@@ -6,11 +6,14 @@ require 'fileutils'
|
|
6
6
|
|
7
7
|
module LokaliseManager
|
8
8
|
module TaskDefinitions
|
9
|
-
# Importer class is
|
9
|
+
# The Importer class is responsible for downloading translation files from Lokalise
|
10
|
+
# and importing them into the specified project directory. This class extends the Base class,
|
11
|
+
# which provides shared functionality and configuration management.
|
10
12
|
class Importer < Base
|
11
|
-
#
|
13
|
+
# Initiates the import process by checking configuration, ensuring safe mode conditions,
|
14
|
+
# downloading files, and processing them. Outputs task completion status.
|
12
15
|
#
|
13
|
-
# @return [Boolean]
|
16
|
+
# @return [Boolean] Returns true if the import completes successfully, false if cancelled.
|
14
17
|
def import!
|
15
18
|
check_options_errors!
|
16
19
|
|
@@ -27,10 +30,9 @@ module LokaliseManager
|
|
27
30
|
|
28
31
|
private
|
29
32
|
|
30
|
-
# Downloads files from Lokalise using
|
31
|
-
# Utilizes exponential backoff if "too many requests" error is received
|
33
|
+
# Downloads translation files from Lokalise, handling retries and errors using exponential backoff.
|
32
34
|
#
|
33
|
-
# @return [Hash]
|
35
|
+
# @return [Hash] Returns the response from Lokalise API containing download details.
|
34
36
|
def download_files
|
35
37
|
with_exp_backoff(config.max_retries_import) do
|
36
38
|
api_client.download_files project_id_with_branch, config.import_opts
|
@@ -39,45 +41,40 @@ module LokaliseManager
|
|
39
41
|
raise e.class, "There was an error when trying to download files: #{e.message}"
|
40
42
|
end
|
41
43
|
|
42
|
-
# Opens ZIP archive
|
44
|
+
# Opens a ZIP archive from a given path and processes each entry if it matches the required file extension.
|
43
45
|
#
|
44
|
-
# @param path [String]
|
46
|
+
# @param path [String] The URL or local path to the ZIP archive.
|
45
47
|
def open_and_process_zip(path)
|
46
48
|
Zip::File.open_buffer(open_file_or_remote(path)) do |zip|
|
47
|
-
|
48
|
-
|
49
|
-
rescue StandardError => e
|
50
|
-
raise(e.class, "There was an error when trying to process the downloaded files: #{e.message}")
|
51
|
-
end
|
52
|
-
|
53
|
-
# Iterates over ZIP entries. Each entry may be a file or folder.
|
54
|
-
def fetch_zip_entries(zip)
|
55
|
-
return unless block_given?
|
56
|
-
|
57
|
-
zip.each do |entry|
|
58
|
-
next unless proper_ext? entry.name
|
49
|
+
zip.each do |entry|
|
50
|
+
next unless proper_ext?(entry.name)
|
59
51
|
|
60
|
-
|
52
|
+
process_entry(entry)
|
53
|
+
end
|
61
54
|
end
|
55
|
+
rescue StandardError => e
|
56
|
+
raise e.class, "Error processing ZIP file: #{e.message}"
|
62
57
|
end
|
63
58
|
|
64
|
-
# Processes ZIP entry by
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
59
|
+
# Processes a single ZIP entry by extracting data, determining the correct directory structure,
|
60
|
+
# and writing the data to the appropriate file.
|
61
|
+
#
|
62
|
+
# @param zip_entry [Zip::Entry] The ZIP entry to process.
|
63
|
+
def process_entry(zip_entry)
|
64
|
+
data = data_from(zip_entry)
|
65
|
+
subdir, filename = subdir_and_filename_for(zip_entry.name)
|
66
|
+
full_path = File.join(config.locales_path, subdir)
|
69
67
|
FileUtils.mkdir_p full_path
|
70
68
|
|
71
|
-
File.
|
72
|
-
f.write config.translations_converter.call(data)
|
73
|
-
end
|
69
|
+
File.write(File.join(full_path, filename), config.translations_converter.call(data), mode: 'w+:UTF-8')
|
74
70
|
rescue StandardError => e
|
75
|
-
raise e.class, "Error
|
71
|
+
raise e.class, "Error processing entry #{zip_entry.name}: #{e.message}"
|
76
72
|
end
|
77
73
|
|
78
|
-
#
|
74
|
+
# Determines if the import should proceed based on the safe mode setting and the content of the target directory.
|
75
|
+
# In safe mode, the directory must be empty, or the user must confirm continuation.
|
79
76
|
#
|
80
|
-
# @return [Boolean]
|
77
|
+
# @return [Boolean] Returns true if the import should proceed, false otherwise.
|
81
78
|
def proceed_when_safe_mode?
|
82
79
|
return true unless config.import_safe_mode && !Dir.empty?(config.locales_path.to_s)
|
83
80
|
|
@@ -87,9 +84,10 @@ module LokaliseManager
|
|
87
84
|
answer.to_s.strip == 'Y'
|
88
85
|
end
|
89
86
|
|
90
|
-
# Opens a local file or a remote URL using the provided
|
87
|
+
# Opens a local file or a remote URL using the provided path, safely handling different path schemes.
|
91
88
|
#
|
92
|
-
# @
|
89
|
+
# @param path [String] The path to the file, either a local path or a URL.
|
90
|
+
# @return [IO] Returns an IO object for the file.
|
93
91
|
def open_file_or_remote(path)
|
94
92
|
parsed_path = URI.parse(path)
|
95
93
|
|
@@ -100,6 +98,9 @@ module LokaliseManager
|
|
100
98
|
end
|
101
99
|
end
|
102
100
|
|
101
|
+
# Loads translations from the ZIP file.
|
102
|
+
#
|
103
|
+
# @param zip_entry [Zip::Entry] The ZIP entry to process.
|
103
104
|
def data_from(zip_entry)
|
104
105
|
config.translations_loader.call zip_entry.get_input_stream.read
|
105
106
|
end
|
data/lib/lokalise_manager.rb
CHANGED
@@ -6,34 +6,34 @@ require 'yaml'
|
|
6
6
|
loader = Zeitwerk::Loader.for_gem
|
7
7
|
loader.setup
|
8
8
|
|
9
|
-
# LokaliseManager
|
10
|
-
#
|
11
|
-
#
|
12
|
-
# exporter = LokaliseManager.exporter api_token: '1234abc', project_id: '123.abc'
|
13
|
-
#
|
14
|
-
# Use the instantiated objects to import or export your translation files:
|
9
|
+
# The LokaliseManager module provides functionalities to import and export translation
|
10
|
+
# files to and from the Lokalise TMS. It simplifies interactions with the Lokalise API
|
11
|
+
# by providing a straightforward interface to instantiate importers and exporters.
|
15
12
|
#
|
13
|
+
# Example:
|
14
|
+
# importer = LokaliseManager.importer(api_token: '1234abc', project_id: '123.abc')
|
15
|
+
# exporter = LokaliseManager.exporter(api_token: '1234abc', project_id: '123.abc')
|
16
16
|
# importer.import!
|
17
17
|
# exporter.export!
|
18
18
|
#
|
19
19
|
module LokaliseManager
|
20
20
|
class << self
|
21
|
-
#
|
22
|
-
#
|
21
|
+
# Creates an importer object for downloading translation files from Lokalise.
|
22
|
+
#
|
23
|
+
# @param custom_opts [Hash] Custom options for the importer (e.g., API token and project ID).
|
24
|
+
# @param global_config [Object] Global configuration settings, defaults to LokaliseManager::GlobalConfig.
|
25
|
+
# @return [LokaliseManager::TaskDefinitions::Importer] An instance of the importer.
|
23
26
|
#
|
24
|
-
# @return [LokaliseManager::TaskDefinitions::Importer]
|
25
|
-
# @param custom_opts [Hash]
|
26
|
-
# @param global_config [Object]
|
27
27
|
def importer(custom_opts = {}, global_config = LokaliseManager::GlobalConfig)
|
28
28
|
LokaliseManager::TaskDefinitions::Importer.new custom_opts, global_config
|
29
29
|
end
|
30
30
|
|
31
|
-
#
|
32
|
-
#
|
31
|
+
# Creates an exporter object for uploading translation files to Lokalise.
|
32
|
+
#
|
33
|
+
# @param custom_opts [Hash] Custom options for the exporter (e.g., API token and project ID).
|
34
|
+
# @param global_config [Object] Global configuration settings, defaults to LokaliseManager::GlobalConfig.
|
35
|
+
# @return [LokaliseManager::TaskDefinitions::Exporter] An instance of the exporter.
|
33
36
|
#
|
34
|
-
# @return [LokaliseManager::TaskDefinitions::Exporter]
|
35
|
-
# @param custom_opts [Hash]
|
36
|
-
# @param global_config [Object]
|
37
37
|
def exporter(custom_opts = {}, global_config = LokaliseManager::GlobalConfig)
|
38
38
|
LokaliseManager::TaskDefinitions::Exporter.new custom_opts, global_config
|
39
39
|
end
|
data/lokalise_manager.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_dependency 'rubyzip', '~> 2.3'
|
28
28
|
spec.add_dependency 'zeitwerk', '~> 2.4'
|
29
29
|
|
30
|
-
spec.add_development_dependency 'dotenv', '~>
|
30
|
+
spec.add_development_dependency 'dotenv', '~> 3.0'
|
31
31
|
spec.add_development_dependency 'rake', '~> 13.0'
|
32
32
|
spec.add_development_dependency 'rspec', '~> 3.6'
|
33
33
|
spec.add_development_dependency 'rubocop', '~> 1.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lokalise_manager
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Krukowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-lokalise-api
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '3.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '3.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -238,7 +238,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
238
238
|
- !ruby/object:Gem::Version
|
239
239
|
version: '0'
|
240
240
|
requirements: []
|
241
|
-
rubygems_version: 3.
|
241
|
+
rubygems_version: 3.5.10
|
242
242
|
signing_key:
|
243
243
|
specification_version: 4
|
244
244
|
summary: Lokalise integration for Ruby
|