rom-rails 0.9.0 → 1.0.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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +2 -0
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +14 -0
  5. data/Gemfile +8 -5
  6. data/lib/generators/rom/commands/templates/create.rb.erb +5 -7
  7. data/lib/generators/rom/commands/templates/update.rb.erb +5 -7
  8. data/lib/generators/rom/relation/templates/relation.rb.erb +6 -4
  9. data/lib/rom-rails.rb +0 -1
  10. data/lib/rom/rails/configuration.rb +0 -2
  11. data/lib/rom/rails/version.rb +1 -1
  12. data/rom-rails.gemspec +2 -4
  13. data/spec/dummy/app/commands/create_user.rb +10 -0
  14. data/spec/dummy/app/commands/update_user.rb +9 -0
  15. data/spec/dummy/app/controllers/users_controller.rb +12 -8
  16. data/spec/dummy/app/forms/user_form.rb +29 -9
  17. data/spec/dummy/app/mappers/task_mapper.rb +1 -1
  18. data/spec/dummy/app/mappers/user_mapper.rb +1 -1
  19. data/spec/dummy/app/models/user.rb +1 -1
  20. data/spec/dummy/app/relations/dummy_relation.rb +2 -1
  21. data/spec/dummy/app/relations/tasks.rb +2 -0
  22. data/spec/dummy/app/relations/users.rb +2 -0
  23. data/spec/dummy/lib/rom/test_adapter.rb +1 -1
  24. data/spec/features/users_spec.rb +1 -3
  25. data/spec/integration/activerecord_setup.rb +1 -1
  26. data/spec/integration/initializer_spec.rb +1 -3
  27. data/spec/integration/logger_spec.rb +1 -3
  28. data/spec/integration/user_commands_spec.rb +7 -7
  29. data/spec/integration/user_model_mapping_spec.rb +2 -4
  30. data/spec/lib/active_record/configuration_spec.rb +1 -2
  31. data/spec/lib/generators/commands_generator_spec.rb +7 -17
  32. data/spec/lib/generators/mapper_generator_spec.rb +1 -3
  33. data/spec/lib/generators/relation_generator_spec.rb +4 -8
  34. data/spec/lib/generators/repository_generator_spec.rb +1 -3
  35. data/spec/spec_helper.rb +1 -1
  36. metadata +12 -61
  37. data/lib/generators/rom/form/templates/base_form.rb.erb +0 -17
  38. data/lib/generators/rom/form/templates/edit_form.rb.erb +0 -20
  39. data/lib/generators/rom/form/templates/new_form.rb.erb +0 -20
  40. data/lib/generators/rom/form_generator.rb +0 -47
  41. data/lib/rom/rails/model/form.rb +0 -173
  42. data/lib/rom/rails/model/form/class_interface.rb +0 -457
  43. data/lib/rom/rails/model/form/error_proxy.rb +0 -53
  44. data/spec/dummy/app/forms/new_user_form.rb +0 -13
  45. data/spec/dummy/app/forms/update_user_form.rb +0 -11
  46. data/spec/integration/form_with_injected_commands_spec.rb +0 -37
  47. data/spec/integration/new_user_form_spec.rb +0 -19
  48. data/spec/lib/generators/form_generator_spec.rb +0 -140
  49. data/spec/unit/form_spec.rb +0 -366
@@ -1,8 +1,6 @@
1
- require 'spec_helper'
2
-
3
1
  require 'generators/rom/mapper_generator'
4
2
 
5
- describe ROM::Generators::MapperGenerator do
3
+ RSpec.describe ROM::Generators::MapperGenerator do
6
4
  destination File.expand_path('../../../../tmp', __FILE__)
7
5
 
8
6
  before(:all) do
@@ -1,8 +1,6 @@
1
- require 'spec_helper'
2
-
3
1
  require 'generators/rom/relation_generator'
4
2
 
5
- describe ROM::Generators::RelationGenerator, type: :generator do
3
+ RSpec.describe ROM::Generators::RelationGenerator, type: :generator do
6
4
  destination File.expand_path('../../../../tmp', __FILE__)
