Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ _site
.sass-cache
.DS_Store

# IntelliJ IDE
/.idea/

# Script output
tmp/pending_updates.yml
59 changes: 14 additions & 45 deletions _data/current.yml
Original file line number Diff line number Diff line change
@@ -1,35 +1,3 @@
- name: "TestFlix 2025 - World’s Leading Virtual Software Testing Conference"
location: Online
dates: "October 10-11, 2025"
url: https://www.thetesttribe.com/testflix/?utm_source=testingconferences
status: Registration is Open and Free

- name: Pacific Northwest Software Quality Conference (PNSQC) 2025
location: Portland, Oregon, USA and Online
dates: "October 13-15, 2025"
url: https://www.pnsqc.org/?utm_source=testingconferences
twitter: PNSQC
status: <a href="https://mms.pnsqc.org/members/evr/reg_event.php?orgcode=PNSQ&evid=52209629" target="_blank">Registration is Open</a>

- name: HUSTEF Software Testing Conference 2025
location: Budapest, Hungary
dates: "October 14-16, 2025"
url: https://hustef.hu/?utm_source=testingconferences
twitter: HunTestingBoard
status: Registration is Open

- name: "Quality Beacon - Lighting the Path for Next-Gen Testing"
location: Copenhagen, Denmark
dates: "October 20-21, 2025"
url: https://www.dstb.dk/konferencer/2025/?utm_source=testingconferences
status: Registration is Open until October 6, 2025

- name: CypressConf 2025
location: Online
dates: "October 21-22, 2025"
url: https://cypress.registration.goldcast.io/events/5e06455f-45f2-49c3-98dd-e0ae952e79a0?__hstc=204449871.f2117c4cea0098a12902ced8536e8ec7.1751241536846.1751241536846.1751241536846.1&__hssc=204449871.1.1751241536846&__hsfp=287177776?utm_source=testingconferences
status: Registration is Open and Free

- name: "TestCon Europe 2025"
location: Vilnius, Lithuania
dates: "October 21-24, 2025"
Expand Down Expand Up @@ -61,7 +29,7 @@
dates: "October 27-30, 2025"
url: https://starcanada.techwell.com/?utm_source=testingconferences
twitter: TechWell
status: <a href="https://starcanada.techwell.com?utm_source=testingconferences" target="_blank">Early Bird Registration</a> is Open until September 26, 2025
status: <a href="https://starcanada.techwell.com?utm_source=testingconferences" target="_blank">Registration is Open</a>

- name: WOPR Latam 04
location: Montevideo, UY
Expand All @@ -73,12 +41,13 @@
dates: "November 10-11, 2025"
url: https://automation.eurostarsoftwaretesting.com/?utm_source=testingconferences
twitter: esconfs
status: <a href="https://automation.eurostarsoftwaretesting.com/?utm_source=testingconferences" target="_blank">Early Bird Registration is Open</a> until September 30, 2025
status: <a href="https://automation.eurostarsoftwaretesting.com/?utm_source=testingconferences" target="_blank">Registration is Open</a>

- name: Quality Sense Conf 2025
location: Montevideo, Uruguay
dates: "November 11, 2025"
url: https://qualitysenseconf.com/?utm_source=testingconferences
status: Registration is Open and Free

- name: Software-QS-Tag 2025
location: Möhrendorf, Germany
Expand All @@ -98,7 +67,7 @@
dates: "November 14, 2025"
url: https://www.tokyotestfest.com/?utm_source=testingconferences
twitter: tokyotestfest
status: <a href="https://fienta.com/tokyotestfest2025/?utm_source=testingconferences" target="_blank">Early Bird Registration is Open</a>
status: <a href="https://fienta.com/tokyotestfest2025/?utm_source=testingconferences" target="_blank">Registration is Open</a>

- name: Testing Assembly
location: Helsinki, Finland
Expand All @@ -122,27 +91,27 @@
- name: "Workshop: Find more bugs with Test Gap Analysis"
location: Online
dates: "December 3, 2025"
url: https://tmscl.me/4ntgbEk
status: <a href="https://tmscl.me/4ntgbEk" target="_blank">Registration is open</a>
url: https://teamscale.com/events/tga-2025-12?utm_source=testingconferences
status: <a href="https://teamscale.com/events/tga-2025-12?utm_source=testingconferences" target="_blank">Registration is Open</a>

- name: Robocon 2026 In Person
location: Helsinki, Finland
dates: "February 12-13, 2026"
dates: "February 10-13, 2026"
url: https://www.robocon.io/?utm_source=testingconferences
status: <a href="https://pretalx.com/robocon-2026/cfp?utm_source=testingconferences" target="_blank">CFP is Open</a> until October 19, 2025
status: <a href="https://www.robocon.io/tickets?utm_source=testingconferences" target="_blank">Blind Robot Registration is Open</a>

- name: Robocon 2026 Online
location: Online
dates: "March 4-5 March, 2026"
dates: "March 3-6, 2026"
url: https://www.robocon.io/?utm_source=testingconferences
status: <a href="https://pretalx.com/robocon-2026/cfp?utm_source=testingconferences" target="_blank">CFP is Open</a> until October 19, 2025
status: <a href="https://www.robocon.io/tickets?utm_source=testingconferences" target="_blank">Blind Robot Registration is Open</a>

- name: Testing Peers Conference 2026
location: Nottingham, UK
dates: "March 12, 2026"
url: https://testingpeerscon.com/?utm_source=testingconferences
twitter: testingpeers
status: <a href="https://testingpeerscon.com/written-submission/?utm_source=testingconferences" target="_blank">CFP is Open</a> until September 30, 2025 | <a href="https://testingpeerscon.com/ticket/?utm_source=testingconferences" target="_blank">Early Bird Registration is Open</a>
status: <a href="https://testingpeerscon.com/ticket/?utm_source=testingconferences" target="_blank">Early Bird Registration is Open</a>

- name: ParisTestConf 2026
location: Paris, FR
Expand Down Expand Up @@ -174,7 +143,7 @@
dates: "May 6-8, 2026"
url: https://seleniumconf.com/?utm_source=testingconferences
twitter: seleniumconf
status: <a href="https://seleniumconf.com/submit-a-talk/?utm_source=testingconferences" target="_blank">CFP is Open</a> until October 19, 2025
status: <a href="https://seleniumconf.com/register/?utm_source=testingconferences" target="_blank">Blind Early Bird</a> Registration is Open

- name: WeTest.Athens 2026
location: Athens, Greece
Expand All @@ -187,11 +156,11 @@
dates: "May 26-28, 2026"
url: https://expoqa.eu/?utm_source=testingconferences
twitter: expoqa
status: <a href="https://expoqa.eu/call-for-speaker/?utm_source=testingconferences" target="_blank">CFP is Open</a> until October 12, 2025
status: <a href="https://expoqa.eu/ticket-shop/?utm_source=testingconferences" target="_blank">Early Bird Registration is Open</a>

- name: EuroSTAR 2026 Software Testing Conference
location: Oslo, Norway
dates: "June 15-18, 2026"
url: https://conference.eurostarsoftwaretesting.com/?utm_source=testingconferences
twitter: esconfs
status: <a href="https://conference.eurostarsoftwaretesting.com/call-for-submissions/?utm_source=testingconferences" target="_blank">CFP is Open</a> until October 3, 2025
status: <a href="https://conference.eurostarsoftwaretesting.com/tickets/?utm_source=testingconferences" target="_blank">Super Early Bird</a> Pricing is Open
27 changes: 27 additions & 0 deletions _data/past.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,30 @@
- name: CypressConf 2025
location: Online
dates: "October 21-22, 2025"
url: https://cypress.registration.goldcast.io/events/5e06455f-45f2-49c3-98dd-e0ae952e79a0?__hstc=204449871.f2117c4cea0098a12902ced8536e8ec7.1751241536846.1751241536846.1751241536846.1&__hssc=204449871.1.1751241536846&__hsfp=287177776?utm_source=testingconferences

- name: "Quality Beacon - Lighting the Path for Next-Gen Testing"
location: Copenhagen, Denmark
dates: "October 20-21, 2025"
url: https://www.dstb.dk/konferencer/2025/?utm_source=testingconferences

- name: HUSTEF Software Testing Conference 2025
location: Budapest, Hungary
dates: "October 14-16, 2025"
url: https://hustef.hu/?utm_source=testingconferences
twitter: HunTestingBoard

- name: Pacific Northwest Software Quality Conference (PNSQC) 2025
location: Portland, Oregon, USA and Online
dates: "October 13-15, 2025"
url: https://www.pnsqc.org/?utm_source=testingconferences
twitter: PNSQC

- name: "TestFlix 2025 - World’s Leading Virtual Software Testing Conference"
location: Online
dates: "October 10-11, 2025"
url: https://www.thetesttribe.com/testflix/?utm_source=testingconferences

- name: TestSociety
location: Lisboa, Portugal
dates: "October 10, 2025"
Expand Down
157 changes: 157 additions & 0 deletions tools/identify_updates.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
#!/usr/bin/env ruby
require 'yaml'
require 'date'
require 'fileutils'

DATA_DIR = File.expand_path('../_data', __dir__)
CURRENT_FILE = File.join(DATA_DIR, 'current.yml')

