ditty 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (123) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.pryrc +2 -0
  4. data/.rubocop.yml +1 -1
  5. data/.travis.yml +5 -4
  6. data/CNAME +1 -0
  7. data/Dockerfile +18 -0
  8. data/Gemfile.ci +0 -2
  9. data/Rakefile +2 -2
  10. data/_config.yml +1 -0
  11. data/config.ru +4 -4
  12. data/ditty.gemspec +9 -3
  13. data/docs/CNAME +1 -0
  14. data/docs/_config.yml +1 -0
  15. data/docs/index.md +34 -0
  16. data/exe/ditty +2 -0
  17. data/lib/ditty.rb +4 -2
  18. data/lib/ditty/cli.rb +28 -4
  19. data/lib/ditty/components/{app.rb → ditty.rb} +19 -14
  20. data/lib/ditty/controllers/{application.rb → application_controller.rb} +58 -29
  21. data/lib/ditty/controllers/{audit_logs.rb → audit_logs_controller.rb} +2 -2
  22. data/lib/ditty/controllers/{auth.rb → auth_controller.rb} +17 -16
  23. data/lib/ditty/controllers/{component.rb → component_controller.rb} +19 -18
  24. data/lib/ditty/controllers/{main.rb → main_controller.rb} +6 -2
  25. data/lib/ditty/controllers/roles_controller.rb +23 -0
  26. data/lib/ditty/controllers/{user_login_traits.rb → user_login_traits_controller.rb} +4 -3
  27. data/lib/ditty/controllers/{users.rb → users_controller.rb} +11 -10
  28. data/lib/ditty/db.rb +4 -3
  29. data/lib/ditty/emails/base.rb +5 -2
  30. data/lib/ditty/generators/crud_generator.rb +104 -0
  31. data/lib/ditty/generators/migration_generator.rb +26 -0
  32. data/lib/ditty/generators/project_generator.rb +51 -0
  33. data/lib/ditty/helpers/component.rb +2 -1
  34. data/lib/ditty/helpers/pundit.rb +20 -4
  35. data/lib/ditty/helpers/response.rb +20 -13
  36. data/lib/ditty/helpers/views.rb +7 -3
  37. data/lib/ditty/listener.rb +5 -3
  38. data/lib/ditty/memcached.rb +8 -0
  39. data/lib/ditty/middleware/accept_extension.rb +2 -2
  40. data/lib/ditty/middleware/error_catchall.rb +2 -2
  41. data/lib/ditty/models/base.rb +4 -0
  42. data/lib/ditty/models/role.rb +1 -0
  43. data/lib/ditty/models/user.rb +14 -1
  44. data/lib/ditty/policies/role_policy.rb +1 -1
  45. data/lib/ditty/policies/user_login_trait_policy.rb +1 -1
  46. data/lib/ditty/services/authentication.rb +11 -10
  47. data/lib/ditty/services/email.rb +8 -4
  48. data/lib/ditty/services/logger.rb +1 -1
  49. data/lib/ditty/tasks/ditty.rake +17 -0
  50. data/lib/ditty/tasks/omniauth-ldap.rake +2 -2
  51. data/lib/ditty/templates/.gitignore +5 -0
  52. data/lib/ditty/templates/.rspec +2 -0
  53. data/lib/ditty/templates/.rubocop.yml +7 -0
  54. data/lib/ditty/templates/Rakefile +12 -0
  55. data/lib/ditty/templates/application.rb +12 -0
  56. data/lib/ditty/templates/config.ru +37 -0
  57. data/lib/ditty/templates/controller.rb.erb +58 -0
  58. data/lib/ditty/templates/env.example +4 -0
  59. data/lib/ditty/templates/lib/project.rb.erb +5 -0
  60. data/lib/ditty/templates/migration.rb.erb +7 -0
  61. data/lib/ditty/templates/model.rb.erb +26 -0
  62. data/lib/ditty/templates/pids/.empty_directory +0 -0
  63. data/lib/ditty/templates/policy.rb.erb +48 -0
  64. data/lib/ditty/templates/public/css/sb-admin-2.min.css +10 -0
  65. data/lib/ditty/templates/public/js/sb-admin-2.min.js +7 -0
  66. data/lib/ditty/templates/settings.yml.erb +18 -0
  67. data/lib/ditty/templates/sidekiq.rb +18 -0
  68. data/lib/ditty/templates/sidekiq.yml +9 -0
  69. data/lib/ditty/templates/spec_helper.rb +43 -0
  70. data/lib/ditty/templates/type.rb.erb +21 -0
  71. data/lib/ditty/templates/views/display.haml.tt +20 -0
  72. data/lib/ditty/templates/views/edit.haml.tt +10 -0
  73. data/lib/ditty/templates/views/form.haml.tt +11 -0
  74. data/lib/ditty/templates/views/index.haml.tt +29 -0
  75. data/lib/ditty/templates/views/new.haml.tt +10 -0
  76. data/lib/ditty/version.rb +1 -1
  77. data/lib/rubocop/cop/ditty/call_services_directly.rb +2 -2
  78. data/migrate/20181209_add_user_login_traits.rb +4 -4
  79. data/migrate/20190220_add_parent_id_to_roles.rb +9 -0
  80. data/public/css/styles.css +13 -0
  81. data/public/js/scripts.js +1 -0
  82. data/views/404.haml +2 -4
  83. data/views/audit_logs/index.haml +32 -34
  84. data/views/auth/forgot_password.haml +27 -16
  85. data/views/auth/identity.haml +14 -13
  86. data/views/auth/ldap.haml +2 -2
  87. data/views/auth/login.haml +22 -17
  88. data/views/auth/register.haml +19 -18
  89. data/views/auth/register_identity.haml +27 -12
  90. data/views/auth/reset_password.haml +2 -2
  91. data/views/blank.haml +42 -0
  92. data/views/index.haml +1 -1
  93. data/views/layout.haml +37 -30
  94. data/views/partials/content_tag.haml +0 -0
  95. data/views/partials/delete_form.haml +1 -1
  96. data/views/partials/filter_control.haml +1 -1
  97. data/views/partials/footer.haml +5 -5
  98. data/views/partials/form_control.haml +19 -12
  99. data/views/partials/navitems.haml +44 -0
  100. data/views/partials/notifications.haml +12 -8
  101. data/views/partials/pager.haml +17 -17
  102. data/views/partials/search.haml +6 -7
  103. data/views/partials/sidebar.haml +15 -37
  104. data/views/partials/topbar.haml +68 -0
  105. data/views/roles/display.haml +27 -6
  106. data/views/roles/edit.haml +3 -3
  107. data/views/roles/form.haml +1 -0
  108. data/views/roles/index.haml +23 -16
  109. data/views/roles/new.haml +2 -2
  110. data/views/user_login_traits/display.haml +4 -4
  111. data/views/user_login_traits/edit.haml +3 -3
  112. data/views/user_login_traits/index.haml +4 -4
  113. data/views/user_login_traits/new.haml +2 -2
  114. data/views/users/display.haml +11 -12
  115. data/views/users/edit.haml +3 -3
  116. data/views/users/form.haml +0 -0
  117. data/views/users/index.haml +31 -24
  118. data/views/users/login_traits.haml +6 -8
  119. data/views/users/new.haml +2 -2
  120. data/views/users/profile.haml +13 -13
  121. metadata +143 -15
  122. data/lib/ditty/controllers/roles.rb +0 -13
  123. data/views/partials/navbar.haml +0 -22
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor/group'
4
+ require 'active_support/inflector'
5
+
6
+ module Ditty
7
+ module Generators
8
+ class MigrationGenerator < Thor::Group
9
+ include Thor::Actions
10
+
11
+ attr_reader :namespace, :folder
12
+
13
+ desc 'Creates a new Sequel migration for the current project'
14
+ argument :name, type: :string, desc: 'Name of the migration'
15
+
16
+ def self.source_root
17
+ File.expand_path('../templates', __dir__)
18
+ end
19
+
20
+ def create_model
21
+ filename = File.join('migrations', "#{Time.now.strftime('%Y%m%d')}_#{name.underscore}.rb")
22
+ template '../templates/migration.rb.erb', filename
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'thor/group'
4
+ require 'active_support/inflector'
5
+
6
+ module Ditty
7
+ module Generators
8
+ class ProjectGenerator < Thor::Group
9
+ include Thor::Actions
10
+
11
+ attr_reader :name, :namespace, :folder
12
+
13
+ desc 'Initialize a new Ditty project in the current folder'
14
+
15
+ def setup
16
+ @name = File.basename(Dir.getwd)
17
+ @folder = @name.underscore
18
+ @namespace = folder.classify
19
+ @name = @name.titleize
20
+ end
21
+
22
+ def self.source_root
23
+ File.expand_path('../templates', __dir__)
24
+ end
25
+
26
+ def create_startup_files
27
+ directory 'logs'
28
+ directory 'pids'
29
+ directory 'public'
30
+ copy_file '.gitignore', './.gitignore'
31
+ copy_file 'env.example', './.env'
32
+ copy_file '.rubocop.yml', './.rubocop.yml'
33
+ copy_file '.rspec', './.rspec'
34
+
35
+ template 'lib/project.rb.erb', "lib/#{folder}.rb"
36
+
37
+ copy_file 'application.rb', './application.rb'
38
+ copy_file 'config.ru', './config.ru'
39
+ copy_file 'Rakefile', './Rakefile'
40
+ copy_file 'sidekiq.rb', './config/sidekiq.rb'
41
+ copy_file 'sidekiq.yml', './config/sidekiq.yml'
42
+
43
+ copy_file 'spec_helper.rb', './specs/spec_helper.rb'
44
+ copy_file '../../../spec/support/api_shared_examples.rb', './specs/support/api_shared_examples.rb'
45
+ copy_file '../../../spec/support/crud_shared_examples.rb', './specs/support/crud_shared_examples.rb'
46
+
47
+ template 'settings.yml.erb', './config/settings.yml'
48
+ end
49
+ end
50
+ end
51
+ end
@@ -33,11 +33,12 @@ module Ditty
33
33
  param :q, String
34
34
  param :page, Integer, min: 1, default: 1
35
35
  param :sort, String
36
- param :order, String, in: %w[asc desc], transform: :downcase, default: 'asc'
36
+ param :order, String, in: %w[asc desc], transform: :downcase
37
37
  # TODO: Can we dynamically validate the search / filter fields?
38
38
 
39
39
  ds = dataset
40
40
  ds = ds.dataset if ds.respond_to?(:dataset)
41
+ params[:order] ||= 'asc' if params[:sort]
41
42
  return ds if params[:count] == 'all'
42
43
 
43
44
  params[:count] = check_count
@@ -12,23 +12,39 @@ module Ditty
12
12
  super
13
13
  end
14
14
 
15
- def permitted_attributes(record, action)
16
- param_key = PolicyFinder.new(record).param_key
15
+ def permitted_attributes(record, action = nil)
17
16
  policy = policy(record)
17
+ action ||= record.new? ? :create : :update
18
18
  method_name = if policy.respond_to?("permitted_attributes_for_#{action}")
19
19
  "permitted_attributes_for_#{action}"
20
20
  else
21
21
  'permitted_attributes'
22
22
  end
23
+ policy.public_send(method_name)
24
+ end
23
25
 
24
- policy_fields = policy.public_send(method_name)
26
+ def permitted_parameters(record, action = nil)
27
+ param_key = PolicyFinder.new(record).param_key
28
+ policy_fields = permitted_attributes(record, action)
25
29
  request.params.fetch(param_key, {}).select do |key, _value|
26
30
  policy_fields.include? key.to_sym
27
31
  end
28
32
  end
29
33
 
34
+ def permitted_response_attributes(record, method = :values)
35
+ policy = policy(record)
36
+ response = record.send(method)
37
+
38
+ return response unless policy.respond_to? :response_attributes
39
+
40
+ policy_fields = policy.response_attributes
41
+ response.select do |key, _value|
42
+ policy_fields.include? key.to_sym
43
+ end
44
+ end
45
+
30
46
  def pundit_user
31
- current_user
47
+ current_user unless current_user&.anonymous?
32
48
  end
33
49
  end
34
50
  end
@@ -2,15 +2,17 @@
2
2
 
3
3
  require 'csv'
4
4
 
5
+ require 'csv'
6
+
5
7
  module Ditty
6
8
  module Helpers
7
9
  module Response
8
- def list_response(result)
10
+ def list_response(result, view: 'index')
9
11
  respond_to do |format|
10
12
  format.html do
11
13
  actions = {}
12
14
  actions["#{base_path}/new"] = "New #{heading}" if policy(settings.model_class).create?
13
- haml :"#{view_location}/index",
15
+ haml :"#{view_location}/#{view}",
14
16
  locals: { list: result, title: heading(:list), actions: actions },
15
17
  layout: layout
16
18
  end
@@ -18,7 +20,7 @@ module Ditty
18
20
  # TODO: Add links defined by actions (New #{heading})
19
21
  total = result.respond_to?(:pagination_record_count) ? result.pagination_record_count : result.count
20
22
  json(
21
- 'items' => result.all.map(&:for_json),
23
+ 'items' => result.all.map { |e| permitted_response_attributes(e, :for_json) },
22
24
  'page' => (params['page'] || 1).to_i,
23
25
  'count' => result.count,
24
26
  'total' => total
@@ -39,18 +41,18 @@ module Ditty
39
41
  respond_to do |format|
40
42
  format.html do
41
43
  flash[:success] = "#{heading} Created"
42
- redirect with_layout("#{base_path}/#{entity.id}")
44
+ redirect with_layout(flash[:redirect_to] || "#{base_path}/#{entity.display_id}")
43
45
  end
44
46
  format.json do
45
47
  content_type :json
46
- redirect "#{base_path}/#{entity.id}", 201
48
+ redirect "#{base_path}/#{entity.display_id}", 201
47
49
  end
48
50
  end
49
51
  end
50
52
 
51
53
  def actions(entity = nil)
52
54
  actions = {}
53
- actions["#{base_path}/#{entity.id}/edit"] = "Edit #{heading}" if entity && policy(entity).update?
55
+ actions["#{base_path}/#{entity.display_id}/edit"] = "Edit #{heading}" if entity && policy(entity).update?
54
56
  actions["#{base_path}/new"] = "New #{heading}" if policy(settings.model_class).create?
55
57
  actions
56
58
  end
@@ -66,7 +68,13 @@ module Ditty
66
68
  end
67
69
  format.json do
68
70
  # TODO: Add links defined by actions (Edit #{heading})
69
- json entity.for_json
71
+ json permitted_response_attributes(entity, :for_json)
72
+ end
73
+ format.csv do
74
+ CSV.generate do |csv|
75
+ csv << entity.for_csv.keys
76
+ csv << entity.for_csv.values
77
+ end
70
78
  end
71
79
  format.csv do
72
80
  CSV.generate do |csv|
@@ -82,11 +90,11 @@ module Ditty
82
90
  format.html do
83
91
  # TODO: Ability to customize the return path and message?
84
92
  flash[:success] = "#{heading} Updated"
85
- redirect with_layout("#{base_path}/#{entity.id}")
93
+ redirect with_layout(flash[:redirect_to] || back || "#{base_path}/#{entity.display_id}")
86
94
  end
87
95
  format.json do
88
- headers 'Location' => "#{base_path}/#{entity.id}"
89
- json body entity.for_json
96
+ content_type :json
97
+ redirect "#{base_path}/#{entity.display_id}", 200, json(entity.for_json)
90
98
  end
91
99
  end
92
100
  end
@@ -95,12 +103,11 @@ module Ditty
95
103
  respond_to do |format|
96
104
  format.html do
97
105
  flash[:success] = "#{heading} Deleted"
98
- redirect with_layout(base_path.to_s)
106
+ redirect with_layout(flash[:redirect_to] || back || base_path)
99
107
  end
100
108
  format.json do
101
109
  content_type :json
102
- headers 'Location' => base_path.to_s
103
- status 204
110
+ redirect base_path.to_s, 204
104
111
  end
105
112
  end
106
113
  end
@@ -24,9 +24,11 @@ module Ditty
24
24
  def form_control(name, model, opts = {})
25
25
  label = opts.delete(:label) || name.to_s.titlecase
26
26
  klass = opts.delete(:class) || 'form-control' unless opts[:type] == 'file'
27
+ klass = "#{klass} is-invalid" if model.errors[name]
27
28
  group = opts.delete(:group) || model.class.to_s.demodulize.underscore
28
29
  field = opts.delete(:field) || name
29
30
  default = opts.delete(:default) || nil
31
+ help_text = opts.delete(:help_text) || nil
30
32
 
31
33
  attributes = { type: 'text', id: name, name: "#{group}[#{name}]", class: klass }.merge(opts)
32
34
  haml :'partials/form_control', locals: {
@@ -36,7 +38,8 @@ module Ditty
36
38
  name: name,
37
39
  group: group,
38
40
  field: field,
39
- default: default
41
+ default: default,
42
+ help_text: help_text
40
43
  }
41
44
  end
42
45
 
@@ -47,7 +50,8 @@ module Ditty
47
50
  haml :'partials/filter_control', locals: {
48
51
  name: filter[:name],
49
52
  label: opts[:label] || filter[:name].to_s.titlecase,
50
- options: send(meth)
53
+ options: send(meth),
54
+ total_filters: opts[:filters]
51
55
  }
52
56
  end
53
57
 
@@ -98,7 +102,7 @@ module Ditty
98
102
  def pagination(list, base_path, qp = {})
99
103
  return unless list.respond_to?(:pagination_record_count) || list.respond_to?(:total_entries)
100
104
 
101
- list = Ditty::Services::PaginationWrapper.new(list)
105
+ list = ::Ditty::Services::PaginationWrapper.new(list)
102
106
  locals = {
103
107
  first_link: "#{base_path}?" + query_string(qp.merge(page: 1)),
104
108
  next_link: list.last_page? ? '#' : "#{base_path}?" + query_string(qp.merge(page: list.next_page)),
@@ -17,7 +17,9 @@ module Ditty
17
17
  end
18
18
 
19
19
  def method_missing(method, *args)
20
- return unless args[0].is_a?(Hash) && args[0][:target].is_a?(Sinatra::Base) && args[0][:target].settings.track_actions
20
+ unless args[0].is_a?(Hash) && args[0][:target].is_a?(Sinatra::Base) && args[0][:target].settings.track_actions
21
+ return
22
+ end
21
23
 
22
24
  log_action(
23
25
  user_traits(args[0][:target]).merge(
@@ -69,7 +71,7 @@ module Ditty
69
71
 
70
72
  def log_action(values)
71
73
  values[:user] ||= values[:target].current_user if values[:target]
72
- @mutex.synchronize { Ditty::AuditLog.create values }
74
+ @mutex.synchronize { ::Ditty::AuditLog.create values }
73
75
  end
74
76
 
75
77
  def user_traits(target)
@@ -84,4 +86,4 @@ module Ditty
84
86
  end
85
87
  end
86
88
 
87
- Wisper.subscribe(Ditty::Listener.new) unless ENV['RACK_ENV'] == 'test'
89
+ Wisper.subscribe(::Ditty::Listener.new) unless ENV['RACK_ENV'] == 'test'
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'ditty/services/logger'
4
+
5
+ Ditty::Services::Logger.info 'Setting up caching'
6
+ require 'memcached'
7
+ CACHE = Memcached.new(ENV['MEMCACHED_URL'])
8
+ Sequel::Model.plugin :caching, CACHE, ignore_exceptions: true
@@ -8,7 +8,7 @@ module Ditty
8
8
  class AcceptExtension
9
9
  attr_reader :env, :regex, :content_type
10
10
 
11
- def initialize(app, regex = /\A(.*)\.json(\/?)\Z/, content_type = 'application/json')
11
+ def initialize(app, regex = %r{\A(.*)\.json(/?)\Z}, content_type = 'application/json')
12
12
  # @mutex = Mutex.new
13
13
  @app = app
14
14
  @regex = regex
@@ -19,7 +19,7 @@ module Ditty
19
19
  @env = env
20
20
 
21
21
  request = Rack::Request.new(env)
22
- if request.path =~ regex
22
+ if request.path&.match?(regex)
23
23
  request.path_info = request.path_info.gsub(regex, '\1\2')
24
24
  env = request.env
25
25
  env['ACCEPT'] = content_type
@@ -16,8 +16,8 @@ module Ditty
16
16
  begin
17
17
  @app.call env
18
18
  rescue StandardError => e
19
- ::Ditty::Services::Logger.instance.error "Ditty Catchall: #{e.class}"
20
- ::Ditty::Services::Logger.instance.error e
19
+ ::Ditty::Services::Logger.error "Ditty Catchall: #{e.class}"
20
+ ::Ditty::Services::Logger.error e
21
21
  [500, {}, ['Unknown Error']]
22
22
  end
23
23
  end
@@ -8,6 +8,10 @@ module Ditty
8
8
  values
9
9
  end
10
10
 
11
+ def display_id
12
+ self[:slug] || self[:guid] || self[:id]
13
+ end
14
+
11
15
  alias for_csv for_json
12
16
  end
13
17
  end
@@ -5,6 +5,7 @@ require 'ditty/models/base'
5
5
  module Ditty
6
6
  class Role < ::Sequel::Model
7
7
  include ::Ditty::Base
8
+ plugin :tree
8
9
 
9
10
  many_to_many :users
10
11
 
@@ -17,11 +17,20 @@ module Ditty
17
17
 
18
18
  def role?(check)
19
19
  @roles ||= Hash.new do |h, k|
20
- h[k] = !roles_dataset.first(name: k).nil?
20
+ role_or_descendant = roles.find do |role|
21
+ role.name == k || role.descendants.map(&:name).include?(k)
22
+ end
23
+ h[k] = !role_or_descendant.nil?
21
24
  end
22
25
  @roles[check]
23
26
  end
24
27
 
28
+ def all_roles
29
+ roles.inject([]) do |memo, role|
30
+ memo + [role] + role.descendants
31
+ end.uniq
32
+ end
33
+
25
34
  def method_missing(method_sym, *arguments, &block)
26
35
  if respond_to_missing?(method_sym)
27
36
  role?(method_sym[0..-2])
@@ -68,6 +77,10 @@ module Ditty
68
77
  email
69
78
  end
70
79
 
80
+ def display_name
81
+ name || username
82
+ end
83
+
71
84
  class << self
72
85
  def anonymous_user
73
86
  role = ::Ditty::Role.find_or_create(name: 'anonymous')
@@ -25,7 +25,7 @@ module Ditty
25
25
  end
26
26
 
27
27
  def permitted_attributes
28
- [:name]
28
+ %i[parent_id name]
29
29
  end
30
30
 
31
31
  class Scope < ApplicationPolicy::Scope
@@ -13,7 +13,7 @@ module Ditty
13
13
  end
14
14
 
15
15
  def read?
16
- user && (record.user_id || user.super_admin?)
16
+ user && (record.user_id == user.id || user.super_admin?)
17
17
  end
18
18
 
19
19
  def update?
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ditty/controllers/application'
3
+ require 'ditty/controllers/application_controller'
4
4
  require 'ditty/services/settings'
5
5
  require 'ditty/services/logger'
6
6
  require 'backports/2.4.0/hash/compact'
7
7
 
8
8
  require 'omniauth'
9
- OmniAuth.config.logger = Ditty::Services::Logger.instance
10
- OmniAuth.config.path_prefix = "#{Ditty::Application.map_path}/auth"
9
+ OmniAuth.config.logger = ::Ditty::Services::Logger
10
+ OmniAuth.config.path_prefix = "#{::Ditty::ApplicationController.map_path}/auth"
11
11
  OmniAuth.config.on_failure = proc { |env|
12
12
  next [400, {}, []] if env['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
13
13
 
@@ -28,8 +28,9 @@ module Ditty
28
28
 
29
29
  def setup
30
30
  providers.each do |provider|
31
+ req = config.dig(provider, :require) || "omniauth/#{provider}"
31
32
  begin
32
- require "omniauth/#{provider}"
33
+ require req
33
34
  rescue LoadError
34
35
  require "omniauth-#{provider}"
35
36
  end
@@ -37,7 +38,7 @@ module Ditty
37
38
  end
38
39
 
39
40
  def config
40
- default.merge Ditty::Services::Settings.values(:authentication) || {}
41
+ default.merge ::Ditty::Services::Settings.values(:authentication) || {}
41
42
  end
42
43
 
43
44
  def provides?(provider)
@@ -46,15 +47,15 @@ module Ditty
46
47
 
47
48
  def default
48
49
  require 'ditty/models/identity'
49
- require 'ditty/controllers/auth'
50
+ require 'ditty/controllers/auth_controller'
50
51
  {
51
52
  identity: {
52
53
  arguments: [
53
54
  {
54
55
  fields: [:username],
55
- model: Ditty::Identity,
56
- on_login: Ditty::Auth,
57
- on_registration: Ditty::Auth,
56
+ model: ::Ditty::Identity,
57
+ on_login: ::Ditty::AuthController,
58
+ on_registration: ::Ditty::AuthController,
58
59
  locate_conditions: ->(req) { { username: req['username'] } }
59
60
  }
60
61
  ]
@@ -66,4 +67,4 @@ module Ditty
66
67
  end
67
68
  end
68
69
 
69
- Ditty::Services::Authentication.setup
70
+ ::Ditty::Services::Authentication.setup