skala 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/skala/adapter.rb +0 -4
- data/lib/skala/i18n.rb +29 -25
- data/lib/skala/version.rb +1 -1
- data/skala.gemspec +1 -0
- data/spec/skala/adapter_spec.rb +0 -28
- data/spec/skala/i18n_spec.rb +60 -57
- data/spec/skala/transformation_spec.rb +12 -3
- metadata +16 -5
- data/lib/skala/i18n/deep_merger.rb +0 -45
- data/spec/skala/i18n/deep_merger_spec.rb +0 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aae9b8b40ca397d60ff19d4b4e18388bff0c0394
|
4
|
+
data.tar.gz: b560ab30285fab610ba6b04de36c21f94070983f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66c797c3536ab3e72c8be2c57d2eb59585df9757387663c0d48a454f770297d111a8a440728fb2d7f625eb14666899713f52b1740bfeae8e55cbae433854fc99
|
7
|
+
data.tar.gz: 5fe5fd9cfdea4785ed5b1ef1866a7813dbeb80385eab89bec1ecd82734f3370e6a17e3d8c876a70b23d94f8eeecae1b672a4f7eeba31f6df4a301fa7cb18e978
|
data/lib/skala/adapter.rb
CHANGED
data/lib/skala/i18n.rb
CHANGED
@@ -1,42 +1,46 @@
|
|
1
|
+
require "active_support"
|
2
|
+
require "active_support/core_ext"
|
3
|
+
require "mighty_tap"
|
1
4
|
require "yaml"
|
2
5
|
require_relative "../skala"
|
3
6
|
|
4
7
|
module Skala::I18n
|
5
|
-
require_relative "./i18n/deep_merger"
|
6
|
-
|
7
8
|
def self.included(klass)
|
8
|
-
unless klass.class_variable_defined?(:@@locales)
|
9
|
-
klass.class_variable_set(:@@locales, {})
|
10
|
-
end
|
11
|
-
|
12
9
|
klass.extend(ClassMethods)
|
13
10
|
end
|
14
11
|
|
15
12
|
module ClassMethods
|
16
13
|
def load_locales_from_directory(path)
|
17
|
-
#
|
18
|
-
|
19
|
-
DeepMerger.deep_merge!(locales, YAML.load_file(filename))
|
14
|
+
Dir.glob("#{File.expand_path(path)}/*.yml").inject({}) do |_locales, _filename|
|
15
|
+
_locales.mtap(:deep_merge!, YAML.load_file(_filename))
|
20
16
|
end
|
21
17
|
end
|
22
|
-
end
|
23
18
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
19
|
+
# override this to provide locales
|
20
|
+
def locales
|
21
|
+
{}
|
22
|
+
end
|
23
|
+
|
24
|
+
def translate(key, options = {})
|
25
|
+
raise "Destination locale missing!" if options[:locale].nil?
|
26
|
+
|
27
|
+
fully_qualified_key = "#{options[:locale]}.#{key}"
|
28
|
+
keys_path = fully_qualified_key.split(".")
|
29
|
+
|
30
|
+
translated_key = keys_path.inject(locales) do |hash, hash_key|
|
31
|
+
unless hash.nil?
|
32
|
+
hash[hash_key.to_s] || hash[hash_key.to_sym]
|
33
|
+
end
|
34
|
+
end || keys_path.last
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
|
36
|
+
translated_key.gsub(/%{[^}]+}+/) do |match|
|
37
|
+
interpolation_key = match.gsub(/(\A%{)|(}\Z)/, "")
|
38
|
+
options[interpolation_key.to_s] || options[interpolation_key.to_sym] || match
|
39
|
+
end
|
40
40
|
end
|
41
41
|
end
|
42
|
+
|
43
|
+
def translate(*args)
|
44
|
+
self.class.translate(*args)
|
45
|
+
end
|
42
46
|
end
|
data/lib/skala/version.rb
CHANGED
data/skala.gemspec
CHANGED
data/spec/skala/adapter_spec.rb
CHANGED
@@ -1,30 +1,2 @@
|
|
1
1
|
describe Skala::Adapter do
|
2
|
-
let(:adapter) { described_class.new() }
|
3
|
-
|
4
|
-
context "when a class is derived from #{described_class}" do
|
5
|
-
context "when the derived class overwrites .initialize" do
|
6
|
-
context "when the derived class calls super inside the overwritten .initalize" do
|
7
|
-
let(:derived_class) do
|
8
|
-
Class.new(described_class) do
|
9
|
-
def initialize
|
10
|
-
super
|
11
|
-
|
12
|
-
self.class.load_locales_from_directory(File.expand_path("#{File.dirname(__FILE__)}/../assets/locales"))
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:derived_class_instance) do
|
18
|
-
derived_class.new
|
19
|
-
end
|
20
|
-
|
21
|
-
it "has access to the superclass locales" do
|
22
|
-
translation_key_known_by_superclass = "field_names.creator"
|
23
|
-
translation = derived_class_instance.translate(translation_key_known_by_superclass, locale: :de)
|
24
|
-
expected_translation = derived_class_instance.class.class_variable_get(:@@locales)["de"]["field_names"]["creator"]
|
25
|
-
expect(translation).to eq(expected_translation)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
2
|
end
|
data/spec/skala/i18n_spec.rb
CHANGED
@@ -6,86 +6,89 @@ describe Skala::I18n do
|
|
6
6
|
end
|
7
7
|
|
8
8
|
context "when included into a class" do
|
9
|
-
|
10
|
-
|
11
|
-
{ foo: "bar" }
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:klass) do
|
15
|
-
Class.new.tap do |_klass|
|
16
|
-
_klass.class_variable_set(:@@locales, value_of_locales)
|
17
|
-
_klass.send(:include, described_class)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
it "does not alter the existing class variable" do
|
22
|
-
expect(klass.class_variable_get(:@@locales)).to eq(value_of_locales)
|
23
|
-
end
|
9
|
+
it "defines a class method #load_locales_from_directory" do
|
10
|
+
expect(class_with_i18n_included).to respond_to(:load_locales_from_directory)
|
24
11
|
end
|
25
12
|
|
26
|
-
|
27
|
-
|
28
|
-
Class.new.tap do |_klass|
|
29
|
-
_klass.send(:include, described_class)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
it "defines a class variable named @@locales as an empty hash" do
|
34
|
-
expect(klass.class_variable_get(:@@locales)).to eq({})
|
35
|
-
end
|
13
|
+
it "defines a class method #locales" do
|
14
|
+
expect(class_with_i18n_included).to respond_to(:locales)
|
36
15
|
end
|
37
16
|
|
38
|
-
it "defines a class method #
|
39
|
-
expect(class_with_i18n_included).to respond_to(:
|
17
|
+
it "defines a class method #translate" do
|
18
|
+
expect(class_with_i18n_included).to respond_to(:translate)
|
40
19
|
end
|
41
|
-
|
20
|
+
|
42
21
|
it "defines an instance method .translate" do
|
43
22
|
expect(class_with_i18n_included.new).to respond_to(:translate)
|
44
23
|
end
|
45
24
|
end
|
46
25
|
|
47
26
|
describe "#load_locales_from_directory" do
|
48
|
-
it "loads all yaml encoded locales from a directory
|
49
|
-
|
50
|
-
|
27
|
+
it "loads all yaml encoded locales from a directory" do
|
28
|
+
loaded_locales =
|
29
|
+
class_with_i18n_included.load_locales_from_directory(
|
30
|
+
File.expand_path("#{File.dirname(__FILE__)}/../assets/locales")
|
31
|
+
)
|
32
|
+
|
33
|
+
expect(loaded_locales).not_to be_empty
|
51
34
|
end
|
52
35
|
end
|
53
|
-
|
36
|
+
|
54
37
|
describe "#translate" do
|
55
|
-
|
56
|
-
|
57
|
-
|
38
|
+
context "if the class defines .locales" do
|
39
|
+
let(:class_with_i18n_included_and_locales) do
|
40
|
+
Class.new(class_with_i18n_included).tap do |_klass|
|
41
|
+
def _klass.locales
|
42
|
+
load_locales_from_directory(
|
43
|
+
File.expand_path("#{File.dirname(__FILE__)}/../assets/locales")
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
58
47
|
end
|
59
|
-
end
|
60
48
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
expected_translation_de = object.class.class_variable_get(:@@locales)["de"]["field_names"]["creator"]
|
66
|
-
expected_translation_en = object.class.class_variable_get(:@@locales)["en"]["field_names"]["creator"]
|
49
|
+
let(:object) do
|
50
|
+
class_with_i18n_included_and_locales.new
|
51
|
+
end
|
67
52
|
|
68
|
-
|
69
|
-
|
70
|
-
|
53
|
+
it "translates the given key into the language specified by the locale option" do
|
54
|
+
translated_key_de = object.translate("field_names.creator", locale: :de)
|
55
|
+
translated_key_en = object.translate("field_names.creator", locale: :en)
|
56
|
+
|
57
|
+
expected_translation_de = object.class.locales["de"]["field_names"]["creator"]
|
58
|
+
expected_translation_en = object.class.locales["en"]["field_names"]["creator"]
|
71
59
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
60
|
+
expect(translated_key_de).to eq(expected_translation_de)
|
61
|
+
expect(translated_key_en).to eq(expected_translation_en)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "supports rails style interpolation" do
|
65
|
+
expected_date = "1. Januar 2015"
|
66
|
+
translated_key = object.translate("records.items.loan_status.expected", locale: :de, expected_date: expected_date)
|
67
|
+
expected_translation = object.class.locales["de"]["records"]["items"]["loan_status"]["expected"].gsub("%{expected_date}", expected_date)
|
76
68
|
|
77
|
-
|
78
|
-
|
69
|
+
expect(translated_key).to eq(expected_translation)
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when there is no translation" do
|
73
|
+
it "returns the last key path" do
|
74
|
+
expect(object.translate("foo.bar.muff", locale: :en)).to eq("muff")
|
75
|
+
end
|
76
|
+
end
|
79
77
|
|
80
|
-
|
81
|
-
|
82
|
-
|
78
|
+
context "when no locale option is given" do
|
79
|
+
it "raises an exception" do
|
80
|
+
expect { object.translate("field_names.creator") }.to raise_error
|
81
|
+
end
|
83
82
|
end
|
84
83
|
end
|
85
84
|
|
86
|
-
context "
|
87
|
-
|
88
|
-
|
85
|
+
context "if the class does not define .locales" do
|
86
|
+
let(:object) do
|
87
|
+
class_with_i18n_included.new
|
88
|
+
end
|
89
|
+
|
90
|
+
it "returns the last key path" do
|
91
|
+
expect(object.translate("foo.bar.muff", locale: :en)).to eq("muff")
|
89
92
|
end
|
90
93
|
end
|
91
94
|
end
|
@@ -27,20 +27,29 @@ describe Skala::Transformation do
|
|
27
27
|
describe "#abort!" do
|
28
28
|
let(:transformation) do
|
29
29
|
Class.new(described_class) do
|
30
|
+
def abort_execution?
|
31
|
+
!!@abort_execution
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(abort_execution = true)
|
35
|
+
@abort_execution = abort_execution
|
36
|
+
end
|
37
|
+
|
30
38
|
sequence [
|
31
39
|
-> (transformation) do
|
32
40
|
transformation.target = "first_steps_output"
|
33
|
-
transformation.abort!
|
41
|
+
transformation.abort! if transformation.abort_execution?
|
34
42
|
end,
|
35
43
|
-> (transformation) do
|
36
44
|
transformation.target = "second_steps_output"
|
37
45
|
end
|
38
46
|
]
|
39
|
-
end
|
47
|
+
end
|
40
48
|
end
|
41
49
|
|
42
50
|
it "aborts the execution of the steps sequence" do
|
43
|
-
expect(transformation.apply to: {}).to eq("first_steps_output")
|
51
|
+
expect(transformation.new.apply to: {}).to eq("first_steps_output")
|
52
|
+
expect(transformation.new(false).apply to: {}).to eq("second_steps_output")
|
44
53
|
end
|
45
54
|
end
|
46
55
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: skala
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Sievers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mighty_tap
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -157,7 +171,6 @@ files:
|
|
157
171
|
- lib/skala/adapter.rb
|
158
172
|
- lib/skala/adapter/operation.rb
|
159
173
|
- lib/skala/i18n.rb
|
160
|
-
- lib/skala/i18n/deep_merger.rb
|
161
174
|
- lib/skala/transformation.rb
|
162
175
|
- lib/skala/transformation/step.rb
|
163
176
|
- lib/skala/version.rb
|
@@ -167,7 +180,6 @@ files:
|
|
167
180
|
- spec/assets/transformation/some_class.rb
|
168
181
|
- spec/skala/adapter/operation_spec.rb
|
169
182
|
- spec/skala/adapter_spec.rb
|
170
|
-
- spec/skala/i18n/deep_merger_spec.rb
|
171
183
|
- spec/skala/i18n_spec.rb
|
172
184
|
- spec/skala/transformation/step_spec.rb
|
173
185
|
- spec/skala/transformation_spec.rb
|
@@ -203,7 +215,6 @@ test_files:
|
|
203
215
|
- spec/assets/transformation/some_class.rb
|
204
216
|
- spec/skala/adapter/operation_spec.rb
|
205
217
|
- spec/skala/adapter_spec.rb
|
206
|
-
- spec/skala/i18n/deep_merger_spec.rb
|
207
218
|
- spec/skala/i18n_spec.rb
|
208
219
|
- spec/skala/transformation/step_spec.rb
|
209
220
|
- spec/skala/transformation_spec.rb
|
@@ -1,45 +0,0 @@
|
|
1
|
-
require_relative "../i18n"
|
2
|
-
|
3
|
-
module Skala::I18n::DeepMerger
|
4
|
-
def self.deep_merge!(destination, source, options = {})
|
5
|
-
if destination.kind_of?(Array)
|
6
|
-
if source.kind_of?(Array)
|
7
|
-
# array into array
|
8
|
-
source.each do |element|
|
9
|
-
self.deep_merge!(destination, element, options)
|
10
|
-
end
|
11
|
-
elsif source.kind_of?(Hash)
|
12
|
-
# hash into array
|
13
|
-
destination.push(source)
|
14
|
-
else
|
15
|
-
# literal into array
|
16
|
-
destination.push(source)
|
17
|
-
end
|
18
|
-
elsif destination.kind_of?(Hash)
|
19
|
-
if source.kind_of?(Array)
|
20
|
-
# array into hash
|
21
|
-
raise ArgumentError, "Cannot merge array into hash!"
|
22
|
-
elsif source.kind_of?(Hash)
|
23
|
-
# hash into hash
|
24
|
-
destination.merge!(source) do |key, destination_value, source_value|
|
25
|
-
self.deep_merge!(destination_value, source_value, options)
|
26
|
-
destination_value
|
27
|
-
end
|
28
|
-
else
|
29
|
-
# literal into hash
|
30
|
-
raise ArgumentError, "Cannot merge literal into hash!"
|
31
|
-
end
|
32
|
-
else
|
33
|
-
if source.kind_of?(Array)
|
34
|
-
# array into literal
|
35
|
-
raise ArgumentError, "Cannot merge array into literal!"
|
36
|
-
elsif source.kind_of?(Hash)
|
37
|
-
# hash into literal
|
38
|
-
raise ArgumentError, "Cannot merge hash into literal!"
|
39
|
-
else
|
40
|
-
# literal into literal
|
41
|
-
destination = source # in fact a useless assignment to fit into the overall semantic
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
describe Skala::I18n::DeepMerger do
|
2
|
-
describe ".deep_merge!" do
|
3
|
-
describe "merges arrays into arrays" do
|
4
|
-
it "merges two arrays of literals" do
|
5
|
-
source = [1,"2",:f]
|
6
|
-
destination = [:"3", 5, "foo"]
|
7
|
-
described_class.deep_merge!(destination, source)
|
8
|
-
expect(destination).to eq([:"3", 5, "foo", 1, "2", :f])
|
9
|
-
end
|
10
|
-
|
11
|
-
it "merges two arrays of hashes" do
|
12
|
-
source = [{c:3}]
|
13
|
-
destination = [{a: 1}, {b:2}]
|
14
|
-
described_class.deep_merge!(destination, source)
|
15
|
-
expect(destination).to eq([{:a=>1}, {:b=>2}, {:c=>3}])
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe "merges hashes into hashes" do
|
20
|
-
it "merges two simple hashes" do
|
21
|
-
source = { c: 3 }
|
22
|
-
destination = { a: 1, b: 2 }
|
23
|
-
described_class.deep_merge!(destination, source)
|
24
|
-
expect(destination).to eq({:a=>1, :b=>2, :c=>3})
|
25
|
-
end
|
26
|
-
|
27
|
-
it "merges two nested hashes" do
|
28
|
-
source = { a: { type: "multi_value", values: [2,3] }, b: { value: "123" } }
|
29
|
-
destination = { a: { values: [1]}, b: { type: "id" } }
|
30
|
-
described_class.deep_merge!(destination, source)
|
31
|
-
expect(destination).to eq({:a=>{:values=>[1, 2, 3], :type=>"multi_value"}, :b=>{:type=>"id", :value=>"123"}})
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|