7
5
 
8
6
  before(:each) do
@@ -19,11 +17,9 @@ describe ROM::Generators::RelationGenerator, type: :generator do
19
17
  file 'users_relation.rb' do
20
18
  contains <<-CONTENT.strip_heredoc
21
19
  class UsersRelation < ROM::Relation[:#{default_adapter}]
22
- # gateway :default
23
-
24
- dataset :users
20
+ gateway :default
25
21
 
26
- register_as :users
22
+ schema(:users, infer: true)
27
23
 
28
24
  # define your methods here ie:
29
25
  #
@@ -56,6 +52,6 @@ describe ROM::Generators::RelationGenerator, type: :generator do
56
52
  run_generator ['users', '--register=profiles']
57
53
 
58
54
  relation = File.read(File.join(destination_root, 'app', 'relations', 'users_relation.rb'))
59
- expect(relation).to include("register_as :profiles")
55
+ expect(relation).to match(/schema.*as: :profiles/)
60
56
  end
61
57
  end
@@ -1,9 +1,7 @@
1
- require 'spec_helper'
2
-
3
1
  require 'rom-repository'
4
2
  require 'generators/rom/repository_generator'
5
3
 
6
- describe ROM::Generators::RepositoryGenerator, type: :generator do
4
+ RSpec.describe ROM::Generators::RepositoryGenerator, type: :generator do
7
5
  destination File.expand_path('../../../../tmp', __FILE__)
8
6
 
9
7
  before(:each) do
@@ -23,7 +23,7 @@ Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }
23
23
  Dry::Core::Deprecations.set_logger!(Rails.root.join('log/deprecations.log'))
24
24
 
25
25
  RSpec.configure do |config|
26
- config.order = "random"
26
+ config.disable_monkey_patching!
27
27
  config.example_status_persistence_file_path = "tmp/examples.txt"
28
28
 
29
29
  config.before(:suite) do
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.9.0
4
+ version: 1.0.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: 2017-01-30 00:00:00.000000000 Z
11
+ date: 2017-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rom
@@ -16,28 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '3.0'
27
- - !ruby/object:Gem::Dependency
28
- name: rom-model
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '0.3'
19
+ version: 4.0.0.beta
34
20
  type: :runtime
35
21
  prerelease: false
36
22
  version_requirements: !ruby/object:Gem::Requirement
37
23
  requirements:
38
24
  - - "~>"
39
25
  - !ruby/object:Gem::Version
40
- version: '0.3'
26
+ version: 4.0.0.beta
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: dry-equalizer
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,20 +44,14 @@ dependencies:
58
44
  requirements:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
- version: '0.2'
62
- - - ">="
63
- - !ruby/object:Gem::Version
64
- version: 0.2.4
47
+ version: '0.3'
65
48
  type: :runtime
66
49
  prerelease: false
67
50
  version_requirements: !ruby/object:Gem::Requirement
68
51
  requirements:
69
52
  - - "~>"
70
53
  - !ruby/object:Gem::Version
71
- version: '0.2'
72
- - - ">="
73
- - !ruby/object:Gem::Version
74
- version: 0.2.4
54
+ version: '0.3'
75
55
  - !ruby/object:Gem::Dependency
76
56
  name: addressable
77
57
  requirement: !ruby/object:Gem::Requirement
@@ -86,20 +66,6 @@ dependencies:
86
66
  - - "~>"
87
67
  - !ruby/object:Gem::Version
88
68
  version: '2.3'
89
- - !ruby/object:Gem::Dependency
90
- name: charlatan
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '0.1'
96
- type: :runtime
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '0.1'
103
69
  - !ruby/object:Gem::Dependency
104
70
  name: railties
105
71
  requirement: !ruby/object:Gem::Requirement
@@ -197,10 +163,6 @@ files:
197
163
  - lib/generators/rom/commands/templates/delete.rb.erb
198
164
  - lib/generators/rom/commands/templates/update.rb.erb
