godmin 1.5.0 → 2.0.0

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.
Files changed (56) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +8 -5
  4. data/Appraisals +4 -4
  5. data/CHANGELOG.md +51 -2
  6. data/Gemfile +1 -1
  7. data/README.md +38 -5
  8. data/Rakefile +2 -2
  9. data/gemfiles/rails_5.gemfile +2 -2
  10. data/gemfiles/rails_6.gemfile +8 -0
  11. data/godmin.gemspec +18 -15
  12. data/lib/generators/godmin/resource/resource_generator.rb +7 -1
  13. data/lib/generators/godmin/resource/templates/resource_model.rb +4 -0
  14. data/lib/godmin/application_controller.rb +10 -11
  15. data/lib/godmin/authentication.rb +11 -11
  16. data/lib/godmin/authentication/sessions_controller.rb +1 -0
  17. data/lib/godmin/authorization.rb +6 -20
  18. data/lib/godmin/engine_wrapper.rb +10 -1
  19. data/lib/godmin/generators/base.rb +4 -4
  20. data/lib/godmin/generators/named_base.rb +4 -4
  21. data/lib/godmin/helpers/application.rb +3 -3
  22. data/lib/godmin/resolver.rb +20 -5
  23. data/lib/godmin/resources/resource_controller/batch_actions.rb +1 -1
  24. data/lib/godmin/resources/resource_service.rb +1 -5
  25. data/lib/godmin/version.rb +1 -1
  26. data/template.rb +3 -3
  27. data/test/dummy/admin/app/controllers/admin/authorized_articles_controller.rb +15 -0
  28. data/test/dummy/admin/app/models/admin/article.rb +4 -0
  29. data/test/dummy/admin/app/policies/admin/article_policy.rb +7 -0
  30. data/test/dummy/admin/config/routes.rb +1 -0
  31. data/test/dummy/app/assets/config/manifest.js +4 -0
  32. data/test/dummy/app/controllers/another_admin_sessions_controller.rb +0 -2
  33. data/test/dummy/db/migrate/20150717121532_create_articles.rb +1 -1
  34. data/test/dummy/db/migrate/20150907133753_create_admin_users.rb +1 -1
  35. data/test/dummy/db/migrate/20160713134238_create_comment.rb +1 -1
  36. data/test/dummy/db/schema.rb +17 -16
  37. data/test/fakes/article.rb +1 -1
  38. data/test/fakes/article_service.rb +3 -7
  39. data/test/generators/resource_generator_test.rb +77 -0
  40. data/test/integration/authentication_test.rb +3 -8
  41. data/test/integration/authorization_test.rb +5 -0
  42. data/test/{lib/godmin → unit}/engine_wrapper_test.rb +0 -0
  43. data/test/{lib/godmin → unit}/helpers/filters_test.rb +0 -0
  44. data/test/{lib/godmin → unit}/paginator_test.rb +0 -0
  45. data/test/{lib/godmin → unit}/resolver_test.rb +0 -0
  46. data/test/{lib/godmin → unit}/resources/resource_service/batch_actions_test.rb +0 -0
  47. data/test/{lib/godmin → unit}/resources/resource_service/filters_test.rb +0 -0
  48. data/test/{lib/godmin → unit}/resources/resource_service/ordering_test.rb +0 -0
  49. data/test/{lib/godmin → unit}/resources/resource_service/pagination_test.rb +0 -0
  50. data/test/{lib/godmin → unit}/resources/resource_service/scopes_test.rb +0 -0
  51. data/test/{lib/godmin → unit}/resources/resource_service_test.rb +0 -0
  52. metadata +139 -85
  53. data/gemfiles/rails_4.gemfile +0 -8
  54. data/lib/godmin/authorization/policy_finder.rb +0 -31
  55. data/lib/tasks/godmin_tasks.rake +0 -4
  56. data/test/lib/godmin/policy_finder_test.rb +0 -55
