Comparing changes

v0.2.10 v0.2.11
4 commits 6 files changed

Commits

lib/scim/kit/v2/attributable.rb
@@ -8,7 +8,7 @@ module Scim
         attr_reader :dynamic_attributes
 
         def define_attributes_for(resource, types)
-          @dynamic_attributes = {}.with_indifferent_access
+          @dynamic_attributes ||= {}.with_indifferent_access
           types.each { |x| attribute(x, resource) }
         end
 
@@ -26,7 +26,8 @@ module Scim
         end
 
         def write_attribute(name, value)
-          attribute_for(name)._value = value
+          attribute = attribute_for(name)
+          attribute._value = value
         end
 
         def create_module_for(type)
lib/scim/kit/v2/attribute.rb
@@ -32,15 +32,27 @@ module Scim
         end
 
         def renderable?
-          return false if read_only? && _resource.mode?(:client)
-          return false if write_only? &&
-                          (_resource.mode?(:server) || _value.blank?)
+          return false if server_only?
+          return false if client_only?
+          return false if restricted?
 
           true
         end
 
         private
 
+        def server_only?
+          read_only? && _resource.mode?(:client)
+        end
+
+        def client_only?
+          write_only? && (_resource.mode?(:server) || _value.blank?)
+        end
+
+        def restricted?
+          _resource.mode?(:server) && type.returned == Returned::NEVER
+        end
+
         def presence_of_value
           return unless type.required && _value.blank?
 
lib/scim/kit/version.rb
@@ -2,6 +2,6 @@
 
 module Scim
   module Kit
-    VERSION = '0.2.10'
+    VERSION = '0.2.11'
   end
 end
spec/scim/kit/v2/attribute_spec.rb
@@ -278,6 +278,12 @@ RSpec.describe Scim::Kit::V2::Attribute do
 
       specify { expect(subject).not_to be_renderable }
     end
+
+    context 'when returned type is `never`' do
+      before { type.returned = :never }
+
+      specify { expect(subject).not_to be_renderable }
+    end
   end
 
   context 'when the resource is in client mode' do
spec/scim/kit/v2/resource_spec.rb
@@ -109,12 +109,16 @@ RSpec.describe Scim::Kit::V2::Resource do
     let(:extension_id) { 'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User' }
 
     before do
-      extension.add_attribute(name: :department)
-      subject.department = 'voltron'
+      schema.add_attribute(name: :country)
+      extension.add_attribute(name: :province)
+      subject.country = 'canada'
+      subject.province = 'alberta'
     end
 
-    specify { expect(subject.department).to eql('voltron') }
-    specify { expect(subject.as_json[extension_id][:department]).to eql('voltron') }
+    specify { expect(subject.country).to eql('canada') }
+    specify { expect(subject.province).to eql('alberta') }
+    specify { expect(subject.as_json[:country]).to eql('canada') }
+    specify { expect(subject.as_json[extension_id][:province]).to eql('alberta') }
   end
 
   describe '#valid?' do
scim-kit.gemspec
@@ -27,6 +27,7 @@ Gem::Specification.new do |spec|
     File.basename(file)
   end
   spec.require_paths = ['lib']
+  spec.required_ruby_version = '>= 2.5.0'
 
   spec.add_dependency 'activemodel', '>= 5.2.0'
   spec.add_dependency 'tilt', '~> 2.0'