scimitar 2.7.0 → 2.7.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +1 -3
 - data/app/models/scimitar/resources/base.rb +12 -9
 - data/app/models/scimitar/resources/mixin.rb +403 -33
 - data/lib/scimitar/support/hash_with_indifferent_case_insensitive_access.rb +140 -10
 - data/lib/scimitar/version.rb +2 -2
 - data/spec/models/scimitar/resources/base_spec.rb +9 -1
 - data/spec/models/scimitar/resources/mixin_spec.rb +683 -112
 - data/spec/requests/active_record_backed_resources_controller_spec.rb +81 -5
 - data/spec/support/hash_with_indifferent_case_insensitive_access_spec.rb +108 -0
 - metadata +4 -18
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 6898633f866963ccaacd5f16120a957f698e2e1aacd51b985c483616fe5c49d5
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: d24f2017fab7ae3432c21d5eacb281fa8cd1ac3b43a25756ccbf105a426bf85f
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: cefe2b8fb441822a751ba93d54b43dc6e75281cc707095f3880c9927d413d310dbcb0676405499f46e641cb767a6d50d3d03b9a0d1b6d1218fbd59e3c036caba
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 34bc849312df18601c49df4f7e9019ed258b74bb84a002309a5d33b8119c4776edfb1e7cbacdcebbc92533b9cf63586c33631ac505ca1bb17bc859a9d1a65078
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -244,8 +244,6 @@ If you use ActiveRecord, your controllers can potentially be extremely simple by 
     | 
|
| 
       244 
244 
     | 
    
         
             
            module Scim
         
     | 
| 
       245 
245 
     | 
    
         
             
              class UsersController < Scimitar::ActiveRecordBackedResourcesController
         
     | 
| 
       246 
246 
     | 
    
         | 
| 
       247 
     | 
    
         
            -
                skip_before_action :verify_authenticity_token
         
     | 
| 
       248 
     | 
    
         
            -
             
     | 
| 
       249 
247 
     | 
    
         
             
                protected
         
     | 
| 
       250 
248 
     | 
    
         | 
| 
       251 
249 
     | 
    
         
             
                  def storage_class
         
     | 
| 
         @@ -264,7 +262,7 @@ All data-layer actions are taken via `#find` or `#save!`, with exceptions such a 
     | 
|
| 
       264 
262 
     | 
    
         | 
| 
       265 
263 
     | 
    
         
             
            ##### Overriding controller methods
         
     | 
| 
       266 
264 
     | 
    
         | 
| 
       267 
     | 
    
         
            -
            You can overwrite write-based controller methods `#create`, `#update`, `#replace` and  
     | 
| 
      
 265 
     | 
    
         
            +
            You can overwrite write-based controller methods `#create`, `#update`, `#replace` and `#destroy` in your controller subclass, should you wish, wherein a call to `super` is passed a block. The block is invoked with the instance of a new unsaved record for `#create`, the updated record that needs to have its changes saved for `#update` and `#replace` and the record that should be destroyed for `#destroy`. This allows you to do things like applying business logic, default values, extra request-derived data and so-forth before then calling `record.save!`, or using some different method other than `record.destroy!` to discard a record (e.g. you might be using soft-delete, or want to skip all callbacks for some reason via `record.delete`).
         
     | 
| 
       268 
266 
     | 
    
         | 
| 
       269 
267 
     | 
    
         
             
            * The `#destroy` method just calls `record.destroy!` unless a block is given, with nothing much else to say about it.
         
     | 
| 
       270 
268 
     | 
    
         | 
| 
         @@ -129,7 +129,7 @@ module Scimitar 
     | 
|
| 
       129 
129 
     | 
    
         | 
| 
       130 
130 
     | 
    
         
             
                      if scim_attribute && scim_attribute.complexType
         
     | 
| 
       131 
131 
     | 
    
         
             
                        if scim_attribute.multiValued
         
     | 
| 
       132 
     | 
    
         
            -
                          self.send("#{attr_name}=", attr_value 
     | 
| 
      
 132 
     | 
    
         
            +
                          self.send("#{attr_name}=", attr_value&.map {|attr_for_each_item| complex_type_from_hash(scim_attribute, attr_for_each_item)})
         
     | 
| 
       133 
133 
     | 
    
         
             
                        else
         
     | 
| 
       134 
134 
     | 
    
         
             
                          self.send("#{attr_name}=", complex_type_from_hash(scim_attribute, attr_value))
         
     | 
| 
       135 
135 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -137,18 +137,21 @@ module Scimitar 
     | 
|
| 
       137 
137 
     | 
    
         
             
                    end
         
     | 
| 
       138 
138 
     | 
    
         
             
                  end
         
     | 
| 
       139 
139 
     | 
    
         | 
| 
      
 140 
     | 
    
         
            +
                  # Renders *in full* as JSON; typically used for write-based operations...
         
     | 
| 
      
 141 
     | 
    
         
            +
                  #
         
     | 
| 
      
 142 
     | 
    
         
            +
                  #     record = self.storage_class().new
         
     | 
| 
      
 143 
     | 
    
         
            +
                  #     record.from_scim!(scim_hash: scim_resource.as_json())
         
     | 
| 
      
 144 
     | 
    
         
            +
                  #     self.save!(record)
         
     | 
| 
      
 145 
     | 
    
         
            +
                  #
         
     | 
| 
      
 146 
     | 
    
         
            +
                  # ...so all fields, even those marked "returned: false", are included.
         
     | 
| 
      
 147 
     | 
    
         
            +
                  # Use Scimitar::Resources::Mixin::to_scim to obtain a SCIM object with
         
     | 
| 
      
 148 
     | 
    
         
            +
                  # non-returnable fields omitted, rendering *that* as JSON via #to_json.
         
     | 
| 
      
 149 
     | 
    
         
            +
                  #
         
     | 
| 
       140 
150 
     | 
    
         
             
                  def as_json(options = {})
         
     | 
| 
       141 
151 
     | 
    
         
             
                    self.meta = Meta.new unless self.meta && self.meta.is_a?(Meta)
         
     | 
| 
       142 
152 
     | 
    
         
             
                    self.meta.resourceType = self.class.resource_type_id
         
     | 
| 
       143 
153 
     | 
    
         | 
| 
       144 
     | 
    
         
            -
                     
     | 
| 
       145 
     | 
    
         
            -
                      .schemas
         
     | 
| 
       146 
     | 
    
         
            -
                      .flat_map(&:scim_attributes)
         
     | 
| 
       147 
     | 
    
         
            -
                      .filter_map { |attribute| attribute.name if attribute.returned == 'never' }
         
     | 
| 
       148 
     | 
    
         
            -
             
     | 
| 
       149 
     | 
    
         
            -
                    non_returnable_attributes << 'errors'
         
     | 
| 
       150 
     | 
    
         
            -
             
     | 
| 
       151 
     | 
    
         
            -
                    original_hash = super(options).except(*non_returnable_attributes)
         
     | 
| 
      
 154 
     | 
    
         
            +
                    original_hash = super(options).except('errors')
         
     | 
| 
       152 
155 
     | 
    
         
             
                    original_hash.merge!('schemas' => self.class.schemas.map(&:id))
         
     | 
| 
       153 
156 
     | 
    
         | 
| 
       154 
157 
     | 
    
         
             
                    self.class.extended_schemas.each do |extension_schema|
         
     |