@@ -4,7 +4,7 @@ class Godmin::ResourceGenerator < Godmin::Generators::NamedBase
4
4
  argument :attributes, type: :array, default: [], banner: "attribute attribute"
5
5
 
6
6
  def add_route
7
- route "resources :#{file_name.pluralize}"
7
+ invoke "resource_route"
8
8
  end
9
9
 
10
10
  def add_navigation
@@ -15,6 +15,12 @@ class Godmin::ResourceGenerator < Godmin::Generators::NamedBase
15
15
  end
16
16
  end
17
17
 
18
+ def create_model
19
+ if namespaced?
20
+ template "resource_model.rb", File.join("app/models", class_path, "#{file_name}.rb")
21
+ end
22
+ end
23
+
18
24
  def create_controller
19
25
  template "resource_controller.rb", File.join("app/controllers", class_path, "#{file_name.pluralize}_controller.rb")
20
26
  end
@@ -0,0 +1,4 @@
1
+ <% module_namespacing do -%>
2
+ class <%= class_name %> < ::<%= class_name %>
3
+ end
4
+ <% end -%>
@@ -28,15 +28,6 @@ module Godmin
28
28
 
29
29
  protected
30
30
 
31
- def redirect_back
32
- case Rails::VERSION::MAJOR
33
- when 4
34
- redirect_to :back
35
- when 5
36
- super(fallback_location: root_path)
37
- end
38
- end
39
-
40
31
  private
41
32
 
42
33
  def engine_wrapper
@@ -47,12 +38,20 @@ module Godmin
47
38
  append_view_path Godmin::Resolver.resolvers(controller_path, engine_wrapper)
48
39
  end
49
40
 
41
+ def disable_authentication
42
+ @_disable_authentication = true
43
+ end
44
+
45
+ def disable_authorization
46
+ @_disable_authorization = true
47
+ end
48
+
50
49
  def authentication_enabled?
51
- singleton_class.include?(Godmin::Authentication)
50
+ !@_disable_authentication && singleton_class.include?(Godmin::Authentication)
52
51
  end
53
52
 
54
53
  def authorization_enabled?
55
- singleton_class.include?(Godmin::Authorization)
54
+ !@_disable_authorization && singleton_class.include?(Godmin::Authorization)
56
55
  end
57
56
  end
58
57
  end
@@ -6,26 +6,26 @@ module Godmin
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  included do
9
- before_action :authenticate_admin_user
9
+ before_action :authenticate
10
10
 
11
11
  helper_method :admin_user
12
12
  helper_method :admin_user_signed_in?
13
13
  end
14
14
 
15
- def authenticate_admin_user
16
- unless admin_user_signed_in? || controller_name == "sessions"
17
- redirect_to new_session_path
18
- end
19
- end
15
+ def authenticate
16
+ return unless authentication_enabled?
17
+ return if admin_user_signed_in?
20
18
 
21
- def admin_user_class
22
- raise NotImplementedError, "Must define the admin user class"
19
+ redirect_to new_session_path
23
20
  end
24
21
 
22
+ def admin_user_class; end
23
+
25
24
  def admin_user
26
- if session[:admin_user_id]
27
- @admin_user ||= admin_user_class.find_by(id: session[:admin_user_id])
28
- end
25
+ return unless admin_user_class
26
+ return unless session[:admin_user_id]
27
+
28
+ @_admin_user ||= admin_user_class.find_by(id: session[:admin_user_id])
29
29
  end
30
30
 
31
31
  def admin_user_signed_in?
@@ -5,6 +5,7 @@ module Godmin
5
5
 
6
6
  included do
7
7
  layout "godmin/login"
8
+ prepend_before_action :disable_authentication
8
9
  end
9
10
 
10
11
  def new
@@ -1,34 +1,20 @@
1
+ require "pundit"
1
2
  require "godmin/authorization/policy"
