microsoft_kiota_serialization_json 0.18.0 → 0.19.0

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: 03c2671ff8b81e0982ff03b15285dfae320222b7c28e3b9ff2281203a4bf4595
4
- data.tar.gz: 434eca2c601a3a57b9dffee91e5e82027c5c85b3373e25005ea0199e5852831c
3
+ metadata.gz: cb3c8ad046e7bb462b1a2b8142285f7524652c456ebf4d829d1405a5be5cc735
4
+ data.tar.gz: 2f4c604480b717b808521d309b4788d304ffc4e6f40de4c103478a1a5efc9ff4
5
5
  SHA512:
6
- metadata.gz: 133b184021bf30144feee69a1aaded931e843152f954020266fede9ef0c26bdb673fc27c6d6665f4b738ea60705576528267334aaafa362dc01edda229146c44
7
- data.tar.gz: b0afcd96b99e13f7dbfd006b3221901386c9b31a8f54e418ae8446e96a30f48968b032b0ca532d929e7f0d3b1e9dc3f514b44fdbaf8e9ff8e87794fd514ebe1f
6
+ metadata.gz: c564b6ba4b03e7a9f6a6881b8db19d7ba53a991176020f5d6cc16271a3de1129cf44a00460749232745adcef17e8bc08828f51c8d8b63b7d5137bb83cb6f2294
7
+ data.tar.gz: 6b52a93a107d2e90dd93d7c03cc9dc03a23f7cbafeb97ce8154cb23cacb70806988462ab95bb0b9a88f6c01e597cc548748db5cbccb3b0adbb0ea5c073eb8806
@@ -14,20 +14,25 @@ module MicrosoftKiotaSerializationJson
14
14
  @current_node = node
15
15
  end
16
16
 
17
+ # The scalar readers answer only for the type they are named after and return nil otherwise,
18
+ # matching the dotnet and Python runtimes. Coercing instead would make every reader answer for
19
+ # every payload, which leaves a composed type unable to tell which member it holds.
17
20
  def get_string_value
18
- @current_node.to_s
21
+ @current_node.is_a?(String) ? @current_node : nil
19
22
  end
20
23
 
21
24
  def get_boolean_value
22
- @current_node
25
+ [true, false].include?(@current_node) ? @current_node : nil
23
26
  end
24
27
 
25
28
  def get_number_value
26
- @current_node.to_i
29
+ @current_node.is_a?(Integer) ? @current_node : nil
27
30
  end
28
31
 
32
+ # Widened to Numeric because JSON writes a whole number without a fraction, so a float field can
33
+ # legitimately arrive as an Integer.
29
34
  def get_float_value
30
- @current_node.to_f
35
+ @current_node.is_a?(Numeric) ? @current_node.to_f : nil
31
36
  end
32
37
 
33
38
  def get_guid_value
@@ -50,35 +55,34 @@ module MicrosoftKiotaSerializationJson
50
55
  MicrosoftKiotaAbstractions::ISODuration.new(@current_node)
51
56
  end
52
57
 
58
+ # The generator passes the type as a class, except for booleans which it passes as a plain
59
+ # string. A `case` cannot dispatch on that: `when String` asks whether the type is an instance
60
+ # of String, and a class is an instance of Class, so every branch fell through to the string
61
+ # reader. A hash keys on the class object itself.
62
+ PRIMITIVE_READERS = {
63
+ String => :get_string_value,
64
+ Float => :get_float_value,
65
+ Integer => :get_number_value,
66
+ Date => :get_date_value,
67
+ DateTime => :get_date_time_value,
68
+ Time => :get_time_value,
69
+ MicrosoftKiotaAbstractions::ISODuration => :get_duration_value,
70
+ UUIDTools::UUID => :get_guid_value,
71
+ 'boolean' => :get_boolean_value,
72
+ 'Boolean' => :get_boolean_value
73
+ }.freeze
74
+
53
75
  def get_collection_of_primitive_values(type)
76
+ reader = PRIMITIVE_READERS[type]
54
77
  @current_node.map do |object|
55
78
  next if object.nil?
79
+ # an untyped collection is generated as Object, which has no reader of its own; the parsed
80
+ # JSON scalar is already the value, so it passes through rather than being stringified
81
+ next object if reader.nil?
56
82
 
57
- current_parse_node = JsonParseNode.new(object)
58
- case type
59
- when String
60
- current_parse_node.get_string_value
61
- when Float
62
- current_parse_node.get_float_value
63
- when Integer
64
- current_parse_node.get_float_value
65
- when 'Boolean'
66
- current_parse_node.get_float_value
67
- when DateTime
68
- current_parse_node.get_date_time_value
69
- when Time
70
- current_parse_node.get_time_value
71
- when Date
72
- current_parse_node.get_date_value
73
- when MicrosoftKiotaAbstractions::ISODuration
74
- current_parse_node.get_duration_value
75
- when UUIDTools::UUID
76
- current_parse_node.get_guid_value
77
- else
78
- current_parse_node.get_string_value
79
- end
83
+ JsonParseNode.new(object).public_send(reader)
80
84
  rescue StandardError => e
