Completed
Push — master ( d39807...d178cf )
by Marcelo
01:07
created

Entries   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 14
c 3
b 0
f 0
dl 0
loc 73
rs 10

14 Methods

Rating   Name   Duplication   Size   Complexity  
A ==() 0 3 1
A find_by_name() 0 3 1
A sort_by() 0 4 1
A append_group() 0 3 1
A initialize() 0 4 1
A create_group() 0 3 1
A elapsed_time() 0 5 1
A limit() 0 3 1
A append_to_group() 0 3 1
A create() 0 3 1
A append() 0 4 1
A to_a() 0 3 1
A reverse() 0 3 1
A slowest() 0 3 1
1
require 'forwardable'
2
3
module Koine
4
  class Profiler
5
    class Entries
6
      extend Forwardable
7
8
      def_delegators :storage, :size
9
      def_delegators :to_a, :each
10
11
      def initialize(groups = [])
12
        @storage = Hash.new
13
        groups.each { |group| append_group(group) }
14
      end
15
16
      def append(name, time)
17
        group = find_by_name(name) || create_group(name)
18
        append_to_group(group, name, time)
19
      end
20
21
      def find_by_name(name)
22
        storage[name.to_s]
23
      end
24
25
      def elapsed_time
26
        storage.inject(0) do |total, (_key, group)|
27
          total + group.elapsed_time
28
        end
29
      end
30
31
      def sort_by(&_block)
32
        sorted = storage.sort_by { |item| yield(item[1]) }.map {|_key, group| group }
33
        create(sorted)
34
      end
35
36
      def reverse
37
        create(storage.to_a.reverse.map { |_key, group| group })
38
      end
39
40
      def slowest
41
        sort_by(&:elapsed_time).reverse
42
      end
43
44
      def to_a
45
        storage.values
46
      end
47
48
      def limit(number)
49
        create(to_a.slice(0, number.to_i))
50
      end
51
52
      def ==(other)
53
        storage.to_a == other.storage.to_a
54
      end
55
56
      private
57
58
      def create(groups = [])
59
        self.class.new(groups)
60
      end
61
62
      def create_group(name)
63
        append_group(EntryGroup.new(name))
64
      end
65
66
      def append_group(group)
67
        storage[group.name] = group
68
      end
69
70
      def append_to_group(group, name, time)
71
        group.append(Entry.new(name, time))
72
      end
73
74
      protected
75
76
      attr_reader :storage
77
    end
78
  end
79
end
80