effective_resources 1.7.6 → 1.8.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 56a161aa8bd3ad423f84fbe6f5a10b3b029eec746f72c186683472b5992d7357
4
- data.tar.gz: d7826fbdaaeeca49f15e0fac3f76ac949086c3760048ca8c7d98bf3d295fa6c9
3
+ metadata.gz: fc4db438688ecdd123360281ec6cfbe5b7aede01451615bcee92c566f186081c
4
+ data.tar.gz: fa9154d7b1942bd0e8023f8795b670313260bc0cb7c22b84f2cd9c8d993e8ee1
5
5
  SHA512:
6
- metadata.gz: 3accf197802ebe5e8bd825aad59759db334efb1c80bbce300625d391a3ca4a9075be45cc87410b1b536d8c6b817f9df11feccec7e36e6b045fdc77cdc58dffe3
7
- data.tar.gz: 798d95af974616b3cfddf193b35cbbce8df47f74d73171dfae4a1de4b4445cfec5a97765e8b3ffa275dc57c5d3064cc6a0c0672c6e760a855bab006c0ccaa48b
6
+ metadata.gz: 80b67a72b7a4f700b788d906a4db3c7e6e58f758f1d8f64d31178875c11c8021df2c706b86763efeba151a44b62cd07d19b46b0c2d354a20dd0831ee04aef89f
7
+ data.tar.gz: 1f18e82c58fdae3ff884659c7166825727a19e90a28a55add1d952dea32e7ee3cdabe1bf251b7bbb83d8c72017c99df22defffedf8d9720092a24876c212175b
@@ -53,7 +53,7 @@ module Effective
53
53
 
54
54
  respond_to do |format|
55
55
  format.html { }
56
- format.js { render('new.js') }
56
+ format.js { render('new', formats: :js) }
57
57
  end
58
58
  end
59
59
 
@@ -95,7 +95,7 @@ module Effective
95
95
 
96
96
  respond_to do |format|
97
97
  format.html { }
98
- format.js { render('show.js') }
98
+ format.js { render('show', formats: :js) }
99
99
  end
100
100
 
101
101
  end
@@ -112,7 +112,7 @@ module Effective
112
112
 
113
113
  respond_to do |format|
114
114
  format.html { }
115
- format.js { render('edit.js') }
115
+ format.js { render('edit', formats: :js) }
116
116
  end
117
117
 
118
118
  end
@@ -176,7 +176,10 @@ module Effective
176
176
 
177
177
  respond_to do |format|
178
178
  format.html { }
179
- format.js { render(template_present?(action) ? action : 'member_action.js', locals: { action: action }) }
179
+ format.js do
180
+ template = template_present?(action) ? action : 'member_action'
181
+ render(template, formats: :js, locals: { action: action })
182
+ end
180
183
  end
181
184
 
182
185
  return
@@ -76,6 +76,7 @@ module Effective
76
76
  def resource_flash(status, resource, action, e: nil)
77
77
  submit = commit_action(action)
78
78
  message = submit[status].respond_to?(:call) ? instance_exec(&submit[status]) : submit[status]
79
+
79
80
  return message.gsub('@resource', resource.to_s) if message.present?
80
81
  return nil if message.blank? && submit.key?(status)
81
82
 
@@ -93,6 +94,9 @@ module Effective
93
94
 
94
95
  # Should return a new resource based on the passed one
95
96
  def duplicate_resource(resource)
97
+ return resource.duplicate if resource.respond_to?(:duplicate)
98
+ return resource.duplicate! if resource.respond_to?(:duplicate!)
99
+ return resource.deep_dup if resource.respond_to?(:deep_dup)
96
100
  resource.dup
97
101
  end
98
102
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Effective
2
4
  module FlashMessages
3
5
  extend ActiveSupport::Concern
@@ -6,7 +8,11 @@ module Effective
6
8
  def flash_success(resource, action = nil, name: nil)
7
9
  raise 'expected an ActiveRecord resource' unless (name || resource.class.respond_to?(:model_name))
8
10
 
9
- "Successfully #{action_verb(action)} #{name || resource}".html_safe
11
+ name ||= begin
12
+ resource.destroyed? ? resource.class.model_name.to_s.downcase.split('::').last : resource.to_s.presence
13
+ end
14
+
15
+ "Successfully #{action_verb(action)} #{name || 'resource'}".html_safe
10
16
  end