81
- raise e.class, `Failed to fetch #{type} type`
85
+ raise e.class, "Failed to fetch #{type} type: #{e.message}"
82
86
  end
83
87
  end
84
88
 
@@ -121,6 +125,8 @@ module MicrosoftKiotaSerializationJson
121
125
 
122
126
  def get_enum_values(_type)
123
127
  raw_values = get_string_value
128
+ return [] if raw_values.nil?
129
+
124
130
  raw_values.split(',').map(&:strip)
125
131
  end
126
132
 
@@ -12,34 +12,48 @@ module MicrosoftKiotaSerializationJson
12
12
 
13
13
  def initialize
14
14
  @writer = {}
15
+ @root_value = nil
16
+ @has_root_value = false
15
17
  end
16
18
 
17
- attr_reader :writer
19
+ attr_reader :writer, :root_value
20
+
21
+ # A composed type whose selected member is a primitive serializes the scalar as the whole
22
+ # document rather than as a member of an object, so a nil key means "this is the root".
23
+ def set_root_value(value)
24
+ @root_value = value
25
+ @has_root_value = true
26
+ value
27
+ end
28
+
29
+ def root_value?
30
+ @has_root_value
31
+ end
18
32
 
19
33
  def write_string_value(key, value)
20
- raise StandardError, 'no key or value included in write_string_value(key, value)' if !key && !value
21
- return value.to_s unless key
34
+ raise StandardError, 'no key or value included in write_string_value(key, value)' if key.nil? && value.nil?
35
+ return set_root_value(value) if key.nil?
22
36
 
23
- @writer[key] = (value || nil)
37
+ @writer[key] = value
24
38
  end
25
39
 
26
40
  def write_boolean_value(key, value)
27
- raise StandardError, 'no key or value included in write_boolean_value(key, value)' if !key && !value
28
- return value unless key
41
+ raise StandardError, 'no key or value included in write_boolean_value(key, value)' if key.nil? && value.nil?
42
+ return set_root_value(value) if key.nil?
29
43
 
30
44
  @writer[key] = value
31
45
  end
32
46
 
33
47
  def write_number_value(key, value)
34
- raise StandardError, 'no key or value included in write_number_value(key, value)' if !key && !value
35
- return value unless key
48
+ raise StandardError, 'no key or value included in write_number_value(key, value)' if key.nil? && value.nil?
49
+ return set_root_value(value) if key.nil?
36
50
 
37
51
  @writer[key] = value
38
52
  end
39
53
 
40
54
  def write_float_value(key, value)
41
- raise StandardError, 'no key or value included in write_float_value(key, value)' if !key && !value
42
- return value unless key
55
+ raise StandardError, 'no key or value included in write_float_value(key, value)' if key.nil? && value.nil?
56
+ return set_root_value(value) if key.nil?
43
57
 
44
58
  @writer[key] = value
45
59
  end
@@ -99,13 +113,13 @@ module MicrosoftKiotaSerializationJson
99
113
  end
100
114
 
101
115
  def write_object_value(key, value, *additional_values_to_merge)
102
- return unless value
116
+ values = [value, *additional_values_to_merge].compact
117
+ return if values.empty?
103
118
 
104
119
  if key
105
- @writer[key] = object_value_hash(value, *additional_values_to_merge)
120
+ @writer[key] = object_value_hash(*values)
106
121
  else
107
- value.serialize(self)
108
- additional_values_to_merge.each { |v| v&.serialize(self) }
122
+ values.each { |v| v.serialize(self) }
109
123
  end
110
124
  end
111
125
 
@@ -114,7 +128,7 @@ module MicrosoftKiotaSerializationJson
114
128
  end
115
129
 
116
130
  def get_serialized_content
117
- @writer.to_json # TODO: encode to byte array to stay content type agnostic
131
+ (@has_root_value ? @root_value : @writer).to_json # TODO: encode to byte array to stay content type agnostic
118
132
  end
119
133
 
120
134
  def write_additional_data(value)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MicrosoftKiotaSerializationJson
4
- VERSION = '0.18.0' # x-release-please-version
4
+ VERSION = '0.19.0' # x-release-please-version
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: microsoft_kiota_serialization_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.18.0
4
+ version: 0.19.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Microsoft Corporation
@@ -35,14 +35,14 @@ dependencies:
35
35
  requirements:
36
36
  - - '='
37
37
  - !ruby/object:Gem::Version
38
- version: 0.18.0
38
+ version: 0.19.0
39
39
  type: :runtime
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
42
42
  requirements:
43
43
  - - '='
44
44
  - !ruby/object:Gem::Version
45
- version: 0.18.0
45
+ version: 0.19.0
46
46
  - !ruby/object:Gem::Dependency
47
47
  name: uuidtools
48
48
  requirement: !ruby/object:Gem::Requirement