2
- require "godmin/authorization/policy_finder"
3
3
 
4
4
  module Godmin
5
5
  module Authorization
6
6
  extend ActiveSupport::Concern
7
7
 
8
- included do
9
- helper_method :policy
8
+ include Pundit
10
9
 
11
- rescue_from NotAuthorizedError do
10
+ included do
11
+ rescue_from Pundit::NotAuthorizedError do
12
12
  render plain: "You are not authorized to do this", status: 403, layout: "godmin/login"
13
13
  end
14
14
  end
15
15
 
16
- def authorize(record, query = nil)
17
- policy = policy(record)
18
-
19
- unless policy.public_send(query || action_name + "?")
20
- fail NotAuthorizedError
21
- end
16
+ def pundit_user
17
+ admin_user
22
18
  end
23
-
24
- def policy(record)
25
- policies[record] ||= PolicyFinder.find(record, engine_wrapper.namespace).new(admin_user, record)
26
- end
27
-
28
- def policies
29
- @_policies ||= {}
30
- end
31
-
32
- class NotAuthorizedError < StandardError; end
33
19
  end
34
20
  end
@@ -40,8 +40,17 @@ module Godmin
40
40
  end
41
41
  end
42
42
 
43
+ # Some gymnastics because the `parents` function is slated for deprecation
44
+ # and being replaced by `module_parents` and we don't want to clutter our
45
+ # log with a million warnings
46
+ def parents_of(controller)
47
+ return controller.module_parents if controller.respond_to?(:module_parents)
48
+
49
+ controller.parents
50
+ end
51
+
43
52
  def find_engine_module(controller)
44
- controller.parents.find do |parent|
53
+ parents_of(controller).find do |parent|
45
54
  parent.respond_to?(:use_relative_model_naming?) && parent.use_relative_model_naming?
46
55
  end
47
56
  end
@@ -4,7 +4,7 @@ module Godmin
4
4
  module Generators
5
5
  class Base < Rails::Generators::Base
6
6
  def self.source_paths
7
- %w(authentication install policy resource).map do |path|
7
+ %w[authentication install policy resource].map do |path|
8
8
  File.expand_path("../../../generators/godmin/#{path}/templates", __FILE__)
9
9
  end
10
10
  end
@@ -12,15 +12,15 @@ module Godmin
12
12
  private
13
13
 
14
14
  def namespace
15
- @namespace ||= Rails::Generators.namespace
15
+ @_namespace ||= Rails::Generators.namespace
16
16
  end
17
17
 
18
18
  def namespaced?
19
- @namespaced ||= namespace.present?
19
+ @_namespaced ||= namespace.present?
20
20
  end
21
21
 
22
22
  def namespaced_path
23
- @namespaced_path ||= begin
23
+ @_namespaced_path ||= begin
24
24
  if namespaced?
25
25
  namespace.name.split("::").map(&:underscore)
26
26
  else
@@ -8,7 +8,7 @@ module Godmin
8
8
  private
9
9
 
10
10
  def full_class_name
11
- if namespace
11
+ if namespaced?
12
12
  "#{namespace}::#{class_name}"
13
13
  else
14
14
  class_name
@@ -16,15 +16,15 @@ module Godmin
16
16
  end
17
17
 
18
18
  def class_name
19
- @class_name ||= name.classify
19
+ @_class_name ||= name.classify
20
20
  end
21
21
 
22
22
  def class_path
23
- @class_path ||= namespaced_path + name.classify.deconstantize.split("::").map(&:underscore)
23
+ @_class_path ||= namespaced_path + name.classify.deconstantize.split("::").map(&:underscore)
24
24
  end
25
25
 
26
26
  def file_name
27
- @file_name ||= class_name.demodulize.underscore
27
+ @_file_name ||= class_name.demodulize.underscore
28
28
  end
29
29
  end
30
30
  end