11
17
 
12
18
  # flash.now[:danger] = flash_danger(@post)
@@ -18,7 +24,9 @@ module Effective
18
24
 
19
25
  messages = flash_errors(resource, e: e)
20
26
 
21
- name ||= resource.to_s.presence
27
+ name ||= begin
28
+ resource.destroyed? ? resource.class.model_name.to_s.downcase.split('::').last : resource.to_s.presence
29
+ end
22
30
 
23
31
  ["Unable to #{action}", (" #{name}" if name), (": #{messages}" if messages)].compact.join.html_safe
24
32
  end
@@ -27,7 +35,10 @@ module Effective
27
35
  def flash_errors(resource, e: nil)
28
36
  raise 'expected an ActiveRecord resource' unless resource.respond_to?(:errors)
29
37
 
30
- messages = resource.errors.map do |attribute, message|
38
+ messages = resource.errors.map do |error|
39
+ attribute = error.respond_to?(:attribute) ? error.attribute : error
40
+ message = error.respond_to?(:message) ? error.message : resource.errors[attribute].to_sentence
41
+
31
42
  if message[0] == message[0].upcase # If the error begins with a capital letter
32
43
  message
33
44
  elsif attribute == :base
@@ -52,6 +63,8 @@ module Effective
52
63
  'deleted'
53
64
  elsif word == 'undo'
54
65
  'undid'
66
+ elsif word == 'run'
67
+ 'ran'
55
68
  elsif word.end_with?('e')
56
69
  action.sub(word, word + 'd')
57
70
  elsif ['a', 'i', 'o', 'u'].include?(word[-1])
@@ -151,16 +151,24 @@ module EffectiveResourcesHelper
151
151
  atts = { :namespace => (effective_resource.namespace.to_sym if effective_resource.namespace), effective_resource.name.to_sym => resource }.compact.merge(atts)
152
152
 
153
153
  if lookup_context.template_exists?("form_#{action}", controller._prefixes, :partial)
154
- render "form_#{action}", atts
155
- elsif lookup_context.template_exists?('form', controller._prefixes, :partial)
156
- render 'form', atts
157
- elsif lookup_context.template_exists?('form', effective_resource.plural_name, :partial)
158
- render "#{effective_resource.plural_name}/form", atts
159
- elsif lookup_context.template_exists?('form', effective_resource.name, :partial)
160
- render "#{effective_resource.name}/form", atts
161
- else
162
- render 'form', atts # Will raise the regular error
154
+ return render("form_#{action}", atts)
155
+ end
156
+
157
+ if lookup_context.template_exists?('form', controller._prefixes, :partial)
158
+ return render('form', atts)
159
+ end
160
+
161
+ effective_resource.view_paths.each do |view_path|
162
+ if lookup_context.template_exists?("form_#{action}", [view_path], :partial)
163
+ return render(view_path + '/' + "form_#{action}", atts)
164
+ end
165
+
166
+ if lookup_context.template_exists?('form', [view_path], :partial)
167
+ return render(view_path + '/' + 'form', atts)
168
+ end
163
169
  end
170
+
171
+ render('form', atts) # Will raise the regular error
164
172
  end
165
173
 
166
174
  # Similar to render_resource_form
@@ -177,15 +185,18 @@ module EffectiveResourcesHelper
177
185
  atts = { :namespace => (effective_resource.namespace.to_sym if effective_resource.namespace), effective_resource.name.to_sym => resource }.compact.merge(atts)
178
186
 
179
187
  if lookup_context.template_exists?(effective_resource.name, controller._prefixes, :partial)
180
- render(effective_resource.name, atts)
181
- elsif lookup_context.template_exists?(effective_resource.name, [effective_resource.plural_name], :partial)
182
- render(effective_resource.plural_name + '/' + effective_resource.name, atts)
183
- elsif lookup_context.template_exists?(effective_resource.name, [effective_resource.name], :partial)
184
- render(effective_resource.name + '/' + effective_resource.name, atts)
185
- else
186
- render(resource, atts) # Will raise the regular error
188
+ return render(effective_resource.name, atts)
187
189
  end
