11import os
2+ from dataclasses import dataclass
23
34from renderer .renderer import RenderBuilder
45from oklchUtils .OKLCHUtils import OKLCHUtils
56from calc import Calc
67from settings import Settings
78from fetcher .fetcher import FetchLangStats
89
9- # Fetch info
10+ # Some settinga
1011USERNAME = os .environ ['USERNAME' ]
1112TOKEN = os .environ ['GITHUB_TOKEN' ]
1213OUTPUT_FILE : str = "./out.svg"
1314SETTINGS_FILE : str = "./settings.yaml"
1415
1516SETTINGS = Settings .from_yaml (SETTINGS_FILE )
1617
18+
19+ @dataclass
20+ class LangData :
21+ name : str
22+ size : float
23+ github_color : str
24+
1725def get_langs_data (
1826 token : str ,
1927 username : str ,
2028 exclude_langs : list [str ] = SETTINGS .GENERAL_SETTINGS .EXCLUDED_LANGUAGES
21- ) -> dict [ str , float ]:
22- info = {}
23- total_size = 0
29+ ) -> list [ LangData ]:
30+ info : dict [ str , LangData ] = {}
31+ total_size : float = 0
2432
2533 for elem in FetchLangStats (token ).fetch_user (username ):
2634 if elem .name in exclude_langs : continue
2735
2836 total_size += elem .size
29- if elem .name not in info : info [elem .name ] = elem .size
30- else : info [elem .name ] += elem .size
37+ if elem .name not in info : info [elem .name ] = LangData ( elem .name , elem . size , elem . github_color )
38+ else : info [elem .name ]. size += elem .size
3139
32- return {k : info [k ]/ total_size for k in info }
40+ return [LangData (
41+ info [k ].name ,
42+ info [k ].size / total_size ,
43+ info [k ].github_color
44+ ) for k in info ]
3345
34- def truncate (langs_arr : list [tuple [ float , str ] ], k : int ):
46+ def truncate (langs_arr : list [LangData ], k : int ):
3547 if len (langs_arr ) <= k : return langs_arr
36- return langs_arr [:k - 1 ] + [( sum (map (lambda x : x [ 0 ] , langs_arr [k - 1 :])), "Other" )]
48+ return langs_arr [:k - 1 ] + [LangData ( "Other" , sum (map (lambda x : x . size , langs_arr [k - 1 :])), SETTINGS . GENERAL_SETTINGS . COLORING . OTHER_COLOR )]
3749
38- def main ():
39- languages_stats = get_langs_data (TOKEN , USERNAME )
50+ def coloring (sorted_percents : list [LangData ]) -> list [str ]:
51+ coloring_cfg = SETTINGS .GENERAL_SETTINGS .COLORING
52+
53+ if coloring_cfg .TYPE == "oklch" :
54+ if hasattr (coloring_cfg , "CHROMA" ) and hasattr (coloring_cfg , "LIGHTNESS" ):
55+ return OKLCHUtils .create_colors_array (
56+ length = len (sorted_percents ),
57+ chroma = getattr (coloring_cfg , "CHROMA" ),
58+ lightness = getattr (coloring_cfg , "LIGHTNESS" )
59+ )
60+ raise ValueError ("Invalid oklch coloring config" )
61+ elif coloring_cfg .TYPE == "github" :
62+ return [elem .github_color for elem in sorted_percents ]
63+
64+ raise ValueError ("No such coloring config" )
4065
41- sorted_percents = sorted (
42- [(percent , name ) for percent ,name in zip (languages_stats .values (), languages_stats .keys ())],
43- key = lambda x : x [0 ],
66+ def main ():
67+ sorted_langs = sorted (
68+ get_langs_data (TOKEN , USERNAME ),
69+ key = lambda x : x .size ,
4470 reverse = True
4571 )
4672
47- sorted_percents = truncate (sorted_percents , SETTINGS .GENERAL_SETTINGS .TOP_K )
73+ sorted_percents = truncate (sorted_langs , SETTINGS .GENERAL_SETTINGS .TOP_K )
4874
4975 _ = Calc (
5076 outer_radius = SETTINGS .DIAGRAM_SETTINGS .OUTER_RADIUS ,
5177 thickness = SETTINGS .DIAGRAM_SETTINGS .THICKNESS ,
52- percent_array = [elem [0 ] for elem in sorted_percents ],
53- sections_colors_array = OKLCHUtils .create_colors_array (
54- length = len (sorted_percents ),
55- chroma = SETTINGS .GENERAL_SETTINGS .COLORING .CHROMA ,
56- lightness = SETTINGS .GENERAL_SETTINGS .COLORING .LIGHTNESS
57- ),
78+ percent_array = [elem .size for elem in sorted_percents ],
79+ sections_colors_array = coloring (sorted_percents ),
5880 renderer = RenderBuilder (
5981 height = SETTINGS .GENERAL_SETTINGS .PLANE .HEIGHT ,
6082 width = SETTINGS .GENERAL_SETTINGS .PLANE .WIDTH ,
@@ -69,7 +91,7 @@ def main():
6991 ),
7092 margin_x = SETTINGS .DIAGRAM_SETTINGS .MARGIN_X ,
7193 margin_y = SETTINGS .DIAGRAM_SETTINGS .MARGIN_Y ,
72- names_array = [elem [ 1 ] for elem in sorted_percents ]
94+ names_array = [elem . name for elem in sorted_percents ]
7395 )
7496
7597 with open (OUTPUT_FILE , "w+" , encoding = "utf-8-sig" ) as f :
0 commit comments