Class: Serialbench::SiteGenerator

Inherits:
Object
  • Object
show all
Defined in:
lib/serialbench/site_generator.rb

Overview

Unified site generator for creating static HTML sites from benchmark results

Constant Summary collapse

TEMPLATE_DIR =
File.join(__dir__, 'templates')

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(output_path:, result: nil, resultset: nil) ⇒ SiteGenerator

Returns a new instance of SiteGenerator.



16
17
18
19
20
21
# File 'lib/serialbench/site_generator.rb', line 16

def initialize(output_path:, result: nil, resultset: nil)
  @output_path = File.expand_path(output_path)
  @result = result if result
  @resultset = resultset if resultset
  setup_liquid_environment
end

Instance Attribute Details

#output_pathObject (readonly)

Returns the value of attribute output_path.



14
15
16
# File 'lib/serialbench/site_generator.rb', line 14

def output_path
  @output_path
end

#resultObject (readonly)

Returns the value of attribute result.



14
15
16
# File 'lib/serialbench/site_generator.rb', line 14

def result
  @result
end

#resultsetObject (readonly)

Returns the value of attribute resultset.



14
15
16
# File 'lib/serialbench/site_generator.rb', line 14

def resultset
  @resultset
end

Class Method Details

.export_raw_data(resultset, data_dir) ⇒ Object



37
38
39
# File 'lib/serialbench/site_generator.rb', line 37

def self.export_raw_data(resultset, data_dir)
  new(output_path: '/dev/null', resultset: resultset).export_raw_data_to(data_dir)
end

.generate_for_result(result, output_path) ⇒ Object



23
24
25
26
# File 'lib/serialbench/site_generator.rb', line 23

def self.generate_for_result(result, output_path)
  generator = new(output_path: output_path, result: result)
  generator.generate_site
end

.generate_for_resultset(resultset, output_path) ⇒ Object



28
29
30
31
# File 'lib/serialbench/site_generator.rb', line 28

def self.generate_for_resultset(resultset, output_path)
  generator = new(output_path: output_path, resultset: resultset)
  generator.generate_site
end

.resultset_payload(resultset) ⇒ Object



33
34
35
# File 'lib/serialbench/site_generator.rb', line 33

def self.resultset_payload(resultset)
  new(output_path: '/dev/null', resultset: resultset).resultset_payload
end

Instance Method Details

#export_raw_data_to(data_dir) ⇒ Object



70
71
72
73
# File 'lib/serialbench/site_generator.rb', line 70

def export_raw_data_to(data_dir)
  FileUtils.mkdir_p(data_dir)
  export_resultset(@resultset, data_dir)
end

#generate_siteObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/serialbench/site_generator.rb', line 75

def generate_site
  target_name = @result ? @result.environment_config.name : @resultset.name

  puts "🏗️  Generating HTML site for #{@result ? 'run' : 'resultset'}: #{target_name}"
  puts "Output: #{@output_path}"

  # Transform data for dashboard.js compatibility
  data = if @result
           transform_result_for_dashboard(@result)
         else
           transform_resultset_for_dashboard(@resultset)
         end

  prepare_output_directory
  render_site(
    {
      'data' => JSON.generate(data),
      'kind' => @result ? 'run' : 'resultset'
    },
    'format_based.liquid'
  )

  # Export raw data files for download
  export_raw_data

  puts "✅ Site generated successfully at: #{@output_path}"
  @output_path
end

#libraries_information(resultset) ⇒ Object

Static capability matrix (adapter declarations) plus the versions actually measured in this resultset.



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/serialbench/site_generator.rb', line 48

def libraries_information(resultset)
  versions = {}
  resultset.results.each do |result|
    serializers = result.benchmark_result.serializers || []
    serializers.each { |si| versions[si.name] ||= si.version }
  end

  Serialbench::Serializers.all.filter_map do |adapter|
    next if adapter.name == 'syck'

    features = adapter.features
    next if features.is_a?(Array)

    {
      'name' => adapter.name,
      'format' => adapter.format.to_s,
      'version' => versions[adapter.name] || 'unknown',
      'features' => features.transform_values { |v| v == true }
    }
  end
end

#resultset_payloadObject



41
42
43
44
# File 'lib/serialbench/site_generator.rb', line 41

def resultset_payload
  transform_resultset_for_dashboard(@resultset)
    .merge('libraries' => libraries_information(@resultset))
end