190
+
191
+ effective_resource.view_paths.each do |view_path|
192
+ if lookup_context.template_exists?(effective_resource.name, [view_path], :partial)
193
+ return render(view_path + '/' + effective_resource.name, atts)
194
+ end
195
+ end
196
+
197
+ render(resource, atts) # Will raise the regular error
188
198
  end
199
+ alias_method :render_resource, :render_resource_partial
189
200
 
190
201
  # Tableize attributes
191
202
  # This is used by effective_orders, effective_logging, effective_trash and effective_mergery
@@ -16,7 +16,9 @@ module ActsAsSlugged
16
16
  included do
17
17
  extend FinderMethods
18
18
 
19
- before_validation { self.slug ||= build_slug }
19
+ before_validation do
20
+ assign_attributes(slug: build_slug) if slug.blank?
21
+ end
20
22
 
21
23
  validates :slug,
22
24
  presence: true, uniqueness: true, exclusion: { in: excluded_slugs }, length: { maximum: 255 },
@@ -40,11 +42,16 @@ module ActsAsSlugged
40
42
 
41
43
  where(slug: args.first).or(where(id: args.first)).first || raise(::ActiveRecord::RecordNotFound.new("Couldn't find #{name} with 'slug'=#{args.first}"))
42
44
  end
45
+
46
+ def find_by_slug_or_id(*args)
47
+ where(slug: args.first).or(where(id: args.first)).first
48
+ end
49
+
43
50
  end
44
51
 
45
52
  # Instance Methods
46
53
  def build_slug
47
- slug = self.to_s.parameterize.downcase[0, 250]
54
+ slug = to_s.parameterize.downcase[0, 250]
48
55
 
49
56
  if self.class.excluded_slugs.include?(slug)
50
57
  slug = "#{slug}-#{self.class.name.demodulize.parameterize}"
@@ -66,6 +66,7 @@ module EffectiveDeviseUser
66
66
 
67
67
  module ClassMethods
68
68
  def permitted_sign_up_params # Should contain all fields as per views/users/_sign_up_fields
69
+ raise('please define a self.permitted_sign_up_params')
69
70
  [:email, :password, :password_confirmation, :first_name, :last_name, :name, :login]
70
71
  end
71
72
 
@@ -152,8 +153,6 @@ module EffectiveDeviseUser
152
153
  def send_devise_notification(notification, *args)
153
154
  raise('expected args Hash') unless args.respond_to?(:last) && args.last.kind_of?(Hash)
154
155
 
155
-
156
-
157
156
  if defined?(Tenant)
158
157
  tenant = Tenant.current || raise('expected a current tenant')
159
158
  args.last[:tenant] ||= tenant
@@ -0,0 +1,56 @@
1
+ # HasManyRichTexts
2
+ #
3
+ # Mark your model with 'has_many_rich_texts' and then any method missing is a rich text region
4
+
5
+ module HasManyRichTexts
6
+ extend ActiveSupport::Concern
7
+
8
+ module Base
9
+ def has_many_rich_texts(options = nil)
10
+ include ::HasManyRichTexts
11
+ end
12
+ end
13
+
14
+ included do
15
+ has_many :rich_texts, class_name: 'ActionText::RichText', as: :record, inverse_of: :record, dependent: :destroy
16
+ accepts_nested_attributes_for :rich_texts, allow_destroy: true
17
+ end
18
+
19
+ module ClassMethods
20
+ end
21
+
22
+ # Find or build
23
+ def rich_text(name)
24
+ name = name.to_s
25
+ rich_texts.find { |rt| rt.name == name } || rich_texts.build(name: name)
26
+ end
27
+
28
+ def rich_text_body=(name, body)
29
+ rich_text(name).assign_attributes(body: body)
30
+ end
31
+
32
+ # Prevents an ActiveModel::UnknownAttributeError
33
+ # https://github.com/rails/rails/blob/main/activemodel/lib/active_model/attribute_assignment.rb#L48
34
+ def respond_to?(*args)
35
+ method = args.first.to_s
36
+ return false if ['to_a', 'to_ary'].any? { |str| method == str }
37
+ return false if ['_by', '_at', '_id', '_by=', '_at=', 'id='].any? { |str| method.end_with?(str) }
38
+ true
39
+ end
40
+
41
+ def method_missing(method, *args, &block)
42
+ super if block_given?
43
+ super unless respond_to?(method)
44
+
45
+ method = method.to_s
46
+
47
+ if method.end_with?('=') && args.length == 1 && (args.first.kind_of?(String) || args.first.kind_of?(NilClass))
48
+ send(:rich_text_body=, method.chomp('='), *args)
49
+ elsif args.length == 0
50
+ send(:rich_text, method, *args)
51
+ else
52
+ super
53
+ end
54
+ end
55
+
56
+ end
@@ -7,6 +7,7 @@ module Effective
7
7
  include Effective::Resources::Init
