safrano 0.8.1 → 0.8.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/lib/core_ext/MatchData/matchlen.rb +14 -0
 - data/lib/core_ext/matchdata.rb +3 -0
 - data/lib/odata/complex_type.rb +1 -2
 - data/lib/odata/entity.rb +0 -1
 - data/lib/odata/error.rb +8 -0
 - data/lib/odata/model_ext.rb +3 -3
 - data/lib/safrano/rack_app.rb +13 -0
 - data/lib/safrano/service.rb +54 -5
 - data/lib/safrano/version.rb +1 -1
 - metadata +4 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 5e43512da576932288321a8e821e26fa9c70d578f52562f6a343bfe3c3711bae
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: e2c00621b792634355f99d2025fada0d05cd44666516d916aa2546fb72f5157f
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 8ff433c52ec4406198b0988e122213f0af36a8f1a06b2eb1d2ebfc2c3736db5f8c575fa86e04b8ac9801d4d4fb363edc468c3078b3f93c66313497739ffc3c2e
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 59ebba62c9a7e81496a651473fa9469d843409dab4c1703221f897425136fe02439ea400e17124a910de599378056b7b21758815d734c9807778193c791e3286
         
     | 
    
        data/lib/odata/complex_type.rb
    CHANGED
    
    | 
         @@ -215,10 +215,9 @@ module Safrano 
     | 
|
| 
       215 
215 
     | 
    
         
             
                # needed for nested json output
         
     | 
| 
       216 
216 
     | 
    
         
             
                # this is a simpler version of model_ext#output_template
         
     | 
| 
       217 
217 
     | 
    
         
             
                def self.default_template
         
     | 
| 
       218 
     | 
    
         
            -
                  template = {}
         
     | 
| 
      
 218 
     | 
    
         
            +
                  template = { meta: EMPTYH, all_values: EMPTYH }
         
     | 
| 
       219 
219 
     | 
    
         
             
                  expand_e = {}
         
     | 
| 
       220 
220 
     | 
    
         | 
| 
       221 
     | 
    
         
            -
                  template[:all_values] = EMPTYH
         
     | 
| 
       222 
221 
     | 
    
         
             
                  @props.each do |prop, kl|
         
     | 
| 
       223 
222 
     | 
    
         
             
                    expand_e[prop] = kl.default_template if kl.respond_to? :default_template
         
     | 
| 
       224 
223 
     | 
    
         
             
                  end
         
     | 
    
        data/lib/odata/entity.rb
    CHANGED
    
    | 
         @@ -217,7 +217,6 @@ module Safrano 
     | 
|
| 
       217 
217 
     | 
    
         
             
                def odata_patch(req)
         
     | 
| 
       218 
218 
     | 
    
         
             
                  req.with_parsed_data(self.class) do |data|
         
     | 
| 
       219 
219 
     | 
    
         
             
                    data.delete('__metadata')
         
     | 
| 
       220 
     | 
    
         
            -
             
     | 
| 
       221 
220 
     | 
    
         
             
                    # validate payload column names
         
     | 
| 
       222 
221 
     | 
    
         
             
                    if (invalid = self.class.invalid_hash_data?(data))
         
     | 
| 
       223 
222 
     | 
    
         
             
                      ::Safrano::Request::ON_CGST_ERROR.call(req)
         
     | 
    
        data/lib/odata/error.rb
    CHANGED
    
    | 
         @@ -46,6 +46,14 @@ module Safrano 
     | 
|
| 
       46 
46 
     | 
    
         
             
                    super(msg, symbname)
         
     | 
| 
       47 
47 
     | 
    
         
             
                  end
         
     | 
| 
       48 
48 
     | 
    
         
             
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                # invalid response format option
         
     | 
| 
      
 51 
     | 
    
         
            +
                class InvalidRespFormatOption < NameError
         
     | 
| 
      
 52 
     | 
    
         
            +
                  def initialize(opt)
         
     | 
| 
      
 53 
     | 
    
         
            +
                    msg = "Invalid response format option: #{opt}"
         
     | 
| 
      
 54 
     | 
    
         
            +
                    super(msg, opt.to_s)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
       49 
57 
     | 
    
         
             
              end
         
     | 
| 
       50 
58 
     | 
    
         | 
| 
       51 
