@@ -116,7 +116,7 @@ def __init__(self, page, options):
116116 self .options = options
117117
118118
119- class FileInfo (object ):
119+ class _FomodFileInfo (object ):
120120 def __init__ (self , source , destination , priority ):
121121 self .source = source
122122 self .destination = destination
@@ -159,11 +159,18 @@ def process_files(cls, files_elem, file_list):
159159
160160
161161class FomodInstaller (object ):
162- def __init__ (self , root , file_list , dst_path , game_version ):
162+ def __init__ (self , root , file_list , dst_dir , game_version ):
163+ """
164+
165+ :param root:
166+ :param file_list: the list of recognized files of the parent installer
167+ :param dst_dir: the destination directory - <Game>/Data
168+ :param game_version: version of the game launch exe
169+ """
163170 self .tree = etree .parse (root )
164171 self .fomod_name = self .tree .findtext ("moduleName" , "" ).strip ()
165172 self .file_list = file_list
166- self .dst_path = dst_path
173+ self .dst_dir = dst_dir
167174 self .game_version = game_version
168175 self ._current_page = None
169176 self ._previous_pages = []
@@ -219,15 +226,15 @@ def files(self):
219226 required_files = []
220227 required_files_elem = self .tree .find ("requiredInstallFiles" )
221228 if required_files_elem is not None :
222- required_files = FileInfo .process_files (required_files_elem , self .file_list )
229+ required_files = _FomodFileInfo .process_files (required_files_elem , self .file_list )
223230 user_files = []
224231 selected_options = [
225232 option ._object for info in self ._previous_pages for option in info .options
226233 ]
227234 for option in selected_options :
228235 option_files = option .find ("files" )
229236 if option_files is not None :
230- user_files .extend (FileInfo .process_files (option_files , self .file_list ))
237+ user_files .extend (_FomodFileInfo .process_files (option_files , self .file_list ))
231238 conditional_files = []
232239 for pattern in self .tree .findall ("conditionalFileInstalls/patterns/pattern" ):
233240 conditions = pattern .find ("dependencies" )
@@ -237,7 +244,7 @@ def files(self):
237244 except FailedCondition :
238245 pass
239246 else :
240- conditional_files .extend (FileInfo .process_files (files , self .file_list ))
247+ conditional_files .extend (_FomodFileInfo .process_files (files , self .file_list ))
241248 file_dict = {} # dst -> src
242249 priority_dict = {} # dst -> priority
243250 for info in required_files + user_files + conditional_files :
@@ -266,24 +273,24 @@ def _flags(self):
266273 flag_dict [flag_name ] = flag_value
267274 return flag_dict
268275
269- def _test_file_condition (self , file_name , file_type ):
270- file_path = self .dst_path .join (file_name )
271- if not file_path .exists ():
276+ def _test_file_condition (self , condition ):
277+ file_name = condition .get ("file" )
278+ file_type = condition .get ("state" )
279+ file_path = self .dst_dir .join (file_name )
280+ if not file_path .exists (): # TODO: ghosts?
272281 actual_type = "Missing"
273282 else :
274- is_active = cached_is_active (file_name )
275- if is_active :
276- actual_type = "Active"
277- else :
278- actual_type = "Inactive"
283+ actual_type = "Active" if cached_is_active (file_name ) else "Inactive"
279284 if actual_type != file_type :
280285 raise FailedCondition (
281286 "File {} should be {} but is {} instead." .format (
282287 file_name , file_type , actual_type
283288 )
284289 )
285290
286- def _test_flag_condition (self , flag_name , flag_value ):
291+ def _test_flag_condition (self , condition ):
292+ flag_name = condition .get ("flag" )
293+ flag_value = condition .get ("value" )
287294 actual_value = self ._flags ().get (flag_name , None )
288295 if actual_value != flag_value :
289296 raise FailedCondition (
@@ -292,12 +299,14 @@ def _test_flag_condition(self, flag_name, flag_value):
292299 )
293300 )
294301
295- def _test_version_condition (self , version ):
302+ def _test_version_condition (self , condition ):
303+ version = condition .get ("version" )
296304 game_version = LooseVersion (self .game_version )
297305 version = LooseVersion (version )
298306 if game_version < version :
299307 raise FailedCondition (
300- "Game version is {} but {} is required." .format (game_version , version )
308+ "Game version is {} but {} is required." .format (
309+ game_version , version )
301310 )
302311
303312 def _test_conditions (self , conditions ):
@@ -306,26 +315,21 @@ def _test_conditions(self, conditions):
306315 condition_list = conditions .findall ("*" )
307316 for condition in condition_list :
308317 try :
309- if condition .tag == "fileDependency" :
310- file_name = condition .get ("file" )
311- file_type = condition .get ("state" )
312- self ._test_file_condition (file_name , file_type )
313- elif condition .tag == "flagDependency" :
314- flag_name = condition .get ("flag" )
315- flag_value = condition .get ("value" )
316- self ._test_flag_condition (flag_name , flag_value )
317- elif condition .tag == "gameDependency" :
318- version = condition .get ("version" )
319- self ._test_version_condition (version )
320- elif condition .tag == "dependencies" :
321- self ._test_conditions (condition )
318+ test_func = self ._condition_tests .get (condition .tag , None )
319+ if test_func :
320+ test_func (self , condition )
322321 except FailedCondition as exc :
323322 failed .extend ([a for a in str (exc ).splitlines ()])
324323 if op == "And" :
325324 raise FailedCondition ("\n " .join (failed ))
326325 if op == "Or" and len (failed ) == len (condition_list ):
327326 raise FailedCondition ("\n " .join (failed ))
328327
328+ _condition_tests = {"fileDependency" : _test_file_condition ,
329+ "flagDependency" : _test_flag_condition ,
330+ "gameDependency" : _test_version_condition ,
331+ "dependencies" : _test_conditions , }
332+
329333 @staticmethod
330334 def _order_list (unordered_list , order , _valid_values = frozenset (
331335 ("Explicit" , "Ascending" , "Descending" ))):
0 commit comments