8
8
  include Effective::Resources::Instance
9
9
  include Effective::Resources::Forms
10
+ include Effective::Resources::Generator
10
11
  include Effective::Resources::Klass
11
12
  include Effective::Resources::Model
12
13
  include Effective::Resources::Naming
@@ -9,7 +9,7 @@ module Effective
9
9
 
10
10
  # This will have been set by init from crud_controller, or from a class and namespace
11
11
  def controller_path
12
- @controller_path ||= ([namespace, plural_name].compact * '/')
12
+ @controller_path ||= route_name #[namespace, plural_name].compact * '/')
13
13
  end
14
14
 
15
15
  def routes
@@ -20,7 +20,7 @@ module Effective
20
20
  # Check from controller_path. This is generally correct.
21
21
  engines.each do |engine|
22
22
  routes = engine.routes.routes.select do |route|
23
- controller_path == route.defaults[:controller] && !route.name.to_s.end_with?('root')
23
+ controller_path == route.defaults[:controller] && !(route.name || '').end_with?('root')
24
24
  end
25
25
 
26
26
  if routes.present?
@@ -29,20 +29,11 @@ module Effective
29
29
  end
30
30
 
31
31
  if routes.blank?
32
- matches = [
33
- [namespace, route_name.pluralize].compact.join('/'),
34
- [namespace, route_name].compact.join('/'),
35
- ['effective', namespace, route_name.pluralize].compact.join('/'),
36
- ['effective', namespace, route_name].compact.join('/'),
37
- [namespace, plural_name].compact.join('/'),
38
- [namespace, name].compact.join('/'),
39
- ['effective', namespace, plural_name].compact.join('/'),
40
- ['effective', namespace, name].compact.join('/')
41
- ]
32
+ matches = route_name_fallbacks()
42
33
 
43
34
  engines.each do |engine|
44
35
  routes = engine.routes.routes.select do |route|
45
- (matches & [route.defaults[:controller]]).present? && !route.name.to_s.end_with?('root')
36
+ (matches & [route.defaults[:controller]]).present? && !(route.name || '').end_with?('root')
46
37
  end
47
38
 
48
39
  if routes.present?
@@ -7,6 +7,7 @@ module Effective
7
7
  case (type || sql_type(name))
8
8
  when :belongs_to
9
9
  { as: :select }.merge(search_form_field_collection(belongs_to(name)))
10
+
10
11
  when :belongs_to_polymorphic
11
12
  constant_pluralized = name.to_s.upcase
12
13
  constant = name.to_s.pluralize.upcase
@@ -18,7 +19,7 @@ module Effective
18
19
  collection ||= (klass.const_get(constant_pluralized) rescue nil) if defined?("#{klass.name}::#{constant_pluralized}")
19
20
  end
20
21
 
21
- { as: :select, polymorphic: true, collection: collection }.compact
22
+ { as: :select, polymorphic: true, collection: (collection || []) }.compact
22
23
  when :has_and_belongs_to_many
23
24
  { as: :select }.merge(search_form_field_collection(has_and_belongs_to_many(name)))
24
25
  when :has_many
