dry-mutations 0.99.100 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ef60a2ff49f64d8a640292d1bb70e5ff52bc8cf8
4
- data.tar.gz: 21c45010a109911e25d397994128ad3e5fe81ed1
3
+ metadata.gz: 23228f617c8162feb245848da2e562f4b9425bc7
4
+ data.tar.gz: 40dc518c5051e58a87950020bccdaf0de17b7dd9
5
5
  SHA512:
6
- metadata.gz: faf1055254a03e47b49298b821c7d8a73f04dd616b776bb33dcf46548728e811e8d7145187e82dfa276615f3f77b4c5bb1892ec0f1fe17ad6322917423e10eda
7
- data.tar.gz: be638ebe8f86ddcbf46dc1fd05e10ca9d68fc6b0c702014ed928fdae83e8f69b1c3ac60fd1f31417622b23c80eed549ea0305eeff60140987c0d571cc21f3fcf
6
+ metadata.gz: 72fed50dd92a78813505cb95db253999860513d8253f0c5a568fa7dba370920c7cc8439b6ebba3a58473bf7c03ffb727481f84802e090029c8b0da93621d1e85
7
+ data.tar.gz: b91a085cdc2d0a279d527734c3b55e632cda6722cacc898e0d213c3612182f8800ff7256ffe6b1be0debd2103381301278630755d6d6f219680cc7a17f611750
data/.rubocop.yml CHANGED
@@ -19,15 +19,27 @@ Metrics/PerceivedComplexity:
19
19
  Metrics/AbcSize:
20
20
  Max: 42
21
21
 
22
+ Metrics/ModuleLength:
23
+ Max: 256
24
+
25
+ Metrics/BlockLength:
26
+ Max: 64
27
+
28
+ ################################################################################
29
+
30
+ Lint/EmptyWhen:
31
+ Enabled: false
32
+
22
33
  ################################################################################
23
34
 
24
35
  Style/SignalException:
25
36
  EnforcedStyle: semantic
26
37
 
38
+ Style/PercentLiteralDelimiters:
39
+ Enabled: false
40
+
27
41
  Style/MethodName:
28
- Exclude:
29
- - 'lib/dry/mutations/utils.rb'
30
- - 'lib/dry/transactions/*.rb'
42
+ Enabled: false
31
43
 
32
44
  Style/VariableName:
33
45
  SupportedStyles: snake_case
data/.travis.yml CHANGED
@@ -1,9 +1,7 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.1
4
3
  - 2.1.8
5
4
  - 2.2.2
6
- - 2.3.1
7
5
  - 2.4.0
8
6
  before_install: gem install bundler -v 1.13.7
9
7
  addons:
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- dry-mutations (0.99.100)
4
+ dry-mutations (1.0.0)
5
5
  activesupport (>= 3.2, < 5)
6
6
  dry-transaction (~> 0.9)
7
7
  dry-validation (~> 0.10)
@@ -11,16 +11,25 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
+ activemodel (4.2.8)
15
+ activesupport (= 4.2.8)
16
+ builder (~> 3.1)
17
+ activerecord (4.2.8)
18
+ activemodel (= 4.2.8)
19
+ activesupport (= 4.2.8)
20
+ arel (~> 6.0)
14
21
  activesupport (4.2.8)
15
22
  i18n (~> 0.7)
16
23
  minitest (~> 5.1)
17
24
  thread_safe (~> 0.3, >= 0.3.4)
18
25
  tzinfo (~> 1.1)
26
+ arel (6.0.4)
19
27
  awesome_print (1.7.0)
28
+ builder (3.2.3)
20
29
  codeclimate-test-reporter (1.0.3)
21
30
  simplecov
22
31
  coderay (1.1.1)
23
- concurrent-ruby (1.0.4)
32
+ concurrent-ruby (1.0.5)
24
33
  diff-lcs (1.2.5)
25
34
  docile (1.1.5)
