arpa 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +42 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +138 -0
  8. data/Rakefile +2 -0
  9. data/arpa.gemspec +33 -0
  10. data/lib/arpa.rb +91 -0
  11. data/lib/arpa/additions/resource.rb +29 -0
  12. data/lib/arpa/assets/stylesheets/ar_accordion.scss +80 -0
  13. data/lib/arpa/controllers/profiles_controller.rb +106 -0
  14. data/lib/arpa/controllers/resources_controller.rb +47 -0
  15. data/lib/arpa/controllers/roles_controller.rb +106 -0
  16. data/lib/arpa/data_mappers/action_mapper.rb +13 -0
  17. data/lib/arpa/data_mappers/base.rb +117 -0
  18. data/lib/arpa/data_mappers/profile_mapper.rb +14 -0
  19. data/lib/arpa/data_mappers/resource_mapper.rb +11 -0
  20. data/lib/arpa/data_mappers/role_mapper.rb +14 -0
  21. data/lib/arpa/entities/action.rb +24 -0
  22. data/lib/arpa/entities/permissions.rb +35 -0
  23. data/lib/arpa/entities/profile.rb +22 -0
  24. data/lib/arpa/entities/resource.rb +58 -0
  25. data/lib/arpa/entities/role.rb +28 -0
  26. data/lib/arpa/exceptions/record_invalid.rb +13 -0
  27. data/lib/arpa/repositories/actions/creator.rb +18 -0
  28. data/lib/arpa/repositories/actions/finder.rb +23 -0
  29. data/lib/arpa/repositories/actions/remover.rb +22 -0
  30. data/lib/arpa/repositories/actions/repository_action.rb +15 -0
  31. data/lib/arpa/repositories/base.rb +15 -0
  32. data/lib/arpa/repositories/profiles/creator.rb +18 -0
  33. data/lib/arpa/repositories/profiles/finder.rb +29 -0
  34. data/lib/arpa/repositories/profiles/remover.rb +29 -0
  35. data/lib/arpa/repositories/profiles/repository_profile.rb +12 -0
  36. data/lib/arpa/repositories/profiles/updater.rb +23 -0
  37. data/lib/arpa/repositories/registrator.rb +44 -0
  38. data/lib/arpa/repositories/resources/creator.rb +18 -0
  39. data/lib/arpa/repositories/resources/finder.rb +45 -0
  40. data/lib/arpa/repositories/resources/remover.rb +22 -0
  41. data/lib/arpa/repositories/resources/repository_resource.rb +12 -0
  42. data/lib/arpa/repositories/roles/creator.rb +18 -0
  43. data/lib/arpa/repositories/roles/finder.rb +29 -0
  44. data/lib/arpa/repositories/roles/remover.rb +29 -0
  45. data/lib/arpa/repositories/roles/repository_role.rb +13 -0
  46. data/lib/arpa/repositories/roles/updater.rb +23 -0
  47. data/lib/arpa/services/actions/create/action_creator.rb +50 -0
  48. data/lib/arpa/services/actions/remove/action_remover.rb +24 -0
  49. data/lib/arpa/services/base.rb +41 -0
  50. data/lib/arpa/services/profiles/create/profile_creator.rb +32 -0
  51. data/lib/arpa/services/profiles/profile_manager_creator.rb +22 -0
  52. data/lib/arpa/services/profiles/profile_manager_remover.rb +24 -0
  53. data/lib/arpa/services/profiles/profile_manager_updater.rb +22 -0
  54. data/lib/arpa/services/profiles/remove/profile_remover.rb +25 -0
  55. data/lib/arpa/services/profiles/update/profile_updater.rb +32 -0
  56. data/lib/arpa/services/resources/create/resource_creator.rb +42 -0
  57. data/lib/arpa/services/resources/remove/resource_remover.rb +31 -0
  58. data/lib/arpa/services/resources/resource_manager_creator.rb +50 -0
  59. data/lib/arpa/services/roles/create/role_creator.rb +33 -0
  60. data/lib/arpa/services/roles/remove/role_remover.rb +25 -0
  61. data/lib/arpa/services/roles/role_manager_creator.rb +23 -0
  62. data/lib/arpa/services/roles/role_manager_remover.rb +23 -0
  63. data/lib/arpa/services/roles/role_manager_updater.rb +22 -0
  64. data/lib/arpa/services/roles/update/role_updater.rb +32 -0
  65. data/lib/arpa/services/verifier.rb +24 -0
  66. data/lib/arpa/validators/action_validator.rb +17 -0
  67. data/lib/arpa/validators/profile_validator.rb +19 -0
  68. data/lib/arpa/validators/resource_validator.rb +17 -0
  69. data/lib/arpa/validators/role_validator.rb +20 -0
  70. data/lib/arpa/version.rb +3 -0
  71. data/lib/arpa/views/profiles/_form.html.erb +41 -0
  72. data/lib/arpa/views/profiles/edit.html.erb +6 -0
  73. data/lib/arpa/views/profiles/index.html.erb +29 -0
  74. data/lib/arpa/views/profiles/new.html.erb +5 -0
  75. data/lib/arpa/views/profiles/show.html.erb +37 -0
  76. data/lib/arpa/views/resources/index.html.erb +27 -0
  77. data/lib/arpa/views/resources/show.html.erb +33 -0
  78. data/lib/arpa/views/roles/_form.html.erb +55 -0
  79. data/lib/arpa/views/roles/edit.html.erb +6 -0
  80. data/lib/arpa/views/roles/index.html.erb +29 -0
  81. data/lib/arpa/views/roles/new.html.erb +5 -0
  82. data/lib/arpa/views/roles/show.html.erb +37 -0
  83. data/lib/config/locales/arpa.en.yml +38 -0
  84. data/lib/generators/ar/install_generator.rb +74 -0
  85. data/lib/generators/ar/templates/migration.rb +48 -0
  86. data/spec/factories/repository_actions.rb +19 -0
  87. data/spec/factories/repository_profiles.rb +11 -0
  88. data/spec/factories/repository_resources.rb +15 -0
  89. data/spec/factories/repository_roles.rb +11 -0
  90. data/spec/lib/ar/additions/resource_spec.rb +34 -0
  91. data/spec/lib/ar/data_mappers/action_mapper_spec.rb +46 -0
  92. data/spec/lib/ar/data_mappers/base_spec.rb +47 -0
  93. data/spec/lib/ar/data_mappers/profile_mapper_spec.rb +43 -0
  94. data/spec/lib/ar/data_mappers/resource_mapper_spec.rb +38 -0
  95. data/spec/lib/ar/data_mappers/role_mapper_spec.rb +47 -0
  96. data/spec/lib/ar/entities/action_spec.rb +19 -0
  97. data/spec/lib/ar/entities/permissions_spec.rb +61 -0
  98. data/spec/lib/ar/entities/resource_spec.rb +35 -0
  99. data/spec/lib/ar/repositories/actions/finder_spec.rb +40 -0
  100. data/spec/lib/ar/repositories/base_spec.rb +37 -0
  101. data/spec/lib/ar/repositories/profiles/finder_spec.rb +43 -0
  102. data/spec/lib/ar/repositories/profiles/remover_spec.rb +31 -0
  103. data/spec/lib/ar/repositories/resources/finder_spec.rb +92 -0
  104. data/spec/lib/ar/repositories/resources/remover_spec.rb +38 -0
  105. data/spec/lib/ar/repositories/roles/finder_spec.rb +43 -0
  106. data/spec/lib/ar/repositories/roles/remover_spec.rb +31 -0
  107. data/spec/lib/ar/requests/profiles/create_request_spec.rb +51 -0
  108. data/spec/lib/ar/requests/profiles/remove_request_spec.rb +36 -0
  109. data/spec/lib/ar/requests/resources/create_request_spec.rb +107 -0
  110. data/spec/lib/ar/requests/roles/create_request_spec.rb +40 -0
  111. data/spec/lib/ar/requests/roles/remove_request_spec.rb +23 -0
  112. data/spec/lib/ar/requests/roles/update_request_spec.rb +50 -0
  113. data/spec/lib/ar/services/actions/create/action_creator_spec.rb +88 -0
  114. data/spec/lib/ar/services/actions/remove/action_remover_spec.rb +36 -0
  115. data/spec/lib/ar/services/base_spec.rb +94 -0
  116. data/spec/lib/ar/services/profiles/create/profile_creator_spec.rb +68 -0
  117. data/spec/lib/ar/services/profiles/profile_manager_creator_spec.rb +31 -0
  118. data/spec/lib/ar/services/profiles/profile_manager_remover_spec.rb +44 -0
  119. data/spec/lib/ar/services/profiles/profile_manager_updater_spec.rb +31 -0
  120. data/spec/lib/ar/services/profiles/remove/profile_remover_spec.rb +45 -0
  121. data/spec/lib/ar/services/profiles/update/profile_updater_spec.rb +68 -0
  122. data/spec/lib/ar/services/resources/create/resource_creator_spec.rb +87 -0
  123. data/spec/lib/ar/services/resources/remove/resource_remover_spec.rb +50 -0
  124. data/spec/lib/ar/services/resources/resource_manager_creator_spec.rb +71 -0
  125. data/spec/lib/ar/services/roles/create/role_creator_spec.rb +68 -0
  126. data/spec/lib/ar/services/roles/remove/role_remover_spec.rb +50 -0
  127. data/spec/lib/ar/services/roles/role_manager_creator_spec.rb +31 -0
  128. data/spec/lib/ar/services/roles/role_manager_remover_spec.rb +32 -0
  129. data/spec/lib/ar/services/roles/role_manager_updater_spec.rb +31 -0
  130. data/spec/lib/ar/services/roles/update/role_updater_spec.rb +68 -0
  131. data/spec/lib/ar/services/verifier_spec.rb +44 -0
  132. data/spec/lib/ar/validators/action_validator_spec.rb +15 -0
  133. data/spec/lib/ar/validators/profile_validator_spec.rb +16 -0
  134. data/spec/lib/ar/validators/resource_validator_spec.rb +15 -0
  135. data/spec/lib/ar/validators/role_validator_spec.rb +16 -0
  136. data/spec/spec_helper.rb +33 -0
  137. data/spec/support/repositories/test_repository.rb +2 -0
  138. data/spec/support/schema.rb +58 -0
  139. metadata +380 -0
