rails_translation_manager 0.0.1 → 1.1.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.
Files changed (50) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -1
  3. data/.ruby-version +1 -1
  4. data/CHANGELOG.md +23 -0
  5. data/Jenkinsfile +9 -0
  6. data/LICENSE.txt +1 -1
  7. data/README.md +57 -1
  8. data/Rakefile +14 -9
  9. data/config/locales/plurals.rb +49 -0
  10. data/lib/rails_translation_manager/cleaner.rb +14 -0
  11. data/lib/rails_translation_manager/importer.rb +35 -19
  12. data/lib/rails_translation_manager/locale_checker/all_locales.rb +61 -0
  13. data/lib/rails_translation_manager/locale_checker/base_checker.rb +13 -0
  14. data/lib/rails_translation_manager/locale_checker/incompatible_plurals.rb +79 -0
  15. data/lib/rails_translation_manager/locale_checker/locale_checker_helper.rb +23 -0
  16. data/lib/rails_translation_manager/locale_checker/missing_english_locales.rb +31 -0
  17. data/lib/rails_translation_manager/locale_checker/missing_foreign_locales.rb +31 -0
  18. data/lib/rails_translation_manager/locale_checker/plural_forms.rb +16 -0
  19. data/lib/rails_translation_manager/locale_checker.rb +50 -0
  20. data/lib/rails_translation_manager/version.rb +1 -1
  21. data/lib/rails_translation_manager/yaml_writer.rb +17 -0
  22. data/lib/rails_translation_manager.rb +21 -2
  23. data/lib/tasks/translation.rake +37 -28
  24. data/lib/tasks/translation_helper.rb +11 -0
  25. data/rails_translation_manager.gemspec +4 -1
  26. data/spec/locales/cleaner/clean.yml +5 -0
  27. data/spec/locales/cleaner/with_whitespace.yml +5 -0
  28. data/spec/locales/importer/fr.csv +8 -0
  29. data/spec/locales/in_sync/cy/browse.yml +12 -0
  30. data/spec/locales/in_sync/en/browse.yml +8 -0
  31. data/spec/locales/out_of_sync/cy.yml +3 -0
  32. data/spec/locales/out_of_sync/en.yml +6 -0
  33. data/spec/rails_translation_manager/cleaner_spec.rb +13 -0
  34. data/spec/rails_translation_manager/importer_spec.rb +81 -0
  35. data/spec/rails_translation_manager/locale_checker/all_locales_spec.rb +24 -0
  36. data/spec/rails_translation_manager/locale_checker/incompatible_plurals_spec.rb +94 -0
  37. data/spec/rails_translation_manager/locale_checker/locale_checker_helper_spec.rb +61 -0
  38. data/spec/rails_translation_manager/locale_checker/missing_english_locales_spec.rb +72 -0
  39. data/spec/rails_translation_manager/locale_checker/missing_foreign_locales_spec.rb +80 -0
  40. data/spec/rails_translation_manager/locale_checker/plural_forms_spec.rb +27 -0
  41. data/spec/rails_translation_manager/locale_checker_spec.rb +68 -0
  42. data/spec/spec_helper.rb +19 -0
  43. data/spec/support/tasks.rb +7 -0
  44. data/spec/tasks/translation_spec.rb +123 -0
  45. data/test/rails_translation_manager/yaml_writer_test.rb +60 -0
  46. data/tmp/.gitkeep +0 -0
  47. metadata +104 -13
  48. data/lib/rails_translation_manager/validator.rb +0 -92
  49. data/test/rails_translation_manager/importer_test.rb +0 -166
  50. data/test/rails_translation_manager/validator_test.rb +0 -51