26
35
  dry-configurable (0.6.1)
@@ -59,11 +68,11 @@ GEM
59
68
  dry-logic (~> 0.4, >= 0.4.0)
60
69
  dry-types (~> 0.9, >= 0.9.0)
61
70
  hashie (3.5.5)
62
- i18n (0.8.1)
71
+ i18n (0.8.4)
63
72
  inflecto (0.0.2)
64
- json (1.8.3)
73
+ json (2.0.3)
65
74
  method_source (0.8.2)
66
- minitest (5.10.1)
75
+ minitest (5.10.2)
67
76
  mutations (0.8.1)
68
77
  activesupport
69
78
  pry (0.10.4)
@@ -90,8 +99,9 @@ GEM
90
99
  simplecov-html (~> 0.10.0)
91
100
  simplecov-html (0.10.0)
92
101
  slop (3.6.0)
102
+ sqlite3 (1.3.11)
93
103
  thread_safe (0.3.6)
94
- tzinfo (1.2.2)
104
+ tzinfo (1.2.3)
95
105
  thread_safe (~> 0.1)
96
106
  wisper (1.6.1)
97
107
 
@@ -99,6 +109,7 @@ PLATFORMS
99
109
  ruby
100
110
 
101
111
  DEPENDENCIES
112
+ activerecord (>= 3.2, < 5)
102
113
  awesome_print
103
114
  bundler (~> 1.10)
104
115
  codeclimate-test-reporter
@@ -107,6 +118,7 @@ DEPENDENCIES
107
118
  rake (~> 10.0)
108
119
  rspec (~> 3)
109
120
  simplecov
121
+ sqlite3
110
122
 
111
123
  BUNDLED WITH
112
124
  1.13.7
data/README.md CHANGED
@@ -162,6 +162,15 @@ required do
162
162
  end