59 
     | 
    
         
             
              # used in function import error handling. cf. func import / do_execute_func
         
     | 
    
        data/lib/odata/model_ext.rb
    CHANGED
    
    | 
         @@ -236,9 +236,9 @@ module Safrano 
     | 
|
| 
       236 
236 
     | 
    
         
             
                def output_template(expand_list:,
         
     | 
| 
       237 
237 
     | 
    
         
             
                                    select: Safrano::SelectBase::ALL)
         
     | 
| 
       238 
238 
     | 
    
         | 
| 
       239 
     | 
    
         
            -
                  return @default_template if expand_list.empty? && select.all_props?
         
     | 
| 
      
 239 
     | 
    
         
            +
                  return @default_template.dup if expand_list.empty? && select.all_props?
         
     | 
| 
       240 
240 
     | 
    
         | 
| 
       241 
     | 
    
         
            -
                  template = {}
         
     | 
| 
      
 241 
     | 
    
         
            +
                  template = { meta: EMPTYH }
         
     | 
| 
       242 
242 
     | 
    
         
             
                  expand_e = {}
         
     | 
| 
       243 
243 
     | 
    
         
             
                  expand_c = {}
         
     | 
| 
       244 
244 
     | 
    
         
             
                  deferr = []
         
     | 
| 
         @@ -364,7 +364,7 @@ module Safrano 
     | 
|
| 
       364 
364 
     | 
    
         
             
                EMPTYH = {}.freeze
         
     | 
| 
       365 
365 
     | 
    
         | 
| 
       366 
366 
     | 
    
         
             
                def build_default_template
         
     | 
| 
       367 
     | 
    
         
            -
                  @default_template = { all_values: EMPTYH }
         
     | 
| 
      
 367 
     | 
    
         
            +
                  @default_template = { meta:  EMPTYH, all_values: EMPTYH }
         
     | 
| 
       368 
368 
     | 
    
         
             
                  @default_template[:deferr] = (@nav_entity_attribs&.keys || []) + (@nav_collection_attribs&.keys || EMPTY_ARRAY) if @nav_entity_attribs || @nav_collection_attribs
         
     | 
| 
       369 
369 
     | 
    
         
             
                end
         
     | 
| 
       370 
370 
     | 
    
         | 
    
        data/lib/safrano/rack_app.rb
    CHANGED
    
    | 
         @@ -22,6 +22,13 @@ module Safrano 
     | 
|
| 
       22 
22 
     | 
    
         
             
                  Safrano::Request.new(env, @service_base).process
         
     | 
| 
       23 
23 
     | 
    
         
             
                end
         
     | 
| 
       24 
24 
     | 
    
         | 
| 
      
 25 
     | 
    
         
            +
                #  needed for testing only ? try to remove this
         
     | 
| 
      
 26 
     | 
    
         
            +
                def self.copy(other)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  copy = Class.new(Safrano::ServerApp) # <---- !!!
         
     | 
| 
      
 28 
     | 
    
         
            +
                  copy.set_servicebase(other.get_service_base.dup)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  copy
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       25 
32 
     | 
    
         
             
                #  needed for testing only ? try to remove this
         
     | 
| 
       26 
33 
     | 
    
         
             
                def self.enable_batch
         
     | 
| 
       27 
34 
     | 
    
         
             
                  @service_base.enable_batch
         
     | 
| 
         @@ -32,6 +39,12 @@ module Safrano 
     | 
|
| 
       32 
39 
     | 
    
         
             
                  @service_base.path_prefix path_pr
         
     | 
| 
       33 
40 
     | 
    
         
             
                end
         
     | 
| 
       34 
41 
     | 
    
         | 
| 
      
 42 
     | 
    
         
            +
                # needed for testing only ? try to remove this
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                def self.response_format_options(*args)
         
     | 
| 
      
 45 
     | 
    
         
            +
                  @service_base.response_format_options(*args)
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       35 
48 
     | 
    
         
             
                # needed for testing only ? try to remove this
         
     | 
| 
       36 
49 
     | 
    
         
             
                def self.get_service_base
         
     | 
| 
       37 
50 
     | 
    
         
             
                  @service_base
         
     | 
    
        data/lib/safrano/service.rb
    CHANGED
    
    | 
         @@ -12,8 +12,12 @@ require 'set' 
     | 
|
| 
       12 
12 
     | 
    
         
             
            require 'odata/collection'
         
     | 
| 
       13 
13 
     | 
    
         | 
| 
       14 
14 
     | 
    
         
             
            module Safrano
         
     | 
| 
       15 
     | 
    
         
            -
              #  
     | 
| 
      
 15 
     | 
    
         
            +
              # these modules have all methods related to expand/defered output preparation
         
     | 
| 
       16 
16 
     | 
    
         
             
              # and will be included in Service class
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              METADATA_K = '__metadata'
         
     | 
| 
      
 19 
     | 
    
         
            +
              EMPTYH = {}.freeze
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
       17 
21 
     | 
    
         
             
              module ExpandHandler
         
     | 
| 
       18 
22 
     | 
    
         
             
                PATH_SPLITTER = %r{\A(\w+)/?(.*)\z}.freeze
         
     | 
| 
       19 
23 
     | 
    
         
             
                DEFERRED = '__deferred'
         
     | 
| 
         @@ -40,14 +44,17 @@ module Safrano 
     | 
|
| 
       40 
44 
     | 
    
         
             
                  { uri: entity.uri }
         
     | 
| 
       41 
45 
     | 
    
         
             
                end
         
     | 
| 
       42 
46 
     | 
    
         | 
| 
       43 
     | 
    
         
            -
                EMPTYH = {}.freeze
         
     | 
| 
       44 
     | 
    
         
            -
                METADATA_K = '__metadata'
         
     | 
| 
       45 
47 
     | 
    
         
             
                def get_entity_odata_h(entity:, template:)
         
     | 
| 
       46 
     | 
    
         
            -
                   
     | 
| 
       47 
     | 
    
         
            -
                   
     | 
| 
      
 48 
     | 
    
         
            +
                  hres = {}
         
     | 
| 
      
 49 
     | 
    
         
            +
                  # finalise the template according to options
         
     | 
| 
      
 50 
     | 
    
         
            +
                  # (eg. skip metadata and or deferred...)
         
     | 
| 
      
 51 
     | 
    
         
            +
                  @final_template_func.call(template)
         
     | 
| 
       48 
52 
     | 
    
         | 
| 
       49 
53 
     | 
    
         
             
                  template.each do |elmt, arg|
         
     | 
| 
       50 
54 
     | 
    
         
             
                    case elmt
         
     | 
| 
      
 55 
     | 
    
         
            +
                    when :meta
         
     | 
| 
      
 56 
     | 
    
         
            +
                      hres[METADATA_K] = entity.metadata_h
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
       51 
58 
     | 
    
         
             
                    when :all_values
         
     | 
| 
       52 
59 
     | 
    
         
             
                      hres.merge! entity.casted_values
         
     | 
| 
       53 
60 
     | 
    
         | 
| 
         @@ -143,6 +150,8 @@ module Safrano 
     | 
|
| 
       143 
150 
     | 
    
         
             
                attr_accessor :function_imports
         
     | 
| 
       144 
151 
     | 
    
         
             
                attr_accessor :function_import_keys
         
     | 
| 
       145 
152 
     | 
    
         
             
                attr_accessor :type_mappings
         
     | 
| 
      
 153 
     | 
    
         
            +
                attr_accessor :final_template_func
         
     | 
| 
      
 154 
     | 
    
         
            +
                attr_accessor :response_format_options
         
     | 
| 
       146 
155 
     | 
    
         | 
| 
       147 
156 
     | 
    
         
             
                # Instance attributes for specialized Version specific Instances
         
     | 
| 
       148 
157 
     | 
    
         
             
                attr_accessor :v1
         
     | 
| 
         @@ -151,6 +160,12 @@ module Safrano 
     | 
|
| 
       151 
160 
     | 
    
         
             
                # TODO: more elegant design
         
     | 
| 
       152 
161 
     | 
    
         
             
                attr_reader :data_service_version
         
     | 
| 
       153 
162 
     | 
    
         | 
| 
      
 163 
     | 
    
         
            +
                # for response format options
         
     | 
| 
      
 164 
     | 
    
         
            +
                FINAL_TEMPLATE_FUNC_DEFAULT = ->(_template) {}
         
     | 
| 
      
 165 
     | 
    
         
            +
                FINAL_TEMPLATE_FUNC_SKIP_META = ->(template) { template.delete(:meta) }
         
     | 
| 
      
 166 
     | 
    
         
            +
                FINAL_TEMPLATE_FUNC_SKIP_DEFERR = ->(template) { template.delete(:deferr) }
         
     | 
