@@ -131,13 +131,11 @@ def migrate_db(db)
131131end
132132
133133# Rename a team in the database
134- def rename_team ( db_file , config )
135- db = SQLite3 ::Database . new ( db_file )
134+ def rename_team ( db , config )
136135 teams = db . execute ( 'SELECT name FROM teams ORDER BY name' ) . flatten
137136
138137 if teams . empty?
139138 log . info ( 'No teams found in database.' )
140- db . close
141139 return
142140 end
143141
@@ -157,7 +155,6 @@ def rename_team(db_file, config)
157155
158156 unless matched_team
159157 log . error ( "Team '#{ old_name } ' not found in database." )
160- db . close
161158 return
162159 end
163160
@@ -166,13 +163,11 @@ def rename_team(db_file, config)
166163
167164 if new_name . empty?
168165 log . error ( 'New team name cannot be empty.' )
169- db . close
170166 return
171167 end
172168
173169 if teams . any? { |t | t . downcase == new_name . downcase }
174170 log . error ( "Team '#{ new_name } ' already exists." )
175- db . close
176171 return
177172 end
178173
@@ -185,8 +180,6 @@ def rename_team(db_file, config)
185180 )
186181 log . info ( "Renamed team '#{ matched_team } ' to '#{ new_name } '" )
187182 end
188-
189- db . close
190183end
191184
192185# Get last Thursday from a given date (or today)
@@ -249,9 +242,7 @@ def prompt_team_or_q(teams)
249242 return false if response . nil?
250243
251244 response = response . strip
252- return false if %w{ f finish } . include? ( response . downcase )
253-
254- exit ( 0 ) if response . downcase == 'abort'
245+ return false if %w{ f finish abort } . include? ( response . downcase )
255246
256247 # Check if it's an exact match for a known team (case-insensitive)
257248 matched_team = teams . find { |t | t . downcase == response . downcase }
@@ -373,7 +364,7 @@ def get_or_create_team_id(db, team_name)
373364end
374365
375366# Insert meeting data into the database
376- def record_meeting_data ( meeting_date , team_data , config )
367+ def record_meeting_data ( db , meeting_date , team_data , config )
377368 if config . dryrun
378369 log . info ( 'DRYRUN: Would record the following rows:' )
379370 team_data . each do |row |
@@ -382,7 +373,6 @@ def record_meeting_data(meeting_date, team_data, config)
382373 return
383374 end
384375
385- db = SQLite3 ::Database . new ( config . db_file )
386376 team_data . each do |row |
387377 team_name = row . first
388378 team_id = get_or_create_team_id ( db , team_name )
@@ -401,7 +391,6 @@ def record_meeting_data(meeting_date, team_data, config)
401391 [ meeting_date . to_s , team_id ] + row [ 1 ..-1 ] ,
402392 )
403393 end
404- db . close
405394 log . info ( "Data recorded for #{ meeting_date } ." )
406395end
407396
@@ -430,8 +419,7 @@ def format_build_status(status)
430419end
431420
432421# Generate Markdown table
433- def generate_md_page ( db_file )
434- db = SQLite3 ::Database . new ( db_file )
422+ def generate_md_page ( db )
435423 meeting_dates = db . execute (
436424 'SELECT DISTINCT meeting_date FROM meeting_stats ' +
437425 'ORDER BY meeting_date DESC' ,
@@ -467,19 +455,16 @@ def generate_md_page(db_file)
467455 end
468456 md << ''
469457 end
470- db . close
471458 md . join ( "\n " )
472459end
473460
474- def summary ( db_file )
475- db = SQLite3 ::Database . new ( db_file )
461+ def summary ( db )
476462 data = db . execute (
477463 'SELECT ms.meeting_date, t.name, ms.present, ms.build_status' +
478464 ' FROM meeting_stats ms' +
479465 ' JOIN teams t ON ms.team_id = t.id' +
480466 ' ORDER BY ms.meeting_date ASC' ,
481467 )
482- db . close
483468
484469 # TODO: de-dupe this with generate_plots
485470 dates = data . map ( &:first ) . uniq . reverse
@@ -501,15 +486,13 @@ def summary(db_file)
501486 end
502487end
503488
504- def generate_plots ( db_file , img_dir )
505- db = SQLite3 ::Database . new ( db_file )
489+ def generate_plots ( db , img_dir )
506490 data = db . execute (
507491 'SELECT ms.meeting_date, t.name, ms.present, ms.build_status' +
508492 ' FROM meeting_stats ms' +
509493 ' JOIN teams t ON ms.team_id = t.id' +
510494 ' ORDER BY ms.meeting_date ASC' ,
511495 )
512- db . close
513496
514497 dates = data . map ( &:first ) . uniq
515498 attendance_percentages = [ ]
@@ -648,40 +631,48 @@ log.debug("Full config: #{config.to_hash}")
648631
649632db = initialize_db ( config . db_file )
650633
651- # Check and migrate database if needed
652- migrate_db ( db ) if needs_migration? ( db )
653-
654- db . close
655-
656- meeting_date = config . date || get_last_thursday
657-
658- case config . mode
659- when 'record'
660- team_data = collect_team_data ( meeting_date )
661- record_meeting_data ( meeting_date , team_data , config )
662- when 'generate'
663- if config . dryrun
664- log . info ( 'DRYRUN: Would update plots' )
665- log . info ( "DRYRUN: Would update #{ config . output } with:" )
666- log . info ( generate_md_page ( config . db_file ) )
667- else
668- log . info ( 'Updating plots...' )
669- generate_plots ( config . db_file , config . image_dir )
670- log . info ( "Generating #{ config . output } " )
671- File . write ( config . output , generate_md_page ( config . db_file ) )
672- end
673- when 'generate_plot'
674- if config . dryrun
675- log . info ( 'DRYRUN: Would update plots' )
634+ begin
635+ # Check and migrate database if needed
636+ migrate_db ( db ) if needs_migration? ( db )
637+
638+ meeting_date = config . date || get_last_thursday
639+
640+ case config . mode
641+ when 'record'
642+ team_data = collect_team_data ( meeting_date )
643+ record_meeting_data ( db , meeting_date , team_data , config )
644+ when 'generate'
645+ if config . dryrun
646+ log . info ( 'DRYRUN: Would update plots' )
647+ log . info ( "DRYRUN: Would update #{ config . output } with:" )
648+ log . info ( generate_md_page ( db ) )
649+ else
650+ log . info ( 'Updating plots...' )
651+ generate_plots ( db , config . image_dir )
652+ log . info ( "Generating #{ config . output } " )
653+ File . write ( config . output , generate_md_page ( db ) )
654+ end
655+ when 'generate_plot'
656+ if config . dryrun
657+ log . info ( 'DRYRUN: Would update plots' )
658+ else
659+ generate_plots ( db , config . image_dir )
660+ log . info ( 'Plots generated: attendance.png and build_status.png' )
661+ end
662+ when 'summary'
663+ summary ( db )
664+ when 'rename_team'
665+ rename_team ( db , config )
676666 else
677- generate_plots ( config . db_file , config . image_dir )
678- log . info ( 'Plots generated: attendance.png and build_status.png ')
667+ log . info ( 'Invalid mode. Use --mode record, generate, generate_plot, ' +
668+ 'summary, or rename_team. ')
679669 end
680- when 'summary'
681- summary ( config . db_file )
682- when 'rename_team'
683- rename_team ( config . db_file , config )
684- else
685- log . info ( 'Invalid mode. Use --mode record, generate, generate_plot, ' +
686- 'summary, or rename_team.' )
670+ rescue Interrupt
671+ log . info ( "\n Interrupted by user, cleaning up..." )
672+ rescue StandardError => e
673+ log . error ( "Error: #{ e . message } " )
674+ log . debug ( e . backtrace . join ( "\n " ) )
675+ raise
676+ ensure
677+ db . close if db
687678end
0 commit comments