tram-policy 0.4.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -0
- data/README.md +10 -103
- data/lib/tram/policy/error.rb +0 -24
- data/lib/tram/policy/errors.rb +0 -26
- data/lib/tram/policy/generator/policy_spec.erb +7 -9
- data/lib/tram/policy/rspec.rb +43 -92
- data/spec/tram/policy/rspec_spec.rb +15 -28
- data/tram-policy.gemspec +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54f65bae74cb48be0cc7d481cb3abd8528f43749
|
4
|
+
data.tar.gz: 4a100e49ec40986bc4f8781304169e6ecd2d5baf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 107d99cdd79742b7ae85b5b1f8783f5eb6114c864cbfb7732251c2a4542261effec81ec171d61dbc0da6787ca576efc581dae43f76f75ef4a16d2d7934edea9f
|
7
|
+
data.tar.gz: 3dc2b45735369a9097b525b1681ea8dee24ed84675bc8cfde67b1f87394647f345abedd45db4c12d3725d3cd56df8193e70b8c92e5ec62e9e1c14970097c6ee8
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file.
|
|
4
4
|
The format is based on [Keep a Changelog](http://keepachangelog.com/)
|
5
5
|
and this project adheres to [Semantic Versioning](http://semver.org/).
|
6
6
|
|
7
|
+
## [1.0.0] - [2018-02-17]
|
8
|
+
|
9
|
+
### Changed
|
10
|
+
- RSpec matchers does't use blocks any more (nepalez)
|
11
|
+
|
12
|
+
Instead of
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
expect { policy }.to be_invalid_at level: "error"
|
16
|
+
```
|
17
|
+
|
18
|
+
use the simpler syntax
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
expect(policy).to be_invalid_at level: "error"
|
22
|
+
```
|
23
|
+
|
24
|
+
### Deleted
|
25
|
+
- Deprecated methods (nepalez)
|
26
|
+
- RSpec shared examples (nepalez)
|
27
|
+
|
7
28
|
## [0.4.0] - [2018-02-17]
|
8
29
|
|
9
30
|
This is beta-release before the first stable version 1.0.0.
|
data/README.md
CHANGED
@@ -285,123 +285,30 @@ require "tram/policy/rspec"
|
|
285
285
|
```ruby
|
286
286
|
# spec/policies/user/readiness_policy_spec.rb
|
287
287
|
RSpec.describe User::ReadinessPolicy do
|
288
|
-
let(:user) { build :user } # <- expected a factory
|
289
|
-
|
290
288
|
subject(:policy) { described_class[email: "user@example.com"] }
|
291
289
|
|
292
|
-
|
293
|
-
expect { policy }.to be_invalid_at level: "error"
|
294
|
-
end
|
290
|
+
let(:user) { build :user } # <- expected a factory
|
295
291
|
|
296
|
-
it
|
297
|
-
|
298
|
-
|
292
|
+
it { is_expected.to be_invalid }
|
293
|
+
it { is_expected.to be_invalid_at level: "error" }
|
294
|
+
it { is_expected.to be_valid_at level: "info" }
|
299
295
|
end
|
300
296
|
```
|
301
297
|
|
302
|
-
|
298
|
+
The matcher checks not only the presence of an error, but also ensures that you provided translation of any message to any available locale (`I18n.available_locales`).
|
303
299
|
|
304
300
|
## Generators
|
305
301
|
|
306
|
-
The gem provides simple tool for scaffolding new policy along with RSpec test template.
|
302
|
+
The gem provides simple tool for scaffolding new policy along with its RSpec test template and translations.
|
307
303
|
|
308
304
|
```shell
|
309
305
|
$ tram-policy user/readiness_policy -p user -o admin -v name_present:blank_name email_present:blank_email
|
310
306
|
```
|
311
307
|
|
312
|
-
This will generate a policy class with specification compatible to both [RSpec][rspec] and [
|
313
|
-
|
314
|
-
|
315
|
-
```ruby
|
316
|
-
# app/policies/user/readiness_policy.rb
|
317
|
-
|
318
|
-
# TODO: describe the policy, its subject and context
|
319
|
-
class User::ReadinessPolicy < Tram::Policy
|
320
|
-
# TODO: add default values (default: -> { ... }),
|
321
|
-
# coercers (type: proc(&:to_s)),
|
322
|
-
# and optional arguments (optional: true)
|
323
|
-
# when necessary
|
324
|
-
param :user
|
325
|
-
option :admin
|
326
|
-
|
327
|
-
validate :name_present
|
328
|
-
validate :email_present
|
329
|
-
|
330
|
-
private
|
331
|
-
|
332
|
-
def name_present
|
333
|
-
# TODO: define a condition
|
334
|
-
return if true
|
335
|
-
# TODO: add necessary tags
|
336
|
-
errors.add :blank_name
|
337
|
-
end
|
338
|
-
|
339
|
-
def email_present
|
340
|
-
# TODO: define a condition
|
341
|
-
return if true
|
342
|
-
# TODO: add necessary tags
|
343
|
-
errors.add :blank_email
|
344
|
-
end
|
345
|
-
end
|
346
|
-
```
|
347
|
-
|
348
|
-
```yaml
|
349
|
-
# config/tram-policies.en.yml
|
350
|
-
---
|
351
|
-
en:
|
352
|
-
tram-policy:
|
353
|
-
user/readiness_policy:
|
354
|
-
blank_name: translation missing
|
355
|
-
blank_email: translation missing
|
356
|
-
```
|
357
|
-
|
358
|
-
```ruby
|
359
|
-
# spec/policies/user/readiness_policy_spec.rb
|
360
|
-
require "spec_helper"
|
361
|
-
# TODO: move it to spec_helper
|
362
|
-
require "tram/policy/rspec"
|
363
|
-
|
364
|
-
RSpec.describe User::ReadinessPolicy, ".[]" do
|
365
|
-
# TODO: either remove this line, or set another source for locales to check
|
366
|
-
let(:available_locales) { I18n.available_locales }
|
367
|
-
let(:user) { FactoryGirl.build :user }
|
368
|
-
|
369
|
-
it "is valid with proper arguments" do
|
370
|
-
expect { described_class[user] }.to be_valid
|
371
|
-
end
|
372
|
-
|
373
|
-
# TODO: check the description
|
374
|
-
it "is invalid when not name_present" do
|
375
|
-
# TODO: modify some arguments
|
376
|
-
user = nil
|
377
|
-
# TODO: add necessary tags to focus the condition
|
378
|
-
expect { described_class[user] }.to be_invalid_at
|
379
|
-
end
|
380
|
-
|
381
|
-
# TODO: check the description
|
382
|
-
it "is invalid when not email_present" do
|
383
|
-
# TODO: modify some arguments
|
384
|
-
user = nil
|
385
|
-
# TODO: add necessary tags to focus the condition
|
386
|
-
expect { described_class[user] }.to be_invalid_at
|
387
|
-
end
|
388
|
-
end
|
389
|
-
```
|
390
|
-
|
391
|
-
Then you should go through all TODO-s and add necessary details.
|
392
|
-
|
393
|
-
Later you can copy-paste examples to provide more edge case for testing your policies.
|
394
|
-
|
395
|
-
Notice that RSpec matcher `be_invalid_at` checks at once:
|
396
|
-
|
397
|
-
- that an error is added to the policy
|
398
|
-
- that the error has given tags
|
399
|
-
- that the error is translated to every available locale
|
400
|
-
|
401
|
-
Its negation (`not_to be_invalid_at`) checks that no errors added with given tags.
|
402
|
-
When called without tags, it checks that the policy is valid as a whole.
|
308
|
+
This will generate a policy class with specification compatible to both [RSpec][rspec] and [FactoryBot][factory_bot].
|
403
309
|
|
404
|
-
|
310
|
+
Under the keys `-p` and `-o` define params and options of the policy.
|
311
|
+
Key `-v` should contain validation methods along with their error message keys.
|
405
312
|
|
406
313
|
## Installation
|
407
314
|
|
@@ -443,4 +350,4 @@ The gem is available as open source under the terms of the [MIT License](http://
|
|
443
350
|
[dry-initializer]: http://dry-rb.org/gems/dry-initializer/
|
444
351
|
[i18n]: https://github.com/svenfuchs/i18n
|
445
352
|
[rspec]: http://rspec.info/
|
446
|
-
[
|
353
|
+
[factory_bot]: https://github.com/thoughtbot/factory_bot
|
data/lib/tram/policy/error.rb
CHANGED
@@ -44,30 +44,6 @@ class Tram::Policy
|
|
44
44
|
key.is_a?(Symbol) ? I18n.t(*item) : key.to_s
|
45
45
|
end
|
46
46
|
|
47
|
-
# @deprecated
|
48
|
-
# Converts the error to a hash of message and tags
|
49
|
-
#
|
50
|
-
# @return [Hash<Symbol, Object>]
|
51
|
-
#
|
52
|
-
def to_h
|
53
|
-
warn "[DEPRECATED] The method Tram::Policy::Error#to_h" \
|
54
|
-
" will be removed in the v1.0.0.."
|
55
|
-
|
56
|
-
tags.reject { |k| k == :scope }.merge(message: message)
|
57
|
-
end
|
58
|
-
|
59
|
-
# @deprecated
|
60
|
-
# The full message (message and tags info)
|
61
|
-
#
|
62
|
-
# @return [String]
|
63
|
-
#
|
64
|
-
def full_message
|
65
|
-
warn "[DEPRECATED] The method Tram::Policy::Error#full_message" \
|
66
|
-
" will be removed in the v1.0.0."
|
67
|
-
|
68
|
-
[message, tags].reject(&:empty?).join(" ")
|
69
|
-
end
|
70
|
-
|
71
47
|
# Fetches an option
|
72
48
|
#
|
73
49
|
# @param [#to_sym] tag
|
data/lib/tram/policy/errors.rb
CHANGED
@@ -50,20 +50,6 @@ class Tram::Policy
|
|
50
50
|
self.class.new(policy, list)
|
51
51
|
end
|
52
52
|
|
53
|
-
# @deprecated
|
54
|
-
# @!method by_tags(tags)
|
55
|
-
# Selects errors filtered by key and tags
|
56
|
-
#
|
57
|
-
# @param [Hash<Symbol, Object>] tags List of options to filter by
|
58
|
-
# @return [Array<Tram::Policy::Error>]
|
59
|
-
#
|
60
|
-
def by_tags(**tags)
|
61
|
-
warn "[DEPRECATED] The method Tram::Policy::Errors#by_tags" \
|
62
|
-
" will be removed in the v1.0.0. Use method #filter instead."
|
63
|
-
|
64
|
-
filter(tags).to_a
|
65
|
-
end
|
66
|
-
|
67
53
|
# @!method empty?
|
68
54
|
# Checks whether a collection is empty
|
69
55
|
#
|
@@ -89,18 +75,6 @@ class Tram::Policy
|
|
89
75
|
@set.map(&:message).sort
|
90
76
|
end
|
91
77
|
|
92
|
-
# @deprecated
|
93
|
-
# List of error descriptions
|
94
|
-
#
|
95
|
-
# @return [Array<String>]
|
96
|
-
#
|
97
|
-
def full_messages
|
98
|
-
warn "[DEPRECATED] The method Tram::Policy::Errors#full_messages" \
|
99
|
-
" will be removed in the v1.0.0."
|
100
|
-
|
101
|
-
map(&:full_message)
|
102
|
-
end
|
103
|
-
|
104
78
|
# @!method merge(other, options)
|
105
79
|
# Merges other collection to the current one and returns new collection
|
106
80
|
# with the current scope
|
@@ -3,24 +3,22 @@ require "spec_helper"
|
|
3
3
|
require "tram/policy/rspec"
|
4
4
|
|
5
5
|
RSpec.describe <%= klass %>, ".[]" do
|
6
|
-
|
7
|
-
|
6
|
+
subject(:policy) { described_class[<%= policy_signature %>] }
|
7
|
+
|
8
8
|
<% (parsed_params + parsed_options).each do |name| -%>
|
9
9
|
let(:<%= name %>) { FactoryGirl.build :<%= name %> }
|
10
10
|
<% end -%>
|
11
11
|
|
12
|
-
it
|
13
|
-
expect { described_class[<%= policy_signature %>] }.not_to be_invalid_at
|
14
|
-
end
|
12
|
+
it { is_expected.not_to be_invalid }
|
15
13
|
<% parsed_validators.each do |v| %>
|
16
|
-
# TODO: fix
|
17
|
-
|
14
|
+
# TODO: fix context description
|
15
|
+
context "when <%= "not " if v[:key] == v[:name] %><%= v[:key] %>" do
|
18
16
|
# TODO: modify some arguments
|
19
17
|
<% (parsed_params + parsed_options).each do |name| -%>
|
20
|
-
|
18
|
+
let(:<%= name %>) { nil }
|
21
19
|
<% end -%>
|
22
20
|
# TODO: add necessary tags to focus the condition
|
23
|
-
|
21
|
+
it { is_expected.to be_invalid_at }
|
24
22
|
end
|
25
23
|
<% end -%>
|
26
24
|
end
|
data/lib/tram/policy/rspec.rb
CHANGED
@@ -1,125 +1,76 @@
|
|
1
1
|
require "rspec"
|
2
2
|
|
3
|
-
# Checks that a block provides policy that has errors under given tags
|
4
|
-
# It also check that selected messages has translations to all available locales
|
5
|
-
#
|
6
|
-
# @example
|
7
|
-
# subject(:policy) { UserPolicy[name: nil] }
|
8
|
-
# expect { policy }.to be_invalid_at field: "name", level: "error"
|
9
|
-
#
|
10
|
-
# You have to wrap expectation to a block called for available locales.
|
11
|
-
#
|
12
3
|
RSpec::Matchers.define :be_invalid_at do |**tags|
|
13
|
-
|
14
|
-
|
15
|
-
# ****************************************************************************
|
16
|
-
# Result collectors for all available locations
|
17
|
-
# ****************************************************************************
|
18
|
-
|
19
|
-
attr_accessor :policy
|
20
|
-
|
21
|
-
def errors
|
22
|
-
@errors ||= {}
|
4
|
+
def locales
|
5
|
+
@locales ||= I18n.available_locales
|
23
6
|
end
|
24
7
|
|
25
|
-
def tags
|
26
|
-
@
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
# Helpers to provide results for all locales
|
31
|
-
# ****************************************************************************
|
32
|
-
|
33
|
-
def prepare_localized_results(policy_block, tags, locale)
|
34
|
-
I18n.locale = locale
|
35
|
-
local_policy = policy_block.call
|
36
|
-
self.policy = local_policy.inspect
|
37
|
-
errors[locale] = local_policy&.errors&.filter(tags)&.map do |error|
|
38
|
-
{ message: error.message, tags: error.options } # translate immediately
|
8
|
+
def check(policy, tags)
|
9
|
+
@errors ||= policy.errors.filter(tags).map do |error|
|
10
|
+
{ item: error.item }.tap do |obj|
|
11
|
+
locales.each { |l| obj[l] = I18n.with_locale(l) { error.message } }
|
12
|
+
end
|
39
13
|
end
|
40
14
|
end
|
41
15
|
|
42
|
-
|
43
|
-
original = I18n.locale
|
44
|
-
I18n.available_locales.each do |locale|
|
45
|
-
prepare_localized_results(policy_block, tags, locale)
|
46
|
-
end
|
47
|
-
ensure
|
48
|
-
I18n.locale = original
|
49
|
-
end
|
50
|
-
|
51
|
-
# ****************************************************************************
|
52
|
-
# Checkers for collected results
|
53
|
-
# ****************************************************************************
|
54
|
-
|
55
|
-
# Checks if selected errors are present in all available locales
|
56
|
-
def errored?
|
57
|
-
errors.values.map(&:any?).reduce(true, &:&) == true
|
58
|
-
end
|
59
|
-
|
60
|
-
# Checks if selected errors are absent in all available locales
|
61
|
-
def not_errored?
|
62
|
-
errors.values.map(&:empty?).reduce(true, &:&) == true
|
63
|
-
end
|
16
|
+
attr_reader :errors
|
64
17
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
18
|
+
def missed_translations
|
19
|
+
@missed_translations ||= \
|
20
|
+
errors.flat_map { |rec| rec.values_at(*locales) }
|
21
|
+
.select { |message| message.start_with? "translation missing" }
|
69
22
|
end
|
70
23
|
|
71
24
|
def report_errors
|
72
|
-
|
73
|
-
|
74
|
-
text << " #{
|
75
|
-
local_errors&.each { |err| text << " - #{err.values.join(" ")}\n" }
|
25
|
+
locales.each_with_object("Actual errors:\n") do |loc, text|
|
26
|
+
text << " #{loc}:\n"
|
27
|
+
errors.each { |err| text << " - #{err[loc]} #{err[:item]}\n" }
|
76
28
|
end
|
77
|
-
text
|
78
29
|
end
|
79
30
|
|
80
|
-
|
81
|
-
|
82
|
-
|
31
|
+
match do |policy|
|
32
|
+
check(policy, tags)
|
33
|
+
errors.any? && missed_translations.empty?
|
34
|
+
end
|
83
35
|
|
84
|
-
|
85
|
-
|
86
|
-
|
36
|
+
match_when_negated do |policy|
|
37
|
+
check(policy, tags)
|
38
|
+
errors.empty?
|
87
39
|
end
|
88
40
|
|
89
|
-
failure_message do |
|
41
|
+
failure_message do |policy|
|
42
|
+
desc = tags.any? ? " with tags: #{tags}" : ""
|
90
43
|
text = "The policy: #{policy}\n"
|
91
|
-
text << "should have had errors
|
92
|
-
text << "whose messages are translated in all available locales.\n"
|
44
|
+
text << " should have had errors#{desc},"
|
45
|
+
text << " whose messages are translated in all available locales.\n"
|
93
46
|
text << report_errors
|
94
47
|
text
|
95
48
|
end
|
96
49
|
|
97
|
-
|
98
|
-
|
99
|
-
#
|
100
|
-
|
101
|
-
match_when_negated do |policy_block|
|
102
|
-
prepare_results(policy_block, tags)
|
103
|
-
not_errored?
|
104
|
-
end
|
105
|
-
|
106
|
-
failure_message_when_negated do |_|
|
107
|
-
text = "#{policy}\nshould not have had any error with tags: #{tags}.\n"
|
50
|
+
failure_message_when_negated do |policy|
|
51
|
+
desc = tags.any? ? " with tags: #{tags}" : ""
|
52
|
+
text = "#{policy}\nshould not have had any error#{desc}.\n"
|
108
53
|
text << report_errors
|
109
54
|
text
|
110
55
|
end
|
111
56
|
end
|
112
57
|
|
113
|
-
RSpec.
|
114
|
-
|
115
|
-
|
116
|
-
|
58
|
+
RSpec::Matchers.define :be_invalid do
|
59
|
+
match do |policy|
|
60
|
+
expect(policy).to be_invalid_at
|
61
|
+
end
|
62
|
+
|
63
|
+
match_when_negated do |policy|
|
64
|
+
expect(policy).not_to be_invalid_at
|
117
65
|
end
|
118
66
|
end
|
119
67
|
|
120
|
-
RSpec.
|
121
|
-
|
122
|
-
|
123
|
-
|
68
|
+
RSpec::Matchers.define :be_valid_at do |**tags|
|
69
|
+
match do |policy|
|
70
|
+
expect(policy).not_to be_invalid_at(tags)
|
71
|
+
end
|
72
|
+
|
73
|
+
match_when_negated do |policy|
|
74
|
+
expect(policy).to be_invalid_at(tags)
|
124
75
|
end
|
125
76
|
end
|
@@ -1,62 +1,49 @@
|
|
1
1
|
RSpec.describe "RSpec support:" do
|
2
|
+
subject { Test::CustomerPolicy[name: nil] }
|
3
|
+
|
2
4
|
before do
|
3
5
|
I18n.available_locales = %i[en]
|
4
6
|
I18n.backend.store_translations :en, yaml_fixture_file("en.yml")["en"]
|
5
7
|
load_fixture "customer_policy.rb"
|
6
8
|
end
|
7
9
|
|
8
|
-
subject { Test::CustomerPolicy[name: nil] }
|
9
|
-
|
10
10
|
describe "to be_invalid_at" do
|
11
11
|
it "passes when some translated error present w/o tags constraint" do
|
12
|
-
expect
|
13
|
-
expect { subject }.to be_invalid_at
|
14
|
-
end.not_to raise_error
|
12
|
+
expect { expect(subject).to be_invalid_at }.not_to raise_error
|
15
13
|
end
|
16
14
|
|
17
15
|
it "passes when some translated error present under given tags" do
|
18
|
-
expect
|
19
|
-
|
20
|
-
end.not_to raise_error
|
16
|
+
expect { expect(subject).to be_invalid_at field: "name" }
|
17
|
+
.not_to raise_error
|
21
18
|
end
|
22
19
|
|
23
20
|
it "fails when no errors present under given tags" do
|
24
|
-
expect
|
25
|
-
|
26
|
-
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
21
|
+
expect { expect(subject).to be_invalid_at field: "email" }
|
22
|
+
.to raise_error RSpec::Expectations::ExpectationNotMetError
|
27
23
|
end
|
28
24
|
|
29
25
|
it "fails when some translations are absent" do
|
30
26
|
I18n.available_locales = %i[ru en]
|
31
27
|
|
32
|
-
expect
|
33
|
-
|
34
|
-
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
28
|
+
expect { expect(subject).to be_invalid_at field: "name" }
|
29
|
+
.to raise_error RSpec::Expectations::ExpectationNotMetError
|
35
30
|
end
|
36
31
|
end
|
37
32
|
|
38
33
|
describe "not_to be_invalid_at" do
|
39
34
|
it "passes when no errors present under given tags" do
|
40
|
-
expect
|
41
|
-
|
42
|
-
end.not_to raise_error
|
35
|
+
expect { expect(subject).not_to be_invalid_at field: "email" }
|
36
|
+
.not_to raise_error
|
43
37
|
end
|
44
38
|
|
45
39
|
it "fails when some error present under given tags" do
|
46
|
-
expect
|
47
|
-
|
48
|
-
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
40
|
+
expect { expect(subject).not_to be_invalid_at field: "name" }
|
41
|
+
.to raise_error RSpec::Expectations::ExpectationNotMetError
|
49
42
|
end
|
50
43
|
|
51
44
|
it "fails when some error present w/o tags constraint" do
|
52
|
-
expect
|
53
|
-
|
54
|
-
end.to raise_error RSpec::Expectations::ExpectationNotMetError
|
45
|
+
expect { expect(subject).not_to be_invalid_at }
|
46
|
+
.to raise_error RSpec::Expectations::ExpectationNotMetError
|
55
47
|
end
|
56
48
|
end
|
57
|
-
|
58
|
-
describe "shared examples" do
|
59
|
-
it_behaves_like :invalid_policy
|
60
|
-
it_behaves_like :valid_policy, field: "email"
|
61
|
-
end
|
62
49
|
end
|
data/tram-policy.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |gem|
|
2
2
|
gem.name = "tram-policy"
|
3
|
-
gem.version = "0.
|
3
|
+
gem.version = "1.0.0"
|
4
4
|
gem.author = ["Viktor Sokolov (gzigzigzeo)", "Andrew Kozin (nepalez)"]
|
5
5
|
gem.email = "andrew.kozin@gmail.com"
|
6
6
|
gem.homepage = "https://github.com/tram/tram-policy"
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.required_ruby_version = ">= 2.3"
|
16
16
|
|
17
17
|
gem.add_runtime_dependency "dry-initializer", "~> 2.0"
|
18
|
-
gem.add_runtime_dependency "i18n", "~> 0
|
18
|
+
gem.add_runtime_dependency "i18n", "~> 1.0"
|
19
19
|
|
20
20
|
gem.add_development_dependency "rake", "> 10"
|
21
21
|
gem.add_development_dependency "rspec", "~> 3.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tram-policy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Viktor Sokolov (gzigzigzeo)
|
@@ -31,14 +31,14 @@ dependencies:
|
|
31
31
|
requirements:
|
32
32
|
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version: '0
|
34
|
+
version: '1.0'
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
39
|
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version: '0
|
41
|
+
version: '1.0'
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: rake
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|