Skip to content

Commit 51e8a8c

Browse files
squash! first attempt
1 parent 983c69a commit 51e8a8c

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed

frictionless/schema/fields_info.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from typing import List
2+
3+
from frictionless.schema.field import Field
4+
5+
6+
class FieldInfo:
7+
"""Private class to store additional data to a field"""
8+
9+
def __init__(self, field: Field, field_number: int):
10+
"""field_number: 1-indexed rank of the field"""
11+
self.field = field
12+
self.field_number = field_number
13+
self.cell_reader = field.create_cell_reader()
14+
self.cell_writer = field.create_cell_writer()
15+
16+
17+
class FieldsInfo:
18+
def __init__(self, fields: List[Field]):
19+
self._fields: List[FieldInfo] = [
20+
FieldInfo(field, i + 1) for i, field in enumerate(fields)
21+
]
22+
23+
def ls(self) -> List[str]:
24+
"""List all field names"""
25+
return [fi.field.name for fi in self._fields]
26+
27+
def get(self, field_name: str) -> FieldInfo:
28+
"""Get a Field by its name
29+
30+
Raises:
31+
ValueError: Field with name fieldname does not exist
32+
"""
33+
try:
34+
return next(fi for fi in self._fields if fi.field.name == field_name)
35+
except StopIteration:
36+
raise ValueError(f"'{field_name}' is not in fields data")
37+
38+
def get_copies(self) -> List[Field]:
39+
"""Return field copies"""
40+
return [fi.field.to_copy() for fi in self._fields]
41+
42+
def rm(self, field_name: str):
43+
try:
44+
i = self.ls().index(field_name)
45+
del self._fields[i]
46+
except ValueError:
47+
raise ValueError(f"'{field_name}' is not in fields data")

0 commit comments

Comments
 (0)