@@ -0,0 +1,31 @@
1
+ module Effective
2
+ module Resources
3
+ module Generator
4
+
5
+ def module_name
6
+ return nil unless class_name.split('::').length > 1
7
+ class_name.split('::').first
8
+ end
9
+
10
+ # Acpa
11
+ def module_namespace
12
+ return nil unless namespaces.present?
13
+ Array(namespaces + [nil]).map { |name| name.to_s.classify } * '::'
14
+ end
15
+
16
+ # Admin::Courses
17
+ def module_namespaced
18
+ (Array(namespaces).map { |name| name.to_s.classify } + [plural_name.classify.pluralize]) * '::'
19
+ end
20
+
21
+ def namespaced_class_name # 'Admin::Effective::Post'
22
+ (Array(namespaces).map { |name| name.to_s.classify } + [class_name]) * '::'
23
+ end
24
+
25
+ def namespaced_module_name # 'Admin::EffectivePosts'
26
+ Array(namespaces).map { |name| name.to_s.classify }.join('::') + '::' + class_name.gsub('::', '')
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -72,8 +72,7 @@ module Effective
72
72
  def _klass_by_name(input)
73
73
  input = input.to_s
74
74
  input = input[1..-1] if input.start_with?('/')
75
-
76
- names = input.split('/')
75
+ names = input.split(%r{\/|::})
77
76
 
78
77
  # Classify based on namespace
79
78
  # acpa/admin/shirts
@@ -19,8 +19,27 @@ module Effective
19
19
  @initialized_name
20
20
  end
21
21
 
22
+ # There could be a few, this is the best guess.
22
23
  def route_name # 'post' initialized from the controller_path/initialized_name and not the class
23
- @route_name ||= (initialized_name.to_s.split(SPLIT).last || '').singularize.underscore
24
+ names = class_name.split('::')
25
+
26
+ if names.length > 1
27
+ Array(names[0]) + namespaces + Array(names[1..-1])
28
+ else
29
+ namespaces + names
30
+ end.compact.map(&:downcase).join('/').pluralize
31
+ end
32
+
33
+ def route_name_fallbacks
34
+ mod = class_name.split('::').first.downcase
35
+
36
+ matches = [
37
+ route_name.singularize,
38
+ [*namespace, plural_name].join('/'),
39
+ [*namespace, name].join('/'),
40
+ [mod, *namespace, plural_name].join('/'),
41
+ [mod, *namespace, name].join('/')
42
+ ]
24
43
  end
25
44
 
26
45
  def class_name # 'Effective::Post'
@@ -31,14 +50,6 @@ module Effective
31
50
  class_name.split('::')[0...-1].map { |name| name.underscore } * '/'
32
51
  end
33
52
 
34
- def namespaced_class_name # 'Admin::Effective::Post'
35
- (Array(namespaces).map { |name| name.to_s.classify } + [class_name]) * '::'
36
- end
37
-
38
- def namespaced_module_name # 'Admin::EffectivePosts'
39
- Array(namespaces).map { |name| name.to_s.classify }.join('::') + '::' + class_name.gsub('::', '')
40
- end
41
-
42
53
  def namespace # 'admin/things'
43
54
  (namespaces.join('/') if namespaces.present?)
44
55
  end
@@ -55,6 +66,15 @@ module Effective
55
66
  name.pluralize.gsub('::', ' ').underscore.gsub('_', ' ')
56
67
  end
57
68
 
69
+ def tenant
70
+ return nil unless defined?(Tenant)
71
+ return nil unless klass.present?
72
+ return nil unless class_name.include?('::')
73
+
74
+ name = class_name.split('::').first.downcase.to_sym
75
+ name if Rails.application.config.tenants[name].present?
76
+ end
77
+
58
78
  end
59
79
  end
60
80
  end
@@ -1,25 +1,68 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Effective
2
4
  module Resources
3
5
  module Paths
4
6
 
7
+ def tenant_path
8
+ return unless tenant.present?
9
+ Tenant.engine_path(tenant).sub("#{Rails.root}/", '')
10
+ end
11
+
5
12
  def model_file
6
- File.join('app/models', class_path.to_s, "#{name}.rb")
13
+ File.join(*[tenant_path, 'app/models', class_path, "#{name}.rb"].compact)
7
14
  end
8
15
 
9
16
  def controller_file
10
- File.join('app/controllers', namespace.to_s, "#{plural_name}_controller.rb")
17
+ File.join(*[tenant_path, 'app/controllers', class_path, namespace, "#{plural_name}_controller.rb"].compact)
11
18
  end
