rails_ops 1.1.25 → 1.1.29

Sign up to get free protection for your applications and to get access to all the features.
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