i18n-migrations 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b742b520e0c42a29cbed11f435eaf57293a4c958de7ed2eed8be1ed802bfc7da
4
- data.tar.gz: b69d6b18f29f0290810322c8e051f5895ffd69982725b3cb8ea9b01630094af1
3
+ metadata.gz: a61642308e6f7429d13a4c6f1b0f6789b75af51091b3966474c72fe1834e79f9
4
+ data.tar.gz: 046affdbc02080b90a1d18e0b89f668a025e404e25016cab3036fa7151c1680f
5
5
  SHA512:
6
- metadata.gz: 36e7b155f30d24c24fc84c181860595dbb995c7cf53f9ca6c7b693794b7b7cfa1a1f9a287c996c3ed75e7fe897b8a870946a37ec73c47bf25c2ea7c005fb766a
7
- data.tar.gz: e5957eb775f2592d38824141e5c67cf42e8889c71c6cf239c98bb1ffeb0250529963ddc8f58d5df4a2a5dde0a51ca6a7c0cb848fae73c5648194a4989b7993bf
6
+ metadata.gz: b2383e487b6aff057aa3e78d831b692344bab7058ce9b94df3ee95b9e559fd9bbeb8112c5b75315097d5473679380f1f1ee9a0e46beb83b045ad2d1a501da5ed
7
+ data.tar.gz: ee172e7cda5416a57e31370dc694c5df868217b780a6de51b3eb99e6389d298e6f82d8c9997faaf19e9b9b6c1c821be1066714b82c9461e2d4bb659cda1dec04
data/.ruby-gemset CHANGED
@@ -1 +1 @@
1
- transparentclassroom
1
+ i18n-migrations
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.4.1
1
+ ruby-2.6.4
@@ -44,7 +44,7 @@ module I18n
44
44
  # returns updated after term, errors
45
45
  def fix(before, after, key: nil)
46
46
  is_html = format(key) == :html
47
- errors = []
47
+ errors = ["#{@to_locale}: #{key}"]
48
48
 
49
49
  # do not translate
50
50
  @do_not_translate.each do |term, bad_translations|
@@ -116,7 +116,7 @@ module I18n
116
116
  end
117
117
 
118
118
 
119
- [after, errors]
119
+ [after, errors.length > 1 ? errors : []]
120
120
  end
121
121
 
122
122
  private
@@ -1,7 +1,6 @@
1
1
  require 'fileutils'
2
2
  require 'yaml'
3
- require 'active_support/inflector'
4
- require 'active_support/core_ext/object'
3
+ require 'active_support'
5
4
  require 'colorize'
6
5
 
7
6
  # this class does all the work, but doesn't hold config or do more than one locale
@@ -1,32 +1,42 @@
1
1
  module I18n
2
2
  module Migrations
3
3
  class Migration
4
+ class Logger
5
+ def initialize(verbose: false)
6
+ @verbose = verbose
7
+ end
8
+
9
+ def info(message)
10
+ puts message if @verbose
11
+ end
12
+ end
13
+
14
+ # translations = facade over translations
4
15
  # locale = en | es | ...
5
- # data = all keys -> all translations in this locale
6
- # notes = some keys -> notes about the translation in this locale
7
16
  # dictionary = call dictionary.lookup(term) to get localized version of a term
8
17
  # direction = :up | :down (up when migrating, down when rolling back)
9
- def initialize(locale, data, notes, dictionary, direction = :up, verbose = false)
10
- @locale, @data, @notes, @dictionary, @direction, @verbose = locale, data, notes, dictionary, direction, verbose
18
+ def initialize(translations:, locale_code:, dictionary:, direction: :up, logger: Logger.new)
19
+ @translations, @locale_code, @dictionary, @direction, @logger =
20
+ translations, locale_code, dictionary, direction, logger
11
21
  end
12
22
 
13
23
  # Overrides can be provided, e.g. { es: 'El foo de la barro' }
14
24
  def add(key, term, overrides = {})
15
25
  if @direction == :up
