rails_ops 1.1.25 → 1.1.29

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 (34) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rubocop.yml +17 -0
  3. data/.github/workflows/ruby.yml +37 -7
  4. data/.gitignore +1 -0
  5. data/Appraisals +19 -0
  6. data/CHANGELOG.md +18 -0
  7. data/README.md +56 -12
  8. data/Rakefile +1 -0
  9. data/VERSION +1 -1
  10. data/gemfiles/rails_5.1.gemfile +7 -0
  11. data/gemfiles/rails_5.2.gemfile +7 -0
  12. data/gemfiles/rails_6.0.gemfile +7 -0
  13. data/gemfiles/rails_6.1.gemfile +7 -0
  14. data/gemfiles/rails_7.0.gemfile +7 -0
  15. data/lib/generators/operation/operation_generator.rb +21 -3
  16. data/lib/generators/operation/templates/controller.erb +24 -7
  17. data/lib/generators/operation/templates/create.erb +4 -0
  18. data/lib/generators/operation/templates/destroy.erb +4 -0
  19. data/lib/generators/operation/templates/load.erb +8 -0
  20. data/lib/generators/operation/templates/update.erb +4 -0
  21. data/lib/rails_ops/mixins/model/authorization.rb +1 -3
  22. data/lib/rails_ops/model_mixins/sti_fixes.rb +2 -6
  23. data/lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb +4 -0
  24. data/lib/rails_ops/operation/model.rb +5 -0
  25. data/lib/rails_ops.rb +1 -13
  26. data/rails_ops.gemspec +7 -5
  27. data/test/dummy/config/application.rb +1 -1
  28. data/test/unit/rails_ops/generators/operation_generator_test.rb +84 -0
  29. data/test/unit/rails_ops/operation/model/create_test.rb +16 -0
  30. data/test/unit/rails_ops/operation/model/sti_test.rb +56 -0
  31. data/test/unit/rails_ops/operation/model/update_test.rb +45 -0
  32. metadata +30 -11
  33. data/lib/rails_ops/model_casting.rb +0 -17
  34. data/lib/rails_ops/patches/active_type_patch.rb +0 -52
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 79ec45d11348e1ffbef7fc2c25296ffd0d7aad9368aca809c4affcbfb6ca9139
4
- data.tar.gz: c2199c588e87f2e2327711b56fd9ff27703856c9dfb0a3bc5d694715c717d6d9
3
+ metadata.gz: f12f6449ae4bdcbe6509a31d3cb0fa3539611a1dea21a94ff2bc21c2764ab609
4
+ data.tar.gz: 0a222457b0adada36f507b56ca3dbca67ddd8f9ca1852fe22cdd0b899d8663f4
5
5
  SHA512:
6
- metadata.gz: 9f330c3f01bdd16406f5a4cf9da7a8ab7aa5d39aa6a30870119f40d817a4118bf8d9050744e14794844b36a1d86a75ecdbc5f50680538f712ecb9536aab4c089
7
- data.tar.gz: fedfdc7b9a6eb869a59d7546c39ab71cfa594530ce4e018693bf898e90f4c4de3d7ed504200b846b4929ab11d64bdce3b0357d5b8ef06e053c1cf8477b69a679
6
+ metadata.gz: c5ed687a7bb61559bbac689e6dfa7957d8f0d7a442ac44b5e80de1b318467361949e3fe2490c2daa38e0e75b026d46d57c785bb9e63436d5603c167f916d5973
7
+ data.tar.gz: 8ce961274235ad11ded68887ecae99cd623f100a5f8facf3332f7a21b516555c7b8651a8e75aa30188579dfe9a7f8e384b41a01744feb08099f3eb31b001ebbf
@@ -0,0 +1,17 @@
1
+ name: Rubocop check
2
+ on: push
3
+
4
+ jobs:
5
+ verify:
6
+ name: Test
7
+ runs-on: ubuntu-latest
8
+
9
+ steps:
10
+ - uses: actions/checkout@v1
11
+ - name: Set up Ruby
12
+ uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: 3.0.1
15
+ bundler-cache: true
16
+ - name: Run rubocop
17
+ run: bundle exec rubocop
@@ -1,4 +1,4 @@
1
- name: Build
1
+ name: Unit tests
2
2
 
3
3
  on:
4
4
  push:
@@ -12,16 +12,46 @@ jobs:
12
12
  strategy:
13
13
  fail-fast: false
14
14
  matrix:
15
- ruby-version: ['2.3.0', '2.5.1', '2.6.2', '2.7.1', '3.0.1']
16
-
15
+ include:
16
+ - rails-version: '5.1'
17
+ ruby-version: '2.3.0'
18
+ - rails-version: '5.1'
19
+ ruby-version: '2.5.1'
20
+ - rails-version: '5.2'
21
+ ruby-version: '2.3.0'
22
+ - rails-version: '5.2'
23
+ ruby-version: '2.5.1'
24
+ - rails-version: '5.2'
25
+ ruby-version: '2.6.2'
26
+ - rails-version: '6.0'
27
+ ruby-version: '2.5.1'
28
+ - rails-version: '6.0'
29
+ ruby-version: '2.6.2'
30
+ - rails-version: '6.0'
31
+ ruby-version: '2.7.1'
32
+ - rails-version: '6.1'
33
+ ruby-version: '2.5.1'
34
+ - rails-version: '6.1'
35
+ ruby-version: '2.6.2'
36
+ - rails-version: '6.1'
37
+ ruby-version: '2.7.1'
38
+ - rails-version: '6.1'
39
+ ruby-version: '3.0.1'
40
+ - rails-version: '7.0'
41
+ ruby-version: '2.7.1'
42
+ - rails-version: '7.0'
43
+ ruby-version: '3.0.1'
44
+ - rails-version: '7.0'
45
+ ruby-version: '3.1.0'
46
+ name: Test against Ruby ${{ matrix.ruby-version }} / Rails ${{ matrix.rails-version }}
47
+ env:
48
+ BUNDLE_GEMFILE: ${{ github.workspace }}/gemfiles/rails_${{ matrix.rails-version }}.gemfile
17
49
  steps:
18
50
  - uses: actions/checkout@v2
19
- - name: Set up Ruby
51
+ - name: Set up Ruby ${{ matrix.ruby-version }}
20
52
  uses: ruby/setup-ruby@v1
21
53
  with:
22
54
  ruby-version: ${{ matrix.ruby-version }}
23
55
  bundler-cache: true
24
56
  - name: Run rake tests
25
- run: bundle exec rake test
26
- - name: Run rubocop
27
- run: bundle exec rubocop
57
+ run: bundle exec rake
data/.gitignore CHANGED
@@ -13,3 +13,4 @@
13
13
  /test/dummy/tmp/
14
14
  /test/dummy/log/
15
15
  /test/tmp/
16
+ /gemfiles/*.lock
data/Appraisals ADDED
@@ -0,0 +1,19 @@
1
+ appraise "rails-7.0" do
2
+ gem "rails", "~> 7.0.1"
3
+ end
4
+
5
+ appraise "rails-6.1" do
6
+ gem "rails", "~> 6.1.4"
7
+ end
8
+
9
+ appraise "rails-6.0" do
10
+ gem "rails", "~> 6.0.4"
11
+ end
12
+
13
+ appraise "rails-5.2" do
14
+ gem "rails", "~> 5.2.6"
15
+ end
16
+
17
+ appraise "rails-5.1" do
18
+ gem "rails", "~> 5.1.7"
19
+ end
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.1.29 (2022-02-17)
4
+
5
+ * Fix sti type not correct on creating of record
6
+
7
+ ## 1.1.28 (2022-02-16)
8
+
9
+ * [#22](https://github.com/sitrox/rails_ops/issues/22): Fix error with active_type `>= 2`
10
+
11
+ ## 1.1.27 (2022-02-15)
12
+
13
+ * Add `module` option to `operation` generator
14
+
15
+ ## 1.1.26 (2022-01-18)
16
+
17
+ * #25: Add test matrix for unit tests
18
+
19
+ * Add compatibility for Rails 7 and Ruby 3.1.0
20
+
3
21
  ## 1.1.25 (2022-01-17)
4
22
 
5
23
  * #24: Add generator `operation` that generates a controller, operations and empty
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
- [![Build](https://github.com/sitrox/rails_ops/actions/workflows/ruby.yml/badge.svg)](https://github.com/sitrox/rails_ops/actions/workflows/ruby.yml)
1
+ [![Unit tests](https://github.com/sitrox/rails_ops/actions/workflows/ruby.yml/badge.svg)](https://github.com/sitrox/rails_ops/actions/workflows/ruby.yml)
2
+ [![Rubocop check](https://github.com/sitrox/rails_ops/actions/workflows/rubocop.yml/badge.svg)](https://github.com/sitrox/rails_ops/actions/workflows/rubocop.yml)
2
3
  [![Gem Version](https://badge.fury.io/rb/rails_ops.svg)](https://badge.fury.io/rb/rails_ops)
3
4
 
4
5
  rails_ops
@@ -22,9 +23,21 @@ Requirements & Installation
22
23
 
23
24
  ### Requirements
24
25
 
25
- - RailsOps only works with Rails applications and has been tested with Rails >=
26
- 3.2.0.
27
- - Prior Rails versions may be supported but this has not been verified.
26
+ - RailsOps only works with Rails applications, with the following Rails versions being tested in the CI:
27
+ * Rails 5.1.x
28
+ * Rails 5.2.x
29
+ * Rails 6.0.x
30
+ * Rails 6.1.x
31
+ * Rails 7.0.x
32
+ - Additionally, the following Ruby versions are covered by our unit tests:
33
+ * 2.3.0
34
+ * 2.5.1
35
+ * 2.6.2
36
+ * 2.7.1
37
+ * 3.0.1
38
+ * 3.1.0
39
+ - Please see the [unit test workflow](https://github.com/sitrox/rails_ops/actions/workflows/ruby.yml) for the combinations of the Rails & Ruby versions, as only compatible versions are tested with each other.
40
+ - Prior Rails and Ruby versions may be supported but they are not tested in the CI.
28
41
  - Rails Ops' model operations require ActiveRecord but are database / adapter
29
42
  agnostic
30
43
 
@@ -54,15 +67,16 @@ Requirements & Installation
54
67
  following inside of the `Application` class within your
55
68
  `config/application.rb`:
56
69
 
57
- ```ruby
58
- config.paths = Rails::Paths::Root.new(Rails.root)
59
- config.paths.add 'app/models', eager_load: true
60
- config.paths.add 'app', eager_load: true
70
+ ```ruby
71
+ app_operations = "#{Rails.root}/app/operations"
72
+ ActiveSupport::Dependencies.autoload_paths.delete(app_operations)
73
+
74
+ module Operations; end
75
+ loader = Rails.autoloaders.main
76
+ loader.push_dir(app_operations, namespace: Operations)
77
+ ```
61
78
 
62
- # WARNING: Skip this if you have any script files in your lib/ directory
63
- # that will run when loaded.
64
- config.paths.add 'lib', eager_load: true
65
- ```
79
+ Taken from [this github issues comment](https://github.com/rails/rails/issues/40126#issuecomment-816275285).
66
80
 
67
81
  Operation Basics
68
82
  ----------------
@@ -1533,6 +1547,36 @@ flags:
1533
1547
 
1534
1548
  Or if you want to skip them all: `--only-operations`.
1535
1549
 
1550
+ You can also add a module as a namespace, all generated files will be put in
1551
+ the proper subfolders and modules by using the `--module` option.
1552
+
1553
+ As an example:
1554
+
1555
+ ```ruby
1556
+ rails g operation User --module Admin
1557
+ ```
1558
+
1559
+ This will generate the following operations:
1560
+
1561
+ * `app/operations/admin/user/load.rb`
1562
+ * `app/operations/admin/user/create.rb`
1563
+ * `app/operations/admin/user/update.rb`
1564
+ * `app/operations/admin/user/destroy.rb`
1565
+
1566
+ These operations will be namespaced in the `Admin` module, e.g. `app/operations/admin/user/load.rb` will define `Operations::Admin::User::Load`.
1567
+
1568
+ It will also generate the controller `app/controllers/admin/users_controller.rb` and the following
1569
+ empty view files:
1570
+
1571
+ * `app/views/admin/users/index.html.haml`
1572
+ * `app/views/admin/users/show.html.haml`
1573
+ * `app/views/admin/users/new.html.haml`
1574
+ * `app/views/admin/users/edit.html.haml`
1575
+
1576
+ Both lower- and uppercase will generate the same files (i.e. `--module Admin` and `--module admin` are equal).
1577
+
1578
+ You can even nest the generated files deeper, `--module Admin::Foo` and `--module admin/foo` will both work.
1579
+
1536
1580
  Of course, at this point, the operations will need some adaptions, especially the
1537
1581
  [parameter schemas](#validating-params), and the controllers need the logic for the
1538
1582
  success and failure cases, as this depends on your application.
data/Rakefile CHANGED
@@ -15,6 +15,7 @@ task :gemspec do
15
15
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
16
16
  spec.require_paths = ['lib']
17
17
 
18
+ spec.add_development_dependency 'appraisal'
18
19
  spec.add_development_dependency 'bundler'
19
20
  spec.add_development_dependency 'rake'
20
21
  spec.add_development_dependency 'sqlite3'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.25
1
+ 1.1.29
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.7"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.2.6"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.0.4"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 6.1.4"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 7.0.1"
6
+
7
+ gemspec path: "../"
@@ -5,13 +5,23 @@ class OperationGenerator < Rails::Generators::NamedBase
5
5
  class_option :skip_views, type: :boolean, desc: "Don't add the views."
6
6
  class_option :skip_routes, type: :boolean, desc: "Don't add routes to config/routes.rb."
7
7
  class_option :only_operations, type: :boolean, desc: 'Only add the operations. This is equal to specifying --skip-controller --skip-routes --skip-views'
8
+ class_option :module, type: :string, desc: 'Add the operations in a module, e.g. "Admin" results in namespacing everything in the Admin module'
8
9
 
9
10
  def add_operations
10
11
  @class_name = name.classify
11
12
  @underscored_name = name.underscore
12
13
  @underscored_pluralized_name = name.underscore.pluralize
13
14
 
14
- operations_path = "app/operations/#{@underscored_name}"
15
+ operations_path = 'app/operations/'
16
+
17
+ if options[:module].present?
18
+ @module_name = options[:module].classify
19
+ @module_underscored_name = @module_name.underscore
20
+
21
+ operations_path += "#{@module_underscored_name}/"
22
+ end
23
+
24
+ operations_path += @underscored_name.to_s
15
25
 
16
26
  template 'load.erb', "#{operations_path}/load.rb"
17
27
  template 'create.erb', "#{operations_path}/create.rb"
@@ -22,7 +32,11 @@ class OperationGenerator < Rails::Generators::NamedBase
22
32
  def add_controller
23
33
  return if options[:skip_controller] || options[:only_operations]
24
34
 
25
- controller_file_path = "app/controllers/#{@underscored_pluralized_name}_controller.rb"
35
+ controller_file_path = 'app/controllers/'
36
+ if @module_underscored_name.present?
37
+ controller_file_path += "#{@module_underscored_name}/"
38
+ end
39
+ controller_file_path += "#{@underscored_pluralized_name}_controller.rb"
26
40
  @controller_name = "#{@class_name.pluralize}Controller"
27
41
 
28
42
  template 'controller.erb', controller_file_path
@@ -31,7 +45,11 @@ class OperationGenerator < Rails::Generators::NamedBase
31
45
  def add_views
32
46
  return if options[:skip_views] || options[:only_operations]
33
47
 
34
- views_folder = "app/views/#{@underscored_pluralized_name}"
48
+ views_folder = 'app/views/'
49
+ if @module_underscored_name.present?
50
+ views_folder += "#{@module_underscored_name}/"
51
+ end
52
+ views_folder += @underscored_pluralized_name.to_s
35
53
 
36
54
  %w(index show new edit).each do |view|
37
55
  template 'view.erb', "#{views_folder}/#{view}.html.haml"
@@ -1,16 +1,18 @@
1
- class <%= @controller_name %> < ApplicationController
1
+ <%
2
+ controller_code = <<-RUBY
3
+ class #{@controller_name} < ApplicationController
2
4
  def index; end
3
5
 
4
6
  def show
5
- op Operations::<%= @class_name %>::Load
7
+ op Operations#{ "::#{@module_name}" if @module_name.present? }::#{@class_name}::Load
6
8
  end
7
9
 
8
10
  def new
9
- op Operations::<%= @class_name %>::Create
11
+ op Operations#{ "::#{@module_name}" if @module_name.present? }::#{@class_name}::Create
10
12
  end
11
13
 
12
14
  def create
13
- if run Operations::<%= @class_name %>::Create
15
+ if run Operations#{ "::#{@module_name}" if @module_name.present? }::#{@class_name}::Create
14
16
  # handle successful case
15
17
  else
16
18
  # handle error case
@@ -18,11 +20,11 @@ class <%= @controller_name %> < ApplicationController
18
20
  end
19
21
 
20
22
  def edit
21
- op Operations::<%= @class_name %>::Update
23
+ op Operations#{ "::#{@module_name}" if @module_name.present? }::#{@class_name}::Update
22
24
  end
23
25
 
24
26
  def update
25
- if run Operations::<%= @class_name %>::Update
27
+ if run Operations#{ "::#{@module_name}" if @module_name.present? }::#{@class_name}::Update
26
28
  # handle successful case
27
29
  else
28
30
  # handle error case
@@ -30,10 +32,25 @@ class <%= @controller_name %> < ApplicationController
30
32
  end
31
33
 
32
34
  def destroy
33
- if run Operations::<%= @class_name %>::Destroy
35
+ if run Operations#{ "::#{@module_name}" if @module_name.present? }::#{@class_name}::Destroy
34
36
  # handle successful case
35
37
  else
36
38
  # handle error case
37
39
  end
38
40
  end
39
41
  end
42
+ RUBY
43
+ -%>
44
+ <% if @module_name.present? -%>
45
+ module <%= @module_name %>
46
+ <% controller_code.split("\n").each do |line| -%>
47
+ <% if line.blank? -%>
48
+
49
+ <% else -%>
50
+ <%= line %>
51
+ <% end -%>
52
+ <% end -%>
53
+ end
54
+ <% else -%>
55
+ <%= controller_code -%>
56
+ <% end -%>
@@ -1,4 +1,8 @@
1
+ <% if @module_name.present? -%>
2
+ module Operations::<%= @module_name %>::<%= @class_name %>
3
+ <% else -%>
1
4
  module Operations::<%= @class_name %>
5
+ <% end -%>
2
6
  class Create < RailsOps::Operation::Model::Create
3
7
  schema3 do
4
8
  hsh? :<%= @underscored_name %> do
@@ -1,4 +1,8 @@
1
+ <% if @module_name.present? -%>
2
+ module Operations::<%= @module_name %>::<%= @class_name %>
3
+ <% else -%>
1
4
  module Operations::<%= @class_name %>
5
+ <% end -%>
2
6
  class Destroy < RailsOps::Operation::Model::Destroy
3
7
  schema3 do
4
8
  str! :id
@@ -1,5 +1,13 @@
1
+ <% if @module_name.present? -%>
2
+ module Operations::<%= @module_name %>::<%= @class_name %>
3
+ <% else -%>
1
4
  module Operations::<%= @class_name %>
5
+ <% end -%>
2
6
  class Load < RailsOps::Operation::Model::Load
7
+ schema3 do
8
+ str! :id
9
+ end
10
+
3
11
  model ::<%= @class_name %>
4
12
  end
5
13
  end
@@ -1,4 +1,8 @@
1
+ <% if @module_name.present? -%>
2
+ module Operations::<%= @module_name %>::<%= @class_name %>
3
+ <% else -%>
1
4
  module Operations::<%= @class_name %>
5
+ <% end -%>
2
6
  class Update < RailsOps::Operation::Model::Update
3
7
  schema3 do
4
8
  str! :id
@@ -70,8 +70,6 @@ module RailsOps::Mixins::Model::Authorization
70
70
  # Cast {ActiveType::Record} classes or instances to regular AR models in order
71
71
  # for cancan(can) to work properly. Classes and instances that are no active
72
72
  # type records will be returned as-is.
73
- #
74
- # TODO: Use ModelCasting module instead?
75
73
  def cast_model_for_authorization(model_class_or_instance)
76
74
  if model_class_or_instance.is_a?(Class)
77
75
  if model_class_or_instance.respond_to?(:extended_record_base_class)
@@ -80,7 +78,7 @@ module RailsOps::Mixins::Model::Authorization
80
78
  return model_class_or_instance
81
79
  end
82
80
  elsif model_class_or_instance.class.respond_to?(:extended_record_base_class)
83
- return ActiveType.cast(model_class_or_instance, model_class_or_instance.class.extended_record_base_class)
81
+ model_class_or_instance.becomes(model_class_or_instance.class.extended_record_base_class)
84
82
  else
85
83
  model_class_or_instance
86
84
  end
@@ -5,15 +5,11 @@ module RailsOps
5
5
 
6
6
  class_methods do
7
7
  def finder_needs_type_condition?
8
- superclass.finder_needs_type_condition?
9
- end
10
-
11
- def descendants
12
- superclass.descendants
8
+ base_class.finder_needs_type_condition?
13
9
  end
14
10
 
15
11
  def name
16
- superclass.name
12
+ base_class.name
17
13
  end
18
14
  end
19
15
  end
@@ -6,4 +6,8 @@ class RailsOps::ModelMixins::VirtualAttributes::VirtualColumnWrapper
6
6
  def type
7
7
  @virtual_column.instance_variable_get(:@type_caster).instance_variable_get(:@type)
8
8
  end
9
+
10
+ def default_function
11
+ nil
12
+ end
9
13
  end
@@ -134,6 +134,11 @@ class RailsOps::Operation::Model < RailsOps::Operation
134
134
  attributes = attributes.except(*self.class.nested_model_param_keys)
135
135
  end
136
136
 
137
+ # Assign the "type" attribute if we need it
138
+ if _model_class.superclass.finder_needs_type_condition?
139
+ attributes[_model_class.inheritance_column] ||= _model_class.superclass.name
140
+ end
141
+
137
142
  # Do nothing if there are no attributes to assign
138
143
  return if attributes.nil? || attributes.empty?
139
144
 
data/lib/rails_ops.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'active_type'
1
2
  require 'schemacop'
2
3
  require 'request_store'
3
4
 
@@ -46,18 +47,6 @@ module RailsOps
46
47
  end
47
48
  end
48
49
 
49
- # ---------------------------------------------------------------
50
- # Require Gem active_type and monkey patch
51
- # ---------------------------------------------------------------
52
- require 'active_type'
53
- require 'active_type/type_caster'
54
- require 'rails_ops/patches/active_type_patch'
55
-
56
- # ---------------------------------------------------------------
57
- # Require Schemacop
58
- # ---------------------------------------------------------------
59
- require 'schemacop'
60
-
61
50
  # ---------------------------------------------------------------
62
51
  # Require RailsOps
63
52
  # ---------------------------------------------------------------
@@ -84,7 +73,6 @@ require 'rails_ops/mixins/require_context.rb'
84
73
  require 'rails_ops/mixins/routes.rb'
85
74
  require 'rails_ops/mixins/schema_validation.rb'
86
75
  require 'rails_ops/mixins/sub_ops.rb'
87
- require 'rails_ops/model_casting.rb'
88
76
  require 'rails_ops/model_mixins.rb'
89
77
  require 'rails_ops/model_mixins/ar_extension.rb'
90
78
  require 'rails_ops/model_mixins/parent_op.rb'
data/rails_ops.gemspec CHANGED
@@ -1,16 +1,16 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: rails_ops 1.1.25 ruby lib
2
+ # stub: rails_ops 1.1.29 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "rails_ops".freeze
6
- s.version = "1.1.25"
6
+ s.version = "1.1.29"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Sitrox".freeze]
11
- s.date = "2022-01-17"
12
- s.files = [".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "lib/generators/operation/USAGE".freeze, "lib/generators/operation/operation_generator.rb".freeze, "lib/generators/operation/templates/controller.erb".freeze, "lib/generators/operation/templates/create.erb".freeze, "lib/generators/operation/templates/destroy.erb".freeze, "lib/generators/operation/templates/load.erb".freeze, "lib/generators/operation/templates/update.erb".freeze, "lib/generators/operation/templates/view.erb".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/param_authorization.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_casting.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/sti_fixes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/model_mixins/virtual_model_name.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/patches/active_type_patch.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/nesting.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
13
- s.rubygems_version = "3.2.22".freeze
11
+ s.date = "2022-02-17"
12
+ s.files = [".github/workflows/rubocop.yml".freeze, ".github/workflows/ruby.yml".freeze, ".gitignore".freeze, ".releaser_config".freeze, ".rubocop.yml".freeze, "Appraisals".freeze, "CHANGELOG.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "VERSION".freeze, "gemfiles/rails_5.1.gemfile".freeze, "gemfiles/rails_5.2.gemfile".freeze, "gemfiles/rails_6.0.gemfile".freeze, "gemfiles/rails_6.1.gemfile".freeze, "gemfiles/rails_7.0.gemfile".freeze, "lib/generators/operation/USAGE".freeze, "lib/generators/operation/operation_generator.rb".freeze, "lib/generators/operation/templates/controller.erb".freeze, "lib/generators/operation/templates/create.erb".freeze, "lib/generators/operation/templates/destroy.erb".freeze, "lib/generators/operation/templates/load.erb".freeze, "lib/generators/operation/templates/update.erb".freeze, "lib/generators/operation/templates/view.erb".freeze, "lib/rails_ops.rb".freeze, "lib/rails_ops/authorization_backend/abstract.rb".freeze, "lib/rails_ops/authorization_backend/can_can_can.rb".freeze, "lib/rails_ops/configuration.rb".freeze, "lib/rails_ops/context.rb".freeze, "lib/rails_ops/controller_mixin.rb".freeze, "lib/rails_ops/exceptions.rb".freeze, "lib/rails_ops/hooked_job.rb".freeze, "lib/rails_ops/hookup.rb".freeze, "lib/rails_ops/hookup/dsl.rb".freeze, "lib/rails_ops/hookup/dsl_validator.rb".freeze, "lib/rails_ops/hookup/hook.rb".freeze, "lib/rails_ops/log_subscriber.rb".freeze, "lib/rails_ops/mixins.rb".freeze, "lib/rails_ops/mixins/authorization.rb".freeze, "lib/rails_ops/mixins/log_settings.rb".freeze, "lib/rails_ops/mixins/model.rb".freeze, "lib/rails_ops/mixins/model/authorization.rb".freeze, "lib/rails_ops/mixins/model/nesting.rb".freeze, "lib/rails_ops/mixins/param_authorization.rb".freeze, "lib/rails_ops/mixins/policies.rb".freeze, "lib/rails_ops/mixins/require_context.rb".freeze, "lib/rails_ops/mixins/routes.rb".freeze, "lib/rails_ops/mixins/schema_validation.rb".freeze, "lib/rails_ops/mixins/sub_ops.rb".freeze, "lib/rails_ops/model_mixins.rb".freeze, "lib/rails_ops/model_mixins/ar_extension.rb".freeze, "lib/rails_ops/model_mixins/parent_op.rb".freeze, "lib/rails_ops/model_mixins/sti_fixes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes.rb".freeze, "lib/rails_ops/model_mixins/virtual_attributes/virtual_column_wrapper.rb".freeze, "lib/rails_ops/model_mixins/virtual_has_one.rb".freeze, "lib/rails_ops/model_mixins/virtual_model_name.rb".freeze, "lib/rails_ops/operation.rb".freeze, "lib/rails_ops/operation/model.rb".freeze, "lib/rails_ops/operation/model/create.rb".freeze, "lib/rails_ops/operation/model/destroy.rb".freeze, "lib/rails_ops/operation/model/load.rb".freeze, "lib/rails_ops/operation/model/update.rb".freeze, "lib/rails_ops/profiler.rb".freeze, "lib/rails_ops/profiler/node.rb".freeze, "lib/rails_ops/railtie.rb".freeze, "lib/rails_ops/scoped_env.rb".freeze, "lib/rails_ops/virtual_model.rb".freeze, "rails_ops.gemspec".freeze, "test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/nesting.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
13
+ s.rubygems_version = "3.1.2".freeze
14
14
  s.summary = "An operations service layer for rails projects.".freeze
15
15
  s.test_files = ["test/db/models.rb".freeze, "test/db/schema.rb".freeze, "test/dummy/Rakefile".freeze, "test/dummy/app/assets/config/manifest.js".freeze, "test/dummy/app/assets/images/.keep".freeze, "test/dummy/app/assets/javascripts/application.js".freeze, "test/dummy/app/assets/javascripts/cable.js".freeze, "test/dummy/app/assets/javascripts/channels/.keep".freeze, "test/dummy/app/assets/stylesheets/application.css".freeze, "test/dummy/app/channels/application_cable/channel.rb".freeze, "test/dummy/app/channels/application_cable/connection.rb".freeze, "test/dummy/app/controllers/application_controller.rb".freeze, "test/dummy/app/controllers/concerns/.keep".freeze, "test/dummy/app/helpers/application_helper.rb".freeze, "test/dummy/app/jobs/application_job.rb".freeze, "test/dummy/app/mailers/application_mailer.rb".freeze, "test/dummy/app/models/animal.rb".freeze, "test/dummy/app/models/application_record.rb".freeze, "test/dummy/app/models/bird.rb".freeze, "test/dummy/app/models/cat.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/dog.rb".freeze, "test/dummy/app/models/flower.rb".freeze, "test/dummy/app/models/group.rb".freeze, "test/dummy/app/models/nightingale.rb".freeze, "test/dummy/app/models/phoenix.rb".freeze, "test/dummy/app/models/user.rb".freeze, "test/dummy/app/views/layouts/application.html.erb".freeze, "test/dummy/app/views/layouts/mailer.html.erb".freeze, "test/dummy/app/views/layouts/mailer.text.erb".freeze, "test/dummy/bin/bundle".freeze, "test/dummy/bin/rails".freeze, "test/dummy/bin/rake".freeze, "test/dummy/bin/setup".freeze, "test/dummy/bin/update".freeze, "test/dummy/bin/yarn".freeze, "test/dummy/config.ru".freeze, "test/dummy/config/application.rb".freeze, "test/dummy/config/boot.rb".freeze, "test/dummy/config/cable.yml".freeze, "test/dummy/config/database.yml".freeze, "test/dummy/config/environment.rb".freeze, "test/dummy/config/environments/development.rb".freeze, "test/dummy/config/environments/production.rb".freeze, "test/dummy/config/environments/test.rb".freeze, "test/dummy/config/initializers/application_controller_renderer.rb".freeze, "test/dummy/config/initializers/assets.rb".freeze, "test/dummy/config/initializers/backtrace_silencers.rb".freeze, "test/dummy/config/initializers/cookies_serializer.rb".freeze, "test/dummy/config/initializers/filter_parameter_logging.rb".freeze, "test/dummy/config/initializers/inflections.rb".freeze, "test/dummy/config/initializers/mime_types.rb".freeze, "test/dummy/config/initializers/rails_ops.rb".freeze, "test/dummy/config/initializers/wrap_parameters.rb".freeze, "test/dummy/config/locales/en.yml".freeze, "test/dummy/config/puma.rb".freeze, "test/dummy/config/routes.rb".freeze, "test/dummy/config/secrets.yml".freeze, "test/dummy/config/spring.rb".freeze, "test/dummy/db/schema.rb".freeze, "test/dummy/lib/assets/.keep".freeze, "test/dummy/log/.keep".freeze, "test/dummy/package.json".freeze, "test/dummy/public/404.html".freeze, "test/dummy/public/422.html".freeze, "test/dummy/public/500.html".freeze, "test/dummy/public/apple-touch-icon-precomposed.png".freeze, "test/dummy/public/apple-touch-icon.png".freeze, "test/dummy/public/favicon.ico".freeze, "test/dummy/tmp/.keep".freeze, "test/test_helper.rb".freeze, "test/unit/rails_ops/generators/operation_generator_test.rb".freeze, "test/unit/rails_ops/mixins/model/nesting.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/load_test.rb".freeze, "test/unit/rails_ops/operation/model/sti_test.rb".freeze, "test/unit/rails_ops/operation/model/update_test.rb".freeze, "test/unit/rails_ops/operation/model_test.rb".freeze, "test/unit/rails_ops/operation/update_auth_test.rb".freeze, "test/unit/rails_ops/operation/update_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze]
16
16
 
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  end
20
20
 
21
21
  if s.respond_to? :add_runtime_dependency then
22
+ s.add_development_dependency(%q<appraisal>.freeze, [">= 0"])
22
23
  s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
23
24
  s.add_development_dependency(%q<rake>.freeze, [">= 0"])
24
25
  s.add_development_dependency(%q<sqlite3>.freeze, [">= 0"])
@@ -33,6 +34,7 @@ Gem::Specification.new do |s|
33
34
  s.add_runtime_dependency(%q<request_store>.freeze, [">= 0"])
34
35
  s.add_runtime_dependency(%q<schemacop>.freeze, [">= 2.4.2", "<= 3.1"])
35
36
  else
37
+ s.add_dependency(%q<appraisal>.freeze, [">= 0"])
36
38
  s.add_dependency(%q<bundler>.freeze, [">= 0"])
37
39
  s.add_dependency(%q<rake>.freeze, [">= 0"])
38
40
  s.add_dependency(%q<sqlite3>.freeze, [">= 0"])
@@ -19,7 +19,7 @@ require 'rails_ops'
19
19
  module Dummy
20
20
  class Application < Rails::Application
21
21
  # Initialize configuration defaults for originally generated Rails version.
22
- config.load_defaults 5.1
22
+ config.load_defaults "#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}"
23
23
 
24
24
  # Settings in config/environments/* take precedence over those specified here.
25
25
  # Application configuration should go into files in config/initializers
@@ -125,6 +125,90 @@ class OperationGeneratorTest < Rails::Generators::TestCase
125
125
  assert_routes
126
126
  end
127
127
 
128
+ def test_module_name
129
+ optiongroups = [['User', '--module=Admin'], ['User', '--module=admin']]
130
+
131
+ optiongroups.each do |optiongroup|
132
+ run_generator optiongroup
133
+
134
+ # Check that namespaced operations are generated
135
+ assert_file 'app/operations/admin/user/create.rb' do |operation|
136
+ assert_match(/module Operations::Admin::User/, operation)
137
+ assert_match(/class Create < RailsOps::Operation::Model::Create/, operation)
138
+ assert_match(/model ::User/, operation)
139
+ end
140
+ assert_file 'app/operations/admin/user/destroy.rb' do |operation|
141
+ assert_match(/module Operations::Admin::User/, operation)
142
+ assert_match(/class Destroy < RailsOps::Operation::Model::Destroy/, operation)
143
+ assert_match(/model ::User/, operation)
144
+ end
145
+ assert_file 'app/operations/admin/user/load.rb' do |operation|
146
+ assert_match(/module Operations::Admin::User/, operation)
147
+ assert_match(/class Load < RailsOps::Operation::Model::Load/, operation)
148
+ assert_match(/model ::User/, operation)
149
+ end
150
+ assert_file 'app/operations/admin/user/update.rb' do |operation|
151
+ assert_match(/module Operations::Admin::User/, operation)
152
+ assert_match(/class Update < RailsOps::Operation::Model::Update/, operation)
153
+ assert_match(/model ::User/, operation)
154
+ end
155
+
156
+ # Check that views are generated
157
+ %w(index show new edit).each do |view|
158
+ assert_file "app/views/admin/users/#{view}.html.haml"
159
+ end
160
+
161
+ # Check that the controller is generated
162
+ assert_file 'app/controllers/admin/users_controller.rb' do |controller|
163
+ assert_match(/module Admin/, controller)
164
+ assert_match(/class UsersController < ApplicationController/, controller)
165
+ end
166
+
167
+ # Check that the routes entry is added
168
+ assert_routes
169
+ end
170
+ end
171
+
172
+ def test_nested_module_name
173
+ run_generator ['User', '--module=admin/foo']
174
+
175
+ # Check that namespaced operations are generated
176
+ assert_file 'app/operations/admin/foo/user/create.rb' do |operation|
177
+ assert_match(/module Operations::Admin::Foo::User/, operation)
178
+ assert_match(/class Create < RailsOps::Operation::Model::Create/, operation)
179
+ assert_match(/model ::User/, operation)
180
+ end
181
+ assert_file 'app/operations/admin/foo/user/destroy.rb' do |operation|
182
+ assert_match(/module Operations::Admin::Foo::User/, operation)
183
+ assert_match(/class Destroy < RailsOps::Operation::Model::Destroy/, operation)
184
+ assert_match(/model ::User/, operation)
185
+ end
186
+ assert_file 'app/operations/admin/foo/user/load.rb' do |operation|
187
+ assert_match(/module Operations::Admin::Foo::User/, operation)
188
+ assert_match(/class Load < RailsOps::Operation::Model::Load/, operation)
189
+ assert_match(/model ::User/, operation)
190
+ end
191
+ assert_file 'app/operations/admin/foo/user/update.rb' do |operation|
192
+ assert_match(/module Operations::Admin::Foo::User/, operation)
193
+ assert_match(/class Update < RailsOps::Operation::Model::Update/, operation)
194
+ assert_match(/model ::User/, operation)
195
+ end
196
+
197
+ # Check that views are generated
198
+ %w(index show new edit).each do |view|
199
+ assert_file "app/views/admin/foo/users/#{view}.html.haml"
200
+ end
201
+
202
+ # Check that the controller is generated
203
+ assert_file 'app/controllers/admin/foo/users_controller.rb' do |controller|
204
+ assert_match(/module Admin::Foo/, controller)
205
+ assert_match(/class UsersController < ApplicationController/, controller)
206
+ end
207
+
208
+ # Check that the routes entry is added
209
+ assert_routes
210
+ end
211
+
128
212
  private
129
213
 
130
214
  def assert_operations
@@ -7,6 +7,22 @@ class RailsOps::Operation::Model::CreateTest < ActiveSupport::TestCase
7
7
  model Group
8
8
  end
9
9
 
10
+ ATTR_OP = Class.new(RailsOps::Operation::Model::Create) do
11
+ model ::Group do
12
+ attribute :long_group_name
13
+ end
14
+ end
15
+
16
+ def test_attribute
17
+ op = ATTR_OP.run!(group: { name: 'Test', color: 'red', long_group_name: 'Testgroup for extended testing' })
18
+
19
+ assert_equal 'Test', op.model.name
20
+ assert_equal 'red', op.model.color
21
+ assert_equal 'Testgroup for extended testing', op.model.long_group_name
22
+ assert op.model.persisted?
23
+ refute op.model.changed?
24
+ end
25
+
10
26
  def test_basic
11
27
  op = BASIC_OP.run!(group: { name: 'test', color: 'red' })
12
28
 
@@ -34,6 +34,30 @@ class RailsOps::Operation::Model::StiTest < ActiveSupport::TestCase
34
34
  end
35
35
  end
36
36
 
37
+ UPDATE_DOG_OP = Class.new(RailsOps::Operation::Model::Update) do
38
+ model Dog do
39
+ attribute :my_virtual_dog_name
40
+ end
41
+ end
42
+
43
+ CREATE_DOG_OP = Class.new(RailsOps::Operation::Model::Create) do
44
+ model Dog do
45
+ attribute :my_virtual_dog_name
46
+ end
47
+ end
48
+
49
+ UPDATE_PHOENIX_OP = Class.new(RailsOps::Operation::Model::Update) do
50
+ model Phoenix do
51
+ attribute :my_virtual_phoenix_name
52
+ end
53
+ end
54
+
55
+ CREATE_PHOENIX_OP = Class.new(RailsOps::Operation::Model::Create) do
56
+ model Phoenix do
57
+ attribute :my_virtual_phoenix_name
58
+ end
59
+ end
60
+
37
61
  def test_load_animal
38
62
  model = LOAD_ANIMAL_OP.new(id: @dog.id).model
39
63
  assert_equal 'Dog', model.type
@@ -67,4 +91,36 @@ class RailsOps::Operation::Model::StiTest < ActiveSupport::TestCase
67
91
  assert model.is_a?(LOAD_PHOENIX_OP.model)
68
92
  assert_nothing_raised { model.my_virtual_phoenix_name = 'Lenny' }
69
93
  end
94
+
95
+ def test_create_dog
96
+ op = CREATE_DOG_OP.new.run!
97
+
98
+ assert_equal 'Dog', op.model.type
99
+ assert op.model.is_a?(CREATE_DOG_OP.model)
100
+ assert_nothing_raised { op.model.my_virtual_dog_name = 'Lenny' }
101
+ end
102
+
103
+ def test_update_dog
104
+ op = UPDATE_DOG_OP.new(id: @dog.id).run!
105
+
106
+ assert_equal 'Dog', op.model.type
107
+ assert op.model.is_a?(UPDATE_DOG_OP.model)
108
+ assert_nothing_raised { op.model.my_virtual_dog_name = 'Lenny' }
109
+ end
110
+
111
+ def test_create_phoenix
112
+ op = CREATE_PHOENIX_OP.new.run!
113
+
114
+ assert_equal 'Phoenix', op.model.type
115
+ assert op.model.is_a?(CREATE_PHOENIX_OP.model)
116
+ assert_nothing_raised { op.model.my_virtual_phoenix_name = 'Lenny' }
117
+ end
118
+
119
+ def test_update_phoenix
120
+ op = UPDATE_PHOENIX_OP.new(id: @phoenix.id).run!
121
+
122
+ assert_equal 'Phoenix', op.model.type
123
+ assert op.model.is_a?(UPDATE_PHOENIX_OP.model)
124
+ assert_nothing_raised { op.model.my_virtual_phoenix_name = 'Lenny' }
125
+ end
70
126
  end
@@ -10,6 +10,29 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
10
10
  FLOWER_OP = Class.new(RailsOps::Operation::Model::Update) do
11
11
  model Flower do
12
12
  attribute :color
13
+
14
+ def optimal_bpm
15
+ 174
16
+ end
17
+ end
18
+ end
19
+
20
+ SECOND_FLOWER_OP = Class.new(RailsOps::Operation::Model::Update) do
21
+ model Flower do
22
+ validate :planted_is_true
23
+ before_update :do_calculation
24
+
25
+ def response_to_everything
26
+ 42
27
+ end
28
+
29
+ def planted_is_true
30
+ errors.add(:planted, 'Needs to be true') unless planted?
31
+ end
32
+
33
+ def do_calculation
34
+ 1 + 1
35
+ end
13
36
  end
14
37
  end
15
38
 
@@ -45,4 +68,26 @@ class RailsOps::Operation::Model::UpdateTest < ActiveSupport::TestCase
45
68
  op.model
46
69
  end
47
70
  end
71
+
72
+ def test_validation
73
+ flower = Flower.create!(planted: true)
74
+ assert flower.planted
75
+
76
+ # This works fine
77
+ op1 = SECOND_FLOWER_OP.run!(id: flower.id, flower: { planted: true })
78
+ assert_equal 42, op1.model.response_to_everything
79
+ assert op1.model.respond_to?(:response_to_everything)
80
+ assert op1.model.respond_to?(:planted_is_true)
81
+ refute op1.model.respond_to?(:optimal_bpm)
82
+
83
+ # This fails in Rails 7 and ruby 3.1.0, as the validation seems to be triggered
84
+ # in this as well, even though the validation is not defined here
85
+ # More interesting, it seems that only the validation and the before_update
86
+ # are handled incorrectly, the other methods work fine
87
+ op2 = FLOWER_OP.run!(id: flower.id, flower: { planted: true })
88
+ assert_equal 174, op2.model.optimal_bpm
89
+ assert op2.model.respond_to?(:optimal_bpm)
90
+ refute op2.model.respond_to?(:planted_is_true)
91
+ refute op2.model.respond_to?(:response_to_everything)
92
+ end
48
93
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_ops
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.25
4
+ version: 1.1.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sitrox
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-01-17 00:00:00.000000000 Z
11
+ date: 2022-02-17 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: appraisal
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -198,22 +212,29 @@ dependencies:
198
212
  - - "<="
199
213
  - !ruby/object:Gem::Version
200
214
  version: '3.1'
201
- description:
202
- email:
215
+ description:
216
+ email:
203
217
  executables: []
204
218
  extensions: []
205
219
  extra_rdoc_files: []
206
220
  files:
221
+ - ".github/workflows/rubocop.yml"
207
222
  - ".github/workflows/ruby.yml"
208
223
  - ".gitignore"
209
224
  - ".releaser_config"
210
225
  - ".rubocop.yml"
226
+ - Appraisals
211
227
  - CHANGELOG.md
212
228
  - Gemfile
213
229
  - LICENSE
214
230
  - README.md
215
231
  - Rakefile
216
232
  - VERSION
233
+ - gemfiles/rails_5.1.gemfile
234
+ - gemfiles/rails_5.2.gemfile
235
+ - gemfiles/rails_6.0.gemfile
236
+ - gemfiles/rails_6.1.gemfile
237
+ - gemfiles/rails_7.0.gemfile
217
238
  - lib/generators/operation/USAGE
218
239
  - lib/generators/operation/operation_generator.rb
219
240
  - lib/generators/operation/templates/controller.erb
@@ -247,7 +268,6 @@ files:
247
268
  - lib/rails_ops/mixins/routes.rb
248
269
  - lib/rails_ops/mixins/schema_validation.rb
249
270
  - lib/rails_ops/mixins/sub_ops.rb
250
- - lib/rails_ops/model_casting.rb
251
271
  - lib/rails_ops/model_mixins.rb
252
272
  - lib/rails_ops/model_mixins/ar_extension.rb
253
273
  - lib/rails_ops/model_mixins/parent_op.rb
@@ -262,7 +282,6 @@ files:
262
282
  - lib/rails_ops/operation/model/destroy.rb
263
283
  - lib/rails_ops/operation/model/load.rb
264
284
  - lib/rails_ops/operation/model/update.rb
265
- - lib/rails_ops/patches/active_type_patch.rb
266
285
  - lib/rails_ops/profiler.rb
267
286
  - lib/rails_ops/profiler/node.rb
268
287
  - lib/rails_ops/railtie.rb
@@ -351,10 +370,10 @@ files:
351
370
  - test/unit/rails_ops/operation/update_auth_test.rb
352
371
  - test/unit/rails_ops/operation/update_lazy_auth_test.rb
353
372
  - test/unit/rails_ops/operation_test.rb
354
- homepage:
373
+ homepage:
355
374
  licenses: []
356
375
  metadata: {}
357
- post_install_message:
376
+ post_install_message:
358
377
  rdoc_options: []
359
378
  require_paths:
360
379
  - lib
@@ -369,8 +388,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
369
388
  - !ruby/object:Gem::Version
370
389
  version: '0'
371
390
  requirements: []
372
- rubygems_version: 3.2.22
373
- signing_key:
391
+ rubygems_version: 3.1.2
392
+ signing_key:
374
393
  specification_version: 4
375
394
  summary: An operations service layer for rails projects.
376
395
  test_files:
@@ -1,17 +0,0 @@
1
- module RailsOps::ModelCasting
2
- def self.cast(model)
3
- if model.class.respond_to?(:extended_record_base_class)
4
- return ActiveType.cast(model, model.class.extended_record_base_class)
5
- else
6
- return model
7
- end
8
- end
9
-
10
- def self.original_class_for(model_class)
11
- if model_class.respond_to?(:extended_record_base_class)
12
- return model_class.extended_record_base_class
13
- else
14
- return model_class
15
- end
16
- end
17
- end
@@ -1,52 +0,0 @@
1
- # Internal reference: #25564
2
- module ActiveType
3
- class TypeCaster
4
- def type_cast_from_user(value)
5
- # For some reason, Rails defines additional type casting logic
6
- # outside the classes that have that responsibility.
7
- case @type
8
- when :integer
9
- if value == ''
10
- nil
11
- else
12
- native_type_cast_from_user(value)
13
- end
14
- when :timestamp, :datetime
15
- time = native_type_cast_from_user(value)
16
- if time && ActiveRecord::Base.time_zone_aware_attributes
17
- time = ActiveSupport::TimeWithZone.new(nil, Time.zone, time)
18
- end
19
- time
20
- when Integer.class
21
- if value == ''
22
- nil
23
- else
24
- value.to_i
25
- end
26
- else
27
- native_type_cast_from_user(value)
28
- end
29
- end
30
-
31
- module NativeCasters
32
- class DelegateToType
33
- def initialize(type, connection)
34
- # The specified type (e.g. "string") may not necessary match the
35
- # native type ("varchar") expected by the connection adapter.
36
- # PostgreSQL is one of these. Perform a translation if the adapter
37
- # supports it (but don't turn a mysql boolean into a tinyint).
38
- if !type.nil? && !(type == :boolean) && type.respond_to?(:to_sym) && connection.respond_to?(:native_database_types)
39
- native_type = connection.native_database_types[type.try(:to_sym)]
40
- if native_type && native_type[:name]
41
- type = native_type[:name]
42
- else
43
- # unknown type, we just dont cast
44
- type = nil
45
- end
46
- end
47
- @active_record_type = connection.lookup_cast_type(type)
48
- end
49
- end
50
- end
51
- end
52
- end