rom-model 0.1.1 → 0.2.0.beta1

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: 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: