Commit 0618580

mo <mo.khan@gmail.com>
2018-03-17 19:32:34
extract parser class.
1 parent 151919b
Changed files (3)
lib/saml/kit/metadata.rb
@@ -1,7 +1,5 @@
 # frozen_string_literal: true
 
-require 'saml/kit/organization'
-
 module Saml
   module Kit
     # The Metadata object can be used to parse an XML string of metadata.
@@ -42,7 +40,7 @@ module Saml
       validate :must_match_xsd
       validate :must_have_valid_signature
 
-      attr_reader :name
+      attr_reader :name, :content
 
       def initialize(name, content)
         @name = name
@@ -59,9 +57,8 @@ module Saml
         search("/md:EntityDescriptor/md:#{name}/md:NameIDFormat").map(&:text)
       end
 
-      def organization
-        @organization ||=
-          Organization.new(at_xpath('/md:EntityDescriptor/md:Organization'))
+      def organization(xpath = '/md:EntityDescriptor/md:Organization')
+        @organization ||= Organization.new(at_xpath(xpath))
       end
 
       # Returns the Company
@@ -175,25 +172,8 @@ module Saml
       end
 
       class << self
-        # Creates a `{Saml::Kit::Metadata}` object from a raw XML [String].
-        #
-        # @param content [String] the raw metadata XML.
-        # @return [Saml::Kit::Metadata] the metadata document or subclass.
         def from(content)
-          document = Nokogiri::XML(content)
-          return unless document.at_xpath('/md:EntityDescriptor', XmlParseable::NAMESPACES)
-
-          xpath = '/md:EntityDescriptor/md:SPSSODescriptor'
-          sp = document.at_xpath(xpath, XmlParseable::NAMESPACES)
-          xpath = '/md:EntityDescriptor/md:IDPSSODescriptor'
-          idp = document.at_xpath(xpath, XmlParseable::NAMESPACES)
-          if sp && idp
-            Saml::Kit::CompositeMetadata.new(content)
-          elsif sp
-            Saml::Kit::ServiceProviderMetadata.new(content)
-          elsif idp
-            Saml::Kit::IdentityProviderMetadata.new(content)
-          end
+          Saml::Kit::Parser.new.map_from(content)
         end
 
         # @!visibility private
@@ -204,8 +184,6 @@ module Saml
 
       private
 
-      attr_reader :content
-
       def metadata
         at_xpath("/md:EntityDescriptor/md:#{name}").present?
       end
lib/saml/kit/parser.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+#
+module Saml
+  module Kit
+    class Parser
+      # Creates a `{Saml::Kit::Metadata}` object from a raw XML [String].
+      #
+      # @param content [String] the raw metadata XML.
+      # @return [Saml::Kit::Metadata] the metadata document or subclass.
+      def map_from(content)
+        document = Nokogiri::XML(content)
+        return unless document.at_xpath('/md:EntityDescriptor', XmlParseable::NAMESPACES)
+
+        xpath = '/md:EntityDescriptor/md:SPSSODescriptor'
+        sp = document.at_xpath(xpath, XmlParseable::NAMESPACES)
+        xpath = '/md:EntityDescriptor/md:IDPSSODescriptor'
+        idp = document.at_xpath(xpath, XmlParseable::NAMESPACES)
+        if sp && idp
+          Saml::Kit::CompositeMetadata.new(content)
+        elsif sp
+          Saml::Kit::ServiceProviderMetadata.new(content)
+        elsif idp
+          Saml::Kit::IdentityProviderMetadata.new(content)
+        end
+      end
+    end
+  end
+end
lib/saml/kit.rb
@@ -43,6 +43,7 @@ require 'saml/kit/logout_request'
 require 'saml/kit/metadata'
 require 'saml/kit/null_assertion'
 require 'saml/kit/organization'
+require 'saml/kit/parser'
 require 'saml/kit/composite_metadata'
 require 'saml/kit/response'
 require 'saml/kit/identity_provider_metadata'