rom-rails 0.2.1 → 0.3.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -0
  3. data/CHANGELOG.md +17 -0
  4. data/README.md +4 -0
  5. data/lib/generators/rom/commands/templates/create.rb.erb +10 -0
  6. data/lib/generators/rom/commands/templates/delete.rb.erb +7 -0
  7. data/lib/generators/rom/commands/templates/update.rb.erb +10 -0
  8. data/lib/generators/rom/commands_generator.rb +33 -5
  9. data/lib/generators/rom/form/templates/edit_form.rb.erb +24 -0
  10. data/lib/generators/rom/form/templates/new_form.rb.erb +24 -0
  11. data/lib/generators/rom/form_generator.rb +39 -0
  12. data/lib/generators/rom/mapper/templates/mapper.rb.erb +9 -11
  13. data/lib/generators/rom/mapper_generator.rb +11 -1
  14. data/lib/generators/rom/relation/templates/relation.rb.erb +3 -2
  15. data/lib/generators/rom/relation_generator.rb +16 -1
  16. data/lib/rom-rails.rb +0 -5
  17. data/lib/rom/model.rb +7 -90
  18. data/lib/rom/rails/active_record/configuration.rb +105 -0
  19. data/lib/rom/rails/configuration.rb +4 -27
  20. data/lib/rom/rails/model/form.rb +59 -0
  21. data/lib/rom/rails/model/form/dsl.rb +173 -0
  22. data/lib/rom/rails/model/params.rb +72 -0
  23. data/lib/rom/rails/model/validator.rb +74 -0
  24. data/lib/rom/rails/model/validator/uniqueness_validator.rb +39 -0
  25. data/lib/rom/rails/railtie.rb +65 -29
  26. data/lib/rom/rails/version.rb +1 -1
  27. data/rom-rails.gemspec +3 -1
  28. data/spec/dummy/app/commands/tasks.rb +5 -0
  29. data/spec/dummy/app/commands/users.rb +4 -10
  30. data/spec/dummy/app/controllers/users_controller.rb +30 -0
  31. data/spec/dummy/app/forms/new_user_form.rb +9 -0
  32. data/spec/dummy/app/forms/update_user_form.rb +9 -0
  33. data/spec/dummy/app/forms/user_form.rb +15 -0
  34. data/spec/dummy/app/mappers/users.rb +6 -6
  35. data/spec/dummy/app/relations/tasks.rb +9 -0
  36. data/spec/dummy/app/relations/users.rb +5 -1
  37. data/spec/dummy/app/views/users/edit.html.erb +6 -0
  38. data/spec/dummy/app/views/users/new.html.erb +6 -0
  39. data/spec/dummy/config/routes.rb +5 -1
  40. data/spec/dummy/db/migrate/20141110205016_add_users.rb +2 -0
  41. data/spec/dummy/db/migrate/20150202194440_create_tasks.rb +7 -0
  42. data/spec/dummy/db/schema.rb +8 -8
  43. data/spec/dummy/spec/features/users_spec.rb +30 -0
  44. data/spec/dummy/spec/integration/logger_spec.rb +1 -1
  45. data/spec/dummy/spec/integration/user_commands_spec.rb +2 -18
  46. data/spec/dummy/spec/integration/user_model_mapping_spec.rb +2 -2
  47. data/spec/dummy/spec/integration/user_params_spec.rb +30 -15
  48. data/spec/lib/active_record/configuration_spec.rb +98 -0
  49. data/spec/lib/generators/commands_generator_spec.rb +54 -14
  50. data/spec/lib/generators/form_generator_spec.rb +89 -0
  51. data/spec/lib/generators/mapper_generator_spec.rb +10 -12
  52. data/spec/lib/generators/relation_generator_spec.rb +16 -6
  53. data/spec/spec_helper.rb +1 -1
  54. data/spec/unit/form_spec.rb +297 -0
  55. data/spec/unit/{model_spec.rb → params_spec.rb} +0 -0
  56. data/spec/unit/validator_spec.rb +75 -0
  57. metadata +72 -20
  58. data/lib/generators/rom/commands/templates/commands.rb.erb +0 -15
  59. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  60. data/spec/dummy/app/params/user_params.rb +0 -7
  61. data/spec/dummy/app/validators/user_validator.rb +0 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d21be75bbb9e3c79f408a7543e948cbbe5a2d48
4
- data.tar.gz: 0c7bf6a32c50ceca32d4575f4840725f8b2d2ca6
3
+ metadata.gz: dca5938e41a98dc3af6fe2aa5d301c13a6984d04
4
+ data.tar.gz: 372f0581874750544b013ff63048ff60ee69085b
5
5
  SHA512:
6
- metadata.gz: e16b255e12b8b290652b9d9e19b8dcf585486f65544ee00ec91b537b969d485e035f64b6f8f38ac24c5b913913466dcba4d19221570274144cb2be08f359984e
7
- data.tar.gz: f890b82c6a0b8c4b237db7a638ec31731f0e291c2a1ca800d80bc846a333adbcace7fd3b9e99f39af9085932f99dfb986d06a85bba79aa8c7480b278f1aeccae
6
+ metadata.gz: d0b26883fb509ab4ff4a39294b84d90436bd73c736e653f16ad90b4fb89c8fe6949590ac3f5f1513f0da752291ed96e6d69fb26fd164e47ba22b6a6cff400e94
7
+ data.tar.gz: d5fe5b5a9c13523bd2d53c5c193402de75e963edce3a79c6a815eff1c8a2f03010af8520cce4f037850a100dcccd96ba7cc1a692d6fd71bbd80fcc531f3c5ba0
data/.rubocop.yml CHANGED
@@ -8,6 +8,7 @@ Metrics/CyclomaticComplexity:
8
8
 
9
9
  # FIXME: No clue how to fix that one line…
10
10
  Metrics/LineLength:
11
+ Max: 100
11
12
  Exclude:
12
13
  - lib/rom/rails/configuration.rb
13
14
 
@@ -27,6 +28,23 @@ AllCops:
27
28
  - spec/dummy/db/schema.rb
28
29
  - spec/dummy/db/seeds.rb
29
30
  - tmp/**/*
31
+ - vendor/**/*
32
+
33
+ # The enforced style doesn’t match Vim’s defaults
34
+ Style/AlignParameters:
35
+ Enabled: false
36
+
37
+ # UTF-8 is perfectly fine in comments
38
+ Style/AsciiComments:
39
+ Enabled: false
40
+
41
+ # Allow using braces for value-returning blocks
42
+ Style/Blocks:
43
+ Enabled: false
44
+
45
+ Style/BracesAroundHashParameters:
46
+ Enabled: true
47
+ EnforcedStyle: context_dependent
30
48
 
31
49
  # Documentation checked by Inch CI
32
50
  Style/Documentation:
@@ -41,6 +59,10 @@ Style/FileName:
41
59
  Style/GuardClause:
42
60
  Enabled: false
43
61
 
62
+ # Multiline block chains are ok
63
+ Style/MultilineBlockChain:
64
+ Enabled: false
65
+
44
66
  # Model::Validator uses Model::ValidationError for this
45
67
  Style/RaiseArgs:
46
68
  Exclude:
@@ -57,3 +79,7 @@ Style/SignalException:
57
79
  # Accept both single and double quotes
58
80
  Style/StringLiterals:
59
81
  Enabled: false
82
+
83
+ Style/AccessorMethodName:
84
+ Exclude:
85
+ - lib/rom/rails/model/params.rb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## v0.3.0 to-be-released
2
+
3
+ ### Added
4
+
5
+ * `ROM::Model::Form` for modeling and setting up web-forms (solnic + cflipse)
6
+ * Support for timestamps attributes in Form objects (kchien)
7
+
8
+
9
+ ### Changed
10
+
11
+ * Improved initialization process which works with AR-style configurations (aflatter)
12
+ * Allow setup using a configuration block from railtie (aflatter)
13
+
14
+ [Compare v0.2.1...master](https://github.com/rom-rb/rom-rails/compare/v0.2.1...master)
15
+
1
16
  ## v0.2.1 2015-01-07
2
17
 
3
18
  ### Changed
@@ -8,6 +23,8 @@
8
23
 
9
24
  * `rom` extension is now mixed into ActionController::Base which addresses #12 (solnic)
10
25
 
26
+ [Compare v0.2.1...v0.2.0](https://github.com/rom-rb/rom-rails/compare/v0.2.0...v0.2.1)
27
+
11
28
  ## v0.2.0 2014-12-31
12
29
 
13
30
  ### Added
data/README.md CHANGED
@@ -23,6 +23,10 @@ ships with:
23
23
  * Mapper generators
24
24
  * Command generators
25
25
 
26
+ ## Issues
27
+
28
+ Please report any issues in the main [rom-rb/rom](https://github.com/rom-rb/rom/issues) issue tracker.
29
+
26
30
  ## Resources
27
31
 
28
32
  You can read more about ROM and Rails on the official website:
@@ -0,0 +1,10 @@
1
+ module <%= model_name %>Commands
2
+ class Create < ROM::Commands::Create<%= "[:#{adapter}]" %>
3
+ relation :<%= relation %>
4
+ register_as :create
5
+ result :one
6
+
7
+ # define a validator to use
8
+ # validator <%= model_name %>Validator
9
+ end
10
+ end
@@ -0,0 +1,7 @@
1
+ module <%= model_name %>Commands
2
+ class Delete < ROM::Commands::Delete<%= "[:#{adapter}]" %>
3
+ relation :<%= relation %>
4
+ register_as :delete
5
+ result :one
6
+ end
7
+ end
@@ -0,0 +1,10 @@
1
+ module <%= model_name %>Commands
2
+ class Update < ROM::Commands::Update<%= "[:#{adapter}]" %>
3
+ relation :<%= relation %>
4
+ register_as :update
5
+ result :one
6
+
7
+ # define a validator to use
8
+ # validator <%= model_name %>Validator
9
+ end
10
+ end
@@ -3,11 +3,39 @@ require 'generators/rom'
3
3
  module ROM
4
4
  module Generators
5
5
  class CommandsGenerator < Base
6
- def create_commands_file
7
- template(
8
- 'commands.rb.erb',
9
- File.join('app', 'commands', "#{file_name}.rb")
10
- )
6
+ class_option :adapter,
7
+ banner: "--adapter=adapter",
8
+ desc: "specify an adapter to use", required: true,
9
+ default: ROM.adapters.keys.first
10
+
11
+ def create_create_command
12
+ template 'create.rb.erb', command_file(:create)
13
+ end
14
+
15
+ def create_update_command
16
+ template 'update.rb.erb', command_file(:update)
17
+ end
18
+
19
+ def create_delete_command
20
+ template 'delete.rb.erb', command_file(:delete)
21
+ end
22
+
23
+ private
24
+
25
+ def command_file(command)
26
+ File.join('app', 'commands', file_name, "#{command}.rb")
27
+ end
28
+
29
+ def relation
30
+ class_name.pluralize.underscore
31
+ end
32
+
33
+ def model_name
34
+ class_name.singularize
35
+ end
36
+
37
+ def adapter
38
+ options[:adapter]
11
39
  end
12
40
  end
13
41
  end
@@ -0,0 +1,24 @@
1
+ class Edit<%= model_name %>Form < ROM::Model::Form
2
+ commands <%= relation %>: :update
3
+
4
+ input do
5
+ set_model_name '<%= model_name %>'
6
+
7
+ # define form input attributes
8
+ # attribute :name, String
9
+
10
+ timestamps :updated_at
11
+ end
12
+
13
+ validations do
14
+ relation :<%= relation %>
15
+
16
+ # Add form validations
17
+ # validates :name, presence: true
18
+ end
19
+
20
+ def commit!
21
+ <%= relation %>.try { <%= relation %>.update.by_id(id).set(params) }
22
+ end
23
+
24
+ end
@@ -0,0 +1,24 @@
1
+ class New<%= model_name %>Form < ROM::Model::Form
2
+ commands <%= relation %>: :create
3
+
4
+ input do
5
+ set_model_name '<%= model_name %>'
6
+
7
+ # define form input attributes
8
+ # attribute :name, String
9
+
10
+ timestamps
11
+ end
12
+
13
+ validations do
14
+ relation :<%= relation %>
15
+
16
+ # Add form validations
17
+ # validates :name, presence: true
18
+ end
19
+
20
+ def commit!
21
+ <%= relation %>.try { <%= relation %>.create.call(params) }
22
+ end
23
+
24
+ end
@@ -0,0 +1,39 @@
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", required: true
9
+
10
+ def create_command
11
+ type = edit_or_new
12
+
13
+ template "#{type}_form.rb.erb",
14
+ File.join("app", "forms", "#{type}_#{file_name.singularize}_form.rb")
15
+ end
16
+
17
+ private
18
+
19
+ def model_name
20
+ class_name.singularize.camelcase
21
+ end
22
+
23
+ def relation
24
+ class_name.pluralize.underscore
25
+ end
26
+
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
+ end
38
+ end
39
+ end
@@ -1,12 +1,10 @@
1
- ROM.mappers do
2
-
3
- define(:<%= class_name.underscore %>) do
4
- # specify model and attributes ie
5
- #
6
- # model <%= class_name.classify %>
7
- #
8
- # attribute :name
9
- # attribute :email
10
- end
11
-
1
+ class <%= model_name %>Mapper < ROM::Mapper
2
+ # relation :<%= relation %>
3
+ #
4
+ # specify model and attributes ie
5
+ #
6
+ # model <%= model_name %>
7
+ #
8
+ # attribute :name
9
+ # attribute :email
12
10
  end
@@ -6,9 +6,19 @@ module ROM
6
6
  def create_mapper_file
7
7
  template(
8
8
  'mapper.rb.erb',
9
- File.join('app', 'mappers', "#{file_name}.rb")
9
+ File.join('app', 'mappers', "#{file_name.singularize}_mapper.rb")
10
10
  )
11
11
  end
12
+
13
+ private
14
+
15
+ def model_name
16
+ class_name.singularize
17
+ end
18
+
19
+ def relation
20
+ class_name.pluralize.underscore
21
+ end
12
22
  end
13
23
  end
14
24
  end
@@ -1,8 +1,9 @@
1
- ROM.relation(:<%= class_name.underscore %>) do
1
+ class <%= class_name %>Relation < ROM::Relation<%= "[:#{adapter}]" %>
2
+ dataset :<%= dataset %>
3
+
2
4
  # define your methods here ie:
3
5
  #
4
6
  # def all
5
7
  # select(:id, :name).order(:id)
6
8
  # end
7
- #
8
9
  end
@@ -3,12 +3,27 @@ require 'generators/rom'
3
3
  module ROM
4
4
  module Generators
5
5
  class RelationGenerator < Base
6
+ class_option :adapter,
7
+ banner: "--adapter=adapter",
8
+ desc: "specify an adapter to use", required: true,
9
+ default: ROM.adapters.keys.first
10
+
6
11
  def create_relation_file
7
12
  template(
8
13
  'relation.rb.erb',
9
- File.join('app', 'relations', "#{file_name}.rb")
14
+ File.join('app', 'relations', "#{file_name}_relation.rb")
10
15
  )
11
16
  end
17
+
18
+ private
19
+
20
+ def dataset
21
+ class_name.underscore.pluralize
22
+ end
23
+
24
+ def adapter
25
+ options[:adapter]
26
+ end
12
27
  end
13
28
  end
14
29
  end
data/lib/rom-rails.rb CHANGED
@@ -1,8 +1,3 @@
1
- module ROM
2
- module Rails
3
- end
4
- end
5
-
6
1
  require 'rom'
7
2
  require 'rom/rails/version'
8
3
  require 'rom/rails/railtie'
data/lib/rom/model.rb CHANGED
@@ -1,97 +1,14 @@
1
- require 'virtus'
2
- require 'active_model'
1
+ require 'charlatan'
3
2
 
4
3
  module ROM
5
4
  module Model
6
5
  class ValidationError < CommandError
7
- attr_reader :params, :messages
8
-
9
- def initialize(params)
10
- @params = params
11
- @messages = params.errors
12
- end
13
- end
14
-
15
- # Mixin for validatable and coercible parameters
16
- #
17
- # @example
18
- #
19
- # class UserParams
20
- # include ROM::Model::Params
21
- #
22
- # attribute :email, String
23
- # attribute :age, Integer
24
- #
25
- # validates :email, :age, presence: true
26
- # end
27
- #
28
- # user_params = UserParams.new(email: '', age: '18')
29
- #
30
- # user_params.email # => ''
31
- # user_params.age # => 18
32
- #
33
- # user_params.valid? # => false
34
- # user_params.errors # => #<ActiveModel::Errors:0x007fd2423fadb0 ...>
35
- #
36
- # @api public
37
- module Params
38
- VirtusModel = Virtus.model(strict: true, required: false)
39
-
40
- def self.included(base)
41
- base.class_eval do
42
- include VirtusModel
43
- include ActiveModel::Validations
44
- include ActiveModel::Conversion
45
- end
46
- base.extend(ClassMethods)
47
- end
48
-
49
- module ClassMethods
50
- def param_key(name)
51
- class_eval <<-RUBY
52
- def self.model_name
53
- @model_name ||= ActiveModel::Name.new(self, nil, #{name.to_s.inspect})
54
- end
55
- RUBY
56
- end
57
-
58
- def [](input)
59
- new(input)
60
- end
61
- end
62
- end
63
-
64
- # Mixin for ROM-compliant validator objects
65
- #
66
- # @example
67
- #
68
- #
69
- # class UserParams
70
- # include ROM::Model::Params
71
- #
72
- # attribute :name
73
- #
74
- # validates :name, presence: true
75
- # end
76
- #
77
- # class UserValidator
78
- # include ROM::Model::Validator
79
- # end
80
- #
81
- # params = UserParams.new(name: '')
82
- # UserValidator.call(params) # raises ValidationError
83
- #
84
- # @api public
85
- module Validator
86
- def self.included(base)
87
- base.extend(ClassMethods)
88
- end
89
-
90
- module ClassMethods
91
- def call(params)
92
- raise ValidationError.new(params) unless params.valid?
93
- end
94
- end
6
+ include Charlatan.new(:errors)
7
+ include Equalizer.new(:errors)
95
8
  end
96
9
  end
97
10
  end
11
+
12
+ require 'rom/rails/model/params'
13
+ require 'rom/rails/model/validator'
14
+ require 'rom/rails/model/form'