releaf-i18n_database 0.2.1 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +19 -21
  3. data/app/assets/javascripts/{releaf/controllers → controllers}/releaf/i18n_database/translations.js +0 -0
  4. data/app/assets/stylesheets/{releaf/controllers → controllers}/releaf/i18n_database/translations.scss +0 -0
  5. data/app/builders/releaf/i18n_database/translations/builders_common.rb +1 -1
  6. data/app/builders/releaf/i18n_database/translations/index_builder.rb +1 -1
  7. data/app/controllers/releaf/i18n_database/translations_controller.rb +121 -127
  8. data/app/lib/releaf/i18n_database/parse_spreadsheet_translations.rb +62 -0
  9. data/app/lib/releaf/i18n_database/translations_store.rb +149 -0
  10. data/app/lib/releaf/i18n_database/translations_utilities.rb +6 -6
  11. data/app/models/releaf/i18n_database/i18n_entry.rb +21 -0
  12. data/app/models/releaf/i18n_database/i18n_entry_translation.rb +11 -0
  13. data/app/views/releaf/i18n_database/translations/_form_fields.haml +2 -2
  14. data/lib/releaf-i18n_database.rb +14 -3
  15. data/lib/releaf/i18n_database/backend.rb +56 -131
  16. data/lib/releaf/i18n_database/configuration.rb +8 -0
  17. data/lib/releaf/i18n_database/engine.rb +1 -30
  18. data/lib/releaf/i18n_database/humanize_missing_translations.rb +1 -1
  19. data/misc/translations.xlsx +0 -0
  20. data/spec/builders/translations/builder_common_spec.rb +1 -1
  21. data/spec/builders/translations/edit_builder_spec.rb +2 -2
  22. data/spec/builders/translations/table_builder_spec.rb +1 -1
  23. data/spec/controllers/i18n_backend/translations_controller_spec.rb +10 -19
  24. data/spec/features/translations_spec.rb +235 -16
  25. data/spec/fixtures/invalid.xls +3 -0
  26. data/spec/fixtures/invalid.xlsx +3 -0
  27. data/spec/lib/releaf/i18n_database/backend_spec.rb +192 -0
  28. data/spec/lib/releaf/i18n_database/configuration_spec.rb +13 -0
  29. data/spec/lib/{i18n_database → releaf/i18n_database}/humanize_missing_translations_spec.rb +7 -1
  30. data/spec/lib/releaf/i18n_database/parse_spreadsheet_translations_spec.rb +151 -0
  31. data/spec/lib/releaf/i18n_database/translations_store_spec.rb +548 -0
  32. data/spec/lib/{i18n_database → releaf/i18n_database}/translations_utilities_spec.rb +39 -39
  33. data/spec/models/i18n_database/i18n_entry_spec.rb +50 -0
  34. data/spec/models/i18n_database/i18n_entry_translation_spec.rb +9 -0
  35. metadata +45 -30
  36. data/app/lib/releaf/i18n_database/translations_importer.rb +0 -72
  37. data/app/models/releaf/i18n_database/translation.rb +0 -17
  38. data/app/models/releaf/i18n_database/translation_data.rb +0 -11
  39. data/lib/releaf/i18n_database/builders_autoload.rb +0 -10
  40. data/releaf-i18n_database.gemspec +0 -21
  41. data/spec/lib/i18n_database/backend_spec.rb +0 -337
  42. data/spec/lib/i18n_database/translations_importer_spec.rb +0 -17
  43. data/spec/models/i18n_database/translation_data_spec.rb +0 -13
  44. data/spec/models/i18n_database/translation_spec.rb +0 -49
@@ -39,17 +39,17 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
39
39
 
40
40
  describe ".filter_only_blank_translations" do
41
41
  it "returns given collection applied with empty translation data search" do
42
- collection = Releaf::I18nDatabase::Translation.where("id > 1")
42
+ collection = Releaf::I18nDatabase::I18nEntry.where("id > 1")
43
43
  allow(described_class).to receive(:search_columns).and_return([
44
- Releaf::I18nDatabase::Translation.arel_table[:key],
45
- Releaf::I18nDatabase::Translation.arel_table.alias("lv_data")[:localization],
44
+ Releaf::I18nDatabase::I18nEntry.arel_table[:key],
45
+ Releaf::I18nDatabase::I18nEntry.arel_table.alias("lv_data")[:text],
46
46
  ])
47
47
  if postgresql?