@@ -1,166 +0,0 @@
1
- require "test_helper"
2
- require "rails_translation_manager/importer"
3
- require "tmpdir"
4
- require "csv"
5
-
6
- module RailsTranslationManager
7
- class ImporterTest < Minitest::Test
8
- test 'should create a new locale file for a filled in translation csv file' do
9
- given_csv(:fr,
10
- [:key, :source, :translation],
11
- ["world_location.type.country", "Country", "Pays"],
12
- ["world_location.country", "Germany", "Allemange"],
13
- ["other.nested.key", "original", "translated"]
14
- )
15
-
16
- Importer.new(:fr, csv_path(:fr), import_directory).import
17
-
18
- yaml_translation_data = YAML.load_file(File.join(import_directory, "fr.yml"))
19
- expected = {"fr" => {
20
- "world_location" => {
21
- "country" => "Allemange",
22
- "type" => {
23
- "country" => "Pays"
24
- }
25
- },
26
- "other" => {
27
- "nested" => {
28
- "key" => "translated"
29
- }
30
- }
31
- }}
32
- assert_equal expected, yaml_translation_data
33
- end
34
-
35
- test 'outputs YAML without the header --- line for consistency with convention' do
36
- given_csv(:fr,
37
- [:key, :source, :translation],
38
- ["key", "value", "le value"],
39
- )
40
-
41
- Importer.new(:fr, csv_path(:fr), import_directory).import
42
-
43
- assert_equal "fr:", File.readlines(File.join(import_directory, "fr.yml")).first.strip
44
- end
45
-
46
- test 'outputs a newline at the end of the YAML for consistency with code editors' do
47
- given_csv(:fr,
48
- [:key, :source, :translation],
49
- ["key", "value", "le value"],
50
- )
51
-
52
- Importer.new(:fr, csv_path(:fr), import_directory).import
53
-
54
- assert_match /\n$/, File.readlines(File.join(import_directory, "fr.yml")).last
55
- end
56
-
57
- test 'strips whitespace from the end of lines for consistency with code editors' do
58
- given_csv(:fr,
59
- [:key, :source, :translation],
60
- ["key", "value", nil],
61
- )
62
-
63
- Importer.new(:fr, csv_path(:fr), import_directory).import
64
-
65
- lines = File.readlines(File.join(import_directory, "fr.yml"))
66
- refute lines.any? { |line| line =~ /\s\n$/ }
67
- end
68
-
69
- test 'imports arrays from CSV as arrays' do
70
- given_csv(:fr,
71
- [:key, :source, :translation],
72
- ["fruit", ["Apples", "Bananas", "Pears"], ["Pommes", "Bananes", "Poires"]]
73
- )
74
-
75
- Importer.new(:fr, csv_path(:fr), import_directory).import
76
-
77
- yaml_translation_data = YAML.load_file(File.join(import_directory, "fr.yml"))
78
- expected = {"fr" => {
79
- "fruit" => ["Pommes", "Bananes", "Poires"]
80
- }}
81
- assert_equal expected, yaml_translation_data
82
- end
83
-
84
- test 'interprets string "nil" as nil' do
85
- given_csv(:fr,
86
- [:key, :source, :translation],
87
- ["things", ["one", nil, "two"], ["une", nil, "deux"]]
88
- )
89
-
90
- Importer.new(:fr, csv_path(:fr), import_directory).import
91
-
92
- yaml_translation_data = YAML.load_file(File.join(import_directory, "fr.yml"))
93
- expected = {"fr" => {
94
- "things" => ["une", nil, "deux"]
95
- }}
96
- assert_equal expected, yaml_translation_data
97
- end
98
-
99
- test 'interprets string ":thing" as symbol' do
100
- given_csv(:fr,
101
- [:key, :source, :translation],
102
- ["sentiment", ":whatever", ":bof"]
103
- )
104
-
105
- Importer.new(:fr, csv_path(:fr), import_directory).import
106
-
107
- yaml_translation_data = YAML.load_file(File.join(import_directory, "fr.yml"))
108
- expected = {"fr" => {
109
- "sentiment" => :bof
110
- }}
111
- assert_equal expected, yaml_translation_data
112
- end
113
-
114
- test 'interprets integer strings as integers' do
115
- given_csv(:fr,
116
- [:key, :source, :translation],
117
- ["price", "123", "123"]
118
- )
119
-
120
- Importer.new(:fr, csv_path(:fr), import_directory).import
121
-
122
- yaml_translation_data = YAML.load_file(File.join(import_directory, "fr.yml"))
123
- expected = {"fr" => {
124
- "price" => 123
125
- }}
126
- assert_equal expected, yaml_translation_data
127
- end
128
-
129
- test 'interprets boolean values as booleans, not strings' do
130
- given_csv(:fr,
131
- [:key, :source, :translation],
132
- ["key1", "is true", "true"],
133
- ["key2", "is false", "false"]
134
- )
135
-
136
- Importer.new(:fr, csv_path(:fr), import_directory).import
137
-
138
- yaml_translation_data = YAML.load_file(File.join(import_directory, "fr.yml"))
139
- expected = {"fr" => {
140
- "key1" => true,
141
- "key2" => false
142
- }}
143
- assert_equal expected, yaml_translation_data
144
- end
145
-
146
- private
147
-
148
- def csv_path(locale)
149
- File.join(import_directory, "#{locale}.csv")
150
- end
151
-
152
- def given_csv(locale, header_row, *rows)
153
- csv = CSV.generate do |csv|
154
- csv << CSV::Row.new(["key", "source", "translation"], ["key", "source", "translation"], true)
155
- rows.each do |row|
156
- csv << CSV::Row.new(["key", "source", "translation"], row)
157
- end
158
- end
159
- File.open(csv_path(locale), "w") { |f| f.write csv.to_s }
160
- end
161
-
162
- def import_directory
163
- @import_directory ||= Dir.mktmpdir
164
- end
165
- end
166
- end
@@ -1,51 +0,0 @@
1
- # encoding: utf-8
2
- require 'test_helper'
3
- require 'rails_translation_manager/validator'
4
- require 'tmpdir'
5
- require 'fileutils'
6
-
7
- module RailsTranslationManager
8
- class ValidatorTest < Minitest::Test
9
- def setup
10
- @translation_path = Dir.mktmpdir
11
- @translation_validator = Validator.new(@translation_path)
12
- end
13
-
14
- def teardown
15
- FileUtils.remove_entry_secure(@translation_path)
16
- end
17
-
18
- def create_translation_file(locale, content)
19
- File.open(File.join(@translation_path, "#{locale}.yml"), "w") do |f|
20
- f.write(content.lstrip)
21
- end
22
- end
23
-
24
- test "can create a flattened list of substitutions" do
25
- translation_file = YAML.load(%q{
26
- en:
27
- view: View '%{title}'
28
- test: foo
29
- })
30
- expected = [Validator::TranslationEntry.new(%w{en view}, "View '%{title}'")]
31
- assert_equal expected, @translation_validator.substitutions_in(translation_file)
32
- end
33
-
34
- test "detects extra substitution keys" do
35
- create_translation_file("en", %q{
36
- en:
37
- document:
38
- view: View '%{title}'
39
- })
40
- create_translation_file("sr", %q{
41
- sr:
42
- document:
43
- view: Pročitajte '%{naslov}'
44
- })
45
- errors = Validator.new(@translation_path).check!
46
-
47
- expected = %q{Key "sr.document.view": Extra substitutions: ["naslov"]. Missing substitutions: ["title"].}
48
- assert_equal [expected], errors.map(&:to_s)
49
- end
50
- end
51
- end