rom-model 0.1.1 → 0.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6603e93e6f5f8d81a8ea8e11b90eab50a1838341
4
- data.tar.gz: dbf3b3ca0ef55c9414f7bd495e08858c5ba67f9d
3
+ metadata.gz: f8e29081a0af75745a0bc941c1e04de03a39521d
4
+ data.tar.gz: a97ee12e2918f9d59aa9d423c2046774c60c9e4a
5
5
  SHA512:
6
- metadata.gz: 57127a346d805caec84570a3ce603d4a049b22412a74be6ef8fa12b5707a5ea4282ac1b9efa3d73c5142160772eade72cd6f322abf716e75c200e08ab1048da0
7
- data.tar.gz: e4ff1ee087a43c703b1f6c39b35b898df2ef99c3d27f1624b0f2806b0456c8d83c9f6e818eb7a8e4983e1ba7fbddfdcec12843f0cdd5083ef95e2f52dfe9856b
6
+ metadata.gz: c90b1614112a4b2649d5e3366b9f8e9f5908913bc12b3976aceb59417ed6368eb15fa00b1554b66262d207d82ae7fa813176dcda9a3c1c6e7023e55b335cbe90
7
+ data.tar.gz: 79cadeb47cc841d120042c3ec1fe6595439d1b5b4ec856ec279ec88f00c1e5ad672a9006eb1cb1ac3e2f13c493e896620fcdbcf4acbadb2a5e0f8eb46c3aeee8
@@ -10,7 +10,7 @@ rvm:
10
10
  - 2.1
11
11
  - 2.2
12
12
  - rbx-2
13
- - jruby
13
+ - jruby-9000
14
14
  - jruby-head
15
15
  - ruby-head
16
16
  env:
data/Gemfile CHANGED
@@ -4,6 +4,9 @@ gemspec
4
4
 
5
5
  gem 'rom', github: 'rom-rb/rom', branch: 'master'
6
6
  gem 'rom-sql', github: 'rom-rb/rom-sql', branch: 'master'
7
+ gem 'rom-support', github: 'rom-rb/rom-support', branch: 'master'
8
+ gem 'rom-mapper', github: 'rom-rb/rom-mapper', branch: 'master'
9
+ gem 'transproc', github: 'solnic/transproc', branch: 'master'
7
10
  gem 'pg', platforms: [:mri, :rbx]
8
11
  gem 'pg_jruby', platforms: :jruby
9
12
 
data/README.md CHANGED
@@ -25,7 +25,7 @@ The package includes:
25
25
  ## The Plan™
26
26
 
27
27
  This gem is built on top of existing 3rd party gems that have proven to be stable
28
- and good-enough. Unfortunatelly neither Virtus nor ActiveModel do not meet certain
28
+ and good-enough. Unfortunately neither Virtus nor ActiveModel do not meet certain
29
29
  design requirements to be a good fit in the long term.
30
30
 
31
31
  For that reason we're exploring how to build a better foundation for rom-model.
@@ -1,3 +1,4 @@
1
+ require 'dry-equalizer'
1
2
  require 'charlatan'
2
3
 
3
4
  require 'rom/support/constants'
@@ -6,11 +7,21 @@ require 'rom/constants'
6
7
  require 'rom/model/validator/uniqueness_validator'
7
8
  require 'rom/support/class_macros'
8
9
 
10
+ require 'rom/pipeline'
11
+
9
12
  module ROM
10
13
  module Model
11
14
  class ValidationError < CommandError
12
15
  include Charlatan.new(:errors)
13
- include Equalizer.new(:errors)
16
+ include Dry::Equalizer(:errors)
17
+ end
18
+
19
+ class Composite < Pipeline::Composite
20
+ def call(attributes)
21
+ left.call(attributes)
22
+
23
+ right.call(attributes)
24
+ end
14
25
  end
15
26
 
16
27
  # Mixin for ROM-compliant validator objects
@@ -44,7 +55,7 @@ module ROM
44
55
  extend ROM::ClassMacros
45
56
 
46
57
  include ActiveModel::Validations
47
- include Equalizer.new(:attributes, :errors)
58
+ include Dry::Equalizer(:attributes, :errors)
48
59
 
49
60
  base.defines :embedded_validators
50
61
 
@@ -99,6 +110,7 @@ module ROM
99
110
  attributes
100
111
  end
101
112
 
113
+
102
114
  private
103
115
 
104
116
  # This is needed for ActiveModel::Validations to work properly
@@ -157,6 +169,21 @@ module ROM
157
169
  validator.call
158
170
  end
159
171
 
172
+ # Compose a validation with a command
173
+ #
174
+ # The command will be called if validations succeed
175
+ #
176
+ # @example
177
+ # validated_command = (UserValidator >> users.create)
178
+ # validated_command.call(attributes)
179
+ #
180
+ # @return [Composite]
181
+ #
182
+ # @api public
183
+ def >>(other)
184
+ Composite.new(self, other)
185
+ end
186
+
160
187
  # Specify an embedded validator for nested structures
161
188
  #
162
189
  # @example
@@ -1,5 +1,5 @@
1
1
  module ROM
2
2
  module Model
3
- VERSION = '0.1.1'.freeze
3
+ VERSION = '0.2.0.beta1'.freeze
4
4
  end
5
5
  end
@@ -17,7 +17,8 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
- spec.add_runtime_dependency 'rom-support', '~> 0.1'
20
+ spec.add_runtime_dependency 'dry-equalizer', '~> 0.2'
21
+ spec.add_runtime_dependency 'rom-support', '~> 1.0.0.beta1'
21
22
  spec.add_runtime_dependency 'charlatan', '~> 0.1'
