1- import os
2- import shutil
3- from dataclasses import dataclass , field
1+ from dataclasses import dataclass
42from pathlib import Path
5- from typing import Optional
6-
7- from valve_parsers import PCFFile
83
94# INFO: This file just allows package maintainers to set whether this application should act as if it is a portable installation.
105# They can easily modify this file and set these values, e.g.
116# `printf '%s\n' 'portable = False' >core/are_we_portable.py`
127# This will make the application use paths outside the installation location.
138from core .are_we_portable import portable
149from core .constants import PROGRAM_AUTHOR , PROGRAM_NAME
15- from core .handlers .pcf_handler import get_parent_elements
1610
1711
1812@dataclass
1913class FolderConfig :
2014 # configuration class for managing folder paths
21- install_dir = Path (os .path .dirname (os .path .abspath (__file__ ))).parent # INFO: I'm not too sure if this can break or not, oh well
15+ install_dir = Path (__file__ ).resolve ().parent .parent
16+ data_dir = install_dir / 'data'
17+
2218 portable = portable # make sure it is accessible via self.portable
2319
24- # TODO: allow windows users to use non-portable installs (would allow us to remove this entire platform check)
2520 if portable :
2621 # default portable values
2722 project_dir = install_dir
@@ -33,81 +28,41 @@ class FolderConfig:
3328 project_dir = Path (platformdirs .user_data_dir (PROGRAM_NAME , PROGRAM_AUTHOR ))
3429 settings_dir = Path (platformdirs .user_config_dir (PROGRAM_NAME , PROGRAM_AUTHOR ))
3530
36- base_default_pcf : Optional [PCFFile ] = field (default = None )
37- base_default_parents : Optional [set [str ]] = field (default = None )
38-
39- # main folder names
40- _backup_folder = "backup"
41- _mods_folder = "mods"
42-
43- # mods subdir
44- _mods_particles_folder = "particles"
45- _mods_addons_folder = "addons"
46-
47- # temp and it's nested folders (to be cleared every run)
48- _temp_folder = "temp"
49- _temp_to_be_processed_folder = "to_be_processed"
50- _temp_to_be_referenced_folder = "to_be_referenced"
51- _temp_to_be_patched_folder = "to_be_patched"
52- _temp_to_be_vpk_folder = "to_be_vpk"
31+ __deps = {
32+ 'project_dir' : {
33+ 'backup_dir' : lambda self : self .project_dir / 'backup' ,
34+ 'mods_dir' : lambda self : self .project_dir / 'mods' ,
35+ 'temp_dir' : lambda self : self .project_dir / 'temp' ,
36+ },
37+ 'mods_dir' : {
38+ 'particles_dir' : lambda self : self .mods_dir / 'particles' ,
39+ 'addons_dir' : lambda self : self .mods_dir / 'addons' ,
40+ },
41+ 'temp_dir' : {
42+ 'temp_download_dir' : lambda self : self .temp_dir / 'download' ,
43+ 'temp_to_be_processed_dir' : lambda self : self .temp_dir / 'to_be_processed' ,
44+ 'temp_to_be_referenced_dir' : lambda self : self .temp_dir / 'to_be_referenced' ,
45+ 'temp_to_be_patched_dir' : lambda self : self .temp_dir / 'to_be_patched' ,
46+ 'temp_to_be_vpk_dir' : lambda self : self .temp_dir / 'to_be_vpk' ,
47+ },
48+ }
5349
5450 def __post_init__ (self ):
55- self .backup_dir = self .project_dir / self ._backup_folder
56- self .data_dir = self .install_dir / "data"
57-
58- self .mods_dir = self .project_dir / self ._mods_folder
59- self .particles_dir = self .mods_dir / self ._mods_particles_folder
60- self .addons_dir = self .mods_dir / self ._mods_addons_folder
61-
62- self .temp_dir = self .project_dir / self ._temp_folder
63- self .temp_download_dir = self .temp_dir / 'download'
64- self .temp_to_be_processed_dir = self .temp_dir / self ._temp_to_be_processed_folder
65- self .temp_to_be_referenced_dir = self .temp_dir / self ._temp_to_be_referenced_folder
66- self .temp_to_be_patched_dir = self .temp_dir / self ._temp_to_be_patched_folder
67- self .temp_to_be_vpk_dir = self .temp_dir / self ._temp_to_be_vpk_folder
68-
69- def create_required_folders (self ) -> None :
70- folders = [
71- self .mods_dir ,
72- self .addons_dir ,
73- self .particles_dir ,
74-
75- self .temp_dir ,
76- self .temp_to_be_processed_dir ,
77- self .temp_to_be_referenced_dir ,
78- self .temp_to_be_patched_dir ,
79- self .temp_to_be_vpk_dir
80- ]
81-
82- for folder in folders :
83- folder .mkdir (parents = True , exist_ok = True )
84-
85- def initialize_pcf (self ):
86- if self .temp_to_be_referenced_dir .exists ():
87- default_base_path = self .temp_to_be_referenced_dir / "disguise.pcf"
88- if default_base_path .exists ():
89- self .base_default_pcf = PCFFile (default_base_path ).decode ()
90- self .base_default_parents = get_parent_elements (self .base_default_pcf )
91-
92- def cleanup_temp_folders (self ) -> None :
93- # anything put in temp/ will be gone !!!!!
94- if self .temp_dir .exists ():
95- shutil .rmtree (self .temp_dir )
96- self .base_default_pcf = None
97- self .base_default_parents = None
98-
99- def get_temp_path (self , filename : str ) -> Path :
100- return self .temp_dir / filename
101-
102- def get_output_path (self , filename : str ) -> Path :
103- return self .temp_to_be_processed_dir / filename
51+ for dep , props in self .__deps .items ():
52+ for attr , setter in props .items ():
53+ super ().__setattr__ (attr , setter (self ))
10454
105- def get_backup_path (self , filename : str ) -> Path :
106- return self .backup_dir / filename
55+ def __setattr__ (self , attr , value ):
56+ _super = super ()
57+ _super .__setattr__ (attr , value )
10758
108- def get_game_files_path (self , filename : str ) -> Path :
109- return self .temp_to_be_referenced_dir / filename
59+ if attr in self .__deps :
60+ for _attr , setter in self .__deps [attr ].items ():
61+ _super .__setattr__ (_attr , setter (self ))
62+ else :
63+ for dep , props in tuple (self .__deps .items ()):
64+ if attr in props :
65+ del props [attr ]
11066
11167
112- # create a default instance for import
113- folder_setup = FolderConfig ()
68+ folder_setup = FolderConfig () # create a default instance for import
0 commit comments