lib/azure/service/serialization.rb in stuartpreston-azure-sdk-for-ruby-0.7.1 vs lib/azure/service/serialization.rb in stuartpreston-azure-sdk-for-ruby-0.7.2

- old
+ new

@@ -1,298 +1,298 @@ -#------------------------------------------------------------------------- -# # Copyright (c) Microsoft and contributors. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#-------------------------------------------------------------------------- -require 'nokogiri' - -require 'azure/service/enumeration_results' -require 'azure/service/signed_identifier' -require 'azure/service/access_policy' - -require 'azure/service/storage_service_properties' -require 'azure/service/logging' -require 'azure/service/metrics' -require 'azure/service/retention_policy' -require 'azure/service/cors' -require 'azure/service/cors_rule' - -module Azure - module Service - module Serialization - module ClassMethods - - def signed_identifiers_from_xml(xml) - xml = slopify(xml) - expect_node("SignedIdentifiers", xml) - - identifiers = [] - return identifiers unless (xml > "SignedIdentifier").any? - - if xml.SignedIdentifier.count == 0 - identifiers.push(signed_identifier_from_xml(xml.SignedIdentifier)) - else - xml.SignedIdentifier.each { |identifier_node| - identifiers.push(signed_identifier_from_xml(identifier_node)) - } - end - - identifiers - end - - def signed_identifiers_to_xml(signed_identifiers) - builder = Nokogiri::XML::Builder.new(:encoding=>"utf-8") do |xml| - xml.SignedIdentifiers { - signed_identifiers.each do |identifier| - xml.SignedIdentifier { - xml.Id identifier.id - xml.AccessPolicy { - xml.Start identifier.access_policy.start - xml.Expiry identifier.access_policy.expiry - xml.Permission identifier.access_policy.permission - } - } - end - } - end - builder.to_xml - end - - def signed_identifier_from_xml(xml) - xml = slopify(xml) - expect_node("SignedIdentifier", xml) - - SignedIdentifier.new do |identifier| - identifier.id = xml.Id.text if (xml > "Id").any? - identifier.access_policy = access_policy_from_xml(xml.AccessPolicy) if (xml > "AccessPolicy").any? - end - end - - def access_policy_from_xml(xml) - xml = slopify(xml) - expect_node("AccessPolicy", xml) - - AccessPolicy.new do |policy| - policy.start = xml.Start.text if (xml > "Start").any? - policy.expiry = xml.Expiry.text if (xml > "Expiry").any? - policy.permission = xml.Permission.text if (xml > "Permission").any? - end - end - - def enumeration_results_from_xml(xml, results) - xml = slopify(xml) - expect_node("EnumerationResults", xml) - - results = results || EnumerationResults.new; - - results.continuation_token = xml.NextMarker.text if (xml > "NextMarker").any? - results - end - - def metadata_from_xml(xml) - xml = slopify(xml) - expect_node("Metadata", xml) - - metadata = {} - - xml.children.each { |meta_node| - - key = meta_node.name.downcase - if metadata.has_key? key - metadata[key] = [metadata[key]] unless metadata[key].respond_to? :push - metadata[key].push(meta_node.text) - else - metadata[key] = meta_node.text - end - } - metadata - end - - def metadata_from_headers(headers) - metadata = {} - - headers.each { |k, v| - if key = k[/^x-ms-meta-(.*)/, 1] - if metadata.has_key? key - metadata[key] = [metadata[key]] unless metadata[key].respond_to? :push - metadata[key].push(v) - else - metadata[key] = v - end - end - } - - metadata - end - - def retention_policy_to_xml(retention_policy, xml) - xml.RetentionPolicy { - xml.Enabled retention_policy.enabled unless retention_policy.enabled == nil - xml.Days retention_policy.days if retention_policy.days - } - end - - def retention_policy_from_xml(xml) - xml = slopify(xml) - expect_node("RetentionPolicy", xml) - - RetentionPolicy.new do |policy| - policy.enabled = to_bool(xml.Enabled.text) if (xml > "Enabled").any? - policy.days = xml.Days.text.to_i if (xml > "Days").any? - end - end - - def metrics_to_xml_children(metrics, xml) - xml.Version metrics.version if metrics.version - xml.Enabled metrics.enabled unless metrics.enabled == nil - xml.IncludeAPIs metrics.include_apis unless metrics.include_apis == nil - retention_policy_to_xml(metrics.retention_policy, xml) if metrics.retention_policy - end - - def hour_metrics_to_xml(metrics, xml) - xml.HourMetrics { - metrics_to_xml_children(metrics, xml) - } - end - - def minute_metrics_to_xml(metrics, xml) - xml.MinuteMetrics { - metrics_to_xml_children(metrics, xml) - } - end - - def metrics_from_xml(xml) - xml = slopify(xml) - - Metrics.new do |metrics| - metrics.version = xml.Version.text if (xml > "Version").any? - metrics.enabled = to_bool(xml.Enabled.text) if (xml > "Enabled").any? - metrics.include_apis = to_bool(xml.IncludeAPIs.text) if (xml > "IncludeAPIs").any? - metrics.retention_policy = retention_policy_from_xml(xml.RetentionPolicy) - end - end - - def logging_to_xml(logging, xml) - xml.Logging { - xml.Version logging.version if logging.version - xml.Delete logging.delete unless logging.delete == nil - xml.Read logging.read unless logging.read == nil - xml.Write logging.write unless logging.write == nil - retention_policy_to_xml(logging.retention_policy, xml) if logging.retention_policy - } - end - - def logging_from_xml(xml) - xml = slopify(xml) - expect_node("Logging", xml) - - Logging.new do |logging| - logging.version = xml.Version.text if (xml > "Version").any? - logging.delete = to_bool(xml.Delete.text) if (xml > "Delete").any? - logging.read = to_bool(xml.Read.text) if (xml > "Read").any? - logging.write = to_bool(xml.Write.text) if (xml > "Write").any? - logging.retention_policy = retention_policy_from_xml(xml.RetentionPolicy) - end - end - - def cors_to_xml(cors, xml) - xml.Cors { - cors.cors_rules.to_a.each do |cors_rule| - cors_rule_to_xml(cors_rule, xml) - end - } - end - - def cors_rule_to_xml(cors_rule, xml) - xml.CorsRule { - xml.AllowedOrigins cors_rule.allowed_origins.join(",") if cors_rule.allowed_origins - xml.AllowedMethods cors_rule.allowed_methods.join(",") if cors_rule.allowed_methods - xml.MaxAgeInSeconds cors_rule.max_age_in_seconds if cors_rule.max_age_in_seconds - xml.ExposedHeaders cors_rule.exposed_headers.join(",") if cors_rule.exposed_headers - xml.AllowedHeaders cors_rule.allowed_headers.join(",") if cors_rule.allowed_headers - } - end - - def cors_from_xml(xml) - xml = slopify(xml) - expect_node("Cors", xml) - - Cors.new do |cors| - cors.cors_rules = xml.children.to_a.map {|child| cors_rule_from_xml(child)} - end - end - - def cors_rule_from_xml(xml) - xml = slopify(xml) - expect_node("CorsRule", xml) - - CorsRule.new do |cors_rule| - cors_rule.allowed_origins = ary_from_node(xml.AllowedOrigins) if (xml > "AllowedOrigins").any? - cors_rule.allowed_methods = ary_from_node(xml.AllowedMethods) if (xml > "AllowedMethods").any? - cors_rule.max_age_in_seconds = xml.MaxAgeInSeconds.text.to_i if (xml > "MaxAgeInSeconds").any? - cors_rule.exposed_headers = ary_from_node(xml.ExposedHeaders) if (xml > "ExposedHeaders").any? - cors_rule.allowed_headers = ary_from_node(xml.AllowedHeaders) if (xml > "AllowedHeaders").any? - end - end - - def ary_from_node(node) - node.text.split(",").map {|s| s.strip} - end - - def service_properties_to_xml(properties) - builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml| - xml.StorageServiceProperties { - logging_to_xml(properties.logging, xml) if properties.logging - hour_metrics_to_xml(properties.hour_metrics, xml) if properties.hour_metrics - minute_metrics_to_xml(properties.minute_metrics, xml) if properties.minute_metrics - cors_to_xml(properties.cors, xml) if properties.cors - } - end - builder.to_xml - end - - def service_properties_from_xml(xml) - xml = slopify(xml) - expect_node("StorageServiceProperties", xml) - - StorageServiceProperties.new do |props| - props.default_service_version = xml.DefaultServiceVersion.text if (xml > "DefaultServiceVersion").any? - props.logging = logging_from_xml(xml.Logging) - props.hour_metrics = metrics_from_xml(xml.HourMetrics) - props.minute_metrics = metrics_from_xml(xml.MinuteMetrics) - props.cors = cors_from_xml(xml.Cors) - end - end - - def to_bool(s) - (s || "").downcase == 'true' - end - - def slopify(xml) - node = (xml.is_a? String) ? Nokogiri.Slop(xml).root : xml - node.slop! if node.is_a? Nokogiri::XML::Document unless node.respond_to? :method_missing - node = node.root if node.is_a? Nokogiri::XML::Document - node - end - - def expect_node(node_name, xml) - raise "Xml is not a #{node_name} node." unless xml.name == node_name - end - end - - extend ClassMethods - - def self.included( other ) - other.extend( ClassMethods ) - end - end - end +#------------------------------------------------------------------------- +# # Copyright (c) Microsoft and contributors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#-------------------------------------------------------------------------- +require 'nokogiri' + +require 'azure/service/enumeration_results' +require 'azure/service/signed_identifier' +require 'azure/service/access_policy' + +require 'azure/service/storage_service_properties' +require 'azure/service/logging' +require 'azure/service/metrics' +require 'azure/service/retention_policy' +require 'azure/service/cors' +require 'azure/service/cors_rule' + +module Azure + module Service + module Serialization + module ClassMethods + + def signed_identifiers_from_xml(xml) + xml = slopify(xml) + expect_node("SignedIdentifiers", xml) + + identifiers = [] + return identifiers unless (xml > "SignedIdentifier").any? + + if xml.SignedIdentifier.count == 0 + identifiers.push(signed_identifier_from_xml(xml.SignedIdentifier)) + else + xml.SignedIdentifier.each { |identifier_node| + identifiers.push(signed_identifier_from_xml(identifier_node)) + } + end + + identifiers + end + + def signed_identifiers_to_xml(signed_identifiers) + builder = Nokogiri::XML::Builder.new(:encoding=>"utf-8") do |xml| + xml.SignedIdentifiers { + signed_identifiers.each do |identifier| + xml.SignedIdentifier { + xml.Id identifier.id + xml.AccessPolicy { + xml.Start identifier.access_policy.start + xml.Expiry identifier.access_policy.expiry + xml.Permission identifier.access_policy.permission + } + } + end + } + end + builder.to_xml + end + + def signed_identifier_from_xml(xml) + xml = slopify(xml) + expect_node("SignedIdentifier", xml) + + SignedIdentifier.new do |identifier| + identifier.id = xml.Id.text if (xml > "Id").any? + identifier.access_policy = access_policy_from_xml(xml.AccessPolicy) if (xml > "AccessPolicy").any? + end + end + + def access_policy_from_xml(xml) + xml = slopify(xml) + expect_node("AccessPolicy", xml) + + AccessPolicy.new do |policy| + policy.start = xml.Start.text if (xml > "Start").any? + policy.expiry = xml.Expiry.text if (xml > "Expiry").any? + policy.permission = xml.Permission.text if (xml > "Permission").any? + end + end + + def enumeration_results_from_xml(xml, results) + xml = slopify(xml) + expect_node("EnumerationResults", xml) + + results = results || EnumerationResults.new; + + results.continuation_token = xml.NextMarker.text if (xml > "NextMarker").any? + results + end + + def metadata_from_xml(xml) + xml = slopify(xml) + expect_node("Metadata", xml) + + metadata = {} + + xml.children.each { |meta_node| + + key = meta_node.name.downcase + if metadata.has_key? key + metadata[key] = [metadata[key]] unless metadata[key].respond_to? :push + metadata[key].push(meta_node.text) + else + metadata[key] = meta_node.text + end + } + metadata + end + + def metadata_from_headers(headers) + metadata = {} + + headers.each { |k, v| + if key = k[/^x-ms-meta-(.*)/, 1] + if metadata.has_key? key + metadata[key] = [metadata[key]] unless metadata[key].respond_to? :push + metadata[key].push(v) + else + metadata[key] = v + end + end + } + + metadata + end + + def retention_policy_to_xml(retention_policy, xml) + xml.RetentionPolicy { + xml.Enabled retention_policy.enabled unless retention_policy.enabled == nil + xml.Days retention_policy.days if retention_policy.days + } + end + + def retention_policy_from_xml(xml) + xml = slopify(xml) + expect_node("RetentionPolicy", xml) + + RetentionPolicy.new do |policy| + policy.enabled = to_bool(xml.Enabled.text) if (xml > "Enabled").any? + policy.days = xml.Days.text.to_i if (xml > "Days").any? + end + end + + def metrics_to_xml_children(metrics, xml) + xml.Version metrics.version if metrics.version + xml.Enabled metrics.enabled unless metrics.enabled == nil + xml.IncludeAPIs metrics.include_apis unless metrics.include_apis == nil + retention_policy_to_xml(metrics.retention_policy, xml) if metrics.retention_policy + end + + def hour_metrics_to_xml(metrics, xml) + xml.HourMetrics { + metrics_to_xml_children(metrics, xml) + } + end + + def minute_metrics_to_xml(metrics, xml) + xml.MinuteMetrics { + metrics_to_xml_children(metrics, xml) + } + end + + def metrics_from_xml(xml) + xml = slopify(xml) + + Metrics.new do |metrics| + metrics.version = xml.Version.text if (xml > "Version").any? + metrics.enabled = to_bool(xml.Enabled.text) if (xml > "Enabled").any? + metrics.include_apis = to_bool(xml.IncludeAPIs.text) if (xml > "IncludeAPIs").any? + metrics.retention_policy = retention_policy_from_xml(xml.RetentionPolicy) + end + end + + def logging_to_xml(logging, xml) + xml.Logging { + xml.Version logging.version if logging.version + xml.Delete logging.delete unless logging.delete == nil + xml.Read logging.read unless logging.read == nil + xml.Write logging.write unless logging.write == nil + retention_policy_to_xml(logging.retention_policy, xml) if logging.retention_policy + } + end + + def logging_from_xml(xml) + xml = slopify(xml) + expect_node("Logging", xml) + + Logging.new do |logging| + logging.version = xml.Version.text if (xml > "Version").any? + logging.delete = to_bool(xml.Delete.text) if (xml > "Delete").any? + logging.read = to_bool(xml.Read.text) if (xml > "Read").any? + logging.write = to_bool(xml.Write.text) if (xml > "Write").any? + logging.retention_policy = retention_policy_from_xml(xml.RetentionPolicy) + end + end + + def cors_to_xml(cors, xml) + xml.Cors { + cors.cors_rules.to_a.each do |cors_rule| + cors_rule_to_xml(cors_rule, xml) + end + } + end + + def cors_rule_to_xml(cors_rule, xml) + xml.CorsRule { + xml.AllowedOrigins cors_rule.allowed_origins.join(",") if cors_rule.allowed_origins + xml.AllowedMethods cors_rule.allowed_methods.join(",") if cors_rule.allowed_methods + xml.MaxAgeInSeconds cors_rule.max_age_in_seconds if cors_rule.max_age_in_seconds + xml.ExposedHeaders cors_rule.exposed_headers.join(",") if cors_rule.exposed_headers + xml.AllowedHeaders cors_rule.allowed_headers.join(",") if cors_rule.allowed_headers + } + end + + def cors_from_xml(xml) + xml = slopify(xml) + expect_node("Cors", xml) + + Cors.new do |cors| + cors.cors_rules = xml.children.to_a.map {|child| cors_rule_from_xml(child)} + end + end + + def cors_rule_from_xml(xml) + xml = slopify(xml) + expect_node("CorsRule", xml) + + CorsRule.new do |cors_rule| + cors_rule.allowed_origins = ary_from_node(xml.AllowedOrigins) if (xml > "AllowedOrigins").any? + cors_rule.allowed_methods = ary_from_node(xml.AllowedMethods) if (xml > "AllowedMethods").any? + cors_rule.max_age_in_seconds = xml.MaxAgeInSeconds.text.to_i if (xml > "MaxAgeInSeconds").any? + cors_rule.exposed_headers = ary_from_node(xml.ExposedHeaders) if (xml > "ExposedHeaders").any? + cors_rule.allowed_headers = ary_from_node(xml.AllowedHeaders) if (xml > "AllowedHeaders").any? + end + end + + def ary_from_node(node) + node.text.split(",").map {|s| s.strip} + end + + def service_properties_to_xml(properties) + builder = Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml| + xml.StorageServiceProperties { + logging_to_xml(properties.logging, xml) if properties.logging + hour_metrics_to_xml(properties.hour_metrics, xml) if properties.hour_metrics + minute_metrics_to_xml(properties.minute_metrics, xml) if properties.minute_metrics + cors_to_xml(properties.cors, xml) if properties.cors + } + end + builder.to_xml + end + + def service_properties_from_xml(xml) + xml = slopify(xml) + expect_node("StorageServiceProperties", xml) + + StorageServiceProperties.new do |props| + props.default_service_version = xml.DefaultServiceVersion.text if (xml > "DefaultServiceVersion").any? + props.logging = logging_from_xml(xml.Logging) + props.hour_metrics = metrics_from_xml(xml.HourMetrics) + props.minute_metrics = metrics_from_xml(xml.MinuteMetrics) + props.cors = cors_from_xml(xml.Cors) + end + end + + def to_bool(s) + (s || "").downcase == 'true' + end + + def slopify(xml) + node = (xml.is_a? String) ? Nokogiri.Slop(xml).root : xml + node.slop! if node.is_a? Nokogiri::XML::Document unless node.respond_to? :method_missing + node = node.root if node.is_a? Nokogiri::XML::Document + node + end + + def expect_node(node_name, xml) + raise "Xml is not a #{node_name} node." unless xml.name == node_name + end + end + + extend ClassMethods + + def self.included( other ) + other.extend( ClassMethods ) + end + end + end end \ No newline at end of file