effective_resources 1.7.5 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2c872b773ee626165d7d0dee9d363e9375fd7702c9f0330ce2492c380fcac45b
4
- data.tar.gz: eadd2e25503395461ea1823d8b9e719eb80cb405373fcae2253c3467631c18ea
3
+ metadata.gz: ba1ab3c1064882ff12132711f5b5e52baffd2448ca53097739f6fc5da17ded8e
4
+ data.tar.gz: 0444d91c34c0e2bccae26dbd042d80d491d829e19f6f0dccf720ad975eb0ee14
5
5
  SHA512:
6
- metadata.gz: 2a91bcaab5fe78374b9771ddfe9117bb0594202e1e91dfc9d39922dc153b0ea38d64a5643365488097efb9fd258d8915fbdea12e7b9b7098fec456f46f9bbe30
7
- data.tar.gz: b49ff8dc969fbb45db46a4db1ed97b3f369a2734db20e2c5957b28fe0aa5928045ef73d8170e06a975170dca40d8c5a5d09d3e31600b00904783ce35dca6ea2a
6
+ metadata.gz: 1bed68ed75113db85e5a10372dd148847464855f7bee2d4699366efdb3df2046a1e8ca001c9c6fadee838b6f67b5f900ca7429a9888b286c66db1db17d2e7996
7
+ data.tar.gz: 0caf48a95cb7600b104fe0ca679c9780552fc99f61e1f8ce005b5e24f241a93cd340c6222ee3ce43a6ab85e93380511d1b5184c25795a5138423fb35b2cbd78c
data/README.md CHANGED
@@ -362,7 +362,7 @@ rails test
362
362
 
363
363
  ## License
364
364
 
365
- MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
365
+ MIT License. Copyright [Code and Effect Inc.](http://www.codeandeffect.com/)
366
366
 
367
367
  ## Contributing
368
368
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Effective
2
3
  module CrudController
3
4
  extend ActiveSupport::Concern
@@ -12,6 +13,7 @@ module Effective
12
13
  included do
13
14
  define_actions_from_routes
14
15
  define_callbacks :resource_render, :resource_before_save, :resource_after_save, :resource_after_commit, :resource_error
16
+ layout -> { resource_layout }
15
17
  end
16
18
 
17
19
  module ClassMethods
@@ -111,6 +113,11 @@ module Effective
111
113
  datatable
112
114
  end
113
115
 
116
+ def resource_layout
117
+ namespace = controller_path.include?('admin/') ? 'admin' : 'application'
118
+ defined?(Tenant) ? "#{Tenant.current}/#{namespace}" : namespace
119
+ end
120
+
114
121
  def resource_params_method_name
115
122
  ['permitted_params', "#{resource_name}_params", "#{resource_plural_name}_params"].each do |name|
116
123
  return name if respond_to?(name, true)
@@ -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 },
@@ -44,7 +46,7 @@ module ActsAsSlugged
44
46
 
45
47
  # Instance Methods
46
48
  def build_slug
47
- slug = self.to_s.parameterize.downcase[0, 250]
49
+ slug = to_s.parameterize.downcase[0, 250]
48
50
 
49
51
  if self.class.excluded_slugs.include?(slug)
50
52
  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
@@ -27,6 +27,7 @@ module Effective
27
27
  @type ||= (
28
28
  case obj
29
29
  when :boolean ; :boolean
30
+ when :config ; :config
30
31
  when :currency ; :currency
31
32
  when :date ; :date
32
33
  when :datetime ; :datetime
@@ -73,6 +74,9 @@ module Effective
73
74
  case type
74
75
  when :boolean
75
76
  [true, 'true', 't', '1'].include?(value)
77
+ when :config
78
+ raise('expected an ActiveSupport::OrderedOptions') unless value.kind_of?(ActiveSupport::OrderedOptions)
79
+ parse_ordered_options(value)
76
80
  when :date, :datetime
77
81
  if (digits = value.to_s.scan(/(\d+)/).flatten).present?
78
82
  date = if digits.first.length == 4 # 2017-01-10
@@ -169,5 +173,14 @@ module Effective
169
173
  name == other.name && type == other.type
170
174
  end
171
175
 
176
+ # This returns a nested ActiveSupport::OrderedOptions.new config
177
+ def parse_ordered_options(obj)
178
+ return obj unless obj.kind_of?(Hash)
179
+
180
+ ActiveSupport::OrderedOptions.new.tap do |config|
181
+ obj.each { |key, value| config[key] = parse_ordered_options(value) }
182
+ end
183
+ end
184
+
172
185
  end
173
186
  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
@@ -1,3 +1,3 @@
1
1
  module EffectiveResources
2
- VERSION = '1.7.5'.freeze
2
+ VERSION = '1.8.1'.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.5
4
+ version: 1.8.1
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-16 00:00:00.000000000 Z
11
+ date: 2021-03-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -155,6 +155,7 @@ files:
155
155
  - app/models/effective/resources/attributes.rb
156
156
  - app/models/effective/resources/controller.rb
157
157
  - app/models/effective/resources/forms.rb
158
+ - app/models/effective/resources/generator.rb
158
159
  - app/models/effective/resources/init.rb
159
160
  - app/models/effective/resources/instance.rb
160
161
  - app/models/effective/resources/klass.rb
@@ -180,6 +181,7 @@ files:
180
181
  - app/views/effective/resource/_actions_glyphicons.html.haml
181
182
  - config/effective_resources.rb
182
183
  - lib/effective_resources.rb
184
+ - lib/effective_resources/effective_gem.rb
183
185
  - lib/effective_resources/engine.rb
184
186
  - lib/effective_resources/version.rb
185
187
  - lib/generators/effective_resources/install_generator.rb