Coverage for employees / employees.py: 100%

59 statements  

« 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""" 

7 

8from collections.abc import Iterable 

9from io import IOBase 

10from typing import Any, Union 

11 

12from yaml import dump, safe_load 

13 

14 

15class Employees: 

16 """Read Employee data to return turnover information.""" 

17 

18 __version__ = "1.5.0" 

19 

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) 

25 

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) 

34 

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) 

41 

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) 

49 

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) 

59 

60 def dump(self): 

61 """ 

62 Dump imported YAML. 

63 """ 

64 return dump(self.employees) 

65 

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] 

77 

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 

84 

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 

94 

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)) 

100 

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 

114 

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 

121 

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 

131 

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