48
- result = "WHERE (id > 1) AND ((\"releaf_translations\".\"key\" = '' OR \"releaf_translations\".\"key\" IS NULL)"
49
- result += " OR (\"lv_data\".\"localization\" = '' OR \"lv_data\".\"localization\" IS NULL))"
48
+ result = "WHERE (id > 1) AND ((\"releaf_i18n_entries\".\"key\" = '' OR \"releaf_i18n_entries\".\"key\" IS NULL)"
49
+ result += " OR (\"lv_data\".\"text\" = '' OR \"lv_data\".\"text\" IS NULL))"
50
50
  else
51
- result = "WHERE (id > 1) AND ((`releaf_translations`.`key` = '' OR `releaf_translations`.`key` IS NULL)"
52
- result += " OR (`lv_data`.`localization` = '' OR `lv_data`.`localization` IS NULL))"
51
+ result = "WHERE (id > 1) AND ((`releaf_i18n_entries`.`key` = '' OR `releaf_i18n_entries`.`key` IS NULL)"
52
+ result += " OR (`lv_data`.`text` = '' OR `lv_data`.`text` IS NULL))"
53
53
  end
54
54
  expect(described_class.filter_only_blank_translations(collection).to_sql).to end_with(result)
55
55
  end
@@ -57,7 +57,7 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
57
57
 
58
58
  describe ".filter_by_text" do
59
59
  it "returns collection with grouped column searches" do
