Comparing changes

v0.2.4 v0.2.5
7 commits 9 files changed

Commits

c5e7dec bump version mokha 2019-01-08 19:55:22
ea1b8cc yield the builder mokha 2019-01-08 19:54:26
596df3c configure resource types mokha 2019-01-08 18:36:06
6b7102e extract v2 file mokha 2019-01-08 18:19:23
lib/scim/kit/v2/templates/resource.json.jbuilder
@@ -1,12 +1,12 @@
 # frozen_string_literal: true
 
 json.key_format! camelize: :lower
-json.schemas schemas.map(&:id)
-json.id id
-json.external_id external_id
 json.meta do
   render meta, json: json
 end
+json.schemas schemas.map(&:id)
+json.id id
+json.external_id external_id
 schemas.each do |schema|
   if schema.core?
     schema.attributes.each do |type|
lib/scim/kit/v2/templates/schema.json.jbuilder
@@ -1,13 +1,12 @@
 # frozen_string_literal: true
 
 json.key_format! camelize: :lower
+json.meta do
+  render meta, json: json
+end
 json.id id
 json.name name
 json.description description
-json.meta do
-  json.resource_type 'Schema'
-  json.location location
-end
 json.attributes attributes do |attribute|
   render attribute, json: json
 end
lib/scim/kit/v2/templates/service_provider_configuration.json.jbuilder
@@ -1,6 +1,9 @@
 # frozen_string_literal: true
 
 json.key_format! camelize: :lower
+json.meta do
+  render meta, json: json
+end
 json.schemas [Scim::Kit::V2::Schemas::SERVICE_PROVIDER_CONFIGURATION]
 json.documentation_uri documentation_uri
 json.patch do
@@ -24,6 +27,3 @@ end
 json.authentication_schemes authentication_schemes do |authentication_scheme|
   render authentication_scheme, json: json
 end
-json.meta do
-  render meta, json: json
-end
lib/scim/kit/v2/configuration.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Scim
+  module Kit
+    module V2
+      # Represents an application SCIM configuration.
+      class Configuration
+        # @private
+        class Builder
+          def initialize
+            @resource_types = {}
+            @schemas = {}
+          end
+
+          def service_provider_configuration(location:)
+            @sp_config = ServiceProviderConfiguration.new(location: location)
+            yield @sp_config
+          end
+
+          def resource_type(id:, location:)
+            @resource_types[id] ||= ResourceType.new(location: location)
+            @resource_types[id].id = id
+            yield @resource_types[id]
+          end
+
+          def schema(id:, name:, location:)
+            @schemas[id] ||= Schema.new(id: id, name: name, location: location)
+            yield @schemas[id]
+          end
+
+          def apply_to(configuration)
+            configuration.service_provider_configuration = @sp_config
+            configuration.resource_types = @resource_types
+            configuration.schemas = @schemas
+          end
+        end
+
+        attr_accessor :service_provider_configuration
+        attr_accessor :resource_types
+        attr_accessor :schemas
+
+        def initialize
+          builder = Builder.new
+          yield builder if block_given?
+          builder.apply_to(self)
+        end
+      end
+    end
+  end
+end
lib/scim/kit/v2/schema.rb
@@ -7,13 +7,14 @@ module Scim
       class Schema
         include Templatable
 
-        attr_reader :id, :name, :location, :attributes
+        attr_reader :id, :name, :attributes, :meta
         attr_accessor :description
 
         def initialize(id:, name:, location:)
           @id = id
           @name = name
-          @location = location
+          @meta = Meta.new('Schema', location)
+          @meta.created = @meta.last_modified = @meta.version = nil
           @attributes = []
         end
 
