Class: Uniword::Batch::BatchResult

Inherits:
Object
  • Object
show all
Defined in:
lib/uniword/batch/batch_result.rb

Overview

Aggregates and reports results from batch document processing.

Responsibility: Track processing results, statistics, and failures. Single Responsibility - only manages result aggregation and reporting.

Examples:

Tracking batch results

result = BatchResult.new
result.add_success(file: 'doc1.docx', duration: 1.5)
result.add_failure(file: 'doc2.docx', error: 'Invalid format')
puts result.summary

Export results

result.export_json('results.json')
result.export_csv('results.csv')

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeBatchResult

Initialize batch result tracker



27
28
29
30
31
32
# File 'lib/uniword/batch/batch_result.rb', line 27

def initialize
  @successes = []
  @failures = []
  @start_time = Time.now
  @end_time = nil
end

Instance Attribute Details

#end_timeObject (readonly)

Returns the value of attribute end_time.



24
25
26
# File 'lib/uniword/batch/batch_result.rb', line 24

def end_time
  @end_time
end

#failuresObject (readonly)

Returns the value of attribute failures.



24
25
26
# File 'lib/uniword/batch/batch_result.rb', line 24

def failures
  @failures
end

#start_timeObject (readonly)

Returns the value of attribute start_time.



24
25
26
# File 'lib/uniword/batch/batch_result.rb', line 24

def start_time
  @start_time
end

#successesObject (readonly)

Returns the value of attribute successes.



24
25
26
# File 'lib/uniword/batch/batch_result.rb', line 24

def successes
  @successes
end

Instance Method Details

#add_failure(file:, error:, stage: nil, metadata: {}) ⇒ self

Add a failed processing result

Parameters:

  • file (String)

    File path that failed

  • error (String, Exception)

    Error message or exception

  • stage (String, nil) (defaults to: nil)

    Stage where failure occurred

  • metadata (Hash) (defaults to: {})

    Additional metadata

Returns:

  • (self)


67
68
69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/uniword/batch/batch_result.rb', line 67

def add_failure(file:, error:, stage: nil, metadata: {})
  error_message = error.is_a?(Exception) ? error.message : error.to_s
  error_class = error.is_a?(Exception) ? error.class.name : "Error"

  @failures << {
    file: file,
    error: error_message,
    error_class: error_class,
    stage: stage,
    metadata: ,
    timestamp: Time.now,
  }
  self
end

#add_success(file:, duration: 0.0, stages: [], metadata: {}) ⇒ self

Add a successful processing result

Parameters:

  • file (String)

    File path that was processed

  • duration (Float) (defaults to: 0.0)

    Processing duration in seconds

  • stages (Array<String>) (defaults to: [])

    List of stages executed

  • metadata (Hash) (defaults to: {})

    Additional metadata

Returns:

  • (self)


49
50
51
52
53
54
55
56
57
58
# File 'lib/uniword/batch/batch_result.rb', line 49

def add_success(file:, duration: 0.0, stages: [], metadata: {})
  @successes << {
    file: file,
    duration: duration,
    stages: stages,
    metadata: ,
    timestamp: Time.now,
  }
  self
end

#average_durationFloat

Get average processing time per successful document

Returns:

  • (Float)

    Average time in seconds



123
124
125
126
127
128
# File 'lib/uniword/batch/batch_result.rb', line 123

def average_duration
  return 0.0 if successes.empty?

  total = successes.sum { |s| s[:duration] }
  (total / successes.size).round(2)
end

#complete!self

Mark processing as completed

Returns:

  • (self)


37
38
39
40
# File 'lib/uniword/batch/batch_result.rb', line 37

def complete!
  @end_time = Time.now
  self
end

#elapsed_timeFloat

Get elapsed processing time in seconds

Returns:

  • (Float)

    Elapsed time



115
116
117
118
# File 'lib/uniword/batch/batch_result.rb', line 115

