safrano 0.5.2 → 0.5.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00bf6cd3a561928000b8bf53bbc71f139b162f92adc229e625f010dc6f1ce3c7
4
- data.tar.gz: bf154e1b55e4d32e4640d6c993566a45eae8a2bce44b23dd979a9946d3633dc7
3
+ metadata.gz: 64699787371f5e9f696461faac80382cf2d53fe78d387742d8650e5a4b2c54df
4
+ data.tar.gz: 530e7619b4b27a1a50a63f832d4f3a8894850c6cea36e638769cdffbc6b7d942
5
5
  SHA512:
6
- metadata.gz: 9b2fad0321b45bae50f3435b688b31f99d320cfa4f81f14867f64659faa0c4e8ece7bc4f1f7ecc2db2c7710c08f7726bb4d758bf5d09d487a54199afea50119a
7
- data.tar.gz: b9a70b4a08fb7a2cc31df7e7637f635a42a85433660f5061f6897e1fb463496252c8d611fb1023e5f27202bbc478b58569d2ad42b1c3359db14e34c92f4ec35c
6
+ metadata.gz: e5d118f15a3a3ba78f5385867c82370e36612585b7f83329343babb2e3a8a7220d1059ad766fbe7c9e1f7f74a57945c086e60624d0301259c1427f0053b59052
7
+ data.tar.gz: 52b283be3e8902226f14864a74eae30bc62c65908be748ea37c5a150f574f3130c8957f26251e1958e298eba221eeada9f0155fcc73ed2591034e97466f1e629
@@ -20,13 +20,15 @@ module Safrano
20
20
  # cf. Sequel Database column_schema_default_to_ruby_value
21
21
  # schema_column_type
22
22
  # https://www.odata.org/documentation/odata-version-2-0/overview/
23
- def self.default_edm_type(ruby_type:)
23
+ def self.default_edm_type(ruby_type:, db_type: )
24
24
  case ruby_type
25
25
  when :integer
26
26
  'Edm.Int32'
27
27
  when :string
28
28
  'Edm.String'
29
- when :date, :datetime,
29
+ when :date
30
+ 'Edm.DateTime'
31
+ when :datetime
30
32
  'Edm.DateTime'
31
33
  when :time
32
34
  'Edm.Time'
@@ -38,6 +40,10 @@ module Safrano
38
40
  'Edm.Decimal'
39
41
  when :blob
40
42
  'Edm.Binary'
43
+ else # try with db_type:
44
+ if ( db_type =~ /\ANUMERIC/ )
45
+ 'Edm.Decimal'
46
+ end
41
47
  end
42
48
  end
43
49
 
data/lib/odata/entity.rb CHANGED
@@ -311,7 +311,7 @@ module Safrano
311
311
  end
312
312
 
313
313
  module MappingBeforeOutput
314
- # needed for proper datetime output
314
+ # needed for proper datetime or Decimal output
315
315
  def casted_values(cols = nil)
316
316
  vals = case cols
317
317
  when nil
@@ -322,6 +322,10 @@ module Safrano
322
322
  else
323
323
  selected_values_for_odata(cols)
324
324
  end
325
+ # TODO better design (perf/ do more during startup and less during request runtime )
326
+ # TODO replace the quick and dirty BigDecimal hack with something better
327
+ self.class.decimal_cols.each { |dc| vals[dc] = BigDecimal(vals[dc].to_s).to_s('F') if vals.key?(dc) }
328
+
325
329
  self.class.time_cols.each { |tc| vals[tc] = vals[tc]&.iso8601 if vals.key?(tc) }
326
330
  vals
327
331
  end
@@ -6,6 +6,7 @@
6
6
 
7
7
  require 'json'
8
8
  require 'rexml/document'
9
+ require 'bigdecimal'
9
10
  require_relative '../safrano/core'
10
11
  require_relative 'error'
11
12
  require_relative 'collection_filter'
@@ -32,6 +33,7 @@ module Safrano
32
33
  attr_reader :uri
33
34
  attr_reader :odata_upk_parts
34
35
  attr_reader :time_cols
36
+ attr_reader :decimal_cols
35
37
  attr_reader :namespace
36
38
 
37
39
  # initialising block of code to be executed at end of
@@ -73,7 +75,7 @@ module Safrano
73
75
  @uparms = nil
74
76
  @params = nil
75
77
  @cx = nil
76
- @@time_cols = nil
78
+ # @@time_cols = nil
77
79
  end
78
80
 
79
81
  def build_uri(uribase)
@@ -358,11 +360,16 @@ module Safrano
358
360
  # Time columns
359
361
  @time_cols = db_schema.select { |_c, v| v[:type] == :datetime }.map { |c, _v| c }
360
362
 
363
+
364
+
361
365
  # add edm_types into schema
362
366
  db_schema.each do |_col, props|
363
- props[:odata_edm_type] = Safrano.default_edm_type(ruby_type: props[:type])
367
+ props[:odata_edm_type] = Safrano.default_edm_type(ruby_type: props[:type],
368
+ db_type: props[:db_type])
364
369
  end
365
-
370
+ # Edm.Decimal cols
371
+ @decimal_cols = db_schema.select { |_c, v| v[:odata_edm_type] == 'Edm.Decimal' }.map { |c, _v| c }
372
+
366
373
  # and finally build the path lists and allowed tr's
367
374
  build_attribute_path_list
368
375
  build_expand_path_list
@@ -375,7 +375,8 @@ module Safrano
375
375
  # finalize the uri's and include NoMappingBeforeOutput or MappingBeforeOutput as needed
376
376
  @collections.each do |klass|
377
377
  klass.build_uri(@uribase)
378
- klass.include(klass.time_cols.empty? ? Safrano::NoMappingBeforeOutput : Safrano::MappingBeforeOutput)
378
+ # TODO perf
379
+ klass.include( (klass.time_cols.empty? && klass.decimal_cols.empty?) ? Safrano::NoMappingBeforeOutput : Safrano::MappingBeforeOutput)
379
380
 
380
381
  # Output create (POST) as single entity (Standard) or as array (non-standard buggy)
381
382
  klass.include ( @bugfix_create_response ? Safrano::EntityCreateStandardOutput : Safrano::EntityCreateArrayOutput)
@@ -504,7 +505,9 @@ module Safrano
504
505
  doc.add_element('edmx:Edmx', 'Version' => '1.0')
505
506
  doc.root.add_namespace('xmlns:edmx', XMLNS::MSFT_ADO_2007_EDMX)
506
507
  serv = doc.root.add_element('edmx:DataServices',
507
- 'm:DataServiceVersion' => '1.0')
508
+ # TODO: export the real version (result from version negotions)
509
+ # but currently we support only v1 and v2, and most users will use v2
510
+ 'm:DataServiceVersion' => '2.0')
508
511
  # 'm:DataServiceVersion' => "#{self.dataServiceVersion}" )
509
512
  # DataServiceVersion: This attribute MUST be in the data service
510
513
  # metadata namespace
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Safrano
4
- VERSION = '0.5.2'
4
+ VERSION = '0.5.3'
5
5
  end
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.5.2
4
+ version: 0.5.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - oz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-20 00:00:00.000000000 Z
11
+ date: 2021-07-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack