Commit a429c56

mo khan <mo@mokhan.ca>
2026-07-27 20:33:13
refactor: tidy up schema loading
cli
1 parent c568e47
lib/scim/kit/cli/app.rb
@@ -15,10 +15,8 @@ module Scim
         end
 
         class_option :url, desc: 'Base URL of the SCIM server (or SCIM_KIT_URL)'
-        class_option :header, type: :array, default: [],
-          desc: 'Extra header as "Name: Value" (repeatable)'
-        class_option :validate, type: :boolean, default: false,
-          desc: 'Validate the response against a JSON Schema'
+        class_option :header, type: :array, default: [], desc: 'Extra header as "Name: Value" (repeatable)'
+        class_option :validate, type: :boolean, default: false, desc: 'Validate the response against a JSON Schema'
 
         desc 'discover', "Discover a server's ServiceProviderConfig, Schemas, and ResourceTypes"
         def discover
lib/scim/kit/cli/schema_registry.rb
@@ -15,16 +15,16 @@ module Scim
 
         def self.fetch(key)
           @cache ||= {}
-          @cache[key] ||= load(FILES.fetch(key))
+          @cache[key] ||= load_schema(FILES.fetch(key))
         end
 
         def self.list_response_with_items(resource_schema)
-          schema = load('list_response.schema.json')
+          schema = load_schema('list_response.schema.json')
           schema['properties']['Resources']['items'] = resource_schema
           schema
         end
 
-        def self.load(file_name)
+        def self.load_schema(file_name)
           JSON.parse(File.read(File.join(DIR, file_name)))
         end
       end
lib/scim/kit/cli/scim_schema_converter.rb
@@ -12,20 +12,27 @@ module Scim
           'decimal' => { 'type' => 'number' },
           'integer' => { 'type' => 'integer' },
           'dateTime' => { 'type' => 'string', 'format' => 'date-time' }
-        }.freeze
+        }.each_value(&:freeze).freeze
 
         def self.convert(schema)
           object_schema(schema[:attributes] || [])
         end
 
         def self.object_schema(attributes)
-          properties, required = attributes.reduce([{}, []]) do |(p, r), a|
-            p[a[:name]] = attribute_schema(a)
-            r << a[:name] if a[:required]
-            [p, r]
-          end
-          { 'type' => 'object', 'properties' => properties,
-            'required' => required, 'additionalProperties' => false }
+          {
+            'type' => 'object',
+            'properties' => properties_for(attributes),
+            'required' => required_for(attributes),
+            'additionalProperties' => false
+          }
+        end
+
+        def self.properties_for(attributes)
+          attributes.to_h { |a| [a[:name], attribute_schema(a)] }
+        end
+
+        def self.required_for(attributes)
+          attributes.filter_map { |a| a[:name] if a[:required] }
         end
 
         def self.attribute_schema(attribute)
@@ -44,7 +51,7 @@ module Scim
         end
 
         def self.with_enum(attribute)
-          schema = TYPE_MAP.fetch(attribute[:type]).dup
+          schema = TYPE_MAP.fetch(attribute[:type])
           canonical_values = attribute[:canonicalValues]
           return schema if canonical_values.nil? || canonical_values.empty?
 
lib/scim/kit/cli.rb
@@ -1,15 +1,15 @@
 # frozen_string_literal: true
 
+require 'json_schemer'
 require 'thor'
 
+require 'scim/kit/cli/app'
 require 'scim/kit/cli/reporting'
+require 'scim/kit/cli/resource_schema_resolver'
 require 'scim/kit/cli/resource_type_resolver'
-require 'scim/kit/cli/scim_schema_converter'
-require 'json_schemer'
 require 'scim/kit/cli/schema_registry'
+require 'scim/kit/cli/scim_schema_converter'
 require 'scim/kit/cli/validator'
-require 'scim/kit/cli/resource_schema_resolver'
-require 'scim/kit/cli/app'
 
 module Scim
   module Kit