rom-rails 0.3.0.beta1 → 0.3.0.rc1
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 +4 -4
- data/CHANGELOG.md +1 -1
- data/lib/generators/rom/form/templates/edit_form.rb.erb +1 -1
- data/lib/generators/rom/form/templates/new_form.rb.erb +1 -1
- data/lib/generators/rom/mapper/templates/mapper.rb.erb +2 -2
- data/lib/rom/model.rb +1 -1
- data/lib/rom/rails/controller_extension.rb +0 -35
- data/lib/rom/rails/model/attributes.rb +133 -0
- data/lib/rom/rails/model/form.rb +96 -5
- data/lib/rom/rails/model/form/class_interface.rb +401 -0
- data/lib/rom/rails/model/validator.rb +62 -15
- data/lib/rom/rails/model/validator/uniqueness_validator.rb +37 -1
- data/lib/rom/rails/version.rb +1 -1
- data/rom-rails.gemspec +2 -2
- data/spec/dummy/app/controllers/users_controller.rb +7 -8
- data/spec/dummy/app/forms/new_user_form.rb +2 -2
- data/spec/dummy/app/forms/update_user_form.rb +2 -2
- data/spec/dummy/spec/integration/{user_params_spec.rb → user_attributes_spec.rb} +11 -11
- data/spec/dummy/spec/integration/user_model_mapping_spec.rb +1 -1
- data/spec/lib/generators/form_generator_spec.rb +2 -2
- data/spec/lib/generators/mapper_generator_spec.rb +2 -2
- data/spec/unit/form_spec.rb +20 -16
- data/spec/unit/validator_spec.rb +9 -9
- metadata +11 -16
- data/lib/rom/rails/model/form/dsl.rb +0 -173
- data/lib/rom/rails/model/params.rb +0 -72
- data/spec/dummy/spec/controllers/users_controller_spec.rb +0 -29
- data/spec/unit/params_spec.rb +0 -23
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rom-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.0.
|
4
|
+
version: 0.3.0.rc1
|
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-
|
11
|
+
date: 2015-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rom
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.6.0.
|
19
|
+
version: 0.6.0.rc1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.6.0.
|
26
|
+
version: 0.6.0.rc1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: addressable
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,7 +61,7 @@ dependencies:
|
|
61
61
|
version: '1.0'
|
62
62
|
- - ">="
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version: 1.0.
|
64
|
+
version: 1.0.5
|
65
65
|
type: :runtime
|
66
66
|
prerelease: false
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -71,7 +71,7 @@ dependencies:
|
|
71
71
|
version: '1.0'
|
72
72
|
- - ">="
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version: 1.0.
|
74
|
+
version: 1.0.5
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: railties
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -168,9 +168,9 @@ files:
|
|
168
168
|
- lib/rom/rails/configuration.rb
|
169
169
|
- lib/rom/rails/controller_extension.rb
|
170
170
|
- lib/rom/rails/inflections.rb
|
171
|
+
- lib/rom/rails/model/attributes.rb
|
171
172
|
- lib/rom/rails/model/form.rb
|
172
|
-
- lib/rom/rails/model/form/
|
173
|
-
- lib/rom/rails/model/params.rb
|
173
|
+
- lib/rom/rails/model/form/class_interface.rb
|
174
174
|
- lib/rom/rails/model/validator.rb
|
175
175
|
- lib/rom/rails/model/validator/uniqueness_validator.rb
|
176
176
|
- lib/rom/rails/railtie.rb
|
@@ -229,12 +229,11 @@ files:
|
|
229
229
|
- spec/dummy/public/500.html
|
230
230
|
- spec/dummy/public/favicon.ico
|
231
231
|
- spec/dummy/public/robots.txt
|
232
|
-
- spec/dummy/spec/controllers/users_controller_spec.rb
|
233
232
|
- spec/dummy/spec/features/users_spec.rb
|
234
233
|
- spec/dummy/spec/integration/logger_spec.rb
|
234
|
+
- spec/dummy/spec/integration/user_attributes_spec.rb
|
235
235
|
- spec/dummy/spec/integration/user_commands_spec.rb
|
236
236
|
- spec/dummy/spec/integration/user_model_mapping_spec.rb
|
237
|
-
- spec/dummy/spec/integration/user_params_spec.rb
|
238
237
|
- spec/dummy/vendor/assets/javascripts/.keep
|
239
238
|
- spec/dummy/vendor/assets/stylesheets/.keep
|
240
239
|
- spec/lib/active_record/configuration_spec.rb
|
@@ -244,7 +243,6 @@ files:
|
|
244
243
|
- spec/lib/generators/relation_generator_spec.rb
|
245
244
|
- spec/spec_helper.rb
|
246
245
|
- spec/unit/form_spec.rb
|
247
|
-
- spec/unit/params_spec.rb
|
248
246
|
- spec/unit/validator_spec.rb
|
249
247
|
homepage: http://rom-rb.org
|
250
248
|
licenses:
|
@@ -266,7 +264,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
266
264
|
version: 1.3.1
|
267
265
|
requirements: []
|
268
266
|
rubyforge_project:
|
269
|
-
rubygems_version: 2.
|
267
|
+
rubygems_version: 2.4.5
|
270
268
|
signing_key:
|
271
269
|
specification_version: 4
|
272
270
|
summary: Integrate Ruby Object Mapper with Rails
|
@@ -324,12 +322,11 @@ test_files:
|
|
324
322
|
- spec/dummy/public/500.html
|
325
323
|
- spec/dummy/public/favicon.ico
|
326
324
|
- spec/dummy/public/robots.txt
|
327
|
-
- spec/dummy/spec/controllers/users_controller_spec.rb
|
328
325
|
- spec/dummy/spec/features/users_spec.rb
|
329
326
|
- spec/dummy/spec/integration/logger_spec.rb
|
327
|
+
- spec/dummy/spec/integration/user_attributes_spec.rb
|
330
328
|
- spec/dummy/spec/integration/user_commands_spec.rb
|
331
329
|
- spec/dummy/spec/integration/user_model_mapping_spec.rb
|
332
|
-
- spec/dummy/spec/integration/user_params_spec.rb
|
333
330
|
- spec/dummy/vendor/assets/javascripts/.keep
|
334
331
|
- spec/dummy/vendor/assets/stylesheets/.keep
|
335
332
|
- spec/lib/active_record/configuration_spec.rb
|
@@ -339,6 +336,4 @@ test_files:
|
|
339
336
|
- spec/lib/generators/relation_generator_spec.rb
|
340
337
|
- spec/spec_helper.rb
|
341
338
|
- spec/unit/form_spec.rb
|
342
|
-
- spec/unit/params_spec.rb
|
343
339
|
- spec/unit/validator_spec.rb
|
344
|
-
has_rdoc:
|
@@ -1,173 +0,0 @@
|
|
1
|
-
module ROM
|
2
|
-
module Model
|
3
|
-
class Form
|
4
|
-
module DSL
|
5
|
-
attr_reader :params, :validator, :self_commands, :injectible_commands,
|
6
|
-
:model, :input_block, :validations_block
|
7
|
-
|
8
|
-
def inherited(klass)
|
9
|
-
klass.inject_commands_for(*injectible_commands) if injectible_commands
|
10
|
-
klass.commands(*self_commands) if self_commands
|
11
|
-
klass.input(readers: false, &input_block) if input_block
|
12
|
-
klass.validations(&validations_block) if validations_block
|
13
|
-
super
|
14
|
-
end
|
15
|
-
|
16
|
-
def commands(names)
|
17
|
-
names.each { |relation, _action| attr_reader(relation) }
|
18
|
-
@self_commands = names
|
19
|
-
self
|
20
|
-
end
|
21
|
-
|
22
|
-
def key(*keys)
|
23
|
-
if keys.any? && !@key
|
24
|
-
@key = keys
|
25
|
-
attr_reader(*keys)
|
26
|
-
elsif !@key
|
27
|
-
@key = [:id]
|
28
|
-
attr_reader :id
|
29
|
-
elsif keys.any?
|
30
|
-
@key = keys
|
31
|
-
end
|
32
|
-
@key
|
33
|
-
end
|
34
|
-
|
35
|
-
def input(options = {}, &block)
|
36
|
-
readers = options.fetch(:readers) { true }
|
37
|
-
define_params!(block)
|
38
|
-
define_attribute_readers! if readers
|
39
|
-
define_model!
|
40
|
-
self
|
41
|
-
end
|
42
|
-
|
43
|
-
def validations(&block)
|
44
|
-
define_validator!(block)
|
45
|
-
self
|
46
|
-
end
|
47
|
-
|
48
|
-
def inject_commands_for(*names)
|
49
|
-
@injectible_commands = names
|
50
|
-
names.each { |name| attr_reader(name) }
|
51
|
-
self
|
52
|
-
end
|
53
|
-
|
54
|
-
def build(input = {}, options = {})
|
55
|
-
new(clear_input(input), options.merge(command_registry))
|
56
|
-
end
|
57
|
-
|
58
|
-
def command_registry
|
59
|
-
@command_registry ||= setup_command_registry
|
60
|
-
end
|
61
|
-
|
62
|
-
def clear_input(input)
|
63
|
-
input.each_with_object({}) { |(key, value), object|
|
64
|
-
next if value.is_a?(String) && value.blank?
|
65
|
-
|
66
|
-
object[key] =
|
67
|
-
if value.is_a?(Hash)
|
68
|
-
clear_input(value)
|
69
|
-
elsif value.is_a?(Array)
|
70
|
-
value.map { |v| v.is_a?(Hash) ? clear_input(v) : v }
|
71
|
-
else
|
72
|
-
value
|
73
|
-
end
|
74
|
-
}.symbolize_keys
|
75
|
-
end
|
76
|
-
|
77
|
-
def define_params!(block)
|
78
|
-
@input_block = block
|
79
|
-
@params = ClassBuilder.new(name: "#{name}::Params", parent: Object).call { |klass|
|
80
|
-
klass.send(:include, ROM::Model::Params)
|
81
|
-
}
|
82
|
-
@params.class_eval(&block)
|
83
|
-
const_set(:Params, @params)
|
84
|
-
end
|
85
|
-
|
86
|
-
def define_attribute_readers!
|
87
|
-
@params.attribute_set.each do |attribute|
|
88
|
-
if public_instance_methods.include?(attribute.name)
|
89
|
-
raise(
|
90
|
-
ArgumentError,
|
91
|
-
"#{attribute.name} attribute is in conflict with #{self}##{attribute.name}"
|
92
|
-
)
|
93
|
-
end
|
94
|
-
|
95
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
96
|
-
def #{attribute.name}
|
97
|
-
params[:#{attribute.name}]
|
98
|
-
end
|
99
|
-
RUBY
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def define_model!
|
104
|
-
@model = ClassBuilder.new(name: "#{name}::Model", parent: @params).call { |klass|
|
105
|
-
klass.class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
106
|
-
def persisted?
|
107
|
-
to_key.any?
|
108
|
-
end
|
109
|
-
|
110
|
-
def to_key
|
111
|
-
to_h.values_at(#{key.map(&:inspect).join(', ')}).compact
|
112
|
-
end
|
113
|
-
RUBY
|
114
|
-
}
|
115
|
-
key.each { |name| @model.attribute(name) }
|
116
|
-
const_set(:Model, @model)
|
117
|
-
end
|
118
|
-
|
119
|
-
def define_validator!(block)
|
120
|
-
@validations_block = block
|
121
|
-
@validator = ClassBuilder.new(name: "#{name}::Validator", parent: Object).call { |klass|
|
122
|
-
klass.send(:include, ROM::Model::Validator)
|
123
|
-
}
|
124
|
-
@validator.class_eval(&block)
|
125
|
-
const_set(:Validator, @validator)
|
126
|
-
end
|
127
|
-
|
128
|
-
private
|
129
|
-
|
130
|
-
def rom
|
131
|
-
ROM.env
|
132
|
-
end
|
133
|
-
|
134
|
-
def adapter
|
135
|
-
ROM.adapters.keys.first
|
136
|
-
end
|
137
|
-
|
138
|
-
def setup_command_registry
|
139
|
-
commands = {}
|
140
|
-
|
141
|
-
if self_commands
|
142
|
-
self_commands.each do |rel_name, name|
|
143
|
-
command = build_command(name, rel_name)
|
144
|
-
commands[rel_name] = CommandRegistry.new(name => command)
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
if injectible_commands
|
149
|
-
injectible_commands.each do |relation|
|
150
|
-
commands[relation] = rom.command(relation)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
commands
|
155
|
-
end
|
156
|
-
|
157
|
-
def build_command(name, rel_name)
|
158
|
-
klass = Command.build_class(name, rel_name, adapter: adapter)
|
159
|
-
|
160
|
-
klass.result :one
|
161
|
-
klass.input @params
|
162
|
-
klass.validator @validator
|
163
|
-
|
164
|
-
relation = rom.relations[rel_name]
|
165
|
-
repository = rom.repositories[relation.repository]
|
166
|
-
repository.extend_command_class(klass, relation.dataset)
|
167
|
-
|
168
|
-
klass.build(relation)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
@@ -1,72 +0,0 @@
|
|
1
|
-
require 'virtus'
|
2
|
-
require 'active_model/conversion'
|
3
|
-
|
4
|
-
module ROM
|
5
|
-
module Model
|
6
|
-
# Mixin for validatable and coercible parameters
|
7
|
-
#
|
8
|
-
# @example
|
9
|
-
#
|
10
|
-
# class UserParams
|
11
|
-
# include ROM::Model::Params
|
12
|
-
#
|
13
|
-
# attribute :email, String
|
14
|
-
# attribute :age, Integer
|
15
|
-
#
|
16
|
-
# validates :email, :age, presence: true
|
17
|
-
# end
|
18
|
-
#
|
19
|
-
# user_params = UserParams.new(email: '', age: '18')
|
20
|
-
#
|
21
|
-
# user_params.email # => ''
|
22
|
-
# user_params.age # => 18
|
23
|
-
#
|
24
|
-
# user_params.valid? # => false
|
25
|
-
# user_params.errors # => #<ActiveModel::Errors:0x007fd2423fadb0 ...>
|
26
|
-
#
|
27
|
-
# @api public
|
28
|
-
module Params
|
29
|
-
VirtusModel = Virtus.model(strict: true, required: false)
|
30
|
-
|
31
|
-
def self.included(base)
|
32
|
-
base.class_eval do
|
33
|
-
include VirtusModel
|
34
|
-
include ActiveModel::Conversion
|
35
|
-
end
|
36
|
-
base.extend(ClassMethods)
|
37
|
-
end
|
38
|
-
|
39
|
-
def model_name
|
40
|
-
self.class.model_name
|
41
|
-
end
|
42
|
-
|
43
|
-
module ClassMethods
|
44
|
-
DEFAULT_TIMESTAMPS = [:created_at, :updated_at].freeze
|
45
|
-
|
46
|
-
def [](input)
|
47
|
-
input.is_a?(self) ? input : new(input)
|
48
|
-
end
|
49
|
-
|
50
|
-
def set_model_name(name)
|
51
|
-
class_eval <<-RUBY
|
52
|
-
def self.model_name
|
53
|
-
@model_name ||= ActiveModel::Name.new(self, nil, #{name.inspect})
|
54
|
-
end
|
55
|
-
RUBY
|
56
|
-
end
|
57
|
-
|
58
|
-
def timestamps(*attrs)
|
59
|
-
if attrs.empty?
|
60
|
-
DEFAULT_TIMESTAMPS.each do |t|
|
61
|
-
attribute t, DateTime, default: proc { DateTime.now }
|
62
|
-
end
|
63
|
-
else
|
64
|
-
attrs.each do |attr|
|
65
|
-
attribute attr, DateTime, default: proc { DateTime.now }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe UsersController, type: :controller do
|
4
|
-
describe 'injected relations' do
|
5
|
-
it 'exposes relation without required params' do
|
6
|
-
get :index
|
7
|
-
|
8
|
-
expect(controller.users).to eql(rom.read(:users).index.to_a)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'exposes relation with required params' do
|
12
|
-
get :search, name: 'Jane'
|
13
|
-
|
14
|
-
expect(controller.users).to eql(rom.read(:users).by_name('Jane').to_a)
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'halts processing when required params are missing' do
|
18
|
-
get :search
|
19
|
-
|
20
|
-
expect(response.status).to be(400)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'skips injecting relation when :only option is used' do
|
24
|
-
get :ping
|
25
|
-
|
26
|
-
expect(controller.users).to be(nil)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/spec/unit/params_spec.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ROM::Model::Params do
|
4
|
-
let(:klass) {
|
5
|
-
Class.new do
|
6
|
-
include ROM::Model::Params
|
7
|
-
|
8
|
-
attribute :name, String
|
9
|
-
end
|
10
|
-
}
|
11
|
-
|
12
|
-
it 'fails loudly when given an incorrect type' do
|
13
|
-
expect {
|
14
|
-
klass.new(name: [])
|
15
|
-
}.to raise_error(Virtus::CoercionError, /name/)
|
16
|
-
end
|
17
|
-
|
18
|
-
it 'does not fail on nil or missing attributes' do
|
19
|
-
expect {
|
20
|
-
klass.new
|
21
|
-
}.not_to raise_error
|
22
|
-
end
|
23
|
-
end
|