lib/scimitar/engine.rb in scimitar-1.8.2 vs lib/scimitar/engine.rb in scimitar-1.10.0

- old
+ new

@@ -1,19 +1,42 @@ +require 'rails/engine' + module Scimitar class Engine < ::Rails::Engine isolate_namespace Scimitar + config.autoload_once_paths = %W( + #{root}/app/controllers + #{root}/app/models + ) + Mime::Type.register 'application/scim+json', :scim ActionDispatch::Request.parameter_parsers[Mime::Type.lookup('application/scim+json').symbol] = lambda do |body| JSON.parse(body) end + # Return an Array of all supported default and custom resource classes. + # See also :add_custom_resource and :set_default_resources. + # def self.resources - default_resources + custom_resources + self.default_resources() + self.custom_resources() end + # Returns a flat array of instances of all resource schema included in the + # resource classes returned by ::resources. + # + def self.schemas + self.resources().map(&:schemas).flatten.uniq.map(&:new) + end + + # Returns the list of custom resources, if any. + # + def self.custom_resources + @custom_resources ||= [] + end + # Can be used to add a new resource type which is not provided by the gem. # For example: # # module Scim # module Resources @@ -28,36 +51,58 @@ # end # # Scimitar::Engine.add_custom_resource Scim::Resources::ShinyResource # def self.add_custom_resource(resource) - custom_resources << resource + self.custom_resources() << resource end # Resets the resource list to default. This is really only intended for use # during testing, to avoid one test polluting another. # def self.reset_custom_resources @custom_resources = [] end - # Returns the list of custom resources, if any. + # Returns the default resources added in this gem - by default, these are: # - def self.custom_resources - @custom_resources ||= [] - end - - # Returns the default resources added in this gem: - # # * Scimitar::Resources::User # * Scimitar::Resources::Group # + # ...but if an implementation does not e.g. support Group, it can + # be overridden via ::set_default_resources to help with service + # auto-discovery. + # def self.default_resources - [ Resources::User, Resources::Group ] + @standard_default_resources = [ Resources::User, Resources::Group ] + @default_resources ||= @standard_default_resources.dup() end - def self.schemas - resources.map(&:schemas).flatten.uniq.map(&:new) + # Override the resources returned by ::default_resources. + # + # +resource_array+:: An Array containing one or both of + # Scimitar::Resources::User and/or + # Scimitar::Resources::Group, and nothing else. + # + def self.set_default_resources(resource_array) + self.default_resources() + unrecognised_resources = resource_array - @standard_default_resources + + if unrecognised_resources.any? + raise "Scimitar::Engine::set_default_resources: Only #{@standard_default_resources.map(&:name).join(', ')} are supported" + elsif resource_array.empty? + raise 'Scimitar::Engine::set_default_resources: At least one resource must be given' + end + + @default_resources = resource_array + end + + # Resets the default resource list. This is really only intended for use + # during testing, to avoid one test polluting another. + # + def self.reset_default_resources + self.default_resources() + @default_resources = @standard_default_resources end end end