60
- collection = Releaf::I18nDatabase::Translation.where("id > 1")
60
+ collection = Releaf::I18nDatabase::I18nEntry.where("id > 1")
61
61
  allow(described_class).to receive(:column_searches).with("redx").and_return([
62
62
  "id = 8 AND id = 2",
63
63
  "id = 9 AND id = 19",
@@ -70,17 +70,17 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
70
70
  describe ".column_searches" do
71
71
  it "return array with column based searches" do
72
72
  allow(described_class).to receive(:search_columns).and_return([
73
- Releaf::I18nDatabase::Translation.arel_table[:key],
74
- Releaf::I18nDatabase::Translation.arel_table.alias("lv_data")[:localization],
73
+ Releaf::I18nDatabase::I18nEntry.arel_table[:key],
74
+ Releaf::I18nDatabase::I18nEntry.arel_table.alias("lv_data")[:text],
75
75
  ])
76
76
  allow(described_class).to receive(:escape_search_string).with("red").twice.and_return("escaped_red")
77
77
  allow(described_class).to receive(:escape_search_string).with("car").twice.and_return("escaped_car")
78
78
  if postgresql?
79
- result = ["\"releaf_translations\".\"key\" ILIKE '%escaped_red%' AND \"releaf_translations\".\"key\" ILIKE '%escaped_car%'",
80
- "\"lv_data\".\"localization\" ILIKE '%escaped_red%' AND \"lv_data\".\"localization\" ILIKE '%escaped_car%'"]
79
+ result = ["\"releaf_i18n_entries\".\"key\" ILIKE '%escaped_red%' AND \"releaf_i18n_entries\".\"key\" ILIKE '%escaped_car%'",
80
+ "\"lv_data\".\"text\" ILIKE '%escaped_red%' AND \"lv_data\".\"text\" ILIKE '%escaped_car%'"]
81
81
  else
82
- result = ["`releaf_translations`.`key` LIKE '%escaped_red%' AND `releaf_translations`.`key` LIKE '%escaped_car%'",
83
- "`lv_data`.`localization` LIKE '%escaped_red%' AND `lv_data`.`localization` LIKE '%escaped_car%'"]
82
+ result = ["`releaf_i18n_entries`.`key` LIKE '%escaped_red%' AND `releaf_i18n_entries`.`key` LIKE '%escaped_car%'",
83
+ "`lv_data`.`text` LIKE '%escaped_red%' AND `lv_data`.`text` LIKE '%escaped_car%'"]
84
84
  end
85
85
  expect(described_class.column_searches(" red car ")).to eq(result)
86
86
  end
@@ -89,16 +89,16 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
89
89
  describe ".search_columns" do
90
90
  it "returns array with translation key arel attribute and locale tables localization attributes" do
91
91
  allow(described_class).to receive(:locale_tables).and_return(
92
- de: Releaf::I18nDatabase::TranslationData.arel_table.alias("de_data"),
93
- lv: Releaf::I18nDatabase::TranslationData.arel_table.alias("lv_data"),
94
- en: Releaf::I18nDatabase::TranslationData.arel_table.alias("en_data")
92
+ de: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("de_data"),
93
+ lv: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("lv_data"),
94
+ en: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("en_data")
95
95
  )
96
96
 
97
97
  result = [
98
- Releaf::I18nDatabase::Translation.arel_table[:key],
99
- Releaf::I18nDatabase::TranslationData.arel_table.alias("de_data")[:localization],
100
- Releaf::I18nDatabase::TranslationData.arel_table.alias("lv_data")[:localization],
101
- Releaf::I18nDatabase::TranslationData.arel_table.alias("en_data")[:localization]
98
+ Releaf::I18nDatabase::I18nEntry.arel_table[:key],
99
+ Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("de_data")[:text],
100
+ Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("lv_data")[:text],
101
+ Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("en_data")[:text]
102
102
  ]
103
103
  expect(described_class.search_columns).to eq(result)
104
104
  end
@@ -114,8 +114,8 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
114
114
  it "returns array with arel aliased locale tables" do
115
115
  allow(Releaf.application.config).to receive(:all_locales).and_return([:de, :en])
116
116
  result = {
117
- de: Releaf::I18nDatabase::TranslationData.arel_table.alias("de_data"),
118
- en: Releaf::I18nDatabase::TranslationData.arel_table.alias("en_data")
117
+ de: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("de_data"),
118
+ en: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("en_data")
119
119
  }
120
120
  expect(described_class.locale_tables).to eq(result)
121
121
  end
@@ -126,24 +126,24 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
126
126
  allow(described_class).to receive(:localization_include_joins).and_return(["a", "b"])
127
127
  allow(described_class).to receive(:localization_include_selects).and_return("x")
128
128
  if postgresql?
129
- result = "SELECT x FROM \"releaf_translations\" a b"
129
+ result = "SELECT x FROM \"releaf_i18n_entries\" a b"
130
130
  else
131
- result = "SELECT x FROM `releaf_translations` a b"
131
+ result = "SELECT x FROM `releaf_i18n_entries` a b"
132
132
  end
133
- expect(described_class.include_localizations(Releaf::I18nDatabase::Translation).to_sql).to eq(result)
133
+ expect(described_class.include_localizations(Releaf::I18nDatabase::I18nEntry).to_sql).to eq(result)
134
134
  end
135
135
  end
136
136
 
137
137
  describe ".localization_include_joins" do
138
138
  it "returns array with locales translation table joins" do
139
139
  allow(described_class).to receive(:locale_tables).and_return(
140
- de: Releaf::I18nDatabase::TranslationData.arel_table.alias("de_data"),
141
- lv: Releaf::I18nDatabase::TranslationData.arel_table.alias("lv_data"),
142
- en: Releaf::I18nDatabase::TranslationData.arel_table.alias("en_data")
140
+ de: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("de_data"),
141
+ lv: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("lv_data"),
142
+ en: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("en_data")
143
143
  )
144
- result = ["LEFT JOIN releaf_translation_data AS de_data ON de_data.translation_id = releaf_translations.id AND de_data.lang = 'de'",
145
- "LEFT JOIN releaf_translation_data AS lv_data ON lv_data.translation_id = releaf_translations.id AND lv_data.lang = 'lv'",
146
- "LEFT JOIN releaf_translation_data AS en_data ON en_data.translation_id = releaf_translations.id AND en_data.lang = 'en'"]
144
+ result = ["LEFT JOIN releaf_i18n_entry_translations AS de_data ON de_data.i18n_entry_id = releaf_i18n_entries.id AND de_data.locale = 'de'",
145
+ "LEFT JOIN releaf_i18n_entry_translations AS lv_data ON lv_data.i18n_entry_id = releaf_i18n_entries.id AND lv_data.locale = 'lv'",
146
+ "LEFT JOIN releaf_i18n_entry_translations AS en_data ON en_data.i18n_entry_id = releaf_i18n_entries.id AND en_data.locale = 'en'"]
147
147
  expect(described_class.localization_include_joins).to eq(result)
148
148
  end
149
149
  end
@@ -154,7 +154,7 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
154
154
  "de_data.localization AS de_localization",
155
155
  "de_data.id AS de_localization_id"
156
156
  ])
157
- result = "releaf_translations.*, de_data.localization AS de_localization, de_data.id AS de_localization_id"
157
+ result = "releaf_i18n_entries.*, de_data.localization AS de_localization, de_data.id AS de_localization_id"
158
158
  expect(described_class.localization_include_selects).to eq(result)