@@ -0,0 +1,106 @@
1
+ module Arpa
2
+ class ProfilesController < ApplicationController
3
+ before_action :set_profile, only: [:show, :edit, :update, :remove]
4
+
5
+ # GET /profiles
6
+ def index
7
+ @profiles = profile_finder.all
8
+ respond_with(@profiles)
9
+ end
10
+
11
+ # GET /profiles/1
12
+ def show
13
+ respond_with(@profile)
14
+ end
15
+
16
+ # GET /profiles/new
17
+ def new
18
+ @profile = Arpa::Entities::Profile.new
19
+ all_roles
20
+ end
21
+
22
+ # GET /profiles/1/edit
23
+ def edit
24
+ all_roles
25
+ end
26
+
27
+ # POST /profiles
28
+ def create
29
+ profile_creator.create({profile: profile_params}, {
30
+ success: -> (profile) {
31
+ redirect_to profile_path(profile.id), notice: I18n.t('flash.actions.create_profile.notice')
32
+ },
33
+ fail: -> (error) {
34
+ @profile = Arpa::Entities::Profile.new(profile_params)
35
+ @error = error
36
+ all_roles
37
+ render :new
38
+ }
39
+ })
40
+ end
41
+
42
+ # PATCH/PUT /profiles/1
43
+ def update
44
+ profile_updater.update({profile: profile_params}, {
45
+ success: -> (profile) {
46
+ redirect_to profile_path(profile.id), notice: I18n.t('flash.actions.update_profile.notice')
47
+ },
48
+ fail: -> (error) {
49
+ @profile = Arpa::Entities::Profile.new(profile_params)
50
+ @error = error
51
+ all_roles
52
+ render :edit
53
+ }
54
+ })
55
+ end
56
+
57
+ # DELETE /profiles/1
58
+ def remove
59
+ profile_remover.remove({profile: @profile}, {
60
+ success: -> (profile) {
61
+ redirect_to profiles_path, notice: I18n.t('flash.actions.remove_profile.notice')
62
+ },
63
+ fail: -> (error) {
64
+ redirect_to profiles_path, notice: I18n.t('flash.actions.remove_profile.alert')
65
+ }
66
+ })
67
+
68
+ end
69
+
70
+ private
71
+
72
+ def profile_creator
73
+ @profile_creator ||= Arpa::Services::Profiles::ProfileManagerCreator.new
74
+ end
75
+
76
+ def profile_updater
77
+ @profile_updater ||= Arpa::Services::Profiles::ProfileManagerUpdater.new
78
+ end
79
+
80
+ def profile_remover
81
+ @profile_remover ||= Arpa::Services::Profiles::ProfileManagerRemover.new
82
+ end
83
+
84
+ def profile_finder
85
+ @profile_finder ||= Arpa::Repositories::Profiles::Finder.new
86
+ end
87
+
88
+ def role_finder
89
+ @role_finder ||= Arpa::Repositories::Roles::Finder.new
90
+ end
91
+
92
+ def all_roles
93
+ @roles = role_finder.all
94
+ end
95
+
96
+ def set_profile
97
+ @profile = profile_finder.find(params[:id])
98
+ end
99
+
100
+ def profile_params
101
+ params.require(:profile).
102
+ permit(:id, :name, :description, role_ids: [])
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,47 @@
1
+ module Arpa
2
+ class ResourcesController < ApplicationController
3
+ before_action :set_resource, only: [:show]
4
+
5
+ # GET /resources
6
+ def index
7
+ @resources = resource_finder.all
8
+ respond_with(@resources)
9
+ end
10
+
11
+ # GET /resources/1
12
+ def show
13
+ respond_with(@resource)
14
+ end
15
+
16
+ # GET /generate_resources_and_actions
17
+ def generate_resources_and_actions
18
+ Rails.application.eager_load!
19
+
20
+ resource_creator.create({resourceables: ApplicationController.descendants}, {
21
+ success: -> (resource) {
22
+ flash[:notice] = I18n.t('flash.actions.generate_resources_and_actions.notice')
23
+ },
24
+ fail: -> (error) {
25
+ flash[:alert] = I18n.t('flash.actions.generate_resources_and_actions.alert')
26
+ }
27
+ })
28
+
29
+ redirect_to resources_path
30
+ end
31
+
32
+ private
33
+
34
+ def resource_creator
35
+ @resource_creator ||= Arpa::Services::Resources::ResourceManagerCreator.new
36
+ end
37
+
38
+ def resource_finder
39
+ @resource_finder ||= Arpa::Repositories::Resources::Finder.new
40
+ end
41
+
42
+ def set_resource
43
+ @resource = resource_finder.find(params[:id])
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,106 @@
1
+ module Arpa
2
+ class RolesController < ApplicationController
3
+ before_action :set_role, only: [:show, :edit, :update, :remove]
4
+
5
+ # GET /roles
6
+ def index
7
+ @roles = role_finder.all
8
+ respond_with(@roles)
9
+ end
10
+
11
+ # GET /roles/1
12
+ def show
13
+ respond_with(@role)
14
+ end
15
+
16
+ # GET /roles/new
17
+ def new
18
+ @role = Arpa::Entities::Role.new
19
+ all_resources
20
+ end
21
+
22
+ # GET /roles/1/edit
23
+ def edit
24
+ all_resources
25
+ end
26
+
27
+ # POST /roles
28
+ def create
29
+ role_creator.create({role: role_params}, {
30
+ success: -> (role) {
31
+ redirect_to role_path(role.id), notice: I18n.t('flash.actions.create_role.notice')
32
+ },
33
+ fail: -> (error) {
34
+ @role = Arpa::Entities::Role.new(role_params)
35
+ @error = error
36
+ all_resources
37
+ render :new
38
+ }
39
+ })
40
+ end
41
+
42
+ # PATCH/PUT /roles/1
43
+ def update
44
+ role_updater.update({role: role_params}, {
45
+ success: -> (role) {
46
+ redirect_to role_path(role.id), notice: I18n.t('flash.actions.update_role.notice')
47
+ },
48
+ fail: -> (error) {
49
+ @role = Arpa::Entities::Role.new(role_params)
50
+ @error = error
51
+ all_resources
52
+ render :edit
53
+ }
54
+ })
55
+ end
56
+
57
+ # DELETE /roles/1
58
+ def remove
59
+ role_remover.remove({role: @role}, {
60
+ success: -> (role) {
61
+ redirect_to roles_path, notice: I18n.t('flash.actions.remove_role.notice')
62
+ },
63
+ fail: -> (error) {
64
+ redirect_to roles_path, notice: I18n.t('flash.actions.remove_role.alert')
65
+ }
66
+ })
67
+
68
+ end
69
+
70
+ private
71
+
72
+ def role_creator
73
+ @role_creator ||= Arpa::Services::Roles::RoleManagerCreator.new
74
+ end
75
+
76
+ def role_updater
77
+ @role_updater ||= Arpa::Services::Roles::RoleManagerUpdater.new
78
+ end
79
+
80
+ def role_remover
81
+ @role_remover ||= Arpa::Services::Roles::RoleManagerRemover.new
82
+ end
83
+
84
+ def role_finder
85
+ @role_finder ||= Arpa::Repositories::Roles::Finder.new
86
+ end
87
+
88
+ def resource_finder
89
+ @resource_finder ||= Arpa::Repositories::Resources::Finder.new
90
+ end
91
+
92
+ def all_resources
93
+ @resources = resource_finder.all
94
+ end
95
+
96
+ def set_role
97
+ @role = role_finder.find(params[:id])
98
+ end
99
+
100
+ def role_params
101
+ params.require(:role).
102
+ permit(:id, :name, :description, action_ids: [])
103
+ end
104
+
105
+ end
106
+ end
@@ -0,0 +1,13 @@
1
+ module Arpa
2
+ module DataMappers
3
+ class ActionMapper < Base
4
+ entity_class 'Arpa::Entities::Action'
5
+ repository_class 'Arpa::Repositories::Actions::RepositoryAction'
6
+
7
+ attrs_to_entity :id, :resource_id, :name, :created_at, :updated_at,
8
+ resource: {mapper: 'Arpa::DataMappers::ResourceMapper'}
9
+ attrs_to_record :id, :resource_id, :name, :created_at, :updated_at
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,117 @@
1
+ module Arpa
2
+ module DataMappers
3
+ class Base
4
+ include Singleton
5
+
6
+ def map_to_record(entity, options={})
7
+ options[:map_association_to] ||= :map_to_record
8
+ attrs_to_record = self.class._attrs_to_record
9
+ attributes = attributes_from(entity, attrs_to_record, options)
10
+ self.class._repository_class.new(attributes)
11
+ end
12
+
13
+ def map_to_entity(record, options={})
14
+ options[:map_association_to] ||= :map_to_entity
15
+ attrs_to_entity = self.class._attrs_to_entity
16
+ attributes = attributes_from(record, attrs_to_entity, options)
17
+ self.class._entity_class.new(attributes)
18
+ end
19
+
20
+ private
21
+
22
+ def attributes_from(object, attrs_to_map, options={})
23
+ options[:map_association_to] = options.fetch(:map_association_to, :map_to_entity)
24
+ options[:map_association] = options.fetch(:map_association, true)
25
+
26
+ attrs_to_map ||= self.class._attributes_to_map
27
+
28
+ begin
29
+ build_hash_attributes(attrs_to_map, object, options)
30
+ rescue => e
31
+ raise StandardError, "#{self.class} -> #{e.message}"
32
+ end
33
+ end
34
+
35
+ def build_hash_attributes(attributes_to_map, object, options)
36
+ builder_attribute = build_hash_attribute.curry.(object, options)
37
+
38
+ attributes_to_map.collect { |attr_key|
39
+ builder_attribute.(attr_key)
40
+ }.reduce({}, :merge)
41
+ end
42
+
43
+ def build_hash_attribute
44
+ -> (object, options, attr_key) {
45
+ if attr_key.kind_of?(Hash)
46
+ key = attr_key.keys.first
47
+ value = association_value(object, attr_key, options)
48
+ else
49
+ key = attr_key
50
+ value = object.send(attr_key)
51
+ end
52
+ {:"#{key}" => value}
53
+ }
54
+ end
55
+
56
+ def association_value(object, attr_key, options)
57
+ key = attr_key.keys.first
58
+ object_value = object.send(key)
59
+
60
+ return object_value unless options[:map_association]
61
+
62
+ mapper = attr_key[key][:mapper].constantize.instance
63
+
64
+ if object_value.try(:size)
65
+ object_value.collect do |obj|
66
+ mapper.send(options[:map_association_to], obj, {map_association: false})
67
+ end
68
+ else
69
+ mapper.send(options[:map_association_to], object_value, {map_association: false})
70
+ end
71
+ end
72
+
73
+ # --- Classes Methods ---
74
+
75
+ def self.entity_class(entity_class)
76
+ @entity_class = entity_class
77
+ end
78
+
79
+ def self._entity_class
80
+ @entity_class.constantize
81
+ end
82
+
83
+ def self.repository_class(repository_class)
84
+ @repository_class = repository_class
85
+ end
86
+
87
+ def self._repository_class
88
+ @repository_class.constantize
89
+ end
90
+
91
+ def self.attributes_to_map(*attrs)
92
+ @attributes_to_map = attrs
93
+ end
94
+
95
+ def self.attrs_to_record(*attrs)
96
+ @attrs_to_record = attrs
97
+ end
98
+
99
+ def self.attrs_to_entity(*attrs)
100
+ @attrs_to_entity = attrs
101
+ end
102
+
103
+ def self._attributes_to_map
104
+ @attributes_to_map
105
+ end
106
+
107
+ def self._attrs_to_record
108
+ @attrs_to_record
109
+ end
110
+
111
+ def self._attrs_to_entity
112
+ @attrs_to_entity
113
+ end
114
+
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,14 @@
1
+ module Arpa
2
+ module DataMappers
3
+ class ProfileMapper < Base
4
+ entity_class 'Arpa::Entities::Profile'
5
+ repository_class 'Arpa::Repositories::Profiles::RepositoryProfile'
6
+
7
+ attrs_to_entity :id, :name, :description, :role_ids, :removed, :created_at, :updated_at,
8
+ roles: {mapper: 'Arpa::DataMappers::RoleMapper'}
9
+
10
+ attrs_to_record :id, :name, :description, :role_ids, :removed, :created_at, :updated_at
11
+
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,11 @@
1
+ module Arpa
2
+ module DataMappers
3
+ class ResourceMapper < Base
4
+ entity_class 'Arpa::Entities::Resource'
5
+ repository_class 'Arpa::Repositories::Resources::RepositoryResource'
6
+
7
+ attributes_to_map :id, :name, :full_name,
8
+ actions: {mapper: 'Arpa::DataMappers::ActionMapper'}
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,14 @@
1
+ module Arpa
2
+ module DataMappers
3
+ class RoleMapper < Base
4
+ entity_class 'Arpa::Entities::Role'
5
+ repository_class 'Arpa::Repositories::Roles::RepositoryRole'
6
+
7
+ attrs_to_entity :id, :name, :description, :action_ids, :removed, :created_at, :updated_at,
8
+ {actions: {mapper: 'Arpa::DataMappers::ActionMapper'} },
9
+ {profiles: {mapper: 'Arpa::DataMappers::ProfileMapper'}}
10
+
11
+ attrs_to_record :id, :name, :description, :action_ids, :removed, :created_at, :updated_at
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,24 @@
1
+ module Arpa
2
+ module Entities
3
+ class Action
4
+
5
+ attr_reader :id, :resource_id, :resource, :name, :created_at, :updated_at
6
+
7
+ def initialize(attrs = {})
8
+ attrs = attrs.with_indifferent_access
9
+
10
+ @id = attrs[:id]
11
+ @resource_id = attrs[:resource_id]
12
+ @resource = attrs[:resource]
13
+ @name = attrs[:name]
14
+ @created_at = attrs[:created_at]
15
+ @updated_at = attrs[:updated_at]
16
+ end
17
+
18
+ def description
19
+ I18n.t(name.to_sym, scope: "entities.resources.#{resource.name}.actions.description")
20
+ end
21
+
22
+ end
23
+ end
24
+ end