lokalise_rails 0.2.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 +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +49 -25
- data/lib/generators/lokalise_rails/install_generator.rb +1 -1
- data/lib/generators/templates/lokalise_rails_config.rb +30 -25
- data/lib/lokalise_rails.rb +44 -19
- data/lib/lokalise_rails/railtie.rb +1 -1
- data/lib/lokalise_rails/task_definition/base.rb +37 -10
- data/lib/lokalise_rails/task_definition/exporter.rb +80 -0
- data/lib/lokalise_rails/task_definition/importer.rb +57 -15
- data/lib/lokalise_rails/version.rb +2 -2
- data/lib/tasks/lokalise_rails_tasks.rake +5 -6
- data/lokalise_rails.gemspec +0 -1
- data/spec/dummy/config/application.rb +2 -2
- data/spec/dummy/config/lokalise_rails.rb +4 -28
- data/spec/lib/generators/lokalise_rails/install_generator_spec.rb +1 -1
- data/spec/lib/lokalise_rails/exporter_spec.rb +144 -0
- data/spec/lib/lokalise_rails/importer_spec.rb +20 -4
- data/spec/lib/lokalise_rails_spec.rb +27 -3
- data/spec/lib/tasks/export_task_spec.rb +7 -0
- data/spec/lib/tasks/import_task_spec.rb +34 -14
- data/spec/spec_helper.rb +8 -2
- data/spec/support/file_manager.rb +81 -0
- data/spec/support/rake_utils.rb +4 -0
- metadata +9 -18
- data/spec/support/file_utils.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 87524123a10425d69c33950f4b2c16366146f5c1ab14c19dbc7185de61fb726a
|
4
|
+
data.tar.gz: 39ba0b0a91f443ea162d7804c89906f4523f7c13411fbd541624bafb9197a569
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4e36f385c123ab80402aaa428973c2c0706b2cbceabade8bcf12689fe0955bdc927a223c27a9114c102d83af6a709b061e1c10d2e189ca832b5b56a0a6b043f8
|
7
|
+
data.tar.gz: bbbe1857d99cdc7c3595f611d664c555981fbdf5f1d37c30a52cb179d641902f879b1492996dc7c1c1cb6dacdfbd7c2a3ca226f31a687879fddf59b1e8f9fe7a
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 1.0.0 (01-Oct-20)
|
4
|
+
|
5
|
+
* Added export feature
|
6
|
+
* More convenient configuration and additional options
|
7
|
+
* Other major enhancements
|
8
|
+
|
9
|
+
## 0.2.0 (26-Sep-20)
|
10
|
+
|
11
|
+
* Allow to override options properly
|
12
|
+
|
3
13
|
## 0.1.0 (26-Sep-20)
|
4
14
|
|
5
15
|
* Initial (proper) release
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# LokaliseRails
|
2
2
|
|
3
|
-
|
3
|
+
[](https://badge.fury.io/rb/lokalise_rails)
|
4
4
|
[](https://travis-ci.org/bodrovis/lokalise_rails)
|
5
5
|
[](https://codecov.io/gh/bodrovis/lokalise_rails)
|
6
6
|
|
@@ -10,17 +10,17 @@ This gem provides [Lokalise](http://lokalise.com) integration for Ruby on Rails
|
|
10
10
|
|
11
11
|
### Requirements
|
12
12
|
|
13
|
-
This gem requires Ruby 2.5+ and Rails 5.1+. It might work with older versions of Rails though. You will also need to setup a Lokalise account and a translation project. Finally, you will need to generate a read/write API token at your Lokalise profile.
|
13
|
+
This gem requires Ruby 2.5+ and Rails 5.1+. It might work with older versions of Rails though. You will also need to [setup a Lokalise account](https://app.lokalise.com/signup) and create a [translation project](https://docs.lokalise.com/en/articles/1400460-projects). Finally, you will need to generate a [read/write API token](https://docs.lokalise.com/en/articles/1929556-api-tokens) at your Lokalise profile.
|
14
14
|
|
15
15
|
### Installation
|
16
16
|
|
17
|
-
Add the gem to your `Gemfile
|
17
|
+
Add the gem to your `Gemfile`:
|
18
18
|
|
19
19
|
```ruby
|
20
20
|
gem 'lokalise_rails'
|
21
21
|
```
|
22
22
|
|
23
|
-
and run
|
23
|
+
and run:
|
24
24
|
|
25
25
|
```
|
26
26
|
bundle install
|
@@ -32,12 +32,17 @@ The latter command will generate a new config file `config/lokalise_rails.rb` lo
|
|
32
32
|
```ruby
|
33
33
|
require 'lokalise_rails'
|
34
34
|
|
35
|
-
LokaliseRails.
|
36
|
-
|
37
|
-
|
35
|
+
LokaliseRails.config do |c|
|
36
|
+
c.api_token = ENV['LOKALISE_API_TOKEN']
|
37
|
+
c.project_id = ENV['LOKALISE_PROJECT_ID']
|
38
|
+
|
39
|
+
# ...other options
|
40
|
+
end
|
38
41
|
```
|
39
42
|
|
40
|
-
You have to provide `api_token` and `project_id` to proceed.
|
43
|
+
You have to provide `api_token` and `project_id` to proceed. `project_id` can be found in your Lokalise project settings.
|
44
|
+
|
45
|
+
[Other options can be customized as well (see below)](https://github.com/bodrovis/lokalise_rails#import-settings) but they have sensible defaults.
|
41
46
|
|
42
47
|
## Importing translations from Lokalise
|
43
48
|
|
@@ -47,7 +52,15 @@ To import translations from the specified Lokalise project to your Rails app, ru
|
|
47
52
|
rails lokalise_rails:import
|
48
53
|
```
|
49
54
|
|
50
|
-
Please note that any
|
55
|
+
Please note that any duplicating files inside the `locales` directory (or any other directory that you've specified in the options) will be overwritten! You may enable [safe mode](https://github.com/bodrovis/lokalise_rails#import-settings) to check whether the folder is empty or not.
|
56
|
+
|
57
|
+
## Exporting translations to Lokalise
|
58
|
+
|
59
|
+
To export translations from your Rails app to the specified Lokalise project, run the following command:
|
60
|
+
|
61
|
+
```
|
62
|
+
rails lokalise_rails:export
|
63
|
+
```
|
51
64
|
|
52
65
|
## Configuration
|
53
66
|
|
@@ -55,23 +68,14 @@ Options are specified in the `config/lokalise_rails.rb` file.
|
|
55
68
|
|
56
69
|
### Global settings
|
57
70
|
|
58
|
-
* `
|
59
|
-
* `
|
60
|
-
* `locales_path` -
|
61
|
-
|
62
|
-
```ruby
|
63
|
-
class LokaliseRails
|
64
|
-
class << self
|
65
|
-
def locales_path
|
66
|
-
"#{Rails.root}/config/locales_custom"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
```
|
71
|
+
* `api_token` (`string`, required) - Lokalise API token with read/write permissions.
|
72
|
+
* `project_id` (`string`, required) - Lokalise project ID. You must have import/export permissions in the specified project.
|
73
|
+
* `locales_path` (`string`) - path to the directory with your translation files. Defaults to `"#{Rails.root}/config/locales"`.
|
74
|
+
* `file_ext_regexp` (`regexp`) - regular expression applied to file extensions to determine which files should be imported and exported. Defaults to `/\.ya?ml\z/i` (YAML files).
|
71
75
|
|
72
76
|
### Import settings
|
73
77
|
|
74
|
-
* `
|
78
|
+
* `import_opts` (`hash`) - options that will be passed to Lokalise API when downloading translations to your app. Here are the default options:
|
75
79
|
|
76
80
|
```ruby
|
77
81
|
{
|
@@ -84,8 +88,28 @@ end
|
|
84
88
|
}
|
85
89
|
```
|
86
90
|
|
87
|
-
Full list of available options [can be found
|
88
|
-
* `
|
91
|
+
Full list of available import options [can be found in the official API documentation](https://app.lokalise.com/api2docs/curl/#transition-download-files-post).
|
92
|
+
* `import_safe_mode` (`boolean`) - default to `false`. When this option is enabled, the import task will check whether the directory set with `locales_path` is empty or not. If it is not empty, you will be prompted to continue.
|
93
|
+
|
94
|
+
### Export settings
|
95
|
+
|
96
|
+
* `export_opts` (`hash`) - options that will be passed to Lokalise API when uploading translations. Full list of available export options [can be found in the official documentation](https://app.lokalise.com/api2docs/curl/#transition-download-files-post). By default, the following options are provided:
|
97
|
+
+ `data` (`string`, required) - base64-encoded contents of the translation file.
|
98
|
+
+ `filename` (`string`, required) - translation file name. If the file is stored under a subdirectory (for example, `nested/en.yml` inside the `locales/` directory), the whole path acts as a name. Later when importing files with such names, they will be placed into the proper subdirectories.
|
99
|
+
+ `lang_iso` (`string`, required) - language ISO code which is determined using the root key inside your YAML file. For example, in this case the `lang_iso` is `en_US`:
|
100
|
+
|
101
|
+
```yaml
|
102
|
+
en_US:
|
103
|
+
my_key: "my value"
|
104
|
+
```
|
105
|
+
|
106
|
+
**Please note** that if your Lokalise project does not have a language with the specified `lang_iso` code, the export will fail.
|
107
|
+
|
108
|
+
* `skip_file_export` (`lambda` or `proc`) - specify additional exclusion criteria for the exported files. By default, the rake task will ignore all non-file entries and all files with improper extensions (the latter is controlled by the `file_ext_regexp`). Lambda passed to this option should accept a single argument which is full path to the file (instance of the [`Pathname` class](https://ruby-doc.org/stdlib-2.7.1/libdoc/pathname/rdoc/Pathname.html)). For example, to exclude all files that have `fr` part in their names, add the following config:
|
109
|
+
|
110
|
+
```ruby
|
111
|
+
c.skip_file_export = ->(file) { f.split[1].to_s.include?('fr') }
|
112
|
+
```
|
89
113
|
|
90
114
|
## License
|
91
115
|
|
@@ -2,28 +2,33 @@
|
|
2
2
|
|
3
3
|
require 'lokalise_rails'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
#
|
11
|
-
#
|
12
|
-
|
13
|
-
#
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
|
19
|
-
#
|
20
|
-
#
|
21
|
-
|
22
|
-
|
23
|
-
#
|
24
|
-
#
|
25
|
-
|
26
|
-
#
|
27
|
-
#
|
28
|
-
|
29
|
-
#
|
5
|
+
LokaliseRails.config do |c|
|
6
|
+
# These are mandatory options that you must set before running rake tasks:
|
7
|
+
# c.api_token = ENV['LOKALISE_API_TOKEN']
|
8
|
+
# c.project_id = ENV['LOKALISE_PROJECT_ID']
|
9
|
+
|
10
|
+
# Provide a custom path to the directory with your translation files:
|
11
|
+
# c.locales_path = "#{Rails.root}/config/locales"
|
12
|
+
|
13
|
+
# Import options have the following defaults:
|
14
|
+
# c.import_opts = {
|
15
|
+
# format: 'yaml',
|
16
|
+
# placeholder_format: :icu,
|
17
|
+
# yaml_include_root: true,
|
18
|
+
# original_filenames: true,
|
19
|
+
# directory_prefix: '',
|
20
|
+
# indentation: '2sp'
|
21
|
+
# }
|
22
|
+
|
23
|
+
# Safe mode for imports is disabled by default:
|
24
|
+
# c.import_safe_mode = false
|
25
|
+
|
26
|
+
# Additional export options (only filename, contents, and lang_iso params are provided by default)
|
27
|
+
# c.export_opts = {}
|
28
|
+
|
29
|
+
# Provide additional file exclusion criteria for exports (by default, any file with the proper extension will be exported)
|
30
|
+
# c.skip_file_export = ->(file) { file.split[1].to_s.include?('fr') }
|
31
|
+
|
32
|
+
# Regular expression to use when choosing the files to extract from the downloaded archive and upload to Lokalise
|
33
|
+
# c.file_ext_regexp = /\.ya?ml\z/i
|
34
|
+
end
|
data/lib/lokalise_rails.rb
CHANGED
@@ -2,29 +2,54 @@
|
|
2
2
|
|
3
3
|
require 'lokalise_rails/task_definition/base'
|
4
4
|
require 'lokalise_rails/task_definition/importer'
|
5
|
+
require 'lokalise_rails/task_definition/exporter'
|
5
6
|
|
6
|
-
|
7
|
-
@project_id = nil
|
8
|
-
@import_opts = {
|
9
|
-
format: 'yaml',
|
10
|
-
placeholder_format: :icu,
|
11
|
-
yaml_include_root: true,
|
12
|
-
original_filenames: true,
|
13
|
-
directory_prefix: '',
|
14
|
-
indentation: '2sp'
|
15
|
-
}
|
16
|
-
# @export_opts = {
|
17
|
-
#
|
18
|
-
# }
|
19
|
-
@import_safe_mode = false
|
20
|
-
@api_token = nil
|
21
|
-
|
7
|
+
module LokaliseRails
|
22
8
|
class << self
|
23
|
-
attr_accessor :
|
24
|
-
|
9
|
+
attr_accessor :api_token, :project_id
|
10
|
+
attr_writer :import_opts, :import_safe_mode, :export_opts, :locales_path,
|
11
|
+
:file_ext_regexp, :skip_file_export
|
12
|
+
|
13
|
+
# Main interface to provide configuration options for rake tasks
|
14
|
+
def config
|
15
|
+
yield self
|
16
|
+
end
|
25
17
|
|
18
|
+
# Full path to directory with translation files
|
26
19
|
def locales_path
|
27
|
-
"#{Rails.root}/config/locales"
|
20
|
+
@locales_path || "#{Rails.root}/config/locales"
|
21
|
+
end
|
22
|
+
|
23
|
+
# Regular expression used to select translation files with proper extensions
|
24
|
+
def file_ext_regexp
|
25
|
+
@file_ext_regexp || /\.ya?ml\z/i
|
26
|
+
end
|
27
|
+
|
28
|
+
# Options for import rake task
|
29
|
+
def import_opts
|
30
|
+
@import_opts || {
|
31
|
+
format: 'yaml',
|
32
|
+
placeholder_format: :icu,
|
33
|
+
yaml_include_root: true,
|
34
|
+
original_filenames: true,
|
35
|
+
directory_prefix: '',
|
36
|
+
indentation: '2sp'
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
# Options for export rake task
|
41
|
+
def export_opts
|
42
|
+
@export_opts || {}
|
43
|
+
end
|
44
|
+
|
45
|
+
# Enables safe mode for import. When enabled, will check whether the target folder is empty or not
|
46
|
+
def import_safe_mode
|
47
|
+
@import_safe_mode.nil? ? false : @import_safe_mode
|
48
|
+
end
|
49
|
+
|
50
|
+
# Additional file skip criteria to apply when performing export
|
51
|
+
def skip_file_export
|
52
|
+
@skip_file_export || ->(_) { false }
|
28
53
|
end
|
29
54
|
end
|
30
55
|
end
|
@@ -1,21 +1,48 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'ruby-lokalise-api'
|
4
|
-
require '
|
4
|
+
require 'pathname'
|
5
5
|
|
6
|
-
|
6
|
+
module LokaliseRails
|
7
7
|
module TaskDefinition
|
8
8
|
class Base
|
9
9
|
class << self
|
10
|
-
|
11
|
-
return [
|
12
|
-
false, 'Project ID is not set! Aborting...'
|
13
|
-
] if LokaliseRails.project_id.nil? || LokaliseRails.project_id.empty?
|
14
|
-
return [
|
15
|
-
false, 'Lokalise API token is not set! Aborting...'
|
16
|
-
] if LokaliseRails.api_token.nil? || LokaliseRails.api_token.empty?
|
10
|
+
attr_writer :api_client
|
17
11
|
|
18
|
-
|
12
|
+
# Creates a Lokalise API client
|
13
|
+
#
|
14
|
+
# @return [Lokalise::Client]
|
15
|
+
def api_client
|
16
|
+
@api_client ||= ::Lokalise.client LokaliseRails.api_token
|
17
|
+
end
|
18
|
+
|
19
|
+
# Checks task options
|
20
|
+
#
|
21
|
+
# @return Array
|
22
|
+
def opt_errors
|
23
|
+
errors = []
|
24
|
+
errors << 'Project ID is not set! Aborting...' if LokaliseRails.project_id.nil? || LokaliseRails.project_id.empty?
|
25
|
+
errors << 'Lokalise API token is not set! Aborting...' if LokaliseRails.api_token.nil? || LokaliseRails.api_token.empty?
|
26
|
+
errors
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
# Checks whether the provided file has a proper extension as dictated by the `file_ext_regexp` option
|
32
|
+
#
|
33
|
+
# @return Boolean
|
34
|
+
# @param raw_path [String, Pathname]
|
35
|
+
def proper_ext?(raw_path)
|
36
|
+
path = raw_path.is_a?(Pathname) ? raw_path : Pathname.new(raw_path)
|
37
|
+
LokaliseRails.file_ext_regexp.match? path.extname
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns directory and filename for the given entry
|
41
|
+
#
|
42
|
+
# @return Array
|
43
|
+
# @param entry [String]
|
44
|
+
def subdir_and_filename_for(entry)
|
45
|
+
Pathname.new(entry).split
|
19
46
|
end
|
20
47
|
end
|
21
48
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
module LokaliseRails
|
6
|
+
module TaskDefinition
|
7
|
+
class Exporter < Base
|
8
|
+
class << self
|
9
|
+
# Performs translation file export from Rails to Lokalise and returns an array of queued processes
|
10
|
+
#
|
11
|
+
# @return [Array]
|
12
|
+
def export!
|
13
|
+
errors = opt_errors
|
14
|
+
|
15
|
+
if errors.any?
|
16
|
+
errors.each { |e| $stdout.puts e }
|
17
|
+
return false
|
18
|
+
end
|
19
|
+
|
20
|
+
queued_processes = []
|
21
|
+
each_file do |full_path, relative_path|
|
22
|
+
queued_processes << api_client.upload_file(
|
23
|
+
LokaliseRails.project_id, opts(full_path, relative_path)
|
24
|
+
)
|
25
|
+
rescue StandardError => e
|
26
|
+
$stdout.puts "Error while trying to upload #{full_path}: #{e.inspect}"
|
27
|
+
end
|
28
|
+
|
29
|
+
$stdout.print 'Task complete!'
|
30
|
+
|
31
|
+
queued_processes
|
32
|
+
end
|
33
|
+
|
34
|
+
# Processes each translation file in the specified directory
|
35
|
+
def each_file
|
36
|
+
return unless block_given?
|
37
|
+
|
38
|
+
loc_path = LokaliseRails.locales_path
|
39
|
+
Dir["#{loc_path}/**/*"].sort.each do |f|
|
40
|
+
full_path = Pathname.new f
|
41
|
+
|
42
|
+
next unless file_matches_criteria? full_path
|
43
|
+
|
44
|
+
relative_path = full_path.relative_path_from Pathname.new(loc_path)
|
45
|
+
|
46
|
+
yield full_path, relative_path
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Generates export options
|
51
|
+
#
|
52
|
+
# @return [Hash]
|
53
|
+
# @param full_p [Pathname]
|
54
|
+
# @param relative_p [Pathname]
|
55
|
+
def opts(full_p, relative_p)
|
56
|
+
content = File.read full_p
|
57
|
+
|
58
|
+
lang_iso = YAML.safe_load(content)&.keys&.first
|
59
|
+
|
60
|
+
initial_opts = {
|
61
|
+
data: Base64.strict_encode64(content.strip),
|
62
|
+
filename: relative_p,
|
63
|
+
lang_iso: lang_iso
|
64
|
+
}
|
65
|
+
|
66
|
+
initial_opts.merge LokaliseRails.export_opts
|
67
|
+
end
|
68
|
+
|
69
|
+
# Checks whether the specified file has to be processed or not
|
70
|
+
#
|
71
|
+
# @return [Boolean]
|
72
|
+
# @param full_path [Pathname]
|
73
|
+
def file_matches_criteria?(full_path)
|
74
|
+
full_path.file? && proper_ext?(full_path) &&
|
75
|
+
!LokaliseRails.skip_file_export.call(full_path)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -1,42 +1,84 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
3
|
+
require 'zip'
|
4
|
+
require 'yaml'
|
5
|
+
require 'open-uri'
|
6
|
+
require 'fileutils'
|
7
|
+
|
8
|
+
module LokaliseRails
|
4
9
|
module TaskDefinition
|
5
10
|
class Importer < Base
|
6
11
|
class << self
|
12
|
+
# Performs translation files import from Lokalise to Rails app
|
13
|
+
#
|
14
|
+
# @return [Boolean]
|
7
15
|
def import!
|
8
|
-
|
9
|
-
|
10
|
-
|
16
|
+
errors = opt_errors
|
17
|
+
|
18
|
+
if errors.any?
|
19
|
+
errors.each { |e| $stdout.puts e }
|
20
|
+
return false
|
21
|
+
end
|
22
|
+
|
23
|
+
unless proceed_when_safe_mode?
|
24
|
+
$stdout.print 'Task cancelled!'
|
25
|
+
return false
|
26
|
+
end
|
11
27
|
|
12
28
|
open_and_process_zip download_files['bundle_url']
|
13
29
|
|
14
|
-
'Task complete!'
|
30
|
+
$stdout.print 'Task complete!'
|
31
|
+
true
|
15
32
|
end
|
16
33
|
|
34
|
+
# Downloads files from Lokalise using the specified options
|
35
|
+
#
|
36
|
+
# @return [Hash]
|
17
37
|
def download_files
|
18
|
-
client = ::Lokalise.client LokaliseRails.api_token
|
19
38
|
opts = LokaliseRails.import_opts
|
20
39
|
|
21
|
-
|
40
|
+
api_client.download_files LokaliseRails.project_id, opts
|
41
|
+
rescue StandardError => e
|
42
|
+
$stdout.puts "There was an error when trying to download files: #{e.inspect}"
|
22
43
|
end
|
23
44
|
|
45
|
+
# Opens ZIP archive (local or remote) with translations and processes its entries
|
46
|
+
#
|
47
|
+
# @param path [String]
|
24
48
|
def open_and_process_zip(path)
|
25
|
-
Zip::File.open_buffer(URI.open(path))
|
49
|
+
Zip::File.open_buffer(URI.open(path)) do |zip|
|
50
|
+
fetch_zip_entries(zip) { |entry| process!(entry) }
|
51
|
+
end
|
26
52
|
end
|
27
53
|
|
28
|
-
|
54
|
+
# Iterates over ZIP entries. Each entry may be a file or folder.
|
55
|
+
def fetch_zip_entries(zip)
|
56
|
+
return unless block_given?
|
57
|
+
|
29
58
|
zip.each do |entry|
|
30
|
-
next unless
|
59
|
+
next unless proper_ext? entry.name
|
60
|
+
|
61
|
+
yield entry
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Processes ZIP entry by reading its contents and creating the corresponding translation file
|
66
|
+
def process!(zip_entry)
|
67
|
+
data = YAML.safe_load zip_entry.get_input_stream.read
|
68
|
+
subdir, filename = subdir_and_filename_for zip_entry.name
|
69
|
+
full_path = "#{LokaliseRails.locales_path}/#{subdir}"
|
70
|
+
FileUtils.mkdir_p full_path
|
31
71
|
|
32
|
-
|
33
|
-
|
34
|
-
File.open("#{LokaliseRails.locales_path}/#{filename}", 'w+:UTF-8') do |f|
|
35
|
-
f.write(data.to_yaml)
|
36
|
-
end
|
72
|
+
File.open(File.join(full_path, filename), 'w+:UTF-8') do |f|
|
73
|
+
f.write data.to_yaml
|
37
74
|
end
|
75
|
+
rescue StandardError => e
|
76
|
+
$stdout.puts "Error when trying to process #{zip_entry&.name}: #{e.inspect}"
|
38
77
|
end
|
39
78
|
|
79
|
+
# Checks whether the user wishes to proceed when safe mode is enabled and the target directory is not empty
|
80
|
+
#
|
81
|
+
# @return [Boolean]
|
40
82
|
def proceed_when_safe_mode?
|
41
83
|
return true unless LokaliseRails.import_safe_mode && !Dir.empty?(LokaliseRails.locales_path.to_s)
|
42
84
|
|
@@ -1,15 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rake'
|
4
|
-
require 'ruby-lokalise-api'
|
5
|
-
require 'zip'
|
6
|
-
require 'open-uri'
|
7
|
-
require 'yaml'
|
8
4
|
require "#{Rails.root}/config/lokalise_rails"
|
9
5
|
|
10
6
|
namespace :lokalise_rails do
|
11
7
|
task :import do
|
12
|
-
|
13
|
-
|
8
|
+
LokaliseRails::TaskDefinition::Importer.import!
|
9
|
+
end
|
10
|
+
|
11
|
+
task :export do
|
12
|
+
LokaliseRails::TaskDefinition::Exporter.export!
|
14
13
|
end
|
15
14
|
end
|
data/lokalise_rails.gemspec
CHANGED
@@ -40,6 +40,5 @@ Gem::Specification.new do |spec|
|
|
40
40
|
spec.add_development_dependency 'rubocop-performance', '~> 1.5'
|
41
41
|
spec.add_development_dependency 'rubocop-rspec', '~> 1.37'
|
42
42
|
spec.add_development_dependency 'simplecov', '~> 0.16'
|
43
|
-
spec.add_development_dependency 'sqlite3', '~> 1.4'
|
44
43
|
spec.add_development_dependency 'vcr', '~> 6.0'
|
45
44
|
end
|
@@ -4,9 +4,9 @@ require_relative 'boot'
|
|
4
4
|
|
5
5
|
require 'rails'
|
6
6
|
# Pick the frameworks you want:
|
7
|
-
require 'active_model/railtie'
|
7
|
+
# require 'active_model/railtie'
|
8
8
|
# require "active_job/railtie"
|
9
|
-
require 'active_record/railtie'
|
9
|
+
# require 'active_record/railtie'
|
10
10
|
# require "active_storage/engine"
|
11
11
|
require 'action_controller/railtie'
|
12
12
|
# require "action_mailer/railtie"
|
@@ -1,29 +1,5 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
1
|
require 'lokalise_rails'
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# Import options have the following defaults:
|
10
|
-
# LokaliseRails.import_opts = {
|
11
|
-
# format: 'yaml',
|
12
|
-
# placeholder_format: :icu,
|
13
|
-
# yaml_include_root: true,
|
14
|
-
# original_filenames: true,
|
15
|
-
# directory_prefix: '',
|
16
|
-
# indentation: '2sp'
|
17
|
-
# }
|
18
|
-
|
19
|
-
# Safe mode is disabled by default:
|
20
|
-
# LokaliseRails.import_safe_mode = false
|
21
|
-
|
22
|
-
# Provide a custom path to the directory with your translation files:
|
23
|
-
# class LokaliseRails
|
24
|
-
# class << self
|
25
|
-
# def locales_path
|
26
|
-
# "#{Rails.root}/config/locales"
|
27
|
-
# end
|
28
|
-
# end
|
29
|
-
# end
|
2
|
+
LokaliseRails.config do |c|
|
3
|
+
c.api_token = ENV['LOKALISE_API_TOKEN']
|
4
|
+
c.project_id = ENV['LOKALISE_PROJECT_ID']
|
5
|
+
end
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
describe LokaliseRails::TaskDefinition::Exporter do
|
6
|
+
let(:filename) { 'en.yml' }
|
7
|
+
let(:path) { "#{Rails.root}/config/locales/nested/#{filename}" }
|
8
|
+
let(:relative_name) { "nested/#{filename}" }
|
9
|
+
|
10
|
+
context 'with one translation file' do
|
11
|
+
before :all do
|
12
|
+
add_translation_files!
|
13
|
+
end
|
14
|
+
|
15
|
+
after :all do
|
16
|
+
rm_translation_files
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '.export!' do
|
20
|
+
it 'sends a proper API request' do
|
21
|
+
process = VCR.use_cassette('upload_files') do
|
22
|
+
described_class.export!
|
23
|
+
end.first
|
24
|
+
|
25
|
+
expect(process.project_id).to eq(LokaliseRails.project_id)
|
26
|
+
expect(process.status).to eq('queued')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'halts when the API key is not set' do
|
30
|
+
expect(LokaliseRails).to receive(:api_token).and_return(nil)
|
31
|
+
expect(described_class).not_to receive(:each_file)
|
32
|
+
expect(-> { described_class.export! }).to output(/API token is not set/).to_stdout
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'halts when the project_id is not set' do
|
36
|
+
expect(LokaliseRails).to receive(:project_id).and_return(nil)
|
37
|
+
expect(described_class).not_to receive(:each_file)
|
38
|
+
expect(-> { described_class.export! }).to output(/Project ID is not set/).to_stdout
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '.each_file' do
|
43
|
+
it 'yield proper arguments' do
|
44
|
+
expect { |b| described_class.each_file(&b) }.to yield_with_args(
|
45
|
+
Pathname.new(path),
|
46
|
+
Pathname.new(relative_name)
|
47
|
+
)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '.opts' do
|
52
|
+
let(:base64content) { Base64.strict_encode64(File.read(path).strip) }
|
53
|
+
|
54
|
+
it 'generates proper options' do
|
55
|
+
resulting_opts = described_class.opts(path, relative_name)
|
56
|
+
|
57
|
+
expect(resulting_opts[:data]).to eq(base64content)
|
58
|
+
expect(resulting_opts[:filename]).to eq(relative_name)
|
59
|
+
expect(resulting_opts[:lang_iso]).to eq('en')
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'allows to redefine options' do
|
63
|
+
expect(LokaliseRails).to receive(:export_opts).and_return({
|
64
|
+
detect_icu_plurals: true,
|
65
|
+
convert_placeholders: true
|
66
|
+
})
|
67
|
+
|
68
|
+
resulting_opts = described_class.opts(path, relative_name)
|
69
|
+
|
70
|
+
expect(resulting_opts[:data]).to eq(base64content)
|
71
|
+
expect(resulting_opts[:filename]).to eq(relative_name)
|
72
|
+
expect(resulting_opts[:lang_iso]).to eq('en')
|
73
|
+
expect(resulting_opts[:detect_icu_plurals]).to be true
|
74
|
+
expect(resulting_opts[:convert_placeholders]).to be true
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context 'with two translation files' do
|
80
|
+
let(:filename_ru) { 'ru.yml' }
|
81
|
+
let(:path_ru) { "#{Rails.root}/config/locales/#{filename_ru}" }
|
82
|
+
let(:relative_name_ru) { filename_ru }
|
83
|
+
|
84
|
+
before :all do
|
85
|
+
add_translation_files! with_ru: true
|
86
|
+
end
|
87
|
+
|
88
|
+
after :all do
|
89
|
+
rm_translation_files
|
90
|
+
end
|
91
|
+
|
92
|
+
describe '.export!' do
|
93
|
+
it 'rescues from export errors' do
|
94
|
+
processes = VCR.use_cassette('upload_files_error') do
|
95
|
+
described_class.export!
|
96
|
+
end
|
97
|
+
|
98
|
+
expect(processes.length).to eq(1)
|
99
|
+
process = processes.first
|
100
|
+
expect(process.project_id).to eq(LokaliseRails.project_id)
|
101
|
+
expect(process.status).to eq('queued')
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '.opts' do
|
106
|
+
let(:base64content_ru) { Base64.strict_encode64(File.read(path_ru).strip) }
|
107
|
+
|
108
|
+
it 'generates proper options' do
|
109
|
+
resulting_opts = described_class.opts(path_ru, relative_name_ru)
|
110
|
+
|
111
|
+
expect(resulting_opts[:data]).to eq(base64content_ru)
|
112
|
+
expect(resulting_opts[:filename]).to eq(relative_name_ru)
|
113
|
+
expect(resulting_opts[:lang_iso]).to eq('ru_RU')
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '.each_file' do
|
118
|
+
it 'yields every translation file' do
|
119
|
+
expect { |b| described_class.each_file(&b) }.to yield_successive_args(
|
120
|
+
[
|
121
|
+
Pathname.new(path),
|
122
|
+
Pathname.new(relative_name)
|
123
|
+
],
|
124
|
+
[
|
125
|
+
Pathname.new(path_ru),
|
126
|
+
Pathname.new(relative_name_ru)
|
127
|
+
]
|
128
|
+
)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'does not yield files that have to be skipped' do
|
132
|
+
expect(LokaliseRails).to receive(:skip_file_export).twice.and_return(
|
133
|
+
->(f) { f.split[1].to_s.include?('ru') }
|
134
|
+
)
|
135
|
+
expect { |b| described_class.each_file(&b) }.to yield_successive_args(
|
136
|
+
[
|
137
|
+
Pathname.new(path),
|
138
|
+
Pathname.new(relative_name)
|
139
|
+
]
|
140
|
+
)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
@@ -1,6 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
describe LokaliseRails::TaskDefinition::Importer do
|
4
|
+
describe '.open_and_process_zip' do
|
5
|
+
let(:faulty_trans) { "#{Rails.root}/public/faulty_trans.zip" }
|
6
|
+
|
7
|
+
it 'rescues from errors during file processing' do
|
8
|
+
expect(-> { described_class.open_and_process_zip(faulty_trans) }).
|
9
|
+
to output(/Psych::DisallowedClass/).to_stdout
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
4
13
|
describe '.download_files' do
|
5
14
|
it 'returns a proper download URL' do
|
6
15
|
expect(LokaliseRails).to receive(:project_id).and_return('189934715f57a162257d74.88352370')
|
@@ -11,20 +20,27 @@ describe LokaliseRails::TaskDefinition::Importer do
|
|
11
20
|
expect(response['project_id']).to eq('189934715f57a162257d74.88352370')
|
12
21
|
expect(response['bundle_url']).to include('s3-eu-west-1.amazonaws.com')
|
13
22
|
end
|
23
|
+
|
24
|
+
it 'rescues from errors during file download' do
|
25
|
+
allow(LokaliseRails).to receive(:api_token).and_return('incorrect')
|
26
|
+
|
27
|
+
VCR.use_cassette('download_files_error') do
|
28
|
+
expect(-> { described_class.download_files }).
|
29
|
+
to output(/Lokalise::Error::BadRequest/).to_stdout
|
30
|
+
end
|
31
|
+
end
|
14
32
|
end
|
15
33
|
|
16
34
|
describe '.import!' do
|
17
35
|
it 'halts when the API key is not set' do
|
18
36
|
expect(LokaliseRails).to receive(:api_token).and_return(nil)
|
19
|
-
|
20
|
-
expect(result).to include('API token is not set')
|
37
|
+
expect(-> {described_class.import!}).to output(/API token is not set/).to_stdout
|
21
38
|
expect(count_translations).to eq(0)
|
22
39
|
end
|
23
40
|
|
24
41
|
it 'halts when the project_id is not set' do
|
25
42
|
expect(LokaliseRails).to receive(:project_id).and_return(nil)
|
26
|
-
|
27
|
-
expect(result).to include('Project ID is not set')
|
43
|
+
expect(-> {described_class.import!}).to output(/Project ID is not set/).to_stdout
|
28
44
|
expect(count_translations).to eq(0)
|
29
45
|
end
|
30
46
|
end
|
@@ -1,10 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
describe LokaliseRails do
|
4
|
-
it '
|
4
|
+
it 'returns a proper version' do
|
5
5
|
expect(LokaliseRails::VERSION).to be_a(String)
|
6
6
|
end
|
7
7
|
|
8
|
+
it 'is possible to provide config options' do
|
9
|
+
described_class.config do |c|
|
10
|
+
expect(c).to eq(described_class)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
8
14
|
describe 'parameters' do
|
9
15
|
let(:fake_class) { class_double('LokaliseRails') }
|
10
16
|
|
@@ -13,6 +19,11 @@ describe LokaliseRails do
|
|
13
19
|
fake_class.project_id = '123.abc'
|
14
20
|
end
|
15
21
|
|
22
|
+
it 'is possible to set file_ext_regexp' do
|
23
|
+
expect(fake_class).to receive(:file_ext_regexp=).with(Regexp.new('.*'))
|
24
|
+
fake_class.file_ext_regexp = Regexp.new('.*')
|
25
|
+
end
|
26
|
+
|
16
27
|
it 'is possible to set import_opts' do
|
17
28
|
expect(fake_class).to receive(:import_opts=).with(duck_type(:each))
|
18
29
|
fake_class.import_opts = {
|
@@ -21,6 +32,14 @@ describe LokaliseRails do
|
|
21
32
|
}
|
22
33
|
end
|
23
34
|
|
35
|
+
it 'is possible to set export_opts' do
|
36
|
+
expect(fake_class).to receive(:export_opts=).with(duck_type(:each))
|
37
|
+
fake_class.export_opts = {
|
38
|
+
convert_placeholders: true,
|
39
|
+
detect_icu_plurals: true
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
24
43
|
it 'is possible to set import_safe_mode' do
|
25
44
|
expect(fake_class).to receive(:import_safe_mode=).with(true)
|
26
45
|
fake_class.import_safe_mode = true
|
@@ -32,9 +51,14 @@ describe LokaliseRails do
|
|
32
51
|
end
|
33
52
|
|
34
53
|
it 'is possible to override locales_path' do
|
35
|
-
expect(fake_class).to receive(:locales_path).
|
54
|
+
expect(fake_class).to receive(:locales_path=).with('/demo/path')
|
55
|
+
fake_class.locales_path = '/demo/path'
|
56
|
+
end
|
36
57
|
|
37
|
-
|
58
|
+
it 'is possible to set skip_file_export' do
|
59
|
+
cond = ->(f) { f.nil? }
|
60
|
+
expect(fake_class).to receive(:skip_file_export=).with(cond)
|
61
|
+
fake_class.skip_file_export = cond
|
38
62
|
end
|
39
63
|
end
|
40
64
|
end
|
@@ -3,6 +3,10 @@
|
|
3
3
|
require 'fileutils'
|
4
4
|
|
5
5
|
RSpec.describe LokaliseRails do
|
6
|
+
let(:loc_path) { described_class.locales_path }
|
7
|
+
let(:local_trans) { "#{Rails.root}/public/trans.zip" }
|
8
|
+
let(:remote_trans) { 'https://github.com/bodrovis/lokalise_rails/blob/master/spec/dummy/public/trans.zip?raw=true' }
|
9
|
+
|
6
10
|
context 'when directory is empty' do
|
7
11
|
before do
|
8
12
|
mkdir_locales
|
@@ -13,13 +17,13 @@ RSpec.describe LokaliseRails do
|
|
13
17
|
rm_translation_files
|
14
18
|
end
|
15
19
|
|
16
|
-
it 'is callable' do
|
20
|
+
it 'import rake task is callable' do
|
17
21
|
expect(LokaliseRails::TaskDefinition::Importer).to receive(
|
18
22
|
:download_files
|
19
23
|
).and_return(
|
20
24
|
{
|
21
25
|
'project_id' => '123.abc',
|
22
|
-
'bundle_url' =>
|
26
|
+
'bundle_url' => local_trans
|
23
27
|
}
|
24
28
|
)
|
25
29
|
|
@@ -27,17 +31,18 @@ RSpec.describe LokaliseRails do
|
|
27
31
|
|
28
32
|
expect(count_translations).to eq(4)
|
29
33
|
|
30
|
-
|
31
|
-
|
34
|
+
expect_file_exist loc_path, 'en/nested/main_en.yml'
|
35
|
+
expect_file_exist loc_path, 'en/nested/deep/secondary_en.yml'
|
36
|
+
expect_file_exist loc_path, 'ru/main_ru.yml'
|
32
37
|
end
|
33
38
|
|
34
|
-
it 'downloads ZIP archive properly' do
|
39
|
+
it 'import rake task downloads ZIP archive properly' do
|
35
40
|
expect(LokaliseRails::TaskDefinition::Importer).to receive(
|
36
41
|
:download_files
|
37
42
|
).and_return(
|
38
43
|
{
|
39
44
|
'project_id' => '123.abc',
|
40
|
-
'bundle_url' =>
|
45
|
+
'bundle_url' => remote_trans
|
41
46
|
}
|
42
47
|
)
|
43
48
|
|
@@ -45,38 +50,53 @@ RSpec.describe LokaliseRails do
|
|
45
50
|
|
46
51
|
expect(count_translations).to eq(4)
|
47
52
|
|
48
|
-
|
49
|
-
|
53
|
+
expect_file_exist loc_path, 'en/nested/main_en.yml'
|
54
|
+
expect_file_exist loc_path, 'en/nested/deep/secondary_en.yml'
|
55
|
+
expect_file_exist loc_path, 'ru/main_ru.yml'
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
53
|
-
context 'when directory is not empty' do
|
59
|
+
context 'when directory is not empty and safe mode enabled' do
|
54
60
|
before :all do
|
55
61
|
mkdir_locales
|
56
|
-
rm_translation_files
|
57
|
-
temp_file = File.join described_class.locales_path, 'kill.me'
|
58
|
-
File.open(temp_file, 'w+') { |file| file.write('temp') }
|
59
62
|
described_class.import_safe_mode = true
|
60
63
|
end
|
61
64
|
|
65
|
+
before do
|
66
|
+
rm_translation_files
|
67
|
+
add_translation_files!
|
68
|
+
end
|
69
|
+
|
62
70
|
after :all do
|
63
71
|
rm_translation_files
|
64
72
|
described_class.import_safe_mode = false
|
65
73
|
end
|
66
74
|
|
67
|
-
it '
|
75
|
+
it 'import proceeds when the user agrees' do
|
68
76
|
expect(LokaliseRails::TaskDefinition::Importer).to receive(
|
69
77
|
:download_files
|
70
78
|
).and_return(
|
71
79
|
{
|
72
80
|
'project_id' => '123.abc',
|
73
|
-
'bundle_url' =>
|
81
|
+
'bundle_url' => local_trans
|
74
82
|
}
|
75
83
|
)
|
76
84
|
expect($stdin).to receive(:gets).and_return('Y')
|
77
85
|
expect(import_executor).to output(/is not empty/).to_stdout
|
78
86
|
|
79
87
|
expect(count_translations).to eq(5)
|
88
|
+
|
89
|
+
expect_file_exist loc_path, 'en/nested/main_en.yml'
|
90
|
+
expect_file_exist loc_path, 'en/nested/deep/secondary_en.yml'
|
91
|
+
expect_file_exist loc_path, 'ru/main_ru.yml'
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'import halts when a user chooses not to proceed' do
|
95
|
+
expect(LokaliseRails::TaskDefinition::Importer).not_to receive(:download_files)
|
96
|
+
expect($stdin).to receive(:gets).and_return('N')
|
97
|
+
expect(import_executor).to output(/is not empty/).to_stdout
|
98
|
+
|
99
|
+
expect(count_translations).to eq(1)
|
80
100
|
end
|
81
101
|
end
|
82
102
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'dotenv/load'
|
4
4
|
require 'simplecov'
|
5
|
+
|
5
6
|
SimpleCov.start 'rails' do
|
6
7
|
add_filter 'spec/'
|
7
8
|
add_filter '.github/'
|
@@ -21,14 +22,19 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].sort.each { |f| require f }
|
|
21
22
|
ENV['RAILS_ENV'] = 'test'
|
22
23
|
|
23
24
|
require_relative '../spec/dummy/config/environment'
|
24
|
-
ActiveRecord::Migrator.migrations_paths = [File.expand_path('../spec/dummy/db/migrate', __dir__)]
|
25
|
+
# ActiveRecord::Migrator.migrations_paths = [File.expand_path('../spec/dummy/db/migrate', __dir__)]
|
25
26
|
ENV['RAILS_ROOT'] ||= "#{File.dirname(__FILE__)}../../../spec/dummy"
|
26
27
|
|
27
28
|
require 'rspec/rails'
|
28
29
|
|
29
30
|
RSpec.configure do |config|
|
30
|
-
config.include
|
31
|
+
config.include FileManager
|
31
32
|
config.include RakeUtils
|
32
33
|
end
|
33
34
|
|
35
|
+
# rubocop:disable Style/MixinUsage
|
36
|
+
include FileManager
|
37
|
+
# rubocop:enable Style/MixinUsage
|
38
|
+
|
39
|
+
add_config!
|
34
40
|
Rails.application.load_tasks
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
module FileManager
|
6
|
+
def expect_file_exist(path, file)
|
7
|
+
file_path = File.join path, file
|
8
|
+
expect(File.file?(file_path)).to be true
|
9
|
+
end
|
10
|
+
|
11
|
+
def mkdir_locales
|
12
|
+
FileUtils.mkdir_p(LokaliseRails.locales_path) unless File.directory?(LokaliseRails.locales_path)
|
13
|
+
end
|
14
|
+
|
15
|
+
def rm_translation_files
|
16
|
+
FileUtils.rm_rf locales_dir
|
17
|
+
end
|
18
|
+
|
19
|
+
def locales_dir
|
20
|
+
Dir["#{LokaliseRails.locales_path}/**/*"]
|
21
|
+
end
|
22
|
+
|
23
|
+
def count_translations
|
24
|
+
locales_dir.count { |file| File.file?(file) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def add_translation_files!(with_ru: false)
|
28
|
+
FileUtils.mkdir_p "#{Rails.root}/config/locales/nested"
|
29
|
+
File.open("#{Rails.root}/config/locales/nested/en.yml", 'w+:UTF-8') do |f|
|
30
|
+
f.write en_data
|
31
|
+
end
|
32
|
+
|
33
|
+
return unless with_ru
|
34
|
+
|
35
|
+
File.open("#{Rails.root}/config/locales/ru.yml", 'w+:UTF-8') do |f|
|
36
|
+
f.write ru_data
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def add_config!
|
41
|
+
data = <<~DATA
|
42
|
+
require 'lokalise_rails'
|
43
|
+
LokaliseRails.config do |c|
|
44
|
+
c.api_token = ENV['LOKALISE_API_TOKEN']
|
45
|
+
c.project_id = ENV['LOKALISE_PROJECT_ID']
|
46
|
+
end
|
47
|
+
DATA
|
48
|
+
|
49
|
+
File.open("#{Rails.root}/config/lokalise_rails.rb", 'w+:UTF-8') do |f|
|
50
|
+
f.write data
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def remove_config
|
55
|
+
FileUtils.remove_file config_file if File.file?(config_file)
|
56
|
+
end
|
57
|
+
|
58
|
+
def config_file
|
59
|
+
"#{Rails.root}/config/lokalise_rails.rb"
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def en_data
|
65
|
+
<<~DATA
|
66
|
+
en:
|
67
|
+
my_key: "My value"
|
68
|
+
nested:
|
69
|
+
key: "Value 2"
|
70
|
+
DATA
|
71
|
+
end
|
72
|
+
|
73
|
+
def ru_data
|
74
|
+
<<~DATA
|
75
|
+
ru_RU:
|
76
|
+
my_key: "Моё значение"
|
77
|
+
nested:
|
78
|
+
key: "Значение 2"
|
79
|
+
DATA
|
80
|
+
end
|
81
|
+
end
|
data/spec/support/rake_utils.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lokalise_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ilya Bodrov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-lokalise-api
|
@@ -178,20 +178,6 @@ dependencies:
|
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
180
|
version: '0.16'
|
181
|
-
- !ruby/object:Gem::Dependency
|
182
|
-
name: sqlite3
|
183
|
-
requirement: !ruby/object:Gem::Requirement
|
184
|
-
requirements:
|
185
|
-
- - "~>"
|
186
|
-
- !ruby/object:Gem::Version
|
187
|
-
version: '1.4'
|
188
|
-
type: :development
|
189
|
-
prerelease: false
|
190
|
-
version_requirements: !ruby/object:Gem::Requirement
|
191
|
-
requirements:
|
192
|
-
- - "~>"
|
193
|
-
- !ruby/object:Gem::Version
|
194
|
-
version: '1.4'
|
195
181
|
- !ruby/object:Gem::Dependency
|
196
182
|
name: vcr
|
197
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -228,6 +214,7 @@ files:
|
|
228
214
|
- lib/lokalise_rails.rb
|
229
215
|
- lib/lokalise_rails/railtie.rb
|
230
216
|
- lib/lokalise_rails/task_definition/base.rb
|
217
|
+
- lib/lokalise_rails/task_definition/exporter.rb
|
231
218
|
- lib/lokalise_rails/task_definition/importer.rb
|
232
219
|
- lib/lokalise_rails/version.rb
|
233
220
|
- lib/tasks/lokalise_rails_tasks.rake
|
@@ -255,11 +242,13 @@ files:
|
|
255
242
|
- spec/dummy/config/routes.rb
|
256
243
|
- spec/dummy/db/seeds.rb
|
257
244
|
- spec/lib/generators/lokalise_rails/install_generator_spec.rb
|
245
|
+
- spec/lib/lokalise_rails/exporter_spec.rb
|
258
246
|
- spec/lib/lokalise_rails/importer_spec.rb
|
259
247
|
- spec/lib/lokalise_rails_spec.rb
|
248
|
+
- spec/lib/tasks/export_task_spec.rb
|
260
249
|
- spec/lib/tasks/import_task_spec.rb
|
261
250
|
- spec/spec_helper.rb
|
262
|
-
- spec/support/
|
251
|
+
- spec/support/file_manager.rb
|
263
252
|
- spec/support/rake_utils.rb
|
264
253
|
- spec/support/vcr.rb
|
265
254
|
homepage: https://github.com/bodrovis/lokalise_rails
|
@@ -309,10 +298,12 @@ test_files:
|
|
309
298
|
- spec/dummy/config/routes.rb
|
310
299
|
- spec/dummy/db/seeds.rb
|
311
300
|
- spec/lib/generators/lokalise_rails/install_generator_spec.rb
|
301
|
+
- spec/lib/lokalise_rails/exporter_spec.rb
|
312
302
|
- spec/lib/lokalise_rails/importer_spec.rb
|
313
303
|
- spec/lib/lokalise_rails_spec.rb
|
304
|
+
- spec/lib/tasks/export_task_spec.rb
|
314
305
|
- spec/lib/tasks/import_task_spec.rb
|
315
306
|
- spec/spec_helper.rb
|
316
|
-
- spec/support/
|
307
|
+
- spec/support/file_manager.rb
|
317
308
|
- spec/support/rake_utils.rb
|
318
309
|
- spec/support/vcr.rb
|
data/spec/support/file_utils.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module FileUtils
|
4
|
-
def mkdir_locales
|
5
|
-
FileUtils.mkdir_p(LokaliseRails.locales_path) unless File.directory?(LokaliseRails.locales_path)
|
6
|
-
end
|
7
|
-
|
8
|
-
def rm_translation_files
|
9
|
-
FileUtils.rm_rf locales_dir
|
10
|
-
end
|
11
|
-
|
12
|
-
def locales_dir
|
13
|
-
Dir["#{LokaliseRails.locales_path}/*"]
|
14
|
-
end
|
15
|
-
|
16
|
-
def count_translations
|
17
|
-
locales_dir.count { |file| File.file?(file) }
|
18
|
-
end
|
19
|
-
|
20
|
-
def remove_config
|
21
|
-
FileUtils.remove_file config_file if File.file?(config_file)
|
22
|
-
end
|
23
|
-
|
24
|
-
def config_file
|
25
|
-
"#{Rails.root}/config/lokalise_rails.rb"
|
26
|
-
end
|
27
|
-
end
|