22
23
  spec.add_runtime_dependency 'virtus', '~> 1.0', '>= 1.0.5'
23
24
  spec.add_runtime_dependency 'activemodel', '>= 3.0', '< 5.0'
@@ -0,0 +1,53 @@
1
+ describe 'Chaning validations into a commad' do
2
+ include_context 'database'
3
+
4
+ subject(:validator) { user_validator.new(attributes) }
5
+
6
+ let(:user_attrs) do
7
+ Class.new {
8
+ include ROM::Model::Attributes
9
+
10
+ set_model_name 'User'
11
+
12
+ attribute :name, String
13
+ attribute :email, String
14
+ attribute :birthday, Date
15
+ }
16
+ end
17
+
18
+ let(:user_validator) do
19
+ Class.new {
20
+ include ROM::Model::Validator
21
+
22
+ relation :users
23
+
24
+ validates :name, presence: true, uniqueness: { message: 'TAKEN!' }
25
+ validates :email, uniqueness: true
26
+
27
+ def self.name
28
+ 'User'
29
+ end
30
+ }
31
+ end
32
+
33
+ it 'works' do
34
+ expect { rom.command(:users).create.call(name: 'John', email: 'john@doe.org') }
35
+ .to change(rom.relation(:users), :count).by 1
36
+ end
37
+
38
+ it 'runs validations' do
39
+ validated_command = (user_validator >> rom.command(:users).create)
40
+ expect {
41
+ validated_command.call({})
42
+ }.to raise_error(ROM::Model::ValidationError)
43
+ end
44
+
45
+ it 'calls the nested command when validations pass' do
46
+ validated_command = (user_validator >> rom.command(:users).create)
47
+ attributes = user_attrs.new(name: 'John', email: 'john@doe.org')
48
+ expect {
49
+ validated_command.call(attributes)
50
+ }.to change(rom.relation(:users), :count).by 1
51
+
52
+ end
53
+ end
@@ -1,5 +1,6 @@
1
1
  shared_context 'database' do
2
- let(:rom) { ROM.env }
2
+ let(:rom) { ROM.env = ROM.container(configuration) }
3
+ let(:configuration) { ROM::Configuration.new(:sql, DB_URI).use(:macros) }
3
4
  let(:uri) { DB_URI }
4
5
  let(:conn) { Sequel.connect(uri) }
5
6
 
@@ -10,8 +11,6 @@ shared_context 'database' do
10
11
  end
11
12
 
12
13
  before do
13
- setup = ROM.setup(:sql, conn)
14
-
15
14
  drop_tables
16
15
 
17
16
  conn.create_table :users do
@@ -23,7 +22,11 @@ shared_context 'database' do
23
22
  check { char_length(name) > 2 }
24
23
  end
25
24
 
26
- setup.relation(:users)
25
+ configuration.relation(:users)
26
+
27
+ configuration.commands(:users) do
28
+ define(:create)
29
+ end
27
30
  end
28
31
 
29
32
  after do
@@ -28,5 +28,3 @@ I18n.load_path << [root.join('../config/locales/en.yml').realpath]
28
28
  RSpec.configure do |config|
29
29
  config.order = "random"
30
30
  end
31
-
32
- ROM.use :auto_registration
@@ -1,6 +1,8 @@
1
1
  describe 'Validation' do
2
2
  include_context 'database'
3
3
 
4
+ before { rom }
5
+
4
6
  subject(:validator) { user_validator.new(attributes) }
5
7
 
6
8
  let(:user_attrs) do
@@ -30,8 +32,6 @@ describe 'Validation' do
30
32
  }
31
33
  end
32
34
 
33
- before { ROM.finalize }
34
-
35
35
  describe '#call' do
36
36
  let(:attributes) { user_attrs.new }
37
37
 
metadata CHANGED
@@ -1,29 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rom-model
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Solnica
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-19 00:00:00.000000000 Z
11
+ date: 2015-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-equalizer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.2'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: rom-support
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - "~>"
18
32
  - !ruby/object:Gem::Version
19
- version: '0.1'
33
+ version: 1.0.0.beta1
20
34
  type: :runtime
21
35
  prerelease: false
22
36
  version_requirements: !ruby/object:Gem::Requirement
23
37
  requirements:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
- version: '0.1'
40
+ version: 1.0.0.beta1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: charlatan
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -159,6 +173,7 @@ files:
159
173
  - rakelib/mutant.rake
160
174
  - rakelib/rubocop.rake
161
175
  - rom-model.gemspec
176
+ - spec/integration/chainable_validator_spec.rb
162
177
  - spec/shared/database.rb
163
178
  - spec/spec_helper.rb
164
179
  - spec/unit/attributes_spec.rb
@@ -179,9 +194,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
194
  version: '0'
180
195
  required_rubygems_version: !ruby/object:Gem::Requirement
181
196
  requirements:
182
- - - ">="
197
+ - - ">"
183
198
  - !ruby/object:Gem::Version
184
- version: '0'
199
+ version: 1.3.1
185
200
  requirements: []
186
201
  rubyforge_project:
187
202
  rubygems_version: 2.4.5
@@ -189,8 +204,10 @@ signing_key:
189
204
  specification_version: 4
190
205
  summary: A small collection of extensions useful for data coercion and validation
191
206
  test_files:
207
+ - spec/integration/chainable_validator_spec.rb
192
208
  - spec/shared/database.rb
193
209
  - spec/spec_helper.rb
194
210
  - spec/unit/attributes_spec.rb
195
211
  - spec/unit/validator/embedded_spec.rb
196
212
  - spec/unit/validator_spec.rb
213
+ has_rdoc: