Class: Bundler::Stats::Tree

Inherits:
Object
  • Object
show all
Defined in:
lib/bundler/stats/tree.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parser, skiplist: []) ⇒ Tree

Returns a new instance of Tree.

Raises:

  • (ArgumentError)


6
7
8
9
10
11
12
# File 'lib/bundler/stats/tree.rb', line 6

def initialize(parser, skiplist: [])
  raise ArgumentError unless parser.respond_to?(:specs)

  @parser   = parser
  @tree     = specs_as_tree(@parser.specs)
  @skiplist = skiplist
end

Instance Attribute Details

#treeObject

Returns the value of attribute tree.



4
5
6
# File 'lib/bundler/stats/tree.rb', line 4

def tree
  @tree
end

Instance Method Details

#first_level_dependencies(target) ⇒ Object

Raises:

  • (ArgumentError)


34
35
36
37
# File 'lib/bundler/stats/tree.rb', line 34

def first_level_dependencies(target)
  raise ArgumentError, "Unknown gem #{target}" unless @tree.has_key? target
  @tree[target].dependencies
end

#reverse_dependencies(target) ⇒ Object

TODO: this is a very stupid way to walk this tree



56
57
58
59
60
61
# File 'lib/bundler/stats/tree.rb', line 56

def reverse_dependencies(target)
  @tree.select do |name, dep|
    all_deps = transitive_dependencies(name)
    all_deps.any? { |dep| dep.name == target }
  end
end

#reverse_dependencies_with_versions(target) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/bundler/stats/tree.rb', line 63

def reverse_dependencies_with_versions(target)
  @tree.map do |name, dep|
    transitive_dependencies(name).map do |transitive_dependency|
      if transitive_dependency.name == target
        {
          name: dep.name,
          version: transitive_dependency.requirement.to_s,
          requirement: transitive_dependency.requirement
        }
      else
        nil
      end
    end
  end.flatten.compact.sort do |a,b|
    a[:requirement].as_list <=> b[:requirement].as_list
  end
end

#summarize(target) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/bundler/stats/tree.rb', line 14

def summarize(target)
  transitive_dependencies = transitive_dependencies(target)
  { name: target,
    total_dependencies: transitive_dependencies.count,
    first_level_dependencies: first_level_dependencies(target).count,
    top_level_dependencies: reverse_dependencies(target),
    transitive_dependencies: transitive_dependencies,
  }
end

#transitive_dependencies(target) ⇒ Object

Raises:

  • (ArgumentError)


39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/bundler/stats/tree.rb', line 39

def transitive_dependencies(target)
  raise ArgumentError, "Unknown gem #{target}" unless @tree.has_key? target

  top_level = @tree[target].dependencies
  all_level = top_level + top_level.inject([]) do |arr, dep|
    # turns out bundler refuses to include itself in the dependency tree,
    # which is sneaky
    next arr if dep.name == "bundler"
    next arr if @skiplist.include? dep.name

    arr += transitive_dependencies(dep.name)
  end

  all_level.uniq { |d| d.name }
end

#version_requirements(target) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/bundler/stats/tree.rb', line 24

def version_requirements(target)
  transitive_dependencies = transitive_dependencies(target)
  { name: target,
    total_dependencies: transitive_dependencies.count,
    first_level_dependencies: first_level_dependencies(target).count,
    top_level_dependencies: reverse_dependencies_with_versions(target),
    transitive_dependencies: transitive_dependencies,
  }
end