Class: ClaudeUsage::FileReader

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

Defined Under Namespace

Classes: InvalidProjectNameError

Constant Summary collapse

CLAUDE_PATHS =
[
  File.expand_path('~/.config/claude/projects'),
  File.expand_path('~/.claude/projects')
].freeze

Instance Method Summary collapse

Constructor Details

#initialize(project_name: nil) ⇒ FileReader

Returns a new instance of FileReader.



14
15
16
17
18
# File 'lib/claude_usage/file_reader.rb', line 14

def initialize(project_name: nil)
  # Use provided name or auto-detect from Rails.root
  @project_name = project_name || ClaudeUsage.configuration.resolved_project_name
  validate_project_name!
end

Instance Method Details

#read_usage_dataObject



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/claude_usage/file_reader.rb', line 20

def read_usage_data
  entries = []
  processed_hashes = Set.new

  jsonl_files.each do |file|
    File.foreach(file) do |line|
      next if line.strip.empty?

      begin
        data = JSON.parse(line)

        # Deduplication
        message_id = data.dig('message', 'id')
        request_id = data['requestId']

        if message_id && request_id
          unique_hash = "#{message_id}:#{request_id}"
          next if processed_hashes.include?(unique_hash)

          processed_hashes.add(unique_hash)
        end

        entries << parse_entry(data)
      rescue JSON::ParserError => e
        logger&.debug "Skipping invalid JSON line: #{e.message}"
      end
    end
  end

  entries
end