rom-rails 0.3.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/Gemfile +1 -0
- data/README.md +2 -2
- data/lib/generators/rom/form/templates/base_form.rb.erb +17 -0
- data/lib/generators/rom/form/templates/edit_form.rb.erb +1 -5
- data/lib/generators/rom/form/templates/new_form.rb.erb +1 -5
- data/lib/generators/rom/form_generator.rb +23 -14
- data/lib/rom/rails/model/form.rb +1 -1
- data/lib/rom/rails/model/form/class_interface.rb +80 -26
- data/lib/rom/rails/version.rb +1 -1
- data/rom-rails.gemspec +1 -1
- data/spec/dummy/app/controllers/users_controller.rb +2 -2
- data/spec/dummy/app/forms/new_user_form.rb +5 -1
- data/spec/dummy/app/forms/update_user_form.rb +3 -1
- data/spec/dummy/app/mappers/tasks.rb +9 -0
- data/spec/dummy/app/mappers/users.rb +2 -0
- data/spec/dummy/app/models/user.rb +3 -3
- data/spec/dummy/db/migrate/20150403194906_create_tags.rb +7 -0
- data/spec/dummy/db/schema.rb +5 -1
- data/spec/dummy/spec/integration/form_with_injected_commands_spec.rb +37 -0
- data/spec/dummy/spec/integration/new_user_form_spec.rb +19 -0
- data/spec/dummy/spec/integration/user_model_mapping_spec.rb +2 -2
- data/spec/lib/generators/form_generator_spec.rb +84 -30
- data/spec/spec_helper.rb +5 -0
- data/spec/unit/form_spec.rb +46 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ed90e6218a40147b914444246e29f75156e839f
|
4
|
+
data.tar.gz: 19320a558924f23d5509e9e47ef0dffa01ff1ea1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f99f656233f503e2eac2edf435e90048cc1c0ed8923c41a63e8bc4bdae4f2ed6641090ee536f272ccbff80a9a3565b1594ed963e26aceb228d1ff1d80718d6db
|
7
|
+
data.tar.gz: 225c8450db829aa8620493c59091aec3cc1d007e41d000dfa54b283d1ad93ce11260697c1c406e699908a4b89ffcf978ed5daa4ffd9c11478f610c944fd8e903
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## v0.3.1 2015-04-04
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* `Form.mappings` which sets up auto-mapping command results (solnic)
|
6
|
+
* Form descendants can use `input` and `validations` blocks (cflipse)
|
7
|
+
* Form generators can generate a shared base form class for new/update forms (cflipse)
|
8
|
+
|
9
|
+
[Compare v0.3.0...v0.3.1](https://github.com/rom-rb/rom-rails/compare/v0.3.0...v0.3.1)
|
10
|
+
|
1
11
|
## v0.3.0 2015-03-22
|
2
12
|
|
3
13
|
### Added
|
data/Gemfile
CHANGED
@@ -14,6 +14,7 @@ end
|
|
14
14
|
group :test do
|
15
15
|
gem 'rom', github: 'rom-rb/rom', branch: 'master'
|
16
16
|
gem 'rom-sql', github: 'rom-rb/rom-sql', branch: 'master'
|
17
|
+
gem 'byebug', platforms: :mri
|
17
18
|
gem 'rspec-rails', '~> 3.1'
|
18
19
|
gem 'codeclimate-test-reporter', require: nil
|
19
20
|
gem 'database_cleaner'
|
data/README.md
CHANGED
@@ -31,8 +31,8 @@ Please report any issues in the main [rom-rb/rom](https://github.com/rom-rb/rom/
|
|
31
31
|
|
32
32
|
You can read more about ROM and Rails on the official website:
|
33
33
|
|
34
|
-
* [Introduction to ROM](http://rom-rb.org/introduction)
|
35
|
-
* [Rails tutorial](http://rom-rb.org/tutorials/rails)
|
34
|
+
* [Introduction to ROM](http://rom-rb.org/introduction/)
|
35
|
+
* [Rails tutorial](http://rom-rb.org/tutorials/todo-app-with-rails/)
|
36
36
|
|
37
37
|
|
38
38
|
## Community
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class <%= model_name %>Form < ROM::Model::Form
|
2
|
+
|
3
|
+
input do
|
4
|
+
set_model_name '<%= model_name %>'
|
5
|
+
|
6
|
+
# define always-present form input attributes
|
7
|
+
# attribute :name, String
|
8
|
+
end
|
9
|
+
|
10
|
+
validations do
|
11
|
+
relation :<%= relation %>
|
12
|
+
|
13
|
+
# Add invariant form validations
|
14
|
+
# validates :name, presence: true
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -1,9 +1,7 @@
|
|
1
|
-
class Edit<%= model_name %>Form <
|
1
|
+
class Edit<%= model_name %>Form < <%= model_name %>Form
|
2
2
|
commands <%= relation %>: :update
|
3
3
|
|
4
4
|
input do
|
5
|
-
set_model_name '<%= model_name %>'
|
6
|
-
|
7
5
|
# define form input attributes
|
8
6
|
# attribute :name, String
|
9
7
|
|
@@ -11,8 +9,6 @@ class Edit<%= model_name %>Form < ROM::Model::Form
|
|
11
9
|
end
|
12
10
|
|
13
11
|
validations do
|
14
|
-
relation :<%= relation %>
|
15
|
-
|
16
12
|
# Add form validations
|
17
13
|
# validates :name, presence: true
|
18
14
|
end
|
@@ -1,9 +1,7 @@
|
|
1
|
-
class New<%= model_name %>Form <
|
1
|
+
class New<%= model_name %>Form < <%= model_name %>Form
|
2
2
|
commands <%= relation %>: :create
|
3
3
|
|
4
4
|
input do
|
5
|
-
set_model_name '<%= model_name %>'
|
6
|
-
|
7
5
|
# define form input attributes
|
8
6
|
# attribute :name, String
|
9
7
|
|
@@ -11,8 +9,6 @@ class New<%= model_name %>Form < ROM::Model::Form
|
|
11
9
|
end
|
12
10
|
|
13
11
|
validations do
|
14
|
-
relation :<%= relation %>
|
15
|
-
|
16
12
|
# Add form validations
|
17
13
|
# validates :name, presence: true
|
18
14
|
end
|
@@ -5,16 +5,35 @@ module ROM
|
|
5
5
|
class FormGenerator < Base
|
6
6
|
class_option :command,
|
7
7
|
banner: "--command=command",
|
8
|
-
desc: "specify command to use"
|
8
|
+
desc: "specify command to use"
|
9
9
|
|
10
|
-
def
|
11
|
-
|
10
|
+
def create_base_form
|
11
|
+
template "base_form.rb.erb",
|
12
|
+
File.join("app", "forms", "#{file_name.singularize}_form.rb")
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_new
|
16
|
+
create(:new) if create_new_form?
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_edit
|
20
|
+
create(:edit) if create_edit_form?
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
12
24
|
|
25
|
+
def create(type)
|
13
26
|
template "#{type}_form.rb.erb",
|
14
27
|
File.join("app", "forms", "#{type}_#{file_name.singularize}_form.rb")
|
15
28
|
end
|
16
29
|
|
17
|
-
|
30
|
+
def create_new_form?
|
31
|
+
options[:command].blank? || %w(new create).include?(options[:command].to_s.downcase)
|
32
|
+
end
|
33
|
+
|
34
|
+
def create_edit_form?
|
35
|
+
options[:command].blank? || %w(edit update).include?(options[:command].to_s.downcase)
|
36
|
+
end
|
18
37
|
|
19
38
|
def model_name
|
20
39
|
class_name.singularize.camelcase
|
@@ -24,16 +43,6 @@ module ROM
|
|
24
43
|
class_name.pluralize.underscore
|
25
44
|
end
|
26
45
|
|
27
|
-
def edit_or_new
|
28
|
-
case options[:command].downcase
|
29
|
-
when 'edit', 'update'
|
30
|
-
:edit
|
31
|
-
when 'new', 'create'
|
32
|
-
:new
|
33
|
-
else
|
34
|
-
raise "Unknown command"
|
35
|
-
end
|
36
|
-
end
|
37
46
|
end
|
38
47
|
end
|
39
48
|
end
|
data/lib/rom/rails/model/form.rb
CHANGED
@@ -70,28 +70,14 @@ module ROM
|
|
70
70
|
# @api private
|
71
71
|
attr_reader :injectible_commands
|
72
72
|
|
73
|
-
# input block stored to be used in inherited hook
|
74
|
-
#
|
75
|
-
# @return [Proc]
|
76
|
-
#
|
77
|
-
# @api private
|
78
|
-
attr_reader :input_block
|
79
|
-
|
80
|
-
# validation block stored to be used in inherited hook
|
81
|
-
#
|
82
|
-
# @return [Proc]
|
83
|
-
#
|
84
|
-
# @api private
|
85
|
-
attr_reader :validations_block
|
86
|
-
|
87
73
|
# Copy input attributes, validator and model to the descendant
|
88
74
|
#
|
89
75
|
# @api private
|
90
76
|
def inherited(klass)
|
91
77
|
klass.inject_commands_for(*injectible_commands) if injectible_commands
|
92
78
|
klass.commands(*self_commands) if self_commands
|
93
|
-
klass.input(readers: false, &
|
94
|
-
klass.validations(&
|
79
|
+
input_blocks.each{|block| klass.input(readers: false, &block) }
|
80
|
+
validation_blocks.each{|block| klass.validations(&block) }
|
95
81
|
super
|
96
82
|
end
|
97
83
|
|
@@ -234,11 +220,35 @@ module ROM
|
|
234
220
|
#
|
235
221
|
# @api public
|
236
222
|
def build(input = {}, options = {})
|
237
|
-
|
223
|
+
commands =
|
224
|
+
if mappings
|
225
|
+
command_registry.each_with_object({}) { |(relation, registry), h|
|
226
|
+
mapper = mappings[relation]
|
227
|
+
|
228
|
+
h[relation] =
|
229
|
+
if mapper
|
230
|
+
registry.as(mapper)
|
231
|
+
else
|
232
|
+
registry
|
233
|
+
end
|
234
|
+
}
|
235
|
+
else
|
236
|
+
command_registry
|
237
|
+
end
|
238
|
+
new(input, options.merge(commands))
|
238
239
|
end
|
239
240
|
|
240
241
|
private
|
241
242
|
|
243
|
+
# retrieve a list of reserved method names
|
244
|
+
#
|
245
|
+
# @return [Array<Symbol>]
|
246
|
+
#
|
247
|
+
# @api private
|
248
|
+
def reserved_attributes
|
249
|
+
ROM::Model::Form.public_instance_methods
|
250
|
+
end
|
251
|
+
|
242
252
|
# @return [Hash<Symbol=>ROM::CommandRegistry>]
|
243
253
|
#
|
244
254
|
# @api private
|
@@ -246,18 +256,39 @@ module ROM
|
|
246
256
|
@command_registry ||= setup_command_registry
|
247
257
|
end
|
248
258
|
|
259
|
+
# input block stored to be used in inherited hook
|
260
|
+
#
|
261
|
+
# @return [Proc]
|
262
|
+
#
|
263
|
+
# @api private
|
264
|
+
def input_blocks
|
265
|
+
@input_blocks ||= []
|
266
|
+
end
|
267
|
+
|
268
|
+
# validation blocks stored to be used in inherited hook
|
269
|
+
#
|
270
|
+
# @return [Proc]
|
271
|
+
#
|
272
|
+
# @api private
|
273
|
+
def validation_blocks
|
274
|
+
@validation_blocks ||= []
|
275
|
+
end
|
276
|
+
|
249
277
|
# Create attribute handler class
|
250
278
|
#
|
251
279
|
# @return [Class]
|
252
280
|
#
|
253
281
|
# @api private
|
254
282
|
def define_attributes!(block)
|
255
|
-
|
283
|
+
input_blocks << block
|
256
284
|
@attributes = ClassBuilder.new(name: "#{name}::Attributes", parent: Object).call { |klass|
|
257
285
|
klass.send(:include, ROM::Model::Attributes)
|
258
286
|
}
|
259
|
-
|
260
|
-
|
287
|
+
input_blocks.each do |input_block|
|
288
|
+
@attributes.class_eval(&input_block)
|
289
|
+
end
|
290
|
+
|
291
|
+
update_const(:Attributes, @attributes)
|
261
292
|
end
|
262
293
|
|
263
294
|
# Define attribute readers for the form
|
@@ -270,8 +301,9 @@ module ROM
|
|
270
301
|
#
|
271
302
|
# @api private
|
272
303
|
def define_attribute_readers!
|
304
|
+
reserved = reserved_attributes
|
273
305
|
@attributes.attribute_set.each do |attribute|
|
274
|
-
if
|
306
|
+
if reserved.include?(attribute.name)
|
275
307
|
raise(
|
276
308
|
ArgumentError,
|
277
309
|
"#{attribute.name} attribute is in conflict with #{self}##{attribute.name}"
|
@@ -313,7 +345,8 @@ module ROM
|
|
313
345
|
RUBY
|
314
346
|
}
|
315
347
|
key.each { |name| @model.attribute(name) }
|
316
|
-
|
348
|
+
|
349
|
+
update_const(:Model, @model)
|
317
350
|
end
|
318
351
|
|
319
352
|
# Define attribute validator class
|
@@ -322,12 +355,12 @@ module ROM
|
|
322
355
|
#
|
323
356
|
# @api private
|
324
357
|
def define_validator!(block)
|
325
|
-
|
358
|
+
validation_blocks << block
|
326
359
|
@validator = ClassBuilder.new(name: "#{name}::Validator", parent: Object).call { |klass|
|
327
360
|
klass.send(:include, ROM::Model::Validator)
|
328
361
|
}
|
329
|
-
@validator.class_eval(&
|
330
|
-
|
362
|
+
validation_blocks.each{|validation| @validator.class_eval(&validation) }
|
363
|
+
update_const(:Validator, @validator)
|
331
364
|
end
|
332
365
|
|
333
366
|
# Shortcut to global ROM env
|
@@ -362,7 +395,15 @@ module ROM
|
|
362
395
|
if self_commands
|
363
396
|
self_commands.each do |rel_name, name|
|
364
397
|
command = build_command(name, rel_name)
|
365
|
-
|
398
|
+
elements = { name => command }
|
399
|
+
options =
|
400
|
+
if rom.mappers.key?(rel_name)
|
401
|
+
{ mappers: rom.mappers[rel_name] }
|
402
|
+
else
|
403
|
+
{}
|
404
|
+
end
|
405
|
+
|
406
|
+
commands[rel_name] = CommandRegistry.new(elements, options)
|
366
407
|
end
|
367
408
|
end
|
368
409
|
|
@@ -395,6 +436,19 @@ module ROM
|
|
395
436
|
|
396
437
|
klass.build(relation)
|
397
438
|
end
|
439
|
+
|
440
|
+
|
441
|
+
# Silently update a constant, replacing any existing definition without
|
442
|
+
# warning
|
443
|
+
#
|
444
|
+
# @param [Symbol] name the name of the constant
|
445
|
+
# @param [Class] klass class to assign
|
446
|
+
#
|
447
|
+
# @api private
|
448
|
+
def update_const(name, klass)
|
449
|
+
remove_const(name) if const_defined?(name, false)
|
450
|
+
const_set(name, klass)
|
451
|
+
end
|
398
452
|
end
|
399
453
|
end
|
400
454
|
end
|
data/lib/rom/rails/version.rb
CHANGED
data/rom-rails.gemspec
CHANGED
@@ -17,7 +17,7 @@ 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', '~> 0.6.0'
|
20
|
+
spec.add_runtime_dependency 'rom', '~> 0.6.0', '>= 0.6.1'
|
21
21
|
spec.add_runtime_dependency 'addressable', '~> 2.3'
|
22
22
|
spec.add_runtime_dependency 'charlatan', '~> 0.1'
|
23
23
|
spec.add_runtime_dependency 'virtus', '~> 1.0', '>= 1.0.5'
|
@@ -4,12 +4,12 @@ class UsersController < ApplicationController
|
|
4
4
|
end
|
5
5
|
|
6
6
|
def index
|
7
|
-
render :index, locals: { users: rom.relation(:users).as(:
|
7
|
+
render :index, locals: { users: rom.relation(:users).as(:entity) }
|
8
8
|
end
|
9
9
|
|
10
10
|
def search
|
11
11
|
render :index, locals: {
|
12
|
-
users: rom.relation(:users).as(:
|
12
|
+
users: rom.relation(:users).as(:entity).by_name(params[:name])
|
13
13
|
}
|
14
14
|
end
|
15
15
|
|
@@ -1,9 +1,9 @@
|
|
1
1
|
class User
|
2
|
-
include Equalizer.new(:id, :name)
|
2
|
+
include Equalizer.new(:id, :name, :email)
|
3
3
|
|
4
|
-
attr_reader :id, :name
|
4
|
+
attr_reader :id, :name, :email
|
5
5
|
|
6
6
|
def initialize(attrs)
|
7
|
-
@id, @name = attrs.values_at(:id, :name)
|
7
|
+
@id, @name, @email = attrs.values_at(:id, :name, :email)
|
8
8
|
end
|
9
9
|
end
|
data/spec/dummy/db/schema.rb
CHANGED
@@ -11,7 +11,11 @@
|
|
11
11
|
#
|
12
12
|
# It's strongly recommended that you check this file into your version control system.
|
13
13
|
|
14
|
-
ActiveRecord::Schema.define(version:
|
14
|
+
ActiveRecord::Schema.define(version: 20150403194906) do
|
15
|
+
|
16
|
+
create_table "tags", force: :cascade do |t|
|
17
|
+
t.string "name"
|
18
|
+
end
|
15
19
|
|
16
20
|
create_table "tasks", force: :cascade do |t|
|
17
21
|
t.string "title"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'Form with injected commands' do
|
4
|
+
subject(:form) { form_class.build(params) }
|
5
|
+
|
6
|
+
let(:params) { { title: 'Task one' } }
|
7
|
+
|
8
|
+
let(:form_class) do
|
9
|
+
Class.new(ROM::Model::Form) do
|
10
|
+
commands users: :create, tags: :create
|
11
|
+
|
12
|
+
inject_commands_for :tasks
|
13
|
+
|
14
|
+
mappings tasks: :entity
|
15
|
+
|
16
|
+
input do
|
17
|
+
set_model_name 'Task'
|
18
|
+
|
19
|
+
attribute :title
|
20
|
+
end
|
21
|
+
|
22
|
+
def commit!
|
23
|
+
tasks.create[attributes]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'auto-maps result using injected commands' do
|
29
|
+
form.save
|
30
|
+
|
31
|
+
value = form.result
|
32
|
+
|
33
|
+
expect(value).to be_a(Task)
|
34
|
+
expect(value.id).to_not be(nil)
|
35
|
+
expect(value.title).to eql('Task one')
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NewUserForm do
|
4
|
+
subject(:form) { NewUserForm.build(params) }
|
5
|
+
|
6
|
+
let(:params) do
|
7
|
+
{ name: 'Jane', email: 'jane@doe.org' }
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#save' do
|
11
|
+
it 'persists attributes and auto-map result to entity object' do
|
12
|
+
form.save
|
13
|
+
|
14
|
+
user = form.result.value
|
15
|
+
|
16
|
+
expect(user).to eql(User.new(id: 1, name: 'Jane', email: 'jane@doe.org'))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -3,14 +3,14 @@ require 'spec_helper'
|
|
3
3
|
describe 'User model mapping' do
|
4
4
|
let(:rom) { ROM.env }
|
5
5
|
|
6
|
-
let(:users) { rom.relation(:users).as(:
|
6
|
+
let(:users) { rom.relation(:users).as(:entity) }
|
7
7
|
|
8
8
|
before do
|
9
9
|
rom.relations.users.insert(name: 'Piotr', email: 'piotr@test.com')
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'works' do
|
13
|
-
piotr = User.new(id: 1, name: 'Piotr')
|
13
|
+
piotr = User.new(id: 1, name: 'Piotr', email: 'piotr@test.com')
|
14
14
|
|
15
15
|
expect(users.by_name('Piotr').to_a).to eql([piotr])
|
16
16
|
end
|
@@ -9,20 +9,49 @@ describe ROM::Generators::FormGenerator do
|
|
9
9
|
prepare_destination
|
10
10
|
end
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
class NewUserForm < ROM::Model::Form
|
21
|
-
commands users: :create
|
12
|
+
shared_examples_for "generates a base user form" do
|
13
|
+
it "populates a base form file" do
|
14
|
+
expect(destination_root).to have_structure {
|
15
|
+
directory 'app' do
|
16
|
+
directory 'forms' do
|
17
|
+
file 'user_form.rb' do
|
18
|
+
contains <<-CONTENT.strip_heredoc
|
19
|
+
class UserForm < ROM::Model::Form
|
22
20
|
|
23
21
|
input do
|
24
22
|
set_model_name 'User'
|
25
23
|
|
24
|
+
# define always-present form input attributes
|
25
|
+
# attribute :name, String
|
26
|
+
end
|
27
|
+
|
28
|
+
validations do
|
29
|
+
relation :users
|
30
|
+
|
31
|
+
# Add invariant form validations
|
32
|
+
# validates :name, presence: true
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
CONTENT
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
shared_examples_for "generates a create user form" do
|
45
|
+
it "populates a create form file" do
|
46
|
+
expect(destination_root).to have_structure {
|
47
|
+
directory 'app' do
|
48
|
+
directory 'forms' do
|
49
|
+
file 'new_user_form.rb' do
|
50
|
+
contains <<-CONTENT.strip_heredoc
|
51
|
+
class NewUserForm < UserForm
|
52
|
+
commands users: :create
|
53
|
+
|
54
|
+
input do
|
26
55
|
# define form input attributes
|
27
56
|
# attribute :name, String
|
28
57
|
|
@@ -30,8 +59,6 @@ describe ROM::Generators::FormGenerator do
|
|
30
59
|
end
|
31
60
|
|
32
61
|
validations do
|
33
|
-
relation :users
|
34
|
-
|
35
62
|
# Add form validations
|
36
63
|
# validates :name, presence: true
|
37
64
|
end
|
@@ -41,27 +68,26 @@ describe ROM::Generators::FormGenerator do
|
|
41
68
|
end
|
42
69
|
|
43
70
|
end
|
44
|
-
|
71
|
+
CONTENT
|
72
|
+
end
|
45
73
|
end
|
46
74
|
end
|
47
|
-
|
48
|
-
|
75
|
+
}
|
76
|
+
end
|
49
77
|
end
|
50
78
|
|
51
|
-
|
52
|
-
run_generator ['users', '--command=update']
|
79
|
+
shared_examples_for "generates an edit user form" do
|
53
80
|
|
54
|
-
|
55
|
-
|
56
|
-
directory '
|
57
|
-
|
58
|
-
|
59
|
-
|
81
|
+
it "populates a edit form file" do
|
82
|
+
expect(destination_root).to have_structure {
|
83
|
+
directory 'app' do
|
84
|
+
directory 'forms' do
|
85
|
+
file 'edit_user_form.rb' do
|
86
|
+
contains <<-CONTENT.strip_heredoc
|
87
|
+
class EditUserForm < UserForm
|
60
88
|
commands users: :update
|
61
89
|
|
62
90
|
input do
|
63
|
-
set_model_name 'User'
|
64
|
-
|
65
91
|
# define form input attributes
|
66
92
|
# attribute :name, String
|
67
93
|
|
@@ -69,8 +95,6 @@ describe ROM::Generators::FormGenerator do
|
|
69
95
|
end
|
70
96
|
|
71
97
|
validations do
|
72
|
-
relation :users
|
73
|
-
|
74
98
|
# Add form validations
|
75
99
|
# validates :name, presence: true
|
76
100
|
end
|
@@ -80,10 +104,40 @@ describe ROM::Generators::FormGenerator do
|
|
80
104
|
end
|
81
105
|
|
82
106
|
end
|
83
|
-
|
107
|
+
CONTENT
|
108
|
+
end
|
84
109
|
end
|
85
110
|
end
|
86
|
-
|
87
|
-
|
111
|
+
}
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "rom:form users" do
|
116
|
+
before do
|
117
|
+
run_generator ['users']
|
118
|
+
end
|
119
|
+
|
120
|
+
it_should_behave_like "generates a create user form"
|
121
|
+
it_should_behave_like "generates an edit user form"
|
88
122
|
end
|
123
|
+
|
124
|
+
describe "rom:form users --command=create" do
|
125
|
+
before do
|
126
|
+
run_generator ['users', '--command=create']
|
127
|
+
end
|
128
|
+
|
129
|
+
it_should_behave_like "generates a base user form"
|
130
|
+
it_should_behave_like "generates a create user form"
|
131
|
+
end
|
132
|
+
|
133
|
+
describe "rom:form users --command=update" do
|
134
|
+
before do
|
135
|
+
run_generator ['users', '--command=update']
|
136
|
+
end
|
137
|
+
|
138
|
+
it_should_behave_like "generates a base user form"
|
139
|
+
it_should_behave_like "generates an edit user form"
|
140
|
+
end
|
141
|
+
|
142
|
+
|
89
143
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -13,6 +13,11 @@ require 'database_cleaner'
|
|
13
13
|
require 'capybara/rails'
|
14
14
|
require 'generator_spec'
|
15
15
|
|
16
|
+
begin
|
17
|
+
require 'byebug'
|
18
|
+
rescue LoadError
|
19
|
+
end
|
20
|
+
|
16
21
|
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
|
17
22
|
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
|
18
23
|
|
data/spec/unit/form_spec.rb
CHANGED
@@ -67,7 +67,7 @@ describe 'Form' do
|
|
67
67
|
expect(form_object).to be_success
|
68
68
|
expect(rom.relations.users.first).to include(name: 'Jane')
|
69
69
|
|
70
|
-
expect(form_object.tasks).
|
70
|
+
expect(form_object.tasks).to_not be(nil)
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
@@ -286,6 +286,23 @@ describe 'Form' do
|
|
286
286
|
expect(child_form.attributes).to_not be(form.attributes)
|
287
287
|
end
|
288
288
|
|
289
|
+
it 'expands input' do
|
290
|
+
child_form = Class.new(form) do
|
291
|
+
def self.name
|
292
|
+
"NewUserForm"
|
293
|
+
end
|
294
|
+
|
295
|
+
input do
|
296
|
+
attribute :login, String
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
expect(child_form.attributes.attribute_set[:login]).to_not be(nil)
|
301
|
+
expect(child_form.attributes.attribute_set[:email]).to_not be(nil)
|
302
|
+
|
303
|
+
expect(child_form.attributes).to_not be(form.attributes)
|
304
|
+
end
|
305
|
+
|
289
306
|
it 'copies model' do
|
290
307
|
expect(child_form.model.attribute_set[:email]).to_not be(nil)
|
291
308
|
expect(child_form.model).to_not be(form.model)
|
@@ -297,5 +314,33 @@ describe 'Form' do
|
|
297
314
|
)
|
298
315
|
expect(child_form.validator).to_not be(form.validator)
|
299
316
|
end
|
317
|
+
|
318
|
+
it "expands existing validators" do
|
319
|
+
child_form = Class.new(form) do
|
320
|
+
def self.name
|
321
|
+
"NewUserForm"
|
322
|
+
end
|
323
|
+
|
324
|
+
input do
|
325
|
+
attribute :login, String
|
326
|
+
end
|
327
|
+
|
328
|
+
validations do
|
329
|
+
validates :login, length: { minimum: 4 }
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
expect(child_form.validator.validators.first).to be_instance_of(
|
334
|
+
ActiveModel::Validations::PresenceValidator
|
335
|
+
)
|
336
|
+
|
337
|
+
expect(child_form.validator.validators.last).to be_instance_of(
|
338
|
+
ActiveModel::Validations::LengthValidator
|
339
|
+
)
|
340
|
+
|
341
|
+
expect(child_form.validator).to_not be(form.validator)
|
342
|
+
end
|
343
|
+
|
344
|
+
|
300
345
|
end
|
301
346
|
end
|
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.
|
4
|
+
version: 0.3.1
|
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-04-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rom
|
@@ -17,6 +17,9 @@ dependencies:
|
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 0.6.0
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.6.1
|
20
23
|
type: :runtime
|
21
24
|
prerelease: false
|
22
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -24,6 +27,9 @@ dependencies:
|
|
24
27
|
- - "~>"
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: 0.6.0
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.6.1
|
27
33
|
- !ruby/object:Gem::Dependency
|
28
34
|
name: addressable
|
29
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -155,6 +161,7 @@ files:
|
|
155
161
|
- lib/generators/rom/commands/templates/delete.rb.erb
|
156
162
|
- lib/generators/rom/commands/templates/update.rb.erb
|
157
163
|
- lib/generators/rom/commands_generator.rb
|
164
|
+
- lib/generators/rom/form/templates/base_form.rb.erb
|
158
165
|
- lib/generators/rom/form/templates/edit_form.rb.erb
|
159
166
|
- lib/generators/rom/form/templates/new_form.rb.erb
|
160
167
|
- lib/generators/rom/form_generator.rb
|
@@ -188,6 +195,7 @@ files:
|
|
188
195
|
- spec/dummy/app/forms/user_form.rb
|
189
196
|
- spec/dummy/app/helpers/application_helper.rb
|
190
197
|
- spec/dummy/app/mailers/.keep
|
198
|
+
- spec/dummy/app/mappers/tasks.rb
|
191
199
|
- spec/dummy/app/mappers/users.rb
|
192
200
|
- spec/dummy/app/models/.keep
|
193
201
|
- spec/dummy/app/models/user.rb
|
@@ -219,6 +227,7 @@ files:
|
|
219
227
|
- spec/dummy/config/routes.rb
|
220
228
|
- spec/dummy/db/migrate/20141110205016_add_users.rb
|
221
229
|
- spec/dummy/db/migrate/20150202194440_create_tasks.rb
|
230
|
+
- spec/dummy/db/migrate/20150403194906_create_tags.rb
|
222
231
|
- spec/dummy/db/schema.rb
|
223
232
|
- spec/dummy/db/seeds.rb
|
224
233
|
- spec/dummy/lib/assets/.keep
|
@@ -230,7 +239,9 @@ files:
|
|
230
239
|
- spec/dummy/public/favicon.ico
|
231
240
|
- spec/dummy/public/robots.txt
|
232
241
|
- spec/dummy/spec/features/users_spec.rb
|
242
|
+
- spec/dummy/spec/integration/form_with_injected_commands_spec.rb
|
233
243
|
- spec/dummy/spec/integration/logger_spec.rb
|
244
|
+
- spec/dummy/spec/integration/new_user_form_spec.rb
|
234
245
|
- spec/dummy/spec/integration/user_attributes_spec.rb
|
235
246
|
- spec/dummy/spec/integration/user_commands_spec.rb
|
236
247
|
- spec/dummy/spec/integration/user_model_mapping_spec.rb
|
@@ -281,6 +292,7 @@ test_files:
|
|
281
292
|
- spec/dummy/app/forms/user_form.rb
|
282
293
|
- spec/dummy/app/helpers/application_helper.rb
|
283
294
|
- spec/dummy/app/mailers/.keep
|
295
|
+
- spec/dummy/app/mappers/tasks.rb
|
284
296
|
- spec/dummy/app/mappers/users.rb
|
285
297
|
- spec/dummy/app/models/.keep
|
286
298
|
- spec/dummy/app/models/user.rb
|
@@ -312,6 +324,7 @@ test_files:
|
|
312
324
|
- spec/dummy/config/routes.rb
|
313
325
|
- spec/dummy/db/migrate/20141110205016_add_users.rb
|
314
326
|
- spec/dummy/db/migrate/20150202194440_create_tasks.rb
|
327
|
+
- spec/dummy/db/migrate/20150403194906_create_tags.rb
|
315
328
|
- spec/dummy/db/schema.rb
|
316
329
|
- spec/dummy/db/seeds.rb
|
317
330
|
- spec/dummy/lib/assets/.keep
|
@@ -323,7 +336,9 @@ test_files:
|
|
323
336
|
- spec/dummy/public/favicon.ico
|
324
337
|
- spec/dummy/public/robots.txt
|
325
338
|
- spec/dummy/spec/features/users_spec.rb
|
339
|
+
- spec/dummy/spec/integration/form_with_injected_commands_spec.rb
|
326
340
|
- spec/dummy/spec/integration/logger_spec.rb
|
341
|
+
- spec/dummy/spec/integration/new_user_form_spec.rb
|
327
342
|
- spec/dummy/spec/integration/user_attributes_spec.rb
|
328
343
|
- spec/dummy/spec/integration/user_commands_spec.rb
|
329
344
|
- spec/dummy/spec/integration/user_model_mapping_spec.rb
|
@@ -337,3 +352,4 @@ test_files:
|
|
337
352
|
- spec/spec_helper.rb
|
338
353
|
- spec/unit/form_spec.rb
|
339
354
|
- spec/unit/validator_spec.rb
|
355
|
+
has_rdoc:
|