12
19
 
13
20
  def datatable_file
14
- File.join('app/datatables', namespace.to_s, "#{plural_name}_datatable.rb")
21
+ File.join(*[tenant_path, 'app/datatables', class_path, namespace, "#{plural_name}_datatable.rb"].compact)
15
22
  end
16
23
 
17
24
  def view_file(action = :index, partial: false)
18
- File.join('app/views', namespace.to_s, (namespace.present? ? '' : class_path), plural_name, "#{'_' if partial}#{action}.html.haml")
25
+ File.join(*[tenant_path, 'app/views', class_path, namespace, plural_name, "#{'_' if partial}#{action}.html.haml"].compact)
26
+ end
27
+
28
+ def view_file_path(action = :index)
29
+ File.join(*[class_path, namespace, plural_name, action].compact)
19
30
  end
20
31
 
21
32
  def flat_view_file(action = :index, partial: false)
22
- File.join('app/views', plural_name, "#{'_' if partial}#{action}.html.haml")
33
+ File.join(*[tenant_path, 'app/views', class_path, plural_name, "#{'_' if partial}#{action}.html.haml"].compact)
34
+ end
35
+
36
+ def routes_file
37
+ File.join(*[tenant_path, 'config/routes.rb'].compact)
38
+ end
39
+
40
+ def abilities_file
41
+ File.join(*[tenant_path, 'app/models/', class_path, 'ability.rb'].compact)
42
+ end
43
+
44
+ def menu_file
45
+ File.join(*[tenant_path, 'app/views/layouts', class_path, '_navbar.html.haml'].compact)
46
+ end
47
+
48
+ def admin_menu_file
49
+ File.join(*[tenant_path, 'app/views/layouts', class_path, '_navbar_admin.html.haml'].compact)
50
+ end
51
+
52
+ # Used by render_resource_partial and render_resource_form to guess the view path
53
+ def view_paths
54
+ mod = class_name.split('::').first.downcase
55
+
56
+ [
57
+ [mod, *namespace, plural_name].join('/'),
58
+ [mod, *namespace, name].join('/'),
59
+ [*namespace, mod, plural_name].join('/'),
60
+ [*namespace, mod, name].join('/'),
61
+ [mod, plural_name].join('/'),
62
+ [mod, name].join('/'),
63
+ [*namespace, plural_name].join('/'),
64
+ [*namespace, name].join('/')
65
+ ]
23
66
  end
24
67
 
25
68
  end
@@ -1,25 +1,24 @@
1
1
  require 'effective_resources/engine'
2
2
  require 'effective_resources/version'
3
+ require 'effective_resources/effective_gem'
3
4
 
4
5
  module EffectiveResources
5
6
 
6
- # The following are all valid config keys
7
- mattr_accessor :authorization_method
8
- mattr_accessor :default_submits
9
-
10
- def self.setup
11
- yield self
7
+ def self.config_keys
8
+ [:authorization_method, :default_submits]
12
9
  end
13
10
 
11
+ include EffectiveGem
12
+
14
13
  def self.authorized?(controller, action, resource)
15
- @_exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact
14
+ @exceptions ||= [Effective::AccessDenied, (CanCan::AccessDenied if defined?(CanCan)), (Pundit::NotAuthorizedError if defined?(Pundit))].compact
16
15
 
17
16
  return !!authorization_method unless authorization_method.respond_to?(:call)
18
17
  controller = controller.controller if controller.respond_to?(:controller)
19
18
 
20
19
  begin
21
20
  !!(controller || self).instance_exec((controller || self), action, resource, &authorization_method)
22
- rescue *@_exceptions
21
+ rescue *@exceptions
23
22
  false
24
23
  end
25
24
  end
@@ -29,9 +28,22 @@ module EffectiveResources
29
28
  end
30
29
 
31
30
  def self.default_submits
32
- @_default_submits ||= begin
33
- (['Save', 'Continue', 'Add New'] & Array(@@default_submits)).inject({}) { |h, v| h[v] = true; h }
31
+ (['Save', 'Continue', 'Add New'] & Array(config.default_submits)).inject({}) { |h, v| h[v] = true; h }
32
+ end
33
+
34
+ # Utilities
35
+
36
+ def self.truthy?(value)
37
+ if defined?(::ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES) # Rails <5
38
+ ::ActiveRecord::ConnectionAdapters::Column::TRUE_VALUES.include?(value)
39
+ else
40
+ ::ActiveRecord::Type::Boolean.new.cast(value)
34
41
  end
