Sha256: 0c20d989c23073fd9fc1feabf4982d529bfcb94fd1ff5e7fd1b97157f68f47c0

Contents?: true

Size: 1.45 KB

Versions: 3

Compression:

Stored size: 1.45 KB

Contents

module TkInspect
  module ClassBrowser
    class ClassNamespaceDataSource
      attr_accessor :class_filter

      def items_for_path(path)
        path = [] if path.blank?
        namespace = path.join('::')
        classes = classes_in_namespace(namespace)
        class_names = classes
                        .map { |k| name_for_class(k).gsub(/^#{namespace}(::)?/, '').gsub(/::.*/, '') }
                        .reject { |class_name| class_name.blank? }
                        .uniq
                        .sort
        class_names
      end

      def title_for_path(path, items)
        "#{items.count} #{'class'.pluralize(items.count)}"
      end

      private

      def classes_in_namespace(namespace)
        filtered_classes.select do |k|
          name_for_class(k).match(/^#{namespace}/)
        end
      end

      def filtered_classes
        list = ObjectSpace.each_object(Class).select do |k|
          k.is_a?(Class) && !black_list?(k)
        end
        return list if @class_filter.blank?
        list.select! do |k|
          name_for_class(k).match(/#{@class_filter}/i)
        end
        ancestors = list.reduce(Set.new) do |acum, k|
          acum += name_for_class(k).split('::')
          acum
        end
        (list.to_set + ancestors).to_a
      end

      def name_for_class(klass)
        klass.to_s
      end

      def black_list?(k)
        k.to_s.blank? || k.to_s.match(/^#<Class/) || !k.to_s.match(/^[A-Z]/)
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
tk_inspect-0.2.1 lib/tk_inspect/class_browser/class_namespace_data_source.rb
tk_inspect-0.2.0 lib/tk_inspect/class_browser/class_namespace_data_source.rb
tk_inspect-0.1.0 lib/tk_inspect/class_browser/class_namespace_data_source.rb