i18n-transformers 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3821ea791dc50519a326ea4b283819bb98856e66
4
+ data.tar.gz: 5bb8cf9ecb191945bf972e9e041e52daa1351d4a
5
+ SHA512:
6
+ metadata.gz: f03a43f72084e0972395565f5cf92c3ac16f7c6af28ee271bc4ac87affda2c9e7b6df59ecac3ebfb5821adddc4b953393c0344914dae093e6e48e05868c57f11
7
+ data.tar.gz: 8926319b1e500a4d2babc19a20a81361d638711bfb111882280775a221e07c9d4e410a0bb57081864b47974f7ef25d84004600e786e237a68fabf89d2fab1921
@@ -0,0 +1,12 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # rspec failure tracking
12
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,7 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.4
5
+ before_install: gem install bundler -v 1.15.1
6
+ notifications:
7
+ email: false
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in i18n-transformers.gemspec
4
+ gemspec
5
+
6
+ gem 'pry'
7
+ gem 'byebug'
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Tim Masliuchenko
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,247 @@
1
+ # I18n::Transformers
2
+
3
+ [![Build Status](https://travis-ci.org/timsly/i18n-transformers.svg?branch=master)](https://travis-ci.org/timsly/i18n-transformers)
4
+
5
+ Transformers for `I18n` ruby library
6
+
7
+ `I18n::Transformers` is a `I18n` ruby library plugin that allows transform translations.
8
+
9
+ `I18n::Transformers` can be used if some or even all translations keys require some transformation.
10
+ For example parsing markdown or replacing some symbol.
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'i18n-transformers'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install i18n-transformers
27
+
28
+ ## Usage
29
+
30
+ The core of this library is `I18n.transformers.register` method.
31
+ It can be used to register various transformers or reset all available transformers.
32
+ It is designed to register transformers globally.
33
+ It returns transformer instance that can be later used with `before`/`after` options.
34
+
35
+ If some transformers have to be applied only for some set of keys
36
+ then this logic has to implemented in the transformer class itself.
37
+ Also, it is very important to return original value in this case(see [Transformers chain section](#transformers-chain))
38
+
39
+ The gem comes with a few built-in transformers:
40
+
41
+ * generic transformer
42
+ * markdown transformer
43
+
44
+ If symbol was passed as the first argument to `.register` call
45
+ it will search thought built-in transformers and try to register it.
46
+ If there is no match generic adapter will be used.
47
+
48
+ ### Generic transformer
49
+
50
+ Generic transformer is designed to handle custom transformers defined as a block.
51
+ It is useful for simple transformations.
52
+
53
+ To register generic transformer call:
54
+
55
+ ```ruby
56
+ I18n.transformers.register do |key, value|
57
+ "transformered-#{value}"
58
+ end
59
+ ```
60
+
61
+ `I18n.translate` key and translation value will be passed to the block.
62
+
63
+ Each transformer has its name that helps to register transformer after or before some specific transformer.
64
+ By default generic transformer generates unique name for each transformer,
65
+ but it can be also explicitly specified by passing name as the first argument.
66
+
67
+ ```ruby
68
+ I18n.transformers.register 'my_transformer' do |key, value|
69
+ "transformered-#{value}"
70
+ end
71
+ ```
72
+
73
+ All transformers can be registered before, after or at specific position.
74
+ `before`, `after` and `at` options are used for that.
75
+
76
+ ```ruby
77
+ I18n.transformers.register 'my_transformer' do |key, value|
78
+ "transformered1-#{value}"
79
+ end
80
+
81
+ another_transformer = I18n.transformers.register after: 'my_transformer' do |key, value|
82
+ "transformered2-#{value}"
83
+ end
84
+
85
+ I18n.transformers.register before: another_transformer, do |key, value|
86
+ "transformered3-#{value}"
87
+ end
88
+
89
+ I18n.transformers.register at: 1, do |key, value|
90
+ "transformered4-#{value}"
91
+ end
92
+ ```
93
+
94
+ ### Markdown transformer
95
+
96
+ To register built-in markdown transformer use:
97
+
98
+ ```ruby
99
+ I18n.transformers.register :markdown
100
+ ```
101
+
102
+ Currently it supports [`redcarpet`](https://github.com/vmg/redcarpet) and [`kramdown`](https://github.com/gettalong/kramdown) markdown parsers.
103
+
104
+ It uses first available adapter so if both are available `redcarpet` will be picked.
105
+ To specify adapter use:
106
+
107
+ ```ruby
108
+ I18n.transformers.register :markdown, adapter: :redcarpet
109
+ ```
110
+
111
+ Markdown transformer is designed to be triggered only for some set of keys.
112
+ By default it triggers only for keys ended with `_md` and `.md`.
113
+
114
+ So specify custom key pattern use:
115
+
116
+ ```ruby
117
+ I18n.transformers.register :markdown, key_pattern: /_markdown$/
118
+ ```
119
+
120
+ In the example above markdown transformer will be triggered only if key ended with `_markdown`.
121
+
122
+ If block was specified it will be used instead.
123
+ It can be useful to override default transformation behavior.
124
+
125
+ ```ruby
126
+ I18n.transformers.register :markdown do |key, value|
127
+ MyMarkdownParser.parse(value)
128
+ end
129
+ ```
130
+
131
+ Please note that it will be still running only if key matches `key_pattern` option.
132
+
133
+ Markdown transformer always uses the same name - `'markdown'` - so to register some transformer after/before it use
134
+
135
+ ```ruby
136
+ I18n.transformers.register :markdown
137
+
138
+ I18n.transformers.register 'my_custom_transformer', after: 'markdown' do |key, value|
139
+ Smth.transform(key, value)
140
+ end
141
+ ```
142
+
143
+ It is designed to be registered only once that's why `name` is always `markdown`.
144
+
145
+ ### Custom transformers
146
+
147
+ To register custom transformer use:
148
+
149
+ ```ruby
150
+ I18n.transformers.register MyCustomTransformer
151
+ ```
152
+
153
+ `MyCustomTransformer` has to be inherited from `I18n::Transformers::Collection::Base` class.
154
+ Also, to not break transformers chain(see [Transformers chain section](#transformers-chain)),
155
+ it is responsible for returning correct value if it needs to be applied only for some set of keys
156
+
157
+ All options except `before`, `after` and `at` will be passed as the first argument to `.new` call.
158
+
159
+ Transformer instance can be passed too:
160
+
161
+ ```ruby
162
+ I18n.transformers.register MyCustomTransformer.new(:val1, :val2)
163
+ ```
164
+
165
+ ### Transformers chain
166
+
167
+ It is very important to return some value from either block or `#transform` method from the custom transformer class
168
+ otherwise transformers chain will be broken.
169
+
170
+ Here is the bad example of custom transformer:
171
+
172
+ ```ruby
173
+ I18n.transformers.register do |key, value|
174
+ if key.to_s.start_with? 'key_prefix'
175
+ value.gsub('^symbol^', 'REPLACED_SYMBOL')
176
+ end
177
+ end
178
+ ```
179
+
180
+ The code above most likely will be broken for all keys that don't start with `key_prefix`.
181
+ To fix that we should always fallback to the original value
182
+
183
+ ```ruby
184
+ I18n.transformers.register do |key, value|
185
+ if key.to_s.start_with? 'key_prefix'
186
+ value.gsub('^symbol^', 'REPLACED_SYMBOL')
187
+ else
188
+ value
189
+ end
190
+ end
191
+ ```
192
+
193
+ ### Reseting transformers
194
+
195
+ This library is designed to register all transformers globally.
196
+ In a rails app it can be done in initializer.
197
+ But if there is a need to reset all transformers `.reset` method can be used.
198
+
199
+ ```ruby
200
+ I18n.transformers.reset
201
+ ```
202
+
203
+ ## Example
204
+
205
+ To illustrate how this gem works let's assume the following setup
206
+
207
+ ```yaml
208
+ en:
209
+ key: my key1 value ^symbol^
210
+ key_md: '**Text with ^symbol^**'
211
+ key_markdown: '*^symbol^*'
212
+ ```
213
+
214
+ ```ruby
215
+ I18n.transformers.register :markdown # let's assume redcarpet gem is available
216
+
217
+ I18n.transformers.register do |key, value|
218
+ value.gsub('^symbol^', 'REPLACED_SYMBOL')
219
+ end
220
+ ```
221
+
222
+ Then
223
+ ```ruby
224
+ I18n.translate :key # => my key1 value REPLACED_SYMBOL
225
+
226
+ I18n.translate :key_md # => <p><strong>Text with REPLACED_SYMBOL</strong></p>
227
+
228
+ I18n.translate :key_markdown # => *REPLACED_SYMBOL*
229
+ ```
230
+
231
+ ## Development
232
+
233
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
234
+
235
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
236
+
237
+ ## TODO
238
+
239
+ * Think more about missing translations and find a nice way to handle them
240
+
241
+ ## Contributing
242
+
243
+ Bug reports and pull requests are welcome on GitHub at https://github.com/timsly/i18n-transformers.
244
+
245
+ ## License
246
+
247
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/setup'
4
+ require 'i18n/transformers'
5
+
6
+ require 'pry'
7
+
8
+ Pry.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'i18n/transformers/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'i18n-transformers'
8
+ spec.version = I18n::Transformers::VERSION
9
+ spec.authors = ['Tim Masliuchenko']
10
+ spec.email = ['insside@gmail.com']
11
+
12
+ spec.summary = 'Transformers for I18n ruby library'
13
+ spec.description = 'Transformers for I18n ruby library'
14
+ spec.homepage = 'https://github.com/timsly/i18n-transformers'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = 'exe'
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ['lib']
23
+
24
+ spec.add_dependency 'i18n'
25
+ spec.add_dependency 'activesupport'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.15'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.0'
30
+ spec.add_development_dependency 'redcarpet'
31
+ spec.add_development_dependency 'kramdown'
32
+ end
@@ -0,0 +1 @@
1
+ require 'i18n/transformers'
@@ -0,0 +1,32 @@
1
+ require 'i18n'
2
+ require 'active_support/inflector'
3
+
4
+ require 'i18n/transformers/version'
5
+
6
+ require 'i18n/transformers/collection'
7
+ require 'i18n/transformers/collection/base'
8
+ require 'i18n/transformers/collection/generic'
9
+ require 'i18n/transformers/collection/markdown'
10
+
11
+ module I18n
12
+ module Transformers
13
+ def transformers
14
+ @transformers ||= Collection.new
15
+ end
16
+
17
+ def translate(*args)
18
+ result = super
19
+
20
+ # TODO: Handle missing translations.
21
+ # In theory we don't need to pass them to transformers, but there is no nice way to do that,
22
+ # only with force raising and handling it again
23
+
24
+ key = args.first
25
+ transformers.all.inject(result) do |transformed, transformer|
26
+ transformer.transform(key, transformed)
27
+ end
28
+ end
29
+ end
30
+
31
+ extend Transformers
32
+ end
@@ -0,0 +1,70 @@
1
+ module I18n
2
+ module Transformers
3
+ class Collection
4
+ def initialize
5
+ @collection = []
6
+ end
7
+
8
+ def all
9
+ @collection
10
+ end
11
+
12
+ def find(name_or_obj, index: false)
13
+ name = name_or_obj.respond_to?(:name) ? name_or_obj.name : name_or_obj.to_s
14
+ method = index ? :index : :find
15
+
16
+ all.send(method) { |item| item.name == name }
17
+ end
18
+
19
+ def register(name = nil, options = {}, &block)
20
+ name, options = nil, name if name.is_a?(Hash)
21
+ position = options.extract! :before, :after, :at
22
+
23
+ transformer = if name.respond_to?(:transform)
24
+ name
25
+ else
26
+ klass = name.is_a?(Symbol) ? collection_class_for(name) : name
27
+ klass = I18n::Transformers::Collection::Generic if !klass || name.is_a?(String)
28
+ klass.new(options.merge(name: name), &block)
29
+ end
30
+
31
+ insert(transformer, position)
32
+ end
33
+
34
+ def insert(transformer, at: nil, before: nil, after: nil)
35
+ unless transformer.respond_to?(:transform)
36
+ raise ArgumentError, 'passed object need to response to transform method'
37
+ end
38
+
39
+ if [at, before, after].count(&:nil?) < 2
40
+ raise ArgumentError, 'before, after and at cannot be used at the same time'
41
+ end
42
+
43
+ index = at || find(before || after, index: true)
44
+
45
+ if index
46
+ raise ArgumentError, 'invalid index' if index < 0 || index > all.size
47
+ @collection.insert(after ? index + 1 : index, transformer)
48
+ else
49
+ @collection << transformer
50
+ end
51
+
52
+ transformer
53
+ end
54
+
55
+ def reset
56
+ @collection = []
57
+ self
58
+ end
59
+
60
+ private
61
+
62
+ def collection_class_for(shortcut)
63
+ klass = shortcut.to_s.classify
64
+ "I18n::Transformers::Collection::#{klass}".constantize
65
+ rescue NameError
66
+ nil
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,20 @@
1
+ module I18n
2
+ module Transformers
3
+ class Collection
4
+ class Base
5
+ def initialize(**options, &block)
6
+ @options = options
7
+ @block = block
8
+ end
9
+
10
+ def name
11
+ @name ||= self.class.to_s.demodulize.underscore
12
+ end
13
+
14
+ def transform(key, value)
15
+ raise NonImplementedError
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,17 @@
1
+ module I18n
2
+ module Transformers
3
+ class Collection
4
+ class Generic < Base
5
+ def initialize(name: nil, **options, &block)
6
+ super options, &block
7
+ @name = name ? name.to_s : to_s
8
+ raise ArgumentError, 'block is missing' unless @block
9
+ end
10
+
11
+ def transform(key, value)
12
+ @block.call(key, value)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,70 @@
1
+ module I18n
2
+ module Transformers
3
+ class Collection
4
+ class Markdown < Base
5
+ def initialize(key_pattern: /(\b|_|\.)md$/, adapter: nil, **options, &block)
6
+ super options, &block
7
+ self.key_pattern = key_pattern
8
+ self.adapter = adapter
9
+ end
10
+
11
+ def key_pattern=(pattern)
12
+ @key_pattern = pattern.is_a?(Regexp) ? pattern : Regexp.quote(pattern.to_s)
13
+ end
14
+
15
+ def adapter=(adptr)
16
+ return unless adptr
17
+
18
+ require adptr
19
+ @adapter = adptr
20
+ end
21
+
22
+ def transform(key, value)
23
+ return value unless @key_pattern =~ key.to_s
24
+
25
+ res = @block ? @block.call(key, value) : markdown_to_html(value)
26
+ res.respond_to?(:html_safe) ? res.html_safe : res
27
+ end
28
+
29
+ def adapter
30
+ @adapter ||= begin
31
+ current_adapter = nil
32
+ available_adapters.each do |a|
33
+ begin
34
+ self.adapter = a
35
+ current_adapter = a
36
+ break
37
+ rescue LoadError
38
+ next
39
+ end
40
+ end
41
+ current_adapter
42
+ end
43
+ end
44
+
45
+ def available_adapters
46
+ @available_adapters ||= private_methods
47
+ .grep(/^transform_with_(.+)$/) { |m| $~[1].to_s }
48
+ end
49
+
50
+ private
51
+
52
+ def markdown_to_html(value)
53
+ method = "transform_with_#{adapter}"
54
+ raise "Unknown adapter: #{adapter}" unless respond_to?(method, true)
55
+
56
+ send method, value
57
+ end
58
+
59
+ def transform_with_redcarpet(value)
60
+ @redcarpet ||= Redcarpet::Markdown.new(Redcarpet::Render::HTML, @options)
61
+ @redcarpet.render(value)
62
+ end
63
+
64
+ def transform_with_kramdown(value)
65
+ Kramdown::Document.new(value).to_html
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,5 @@
1
+ module I18n
2
+ module Transformers
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
metadata ADDED
@@ -0,0 +1,159 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: i18n-transformers
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Tim Masliuchenko
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-10-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: i18n
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
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'
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.15'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.15'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: redcarpet
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: kramdown
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Transformers for I18n ruby library
112
+ email:
113
+ - insside@gmail.com
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".travis.yml"
121
+ - Gemfile
122
+ - LICENSE.txt
123
+ - README.md
124
+ - Rakefile
125
+ - bin/console
126
+ - bin/setup
127
+ - i18n-transformers.gemspec
128
+ - lib/i18n-transformers.rb
129
+ - lib/i18n/transformers.rb
130
+ - lib/i18n/transformers/collection.rb
131
+ - lib/i18n/transformers/collection/base.rb
132
+ - lib/i18n/transformers/collection/generic.rb
133
+ - lib/i18n/transformers/collection/markdown.rb
134
+ - lib/i18n/transformers/version.rb
135
+ homepage: https://github.com/timsly/i18n-transformers
136
+ licenses:
137
+ - MIT
138
+ metadata: {}
139
+ post_install_message:
140
+ rdoc_options: []
141
+ require_paths:
142
+ - lib
143
+ required_ruby_version: !ruby/object:Gem::Requirement
144
+ requirements:
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: '0'
148
+ required_rubygems_version: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ requirements: []
154
+ rubyforge_project:
155
+ rubygems_version: 2.5.2
156
+ signing_key:
157
+ specification_version: 4
158
+ summary: Transformers for I18n ruby library
159
+ test_files: []