@@ -4,17 +4,17 @@ module Godmin
4
4
  # Renders the provided partial with locals if it exists, otherwise
5
5
  # yields the given block. The lookup context call is cached for
6
6
  # each partial.
7
- def partial_override(partial, locals = {})
7
+ def partial_override(partial, locals = {}, &block)
8
8
  @_partial_override ||= {}
9
9
 
10
- if @_partial_override[partial].nil?
10
+ unless @_partial_override.key?(partial)
11
11
  @_partial_override[partial] = lookup_context.exists?(partial, nil, true)
12
12
  end
13
13
 
14
14
  if @_partial_override[partial]
15
15
  render partial: partial, locals: locals
16
16
  else
17
- yield
17
+ capture(&block)
18
18
  end
19
19
  end
20
20
 
@@ -16,15 +16,30 @@ module Godmin
16
16
  @engine_wrapper = engine_wrapper
17
17
  end
18
18
 
19
+ # This function is for Rails 6 and up since the `find_templates` function
20
+ # is deprecated. It does the same thing, just a little differently. It's
21
+ # not being run by versions previous to Rails 6.
22
+ def _find_all(name, prefix, partial, details, key, locals)
23
+ templates = []
24
+
25
+ template_paths(prefix).each do |p|
26
+ break if templates.present?
27
+
28
+ path = Path.build(name, "#{@path}/#{p}", partial)
29
+ templates = query(path, details, details[:formats], locals, cache: !!key)
30
+ end
31
+
32
+ templates
33
+ end
34
+
35
+ # This is how we find templates in Rails 5 and below.
19
36
  def find_templates(name, prefix, *args)
20
37
  templates = []
21
38
 
22
39
  template_paths(prefix).each do |path|
23
- if templates.present?
24
- break
25
- else
26
- templates = super(name, path, *args)
27
- end
40
+ break if templates.present?
41
+
42
+ templates = super(name, path, *args)
28
43
  end
29
44
 
30
45
  templates
@@ -33,7 +33,7 @@ module Godmin
33
33
  end
34
34
  end
35
35
 
36
- redirect_back
36
+ redirect_back(fallback_location: root_path)
37
37
  end
38
38
 
39
39
  def batch_action_ids
@@ -24,11 +24,7 @@ module Godmin
24
24
  end
25
25
 
26
26
  def resource_class
27
- @options[:resource_class] || resource_class_name.constantize
28
- end
29
-
30
- def resource_class_name
31
- self.class.name.demodulize.chomp("Service")
27
+ self.class.name.chomp("Service").constantize
32
28
  end
33
29
 
34
30
  def resources_relation
@@ -1,3 +1,3 @@
1
1
  module Godmin
2
- VERSION = "1.5.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -3,7 +3,7 @@ require "active_support/all"
3
3
  def install_standalone
4
4
  set_ruby_version
5
5
 
6
- gem "godmin", "1.3.1"
6
+ gem "godmin", "1.5.0"
7
7
 
8
8
  after_bundle do
9
9
  create_database
@@ -36,7 +36,7 @@ def install_engine
36
36
 
37
37
  inject_into_file "admin/admin.gemspec", before: /^end/ do
38
38
  <<-END.strip_heredoc.indent(2)
39
- s.add_dependency "godmin", "~> 1.3.1"
39
+ s.add_dependency "godmin", "~> 1.5.0"
40
40
  END
41
41
  end
42
42
 
@@ -71,7 +71,7 @@ end
71
71
 
72
72
  def set_ruby_version
73
73
  prepend_to_file "Gemfile" do
74
- "ruby '2.2.2'\n"
74
+ "ruby '2.3.5'\n"
75
75
  end
76
76
  end
77
77
 
