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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ #--format documentation
data/.rvmrc ADDED
@@ -0,0 +1,7 @@
1
+
2
+ if [[ -d "${rvm_path:-$HOME/.rvm}/environments" \
3
+ && -s "${rvm_path:-$HOME/.rvm}/environments/ruby-1.9.2-head@translatr" ]] ; then
4
+ \. "${rvm_path:-$HOME/.rvm}/environments/ruby-1.9.2-head@translatr"
5
+ else
6
+ rvm --create use "ruby-1.9.2-head@translatr"
7
+ fi
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in translatr.gemspec
4
+ gemspec
data/Guardfile ADDED
@@ -0,0 +1,8 @@
1
+ # A sample Guardfile
2
+ # More info at https://github.com/guard/guard#readme
3
+
4
+ guard 'rspec', :cli => "--drb" do
5
+ watch(%r{^spec/.+_spec\.rb})
6
+ watch(%r{^lib/(.+)\.rb}) { |m| "spec/#{m[1]}_spec.rb" }
7
+ watch('spec/spec_helper.rb') { "spec" }
8
+ end
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler'
2
+ require 'rspec/core/rake_task'
3
+
4
+ load 'lib/tasks/translatr.rake'
5
+
6
+ Bundler::GemHelper.install_tasks
7
+
8
+ RSpec::Core::RakeTask.new('spec')
9
+ task :default => :spec
@@ -0,0 +1,9 @@
1
+ class Hash
2
+ def deep_stringify_keys
3
+ inject({}) { |result, (key, value)|
4
+ value = value.deep_stringify_keys if value.is_a?(Hash)
5
+ result[(key.to_s rescue key) || key] = value
6
+ result
7
+ }
8
+ end unless Hash.method_defined?(:deep_stringify_keys)
9
+ end
@@ -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
@@ -0,0 +1,3 @@
1
+ module Translatr
2
+ VERSION = "0.1.0"
3
+ end
data/lib/translatr.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'core_ext/hash'
2
+ require 'translatr/merger'
3
+
4
+ Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake)
5
+
6
+ module Translatr
7
+ end
@@ -0,0 +1,3 @@
1
+ ---
2
+ en:
3
+ foo: baz
@@ -0,0 +1,3 @@
1
+ ---
2
+ xx:
3
+ foo: bar
@@ -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