translatr 0.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.
- data/.gitignore +4 -0
- data/.rspec +2 -0
- data/.rvmrc +7 -0
- data/Gemfile +4 -0
- data/Guardfile +8 -0
- data/Rakefile +9 -0
- data/lib/core_ext/hash.rb +9 -0
- data/lib/tasks/translatr.rake +14 -0
- data/lib/translatr/merger.rb +77 -0
- data/lib/translatr/version.rb +3 -0
- data/lib/translatr.rb +7 -0
- data/spec/fixtures/source.yml +3 -0
- data/spec/fixtures/target.yml +3 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/translatr/merger_spec.rb +154 -0
- data/translatr.gemspec +28 -0
- metadata +149 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'translatr'
|
2
|
+
|
3
|
+
namespace :translatr do
|
4
|
+
desc "Merge source into target"
|
5
|
+
task :merge do |t|
|
6
|
+
unless ENV.include?("source") && ENV.include?("target")
|
7
|
+
raise "usage: rake #{t} source=SOURCEFILE target=TARGETFILE [dest=DESTINATIONFILE]"
|
8
|
+
end
|
9
|
+
|
10
|
+
merger = Translatr::Merger.new(ENV["source"], ENV["target"])
|
11
|
+
merger.merge
|
12
|
+
merger.store(ENV["dest"])
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'i18n'
|
2
|
+
require 'ya2yaml'
|
3
|
+
|
4
|
+
module Translatr
|
5
|
+
class Merger
|
6
|
+
attr_accessor :target, :target_filename, :target_locale,
|
7
|
+
:source, :source_filename, :source_locale
|
8
|
+
|
9
|
+
def initialize(source_filename = nil, target_filename = nil)
|
10
|
+
load_source(source_filename) if source_filename
|
11
|
+
load_target(target_filename) if target_filename
|
12
|
+
end
|
13
|
+
|
14
|
+
def load_source(filename)
|
15
|
+
self.source_filename = filename
|
16
|
+
I18n.backend.reload!
|
17
|
+
I18n.backend.load_translations(filename)
|
18
|
+
self.source_locale = I18n.backend.available_locales.first
|
19
|
+
self.source = I18n.backend.send(:translations)[source_locale]
|
20
|
+
end
|
21
|
+
|
22
|
+
def load_target(filename)
|
23
|
+
self.target_filename = filename
|
24
|
+
I18n.backend.reload!
|
25
|
+
I18n.backend.load_translations(filename)
|
26
|
+
self.target_locale = I18n.backend.available_locales.first
|
27
|
+
self.target = I18n.backend.send(:translations)[target_locale]
|
28
|
+
end
|
29
|
+
|
30
|
+
def merge(target_hash = nil, source_hash = nil)
|
31
|
+
target_hash ||= target
|
32
|
+
source_hash ||= source
|
33
|
+
source_hash.each_pair do |key, value|
|
34
|
+
if target_hash.has_key?(key)
|
35
|
+
if value.is_a?(Hash)
|
36
|
+
merge(target_hash[key], source_hash[key])
|
37
|
+
else
|
38
|
+
if matching_variables?(target_hash[key], value)
|
39
|
+
target_hash[key] = value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
target_hash
|
45
|
+
end
|
46
|
+
|
47
|
+
def store(filename = nil)
|
48
|
+
filename ||= target_filename
|
49
|
+
data = Hash.new
|
50
|
+
data[target_locale] = merge
|
51
|
+
data = data.deep_stringify_keys
|
52
|
+
File.open(filename, "w") do |file|
|
53
|
+
if data.respond_to?(:ya2yaml)
|
54
|
+
file.write(data.ya2yaml(:syck_compatible => true))
|
55
|
+
else
|
56
|
+
YAML.dump(data, file)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def has_variables?(text_string)
|
62
|
+
!text_string.gsub(/%\{(\w+)\}/).to_a.empty?
|
63
|
+
end
|
64
|
+
|
65
|
+
def variables_in(text_string)
|
66
|
+
vars = text_string.gsub(/%\{(\w+)\}/).to_a
|
67
|
+
return nil if vars.empty?
|
68
|
+
return [vars[0]] if vars.size == 1
|
69
|
+
vars
|
70
|
+
end
|
71
|
+
|
72
|
+
def matching_variables?(target_string, source_string)
|
73
|
+
return true unless has_variables?(source_string)
|
74
|
+
variables_in(target_string) & variables_in(source_string) == variables_in(source_string)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
data/lib/translatr.rb
ADDED
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'translatr'
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Translatr
|
4
|
+
describe Merger do
|
5
|
+
let(:fixture_path) { File.join(File.expand_path(File.dirname(__FILE__)), '..', 'fixtures') }
|
6
|
+
let(:target_path) { File.join(fixture_path, 'target.yml').to_s }
|
7
|
+
let(:source_path) { File.join(fixture_path, 'source.yml').to_s }
|
8
|
+
|
9
|
+
describe "initialization" do
|
10
|
+
it "works without any attributes" do
|
11
|
+
merger = Translatr::Merger.new
|
12
|
+
merger.should be_a Translatr::Merger
|
13
|
+
end
|
14
|
+
|
15
|
+
it "takes source file as attribute" do
|
16
|
+
merger = Translatr::Merger.new(source_path)
|
17
|
+
merger.source_filename.should == source_path
|
18
|
+
merger.source_locale.should == :en
|
19
|
+
end
|
20
|
+
|
21
|
+
it "takes target file as attribute" do
|
22
|
+
merger = Translatr::Merger.new(nil, target_path)
|
23
|
+
merger.target_filename.should == target_path
|
24
|
+
merger.target_locale.should == :xx
|
25
|
+
end
|
26
|
+
|
27
|
+
it "takes source and target file as attributes" do
|
28
|
+
merger = Translatr::Merger.new(source_path, target_path)
|
29
|
+
|
30
|
+
merger.source_filename.should == source_path
|
31
|
+
merger.source_locale.should == :en
|
32
|
+
|
33
|
+
merger.target_filename.should == target_path
|
34
|
+
merger.target_locale.should == :xx
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "initialized" do
|
39
|
+
let(:merger) { Translatr::Merger.new }
|
40
|
+
|
41
|
+
describe "#load_target" do
|
42
|
+
before do
|
43
|
+
merger.load_target target_path
|
44
|
+
end
|
45
|
+
|
46
|
+
it "sets the target filename" do
|
47
|
+
merger.target_filename.should == target_path
|
48
|
+
end
|
49
|
+
|
50
|
+
it "sets the target locale" do
|
51
|
+
merger.target_locale.should == :xx
|
52
|
+
end
|
53
|
+
|
54
|
+
it "loads the file into target" do
|
55
|
+
merger.target.should == { :foo => "bar" }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#load_source" do
|
60
|
+
before do
|
61
|
+
merger.load_source source_path
|
62
|
+
end
|
63
|
+
|
64
|
+
it "sets the source filename" do
|
65
|
+
merger.source_filename.should == source_path
|
66
|
+
end
|
67
|
+
|
68
|
+
it "sets the source locale" do
|
69
|
+
merger.source_locale.should == :en
|
70
|
+
end
|
71
|
+
|
72
|
+
it "loads the file into source" do
|
73
|
+
merger.source.should == { :foo => "baz" }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "#merge" do
|
78
|
+
it "merges source into target" do
|
79
|
+
merger.load_target target_path
|
80
|
+
merger.load_source source_path
|
81
|
+
|
82
|
+
merger.merge.should == { :foo => "baz" }
|
83
|
+
end
|
84
|
+
|
85
|
+
it "overwrites entries in target that are different in source" do
|
86
|
+
merger.target = { :foo => "target" }
|
87
|
+
merger.source = { :foo => "source" }
|
88
|
+
merger.merge.should == { :foo => "source" }
|
89
|
+
end
|
90
|
+
|
91
|
+
it "keeps entries in target that are not in source" do
|
92
|
+
merger.target = { :foo => "target", :bar => "baz" }
|
93
|
+
merger.source = { :foo => "source" }
|
94
|
+
merger.merge.should == { :foo => "source", :bar => "baz" }
|
95
|
+
end
|
96
|
+
|
97
|
+
it "ignores entries that are in source but not in target" do
|
98
|
+
merger.target = { :foo => "target" }
|
99
|
+
merger.source = { :foo => "source", "bar" => "baz" }
|
100
|
+
merger.merge.should == { :foo => "source" }
|
101
|
+
end
|
102
|
+
|
103
|
+
it "works with multidimensional entries" do
|
104
|
+
merger.target = { :foo => "target", :bar => { :baz => "beng", :wuz => "up" } }
|
105
|
+
merger.source = { :foo => "source", :bar => { :baz => "pong" } }
|
106
|
+
merger.merge.should == { :foo => "source", :bar => { :baz => "pong", :wuz => "up" } }
|
107
|
+
end
|
108
|
+
|
109
|
+
it "ignores entries with variable mismatch" do
|
110
|
+
merger.target = { :foo => "target", :bar => "target %{baz}" }
|
111
|
+
merger.source = { :foo => "source %{bar}", :bar => "source %{baz}" }
|
112
|
+
merger.merge.should == { :foo => "target", :bar => "source %{baz}" }
|
113
|
+
end
|
114
|
+
|
115
|
+
it "ignores entries with markup when target has none and key doesn't end with '_html'"
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "#variables_in" do
|
119
|
+
it "gives nil for string without variables" do
|
120
|
+
merger.variables_in("foo").should be_nil
|
121
|
+
end
|
122
|
+
|
123
|
+
it "gives the name of a single variables in a string" do
|
124
|
+
merger.variables_in("foo %{bar}").should == ["%{bar}"]
|
125
|
+
end
|
126
|
+
|
127
|
+
it "gives a list of variables in a string" do
|
128
|
+
merger.variables_in("foo %{bar}, %{baz}").should == ["%{bar}", "%{baz}"]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#store" do
|
133
|
+
before do
|
134
|
+
merger.load_target target_path
|
135
|
+
merger.load_source source_path
|
136
|
+
end
|
137
|
+
|
138
|
+
it "saves the merged data to a file with the given filename" do
|
139
|
+
filename = File.join(fixture_path, 'merged.yml').to_s
|
140
|
+
merger.store(filename)
|
141
|
+
data = YAML.load_file(filename)
|
142
|
+
File.delete(filename)
|
143
|
+
|
144
|
+
data.should == { "xx" => { "foo" => "baz" } }
|
145
|
+
end
|
146
|
+
|
147
|
+
it "saves the merged data to the target file when no filename is given" do
|
148
|
+
File.should_receive(:open).with(target_path, "w")
|
149
|
+
merger.store
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
data/translatr.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "translatr/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "translatr"
|
7
|
+
s.version = Translatr::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Garret Alfert"]
|
10
|
+
s.email = ["alfert@wevelop.de"]
|
11
|
+
s.homepage = ""
|
12
|
+
s.summary = %q{Some i18n helpers for handling translations.}
|
13
|
+
s.description = %q{Some i18n helpers for handling translations.}
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_dependency "i18n", ">= 0.4.2"
|
21
|
+
s.add_dependency "ya2yaml", ">= 0.30"
|
22
|
+
|
23
|
+
s.add_development_dependency "rspec", ">= 2.5.0"
|
24
|
+
s.add_development_dependency "guard", ">= 0.3.0"
|
25
|
+
s.add_development_dependency "guard-rspec", ">= 0.2.0"
|
26
|
+
s.add_development_dependency "guard-spork", ">= 0.1.6"
|
27
|
+
s.add_development_dependency "growl", ">= 1.0.3"
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: translatr
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Garret Alfert
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-11 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: i18n
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.4.2
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: ya2yaml
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0.30"
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.5.0
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id003
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: guard
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
52
|
+
none: false
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 0.3.0
|
57
|
+
type: :development
|
58
|
+
version_requirements: *id004
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: guard-rspec
|
61
|
+
prerelease: false
|
62
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.2.0
|
68
|
+
type: :development
|
69
|
+
version_requirements: *id005
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: guard-spork
|
72
|
+
prerelease: false
|
73
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: 0.1.6
|
79
|
+
type: :development
|
80
|
+
version_requirements: *id006
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: growl
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.0.3
|
90
|
+
type: :development
|
91
|
+
version_requirements: *id007
|
92
|
+
description: Some i18n helpers for handling translations.
|
93
|
+
email:
|
94
|
+
- alfert@wevelop.de
|
95
|
+
executables: []
|
96
|
+
|
97
|
+
extensions: []
|
98
|
+
|
99
|
+
extra_rdoc_files: []
|
100
|
+
|
101
|
+
files:
|
102
|
+
- .gitignore
|
103
|
+
- .rspec
|
104
|
+
- .rvmrc
|
105
|
+
- Gemfile
|
106
|
+
- Guardfile
|
107
|
+
- Rakefile
|
108
|
+
- lib/core_ext/hash.rb
|
109
|
+
- lib/tasks/translatr.rake
|
110
|
+
- lib/translatr.rb
|
111
|
+
- lib/translatr/merger.rb
|
112
|
+
- lib/translatr/version.rb
|
113
|
+
- spec/fixtures/source.yml
|
114
|
+
- spec/fixtures/target.yml
|
115
|
+
- spec/spec_helper.rb
|
116
|
+
- spec/translatr/merger_spec.rb
|
117
|
+
- translatr.gemspec
|
118
|
+
homepage: ""
|
119
|
+
licenses: []
|
120
|
+
|
121
|
+
post_install_message:
|
122
|
+
rdoc_options: []
|
123
|
+
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
none: false
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: "0"
|
132
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: "0"
|
138
|
+
requirements: []
|
139
|
+
|
140
|
+
rubyforge_project:
|
141
|
+
rubygems_version: 1.7.2
|
142
|
+
signing_key:
|
143
|
+
specification_version: 3
|
144
|
+
summary: Some i18n helpers for handling translations.
|
145
|
+
test_files:
|
146
|
+
- spec/fixtures/source.yml
|
147
|
+
- spec/fixtures/target.yml
|
148
|
+
- spec/spec_helper.rb
|
149
|
+
- spec/translatr/merger_spec.rb
|