rails_ops 1.4.2 → 1.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/CHANGELOG.md +17 -2
- data/README.md +12 -2
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/lib/generators/operation/operation_generator.rb +54 -7
- data/lib/generators/operation/templates/controller.erb +34 -23
- data/lib/generators/operation/templates/controller_wrapper.erb +14 -0
- data/lib/rails_ops/hookup/dsl_validator.rb +1 -1
- data/lib/rails_ops/hookup.rb +1 -1
- data/lib/rails_ops/mixins/sub_ops.rb +2 -0
- data/lib/rails_ops/operation.rb +1 -1
- data/rails_ops.gemspec +6 -5
- data/test/dummy/app/controllers/group_controller.rb +28 -0
- data/test/dummy/app/models/ability.rb +7 -0
- data/test/dummy/app/models/animal.rb +5 -1
- data/test/dummy/app/models/bird.rb +3 -1
- data/test/dummy/app/models/phoenix.rb +3 -1
- data/test/dummy/config/environments/development.rb +2 -0
- data/test/dummy/config/environments/production.rb +2 -0
- data/test/dummy/config/hookup.rb +5 -0
- data/test/dummy/config/routes.rb +1 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/rails_ops/generators/operation_generator_test.rb +98 -0
- data/test/unit/rails_ops/hookup_test.rb +82 -0
- data/test/unit/rails_ops/mixins/controller_test.rb +21 -0
- data/test/unit/rails_ops/mixins/model/deep_nesting_test.rb +62 -2
- data/test/unit/rails_ops/mixins/model/marshalling_test.rb +36 -0
- data/test/unit/rails_ops/operation/auth_test.rb +120 -0
- data/test/unit/rails_ops/operation/model/destroy_test.rb +31 -0
- data/test/unit/rails_ops/operation/model/load_test.rb +9 -0
- data/test/unit/rails_ops/operation/model_test.rb +24 -0
- data/test/unit/rails_ops/operation_test.rb +121 -0
- data/test/unit/rails_ops/profiler_test.rb +11 -0
- metadata +36 -5
- data/test/unit/rails_ops/operation/update_auth_test.rb +0 -64
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9c18eddf15b9f713101e8cd2e783c01bffb0c664ea1e76b497c6a4ae0ff07eae
|
4
|
+
data.tar.gz: 4f4d8e61f2d3de18e6215417016de13251625c2fa238b78a37bf52c629cb2ede
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88f1d0f750f1bd794962984fa2d4e8fb37c71456e00ef8a7b795cc5fc08a748e57f1757b7bd61e8a7db9e2b76a42bae6e4ab3047568a36288a15c6cde2953aad
|
7
|
+
data.tar.gz: 11432ac0dd217407e7f3209b9201d7d408746db1d4c7d813dec706ce42b3c893551f5bfeda81e454dd8daaa459811ab01e71239e33af26c0bbfe5f6eedf022ad
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,20 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
## 1.4.
|
3
|
+
## 1.4.4 (2023-07-10)
|
4
|
+
|
5
|
+
* Adapt method `sub_op` to catch `<op-class>.validation_errors` and re-throw
|
6
|
+
them as `RailsOps::Exceptions::SubOpValidationFailed`.
|
7
|
+
|
8
|
+
## 1.4.3 (2023-03-27)
|
9
|
+
|
10
|
+
* Extend the `operation` generator to accept additional flags to skip the
|
11
|
+
generation of certain actions. In particular, the `--skip-index`,
|
12
|
+
`--skip-show`, `--skip-create`, `--skip-update` and `--skip-destroy` flags
|
13
|
+
were added.
|
14
|
+
|
15
|
+
Internal reference: `#111041`.
|
16
|
+
|
17
|
+
## 1.4.2 (2023-03-27)
|
4
18
|
|
5
19
|
* Update the `operation` generator such that it complies with the naming
|
6
20
|
conventions laid out in [Placing and naming
|
@@ -23,7 +37,8 @@
|
|
23
37
|
|
24
38
|
### Upgrading
|
25
39
|
|
26
|
-
Please see #33 for more information
|
40
|
+
Please see [#33](https://github.com/sitrox/rails_ops/issues/33) for more information
|
41
|
+
on this change. If all of your operations
|
27
42
|
follow the standard naming conventions (e.g. `Operations::User::Update` for
|
28
43
|
updating a model named `User`), no changes will be necessary. If you don't, you
|
29
44
|
may need to manually specify a `param_key` when using nested model operations
|
data/README.md
CHANGED
@@ -70,11 +70,11 @@ Requirements & Installation
|
|
70
70
|
|
71
71
|
# Define the Operations module
|
72
72
|
module Operations; end
|
73
|
-
|
73
|
+
|
74
74
|
# Add the folder to the autoloader, but namespaced
|
75
75
|
loader = Rails.autoloaders.main
|
76
76
|
loader.push_dir(app_operations, namespace: Operations)
|
77
|
-
|
77
|
+
|
78
78
|
# Add the folder to the watched directories (for re-loading in development)
|
79
79
|
Rails.application.config.watchable_dirs.merge!({
|
80
80
|
app_operations => [:rb]
|
@@ -1674,6 +1674,16 @@ flags:
|
|
1674
1674
|
|
1675
1675
|
Or if you want to skip them all: `--only-operations`.
|
1676
1676
|
|
1677
|
+
If you want to skip a certain action, you can do so using the flags:
|
1678
|
+
* `--skip-index`
|
1679
|
+
* `--skip-show`
|
1680
|
+
* `--skip-create`
|
1681
|
+
* `--skip-update`
|
1682
|
+
* `--skip-destroy`
|
1683
|
+
|
1684
|
+
This will skip the creation of the respective route, controller action, view file and the operation itself.
|
1685
|
+
For `--skip-create`, the `new` action will also be skipped and for `--skip-update`, the `edit` action will be skipped respectively.
|
1686
|
+
|
1677
1687
|
You can also add a module as a namespace, all generated files will be put in
|
1678
1688
|
the proper subfolders and modules by using the `--module` option.
|
1679
1689
|
|
data/Rakefile
CHANGED
@@ -24,6 +24,7 @@ task :gemspec do
|
|
24
24
|
spec.add_development_dependency 'colorize'
|
25
25
|
spec.add_development_dependency 'rubocop', '1.45.1'
|
26
26
|
spec.add_development_dependency 'sprockets-rails'
|
27
|
+
spec.add_development_dependency 'simplecov'
|
27
28
|
spec.add_dependency 'active_type', '>= 1.3.0'
|
28
29
|
spec.add_dependency 'minitest'
|
29
30
|
spec.add_dependency 'rails'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.
|
1
|
+
1.4.4
|
@@ -1,12 +1,41 @@
|
|
1
1
|
class OperationGenerator < Rails::Generators::NamedBase
|
2
2
|
source_root File.expand_path('templates', __dir__)
|
3
3
|
|
4
|
+
class_option :skip_index, type: :boolean, desc: "Don't create the index route / view / controller action"
|
5
|
+
class_option :skip_show, type: :boolean, desc: "Don't create the show route / view / controller action and the load operation"
|
6
|
+
class_option :skip_create, type: :boolean, desc: "Don't create the new / create route / view / controller action and the create operation"
|
7
|
+
class_option :skip_update, type: :boolean, desc: "Don't create the edit / update route / view / controller action and the update operation"
|
8
|
+
class_option :skip_destroy, type: :boolean, desc: "Don't create the destroy route / view / controller action and the destroy operation"
|
4
9
|
class_option :skip_controller, type: :boolean, desc: "Don't add a controller."
|
5
10
|
class_option :skip_views, type: :boolean, desc: "Don't add the views."
|
6
11
|
class_option :skip_routes, type: :boolean, desc: "Don't add routes to config/routes.rb."
|
7
12
|
class_option :only_operations, type: :boolean, desc: 'Only add the operations. This is equal to specifying --skip-controller --skip-routes --skip-views'
|
8
13
|
class_option :module, type: :string, desc: 'Add the operations in a module, e.g. "Admin" results in namespacing everything in the Admin module'
|
9
14
|
|
15
|
+
def excluded_actions
|
16
|
+
@excluded_actions = []
|
17
|
+
|
18
|
+
if options[:skip_index]
|
19
|
+
@excluded_actions += %i[index]
|
20
|
+
end
|
21
|
+
|
22
|
+
if options[:skip_show]
|
23
|
+
@excluded_actions += %i[show]
|
24
|
+
end
|
25
|
+
|
26
|
+
if options[:skip_create]
|
27
|
+
@excluded_actions += %i[new create]
|
28
|
+
end
|
29
|
+
|
30
|
+
if options[:skip_update]
|
31
|
+
@excluded_actions += %i[edit update]
|
32
|
+
end
|
33
|
+
|
34
|
+
if options[:skip_destroy]
|
35
|
+
@excluded_actions += %i[destroy]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
10
39
|
def add_operations
|
11
40
|
@class_name = name.classify
|
12
41
|
@underscored_name = @class_name.underscore
|
@@ -23,10 +52,18 @@ class OperationGenerator < Rails::Generators::NamedBase
|
|
23
52
|
|
24
53
|
operations_path += @underscored_name.to_s
|
25
54
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
55
|
+
unless @excluded_actions.include?(:show)
|
56
|
+
template 'load.erb', "#{operations_path}/load.rb"
|
57
|
+
end
|
58
|
+
unless @excluded_actions.include?(:create)
|
59
|
+
template 'create.erb', "#{operations_path}/create.rb"
|
60
|
+
end
|
61
|
+
unless @excluded_actions.include?(:update)
|
62
|
+
template 'update.erb', "#{operations_path}/update.rb"
|
63
|
+
end
|
64
|
+
unless @excluded_actions.include?(:destroy)
|
65
|
+
template 'destroy.erb', "#{operations_path}/destroy.rb"
|
66
|
+
end
|
30
67
|
end
|
31
68
|
|
32
69
|
def add_controller
|
@@ -39,7 +76,7 @@ class OperationGenerator < Rails::Generators::NamedBase
|
|
39
76
|
controller_file_path += "#{@underscored_pluralized_name}_controller.rb"
|
40
77
|
@controller_name = "#{@class_name.pluralize}Controller"
|
41
78
|
|
42
|
-
template '
|
79
|
+
template 'controller_wrapper.erb', controller_file_path
|
43
80
|
end
|
44
81
|
|
45
82
|
def add_views
|
@@ -51,7 +88,13 @@ class OperationGenerator < Rails::Generators::NamedBase
|
|
51
88
|
end
|
52
89
|
views_folder += @underscored_pluralized_name.to_s
|
53
90
|
|
54
|
-
%w[index show new edit]
|
91
|
+
actions = %w[index show new edit]
|
92
|
+
|
93
|
+
@excluded_actions.each do |a|
|
94
|
+
actions.delete(a.to_s)
|
95
|
+
end
|
96
|
+
|
97
|
+
actions.each do |view|
|
55
98
|
template 'view.erb', "#{views_folder}/#{view}.html.haml"
|
56
99
|
end
|
57
100
|
end
|
@@ -59,6 +102,10 @@ class OperationGenerator < Rails::Generators::NamedBase
|
|
59
102
|
def add_routes
|
60
103
|
return if options[:skip_routes] || options[:only_operations]
|
61
104
|
|
62
|
-
|
105
|
+
if @excluded_actions.empty?
|
106
|
+
route "resources :#{@underscored_pluralized_name}"
|
107
|
+
else
|
108
|
+
route "resources :#{@underscored_pluralized_name}, except: #{@excluded_actions}"
|
109
|
+
end
|
63
110
|
end
|
64
111
|
end
|
@@ -1,56 +1,67 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
class <%=@controller_name%> < ApplicationController
|
2
|
+
<% first=true -%>
|
3
|
+
<% if !@excluded_actions&.include?(:index) -%>
|
4
|
+
<% first=false -%>
|
4
5
|
def index; end
|
6
|
+
<% end -%>
|
7
|
+
<% if !@excluded_actions&.include?(:show) -%>
|
8
|
+
<% if first -%>
|
9
|
+
<% first=false -%>
|
10
|
+
<% else -%>
|
5
11
|
|
12
|
+
<% end -%>
|
6
13
|
def show
|
7
|
-
op Operations
|
14
|
+
op Operations<%="::#{@module_name}" if @module_name.present?%>::<%=@class_name%>::Load
|
8
15
|
end
|
16
|
+
<% end -%>
|
17
|
+
<% if !@excluded_actions&.include?(:create) -%>
|
18
|
+
<% if first -%>
|
19
|
+
<% first=false -%>
|
20
|
+
<% else -%>
|
9
21
|
|
22
|
+
<% end -%>
|
10
23
|
def new
|
11
|
-
op Operations
|
24
|
+
op Operations<%="::#{@module_name}" if @module_name.present?%>::<%=@class_name%>::Create
|
12
25
|
end
|
13
26
|
|
14
27
|
def create
|
15
|
-
if run Operations
|
28
|
+
if run Operations<%="::#{@module_name}" if @module_name.present?%>::<%=@class_name%>::Create
|
16
29
|
# handle successful case
|
17
30
|
else
|
18
31
|
# handle error case
|
19
32
|
end
|
20
33
|
end
|
34
|
+
<% end -%>
|
35
|
+
<% if !@excluded_actions&.include?(:update) -%>
|
36
|
+
<% if first -%>
|
37
|
+
<% first=false -%>
|
38
|
+
<% else -%>
|
21
39
|
|
40
|
+
<% end -%>
|
22
41
|
def edit
|
23
|
-
op Operations
|
42
|
+
op Operations<%="::#{@module_name}" if @module_name.present?%>::<%=@class_name%>::Update
|
24
43
|
end
|
25
44
|
|
26
45
|
def update
|
27
|
-
if run Operations
|
46
|
+
if run Operations<%="::#{@module_name}" if @module_name.present?%>::<%=@class_name%>::Update
|
28
47
|
# handle successful case
|
29
48
|
else
|
30
49
|
# handle error case
|
31
50
|
end
|
32
51
|
end
|
52
|
+
<% end -%>
|
53
|
+
<% if !@excluded_actions&.include?(:destroy) -%>
|
54
|
+
<% if first -%>
|
55
|
+
<% first=false -%>
|
56
|
+
<% else -%>
|
33
57
|
|
58
|
+
<% end -%>
|
34
59
|
def destroy
|
35
|
-
if run Operations
|
60
|
+
if run Operations<%="::#{@module_name}" if @module_name.present?%>::<%=@class_name%>::Destroy
|
36
61
|
# handle successful case
|
37
62
|
else
|
38
63
|
# handle error case
|
39
64
|
end
|
40
65
|
end
|
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
66
|
<% end -%>
|
53
67
|
end
|
54
|
-
<% else -%>
|
55
|
-
<%= controller_code -%>
|
56
|
-
<% end -%>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
<% controller_template = ERB.new(File.read(File.join(File.dirname(__FILE__), '/controller.erb')), trim_mode: '-').result(binding).strip -%>
|
2
|
+
<% if @module_name.present? -%>
|
3
|
+
module <%= @module_name %>
|
4
|
+
<% controller_template.split("\n").each do |line| -%>
|
5
|
+
<% if line.blank? -%>
|
6
|
+
|
7
|
+
<% else -%>
|
8
|
+
<%= line %>
|
9
|
+
<% end -%>
|
10
|
+
<% end -%>
|
11
|
+
end
|
12
|
+
<% else -%>
|
13
|
+
<%= controller_template %>
|
14
|
+
<% end -%>
|
@@ -10,7 +10,7 @@ class RailsOps::Hookup::DSLValidator
|
|
10
10
|
def validate!
|
11
11
|
# Check infinity loop
|
12
12
|
if target_hooks.any? { |name, targets| recursion?(targets, name) }
|
13
|
-
fail
|
13
|
+
fail SystemStackError.new, "Infinite loop detected in hooks configuration: #{inspect_trace}."
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
data/lib/rails_ops/hookup.rb
CHANGED
@@ -23,7 +23,7 @@ class RailsOps::Hookup
|
|
23
23
|
unless @config_loaded
|
24
24
|
@config_loaded = true
|
25
25
|
|
26
|
-
if File.exist?(CONFIG_PATH)
|
26
|
+
if File.exist?(Rails.root.join(CONFIG_PATH))
|
27
27
|
load Rails.root.join(CONFIG_PATH)
|
28
28
|
else
|
29
29
|
Rails.logger.debug "RailsOps could not find hookup #{CONFIG_PATH}, using empty hookup configuration."
|
@@ -11,6 +11,8 @@ module RailsOps::Mixins::SubOps
|
|
11
11
|
def sub_op(op, params = {})
|
12
12
|
new_context = context.spawn(self)
|
13
13
|
return op.new(new_context, params)
|
14
|
+
rescue *op.validation_errors => e
|
15
|
+
fail RailsOps::Exceptions::SubOpValidationFailed, e
|
14
16
|
end
|
15
17
|
|
16
18
|
# Operation-equivalent of controller method 'run!': Instantiates and runs the
|
data/lib/rails_ops/operation.rb
CHANGED
@@ -149,7 +149,7 @@ class RailsOps::Operation
|
|
149
149
|
|
150
150
|
# Fails with an exception if the operation has not been performed yet.
|
151
151
|
def check_performed!
|
152
|
-
fail 'Operation has not yet been
|
152
|
+
fail 'Operation has not yet been performed.' unless performed?
|
153
153
|
end
|
154
154
|
|
155
155
|
protected
|
data/rails_ops.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
# stub: rails_ops 1.4.
|
2
|
+
# stub: rails_ops 1.4.4 ruby lib
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "rails_ops".freeze
|
6
|
-
s.version = "1.4.
|
6
|
+
s.version = "1.4.4"
|
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 = "2023-
|
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_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/marshalling.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/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".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/mainboard.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/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.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/
|
11
|
+
s.date = "2023-07-10"
|
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_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/controller_wrapper.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/marshalling.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/controllers/group_controller.rb".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/ability.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/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".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/mainboard.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/hookup.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/hookup_test.rb".freeze, "test/unit/rails_ops/mixins/controller_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/model/marshalling_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/auth_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/destroy_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_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze, "test/unit/rails_ops/profiler_test.rb".freeze]
|
13
13
|
s.rubygems_version = "3.4.6".freeze
|
14
14
|
s.summary = "An operations service layer for rails projects.".freeze
|
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/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".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/mainboard.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/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.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/
|
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/controllers/group_controller.rb".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/ability.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/computer.rb".freeze, "test/dummy/app/models/concerns/.keep".freeze, "test/dummy/app/models/cpu.rb".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/mainboard.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/hookup.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/hookup_test.rb".freeze, "test/unit/rails_ops/mixins/controller_test.rb".freeze, "test/unit/rails_ops/mixins/model/deep_nesting_test.rb".freeze, "test/unit/rails_ops/mixins/model/marshalling_test.rb".freeze, "test/unit/rails_ops/mixins/param_authorization_test.rb".freeze, "test/unit/rails_ops/mixins/policies_test.rb".freeze, "test/unit/rails_ops/operation/auth_test.rb".freeze, "test/unit/rails_ops/operation/model/create_test.rb".freeze, "test/unit/rails_ops/operation/model/destroy_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_lazy_auth_test.rb".freeze, "test/unit/rails_ops/operation_test.rb".freeze, "test/unit/rails_ops/profiler_test.rb".freeze]
|
16
16
|
|
17
17
|
s.specification_version = 4
|
18
18
|
|
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
|
|
25
25
|
s.add_development_dependency(%q<colorize>.freeze, [">= 0"])
|
26
26
|
s.add_development_dependency(%q<rubocop>.freeze, ["= 1.45.1"])
|
27
27
|
s.add_development_dependency(%q<sprockets-rails>.freeze, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
28
29
|
s.add_runtime_dependency(%q<active_type>.freeze, [">= 1.3.0"])
|
29
30
|
s.add_runtime_dependency(%q<minitest>.freeze, [">= 0"])
|
30
31
|
s.add_runtime_dependency(%q<rails>.freeze, [">= 0"])
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class GroupController < ApplicationController
|
2
|
+
attr_reader :current_user
|
3
|
+
skip_before_action :verify_authenticity_token
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
super
|
7
|
+
@current_user = Class.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def show
|
11
|
+
cls = Class.new(RailsOps::Operation::Model::Load) do
|
12
|
+
model Group
|
13
|
+
end
|
14
|
+
|
15
|
+
op cls, id: params[:id]
|
16
|
+
render json: model
|
17
|
+
end
|
18
|
+
|
19
|
+
def update
|
20
|
+
cls = Class.new(RailsOps::Operation::Model::Update) do
|
21
|
+
model Group
|
22
|
+
end
|
23
|
+
|
24
|
+
op cls, id: params[:id], group: {name: params[:name]}
|
25
|
+
run!
|
26
|
+
render json: model
|
27
|
+
end
|
28
|
+
end
|
@@ -51,4 +51,6 @@ Rails.application.configure do
|
|
51
51
|
# Use an evented file watcher to asynchronously detect changes in source code,
|
52
52
|
# routes, locales, etc. This feature depends on the listen gem.
|
53
53
|
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
|
54
|
+
|
55
|
+
config.hosts = ['www.example.com']
|
54
56
|
end
|
data/test/dummy/config/routes.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start do
|
3
|
+
add_filter '/test/'
|
4
|
+
end
|
5
|
+
|
1
6
|
require File.expand_path('../test/dummy/config/environment.rb', __dir__)
|
2
7
|
# ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)]
|
3
8
|
require 'rails/test_help'
|