Commit db6b085
Changed files (3)
lib
scim
kit
spec
scim
kit
lib/scim/kit/v2/attribute_type.rb
@@ -5,6 +5,15 @@ module Scim
module V2
# Represents a scim Attribute type
class AttributeType
+ VALID = {
+ string: 'string',
+ boolean: 'boolean',
+ decimal: 'decimal',
+ integer: 'integer',
+ datetime: 'dateTime',
+ reference: 'reference',
+ complex: 'complex'
+ }.freeze
attr_reader :name, :type
attr_accessor :multi_valued
attr_accessor :required
@@ -24,6 +33,7 @@ module Scim
@mutability = Mutability::READ_WRITE
@returned = Returned::DEFAULT
@uniqueness = Uniqueness::NONE
+ @attributes = []
end
def mutability=(value)
@@ -38,17 +48,48 @@ module Scim
@uniqueness = Uniqueness.find(value)
end
+ def add_attribute(name:, type: :string)
+ @type = :complex
+ attribute = AttributeType.new(name: name, type: type)
+ yield attribute if block_given?
+ @attributes << attribute
+ end
+
def to_h
- {
- name: name, type: type.to_s,
- description: description,
- multiValued: multi_valued,
- required: required,
- caseExact: case_exact,
- mutability: mutability,
- returned: returned,
- uniqueness: uniqueness
- }
+ if complex?
+ {
+ name: name, type: type.to_s,
+ description: description,
+ multiValued: multi_valued,
+ required: required,
+ mutability: mutability,
+ returned: returned,
+ uniqueness: uniqueness,
+ subAttributes: @attributes.map(&:to_h)
+ }
+ else
+ x = {
+ name: name, type: type.to_s,
+ description: description,
+ multiValued: multi_valued,
+ required: required,
+ mutability: mutability,
+ returned: returned,
+ uniqueness: uniqueness
+ }
+ x[:caseExact] = case_exact if string?
+ x
+ end
+ end
+
+ private
+
+ def complex?
+ type.to_sym == :complex
+ end
+
+ def string?
+ type.to_sym == :string
end
end
end
lib/scim/kit/v2/schema.rb
@@ -20,8 +20,8 @@ module Scim
@attributes = []
end
- def add_attribute(name:)
- attribute = AttributeType.new(name: name)
+ def add_attribute(name:, type: :string)
+ attribute = AttributeType.new(name: name, type: type)
yield attribute if block_given?
@attributes << attribute
end
spec/scim/kit/v2/schema_spec.rb
@@ -44,4 +44,44 @@ RSpec.describe Scim::Kit::V2::Schema do
specify { expect(result[:attributes][1][:description]).to eql('my description') }
end
end
+
+ context 'with a complex attribute' do
+ before do
+ subject.add_attribute(name: 'emails') do |x|
+ x.multi_valued = true
+ x.add_attribute(name: 'value')
+ x.add_attribute(name: 'primary', type: 'boolean')
+ end
+ end
+
+ specify { expect(result[:attributes][0][:name]).to eql('emails') }
+ specify { expect(result[:attributes][0][:type]).to eql('complex') }
+ specify { expect(result[:attributes][0][:multiValued]).to be(true) }
+ specify { expect(result[:attributes][0][:description]).to eql('') }
+ specify { expect(result[:attributes][0][:required]).to be(false) }
+ specify { expect(result[:attributes][0].key?(:caseExact)).to be(false) }
+ specify { expect(result[:attributes][0][:mutability]).to eql('readWrite') }
+ specify { expect(result[:attributes][0][:returned]).to eql('default') }
+ specify { expect(result[:attributes][0][:uniqueness]).to eql('none') }
+
+ specify { expect(result[:attributes][0][:subAttributes][0][:name]).to eql('value') }
+ specify { expect(result[:attributes][0][:subAttributes][0][:type]).to eql('string') }
+ specify { expect(result[:attributes][0][:subAttributes][0][:multiValued]).to be(false) }
+ specify { expect(result[:attributes][0][:subAttributes][0][:description]).to eql('') }
+ specify { expect(result[:attributes][0][:subAttributes][0][:required]).to be(false) }
+ specify { expect(result[:attributes][0][:subAttributes][0][:caseExact]).to be(false) }
+ specify { expect(result[:attributes][0][:subAttributes][0][:mutability]).to eql('readWrite') }
+ specify { expect(result[:attributes][0][:subAttributes][0][:returned]).to eql('default') }
+ specify { expect(result[:attributes][0][:subAttributes][0][:uniqueness]).to eql('none') }
+
+ specify { expect(result[:attributes][0][:subAttributes][1][:name]).to eql('primary') }
+ specify { expect(result[:attributes][0][:subAttributes][1][:type]).to eql('boolean') }
+ specify { expect(result[:attributes][0][:subAttributes][1][:multiValued]).to be(false) }
+ specify { expect(result[:attributes][0][:subAttributes][1][:description]).to eql('') }
+ specify { expect(result[:attributes][0][:subAttributes][1][:required]).to be(false) }
+ specify { expect(result[:attributes][0][:subAttributes][1].key?(:caseExact)).to be(false) }
+ specify { expect(result[:attributes][0][:subAttributes][1][:mutability]).to eql('readWrite') }
+ specify { expect(result[:attributes][0][:subAttributes][1][:returned]).to eql('default') }
+ specify { expect(result[:attributes][0][:subAttributes][1][:uniqueness]).to eql('none') }
+ end
end