@@ -0,0 +1,15 @@
1
+ require_dependency "admin/articles_controller"
2
+
3
+ module Admin
4
+ class AuthorizedArticlesController < ArticlesController
5
+ include Godmin::Authorization
6
+
7
+ def admin_user
8
+ "admin"
9
+ end
10
+
11
+ def resource_service_class
12
+ Admin::ArticleService
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module Admin
2
+ class Article < ::Article
3
+ end
4
+ end
@@ -0,0 +1,7 @@
1
+ module Admin
2
+ class ArticlePolicy < Godmin::Authorization::Policy
3
+ def index?
4
+ false
5
+ end
6
+ end
7
+ end
@@ -1,4 +1,5 @@
1
1
  Admin::Engine.routes.draw do
2
2
  resources :articles
3
+ resources :authorized_articles
3
4
  root to: "application#welcome"
4
5
  end
@@ -0,0 +1,4 @@
1
+ //= link application.css
2
+ //= link application.js
3
+ //= link admin/application.css
4
+ //= link admin/application.js
@@ -2,8 +2,6 @@ class AnotherAdminSessionsController < ApplicationController
2
2
  include Godmin::Authentication::SessionsController
3
3
  include Godmin::Authentication
4
4
 
5
- skip_before_action :authenticate_admin_user
6
-
7
5
  def admin_user_class
8
6
  AnotherAdminUser
9
7
  end
@@ -1,4 +1,4 @@
1
- class CreateArticles < ActiveRecord::Migration
1
+ class CreateArticles < ActiveRecord::Migration[5.0]
2
2
  def change
3
3
  create_table :articles do |t|
4
4
  t.string :title
@@ -1,4 +1,4 @@
1
- class CreateAdminUsers < ActiveRecord::Migration
1
+ class CreateAdminUsers < ActiveRecord::Migration[5.0]
2
2
  def change
3
3
  create_table :admin_users do |t|
4
4
  t.string :email
@@ -1,4 +1,4 @@
1
- class CreateComment < ActiveRecord::Migration
1
+ class CreateComment < ActiveRecord::Migration[5.0]
2
2
  def change
3
3
  create_table :comments do |t|
4
4
  t.references :article, index: true, foreign_key: true
@@ -13,32 +13,33 @@
13
13
  ActiveRecord::Schema.define(version: 20170207081043) do
14
14
 
15
15
  create_table "admin_users", force: :cascade do |t|
16
- t.string "email"
17
- t.text "password_digest"
18
- t.datetime "created_at", null: false
19
- t.datetime "updated_at", null: false
16
+ t.string "email"
17
+ t.text "password_digest"
18
+ t.datetime "created_at", null: false
19
+ t.datetime "updated_at", null: false
20
20
  end
21
21
 
22
22
  create_table "another_admin_users", force: :cascade do |t|
23
- t.string "email"
24
- t.text "password_digest"
25
- t.datetime "created_at", null: false
26
- t.datetime "updated_at", null: false
23
+ t.string "email"
24
+ t.text "password_digest"
25
+ t.datetime "created_at", null: false
26
+ t.datetime "updated_at", null: false
27
27
  end
28
28
 
29
29
  create_table "articles", force: :cascade do |t|
30
- t.string "title"
31
- t.text "body"
32
- t.boolean "published", default: false
33
- t.integer "admin_user_id"
34
- t.datetime "created_at", null: false
35
- t.datetime "updated_at", null: false
30
+ t.string "title"
31
+ t.text "body"
32
+ t.boolean "published", default: false
33
+ t.integer "admin_user_id"
34
+ t.datetime "created_at", null: false
35
+ t.datetime "updated_at", null: false
36
+ t.index ["admin_user_id"], name: "index_articles_on_admin_user_id"
36
37
  end
37
38
 
38
39
  create_table "comments", force: :cascade do |t|
39
40
  t.integer "article_id"
40
- t.string "title"
41
- t.text "body"
41
+ t.string "title"
42
+ t.text "body"
42
43
  t.index ["article_id"], name: "index_comments_on_article_id"
43
44
  end
44
45