159
159
  end
160
160
  end
@@ -162,13 +162,13 @@ describe Releaf::I18nDatabase::TranslationsUtilities do
162
162
  describe ".localization_include_locales_columns" do
163
163
  it "returns locales translated values columns and ids" do
164
164
  allow(described_class).to receive(:locale_tables).and_return(
165
- de: Releaf::I18nDatabase::TranslationData.arel_table.alias("de_data"),
166
- lv: Releaf::I18nDatabase::TranslationData.arel_table.alias("lv_data"),
167
- en: Releaf::I18nDatabase::TranslationData.arel_table.alias("en_data")
165
+ de: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("de_data"),
166
+ lv: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("lv_data"),
167
+ en: Releaf::I18nDatabase::I18nEntryTranslation.arel_table.alias("en_data")
168
168
  )
169
- result = ["de_data.localization AS de_localization", "de_data.id AS de_localization_id",
170
- "lv_data.localization AS lv_localization", "lv_data.id AS lv_localization_id",
171
- "en_data.localization AS en_localization", "en_data.id AS en_localization_id"]
169
+ result = ["de_data.text AS de_localization", "de_data.id AS de_localization_id",
170
+ "lv_data.text AS lv_localization", "lv_data.id AS lv_localization_id",
171
+ "en_data.text AS en_localization", "en_data.id AS en_localization_id"]
172
172
  expect(described_class.localization_include_locales_columns).to eq(result)
173
173
  end
174
174
  end
@@ -0,0 +1,50 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::I18nDatabase::I18nEntry do
4
+ it { is_expected.to validate_presence_of(:key) }
5
+ it { is_expected.to validate_length_of(:key).is_at_most(255) }
6
+ it { is_expected.to validate_uniqueness_of(:key) }
7
+ it { is_expected.to have_many(:i18n_entry_translation).dependent(:destroy) }
8
+ it { is_expected.to accept_nested_attributes_for(:i18n_entry_translation).allow_destroy(true) }
9
+
10
+ describe "#locale_value" do
11
+ it "returns translated value for given locale" do
12
+ subject.i18n_entry_translation.build(text: 'apple', locale: "en")
13
+ subject.i18n_entry_translation.build(text: 'apfel', locale: "de")
14
+
15
+ expect(subject.locale_value("en")).to eq("apple")
16
+ expect(subject.locale_value(:de)).to eq("apfel")
17
+ expect(subject.locale_value("lt")).to be nil
18
+ end
19
+ end
20
+
21
+ describe "#find_or_initialize_translation" do
22
+ before do
23
+ subject.key = "xx"
24
+ subject.i18n_entry_translation.build(text: 'apple', locale: "en")
25
+ subject.i18n_entry_translation.build(text: 'ābols', locale: "lv")
26
+ subject.save
27
+ allow(subject.i18n_entry_translation).to receive(:build).with(locale: "de").and_return(:new)
28
+ end
29
+
30
+ context "when translation exists for given locale (given as string or symbol)" do
31
+ it "returns existing translation instance" do
32
+ expect(subject.find_or_initialize_translation(:en).text).to eq("apple")
33
+ expect(subject.find_or_initialize_translation("en").text).to eq("apple")
34
+ end
35
+
36
+ it "uses AR cache to prevent multiple db hit for multiple locales lookup" do
37
+ expect {
38
+ subject.find_or_initialize_translation("en")
39
+ subject.find_or_initialize_translation("lv")
40
+ }.to make_database_queries(count: 1)
41
+ end
42
+ end
43
+
44
+ context "when translation does not exists for given locale" do
45
+ it "returns newly builded translation instance" do
46
+ expect(subject.find_or_initialize_translation("de")).to eq(:new)
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,9 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::I18nDatabase::I18nEntryTranslation do
4
+ it { is_expected.to validate_presence_of(:i18n_entry) }
5
+ it { is_expected.to validate_presence_of(:locale) }
6
+ it { is_expected.to validate_length_of(:locale).is_at_most(5) }
7
+ it { subject.locale = "de"; is_expected.to validate_uniqueness_of(:i18n_entry_id).scoped_to([:locale]) }
8
+ it { is_expected.to belong_to(:i18n_entry) }
9
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: releaf-i18n_database
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 1.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - CubeSystems
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-26 00:00:00.000000000 Z
11
+ date: 2016-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: releaf-core
@@ -16,32 +16,35 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.2.1
19
+ version: 1.0.3
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.2.1
26
+ version: 1.0.3
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: twitter_cldr
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '3.6'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '3.6'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: axlsx_rails
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.3'
45
48
  - - ">="
