Skip to content

Commit 305d421

Browse files
authored
Merge pull request #52 from ncdcdev/feat/issue-44-token-efficiency
feat: improve token efficiency by omitting redundant Excel response fields
2 parents 40c7db1 + 5e8ba21 commit 305d421

2 files changed

Lines changed: 96 additions & 7 deletions

File tree

src/sharepoint_excel.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -188,13 +188,15 @@ def parse_to_json(
188188
# シートを解析
189189
result = {
190190
"file_path": file_path,
191-
"response_kind": "data",
192-
"data_included": True,
193-
"requested_sheet": sheet_name,
194-
"requested_range": cell_range,
195191
"sheets": [],
196192
}
197193

194+
# nullでない場合のみ追加
195+
if sheet_name is not None:
196+
result["requested_sheet"] = sheet_name
197+
if cell_range is not None:
198+
result["requested_range"] = cell_range
199+
198200
if sheet_resolution:
199201
result["sheet_resolution"] = sheet_resolution
200202
result["available_sheets"] = workbook.sheetnames
@@ -412,10 +414,11 @@ def _parse_sheet(
412414
"""
413415
sheet_data = {
414416
"name": sheet.title,
415-
"dimensions": str(sheet.dimensions) if sheet.dimensions else None,
416417
}
417-
sheet_data["purpose"] = "data"
418-
sheet_data["data_included"] = True
418+
419+
# dimensionsがNoneでない場合のみ追加
420+
if sheet.dimensions:
421+
sheet_data["dimensions"] = str(sheet.dimensions)
419422

420423
# freeze_panes情報の取得と検証
421424
frozen_rows = 0

tests/test_sharepoint_excel.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1501,3 +1501,89 @@ def test_cell_styles_none_when_not_set(self):
15011501
assert "fill" not in cell
15021502
assert "width" not in cell
15031503
assert "height" not in cell
1504+
1505+
def test_omit_fixed_value_fields(self):
1506+
"""固定値フィールドが省略されること"""
1507+
excel_bytes = self._create_test_excel()
1508+
self.mock_download_client.download_file.return_value = excel_bytes
1509+
1510+
parser = SharePointExcelParser(self.mock_download_client)
1511+
result_json = parser.parse_to_json("/test/file.xlsx")
1512+
1513+
result = json.loads(result_json)
1514+
1515+
# トップレベルの固定値フィールドは省略
1516+
assert "response_kind" not in result
1517+
assert "data_included" not in result
1518+
1519+
# シートレベルの固定値フィールドは省略
1520+
sheet = result["sheets"][0]
1521+
assert "purpose" not in sheet
1522+
assert "data_included" not in sheet
1523+
1524+
def test_omit_null_fields(self):
1525+
"""nullフィールドが省略されること"""
1526+
excel_bytes = self._create_test_excel()
1527+
self.mock_download_client.download_file.return_value = excel_bytes
1528+
1529+
parser = SharePointExcelParser(self.mock_download_client)
1530+
# sheet_name/cell_rangeを指定しない
1531+
result_json = parser.parse_to_json("/test/file.xlsx")
1532+
1533+
result = json.loads(result_json)
1534+
1535+
# nullフィールドは省略
1536+
assert "requested_sheet" not in result
1537+
assert "requested_range" not in result
1538+
1539+
def test_include_non_null_fields(self):
1540+
"""null以外のフィールドが含まれること"""
1541+
excel_bytes = self._create_multi_sheet_excel()
1542+
self.mock_download_client.download_file.return_value = excel_bytes
1543+
1544+
parser = SharePointExcelParser(self.mock_download_client)
1545+
# sheet_name/cell_rangeを指定
1546+
result_json = parser.parse_to_json(
1547+
"/test/file.xlsx", sheet_name="Sheet1", cell_range="A1:B2"
1548+
)
1549+
1550+
result = json.loads(result_json)
1551+
1552+
# 値があるフィールドは含まれる
1553+
assert result["requested_sheet"] == "Sheet1"
1554+
assert result["requested_range"] == "A1:B2"
1555+
1556+
def test_omit_null_dimensions(self):
1557+
"""dimensions=nullが省略されること"""
1558+
parser = SharePointExcelParser(self.mock_download_client)
1559+
1560+
# モックを使用してsheet.dimensionsをNoneに設定
1561+
with patch("src.sharepoint_excel.load_workbook") as mock_load:
1562+
mock_wb = Mock()
1563+
mock_sheet = Mock()
1564+
mock_sheet.title = "EmptySheet"
1565+
mock_sheet.dimensions = None # dimensionsをNoneに設定
1566+
mock_sheet.freeze_panes = None # freeze_panesもNone
1567+
# sheet_viewを設定して_get_frozen_panes()での警告ログを防ぐ
1568+
mock_sheet.sheet_view = Mock(pane=None)
1569+
# merged_cellsはranges属性を持つオブジェクト
1570+
mock_merged_cells = Mock()
1571+
mock_merged_cells.ranges = []
1572+
mock_sheet.merged_cells = mock_merged_cells
1573+
mock_sheet.iter_rows = Mock(return_value=[]) # 行なし
1574+
mock_sheet.max_row = 0
1575+
mock_sheet.max_column = 0
1576+
mock_wb.sheetnames = ["EmptySheet"]
1577+
mock_wb.__getitem__ = Mock(return_value=mock_sheet)
1578+
mock_wb.close = Mock()
1579+
mock_load.return_value = mock_wb
1580+
1581+
# load_workbookがモックされているため、download_fileの戻り値は実際には使われない
1582+
self.mock_download_client.download_file.return_value = b""
1583+
result_json = parser.parse_to_json("/test/empty.xlsx")
1584+
1585+
result = json.loads(result_json)
1586+
sheet = result["sheets"][0]
1587+
1588+
# dimensionsがNoneの場合は省略
1589+
assert "dimensions" not in sheet

0 commit comments

Comments
 (0)