lib/scim/kit/v2.rb
@@ -0,0 +1,37 @@
+# frozen_string_literal: true
+
+require 'scim/kit/v2/attributable'
+require 'scim/kit/v2/attribute'
+require 'scim/kit/v2/attribute_type'
+require 'scim/kit/v2/authentication_scheme'
+require 'scim/kit/v2/configuration'
+require 'scim/kit/v2/messages'
+require 'scim/kit/v2/meta'
+require 'scim/kit/v2/mutability'
+require 'scim/kit/v2/resource'
+require 'scim/kit/v2/resource_type'
+require 'scim/kit/v2/returned'
+require 'scim/kit/v2/schema'
+require 'scim/kit/v2/schemas'
+require 'scim/kit/v2/service_provider_configuration'
+require 'scim/kit/v2/supportable'
+require 'scim/kit/v2/uniqueness'
+
+module Scim
+  module Kit
+    # Version 2 of the SCIM RFC https://tools.ietf.org/html/rfc7644
+    module V2
+      class << self
+        def configuration
+          @configuration ||= ::Scim::Kit::V2::Configuration.new
+        end
+
+        def configure
+          builder = ::Scim::Kit::V2::Configuration::Builder.new
+          yield builder
+          builder.apply_to(configuration)
+        end
+      end
+    end
+  end
+end
lib/scim/kit/version.rb
@@ -2,6 +2,6 @@
 
 module Scim
   module Kit
-    VERSION = '0.2.4'
+    VERSION = '0.2.5'
   end
 end
lib/scim/kit.rb
@@ -7,24 +7,9 @@ require 'active_support/core_ext/hash/indifferent_access'
 require 'scim/kit/dynamic_attributes'
 require 'scim/kit/templatable'
 require 'scim/kit/template'
+require 'scim/kit/v2'
 require 'scim/kit/version'
 
-require 'scim/kit/v2/attributable'
-require 'scim/kit/v2/attribute'
-require 'scim/kit/v2/attribute_type'
-require 'scim/kit/v2/authentication_scheme'
-require 'scim/kit/v2/messages'
-require 'scim/kit/v2/meta'
-require 'scim/kit/v2/mutability'
-require 'scim/kit/v2/resource'
-require 'scim/kit/v2/resource_type'
-require 'scim/kit/v2/returned'
-require 'scim/kit/v2/schema'
-require 'scim/kit/v2/schemas'
-require 'scim/kit/v2/service_provider_configuration'
-require 'scim/kit/v2/supportable'
-require 'scim/kit/v2/uniqueness'
-
 module Scim
   module Kit
     class Error < StandardError; end
spec/scim/kit/v2/configuration_spec.rb
@@ -0,0 +1,40 @@
+# frozen_string_literal: true
+
+RSpec.describe Scim::Kit::V2::Configuration do
+  subject do
+    described_class.new do |x|
+      x.service_provider_configuration(location: sp_location) do |y|
+        y.add_authentication(:oauthbearertoken)
+        y.change_password.supported = true
+      end
+      x.resource_type(id: 'User', location: user_type_location) do |y|
+        y.schema = Scim::Kit::V2::Schemas::USER
+      end
+      x.resource_type(id: 'Group', location: group_type_location) do |y|
+        y.schema = Scim::Kit::V2::Schemas::GROUP
+      end
+      x.schema(id: 'User', name: 'User', location: user_schema_location) do |y|
+        y.add_attribute(name: 'userName')
+      end
+    end
+  end
+
+  let(:sp_location) { FFaker::Internet.uri('https') }
+  let(:user_type_location) { FFaker::Internet.uri('https') }
+  let(:group_type_location) { FFaker::Internet.uri('https') }
+  let(:user_schema_location) { FFaker::Internet.uri('https') }
+
+  specify { expect(subject.service_provider_configuration.meta.location).to eql(sp_location) }
+  specify { expect(subject.service_provider_configuration.authentication_schemes[0].type).to be(:oauthbearertoken) }
+  specify { expect(subject.service_provider_configuration.change_password.supported).to be(true) }
+
+  specify { expect(subject.resource_types['User'].schema).to eql(Scim::Kit::V2::Schemas::USER) }
+  specify { expect(subject.resource_types['User'].id).to eql('User') }
+  specify { expect(subject.resource_types['Group'].schema).to eql(Scim::Kit::V2::Schemas::GROUP) }
+  specify { expect(subject.resource_types['Group'].id).to eql('Group') }
+
+  specify { expect(subject.schemas['User'].id).to eql('User') }
+  specify { expect(subject.schemas['User'].name).to eql('User') }
+  specify { expect(subject.schemas['User'].meta.location).to eql(user_schema_location) }
+  specify { expect(subject.schemas['User'].attributes[0].name).to eql('user_name') }
+end