 265ee7098a
			
		
	
	265ee7098a
	
	
	
		
			
			* Option RangeWithSpecialMax * amendment to typing in web options * compare string with number * lots of work on zillion * fix zillion fill logic * fix a few more issues in zillion fill logic * can make zillion patch and use it * put multi items in zillion rom * work on ZillionClient * logging and auth in client * work on sending and receiving items * implement item_handling flag * fix locations ids to NuktiServer package * use rewrite of zri * cache logic rule data for performance * use new id maps * fix some problems with the big recent merge * ZillionClient: use new context manager for Memory class * fix ItemClassification for Zillion items and some debug statements for asserts, documentation on running scripts for manual testing type correction in CommonContext * fix some issues in client, start on docs, put rescue and item ram addresses in slot data * use new location name system fix item locations getting out of sync in progression balancing * zillion client can read slot name from game * zillion: new item names * remove extra unneeded import * newer options (room gen and starting cards) * update comment in zillion patch * zillion non static regions * change some logging, update some comments * allow ZillionClient to exit in certain situations * todo note to fix options doc strings * don't force auto forfeit * rework validation of floppy requirement and item counts and fix race condition in generate_output * reorganize Zillion component structure with System class * documentation updates for Zillion * attempt inno_setup.iss * remove todo comment for something done * update comment * rework item count zillion options and some small cleanups * fix location check count * data package version 1 * Zillion can pass unit tests without rom * fix freeze if closing ZillionClient while it's waiting for server login * specify commit hash for zilliandomizer package * some changes to options validation * Zillion doors saved on multiworld server * add missing function in inno_setup and name of vanilla continues in options * rework zillion sync task and context * Apply documentation suggestions from SoldierofOrder Co-authored-by: SoldierofOrder <107806872+SoldierofOrder@users.noreply.github.com> * update zillion package * workaround for asyncio udp bug There is a bug in Python in Windows https://github.com/python/cpython/issues/91227 that makes it so if I look for RetroArch before it's ready, it breaks the asyncio udp transport system. As a workaround, we don't look for RetroArch until the user asks for it with /sms * a few of the smaller suggestions from review * logic only looks at my locations instead of all the multiworld locations * some adjustments from pull request discussion and some unit tests * patch webhost changes from pull request discussion * zillion logic tests * better vblr test * test interaction of character rescue items with logic * move unit tests to new worlds folder * comment improvements * fix minor logic issue and add memory read timeout * capitalization in option display names Opa-Opa is a proper noun * redirect zz stdout to debug * fix option validation bug making unbeatable seeds * remove line that does nothing * attach logic cache to world Co-authored-by: SoldierofOrder <107806872+SoldierofOrder@users.noreply.github.com> Co-authored-by: Doug Hoskisson <doughoskisson@novuslabs.com>
		
			
				
	
	
		
			80 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import os
 | |
| import sys
 | |
| import subprocess
 | |
| import pkg_resources
 | |
| 
 | |
| local_dir = os.path.dirname(__file__)
 | |
| requirements_files = {os.path.join(local_dir, 'requirements.txt')}
 | |
| 
 | |
| if sys.version_info < (3, 8, 6):
 | |
|     raise RuntimeError("Incompatible Python Version. 3.8.7+ is supported.")
 | |
| 
 | |
| update_ran = getattr(sys, "frozen", False)  # don't run update if environment is frozen/compiled
 | |
| 
 | |
| if not update_ran:
 | |
|     for entry in os.scandir(os.path.join(local_dir, "worlds")):
 | |
|         # skip .* (hidden / disabled) folders
 | |
|         if not entry.name.startswith("."):
 | |
|             if entry.is_dir():
 | |
|                 req_file = os.path.join(entry.path, "requirements.txt")
 | |
|                 if os.path.exists(req_file):
 | |
|                     requirements_files.add(req_file)
 | |
| 
 | |
| 
 | |
| def update_command():
 | |
|     for file in requirements_files:
 | |
|         subprocess.call([sys.executable, '-m', 'pip', 'install', '-r', file, '--upgrade'])
 | |
| 
 | |
| 
 | |
| def update(yes=False, force=False):
 | |
|     global update_ran
 | |
|     if not update_ran:
 | |
|         update_ran = True
 | |
|         if force:
 | |
|             update_command()
 | |
|             return
 | |
|         for req_file in requirements_files:
 | |
|             path = os.path.join(os.path.dirname(sys.argv[0]), req_file)
 | |
|             if not os.path.exists(path):
 | |
|                 path = os.path.join(os.path.dirname(__file__), req_file)
 | |
|             with open(path) as requirementsfile:
 | |
|                 for line in requirementsfile:
 | |
|                     if line.startswith('https://'):
 | |
|                         # extract name and version from url
 | |
|                         wheel = line.split('/')[-1]
 | |
|                         name, version, _ = wheel.split('-', 2)
 | |
|                         line = f'{name}=={version}'
 | |
|                     elif line.startswith('git+https://'):
 | |
|                         # extract name and version
 | |
|                         end = line.split('/')[-1]
 | |
|                         name_hash, egg = end.split("#", 1)
 | |
|                         name, _ = name_hash.split("@", 1)
 | |
|                         version = egg.split('==')[-1]
 | |
|                         line = f'{name}=={version}'
 | |
|                     requirements = pkg_resources.parse_requirements(line)
 | |
|                     for requirement in requirements:
 | |
|                         requirement = str(requirement)
 | |
|                         try:
 | |
|                             pkg_resources.require(requirement)
 | |
|                         except pkg_resources.ResolutionError:
 | |
|                             if not yes:
 | |
|                                 import traceback
 | |
|                                 traceback.print_exc()
 | |
|                                 input(f'Requirement {requirement} is not satisfied, press enter to install it')
 | |
|                             update_command()
 | |
|                             return
 | |
| 
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     import argparse
 | |
| 
 | |
|     parser = argparse.ArgumentParser(description='Install archipelago requirements')
 | |
|     parser.add_argument('-y', '--yes', dest='yes', action='store_true', help='answer "yes" to all questions')
 | |
|     parser.add_argument('-f', '--force', dest='force', action='store_true', help='force update')
 | |
|     parser.add_argument('-a', '--append', nargs="*", dest='additional_requirements',
 | |
|                         help='List paths to additional requirement files.')
 | |
|     args = parser.parse_args()
 | |
|     if args.additional_requirements:
 | |
|         requirements_files.update(args.additional_requirements)
 | |
|     update(args.yes, args.force)
 |