199
165
  - lib/generators/rom/commands_generator.rb
200
- - lib/generators/rom/form/templates/base_form.rb.erb
201
- - lib/generators/rom/form/templates/edit_form.rb.erb
202
- - lib/generators/rom/form/templates/new_form.rb.erb
203
- - lib/generators/rom/form_generator.rb
204
166
  - lib/generators/rom/mapper/templates/mapper.rb.erb
205
167
  - lib/generators/rom/mapper_generator.rb
206
168
  - lib/generators/rom/relation/templates/relation.rb.erb
@@ -212,9 +174,6 @@ files:
212
174
  - lib/rom/rails/configuration.rb
213
175
  - lib/rom/rails/controller_extension.rb
214
176
  - lib/rom/rails/inflections.rb
215
- - lib/rom/rails/model/form.rb
216
- - lib/rom/rails/model/form/class_interface.rb
217
- - lib/rom/rails/model/form/error_proxy.rb
218
177
  - lib/rom/rails/railtie.rb
219
178
  - lib/rom/rails/tasks/db.rake
220
179
  - lib/rom/rails/version.rb
@@ -223,11 +182,11 @@ files:
223
182
  - spec/dummy/README.rdoc
224
183
  - spec/dummy/Rakefile
225
184
  - spec/dummy/app/commands/create_task.rb
185
+ - spec/dummy/app/commands/create_user.rb
226
186
  - spec/dummy/app/commands/delete_user.rb
187
+ - spec/dummy/app/commands/update_user.rb
227
188
  - spec/dummy/app/controllers/application_controller.rb
228
189
  - spec/dummy/app/controllers/users_controller.rb
229
- - spec/dummy/app/forms/new_user_form.rb
230
- - spec/dummy/app/forms/update_user_form.rb
231
190
  - spec/dummy/app/forms/user_form.rb
232
191
  - spec/dummy/app/helpers/application_helper.rb
233
192
  - spec/dummy/app/mailers/.keep
@@ -280,20 +239,16 @@ files:
280
239
  - spec/dummy/vendor/assets/stylesheets/.keep
281
240
  - spec/features/users_spec.rb
282
241
  - spec/integration/activerecord_setup.rb
283
- - spec/integration/form_with_injected_commands_spec.rb
284
242
  - spec/integration/initializer_spec.rb
285
243
  - spec/integration/logger_spec.rb
286
- - spec/integration/new_user_form_spec.rb
287
244
  - spec/integration/user_commands_spec.rb
288
245
  - spec/integration/user_model_mapping_spec.rb
289
246
  - spec/lib/active_record/configuration_spec.rb
290
247
  - spec/lib/generators/commands_generator_spec.rb
291
- - spec/lib/generators/form_generator_spec.rb
292
248
  - spec/lib/generators/mapper_generator_spec.rb
293
249
  - spec/lib/generators/relation_generator_spec.rb
294
250
  - spec/lib/generators/repository_generator_spec.rb
295
251
  - spec/spec_helper.rb
296
- - spec/unit/form_spec.rb
297
252
  homepage: http://rom-rb.org
298
253
  licenses:
299
254
  - MIT
@@ -309,9 +264,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
309
264
  version: '0'
310
265
  required_rubygems_version: !ruby/object:Gem::Requirement
311
266
  requirements:
312
- - - ">="
267
+ - - ">"
313
268
  - !ruby/object:Gem::Version
314
- version: '0'
269
+ version: 1.3.1
315
270
  requirements: []
316
271
  rubyforge_project:
317
272
  rubygems_version: 2.4.5.1
@@ -323,11 +278,11 @@ test_files:
323
278
  - spec/dummy/README.rdoc
324
279
  - spec/dummy/Rakefile
325
280
  - spec/dummy/app/commands/create_task.rb
281
+ - spec/dummy/app/commands/create_user.rb
326
282
  - spec/dummy/app/commands/delete_user.rb
283
+ - spec/dummy/app/commands/update_user.rb
327
284
  - spec/dummy/app/controllers/application_controller.rb