163
163
  ```
164
164
 
165
+ ## `ActiveRecord::Relation` support
166
+
167
+
168
+ ```ruby
169
+ schema(Dry::Mutations.Schema do
170
+ required(:slaves).filled(relation?: Slave)
171
+ end)
172
+ ```
173
+
165
174
  ## Combining dry schemas with mutation-like syntax
166
175
 
167
176
  Since version `0.99.9`, one might pass the `Dry::Validation::Schema` directly
data/config/messages.yml CHANGED
@@ -2,6 +2,7 @@ en:
2
2
  errors:
3
3
  duck?: 'must respond to %{expected}'
4
4
  model?: 'must be a model (instance of %{expected})'
5
+ relation?: 'must be a relation (many instances of %{expected})'
5
6
  discard_empty: 'aleksei’s too dumb error (%{expected},) you won :-P'
6
7
  default?: 'default value implementation sucks'
7
8
  class: 'class guard for arrays implementation sucks'
@@ -31,6 +31,8 @@ Gem::Specification.new do |spec|
31
31
  spec.add_development_dependency 'rspec', '~> 3'
32
32
  spec.add_development_dependency 'pry', '~> 0.10'
33
33
  spec.add_development_dependency 'awesome_print'
34
+ spec.add_development_dependency 'sqlite3'
35
+ spec.add_development_dependency 'activerecord', '< 5', '>= 3.2' # prevent mutations to require activerecord 5
34
36
 
35
37
  spec.add_dependency 'activesupport', '< 5', '>= 3.2' # prevent mutations to require activesupport 5
36
38
  spec.add_dependency 'mutations', '~> 0.8'
@@ -27,7 +27,7 @@ module Dry
27
27
 
28
28
  base.singleton_class.prepend(Module.new do
29
29
  def respond_to_missing?(method_name, include_private = false)
30
- [:call, :to_proc].include?(method_name) || super
30
+ %i|call to_proc|.include?(method_name) || super
31
31
  end
32
32
  end)
33
33
  end
@@ -134,26 +134,31 @@ module Dry
134
134
  def predicates(input, digged = [])
135
135
  case input
136
136
  when Dry::Logic::Rule::Predicate then digged << input
137
- when Array then input.each { |e| predicates(e, digged) }
138
- when ->(i) { i.respond_to?(:rules) }
139
- predicates(input.rules, digged)
137
+ when Array, ActiveRecord::Relation then input.each { |e| predicates(e, digged) }
138
+ when ->(i) { i.respond_to?(:rules) } then predicates(input.rules, digged)
140
139
  end
141
140
  digged
142
141
  end
143
142
 
143
+ # rubocop:disable Style/YodaCondition
144
144
  def dig(predicate, input = schema)
145
145
  case input.rules
146
146
  when Hash # the whole schema
147
147
  input.rules.map do |k, v|
148
148
  pred = predicates(v).detect do |p|
149
- p.respond_to?(:predicate) && (p = p.predicate).is_a?(Method) && "#{p.owner}##{p.name}" == predicate
149
+ p.respond_to?(:predicate) &&
150
+ (p = p.predicate).is_a?(Method) &&
151
+ "#{p.owner}##{p.name}" == predicate
150
152
  end
151
153
  pred ? [k, pred] : nil
152
154
  end.compact.to_h
153
155
  else
154
- predicates(input).detect { |p| "#{p.owner}##{p.name}" == predicate }
156
+ predicates(input).detect do |p|
157
+ "#{p.owner}##{p.name}" == predicate
158
+ end
155
159
  end
156
160
  end
161
+ # rubocop:enable Style/YodaCondition
157
162
 
158
163
  def defaults
159
164
  ::Dry::Mutations::Utils.Hash(
@@ -3,6 +3,17 @@ module Dry
3
3
  module Predicates # :nodoc:
4
4
  include ::Dry::Logic::Predicates
5
5
 
6
+ RAILS_4_RELATION = 'ActiveRecord_Associations_CollectionProxy'.freeze
7
+
8
+ predicate(:relation?) do |expected, current|
9
+ if expected.const_defined?(RAILS_4_RELATION)
10
+ current.is_a?(expected.const_get(RAILS_4_RELATION))
11
+ else
12
+ # Gracefull fallback for Rails3
13
+ current.is_a?(ActiveRecord::Relation) && current.name == expected.name
14
+ end
15
+ end
16
+
6
17
  predicate(:duck?) do |expected, current|
7
18
  expected.empty? || expected.all?(&current.method(:respond_to?))
8
19
  end
@@ -14,7 +14,6 @@ module Dry
14
14
  end
15
15
 
16
16
  configure(&CONFIGURATOR)
17
- # predicates(::Dry::Mutations::Predicates)
18
17
 
19
18
  def discarded
20
19
  @@discarded
@@ -78,8 +78,8 @@ module Dry
78
78
  end
79
79
  end
80
80
  )
81
- when -> (t) { DRY_TYPES.include?(t) } then :"#{type}?"
82
- # else nil # implicit # FIXME: IS IT OK?
81
+ when ->(t) { DRY_TYPES.include?(t) } then :"#{type}?"
82
+ # else type implicitly return `nil` here TODO
83
83
  end
84
84
  end
85
85
 
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Mutations
3
- VERSION = '0.99.100'.freeze
3
+ VERSION = '1.0.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-mutations
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.99.100
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aleksei Matiushkin
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-25 00:00:00.000000000 Z
11
+ date: 2017-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,40 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: sqlite3
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: activerecord
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "<"
102
+ - !ruby/object:Gem::Version
103
+ version: '5'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '3.2'
107
+ type: :development
108
+ prerelease: false
109
+ version_requirements: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "<"
112
+ - !ruby/object:Gem::Version
113
+ version: '5'
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '3.2'
83
117
  - !ruby/object:Gem::Dependency
84
118
  name: activesupport
85
119
  requirement: !ruby/object:Gem::Requirement