Class: ClaudeUsage::UsageAggregator

Inherits:
Object
  • Object
show all
Defined in:
lib/claude_usage/usage_aggregator.rb

Instance Method Summary collapse

Constructor Details

#initialize(project_name: nil) ⇒ UsageAggregator



5
6
7
8
9
# File 'lib/claude_usage/usage_aggregator.rb', line 5

def initialize(project_name: nil)
  @project_name = project_name || ClaudeUsage.configuration.resolved_project_name
  @file_reader = FileReader.new(project_name: @project_name)
  @cost_calculator = CostCalculator.new
end

Instance Method Details

#daily_usageObject



11
12
13
14
15
16
17
18
# File 'lib/claude_usage/usage_aggregator.rb', line 11

def daily_usage
  entries = @file_reader.read_usage_data
  grouped = entries.group_by { |e| e[:timestamp].to_date }

  grouped.map do |date, day_entries|
    aggregate_entries(date, day_entries)
  end.sort_by { |d| d[:date] }.reverse
end

#total_usageObject



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/claude_usage/usage_aggregator.rb', line 20

def total_usage
  daily = daily_usage

  {
    total_input_tokens: daily.sum { |d| d[:input_tokens] },
    total_output_tokens: daily.sum { |d| d[:output_tokens] },
    total_cache_creation_tokens: daily.sum { |d| d[:cache_creation_tokens] },
    total_cache_read_tokens: daily.sum { |d| d[:cache_read_tokens] },
    total_tokens: daily.sum { |d| d[:total_tokens] },
    total_cost: daily.sum { |d| d[:cost] },
    models_used: daily.flat_map { |d| d[:models_used] }.uniq,
    first_usage: daily.last&.dig(:date),
    last_usage: daily.first&.dig(:date),
    days_active: daily.size
  }
end