Sha256: 2fd83bb1b497e21eae3976e57616814aeafa681178f82c45e17f070e25a089af

Contents?: true

Size: 1.69 KB

Versions: 1

Compression:

Stored size: 1.69 KB

Contents

module Chronicle
  module Etl
    # Utility methods to catalogue which Extractor, Transformer, and
    # Loader classes are available to chronicle-etl
    module Catalog
      def self.available_classes
        parent_klasses = [
          Chronicle::Etl::Extractor,
          Chronicle::Etl::Transformer,
          Chronicle::Etl::Loader
        ]

        # TODO: have a registry of plugins
        plugins = ['email', 'bash']

        # Attempt to load each chronicle plugin that we might know about so
        # that we can later search for subclasses to build our list of
        # available classes
        plugins.each do |plugin|
          require "chronicle/#{plugin}"
        rescue LoadError
          # this will happen if the gem isn't available globally 
        end

        klasses = []
        parent_klasses.each do |parent|
          klasses += ObjectSpace.each_object(Class).select { |klass| klass < parent }
        end

        klasses.map do |klass|
          {
            name: klass.name,
            built_in: klass.built_in?,
            provider: klass.provider,
            phase: klass.phase
          }
        end
      end

      def phase
        ancestors = self.ancestors
        return :extractor if ancestors.include? Chronicle::Etl::Extractor
        return :transformer if ancestors.include? Chronicle::Etl::Transformer
        return :loader if ancestors.include? Chronicle::Etl::Loader
      end

      def provider
        # TODO: needs better convention for a gem reporting its provider name
        provider = to_s.split('::')[1].downcase
        return provider unless provider == 'etl'
      end

      def built_in?
        to_s.include? 'Chronicle::Etl'
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
chronicle-etl-0.1.3 lib/chronicle/etl/catalog.rb