Coverage for employees / employees.py: 100%
59 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-02 00:05 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-02 00:05 +0000
1#!/usr/bin/env python
2# coding: utf-8
3"""
4Read Employee data to return turnover information.
5This is a example Python program to read and process YAML files.
6"""
8from collections.abc import Iterable
9from io import IOBase
10from typing import Any, Union
12from yaml import dump, safe_load
15class Employees:
16 """Read Employee data to return turnover information."""
18 __version__ = "1.5.0"
20 def __init__(self, infile: Union[IOBase, str, None] = None):
21 self.__class__ = Employees
22 self.employees: Any = None
23 if infile is not None:
24 self.load(infile)
26 def filter_by_id(self, eid: int) -> Iterable[int]:
27 """Filter by employee id.
28 :param eid: filter on this employee id
29 """
30 for _k in self.employees.keys():
31 if eid == self.employees.get(_k).get("id"):
32 for _t in self.employees.get(_k).get("turnover"):
33 yield self.employees.get(_k).get("turnover").get(_t)
35 def filter_by_name(self, name: str):
36 """Filter by employee name.
37 :param name: filter on this employee name
38 """
39 for _t in self.employees.get(name).get("turnover"):
40 yield self.employees.get(name).get("turnover").get(_t)
42 def filter_by_year(self, year: int):
43 """Filter by year of employee turnover.
44 :param year: filter on this turnover year
45 """
46 for _n in self.employees.keys():
47 if year in self.employees.get(_n).get("turnover"):
48 yield self.employees.get(_n).get("turnover").get(year)
50 def load(self, infile: Union[IOBase, str]):
51 """Load YAML data from a file.
52 :param infile: the YAML file to read
53 """
54 if isinstance(infile, IOBase):
55 self.employees = safe_load(infile)
56 else:
57 with open(infile, "r", encoding="UTF-8") as _fh:
58 self.employees = safe_load(_fh)
60 def dump(self):
61 """
62 Dump imported YAML.
63 """
64 return dump(self.employees)
66 def get_name(self, eid: int) -> str:
67 """Returns the name of employee by id.
68 :param eid: the employee id
69 """
70 names = list(
71 filter(
72 lambda x: eid == self.employees.get(x).get("id"),
73 self.employees.keys(), # noqa: E501
74 )
75 )
76 return names[0]
78 def get_by_id(self, eid: int) -> Union[int, None]:
79 """Returns the turnover for all years for an employee by id.
80 :param eid: the employee id
81 """
82 turnovers = list(self.filter_by_id(eid))
83 return sum(turnovers) if turnovers else None
85 def get_by_name(self, name: str) -> Union[int, None]:
86 """Returns turnover for all years for an employee by name.
87 :param name: the employee name
88 """
89 if name in self.employees.keys():
90 turnover = sum(self.filter_by_name(name))
91 else:
92 turnover = None
93 return turnover
95 def get_by_year(self, year: int) -> int:
96 """Returns turnover for all employees by year.
97 :param year: year of turnover
98 """
99 return sum(self.filter_by_year(year))
101 def get_for_name_by_year(self, name: str, year: int) -> Union[int, None]:
102 """Returns turnover for an employee for a specific year.
103 :param name: name of employee
104 :param year: year of turnover
105 """
106 turnovers = None
107 if name in self.employees.keys():
108 turnovers = list(
109 self.employees.get(name).get("turnover").get(_t)
110 for _t in self.employees.get(name).get("turnover")
111 if _t == year
112 )
113 return sum(turnovers) if turnovers else None
115 def list_by_id(self, eid: int) -> Union[Iterable[int], None]:
116 """List turnover by id.
117 :param eid: the employee id
118 """
119 turnovers = list(self.filter_by_id(eid))
120 return turnovers if turnovers else None
122 def list_by_name(self, name: str) -> Union[Iterable[int], None]:
123 """List turnover by name.
124 :param name: name of employee
125 """
126 if name in self.employees.keys():
127 turnovers = list(self.filter_by_name(name))
128 else:
129 turnovers = None
130 return turnovers
132 def list_by_year(self, year: int) -> Union[Iterable[int], None]:
133 """List turnover by year.
134 :param year: year of turnover
135 """
136 turnovers = list(self.filter_by_year(year))
137 return turnovers if turnovers else None