35
42
  end
36
43
 
44
+ def self.deliver_method
45
+ config = Rails.application.config
46
+ (config.respond_to?(:active_job) && config.active_job.queue_adapter) ? :deliver_later : :deliver_now
47
+ end
48
+
37
49
  end
@@ -0,0 +1,42 @@
1
+ # Effective Engine concern
2
+
3
+ module EffectiveGem
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ raise("expected self.config_keys method") unless respond_to?(:config_keys)
8
+
9
+ config_keys.each do |key|
10
+ self.class.define_method(key) { config()[key] }
11
+ end
12
+ end
13
+
14
+ module ClassMethods
15
+ def config(namespace = nil)
16
+ namespace ||= Tenant.current if defined?(Tenant)
17
+ @config.dig(namespace) || @config
18
+ end
19
+
20
+ def setup(namespace = nil, &block)
21
+ @config ||= ActiveSupport::OrderedOptions.new
22
+ namespace ||= Tenant.current if defined?(Tenant)
23
+
24
+ if namespace
25
+ @config[namespace] ||= ActiveSupport::OrderedOptions.new
26
+ end
27
+
28
+ yield(config(namespace))
29
+
30
+ if(unsupported = (config(namespace).keys - config_keys)).present?
31
+ if unsupported.include?(:authorization_method)
32
+ raise("config.authorization_method has been removed. This gem will call EffectiveResources.authorization_method instead. Please double check the config.authorization_method setting in config/initializers/effective_resources.rb and remove it from this file.")
33
+ end
34
+
35
+ raise("unsupported config keys: #{unsupported}\n supported keys: #{config_keys}")
36
+ end
37
+
38
+ true
39
+ end
40
+ end
41
+
42
+ end
@@ -27,6 +27,7 @@ module EffectiveResources
27
27
  ActiveRecord::Base.extend(ActsAsSlugged::Base)
28
28
  ActiveRecord::Base.extend(ActsAsStatused::Base)
29
29
  ActiveRecord::Base.extend(ActsAsWizard::Base)
30
+ ActiveRecord::Base.extend(HasManyRichTexts::Base)
30
31
 
31
32
  ActiveRecord::Base.extend(EffectiveDeviseUser::Base)
32
33
  ActiveRecord::Base.extend(EffectiveResource::Base)
@@ -1,3 +1,3 @@
1
1
  module EffectiveResources
2
- VERSION = '1.7.6'.freeze
2
+ VERSION = '1.8.2'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_resources
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.6
4
+ version: 1.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-17 00:00:00.000000000 Z
11
+ date: 2021-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -143,6 +143,7 @@ files:
143
143
  - app/models/concerns/acts_as_wizard.rb
144
144
  - app/models/concerns/effective_devise_user.rb
145
145
  - app/models/concerns/effective_resource.rb
146
+ - app/models/concerns/has_many_rich_texts.rb
146
147
  - app/models/effective/access_denied.rb
147
148
  - app/models/effective/action_failed.rb
148
149
  - app/models/effective/attribute.rb
@@ -155,6 +156,7 @@ files:
155
156
  - app/models/effective/resources/attributes.rb
156
157
  - app/models/effective/resources/controller.rb
157
158
  - app/models/effective/resources/forms.rb
159
+ - app/models/effective/resources/generator.rb
158
160
  - app/models/effective/resources/init.rb
159
161
  - app/models/effective/resources/instance.rb
160
162
  - app/models/effective/resources/klass.rb
@@ -180,6 +182,7 @@ files:
180
182
  - app/views/effective/resource/_actions_glyphicons.html.haml
181
183
  - config/effective_resources.rb
182
184
  - lib/effective_resources.rb
185
+ - lib/effective_resources/effective_gem.rb
183
186
  - lib/effective_resources/engine.rb
184
187
  - lib/effective_resources/version.rb
185
188
  - lib/generators/effective_resources/install_generator.rb