46
49
  - !ruby/object:Gem::Version
47
50
  version: 0.3.0
@@ -49,6 +52,9 @@ dependencies:
49
52
  prerelease: false
50
53
  version_requirements: !ruby/object:Gem::Requirement
51
54
  requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '0.3'
52
58
  - - ">="
53
59
  - !ruby/object:Gem::Version
54
60
  version: 0.3.0
@@ -73,25 +79,26 @@ extensions: []
73
79
  extra_rdoc_files: []
74
80
  files:
75
81
  - LICENSE
76
- - app/assets/javascripts/releaf/controllers/releaf/i18n_database/translations.js
77
- - app/assets/stylesheets/releaf/controllers/releaf/i18n_database/translations.scss
82
+ - app/assets/javascripts/controllers/releaf/i18n_database/translations.js
83
+ - app/assets/stylesheets/controllers/releaf/i18n_database/translations.scss
78
84
  - app/builders/releaf/i18n_database/translations/builders_common.rb
79
85
  - app/builders/releaf/i18n_database/translations/edit_builder.rb
80
86
  - app/builders/releaf/i18n_database/translations/index_builder.rb
81
87
  - app/builders/releaf/i18n_database/translations/table_builder.rb
82
88
  - app/controllers/releaf/i18n_database/translations_controller.rb
83
- - app/lib/releaf/i18n_database/translations_importer.rb
89
+ - app/lib/releaf/i18n_database/parse_spreadsheet_translations.rb
90
+ - app/lib/releaf/i18n_database/translations_store.rb
84
91
  - app/lib/releaf/i18n_database/translations_utilities.rb
85
- - app/models/releaf/i18n_database/translation.rb
86
- - app/models/releaf/i18n_database/translation_data.rb
92
+ - app/models/releaf/i18n_database/i18n_entry.rb
93
+ - app/models/releaf/i18n_database/i18n_entry_translation.rb
87
94
  - app/views/releaf/i18n_database/translations/_form_fields.haml
88
95
  - app/views/releaf/i18n_database/translations/export.xlsx.axlsx
89
96
  - lib/releaf-i18n_database.rb
90
97
  - lib/releaf/i18n_database/backend.rb
91
- - lib/releaf/i18n_database/builders_autoload.rb
98
+ - lib/releaf/i18n_database/configuration.rb
92
99
  - lib/releaf/i18n_database/engine.rb
93
100
  - lib/releaf/i18n_database/humanize_missing_translations.rb
94
- - releaf-i18n_database.gemspec
101
+ - misc/translations.xlsx
95
102
  - spec/builders/translations/builder_common_spec.rb
96
103
  - spec/builders/translations/edit_builder_spec.rb
97
104
  - spec/builders/translations/index_builder_spec.rb
@@ -99,17 +106,22 @@ files:
99
106
  - spec/controllers/i18n_backend/translations_controller_spec.rb
100
107
  - spec/features/translations_spec.rb
101
108
  - spec/fixtures/all_translations_exported.xlsx
109
+ - spec/fixtures/invalid.xls
110
+ - spec/fixtures/invalid.xlsx
102
111
  - spec/fixtures/time.formats.xlsx
103
112
  - spec/fixtures/translations_import.xlsx
104
113
  - spec/fixtures/unsupported_import_file.png
105
- - spec/lib/i18n_database/backend_spec.rb
106
- - spec/lib/i18n_database/humanize_missing_translations_spec.rb
107
- - spec/lib/i18n_database/translations_importer_spec.rb
108
- - spec/lib/i18n_database/translations_utilities_spec.rb
109
- - spec/models/i18n_database/translation_data_spec.rb
110
- - spec/models/i18n_database/translation_spec.rb
114
+ - spec/lib/releaf/i18n_database/backend_spec.rb
115
+ - spec/lib/releaf/i18n_database/configuration_spec.rb
116
+ - spec/lib/releaf/i18n_database/humanize_missing_translations_spec.rb
117
+ - spec/lib/releaf/i18n_database/parse_spreadsheet_translations_spec.rb
118
+ - spec/lib/releaf/i18n_database/translations_store_spec.rb
119
+ - spec/lib/releaf/i18n_database/translations_utilities_spec.rb
120
+ - spec/models/i18n_database/i18n_entry_spec.rb
121
+ - spec/models/i18n_database/i18n_entry_translation_spec.rb
111
122
  homepage: https://github.com/cubesystems/releaf
