t_t 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.
- checksums.yaml +7 -0
- data/.gitignore +15 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +91 -0
- data/Rakefile +10 -0
- data/lib/t_t.rb +88 -0
- data/t_t.gemspec +26 -0
- data/tests/lib/action_pack_test.rb +19 -0
- data/tests/lib/t_t_test.rb +146 -0
- data/tests/test_helper.rb +42 -0
- metadata +152 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cc0178a11cfb6485afd79658204c099a1669b9e2
|
4
|
+
data.tar.gz: 5b2fe90809f3c1ecc26dfa80c31b7ae54d104c50
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2bf34f3f4efb00014850798c385233ce27c9956a9867080d9c4cdc0141052d3ec3d6bbbbe66922e4be2f933a52fc758566e8e912adb6c9306b6e740ed221c5eb
|
7
|
+
data.tar.gz: 157cedeec1cbcab34a82d77a5d70844aea77193bde81d2d5f9272f304f68c580a49c879a4fde8169eada2a8307eb58f90fce50a9d01e6d4f9aa2b66b657fda7f
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Sergey Pchelintsev
|
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,91 @@
|
|
1
|
+
## About
|
2
|
+
|
3
|
+
The main goal of Dos-T is reducing time on supporting a multi-language web application by providing a few conventions and a short method names. We believe that it's a primary reason which slows down development. Cause it's boring to write a long path like `t('namespace.controller_name.action_name.section.key')`. Let's better spend time on something more interesting.
|
4
|
+
|
5
|
+
So what's makes Dos-T such a good tool(on our opinion):
|
6
|
+
|
7
|
+
### Example of page
|
8
|
+
|
9
|
+
```haml
|
10
|
+
/ users#index
|
11
|
+
= link_to tt.c(:new_resource, model: tt.resource), new_user_path, "data-tooltip" => tt(:new_user_tip)
|
12
|
+
|
13
|
+
%table
|
14
|
+
%tr
|
15
|
+
%th= tt.attr :name
|
16
|
+
%th= tt.attr :email
|
17
|
+
%th= tt.attr :phone
|
18
|
+
%th= tt.attr :role
|
19
|
+
%th= tt.c :actions
|
20
|
+
- @users.each do |user|
|
21
|
+
%tr
|
22
|
+
%td= user.name
|
23
|
+
%td= user.email
|
24
|
+
%td= user.phone
|
25
|
+
%td= tt.enum :role, user.role
|
26
|
+
%td
|
27
|
+
= link_to tt.f(:edit), edit_user_path(user)
|
28
|
+
= link_to tt.f(:delete), user_path(user), method: :delete, confirm: tt.c(:confirm)
|
29
|
+
|
30
|
+
/ tt.c looks in 'users.common', 'common'
|
31
|
+
/ tt.f looks in 'users.form', 'form'
|
32
|
+
/ tt looks in 'users.index', 'users.common'
|
33
|
+
/ tt.attr - calls human_attribute_name on User
|
34
|
+
/ tt.enum - calls human_attribute_name on User with role_%value%
|
35
|
+
/ tt.resource - User.model_name.human(count: 1)
|
36
|
+
```
|
37
|
+
|
38
|
+
### Global commons
|
39
|
+
|
40
|
+
`tt.c` - in every application there are some elements which are present in every page. For example, if a page has "delete some resource" button/link, it's good to have a confirmation message which tells a user "Are you sure?". At this point you add a key for this page, for example, in "admin.users.index.confirm" path and on page call `t('.confirm')`. Rails is smart enough to prepend a full path to ".confirm" key. But then you need to add confirmation on `admin/users#show` and you, probably, will not duplicate it for "show" page and move it into a common section. After that the translation helper can't help us and we need to provide a full path – `t('common.confirm')`. We reduce a duplication of translation keys, but have to write a long methods. Well, as always, programming is a compromise. But not this time, with Dos-T you can have both – just call `tt.c(:confirm)`. At first it will look into a section's common node(description of a section see below). If Dos-T doesn't find a translation there it will look into the global *common* >>> *common.confirm*. You, probably, are interested what's a section. By a section Dos-T means I18n path of the current controller(mailer). Let's review the previous example. If our current controller is `Admin::UsersController`, the section is *admin.users*. That's why if we want for deleting users a special confirmation we just add "admin.users.common.confirmation" key and it's done.
|
41
|
+
|
42
|
+
`tt.f` - the global `common` section could fast become a huge and you will add some namespaces into it. We prefer a facts over a supposes, but there is a 100% assumption that you will have this subsection - `common.form` with `save`, `edit`, `delete` and etc. Cause we don't know any application which doesn't have that. That's why Dos-T has another method `tt.f` which like `tt.c` - first looks into the current section(*controller_path.form*) and fallbacks into the global("form").
|
43
|
+
|
44
|
+
And finally, Dos-T allows you to define a new "common-used" sections. For example, for breadcrumbs. Just place "tt.rb" file in config/initializations that:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
ActiveSupport.on_load(:tt) do
|
48
|
+
shortcut(:crumbs, :breadcrumbs) # => tt.crumbs(:index) which looks into `breadcrumbs` sections
|
49
|
+
shortcut(:tip, :tooltips) # => tt.tip(:readonly) which looks into `tooltips` sections
|
50
|
+
end
|
51
|
+
```
|
52
|
+
|
53
|
+
### Section's commons
|
54
|
+
|
55
|
+
`tt` - let's back to our example with user management pages. Our clients decided to add a gravatar support. To make this feature more clear to admins we should put a tooltip with a description on index and show page, next to label "Gravatar". It brings a problem where to put a translation. If we put it into 'admin.users.index' we can use `t('.gravatar')` on index page, but have to use `t('admin.users.index.gravatar')` on show page and vice versa. And there Dos-T helps us. Just put `tt(:gravatar)` and put the tip into 'admin.users.common'. First it will act like a `t('.gravatar')` and fallbacks into section's common. And yes, `tt(:key)` is one symbol shorter than t('.key') – you can't avoid `t` in a favour to `tt`.
|
56
|
+
|
57
|
+
### Resource translations
|
58
|
+
|
59
|
+
`tt.attr` - we think every developer enjoys how `form_for` easily translates column's label - `f.label :column_name` - and Rails will magically translate it. But then we have to use an ugly way(`User.human_attribute_name(:column_name)`) to reuse these translations on index and show pages. It's become boring to type again and again this `human_attribute_name`. Dos-T provides a shortcut `tt.attr :column_name, User`. But it could be a shorter, cause if you call it in `UsersController` in 9/10 you closely work with User model. That's why, a second argument in `#attr` method is an optional and default value is a context class. A context class is computed on a controller name. If it's `users_controller`, Dos-T expects for a User model presence. If it's `Admin::UsersController` a context class is still User model.
|
60
|
+
|
61
|
+
### Other useful methods
|
62
|
+
|
63
|
+
* `tt.record([context_class])` – returns the singular human name of a model class(alias - resource)
|
64
|
+
* `tt.records([context_class])` – returns the plural human name of a model class(alias – resources)
|
65
|
+
* `tt.no_records([context_class])` – returns the zero form human name of a model class(alias – no_resources)
|
66
|
+
* `tt.enum(attr_name, variant, [context_class])` – returns a human variant name of an attribute. It looks for human attribute name of "%attr_name%_%variant%"
|
67
|
+
|
68
|
+
## Installation
|
69
|
+
|
70
|
+
Add this line to your application's Gemfile:
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
gem 't_t'
|
74
|
+
```
|
75
|
+
|
76
|
+
And then execute:
|
77
|
+
|
78
|
+
$ bundle
|
79
|
+
|
80
|
+
Or install it yourself as:
|
81
|
+
|
82
|
+
$ gem install t_t
|
83
|
+
|
84
|
+
|
85
|
+
## Contributing
|
86
|
+
|
87
|
+
1. Fork it ( https://github.com/jalkoby/t_t/fork )
|
88
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
89
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
90
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
91
|
+
5. Create a new Pull Request
|
data/Rakefile
ADDED
data/lib/t_t.rb
ADDED
@@ -0,0 +1,88 @@
|
|
1
|
+
require "active_support/lazy_load_hooks"
|
2
|
+
require "i18n"
|
3
|
+
|
4
|
+
module TT
|
5
|
+
class Translator
|
6
|
+
def self.shortcut(meth_name, section)
|
7
|
+
class_eval <<-RUBY
|
8
|
+
def #{ meth_name }(key, options = {})
|
9
|
+
I18n.t "\#{ ns }.#{ section }.\#{ key }",
|
10
|
+
{ default: :"#{ section }.\#{ key }" }.merge(options)
|
11
|
+
end
|
12
|
+
RUBY
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(ns, section)
|
16
|
+
@ns = ns
|
17
|
+
@section = section
|
18
|
+
end
|
19
|
+
|
20
|
+
def t(key, options = {})
|
21
|
+
I18n.t "#{ ns }.#{ section }.#{ key }",
|
22
|
+
{ default: :"#{ ns }.common.#{ key }" }.merge(options)
|
23
|
+
end
|
24
|
+
|
25
|
+
shortcut :c, :common
|
26
|
+
shortcut :f, :form
|
27
|
+
|
28
|
+
def attr(name, klass = context_klass)
|
29
|
+
klass.human_attribute_name(name)
|
30
|
+
end
|
31
|
+
|
32
|
+
def enum(name, kind, klass = context_klass)
|
33
|
+
klass.human_attribute_name("#{ name }_#{ kind }")
|
34
|
+
end
|
35
|
+
|
36
|
+
def resource(klass = context_klass)
|
37
|
+
klass.model_name.human(count: 1)
|
38
|
+
end
|
39
|
+
alias_method :record, :resource
|
40
|
+
|
41
|
+
def resources(klass = context_klass)
|
42
|
+
klass.model_name.human(count: 10)
|
43
|
+
end
|
44
|
+
alias_method :records, :resources
|
45
|
+
|
46
|
+
def no_resources(klass = context_klass)
|
47
|
+
klass.model_name.human(count: 0)
|
48
|
+
end
|
49
|
+
alias_method :no_records, :no_resources
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
attr_reader :ns, :section
|
54
|
+
|
55
|
+
def context_klass
|
56
|
+
return @context_klass if @context_klass
|
57
|
+
|
58
|
+
@context_klass = ns.split('.').map(&:classify).join('::').singularize.constantize
|
59
|
+
end
|
60
|
+
|
61
|
+
ActiveSupport.run_load_hooks(:tt, self)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
if defined?(ActionPack) || defined?(ActionMailer)
|
66
|
+
module TT::Helper
|
67
|
+
extend ::ActiveSupport::Concern
|
68
|
+
|
69
|
+
included do
|
70
|
+
helper_method :tt
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def tt(*args)
|
76
|
+
@tt ||= ::TT::Translator.new(controller_path.gsub('/', '.'), action_name)
|
77
|
+
args.empty? ? @tt : @tt.t(*args)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
ActiveSupport.on_load(:action_controller) do
|
82
|
+
include ::TT::Helper
|
83
|
+
end
|
84
|
+
|
85
|
+
ActiveSupport.on_load(:action_mailer) do
|
86
|
+
include ::TT::Helper
|
87
|
+
end
|
88
|
+
end
|
data/t_t.gemspec
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
Gem::Specification.new do |spec|
|
4
|
+
spec.name = "t_t"
|
5
|
+
spec.version = "0.0.1"
|
6
|
+
spec.authors = ["Sergey Pchelintsev"]
|
7
|
+
spec.email = ["mail@sergeyp.me"]
|
8
|
+
spec.summary = %q{An opinioned I18n helper}
|
9
|
+
spec.description = %q{An opinioned I18n helper}
|
10
|
+
spec.homepage = ""
|
11
|
+
spec.license = "MIT"
|
12
|
+
|
13
|
+
spec.files = `git ls-files -z`.split("\x0")
|
14
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
15
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
16
|
+
spec.require_paths = ["lib"]
|
17
|
+
|
18
|
+
spec.add_dependency "i18n", ">= 0.6.0"
|
19
|
+
spec.add_dependency "activesupport", ">= 3.0.0"
|
20
|
+
|
21
|
+
spec.add_development_dependency "actionpack", ">= 3.0.0"
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.7"
|
23
|
+
spec.add_development_dependency "minitest", ">= 4.7"
|
24
|
+
spec.add_development_dependency "rack-test"
|
25
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
26
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TTController < ActionController::Base
|
4
|
+
public :tt
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "ActionPack integration" do
|
8
|
+
before do
|
9
|
+
@controller = TTController.new
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns tt instance if the method was called without args' do
|
13
|
+
assert_equal @controller.tt.class, TT::Translator
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'calls #t if args were passed' do
|
17
|
+
assert_equal @controller.tt.c(:tar), 'global_tar'
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
describe TT::Translator do
|
4
|
+
before do
|
5
|
+
@tt = TT::Translator.new("tt", "spec")
|
6
|
+
end
|
7
|
+
|
8
|
+
describe '#t' do
|
9
|
+
it "looks for a section translation first" do
|
10
|
+
assert_equal @tt.t(:foo), "spec_foo"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "falls back to common namespace translations" do
|
14
|
+
assert_equal @tt.t(:bar), "namespace_bar"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "allows a custom options" do
|
18
|
+
assert_equal @tt.t(:tar, default: "default_tar"), "default_tar"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#c' do
|
23
|
+
it "looks for a namespace translation first" do
|
24
|
+
assert_equal @tt.c(:foo), "namespace_foo"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "falls back to a global translation" do
|
28
|
+
assert_equal @tt.c(:tar), "global_tar"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "allows a custom options" do
|
32
|
+
assert_equal @tt.c(:car, default: "default_car"), 'default_car'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#f' do
|
37
|
+
it "looks for a namespace translation first" do
|
38
|
+
assert_equal @tt.f(:edit), "namespace_edit"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "falls back to a global translation" do
|
42
|
+
assert_equal @tt.f(:save), "global_save"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "allows a custom options" do
|
46
|
+
assert_equal @tt.f(:commit, default: "default_commit"), "default_commit"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'a model related methods' do
|
51
|
+
before do
|
52
|
+
@klass = Minitest::Mock.new
|
53
|
+
end
|
54
|
+
|
55
|
+
describe '#attr' do
|
56
|
+
it 'uses the provided class' do
|
57
|
+
@klass.expect(:human_attribute_name, 'Nombre', [:name])
|
58
|
+
assert_equal @tt.attr(:name, @klass), 'Nombre'
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'uses a context class by default' do
|
62
|
+
@klass.expect(:human_attribute_name, 'Nombre', [:name])
|
63
|
+
@tt.stub(:context_klass, @klass) do
|
64
|
+
assert_equal @tt.attr(:name), 'Nombre'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe '#enum' do
|
70
|
+
it 'uses the provided class' do
|
71
|
+
@klass.expect(:human_attribute_name, 'Melody', ['type_melody'])
|
72
|
+
assert_equal @tt.enum(:type, :melody, @klass), 'Melody'
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'uses a context class by default' do
|
76
|
+
@klass.expect(:human_attribute_name, 'Sound', ['type_sound'])
|
77
|
+
@tt.stub(:context_klass, @klass) do
|
78
|
+
assert_equal @tt.enum(:type, :sound), 'Sound'
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'a model name' do
|
84
|
+
before do
|
85
|
+
@model_name = Minitest::Mock.new
|
86
|
+
@klass.expect(:model_name, @model_name)
|
87
|
+
end
|
88
|
+
|
89
|
+
describe '#resource' do
|
90
|
+
before do
|
91
|
+
@model_name.expect(:human, 'Coche', [{ count: 1 }])
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'uses the provided class' do
|
95
|
+
assert_equal @tt.resource(@klass), 'Coche'
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'uses a context class by default' do
|
99
|
+
@tt.stub(:context_klass, @klass) do
|
100
|
+
assert_equal @tt.resource, 'Coche'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
describe '#resources' do
|
106
|
+
before do
|
107
|
+
@model_name.expect(:human, 'Coches', [{ count: 10 }])
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'uses the provided class' do
|
111
|
+
assert_equal @tt.resources(@klass), 'Coches'
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'uses a context class by default' do
|
115
|
+
@tt.stub(:context_klass, @klass) do
|
116
|
+
assert_equal @tt.resources, 'Coches'
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#no_resources' do
|
122
|
+
before do
|
123
|
+
@model_name.expect(:human, 'Coches', [{ count: 0 }])
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'uses the provided class' do
|
127
|
+
assert_equal @tt.no_resources(@klass), 'Coches'
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'uses a context class by default' do
|
131
|
+
@tt.stub(:context_klass, @klass) do
|
132
|
+
assert_equal @tt.no_resources, 'Coches'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
after do
|
138
|
+
assert @model_name.verify
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
after do
|
143
|
+
assert @klass.verify
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "minitest/mock"
|
3
|
+
require "rack/test"
|
4
|
+
require "action_controller"
|
5
|
+
require "t_t"
|
6
|
+
|
7
|
+
I18n.backend = I18n::Backend::Simple.new
|
8
|
+
I18n.backend.store_translations(:en, {
|
9
|
+
common: {
|
10
|
+
tar: 'global_tar'
|
11
|
+
},
|
12
|
+
crumbs: {
|
13
|
+
index: 'global_index',
|
14
|
+
new: 'global_new'
|
15
|
+
},
|
16
|
+
form: {
|
17
|
+
edit: "global_edit",
|
18
|
+
save: "global_save"
|
19
|
+
},
|
20
|
+
tooltip: {
|
21
|
+
info: "global_info",
|
22
|
+
notice: "global_notice"
|
23
|
+
},
|
24
|
+
tt: {
|
25
|
+
common: {
|
26
|
+
foo: "namespace_foo",
|
27
|
+
bar: "namespace_bar"
|
28
|
+
},
|
29
|
+
crumbs: {
|
30
|
+
new: 'namespace_new'
|
31
|
+
},
|
32
|
+
form: {
|
33
|
+
edit: "namespace_edit"
|
34
|
+
},
|
35
|
+
spec: {
|
36
|
+
foo: "spec_foo"
|
37
|
+
},
|
38
|
+
tooltip: {
|
39
|
+
info: "namespace_info"
|
40
|
+
}
|
41
|
+
}
|
42
|
+
})
|
metadata
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: t_t
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sergey Pchelintsev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-31 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.6.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.6.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: 3.0.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 3.0.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: actionpack
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.0.0
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.0.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.7'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.7'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '4.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '4.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rack-test
|
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: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '10.0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '10.0'
|
111
|
+
description: An opinioned I18n helper
|
112
|
+
email:
|
113
|
+
- mail@sergeyp.me
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- lib/t_t.rb
|
124
|
+
- t_t.gemspec
|
125
|
+
- tests/lib/action_pack_test.rb
|
126
|
+
- tests/lib/t_t_test.rb
|
127
|
+
- tests/test_helper.rb
|
128
|
+
homepage: ''
|
129
|
+
licenses:
|
130
|
+
- MIT
|
131
|
+
metadata: {}
|
132
|
+
post_install_message:
|
133
|
+
rdoc_options: []
|
134
|
+
require_paths:
|
135
|
+
- lib
|
136
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
requirements: []
|
147
|
+
rubyforge_project:
|
148
|
+
rubygems_version: 2.2.2
|
149
|
+
signing_key:
|
150
|
+
specification_version: 4
|
151
|
+
summary: An opinioned I18n helper
|
152
|
+
test_files: []
|