def elapsed_time
  end_time = @end_time || Time.now
  (end_time - @start_time).round(2)
end

#export_csv(path) ⇒ self

Export results to CSV file

Parameters:

  • path (String)

    Output file path

Returns:

  • (self)


201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
# File 'lib/uniword/batch/batch_result.rb', line 201

def export_csv(path)
  CSV.open(path, "wb") do |csv|
    # Header row
    csv << %w[File Status Duration Error Stage]

    # Success rows
    successes.each do |success|
      csv << [
        success[:file],
        "SUCCESS",
        success[:duration],
        "",
        success[:stages].join(", "),
      ]
    end

    # Failure rows
    failures.each do |failure|
      csv << [
        failure[:file],
        "FAILURE",
        "",
        failure[:error],
        failure[:stage] || "",
      ]
    end
  end
  self
end

#export_json(path) ⇒ self

Export results to JSON file

Parameters:

  • path (String)

    Output file path

Returns:

  • (self)


171
172
173
174
175
176
177
178
179
180
# File 'lib/uniword/batch/batch_result.rb', line 171

def export_json(path)
  data = {
    summary: summary,
    successes: successes,
    failures: failures,
  }

  File.write(path, JSON.pretty_generate(data))
  self
end

#export_yaml(path) ⇒ self

Export results to YAML file

Parameters:

  • path (String)

    Output file path

Returns:

  • (self)


186
187
188
189
190
191
192
193
194
195
# File 'lib/uniword/batch/batch_result.rb', line 186

def export_yaml(path)
  data = {
    "summary" => summary,
    "successes" => successes.map { |s| stringify_keys(s) },
    "failures" => failures.map { |f| stringify_keys(f) },
  }

  File.write(path, YAML.dump(data))
  self
end

#failure_countInteger

Get number of failed files

Returns:

  • (Integer)

    Failure count



99
100
101
# File 'lib/uniword/batch/batch_result.rb', line 99

def failure_count
  failures.size
end

#success?Boolean

Check if batch processing was successful (no failures)

Returns:

  • (Boolean)

    true if all files processed successfully



133
134
135
# File 'lib/uniword/batch/batch_result.rb', line 133

def success?
  failures.empty?
end

#success_countInteger

Get number of successful files

Returns:

  • (Integer)

    Success count



92
93
94
# File 'lib/uniword/batch/batch_result.rb', line 92

def success_count
  successes.size
end

#success_rateFloat

Get success rate as percentage

Returns:

  • (Float)

    Success rate (0.0 to 100.0)



106
107
108
109
110
# File 'lib/uniword/batch/batch_result.rb', line 106

def success_rate
  return 0.0 if total_count.zero?

  (success_count.to_f / total_count * 100).round(2)
end

#summaryHash

Get summary statistics

Returns:

  • (Hash)

    Summary statistics



140
141
142
143
144
145
146
147
148
149
# File 'lib/uniword/batch/batch_result.rb', line 140

def summary
  {
    total: total_count,
    successes: success_count,
    failures: failure_count,
    success_rate: success_rate,
    elapsed_time: elapsed_time,
    average_duration: average_duration,
  }
end

#summary_textString

Get formatted summary text

Returns:

  • (String)

    Summary text



154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/uniword/batch/batch_result.rb', line 154

def summary_text
  lines = []
  lines << "Batch Processing Results"
  lines << ("=" * 40)
  lines << "Total files:      #{total_count}"
  lines << "Successful:       #{success_count}"
  lines << "Failed:           #{failure_count}"
  lines << "Success rate:     #{success_rate}%"
  lines << "Elapsed time:     #{elapsed_time}s"
  lines << "Average duration: #{average_duration}s" if success_count.positive?
  lines.join("\n")
end

#total_countInteger

Get total number of files processed

Returns:

  • (Integer)

    Total count



85
86
87
# File 'lib/uniword/batch/batch_result.rb', line 85

def total_count
  successes.size + failures.size
end