| 
      
 167 
     | 
    
         
            +
                FINAL_TEMPLATE_FUNC_SKIP_META_DEFERR = ->(template) { template.delete(:meta); template.delete(:deferr) }
         
     | 
| 
      
 168 
     | 
    
         
            +
             
     | 
| 
       154 
169 
     | 
    
         
             
                def initialize(&block)
         
     | 
| 
       155 
170 
     | 
    
         
             
                  # Warning: if you add attributes here, you shall need add them
         
     | 
| 
       156 
171 
     | 
    
         
             
                  # in copy_attribs_to as well
         
     | 
| 
         @@ -164,6 +179,8 @@ module Safrano 
     | 
|
| 
       164 
179 
     | 
    
         
             
                  @function_import_keys = []
         
     | 
| 
       165 
180 
     | 
    
         
             
                  @cmap = {}
         
     | 
| 
       166 
181 
     | 
    
         
             
                  @type_mappings = {}
         
     | 
| 
      
 182 
     | 
    
         
            +
                  @response_format_options = []
         
     | 
| 
      
 183 
     | 
    
         
            +
                  @final_template_func = FINAL_TEMPLATE_FUNC_DEFAULT
         
     | 
| 
       167 
184 
     | 
    
         
             
                  # enabled per default starting from 0.6
         
     | 
| 
       168 
185 
     | 
    
         
             
                  @bugfix_create_response = true
         
     | 
| 
       169 
186 
     | 
    
         
             
                  instance_eval(&block) if block_given?
         
     | 
| 
         @@ -214,12 +231,42 @@ module Safrano 
     | 
|
| 
       214 
231 
     | 
    
         
             
                  (@v2.xserver_url = @xserver_url) if @v2
         
     | 
| 
       215 
232 
     | 
    
         
             
                end
         
     | 
| 
       216 
233 
     | 
    
         | 
| 
      
 234 
     | 
    
         
            +
                VALID_RESP_FORMAT_OPTS = [:skip_deferred, :skip_metadata]
         
     | 
| 
      
 235 
     | 
    
         
            +
                def valid_resp_format_options(*args)
         
     | 
| 
      
 236 
     | 
    
         
            +
                  args.map!(&:to_sym)
         
     | 
| 
      
 237 
     | 
    
         
            +
                  args.each { |arg|
         
     | 
| 
      
 238 
     | 
    
         
            +
                    raise API::InvalidRespFormatOption.new(arg) unless VALID_RESP_FORMAT_OPTS.include?(arg)
         
     | 
| 
      
 239 
     | 
    
         
            +
                  }
         
     | 
| 
      
 240 
     | 
    
         
            +
                  yield(args)
         
     | 
| 
      
 241 
     | 
    
         
            +
                end
         
     | 
| 
      
 242 
     | 
    
         
            +
             
     | 
| 
      
 243 
     | 
    
         
            +
                def response_format_options(*args)
         
     | 
| 
      
 244 
     | 
    
         
            +
                  valid_resp_format_options(*args) do |vargs|
         
     | 
| 
      
 245 
     | 
    
         
            +
                    @response_format_options = vargs.dup
         
     | 
| 
      
 246 
     | 
    
         
            +
                    process_response_format_options
         
     | 
| 
      
 247 
     | 
    
         
            +
                    @v1.response_format_options(*vargs) if @v1
         
     | 
| 
      
 248 
     | 
    
         
            +
                    @v2.response_format_options(*vargs) if @v2
         
     | 
| 
      
 249 
     | 
    
         
            +
                  end
         
     | 
| 
      
 250 
     | 
    
         
            +
                end
         
     | 
| 
      
 251 
     | 
    
         
            +
             
     | 
| 
       217 
252 
     | 
    
         
             
                # keep the bug active for now, but allow to de-activate the fix
         
     | 
| 
       218 
253 
     | 
    
         
             
                def bugfix_create_response(bool)
         
     | 
| 
       219 
254 
     | 
    
         
             
                  @bugfix_create_response = bool
         
     | 
| 
       220 
255 
     | 
    
         
             
                end
         
     | 
| 
       221 
256 
     | 
    
         | 
| 
       222 
257 
     | 
    
         
             
                # end public API
         
     | 
| 
      
 258 
     | 
    
         
            +
                def process_response_format_options
         
     | 