OUTPUT_FILE = File.expand_path('../tmp/pending_updates.yml', __dir__)

if ARGV.empty?
warn 'Usage: identify_updates.rb YYYY-MM-DD'
exit 1
end

begin
today = Date.parse(ARGV[0])
rescue ArgumentError
warn "Invalid date: #{ARGV[0]}"
exit 1
end

unless File.exist?(CURRENT_FILE)
warn "Could not find #{CURRENT_FILE}"
exit 1
end

current_events = YAML.load_file(CURRENT_FILE)

MONTH_PATTERN = '(?:January|February|March|April|May|June|July|August|September|October|November|December|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Sept|Oct|Nov|Dec)'
MONTH_REGEX = /#{MONTH_PATTERN}/i

def normalize_month(name)
case name.downcase
when 'jan' then 'January'
when 'feb' then 'February'
when 'mar' then 'March'
when 'apr' then 'April'
when 'may' then 'May'
when 'jun' then 'June'
when 'jul' then 'July'
when 'aug' then 'August'
when 'sep', 'sept' then 'September'
when 'oct' then 'October'
when 'nov' then 'November'
when 'dec' then 'December'
else
name.capitalize
end
end

def build_date_from_components(month_name, day, year)
month_index = Date::MONTHNAMES.index(month_name)
return nil unless month_index

Date.new(year.to_i, month_index, day.to_i)
rescue ArgumentError
nil
end

def parse_end_date(range_str)
return nil if range_str.nil?

s = range_str.to_s.strip
s = s.gsub(/[–—]/, '-')

# Handle ranges like "April 26 - May 1, 2026"
if (m = s.match(/(#{MONTH_PATTERN})\s+(\d{1,2})\s*-\s*(#{MONTH_PATTERN})\s*(\d{1,2}),?\s*(\d{4})$/i))
month2 = normalize_month(m[3])
day2 = m[4]
year = m[5]
return build_date_from_components(month2, day2, year)
end

# Handle ranges like "September 21-26, 2025"
if (m = s.match(/(#{MONTH_PATTERN})\s+\d{1,2}\s*-\s*(\d{1,2}),?\s*(\d{4})$/i))
month = normalize_month(m[1])
day2 = m[2]
year = m[3]
return build_date_from_components(month, day2, year)
end

# Handle single day "September 27, 2025"
if (m = s.match(/(#{MONTH_PATTERN})\s+(\d{1,2}),?\s*(\d{4})$/i))
month = normalize_month(m[1])
day = m[2]
year = m[3]
return build_date_from_components(month, day, year)
end

# Handle formats like "March 4-5 March, 2026"
if (m = s.match(/(#{MONTH_PATTERN})\s+\d{1,2}\s*-\s*(\d{1,2})\s+(#{MONTH_PATTERN}),?\s*(\d{4})$/i))
month = normalize_month(m[3])
day = m[2]
year = m[4]
return build_date_from_components(month, day, year)
end

# Fallback: let Date.parse try entire string
Date.parse(s) rescue nil
end

def extract_status_dates(status_text)
return [] if status_text.nil?
stripped = status_text.to_s.gsub(/<[^>]+>/, ' ')
results = []

stripped.scan(/(#{MONTH_PATTERN}\s*\d{1,2}(?:\s*-\s*(?:#{MONTH_PATTERN})?\s*\d{1,2})?,?\s*\d{4})/i) do |match|
segment = match.first
end_date = parse_end_date(segment)
results << { segment: segment.strip, date: end_date } if end_date
end

results
end

updates = []

current_events.each do |event|
event_needs_move = false
status_needs_update = false

end_date = parse_end_date(event['dates'])
if end_date
event_needs_move = true if end_date < today
elsif event['dates'].to_s =~ /\d{4}/
warn "Warning: could not parse end date for '#{event['name']}': #{event['dates']}"
end

status_dates = extract_status_dates(event['status'])
status_needs_update = status_dates.any? { |item| item[:date] && item[:date] < today }

updates << event.dup if event_needs_move || status_needs_update
end

FileUtils.mkdir_p(File.dirname(OUTPUT_FILE))

formatted_entries = updates.map do |event|
yaml = YAML.dump([event])
lines = yaml.lines
lines.shift if lines.first&.start_with?('---')
lines.reject! { |line| line.strip == '...' }
lines.map!(&:rstrip)
lines.join("\n")
end

File.open(OUTPUT_FILE, 'w') do |f|
if formatted_entries.empty?
f.write("# No events needing attention for #{today}\n")
else
f.write(formatted_entries.join("\n\n"))
f.write("\n")
end
end

puts "Identified #{updates.size} events needing attention."
puts "Details written to #{OUTPUT_FILE}."