From 48dd92236f9654f1393c079e3bb9d189f7bb06b4 Mon Sep 17 00:00:00 2001 From: Vincent Biret Date: Thu, 22 Dec 2022 10:04:20 -0500 Subject: [PATCH] - adds support for vendor specific serialization in Ruby --- CHANGELOG.md | 1 + .../parse_node_factory_registry.rb | 62 ++++++++++--------- .../serialization_writer_factory_registry.rb | 15 +++-- .../microsoft_kiota_abstractions/version.rb | 2 +- .../spec/parse_node_factory_mock.rb | 11 ++++ .../spec/parse_node_factory_registry_spec.rb | 16 +++++ .../spec/serialization_writer_factory_mock.rb | 11 ++++ ...ialization_writer_factory_registry_spec.rb | 15 +++++ 8 files changed, 100 insertions(+), 33 deletions(-) create mode 100644 abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_mock.rb create mode 100644 abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_registry_spec.rb create mode 100644 abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_mock.rb create mode 100644 abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_registry_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a296f5cc2..a9eba16fd6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added support for auto-registration of serializers in Ruby. [#478](https://github.com/microsoft/kiota/issues/478) - Added support for middleware infrastructure in Ruby. [#1650](https://github.com/microsoft/kiota/issues/1650) - Added support for query parameters names aliasing in Ruby. [#1664](https://github.com/microsoft/kiota/issues/1664) +- Added support for vendor specific serialization in Ruby. [#1661](https://github.com/microsoft/kiota/issues/1661) ### Changed diff --git a/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/parse_node_factory_registry.rb b/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/parse_node_factory_registry.rb index af9e8ebf51..da4196c803 100644 --- a/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/parse_node_factory_registry.rb +++ b/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/parse_node_factory_registry.rb @@ -1,36 +1,42 @@ require_relative 'parse_node_factory' module MicrosoftKiotaAbstractions - class ParseNodeFactoryRegistry - include ParseNodeFactory + class ParseNodeFactoryRegistry + include ParseNodeFactory - class << self - attr_accessor :default_instance - def default_instance; @default_instance ||= ParseNodeFactoryRegistry.new; end - end + class << self + attr_accessor :default_instance + def default_instance; @default_instance ||= ParseNodeFactoryRegistry.new; end + end - def default_instance - self.class.default_instance - end + def default_instance + self.class.default_instance + end - def content_type_associated_factories - @content_type_associated_factories ||= Hash.new - end + def content_type_associated_factories + @content_type_associated_factories ||= Hash.new + end - def get_parse_node(content_type, content) - if !content_type - raise Exception.new 'content type cannot be undefined or empty' - end - if !content - raise Exception.new 'content cannot be undefined or empty' - end - factory = @content_type_associated_factories[content_type] - if factory - return factory.get_parse_node(content_type, content) - else - raise Exception.new "Content type #{contentType} does not have a factory to be parsed" - end - end - - end + def get_parse_node(content_type, content) + if !content_type + raise Exception.new 'content type cannot be undefined or empty' + end + if !content + raise Exception.new 'content cannot be undefined or empty' + end + vendor_specific_content_type = content_type.split(';').first + factory = @content_type_associated_factories[vendor_specific_content_type] + if factory + return factory.get_parse_node(vendor_specific_content_type, content) + end + + clean_content_type = vendor_specific_content_type.gsub(/[^\/]+\+/i, '') + factory = @content_type_associated_factories[clean_content_type] + if factory + return factory.get_parse_node(clean_content_type, content) + end + raise Exception.new "Content type #{contentType} does not have a factory to be parsed" + end + + end end diff --git a/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/serialization_writer_factory_registry.rb b/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/serialization_writer_factory_registry.rb index a3881f5bae..08a33659a5 100644 --- a/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/serialization_writer_factory_registry.rb +++ b/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/serialization/serialization_writer_factory_registry.rb @@ -21,12 +21,19 @@ def get_serialization_writer(content_type) if !content_type raise Exception.new 'content type cannot be undefined or empty' end - factory = @content_type_associated_factories[content_type] + vendor_specific_content_type = content_type.split(';').first + factory = @content_type_associated_factories[vendor_specific_content_type] if factory - return factory.get_serialization_writer(content_type) - else - raise Exception.new "Content type #{contentType} does not have a factory to be serialized" + return factory.get_serialization_writer(vendor_specific_content_type) end + + clean_content_type = vendor_specific_content_type.gsub(/[^\/]+\+/i, '') + factory = @content_type_associated_factories[clean_content_type] + if factory + return factory.get_serialization_writer(clean_content_type) + end + + raise Exception.new "Content type #{contentType} does not have a factory to be serialized" end end diff --git a/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/version.rb b/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/version.rb index 8d3234dd38..ac419d9799 100644 --- a/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/version.rb +++ b/abstractions/ruby/microsoft_kiota_abstractions/lib/microsoft_kiota_abstractions/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module MicrosoftKiotaAbstractions - VERSION = "0.6.0" + VERSION = "0.7.0" end diff --git a/abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_mock.rb b/abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_mock.rb new file mode 100644 index 0000000000..37af7bb0d0 --- /dev/null +++ b/abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_mock.rb @@ -0,0 +1,11 @@ +require 'microsoft_kiota_abstractions' +class ParseNodeFactoryMock + include MicrosoftKiotaAbstractions::ParseNodeFactory + + def get_valid_content_type + 'application/json' + end + def get_parse_node(clean_content_type, content) + return {} + end +end \ No newline at end of file diff --git a/abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_registry_spec.rb b/abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_registry_spec.rb new file mode 100644 index 0000000000..7b7732d46d --- /dev/null +++ b/abstractions/ruby/microsoft_kiota_abstractions/spec/parse_node_factory_registry_spec.rb @@ -0,0 +1,16 @@ +require 'microsoft_kiota_abstractions' +require_relative 'parse_node_factory_mock' +RSpec.describe MicrosoftKiotaAbstractions do + values = [] + values << "application/json" + values << "application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8" + values << "application/vnd.github.mercy-preview+json" + values << "application/vnd.github.mercy-preview+json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8" + serialized_value = "[1]" + MicrosoftKiotaAbstractions::ParseNodeFactoryRegistry.default_instance.content_type_associated_factories["application/json"] = ParseNodeFactoryMock.new + it "gets the parse node" do + values.each do |value| + expect(MicrosoftKiotaAbstractions::ParseNodeFactoryRegistry.default_instance.get_parse_node(value, serialized_value)).not_to be nil + end + end +end \ No newline at end of file diff --git a/abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_mock.rb b/abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_mock.rb new file mode 100644 index 0000000000..f48f32b7b5 --- /dev/null +++ b/abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_mock.rb @@ -0,0 +1,11 @@ +require 'microsoft_kiota_abstractions' +class SerializationWriterFactoryMock + include MicrosoftKiotaAbstractions::SerializationWriterFactory + + def get_valid_content_type + 'application/json' + end + def get_serialization_writer(clean_content) + return {} + end +end \ No newline at end of file diff --git a/abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_registry_spec.rb b/abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_registry_spec.rb new file mode 100644 index 0000000000..0e3e1659db --- /dev/null +++ b/abstractions/ruby/microsoft_kiota_abstractions/spec/serialization_writer_factory_registry_spec.rb @@ -0,0 +1,15 @@ +require 'microsoft_kiota_abstractions' +require_relative 'serialization_writer_factory_mock' +RSpec.describe MicrosoftKiotaAbstractions do + values = [] + values << "application/json" + values << "application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8" + values << "application/vnd.github.mercy-preview+json" + values << "application/vnd.github.mercy-preview+json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false;charset=utf-8" + MicrosoftKiotaAbstractions::SerializationWriterFactoryRegistry.default_instance.content_type_associated_factories["application/json"] = SerializationWriterFactoryMock.new + it "gets the serialization writer" do + values.each do |value| + expect(MicrosoftKiotaAbstractions::SerializationWriterFactoryRegistry.default_instance.get_serialization_writer(value)).not_to be nil + end + end +end \ No newline at end of file