sy18nc 0.0.1
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 +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +115 -0
- data/Rakefile +17 -0
- data/bin/sy18nc +20 -0
- data/ext/array.rb +34 -0
- data/ext/hash.rb +46 -0
- data/ext/object.rb +9 -0
- data/ext/string.rb +16 -0
- data/lib/generators/sy18nc/install_generator.rb +13 -0
- data/lib/generators/templates/sy18nc.rb +4 -0
- data/lib/sy18nc/config.rb +25 -0
- data/lib/sy18nc/locale.rb +74 -0
- data/lib/sy18nc/railtie.rb +5 -0
- data/lib/sy18nc/synchronizer.rb +25 -0
- data/lib/sy18nc/version.rb +3 -0
- data/lib/sy18nc.rb +12 -0
- data/lib/tasks/sy18nc.rake +30 -0
- data/spec/ext_spec.rb +149 -0
- data/spec/fixtures/devise.en.yml +67 -0
- data/spec/fixtures/devise.tr.yml +35 -0
- data/spec/fixtures/en.yml +5 -0
- data/spec/fixtures/not_valid.yml +5 -0
- data/spec/fixtures/results/devise.tr.yml +68 -0
- data/spec/fixtures/ru.yml +4 -0
- data/spec/locale_spec.rb +91 -0
- data/spec/spec_helper.rb +8 -0
- data/spec/sy18nc_spec.rb +24 -0
- data/spec/sychronizer_spec.rb +57 -0
- data/sy18nc.gemspec +27 -0
- metadata +169 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Michał Darda
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
# Sy18nc
|
2
|
+
|
3
|
+
Simple tool to synchronize Rails .ymls with locales.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'sy18nc', '~> 0.0.1'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install sy18nc
|
18
|
+
|
19
|
+
## Auto mode
|
20
|
+
|
21
|
+
If you are using this gem with Rails app, you may create an initializer under your `config/initializers` named `sy18nc.rb`
|
22
|
+
|
23
|
+
This command will create it for you:
|
24
|
+
|
25
|
+
$ rails generate sy18nc:install
|
26
|
+
|
27
|
+
Sample initializer looks like this
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
Sy18nc.configure do |c|
|
31
|
+
c.base_locale = "en"
|
32
|
+
c.locales_dir = "config/locales/"
|
33
|
+
c.locales = ["de", "es", "fr", "pl"]
|
34
|
+
c.files = ["application", "devise", "doorkeeper"]
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
`base_locale` - your base locale, the rest of locales will be synchronized to this one (`en` by default).
|
39
|
+
|
40
|
+
`locales_dir` - path to your .ymls with locales (`config/locales` by default).
|
41
|
+
|
42
|
+
`locales` - the rest of your locales which you would like to keep in sync with the base one.
|
43
|
+
|
44
|
+
`files` - all the files you want to keep in sync with the base one.
|
45
|
+
|
46
|
+
`backup` - will save synchronized locales as `.bak` leaving originals untouched (is set to `false` by default).
|
47
|
+
|
48
|
+
Then you can execute:
|
49
|
+
|
50
|
+
$ rake sy18nc
|
51
|
+
|
52
|
+
It will look for every file in `files` list. For example, for `application` file it will find the `application.en` treating this as base and sync every `application.<lang>` which is listed in `locales` config.
|
53
|
+
|
54
|
+
## Manual mode
|
55
|
+
|
56
|
+
sy18nc config/locales/ en.yml ru.yml
|
57
|
+
|
58
|
+
Will synchronize the `ru` locale, treating `en` as base.
|
59
|
+
|
60
|
+
If run with `-b` or `--backup` option it will add the `.bak` extension to the output files instead of modifying original locale files.
|
61
|
+
|
62
|
+
Example:
|
63
|
+
|
64
|
+
sy18nc -b config/locales/ en.yml ru.yml
|
65
|
+
|
66
|
+
or:
|
67
|
+
|
68
|
+
sy18nc --backup config/locales/ en.yml ru.yml
|
69
|
+
|
70
|
+
## Example
|
71
|
+
|
72
|
+
Lets assume we have two locales:
|
73
|
+
|
74
|
+
en.yml:
|
75
|
+
|
76
|
+
en:
|
77
|
+
application:
|
78
|
+
link1: "Hello"
|
79
|
+
link2: "Hello"
|
80
|
+
|
81
|
+
ru.yml:
|
82
|
+
|
83
|
+
ru:
|
84
|
+
application:
|
85
|
+
link1: "привет"
|
86
|
+
|
87
|
+
Command:
|
88
|
+
|
89
|
+
sy18nc config/locales/ en.yml ru.yml
|
90
|
+
|
91
|
+
Will result in:
|
92
|
+
|
93
|
+
ru:
|
94
|
+
application:
|
95
|
+
link1: "привет"
|
96
|
+
link2: "Hello" # FIXME
|
97
|
+
|
98
|
+
As you can see, it imported missing locales from base (en.yml in this case) and added useful `# FIXME` notice,
|
99
|
+
informing you that there is something missing in this locales and you need to fix it.
|
100
|
+
|
101
|
+
## Issues
|
102
|
+
|
103
|
+
Please post any issues via Github Issues. If you want to contribute, see [Contributing](#contributing).
|
104
|
+
|
105
|
+
## Contributing
|
106
|
+
|
107
|
+
1. Fork it
|
108
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
109
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
110
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
111
|
+
5. Create new Pull Request
|
112
|
+
|
113
|
+
## Licence
|
114
|
+
|
115
|
+
MIT Licence. © 2013 Michał Darda <michaldarda@gmail.com>
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
require "rake/testtask"
|
3
|
+
|
4
|
+
require_relative "lib/sy18nc"
|
5
|
+
|
6
|
+
Rake::TestTask.new(:spec) do |t|
|
7
|
+
t.libs.push "lib"
|
8
|
+
t.test_files = FileList["spec/*_spec.rb"]
|
9
|
+
t.verbose = true
|
10
|
+
end
|
11
|
+
|
12
|
+
task default: :spec
|
13
|
+
|
14
|
+
desc "Open an irb session preloaded with this library"
|
15
|
+
task :console do
|
16
|
+
sh "irb -rubygems -I lib -I extra -r ./lib/sy18nc.rb"
|
17
|
+
end
|
data/bin/sy18nc
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require_relative "../lib/sy18nc"
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
options = {}
|
7
|
+
OptionParser.new do |opts|
|
8
|
+
opts.banner = "Usage: sy18nc [options]"
|
9
|
+
|
10
|
+
if ARGV.empty?
|
11
|
+
puts opts.banner
|
12
|
+
end
|
13
|
+
|
14
|
+
opts.on("-b", "--backup", "Create backup") do |b|
|
15
|
+
options[:backup] = b
|
16
|
+
end
|
17
|
+
end.parse!
|
18
|
+
|
19
|
+
synchronizer = Sy18nc::Synchronizer.new(*ARGV, options)
|
20
|
+
synchronizer.synchronize_all
|
data/ext/array.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
class Array
|
2
|
+
# Extracts options from a set of arguments. Removes and returns the last
|
3
|
+
# element in the array if it's a hash, otherwise returns a blank hash.
|
4
|
+
#
|
5
|
+
# def options(*args)
|
6
|
+
# args.extract_options!
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# options(1, 2) # => {}
|
10
|
+
# options(1, 2, :a => :b) # => {:a=>:b}
|
11
|
+
def extract_options!
|
12
|
+
if last.is_a?(Hash) && last.extractable_options?
|
13
|
+
pop
|
14
|
+
else
|
15
|
+
{}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def append!(val)
|
20
|
+
self.each do |v|
|
21
|
+
v.append!(val)
|
22
|
+
end
|
23
|
+
|
24
|
+
self
|
25
|
+
end
|
26
|
+
|
27
|
+
def mark_fixme!
|
28
|
+
self.each do |v|
|
29
|
+
v.mark_fixme!
|
30
|
+
end
|
31
|
+
|
32
|
+
self
|
33
|
+
end
|
34
|
+
end
|
data/ext/hash.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# borrowed from http://api.rubyonrails.org/, customized for own needs
|
2
|
+
class Hash
|
3
|
+
# Merge the two nested hashes, if the key is missing,
|
4
|
+
# we replace it and deeply mark fixme
|
5
|
+
def deep_merge!(other_hash)
|
6
|
+
other_hash.each_pair do |other_key, other_value|
|
7
|
+
self_value = self[other_key]
|
8
|
+
self[other_key] = if self_value.is_a?(Hash) && other_value.is_a?(Hash)
|
9
|
+
self_value.deep_merge!(other_value)
|
10
|
+
elsif self_value.nil?
|
11
|
+
other_value.mark_fixme!
|
12
|
+
else
|
13
|
+
self_value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
# Appends the val to the every string in nested hash
|
20
|
+
def append!(val)
|
21
|
+
self.each_pair do |key, value|
|
22
|
+
self[key] = value.append!(val)
|
23
|
+
end
|
24
|
+
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
# Marks the nested hash values with g FIXME
|
29
|
+
# see also mark_fixme! in string
|
30
|
+
def mark_fixme!
|
31
|
+
self.each_pair do |key, value|
|
32
|
+
self[key] = value.mark_fixme!
|
33
|
+
end
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
# By default, only instances of Hash itself are extractable.
|
39
|
+
# Subclasses of Hash may implement this method and return
|
40
|
+
# true to declare themselves as extractable. If a Hash
|
41
|
+
# is extractable, Array#extract_options! pops it from
|
42
|
+
# the Array when it is the last element of the Array.
|
43
|
+
def extractable_options?
|
44
|
+
instance_of?(Hash)
|
45
|
+
end
|
46
|
+
end
|
data/ext/object.rb
ADDED
data/ext/string.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
class String
|
2
|
+
def mark_fixme!
|
3
|
+
# skip if it is already marked or its an alias
|
4
|
+
if self =~ /g FIXME/ || self =~ /\*([a-z]*(\_)?)*/
|
5
|
+
return self
|
6
|
+
end
|
7
|
+
|
8
|
+
self.replace("#{self} g FIXME")
|
9
|
+
end
|
10
|
+
|
11
|
+
def append!(val)
|
12
|
+
return self if self == ""
|
13
|
+
|
14
|
+
self.replace("#{self}#{val}")
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Sy18nc
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path("../../templates", __FILE__)
|
5
|
+
|
6
|
+
desc "Creates a Sy18nc initializer."
|
7
|
+
|
8
|
+
def copy_initializer
|
9
|
+
template "sy18nc.rb", "config/initializers/sy18nc.rb"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Sy18nc
|
2
|
+
class << self
|
3
|
+
attr_accessor :configuration
|
4
|
+
|
5
|
+
def config
|
6
|
+
@configuration ||= Configuration.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def configure
|
10
|
+
yield(config)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class Configuration
|
15
|
+
attr_accessor :base_locale, :locales_dir, :files, :locales, :backup
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@base_locale = "en"
|
19
|
+
@locales_dir = "#{Dir.pwd}/config/locales"
|
20
|
+
@backup = false
|
21
|
+
@locales = []
|
22
|
+
@files = []
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'psych'
|
2
|
+
|
3
|
+
module Sy18nc
|
4
|
+
class Locale
|
5
|
+
attr_reader :name, :hash
|
6
|
+
|
7
|
+
def initialize(file)
|
8
|
+
@name = File.basename(file,".*")
|
9
|
+
|
10
|
+
file = replace_fixmes(file)
|
11
|
+
|
12
|
+
begin
|
13
|
+
@hash = YAML.load(file)
|
14
|
+
rescue Exception => e
|
15
|
+
puts "Problem with parsing #{name}, check if this is a valid YAML file http://yamllint.com/."
|
16
|
+
puts e.message
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
# little hack
|
21
|
+
# force double-quotes everywhere
|
22
|
+
hash.append!("foo \nbar")
|
23
|
+
end
|
24
|
+
|
25
|
+
def synchronizable?
|
26
|
+
!!hash
|
27
|
+
end
|
28
|
+
|
29
|
+
def body
|
30
|
+
hash[hash.keys.first]
|
31
|
+
end
|
32
|
+
|
33
|
+
def synchronize(other)
|
34
|
+
body.deep_merge!(other.body)
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_yaml
|
38
|
+
# disable line wrap
|
39
|
+
yaml = YAML.dump(hash, line_width: -1)
|
40
|
+
|
41
|
+
# force double quotes in every value
|
42
|
+
yaml.gsub!("foo \\nbar","")
|
43
|
+
restore_fixmes(yaml)
|
44
|
+
end
|
45
|
+
|
46
|
+
def save(options = {})
|
47
|
+
filename = options.fetch(:filename, "#{@name}")
|
48
|
+
filename = "#{filename}.yml"
|
49
|
+
filename = "#{filename}.bak" if options[:backup]
|
50
|
+
|
51
|
+
file = File.new(filename, "w+")
|
52
|
+
file.write(self.to_yaml)
|
53
|
+
file.close
|
54
|
+
end
|
55
|
+
|
56
|
+
# little trick:
|
57
|
+
# fetch with the comments
|
58
|
+
def replace_fixmes(file)
|
59
|
+
file = File.read(File.expand_path(file))
|
60
|
+
file.gsub("\' # FIXME", " g FIXME\'")
|
61
|
+
.gsub("\" # FIXME", " g FIXME\"")
|
62
|
+
.gsub("# FIXME", "g FIXME")
|
63
|
+
end
|
64
|
+
|
65
|
+
# little trick:
|
66
|
+
# restore fixmes
|
67
|
+
def restore_fixmes(file)
|
68
|
+
file.gsub("\sg FIXME\"", "\" # FIXME")
|
69
|
+
.gsub("\sg FIXME\'", "\' # FIXME")
|
70
|
+
.gsub("g FIXME", "# FIXME")
|
71
|
+
.gsub("\"# FIXME\"", "# FIXME")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Sy18nc
|
2
|
+
class Synchronizer
|
3
|
+
def initialize(*files)
|
4
|
+
@options = files.extract_options!
|
5
|
+
@path, @base, *@locales = files
|
6
|
+
|
7
|
+
@path = File.expand_path(@path)
|
8
|
+
|
9
|
+
@base = Locale.new("#{@path}/#{@base}")
|
10
|
+
|
11
|
+
@locales = @locales.map do |tfile|
|
12
|
+
Locale.new("#{@path}/#{tfile}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def synchronize_all
|
17
|
+
@locales.each do |locale|
|
18
|
+
if locale.synchronizable?
|
19
|
+
locale.synchronize(@base)
|
20
|
+
locale.save(@options.merge(filename: "#{@path}/#{locale.name}"))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/sy18nc.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
require_relative '../ext/string'
|
4
|
+
require_relative '../ext/hash'
|
5
|
+
require_relative '../ext/array'
|
6
|
+
require_relative '../ext/object'
|
7
|
+
|
8
|
+
require_relative 'sy18nc/version'
|
9
|
+
require_relative 'sy18nc/synchronizer'
|
10
|
+
require_relative 'sy18nc/locale'
|
11
|
+
require_relative 'sy18nc/config'
|
12
|
+
require_relative 'sy18nc/railtie' if defined?(Rails)
|
@@ -0,0 +1,30 @@
|
|
1
|
+
desc "Synchronizes translations according to config in initializer"
|
2
|
+
task :sy18nc => :environment do
|
3
|
+
options = Sy18nc.config.backup ? {backup: true} : {}
|
4
|
+
|
5
|
+
# synchronize the main files
|
6
|
+
files = [Sy18nc.config.locales_dir]
|
7
|
+
files << "#{Sy18nc.config.base_locale}.yml"
|
8
|
+
files << Sy18nc.config.locales.map do |l|
|
9
|
+
"#{l}.yml"
|
10
|
+
end
|
11
|
+
|
12
|
+
files.flatten!
|
13
|
+
|
14
|
+
synchronizer = Sy18nc::Synchronizer.new(*files, options)
|
15
|
+
synchronizer.synchronize_all
|
16
|
+
|
17
|
+
# synchronize the rest of files
|
18
|
+
Sy18nc.config.files.each do |s|
|
19
|
+
files = [Sy18nc.config.locales_dir]
|
20
|
+
files << "#{s}.#{Sy18nc.config.base_locale}.yml"
|
21
|
+
files << Sy18nc.config.locales.map do |l|
|
22
|
+
"#{s}.#{l}.yml"
|
23
|
+
end
|
24
|
+
|
25
|
+
files.flatten!
|
26
|
+
|
27
|
+
synchronizer = Sy18nc::Synchronizer.new(*files, options)
|
28
|
+
synchronizer.synchronize_all
|
29
|
+
end
|
30
|
+
end
|
data/spec/ext_spec.rb
ADDED
@@ -0,0 +1,149 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Array do
|
4
|
+
it "extracts options" do
|
5
|
+
a = [1, 2, 3, 4, { option: true, option2: false }]
|
6
|
+
a.extract_options!.must_equal({ option: true, option2: false })
|
7
|
+
a.must_equal([1,2,3,4])
|
8
|
+
|
9
|
+
a.extract_options!.must_equal({})
|
10
|
+
a.must_equal([1,2,3,4])
|
11
|
+
end
|
12
|
+
|
13
|
+
it "appends" do
|
14
|
+
a = ["hello", "world"]
|
15
|
+
|
16
|
+
a.append!("appended_string")
|
17
|
+
|
18
|
+
a.must_equal ["helloappended_string", "worldappended_string"]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe Hash do
|
23
|
+
before do
|
24
|
+
@hash = {
|
25
|
+
:key1 => {
|
26
|
+
key11: "Hello",
|
27
|
+
key12: "Hello"
|
28
|
+
},
|
29
|
+
:key2 => {
|
30
|
+
key21: "Hello",
|
31
|
+
key22: {
|
32
|
+
key221: "Hello",
|
33
|
+
key222: {
|
34
|
+
key2221: "Hello",
|
35
|
+
key2222: "Hello"
|
36
|
+
}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
it "deep appending the correct string" do
|
43
|
+
appended_hash = {
|
44
|
+
:key1 => {
|
45
|
+
key11: "Helloappended_string",
|
46
|
+
key12: "Helloappended_string"
|
47
|
+
},
|
48
|
+
:key2 => {
|
49
|
+
key21: "Helloappended_string",
|
50
|
+
key22: {
|
51
|
+
key221: "Helloappended_string",
|
52
|
+
key222: {
|
53
|
+
key2221: "Helloappended_string",
|
54
|
+
key2222: "Helloappended_string"
|
55
|
+
}
|
56
|
+
}
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
@hash.append!("appended_string").must_equal appended_hash
|
61
|
+
|
62
|
+
hash2 = {
|
63
|
+
:key1 => "helloworld",
|
64
|
+
:key2 =>
|
65
|
+
[
|
66
|
+
"hello",
|
67
|
+
"world"
|
68
|
+
]
|
69
|
+
}
|
70
|
+
|
71
|
+
appended_hash2 = {
|
72
|
+
:key1 => "helloworldappended_string",
|
73
|
+
:key2 =>
|
74
|
+
[
|
75
|
+
"helloappended_string",
|
76
|
+
"worldappended_string"
|
77
|
+
]
|
78
|
+
}
|
79
|
+
|
80
|
+
hash2.append!("appended_string").must_equal appended_hash2
|
81
|
+
end
|
82
|
+
|
83
|
+
it "deep marks fixme" do
|
84
|
+
fixme_hash = {
|
85
|
+
:key1 => {
|
86
|
+
key11: "Hello g FIXME",
|
87
|
+
key12: "Hello g FIXME"
|
88
|
+
},
|
89
|
+
:key2 => {
|
90
|
+
key21: "Hello g FIXME",
|
91
|
+
key22: {
|
92
|
+
key221: "Hello g FIXME",
|
93
|
+
key222: {
|
94
|
+
key2221: "Hello g FIXME",
|
95
|
+
key2222: "Hello g FIXME"
|
96
|
+
}
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
@hash.mark_fixme!
|
102
|
+
@hash.must_equal fixme_hash
|
103
|
+
end
|
104
|
+
|
105
|
+
it "deep merges and marks fixme" do
|
106
|
+
other_hash = {
|
107
|
+
:key1 => {
|
108
|
+
key11: "Hello",
|
109
|
+
},
|
110
|
+
:key2 => {
|
111
|
+
key22: {
|
112
|
+
key221: "Hello"
|
113
|
+
}
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
result = {
|
118
|
+
:key1 => {
|
119
|
+
key11: "Hello",
|
120
|
+
key12: "Hello g FIXME"
|
121
|
+
},
|
122
|
+
:key2 => {
|
123
|
+
key21: "Hello g FIXME",
|
124
|
+
key22: {
|
125
|
+
key221: "Hello",
|
126
|
+
key222: {
|
127
|
+
key2221: "Hello g FIXME",
|
128
|
+
key2222: "Hello g FIXME"
|
129
|
+
}
|
130
|
+
}
|
131
|
+
}
|
132
|
+
}
|
133
|
+
|
134
|
+
other_hash.deep_merge!(@hash).must_equal result
|
135
|
+
end
|
136
|
+
|
137
|
+
it "deep merges hashes with nested arrays" do
|
138
|
+
end
|
139
|
+
|
140
|
+
describe String do
|
141
|
+
it "marks fixme" do
|
142
|
+
"Hello".mark_fixme!.must_equal("Hello g FIXME")
|
143
|
+
|
144
|
+
"Hello g FIXME".mark_fixme!.must_equal("Hello g FIXME")
|
145
|
+
|
146
|
+
"*hello_world".mark_fixme!.must_equal("*hello_world")
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
en:
|
2
|
+
errors:
|
3
|
+
messages:
|
4
|
+
not_found: "not found"
|
5
|
+
already_confirmed: "was already confirmed"
|
6
|
+
not_locked: "was not locked"
|
7
|
+
devise:
|
8
|
+
failure:
|
9
|
+
already_authenticated: 'Already authenticated.'
|
10
|
+
unauthenticated: 'You need to sign in before continuing.'
|
11
|
+
unconfirmed: 'You have to confirm your account before continuing.'
|
12
|
+
locked: 'Your account is locked.'
|
13
|
+
invalid: 'Invalid email or password.'
|
14
|
+
invalid_token: 'Invalid authentication token.'
|
15
|
+
timeout: 'Your session expired, please sign in again to continue.'
|
16
|
+
inactive: 'Your account was not activated yet.'
|
17
|
+
sessions:
|
18
|
+
signed_in: 'Signed in successfully.'
|
19
|
+
signed_out: 'Signed out successfully.'
|
20
|
+
passwords:
|
21
|
+
send_instructions: 'You will receive an email with instructions about how to reset your password in a few minutes.'
|
22
|
+
updated: 'Your password was changed successfully. You are now signed in.'
|
23
|
+
send_paranoid_instructions: "If your account exists in our userbase, you will receive an email with an instruction how to reset you password."
|
24
|
+
confirmations:
|
25
|
+
send_instructions: 'You will receive an email with instructions about how to confirm your account in a few minutes.'
|
26
|
+
send_paranoid_instructions: 'If your email exists in our userbase, you will receive an email with an instruction how to activate your account.'
|
27
|
+
confirmed: 'Your account was successfully confirmed. You are now signed in.'
|
28
|
+
registrations:
|
29
|
+
nested:
|
30
|
+
more_nested:
|
31
|
+
range:
|
32
|
+
- Current
|
33
|
+
- 3 days
|
34
|
+
- 7 days
|
35
|
+
- 1 month
|
36
|
+
- 3 months
|
37
|
+
signed_up: 'You have signed up successfully.'
|
38
|
+
inactive_signed_up: 'You have signed up successfully, however you were not signed in because your account is %{reason}.'
|
39
|
+
updated: 'You updated your account successfully.'
|
40
|
+
destroyed: 'Bye! Your account was successfully cancelled. We hope to see you again soon.'
|
41
|
+
unlocks:
|
42
|
+
send_instructions: 'You will receive an email with instructions about how to unlock your account in a few minutes.'
|
43
|
+
unlocked: 'Your account was successfully unlocked. You are now signed in.'
|
44
|
+
send_paranoid_instructions: 'If your account exists in our userbase, you will receive an email with an instruction how to unlock your account.'
|
45
|
+
mailer:
|
46
|
+
confirmation_instructions:
|
47
|
+
subject: 'Confirmation instructions'
|
48
|
+
reset_password_instructions:
|
49
|
+
subject: 'Reset password instructions'
|
50
|
+
unlock_instructions:
|
51
|
+
subject: 'Unlock Instructions'
|
52
|
+
website:
|
53
|
+
one: "eine Website"
|
54
|
+
few: "%{count} Websites"
|
55
|
+
many: "%{count} Websites"
|
56
|
+
other: "%{count} Websites"
|
57
|
+
omniauth_callbacks:
|
58
|
+
empty_key:
|
59
|
+
success: "Successfully authorized from %{kind} account"
|
60
|
+
user:
|
61
|
+
failure: "Unexpected Authorization failure, please try again."
|
62
|
+
range:
|
63
|
+
- Current
|
64
|
+
- 3 days
|
65
|
+
- 7 days
|
66
|
+
- 1 month
|
67
|
+
- 3 months
|
@@ -0,0 +1,35 @@
|
|
1
|
+
tr:
|
2
|
+
devise:
|
3
|
+
confirmations:
|
4
|
+
confirmed: "Hesabınız doğrulandı ve giriş yaptınız."
|
5
|
+
send_paranoid_instructions: "Eğer mail adresiniz kullanıcı tabanında mevcutsa, hesabınızı nasıl aktif edeceğinizi anlatan bir mail alacaksınız"
|
6
|
+
failure:
|
7
|
+
already_authenticated: "Zaten doğrulandı"
|
8
|
+
inactive: "Hesabınız henüz aktif değil."
|
9
|
+
invalid: "Geçersiz email ya da şifre"
|
10
|
+
invalid_token: "Geçersiz doğrulama tokeni"
|
11
|
+
locked: "Hesabınız kilitlendi"
|
12
|
+
timeout: "Oturum süresi doldu. Devam etmek için lütfen tekrar giriş yapınız"
|
13
|
+
unauthenticated: "Devam etmeden önce giriş yapmanız gerekiyor."
|
14
|
+
unconfirmed: "Devam edebilmek için hesabınızı doğrulamanız gerek."
|
15
|
+
mailer:
|
16
|
+
reset_password_instructions:
|
17
|
+
subject: "Şifre sıfırlama talimatları"
|
18
|
+
unlock_instructions:
|
19
|
+
subject: "Bloke açma talimatları"
|
20
|
+
omniauth_callbacks:
|
21
|
+
success: "Successfully authorized from %{kind} account"
|
22
|
+
passwords:
|
23
|
+
send_instructions: "Hesap şifrenizi nasıl değiştirebileceğinizi gösteren bir mail alacaksınız."
|
24
|
+
send_paranoid_instructions: "Eğer hesabınız kullanıcı tabanımızda mevcutsa, hesap şifrenizi nasıl değiştirebileceğinizi gösteren bir mail alacaksınız."
|
25
|
+
updated: "Şifreniz başarılı bir şekilde değiştirildi. Şimdi giriş yaptınız."
|
26
|
+
registrations:
|
27
|
+
destroyed: "Güle güle! Hesabınız iptal edildi. Umarız yakın zamanda tekrar sizi aramızda görürüz."
|
28
|
+
inactive_signed_up: "Başarılı bir şekilde üyelik oluşturdunuz fakat giriş yapamadınız çünkü hesabınız %{reason}"
|
29
|
+
sessions:
|
30
|
+
signed_in: "Başarılı bir şekilde giriş yapıldı."
|
31
|
+
signed_out: "Çıkış yapıldı"
|
32
|
+
unlocks:
|
33
|
+
send_instructions: "Bir kaç dakika içerisinde hesabınızı nasıl açacağınıza dair mail alacaksınız"
|
34
|
+
send_paranoid_instructions: "Eğer hesabınız kullanıcı tabanımızda mevcutsa, bir kaç dakika içerisinde hesabınızı nasıl açacağınıza dair mail alacaksınız"
|
35
|
+
unlocked: "Hesabınız başarılı bir şekilde açıldı ve şimdi giriş yaptınız."
|
@@ -0,0 +1,68 @@
|
|
1
|
+
---
|
2
|
+
tr:
|
3
|
+
devise:
|
4
|
+
confirmations:
|
5
|
+
confirmed: "Hesabınız doğrulandı ve giriş yaptınız."
|
6
|
+
send_paranoid_instructions: "Eğer mail adresiniz kullanıcı tabanında mevcutsa, hesabınızı nasıl aktif edeceğinizi anlatan bir mail alacaksınız"
|
7
|
+
send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes." # FIXME
|
8
|
+
failure:
|
9
|
+
already_authenticated: "Zaten doğrulandı"
|
10
|
+
inactive: "Hesabınız henüz aktif değil."
|
11
|
+
invalid: "Geçersiz email ya da şifre"
|
12
|
+
invalid_token: "Geçersiz doğrulama tokeni"
|
13
|
+
locked: "Hesabınız kilitlendi"
|
14
|
+
timeout: "Oturum süresi doldu. Devam etmek için lütfen tekrar giriş yapınız"
|
15
|
+
unauthenticated: "Devam etmeden önce giriş yapmanız gerekiyor."
|
16
|
+
unconfirmed: "Devam edebilmek için hesabınızı doğrulamanız gerek."
|
17
|
+
mailer:
|
18
|
+
reset_password_instructions:
|
19
|
+
subject: "Şifre sıfırlama talimatları"
|
20
|
+
unlock_instructions:
|
21
|
+
subject: "Bloke açma talimatları"
|
22
|
+
confirmation_instructions:
|
23
|
+
subject: "Confirmation instructions" # FIXME
|
24
|
+
website:
|
25
|
+
one: "eine Website" # FIXME
|
26
|
+
few: "%{count} Websites" # FIXME
|
27
|
+
many: "%{count} Websites" # FIXME
|
28
|
+
other: "%{count} Websites" # FIXME
|
29
|
+
omniauth_callbacks:
|
30
|
+
success: "Successfully authorized from %{kind} account"
|
31
|
+
empty_key:
|
32
|
+
user:
|
33
|
+
failure: "Unexpected Authorization failure, please try again." # FIXME
|
34
|
+
range:
|
35
|
+
- "Current" # FIXME
|
36
|
+
- "3 days" # FIXME
|
37
|
+
- "7 days" # FIXME
|
38
|
+
- "1 month" # FIXME
|
39
|
+
- "3 months" # FIXME
|
40
|
+
passwords:
|
41
|
+
send_instructions: "Hesap şifrenizi nasıl değiştirebileceğinizi gösteren bir mail alacaksınız."
|
42
|
+
send_paranoid_instructions: "Eğer hesabınız kullanıcı tabanımızda mevcutsa, hesap şifrenizi nasıl değiştirebileceğinizi gösteren bir mail alacaksınız."
|
43
|
+
updated: "Şifreniz başarılı bir şekilde değiştirildi. Şimdi giriş yaptınız."
|
44
|
+
registrations:
|
45
|
+
destroyed: "Güle güle! Hesabınız iptal edildi. Umarız yakın zamanda tekrar sizi aramızda görürüz."
|
46
|
+
inactive_signed_up: "Başarılı bir şekilde üyelik oluşturdunuz fakat giriş yapamadınız çünkü hesabınız %{reason}"
|
47
|
+
nested:
|
48
|
+
more_nested:
|
49
|
+
range:
|
50
|
+
- "Current" # FIXME
|
51
|
+
- "3 days" # FIXME
|
52
|
+
- "7 days" # FIXME
|
53
|
+
- "1 month" # FIXME
|
54
|
+
- "3 months" # FIXME
|
55
|
+
signed_up: "You have signed up successfully." # FIXME
|
56
|
+
updated: "You updated your account successfully." # FIXME
|
57
|
+
sessions:
|
58
|
+
signed_in: "Başarılı bir şekilde giriş yapıldı."
|
59
|
+
signed_out: "Çıkış yapıldı"
|
60
|
+
unlocks:
|
61
|
+
send_instructions: "Bir kaç dakika içerisinde hesabınızı nasıl açacağınıza dair mail alacaksınız"
|
62
|
+
send_paranoid_instructions: "Eğer hesabınız kullanıcı tabanımızda mevcutsa, bir kaç dakika içerisinde hesabınızı nasıl açacağınıza dair mail alacaksınız"
|
63
|
+
unlocked: "Hesabınız başarılı bir şekilde açıldı ve şimdi giriş yaptınız."
|
64
|
+
errors:
|
65
|
+
messages:
|
66
|
+
not_found: "not found" # FIXME
|
67
|
+
already_confirmed: "was already confirmed" # FIXME
|
68
|
+
not_locked: "was not locked" # FIXME
|
data/spec/locale_spec.rb
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Sy18nc::Locale do
|
4
|
+
before do
|
5
|
+
@locale = Sy18nc::Locale.new("spec/fixtures/en.yml")
|
6
|
+
end
|
7
|
+
|
8
|
+
it "loads the yaml" do
|
9
|
+
@locale.hash.wont_be_empty
|
10
|
+
@locale.hash.must_be_kind_of Hash
|
11
|
+
|
12
|
+
locale = Sy18nc::Locale.new("spec/fixtures/devise.tr.yml")
|
13
|
+
locale.hash.wont_be_empty
|
14
|
+
locale.hash.must_be_kind_of Hash
|
15
|
+
assert locale.synchronizable?
|
16
|
+
end
|
17
|
+
|
18
|
+
it "is not synchronizable when YAML is not valid" do
|
19
|
+
t = Sy18nc::Locale.new("spec/fixtures/not_valid.yml")
|
20
|
+
refute t.synchronizable?
|
21
|
+
end
|
22
|
+
|
23
|
+
it "fetches the locale body" do
|
24
|
+
@locale.body.wont_equal "en"
|
25
|
+
@locale.body.must_be_kind_of Hash
|
26
|
+
|
27
|
+
locale = Sy18nc::Locale.new("spec/fixtures/devise.tr.yml")
|
28
|
+
locale.body.wont_be_empty
|
29
|
+
locale.body.must_be_kind_of Hash
|
30
|
+
end
|
31
|
+
|
32
|
+
it "writes the locale to file" do
|
33
|
+
refute File.exists?("en.yml")
|
34
|
+
@locale.save
|
35
|
+
assert File.exists?("en.yml")
|
36
|
+
|
37
|
+
refute File.exists?("en.yml.bak")
|
38
|
+
@locale.save(backup: true)
|
39
|
+
assert File.exists?("en.yml.bak")
|
40
|
+
|
41
|
+
refute File.exists?("locale_file.yml")
|
42
|
+
@locale.save(filename: "locale_file")
|
43
|
+
assert File.exists?("locale_file.yml")
|
44
|
+
|
45
|
+
refute File.exists?("locale_file.yml.bak")
|
46
|
+
@locale.save(filename: "locale_file", backup: true)
|
47
|
+
assert File.exists?("locale_file.yml.bak")
|
48
|
+
|
49
|
+
cleanup
|
50
|
+
end
|
51
|
+
|
52
|
+
it "converts locale to yml" do
|
53
|
+
@locale.to_yaml.wont_be_empty
|
54
|
+
@locale.to_yaml.must_be_kind_of String
|
55
|
+
@locale.to_yaml.must_equal %q[---
|
56
|
+
en:
|
57
|
+
promo:
|
58
|
+
link1: "Hello"
|
59
|
+
link2: "Hello"
|
60
|
+
]
|
61
|
+
end
|
62
|
+
|
63
|
+
it "synchronizes locales" do
|
64
|
+
russian_locale = Sy18nc::Locale.new("spec/fixtures/ru.yml")
|
65
|
+
russian_locale.synchronize(@locale)
|
66
|
+
russian_locale.to_yaml.must_equal %q[---
|
67
|
+
ru:
|
68
|
+
promo:
|
69
|
+
link1: "Birbevoon"
|
70
|
+
link2: "Hello" # FIXME
|
71
|
+
]
|
72
|
+
@locale.to_yaml.lines.count.must_equal russian_locale.to_yaml.lines.count
|
73
|
+
|
74
|
+
devise_en = Sy18nc::Locale.new("spec/fixtures/devise.en.yml")
|
75
|
+
devise_tr = Sy18nc::Locale.new("spec/fixtures/devise.tr.yml")
|
76
|
+
devise_en.to_yaml.lines.count.wont_equal devise_tr.to_yaml.lines.count
|
77
|
+
|
78
|
+
devise_tr.synchronize(devise_en)
|
79
|
+
devise_tr.to_yaml.lines.count.must_equal devise_en.to_yaml.lines.count
|
80
|
+
devise_tr.to_yaml.must_equal(File.read(File.expand_path("spec/fixtures/results/devise.tr.yml")))
|
81
|
+
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
def cleanup
|
86
|
+
%x[rm en.yml]
|
87
|
+
%x[rm en.yml.bak]
|
88
|
+
%x[rm locale_file.yml]
|
89
|
+
%x[rm locale_file.yml.bak]
|
90
|
+
end
|
91
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/sy18nc_spec.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative "spec_helper"
|
2
|
+
|
3
|
+
describe Sy18nc do
|
4
|
+
it "is configurable" do
|
5
|
+
Sy18nc.config.base_locale.must_equal "en"
|
6
|
+
Sy18nc.config.locales_dir.must_equal "#{Dir.pwd}/config/locales"
|
7
|
+
Sy18nc.config.files.must_equal []
|
8
|
+
Sy18nc.config.locales.must_equal []
|
9
|
+
|
10
|
+
Sy18nc.configure do |c|
|
11
|
+
c.base_locale = "ru"
|
12
|
+
c.locales_dir = "spec/fixtures"
|
13
|
+
c.backup = true
|
14
|
+
c.files = ["code", "devise", "doorkeeper"]
|
15
|
+
c.locales = ["en", "es", "fr", "de"]
|
16
|
+
end
|
17
|
+
|
18
|
+
Sy18nc.config.base_locale.must_equal "ru"
|
19
|
+
Sy18nc.config.locales_dir.must_equal "spec/fixtures"
|
20
|
+
Sy18nc.config.backup.must_equal true
|
21
|
+
Sy18nc.config.files.must_equal ["code", "devise", "doorkeeper"]
|
22
|
+
Sy18nc.config.locales.must_equal ["en", "es", "fr", "de"]
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require_relative 'spec_helper'
|
2
|
+
|
3
|
+
describe Sy18nc::Synchronizer do
|
4
|
+
def setup
|
5
|
+
@synchronizer = Sy18nc::Synchronizer.new("spec/fixtures/", "en.yml" ,"ru.yml", backup: true)
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
%x[rm spec/fixtures/*.bak]
|
10
|
+
end
|
11
|
+
|
12
|
+
it "never touches the original translation" do
|
13
|
+
before = File.read(File.expand_path("spec/fixtures/en.yml"))
|
14
|
+
|
15
|
+
synchronizer = Sy18nc::Synchronizer.new("spec/fixtures/", "en.yml" ,"ru.yml", backup: true)
|
16
|
+
synchronizer.synchronize_all
|
17
|
+
after = File.read(File.expand_path("spec/fixtures/en.yml"))
|
18
|
+
|
19
|
+
after.must_equal before
|
20
|
+
end
|
21
|
+
|
22
|
+
it "synchronizes translation only once" do
|
23
|
+
3.times do
|
24
|
+
@synchronizer.synchronize_all
|
25
|
+
File.read(File.expand_path("spec/fixtures/ru.yml.bak")).must_equal %q[---
|
26
|
+
ru:
|
27
|
+
promo:
|
28
|
+
link1: "Birbevoon"
|
29
|
+
link2: "Hello" # FIXME
|
30
|
+
]
|
31
|
+
end
|
32
|
+
|
33
|
+
4.times do
|
34
|
+
synchronizer = Sy18nc::Synchronizer.new("spec/fixtures/", "devise.en.yml", "devise.tr.yml", backup: true)
|
35
|
+
synchronizer.synchronize_all
|
36
|
+
File.read(File.expand_path("spec/fixtures/devise.tr.yml.bak")).must_equal(File.read(File.expand_path("spec/fixtures/results/devise.tr.yml")))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "when backup option is set to true saves as a backup file and does not modify original files" do
|
41
|
+
refute File.exists?(File.expand_path("spec/fixtures/ru.yml.bak"))
|
42
|
+
@synchronizer.synchronize_all
|
43
|
+
assert File.exists?(File.expand_path("spec/fixtures/ru.yml.bak"))
|
44
|
+
File.read(File.expand_path("spec/fixtures/ru.yml.bak")).must_equal %q[---
|
45
|
+
ru:
|
46
|
+
promo:
|
47
|
+
link1: "Birbevoon"
|
48
|
+
link2: "Hello" # FIXME
|
49
|
+
]
|
50
|
+
|
51
|
+
refute File.exists?(File.expand_path("spec/fixtures/devise.tr.yml.bak"))
|
52
|
+
synchronizer = Sy18nc::Synchronizer.new("spec/fixtures/", "devise.en.yml", "devise.tr.yml", backup: true)
|
53
|
+
synchronizer.synchronize_all
|
54
|
+
assert File.exists?(File.expand_path("spec/fixtures/devise.tr.yml.bak"))
|
55
|
+
File.read(File.expand_path("spec/fixtures/devise.tr.yml.bak")).must_equal(File.read(File.expand_path("spec/fixtures/results/devise.tr.yml")))
|
56
|
+
end
|
57
|
+
end
|
data/sy18nc.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'sy18nc/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "sy18nc"
|
8
|
+
spec.version = Sy18nc::VERSION
|
9
|
+
spec.authors = ["Michał Darda"]
|
10
|
+
spec.email = ["michaldarda@gmail.com"]
|
11
|
+
spec.description = %q{ Simple tool to synchronize Rails ymls with locales. }
|
12
|
+
spec.summary = %q{ Simple tool to synchronize Rails ymls with locales. }
|
13
|
+
spec.homepage = "https://github.com/michaldarda/sy18nc"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "psych", "~> 2.0.1"
|
22
|
+
|
23
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
24
|
+
spec.add_development_dependency "rake"
|
25
|
+
spec.add_development_dependency "turn", "~> 0.9.6"
|
26
|
+
spec.add_development_dependency "simplecov", "~> 0.7.1"
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sy18nc
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Michał Darda
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-11-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: psych
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.0.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.0.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: bundler
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '1.3'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '1.3'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: turn
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ~>
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.9.6
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.9.6
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: simplecov
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ~>
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.7.1
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.7.1
|
94
|
+
description: ! ' Simple tool to synchronize Rails ymls with locales. '
|
95
|
+
email:
|
96
|
+
- michaldarda@gmail.com
|
97
|
+
executables:
|
98
|
+
- sy18nc
|
99
|
+
extensions: []
|
100
|
+
extra_rdoc_files: []
|
101
|
+
files:
|
102
|
+
- .gitignore
|
103
|
+
- Gemfile
|
104
|
+
- LICENSE.txt
|
105
|
+
- README.md
|
106
|
+
- Rakefile
|
107
|
+
- bin/sy18nc
|
108
|
+
- ext/array.rb
|
109
|
+
- ext/hash.rb
|
110
|
+
- ext/object.rb
|
111
|
+
- ext/string.rb
|
112
|
+
- lib/generators/sy18nc/install_generator.rb
|
113
|
+
- lib/generators/templates/sy18nc.rb
|
114
|
+
- lib/sy18nc.rb
|
115
|
+
- lib/sy18nc/config.rb
|
116
|
+
- lib/sy18nc/locale.rb
|
117
|
+
- lib/sy18nc/railtie.rb
|
118
|
+
- lib/sy18nc/synchronizer.rb
|
119
|
+
- lib/sy18nc/version.rb
|
120
|
+
- lib/tasks/sy18nc.rake
|
121
|
+
- spec/ext_spec.rb
|
122
|
+
- spec/fixtures/devise.en.yml
|
123
|
+
- spec/fixtures/devise.tr.yml
|
124
|
+
- spec/fixtures/en.yml
|
125
|
+
- spec/fixtures/not_valid.yml
|
126
|
+
- spec/fixtures/results/devise.tr.yml
|
127
|
+
- spec/fixtures/ru.yml
|
128
|
+
- spec/locale_spec.rb
|
129
|
+
- spec/spec_helper.rb
|
130
|
+
- spec/sy18nc_spec.rb
|
131
|
+
- spec/sychronizer_spec.rb
|
132
|
+
- sy18nc.gemspec
|
133
|
+
homepage: https://github.com/michaldarda/sy18nc
|
134
|
+
licenses:
|
135
|
+
- MIT
|
136
|
+
post_install_message:
|
137
|
+
rdoc_options: []
|
138
|
+
require_paths:
|
139
|
+
- lib
|
140
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
141
|
+
none: false
|
142
|
+
requirements:
|
143
|
+
- - ! '>='
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
152
|
+
requirements: []
|
153
|
+
rubyforge_project:
|
154
|
+
rubygems_version: 1.8.23
|
155
|
+
signing_key:
|
156
|
+
specification_version: 3
|
157
|
+
summary: Simple tool to synchronize Rails ymls with locales.
|
158
|
+
test_files:
|
159
|
+
- spec/ext_spec.rb
|
160
|
+
- spec/fixtures/devise.en.yml
|
161
|
+
- spec/fixtures/devise.tr.yml
|
162
|
+
- spec/fixtures/en.yml
|
163
|
+
- spec/fixtures/not_valid.yml
|
164
|
+
- spec/fixtures/results/devise.tr.yml
|
165
|
+
- spec/fixtures/ru.yml
|
166
|
+
- spec/locale_spec.rb
|
167
|
+
- spec/spec_helper.rb
|
168
|
+
- spec/sy18nc_spec.rb
|
169
|
+
- spec/sychronizer_spec.rb
|