Commit 35e1c6c7 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Extract ClassName class from Class.

Turns out the short class name is only needed when generating search
data - so no need for the short_name method to be in JsDuck::Class.
parent f0bfdff6
Loading
Loading
Loading
Loading
+0 −21
Original line number Diff line number Diff line
@@ -189,29 +189,8 @@ module JsDuck
      @doc[:name]
    end

    # Returns last part of full class name
    #
    # For example for "My.package.Class" it is "Class"
    def short_name
      Class.short_name(@doc[:name])
    end

    # Static methods

    # Utility method that given full package or class name extracts
    # the "class"-part of the name.
    #
    # Because we try to emulate ext-doc, it's not as simple as just
    # taking the last part.  See class_spec.rb for details.
    def self.short_name(name)
      parts = name.split(/\./)
      short = parts.pop
      while parts.length > 1 && parts.last =~ /^[A-Z]/
        short = parts.pop + "." + short
      end
      short
    end

    # Generates member :id from member hash
    def self.member_id(m)
      # Sanitize $ in member names with something safer
+23 −0
Original line number Diff line number Diff line
module JsDuck

  # Common routines for manipulating class names.
  class ClassName

    # Given a full class name extracts the "class"-part of the name.
    #
    #     ClassName.short("My.package.Foo") --> "Foo"
    #
    # Because we try to emulate ext-doc, it's not as simple as just
    # taking the last part.  See class_spec.rb for details.
    def self.short(name)
      parts = name.split(/\./)
      short = parts.pop
      while parts.length > 1 && parts.last =~ /^[A-Z]/
        short = parts.pop + "." + short
      end
      short
    end

  end

end
+4 −3
Original line number Diff line number Diff line
require 'jsduck/icons'
require 'jsduck/class_name'

module JsDuck

@@ -25,7 +26,7 @@ module JsDuck

        # add all local members, but skip constructors
        cls[:members].each do |m|
          list << member_node(m, cls) unless m[:name] == cls.short_name
          list << member_node(m, cls) unless m[:name] == ClassName.short(cls[:name])
        end
      end

@@ -53,7 +54,7 @@ module JsDuck

    def class_node(cls)
      return {
        :name => cls.short_name,
        :name => ClassName.short(cls[:name]),
        :fullName => cls.full_name,
        :icon => Icons::class_icon(cls),
        :url => "#!/api/" + cls.full_name,
@@ -64,7 +65,7 @@ module JsDuck

    def alt_node(name, cls)
      return {
        :name => Class.short_name(name),
        :name => ClassName.short(name),
        :fullName => name,
        :type => :class,
        :icon => Icons::class_icon(cls) + "-redirect",
+25 −0
Original line number Diff line number Diff line
require "jsduck/class_name"

describe "JsDuck::ClassName#short" do

  def short(name)
    JsDuck::ClassName.short(name)
  end

  it "returns only the last part of full name in normal case" do
    short("My.package.Cls").should == "Cls"
  end

  it "returns the whole name when it has no parts" do
    short("Foo").should == "Foo"
  end

  it "returns the second part when full_name has two uppercase parts" do
    short("Foo.Bar").should == "Bar"
  end

  it "returns two last parts when full name has three uppercase parts" do
    short("My.Package.Cls").should == "Package.Cls"
  end

end
+0 −44
Original line number Diff line number Diff line
@@ -306,48 +306,4 @@ describe JsDuck::Class do
    end
  end

  describe "when full_name like My.package.Cls" do

    before do
      @cls = JsDuck::Class.new({:name => "My.package.Cls",});
    end

    it "#short_name contains only the last part" do
      @cls.short_name.should == "Cls"
    end
  end

  describe "when full_name like My.Package.Cls" do

    before do
      @cls = JsDuck::Class.new({:name => "My.Package.Cls",});
    end

    it "#short_name contains remaining parts" do
      @cls.short_name.should == "Package.Cls"
    end
  end

  describe "when full_name has no parts" do

    before do
      @cls = JsDuck::Class.new({:name => "Foo",});
    end

    it "#short_name is the same as full_name" do
      @cls.short_name.should == "Foo"
    end
  end

  describe "when full_name has two uppercase parts" do

    before do
      @cls = JsDuck::Class.new({:name => "Foo.Bar",});
    end

    it "#short_name is second part" do
      @cls.short_name.should == "Bar"
    end
  end

end