16
- info "adding #{key}"
26
+ @logger.info "adding #{key}"
17
27
  _add key, term, overrides
18
28
  else
19
- info "unadding #{key}"
29
+ @logger.info "unadding #{key}"
20
30
  _rm key
21
31
  end
22
32
  end
23
33
 
24
34
  def mv(old_key, new_key)
25
35
  if @direction == :up
26
- info "moving #{old_key} => #{new_key}"
36
+ @logger.info "moving #{old_key} => #{new_key}"
27
37
  _mv old_key, new_key
28
38
  else
29
- info "moving back #{new_key} => #{old_key}"
39
+ @logger.info "moving back #{new_key} => #{old_key}"
30
40
  _mv new_key, old_key
31
41
  end
32
42
  end
@@ -34,10 +44,10 @@ module I18n
34
44
  # Overrides can be provided, e.g. { es: 'El foo de la barro' }
35
45
  def rm(key, old_term, overrides = {})
36
46
  if @direction == :up
37
- info "removing #{key}"
47
+ @logger.info "removing #{key}"
38
48
  _rm key
39
49
  else
40
- info "unremoving #{key}"
50
+ @logger.info "unremoving #{key}"
41
51
  _add key, old_term, overrides
42
52
  end
43
53
  end
@@ -45,10 +55,10 @@ module I18n
45
55
  # Overrides can be provided, e.g. { es: 'El foo de la barro' }
46
56
  def update(key, new_term, old_term, overrides = {})
47
57
  if @direction == :up
48
- info "updating #{key}"
58
+ @logger.info "updating #{key}"
49
59
  _update key, new_term, overrides
50
60
  else
51
- info "unupdating #{key}"
61
+ @logger.info "unupdating #{key}"
52
62
  _update key, old_term, {}
53
63
  end
54
64
  end
@@ -63,7 +73,7 @@ module I18n
63
73
  def _mv(from, to)
64
74
  assert_exists! from
65
75
  assert_does_not_exist! to
66
- @data[to] = @data.delete(from)
76
+ @translations.move_term(from, to)
67
77
  end
68
78
 
69
79
  def _update(key, term, overrides)
@@ -73,27 +83,28 @@ module I18n
73
83
 
74
84
  def _rm(key)
75
85
  assert_exists! key
76
- @data.delete(key)
77
- @notes.delete(key)
78
- end
79
-
80
- def info(message)
81
- puts message if @verbose
86
+ delete_translation key
82
87
  end
83
88
 
84
89
  def assert_exists!(key)
85
- raise "#{key} doesn't exist in #{@locale}" unless @data.has_key?(key)
90
+ raise "#{key} doesn't exist in #{@locale_code}" unless @translations.get_term(key)
86
91
  end
87
92
 
88
93
  def assert_does_not_exist!(key)
89
- raise "#{key} already exists in #{@locale}" if @data.has_key?(key)
94
+ raise "#{key} already exists in #{@locale_code}" if @translations.get_term(key)
95
+ end
96
+
97
+ # should delete key & return translation
98
+ def delete_translation(key)
99
+ @translations.delete_term(key)
90
100
  end
91
101
 
92
102
  def assign_translation(key, term, overrides)
93
- if overrides[@locale.to_sym]
94
- @data[key] = overrides[@locale.to_sym]
103
+ if overrides[@locale_code.to_sym]
104
+ @translations.set_term(key, value: overrides[@locale_code.to_sym])
95
105
  else
96
- @data[key], @notes[key] = @dictionary.lookup(term, key: key)
106
+ value, notes = @dictionary.lookup(term, key: key)
107
+ @translations.set_term(key, value: value, notes: notes)
97
108
  end
98
109
  end
99
110
  end
@@ -18,14 +18,50 @@ module I18n
18
18
  raise("Can't parse version: #{version}") unless version =~ /^(\d{12})_(.*)/
19
19
  migration_class_name = "#{$2.camelcase}#{$1}"
20
20
 
21
+ translations = Translations.new(data: data, notes: notes)
21
22
  migration = begin
22
- migration_class_name.constantize.new(locale, data, notes, dictionary, direction)
23
+ migration_class_name.constantize.new(locale_code: locale,
24
+ translations: translations,
25
+ dictionary: dictionary,
26
+ direction: direction)
23
27
  rescue
24
28
  raise "Couldn't load migration #{migration_class_name} in #{filename}"
25
29
  end
26
30
 
27
31
  migration.change
28
32
  end
33
+
34
+ # This is a facade over our translations
35
+ # data = all keys -> all translations in this locale
36
+ # notes = some keys -> notes about the translation in this locale
37
+ class Translations
38
+ def initialize(data:, notes:)
39
+ @data, @notes = data, notes
40
+ end
41
+
42
+ def get_term(key)
43
+ @data[key]
44
+ end
45
+
46
+ def set_term(key, value:, notes: nil)
47
+ @data[key] = value
48
+ if notes.present?
49
+ @notes[key] = notes
50
+ else
51
+ @notes.delete(key)
52
+ end
53
+ end
54
+
55
+ def delete_term(key)
56
+ @data.delete(key)
57
+ @notes.delete(key)
58
+ end
59
+
60
+ def move_term(from, to)
61
+ @data[to] = @data.delete(from)
62
+ @notes[to] = @notes.delete(from)
63
+ end
64
+ end
29
65
  end
30
66
  end
31
67
  end
@@ -11,7 +11,7 @@ require 'config'
11
11
  require 'locale'
12
12
  require 'migration_factory'
13
13
 
14
- ASYNC = false
14
+ CONCURRENT_THREADS = 4
15
15
 
16
16
  # this class knows how to do all the things the cli needs done.
17
17
  # it mostly delegates to locale to do it, often asking multiple locales to do the same thing
@@ -92,6 +92,7 @@ end
92
92
  migrate(locale.name)
93
93
  end
94
94
  locale.push(sheet)
95
+ sleep 4
95
96
  end
96
97
  end
97
98
 
@@ -106,7 +107,7 @@ end
106
107
  end
107
108
 
108
109
  def validate(locale_or_all)
109
- each_locale(locale_or_all) do |locale|
110
+ each_locale(locale_or_all, async: false) do |locale|
110
111
  next if locale.main_locale?
111
112
  locale.update_info do |data, notes|
112
113
  locale.validate(data, notes)
@@ -116,17 +117,21 @@ end
116
117
 
117
118
  private
118
119
 
119
- def each_locale(name = 'all')
120
+ def each_locale(name = 'all', async: true)
120
121
  locale_names = name == 'all' ? all_locale_names : [name]
121
122
 
122
- if ASYNC
123
- threads = locale_names.map do |l|
124
- locale = locale_for(l)
125
- Thread.new {yield locale}
123
+ if async
124
+ locale_names.each_slice(CONCURRENT_THREADS) do |some_locale_names|
125
+ threads = some_locale_names.map do |l|
126
+ locale = locale_for(l)
127
+ Thread.new {yield locale}
128
+ end
129
+ threads.each(&:join)
126
130
  end
127
- threads.each(&:join)
128
131
  else
129
- locale_names.each {|l| yield locale_for(l)}
132
+ locale_names.each do |l|
133
+ yield locale_for(l)
134
+ end
130
135
  end
131
136
  end
132
137
 
@@ -1,5 +1,5 @@
1
1
  module I18n
2
2
  module Migrations
3
- VERSION = "1.0.2"
3
+ VERSION = "1.1.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: i18n-migrations
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeremy Lightsmith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-02 00:00:00.000000000 Z
11
+ date: 2019-09-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -151,8 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
151
151
  - !ruby/object:Gem::Version
152
152
  version: '0'
153
153
  requirements: []
154
- rubyforge_project:
155
- rubygems_version: 2.7.7
154
+ rubygems_version: 3.0.6
156
155
  signing_key:
157
156
  specification_version: 4
158
157
  summary: Migrations for doing i18n.