Ruby 1.9.3 リファレンスマニュアル > ライブラリ一覧 > rubygems/dependency_listライブラリ > Gem::DependencyListクラス

class Gem::DependencyList + TSort

クラスの継承リスト: Gem::DependencyList < TSort < Object < Kernel < BasicObject

要約

Gem の依存関係を扱うためのクラスです。

特異メソッド

from_source_index(src_index) -> Gem::DependencyList

与えられた Gem::SourceIndex のインスタンスから自身を作成します。

[PARAM] src_index:
Gem::SourceIndex を指定します。

[SEE_ALSO] Gem::SourceIndex

インスタンスメソッド

add(*gemspecs)

与えられた Gem::Specification のインスタンスを自身に追加します。

[PARAM] gemspecs:
Gem::Specification のインスタンスを一つ以上指定します。
dependency_order -> [Gem::Specification]

依存する Gem の数が少ない順にソートされた Gem::Specification のリストを返します。

このことは、インストール済みの Gem を削除するときに便利です。 このメソッドで返された順にインストール済みの Gem 削除すると、 依存関係による多くの問題を回避することができます。

If there are circular dependencies (yuck!), then gems will be returned in order until only the circular dependents and anything they reference are left. Then arbitrary gemspecs will be returned until the circular dependency is broken, after which gems will be returned in dependency order again.

each_strongly_connected_component {|nodes| ...} -> nil

strongly_connected_components メソッドのイテレータ版です。 obj.each_strongly_connected_component は obj.strongly_connected_components.each に似ていますが、 ブロックの評価中に obj が変更された場合は予期しない結果になる ことがあります。

each_strongly_connected_component は nil を返します。

使用例

require 'tsort'

class Hash
  include TSort
  alias tsort_each_node each_key
  def tsort_each_child(node, &block)
    fetch(node).each(&block)
  end
end

non_sort = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}

non_sort.each_strongly_connected_component{|nodes|
  p nodes
}

#出力
#=> [4]
#=> [2, 3]
#=> [1]
each_strongly_connected_component_from(node) {|nodes| ...} -> ()

node から到達可能な強連結成分についてのイテレータです。

返す値は規定されていません。

each_strongly_connected_component_from は tsort_each_node を呼びません。

[PARAM] node:
ノードを指定します。
#例 到達可能なノードを表示する
require 'tsort'

class Hash
  include TSort
  alias tsort_each_node each_key
  def tsort_each_child(node, &block)
    fetch(node).each(&block)
  end
end

non_sort = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}

non_sort.each_strongly_connected_component{|nodes|
  p nodes
  nodes.each {|node|
    non_sort.each_strongly_connected_component_from(node){|ns|
      printf("%s -> %s\n", node, ns.join(","))
    }
  }
}

#出力
#=> [4]
#=> 4 -> 4
#=> [2, 3]
#=> 2 -> 4
#=> 2 -> 2,3
#=> 3 -> 4
#=> 3 -> 3,2
#=> [1]
#=> 1 -> 4
#=> 1 -> 2,3
#=> 1 -> 1
find_name(full_name) -> Gem::Specification | nil

自身に含まれる与えられた名前を持つ Gem::Specification のインスタンスを返します。

見つからなかった場合は nil を返します。

[PARAM] full_name:
バージョンを含むフルネームで Gem の名前を指定します。

[SEE_ALSO] Gem::Specification#full_name

ok? -> bool

自身に含まれる全ての Gem::Specification が依存関係を満たしていれば真を返します。 そうでない場合は、偽を返します。

ok_to_remove?(full_name) -> bool

与えられた名前を持つ Gem::Specification を自身から削除しても OK な場合は真を返します。 そうでない場合は、偽を返します。

与えられた名前を持つ Gem::Specification を自身から削除すると、 依存関係を壊してしまう場合が、それを削除してはいけない場合です。

[PARAM] full_name:
バージョンを含むフルネームで Gem の名前を指定します。

[SEE_ALSO] Gem::Specification#full_name

remove_by_name(full_name) -> Gem::Specification

与えられた名前を持つ Gem::Specification を自身から削除します。

このメソッドでは削除後の依存関係をチェックしません。

[PARAM] full_name:
バージョンを含むフルネームで Gem の名前を指定します。

[SEE_ALSO] Gem::Specification#full_name, Array#delete_if

spec_predecessors -> Hash

[TODO] ???

Return a hash of predecessors. <tt>result[spec]</tt> is an Array of gemspecs that have a dependency satisfied by the named spec.

strongly_connected_components -> Array

強連結成分の集まりを配列の配列として返します。 この配列は子から親に向かってソートされています。 各要素は強連結成分を表す配列です。

require 'tsort'

class Hash
  include TSort
  alias tsort_each_node each_key
  def tsort_each_child(node, &block)
    fetch(node).each(&block)
  end
end

non_sort = {1=>[2], 2=>[3, 4], 3=>[2], 4=>[]}

p non_sort.strongly_connected_components
#=> [[4], [2, 3], [1]]
tsort -> Array

頂点をトポロジカルソートして得られる配列を返します。 この配列は子から親に向かってソートされています。 すなわち、最初の要素は子を持たず、最後の要素は親を持ちません。

閉路が存在するとき、例外TSort::Cyclicを起こします。

[EXCEPTION] TSort::Cyclic:
閉路が存在するとき、発生します.

使用例

require 'tsort'

class Hash
  include TSort
  alias tsort_each_node each_key
  def tsort_each_child(node, &block)
    fetch(node).each(&block)
  end
end

sorted = {1=>[2, 3], 2=>[3], 3=>[], 4=>[]}.tsort
p sorted #=> [3, 2, 1, 4]
tsort_each {|node| ...} -> nil

tsort メソッドのイテレータ版です。 obj.tsort_each は obj.tsort.each と似ていますが、 ブロックの評価中に obj が変更された場合は予期しない結果になる ことがあります。

tsort_each は nil を返します。 閉路が存在するとき、例外 TSort::Cyclic を起こします。

[EXCEPTION] TSort::Cyclic:
閉路が存在するとき、発生します.

使用例

require 'tsort'

class Hash
  include TSort
  alias tsort_each_node each_key
  def tsort_each_child(node, &block)
    fetch(node).each(&block)
  end
end

non_sort = {1=>[2, 3], 2=>[3], 3=>[], 4=>[]}

non_sort.tsort_each {|node|
  non_sort.tsort_each_child(node){|child|
    printf("%d -> %d\n", node, child)
  }
}

# 出力
#=> 2 -> 3
#=> 1 -> 2
#=> 1 -> 3
tsort_each_child(node) {|child| ...} -> ()

TSort で拡張されるクラスで定義されていなければならないメソッドです。

tsort_each_child is used to iterate for child nodes of node.

[PARAM] node:
ノードを指定します。
[EXCEPTION] NotImplementedError:
TSort で拡張されるクラスで定義されていない場合発生します。
tsort_each_node {|node| ...} -> ()

TSort で拡張されるクラスで定義されていなければならないメソッドです。

tsort_each_node is used to iterate for all nodes over a graph.

[EXCEPTION] NotImplementedError:
TSort で拡張されるクラスで定義されていない場合発生します。
class Gem::DependencyList