fix(salary): detect city column from header token, not exact match (#201)

convert_salary_excel.py detected the city column via exact membership (h_lower in CITY_PATTERNS), so real headers like "City Name", "City/Kommune", or "Kommune <suffix>" never matched and every company was written with an empty city field. Switches to header_matches(h, CITY_PATTERNS) - the same whole-token matcher already used for the company, count, index, and ID columns. Same bug class as #151 (company column); bare "City"/"Kommune" inputs are unaffected. Regression test covers bare and suffixed headers.

By @oscarbol09.
This commit is contained in:
Oscar Madera
2026-07-20 20:20:53 +02:00
committed by GitHub
parent 9cad956cc9
commit b3b351605c
2 changed files with 17 additions and 2 deletions
+16
View File
@@ -104,6 +104,22 @@ class DetectColumnTypeTests(unittest.TestCase):
companies[0]["categories"]["salary"], {"index": 105.5}
)
def test_parse_sheet_detects_city_column_with_token_header(self):
# City headers are matched with the same token-based header_matches()
# used for the company column, not exact string equality. Real-world
# sheets rarely use the bare token "City" or "Kommune" alone; headers
# like "City Name" / "City/Kommune" must still be detected as the city
# column (previously silently left as city_col=None -> empty city).
for header in ("City", "City Name", "Kommune", "City/Kommune"):
with self.subTest(header=header):
ws = FakeWorksheet([
("Company", header, "Salary"),
("Example Corp", "Aarhus", 105.5),
])
companies = parse_sheet(ws)
self.assertEqual(len(companies), 1)
self.assertEqual(companies[0]["city"], "Aarhus")
def test_skips_free_text_column(self):
# A free-text "Notes" column must not become a bogus salary category.
ws = FakeWorksheet([
+1 -2
View File
@@ -114,10 +114,9 @@ def parse_sheet(ws, sheet_label=None):
company_col = None
city_col = None
for i, h in enumerate(headers):
h_lower = h.lower()
if header_matches(h, COMPANY_PATTERNS):
company_col = i
elif h_lower in CITY_PATTERNS:
elif header_matches(h, CITY_PATTERNS):
city_col = i
if company_col is None: