Skip to content

Commit 241d2f4

Browse files
committed
Save spreadsheets in JSON format
1 parent 147e5c4 commit 241d2f4

File tree

4 files changed

+88
-8
lines changed

4 files changed

+88
-8
lines changed

src/rpft/converters.py

+15
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from rpft.parsers.creation.contentindexparser import ContentIndexParser
66
from rpft.parsers.creation.tagmatcher import TagMatcher
77
from rpft.parsers.sheets import (
8+
AbstractSheetReader,
89
CSVSheetReader,
910
GoogleSheetReader,
1011
XLSXSheetReader,
@@ -73,6 +74,20 @@ def sheet_to_csv(path, sheet_id):
7374
csv_file.write(sheet.table.export("csv"))
7475

7576

77+
def to_json(reader: AbstractSheetReader) -> str:
78+
book = {
79+
"meta": {
80+
"version": "0.1.0",
81+
},
82+
"sheets": {
83+
name: sheet.table.dict
84+
for name, sheet in reader.sheets.items()
85+
},
86+
}
87+
88+
return json.dumps(book, ensure_ascii=False, indent=2, sort_keys=True)
89+
90+
7691
def prepare_dir(path):
7792
directory = Path(path)
7893

src/rpft/parsers/sheets.py

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
import os
33
from abc import ABC
4+
from collections.abc import Mapping
45
from pathlib import Path
56
from typing import List
67

@@ -24,6 +25,10 @@ def __init__(self, reader, name, table):
2425

2526

2627
class AbstractSheetReader(ABC):
28+
@property
29+
def sheets(self) -> Mapping[str, Sheet]:
30+
return self._sheets
31+
2732
def get_sheet(self, name) -> Sheet:
2833
return self.sheets.get(name)
2934

@@ -34,7 +39,7 @@ def get_sheets_by_name(self, name) -> List[Sheet]:
3439
class CSVSheetReader(AbstractSheetReader):
3540
def __init__(self, path):
3641
self.name = path
37-
self.sheets = {
42+
self._sheets = {
3843
f.stem: Sheet(reader=self, name=f.stem, table=load_csv(f))
3944
for f in Path(path).glob("*.csv")
4045
}
@@ -45,7 +50,7 @@ def __init__(self, filename):
4550
self.name = filename
4651
with open(filename, "rb") as table_data:
4752
data = tablib.Databook().load(table_data.read(), "xlsx")
48-
self.sheets = {}
53+
self._sheets = {}
4954
for sheet in data.sheets():
5055
self.sheets[sheet.title] = Sheet(
5156
reader=self,
@@ -98,16 +103,16 @@ def __init__(self, spreadsheet_id):
98103
.execute()
99104
)
100105

101-
self.sheets = {}
106+
self._sheets = {}
102107
for sheet in result.get("valueRanges", []):
103108
name = sheet.get("range", "").split("!")[0]
104109
if name.startswith("'") and name.endswith("'"):
105110
name = name[1:-1]
106111
content = sheet.get("values", [])
107-
if name in self.sheets:
112+
if name in self._sheets:
108113
raise ValueError(f"Warning: Duplicate sheet name: {name}")
109114
else:
110-
self.sheets[name] = Sheet(
115+
self._sheets[name] = Sheet(
111116
reader=self,
112117
name=name,
113118
table=self._table_from_content(content),

tests/mocks.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@ def parse_next_row(self, omit_templating=False, return_index=False):
5252
class MockSheetReader(AbstractSheetReader):
5353
def __init__(self, main_sheet_data=None, sheet_data_dict={}, name="mock"):
5454
self.name = name
55-
self.sheets = {}
55+
self._sheets = {}
5656

5757
if main_sheet_data:
58-
self.sheets["content_index"] = Sheet(
58+
self._sheets["content_index"] = Sheet(
5959
reader=self,
6060
name="content_index",
6161
table=tablib.import_set(main_sheet_data, format="csv"),
6262
)
6363

6464
for name, content in sheet_data_dict.items():
65-
self.sheets[name] = Sheet(
65+
self._sheets[name] = Sheet(
6666
reader=self,
6767
name=name,
6868
table=tablib.import_set(content, format="csv"),

tests/test_converters.py

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import json
2+
from unittest import TestCase
3+
4+
from tablib import Dataset
5+
6+
from rpft.converters import to_json
7+
from rpft.parsers.sheets import AbstractSheetReader, Sheet
8+
9+
10+
class TestReaderToJson(TestCase):
11+
def test_something(self):
12+
reader = MockSheetReader(
13+
{
14+
"sheet1": Sheet(
15+
reader=None,
16+
name="sheet1",
17+
table=Dataset(
18+
("row1_col1", "row1_col2", "row1_col3"),
19+
headers=["col1", "col2", "col3"],
20+
),
21+
),
22+
"sheet2": Sheet(
23+
reader=None,
24+
name="sheet2",
25+
table=Dataset(
26+
("row1_col1", "row1_col2", "row1_col3"),
27+
headers=["col1", "col2", "col3"],
28+
),
29+
),
30+
}
31+
)
32+
self.assertDictEqual(
33+
json.loads(to_json(reader)),
34+
{
35+
"meta": {
36+
"version": "0.1.0",
37+
},
38+
"sheets": {
39+
"sheet1": [
40+
{
41+
"col1": "row1_col1",
42+
"col2": "row1_col2",
43+
"col3": "row1_col3",
44+
},
45+
],
46+
"sheet2": [
47+
{
48+
"col1": "row1_col1",
49+
"col2": "row1_col2",
50+
"col3": "row1_col3",
51+
},
52+
],
53+
},
54+
},
55+
)
56+
57+
58+
class MockSheetReader(AbstractSheetReader):
59+
def __init__(self, sheets):
60+
self._sheets = sheets

0 commit comments

Comments
 (0)