328
285
  - spec/dummy/app/controllers/users_controller.rb
329
- - spec/dummy/app/forms/new_user_form.rb
330
- - spec/dummy/app/forms/update_user_form.rb
331
286
  - spec/dummy/app/forms/user_form.rb
332
287
  - spec/dummy/app/helpers/application_helper.rb
333
288
  - spec/dummy/app/mailers/.keep
@@ -380,17 +335,13 @@ test_files:
380
335
  - spec/dummy/vendor/assets/stylesheets/.keep
381
336
  - spec/features/users_spec.rb
382
337
  - spec/integration/activerecord_setup.rb
383
- - spec/integration/form_with_injected_commands_spec.rb
384
338
  - spec/integration/initializer_spec.rb
385
339
  - spec/integration/logger_spec.rb
386
- - spec/integration/new_user_form_spec.rb
387
340
  - spec/integration/user_commands_spec.rb
388
341
  - spec/integration/user_model_mapping_spec.rb
389
342
  - spec/lib/active_record/configuration_spec.rb
390
343
  - spec/lib/generators/commands_generator_spec.rb
391
- - spec/lib/generators/form_generator_spec.rb
392
344
  - spec/lib/generators/mapper_generator_spec.rb
393
345
  - spec/lib/generators/relation_generator_spec.rb
394
346
  - spec/lib/generators/repository_generator_spec.rb
395
347
  - spec/spec_helper.rb
396
- - spec/unit/form_spec.rb
@@ -1,17 +0,0 @@
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,20 +0,0 @@
1
- class Edit<%= model_name %>Form < <%= model_name %>Form
2
- commands <%= relation %>: :update
3
-
4
- input do
5
- # define form input attributes
6
- # attribute :name, String
7
-
8
- timestamps :updated_at
9
- end
10
-
11
- validations do
12
- # Add form validations
13
- # validates :name, presence: true
14
- end
15
-
16
- def commit!
17
- <%= relation %>.try { <%= relation %>.update.by_id(id).set(attributes) }
18
- end
19
-
20
- end
@@ -1,20 +0,0 @@
1
- class New<%= model_name %>Form < <%= model_name %>Form
2
- commands <%= relation %>: :create
3
-
4
- input do
5
- # define form input attributes
6
- # attribute :name, String
7
-
8
- timestamps
9
- end
10
-
11
- validations do
12
- # Add form validations
13
- # validates :name, presence: true
14
- end
15
-
16
- def commit!
17
- <%= relation %>.try { <%= relation %>.create.call(attributes) }
18
- end
19
-
20
- end
@@ -1,47 +0,0 @@
1
- require 'generators/rom'
2
-
3
- module ROM
4
- module Generators
5
- class FormGenerator < Base
6
- class_option :command,
7
- banner: "--command=command",
8
- desc: "specify command to use"
9
-
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
24
-
25
- def create(type)
26
- template "#{type}_form.rb.erb",
27
- File.join("app", "forms", "#{type}_#{file_name.singularize}_form.rb")
28
- end
29
-
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
37
-
38
- def model_name
39
- class_name.singularize.camelcase
40
- end
41
-
42
- def relation
43
- class_name.pluralize.underscore
44
- end
45
- end
46
- end
47
- end
@@ -1,173 +0,0 @@
1
- require 'dry/equalizer'
2
- require 'dry/core/class_attributes'
3
-
4
- require 'rom-model'
5
-
6
- require 'rom/rails/model/form/class_interface'
7
- require 'rom/rails/model/form/error_proxy'
8
-
9
- module ROM
10
- module Model
11
- # Abstract form class
12
- #
13
- # Form objects in ROM are your top-level interface to persist data in the
14
- # database. They combine many features that you know from ActiveRecord:
15
- #
16
- # * params processing with sanitization and coercion
17
- # * attribute validations
18
- # * persisting data in the database
19
- #
20
- # The major difference is that a ROM form object separates those
21
- # responsibilities - a ROM form class has its own Attributes, Validator and
22
- # ROM commands that are accessible within its instance.
23
- #
24
- # @example
25
- # class UserForm < ROM::Model::Form
26
- # commands users: :create
27
- #
28
- # input do
29
- # set_model_name 'User'
30
- #
31
- # attribute :name, String
32
- # end
33
- #
34
- # validations do
35
- # validates :name, presence: true
36
- # end
37
- # end
38
- #
39
- # class CreateUserForm < UserForm
40
- # attributes.timestamps :created_at
41
- #
42
- # def commit!
43
- # users.try { users.create.call(attributes) }
44
- # end
45
- # end
46
- #
47
- # # then in your controller
48
- # CreateUserForm.build(params[:user]).save
49
- #
50
- # @api public
51
- class Form
52
- include Dry::Equalizer(:params, :model, :result)
53
-
54
- extend Dry::Core::ClassAttributes
55
- extend Form::ClassInterface
56
-
57
- defines :relation, :mappings
58
-
59
- # Return raw params received from the request
60
- #
61
- # @return [Object]
62
- #
63
- # @api public
64
- attr_reader :params
65
-
66
- # Return model instance representing an ActiveModel object that will be
67
- # persisted or updated
68
- #
69
- # @return [Object]
70
- #
71
- # @api public
72
- attr_reader :model
73
-
74
- # Return the result of commit!
75
- #
76
- # @return [Object]
77
- #
78
- # @api public
79
- attr_reader :result
80
-
81
- # Return any errors with the form
82
- #
83
- # @return [ErrorProxy]
84
- #
85
- # @api public
86
- attr_reader :errors
87
-
88
- delegate :model_name, :persisted?, :to_key, to: :model
89
- alias to_model model
90
-
91
- class << self
92
- delegate :model_name, to: :attributes
93
- end
94
-
95
- # Raise deprecation warning when class is used:
96
- #
97
- # @api private
98
- def self.inherited(klass)
99
- Dry::Core::Deprecations.announce "ROM::Model::Form", <<-MSG, tag: :rom
100
- We now recommend using Reform or another dedicated form library,
101
- in conjunction with ROM::Repository or explicit command invocations.
102
- MSG
103
-
104
- super
105
- end
106
-
107
- # @api private
108
- def initialize(params = {}, options = {})
109
- @params = params.respond_to?(:to_unsafe_hash) ?
110
- params.to_unsafe_hash : params
111
- @model = self.class.model.new(params.to_h.merge(options.slice(*self.class.key)))
112
- @result = nil
113
- @errors = ErrorProxy.new
114
- options.each { |key, value| instance_variable_set("@#{key}", value) }
115
- end
116
-
117
- # A specialized form object must implement this method
118
- #
119
- # @abstract
120
- #
121
- # @api public
122
- def commit!
123
- raise NotImplementedError, "#{self.class}#commit! must be implemented"
124
- end
125
-
126
- # Save a form by calling commit! and memoizing result
127
- #
128
- # @return [self]
129
- #
130
- # @api public
131
- def save(*args)
132
- validate!
133
-
134
- @result = commit!(*args) unless @errors.present?
135
- @errors.set @result.error if result.respond_to? :error
136
-
137
- self
138
- end
139
-
140
- # Return whether commit was successful
141
- #
142
- # @return [TrueClass,FalseClass]
143
- #
144
- # @api public
145
- def success?
146
- errors.success?
147
- end
148
-
149
- # Trigger validation and store errors (if any)
150
- #
151
- # @api public
152
- def validate!
153
- @errors.clear
154
- return unless defined? self.class::Validator
155
- validator = self.class::Validator.new(attributes)
156
- validator.validate
157
-
158
- @errors.set validator.errors
159
- end
160
-
161
- # Sanitize and coerce input params
162
- #
163
- # This can also set default values
164
- #
165
- # @return [Model::Attributes]
166
- #
167
- # @api public
168
- def attributes
169
- self.class.attributes[params]
170
- end
171
- end
172
- end
173
- end