| 
      
 259 
     | 
    
         
            +
                  @final_template_func = if (@response_format_options.include?(:skip_metadata) &&
         
     | 
| 
      
 260 
     | 
    
         
            +
                                                @response_format_options.include?(:skip_deferred))
         
     | 
| 
      
 261 
     | 
    
         
            +
                                           FINAL_TEMPLATE_FUNC_SKIP_META_DEFERR
         
     | 
| 
      
 262 
     | 
    
         
            +
                                         elsif @response_format_options.include?(:skip_metadata)
         
     | 
| 
      
 263 
     | 
    
         
            +
                                           FINAL_TEMPLATE_FUNC_SKIP_META
         
     | 
| 
      
 264 
     | 
    
         
            +
                                         elsif @response_format_options.include?(:skip_deferred)
         
     | 
| 
      
 265 
     | 
    
         
            +
                                           FINAL_TEMPLATE_FUNC_SKIP_DEFERR
         
     | 
| 
      
 266 
     | 
    
         
            +
                                         else
         
     | 
| 
      
 267 
     | 
    
         
            +
                                           FINAL_TEMPLATE_FUNC_DEFAULT
         
     | 
| 
      
 268 
     | 
    
         
            +
                                         end
         
     | 
| 
      
 269 
     | 
    
         
            +
                end
         
     | 
| 
       223 
270 
     | 
    
         | 
| 
       224 
271 
     | 
    
         
             
                def set_uribase
         
     | 
| 
       225 
272 
     | 
    
         
             
                  @uribase = if @xpath_prefix.empty?
         
     | 
| 
         @@ -250,6 +297,8 @@ module Safrano 
     | 
|
| 
       250 
297 
     | 
    
         
             
                  other.function_imports = @function_imports
         
     | 
| 
       251 
298 
     | 
    
         
             
                  other.function_import_keys = @function_import_keys
         
     | 
| 
       252 
299 
     | 
    
         
             
                  other.type_mappings = @type_mappings
         
     | 
| 
      
 300 
     | 
    
         
            +
                  other.response_format_options = @response_format_options
         
     | 
| 
      
 301 
     | 
    
         
            +
                  other.final_template_func = @final_template_func
         
     | 
| 
       253 
302 
     | 
    
         
             
                  other.bugfix_create_response(@bugfix_create_response)
         
     | 
| 
       254 
303 
     | 
    
         
             
                  other
         
     | 
| 
       255 
304 
     | 
    
         
             
                end
         
     | 
    
        data/lib/safrano/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: safrano
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 0.8. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.8.2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - oz
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date:  
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2024-03-09 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: rack
         
     | 
| 
         @@ -187,6 +187,7 @@ files: 
     | 
|
| 
       187 
187 
     | 
    
         
             
            - lib/core_ext/Dir/iter.rb
         
     | 
| 
       188 
188 
     | 
    
         
             
            - lib/core_ext/Hash/transform.rb
         
     | 
| 
       189 
189 
     | 
    
         
             
            - lib/core_ext/Integer/edm.rb
         
     | 
| 
      
 190 
     | 
    
         
            +
            - lib/core_ext/MatchData/matchlen.rb
         
     | 
| 
       190 
191 
     | 
    
         
             
            - lib/core_ext/Numeric/convert.rb
         
     | 
| 
       191 
192 
     | 
    
         
             
            - lib/core_ext/REXML/Document/output.rb
         
     | 
| 
       192 
193 
     | 
    
         
             
            - lib/core_ext/String/convert.rb
         
     | 
| 
         @@ -197,6 +198,7 @@ files: 
     | 
|
| 
       197 
198 
     | 
    
         
             
            - lib/core_ext/dir.rb
         
     | 
| 
       198 
199 
     | 
    
         
             
            - lib/core_ext/hash.rb
         
     | 
| 
       199 
200 
     | 
    
         
             
            - lib/core_ext/integer.rb
         
     | 
| 
      
 201 
     | 
    
         
            +
            - lib/core_ext/matchdata.rb
         
     | 
| 
       200 
202 
     | 
    
         
             
            - lib/core_ext/numeric.rb
         
     | 
| 
       201 
203 
     | 
    
         
             
            - lib/core_ext/rexml.rb
         
     | 
| 
       202 
204 
     | 
    
         
             
            - lib/core_ext/string.rb
         
     |