112
- licenses: []
123
+ licenses:
124
+ - MIT
113
125
  metadata: {}
114
126
  post_install_message:
115
127
  rdoc_options: []
@@ -127,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
139
  version: '0'
128
140
  requirements: []
129
141
  rubyforge_project:
130
- rubygems_version: 2.4.8
142
+ rubygems_version: 2.5.1
131
143
  signing_key:
132
144
  specification_version: 4
133
145
  summary: i18n database gem for releaf
@@ -139,13 +151,16 @@ test_files:
139
151
  - spec/controllers/i18n_backend/translations_controller_spec.rb
140
152
  - spec/features/translations_spec.rb
141
153
  - spec/fixtures/all_translations_exported.xlsx
154
+ - spec/fixtures/invalid.xls
155
+ - spec/fixtures/invalid.xlsx
142
156
  - spec/fixtures/time.formats.xlsx
143
157
  - spec/fixtures/translations_import.xlsx
144
158
  - spec/fixtures/unsupported_import_file.png
145
- - spec/lib/i18n_database/backend_spec.rb
146
- - spec/lib/i18n_database/humanize_missing_translations_spec.rb
147
- - spec/lib/i18n_database/translations_importer_spec.rb
148
- - spec/lib/i18n_database/translations_utilities_spec.rb
149
- - spec/models/i18n_database/translation_data_spec.rb
150
- - spec/models/i18n_database/translation_spec.rb
151
- has_rdoc:
159
+ - spec/lib/releaf/i18n_database/backend_spec.rb
160
+ - spec/lib/releaf/i18n_database/configuration_spec.rb
161
+ - spec/lib/releaf/i18n_database/humanize_missing_translations_spec.rb
162
+ - spec/lib/releaf/i18n_database/parse_spreadsheet_translations_spec.rb
163
+ - spec/lib/releaf/i18n_database/translations_store_spec.rb
164
+ - spec/lib/releaf/i18n_database/translations_utilities_spec.rb
165
+ - spec/models/i18n_database/i18n_entry_spec.rb
166
+ - spec/models/i18n_database/i18n_entry_translation_spec.rb
@@ -1,72 +0,0 @@
1
- module Releaf::I18nDatabase
2
- class TranslationsImporter
3
- class UnsupportedFileFormatError < StandardError; end
4
-
5
- def initialize file_path, file_extension
6
- require "roo"
7
- begin
8
- @excel = Roo::Spreadsheet.open(file_path, file_warning: :ignore, extension: file_extension)
9
- @data = []
10
- @locales = []
11
- rescue ArgumentError => e
12
- error_string = "Don't know how to open file"
13
- if e.message.match(error_string)
14
- raise UnsupportedFileFormatError
15
- else
16
- raise
17
- end
18
- end
19
- end
20
-
21
- def parsed_output
22
- @excel.each_with_pagename do |name, sheet|
23
- detect_sheet_locales(sheet)
24
- parse_sheet(sheet)
25
- end
26
-
27
- @data
28
- end
29
-
30
- def detect_sheet_locales sheet
31
- sheet.row(1).each_with_index do |cell, i|
32
- if i > 0
33
- @locales << cell
34
- end
35
- end
36
- end
37
-
38
- def parse_sheet sheet
39
- (2..sheet.last_row).each do |row_no|
40
- key = sheet.row(row_no)[0]
41
- localizations = sheet.row(row_no)[1..-1]
42
- if key.present?
43
- @data << load_translation(key, localizations)
44
- end
45
- end
46
- end
47
-
48
- def load_translation key, localizations
49
- translation = Translation.where(key: key).first_or_initialize
50
- translation.key = key
51
-
52
- localizations.each_with_index do |localization, i|
53
- load_translation_data(translation, @locales[i], localization)
54
- end
55
-
56
- translation
57
- end
58
-
59
- def load_translation_data translation, locale, localization
60
- translation_data = translation.translation_data.find{ |x| x.lang == locale }
61
- value = localization.nil? ? '' : localization
62
-
63
- # replace existing locale value only if new one is not blank
64
- if translation_data && !value.blank?
65
- translation_data.localization = value
66
- # always assign value for new locale
67
- elsif translation_data.nil?
68
- translation_data = translation.translation_data.build(lang: locale, localization: value)
69
- end
70
- end
71
- end
72
- end