Skip to content

Commit

Permalink
Merge pull request #57 from Wolfmyths/future-update
Browse files Browse the repository at this point in the history
Future update
  • Loading branch information
Wolfmyths authored Apr 25, 2024
2 parents b955c60 + 1c55da9 commit e707459
Show file tree
Hide file tree
Showing 12 changed files with 172 additions and 118 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: 3.11

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release_linux.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v4
uses: actions/setup-python@v5
with:
python-version: 3.11

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ If you still are suspicious, you can build the executable yourself with these st

# Supported Platforms

### Reguarding OS
### Regarding OS

Windows:

Expand Down
64 changes: 62 additions & 2 deletions main.spec
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,69 @@
import os
import sys

import patoolib

block_cipher = None

HIDDEN_IMPORTS = [
'patoolib.programs',
'patoolib.programs.ar',
'patoolib.programs.arc',
'patoolib.programs.archmage',
'patoolib.programs.bsdcpio',
'patoolib.programs.bsdtar',
'patoolib.programs.bzip2',
'patoolib.programs.cabextract',
'patoolib.programs.chmlib',
'patoolib.programs.clzip',
'patoolib.programs.compress',
'patoolib.programs.cpio',
'patoolib.programs.dpkg',
'patoolib.programs.flac',
'patoolib.programs.genisoimage',
'patoolib.programs.gzip',
'patoolib.programs.isoinfo',
'patoolib.programs.lbzip2',
'patoolib.programs.lcab',
'patoolib.programs.lha',
'patoolib.programs.lhasa',
'patoolib.programs.lrzip',
'patoolib.programs.lzip',
'patoolib.programs.lzma',
'patoolib.programs.lzop',
'patoolib.programs.mac',
'patoolib.programs.nomarch',
'patoolib.programs.p7azip',
'patoolib.programs.p7rzip',
'patoolib.programs.p7zip',
'patoolib.programs.pbzip2',
'patoolib.programs.pdlzip',
'patoolib.programs.pigz',
'patoolib.programs.plzip',
'patoolib.programs.py_bz2',
'patoolib.programs.py_echo',
'patoolib.programs.py_gzip',
'patoolib.programs.py_lzma',
'patoolib.programs.py_tarfile',
'patoolib.programs.py_zipfile',
'patoolib.programs.rar',
'patoolib.programs.rpm',
'patoolib.programs.rpm2cpio',
'patoolib.programs.rzip',
'patoolib.programs.shar',
'patoolib.programs.shorten',
'patoolib.programs.star',
'patoolib.programs.tar',
'patoolib.programs.unace',
'patoolib.programs.unadf',
'patoolib.programs.unalz',
'patoolib.programs.uncompress',
'patoolib.programs.unrar',
'patoolib.programs.unshar',
'patoolib.programs.unzip',
'patoolib.programs.zip',
]

DATA = [
(os.path.join('src', 'icon.ico'), os.path.join('.', 'src')),
(os.path.join('src', 'graphics'), os.path.join('.', 'src', 'graphics'))
Expand All @@ -12,7 +73,6 @@ DATA = [
BINARIES = []

if sys.platform.startswith('win'):
BINARIES.append(('src\\runGame.bat', '.'))

ICON = os.path.join('src', 'icon.ico')

Expand All @@ -24,7 +84,7 @@ a = Analysis(
pathex=[],
binaries=BINARIES,
datas=DATA,
hiddenimports=[],
hiddenimports=HIDDEN_IMPORTS,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
Expand Down
2 changes: 1 addition & 1 deletion src/JSONParser.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import os

class JSONParser():
file: dict[str:list[str]] = None
file: dict = None
def __init__(self, path: str, default: dict = {}) -> None:
self.path = path
self.default = default
Expand Down
2 changes: 1 addition & 1 deletion src/constant_vars.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,4 @@ class ModRole():
# Program Info
PROGRAM_NAME = 'Myth Mod Manager'

VERSION = semantic_version.Version(major=1, minor=5, patch=1)
VERSION = semantic_version.Version(major=1, minor=5, patch=2)
10 changes: 0 additions & 10 deletions src/runGame.bat

This file was deleted.

165 changes: 85 additions & 80 deletions src/save.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,6 @@
from src.JSONParser import JSONParser
from src.constant_vars import MOD_CONFIG, OPTIONS_CONFIG, ModType, LIGHT, MODS_DISABLED_PATH_DEFAULT, ModKeys, OptionKeys

class Config(ConfigParser):
'''Base class for config managers'''

def __init__(self, file: str = ''):
super().__init__()
logging.getLogger(__name__)

self.file = file

# Ensuring that file exists if file isn't a falsy value
if not os.path.exists(self.file) and self.file:
logging.warning('%s does not exist, creating...', self.file)

# Create a new .ini
with open(self.file, 'w+') as f:
pass

self.def_read()

def getList(self, section: str, option: str, delimiter: str = ',') -> list:
sequenceString = self.get(section, option, fallback=None)

if isinstance(sequenceString, str) and sequenceString:
sequence = sequenceString.split(delimiter)
return sequence
else:
return []

def setList(self, section: str, option: str, value: Sequence, delimiter: str = ',', sort: bool = False) -> None:
if sort:
value = sorted(value)

list_ = delimiter.join(value)

self.set(section, option, list_)

def def_read(self) -> None:
'''Short for default read, reads `self.file`'''
return super().read(self.file)

def writeData(self) -> None:
with open(self.file, 'w') as f:
f: TextIO
self.write(f)

logging.info('%s has been saved', self.file)

class Save(JSONParser):
'''Manages the data of each mod'''

Expand Down Expand Up @@ -219,52 +172,104 @@ def clearModData(self) -> None:

self.file = self.default

class OptionsManager(Config):
class OptionsManager():
'''Manages Program's Settings'''

config = ConfigParser()
file = OPTIONS_CONFIG

def __init__(self, file=OPTIONS_CONFIG):
super().__init__(file=file)

if not self.has_section(OptionKeys.section.value):
self.add_section(OptionKeys.section.value)
OptionsManager.file = file

# Ensuring that file exists if file isn't a falsy value
if not os.path.exists(OptionsManager.file) and OptionsManager.file:
logging.warning('%s does not exist, creating...', OptionsManager.file)

# Create a new .ini
with open(OptionsManager.file, 'w+') as f:
pass

OptionsManager.read()

if not OptionsManager.config.has_section(OptionKeys.section.value):
OptionsManager.config.add_section(OptionKeys.section.value)

@staticmethod
def getList(section: str, option: str, delimiter: str = ',') -> list:
sequenceString = OptionsManager.config.get(section, option, fallback=None)

if isinstance(sequenceString, str) and sequenceString:
sequence = sequenceString.split(delimiter)
return sequence
else:
return []

@staticmethod
def setList(section: str, option: str, value: Sequence, delimiter: str = ',', sort: bool = False) -> None:
if sort:
value = sorted(value)

list_ = delimiter.join(value)

OptionsManager.config.set(section, option, list_)

@staticmethod
def read() -> list[str]:
'''Reads `OptionsManager.file`'''
return OptionsManager.config.read(OptionsManager.file)

@staticmethod
def writeData() -> None:
with open(OptionsManager.file, 'w') as f:
f: TextIO
OptionsManager.config.write(f)

logging.info('%s has been saved', OptionsManager.file)

def hasOption(self, option: str) -> bool:
return self.has_option(OptionKeys.section.value, option)
@staticmethod
def hasOption(option: str) -> bool:
return OptionsManager.config.has_option(OptionKeys.section.value, option)

def getMMMUpdateAlert(self) -> bool:
self.def_read()
return self.getboolean(OptionKeys.section.value, OptionKeys.mmm_update_alert.value, fallback=True)
@staticmethod
def getMMMUpdateAlert() -> bool:
return OptionsManager.config.getboolean(OptionKeys.section.value, OptionKeys.mmm_update_alert.value, fallback=True)

def setMMMUpdateAlert(self, alert: bool = True) -> None:
self.set(OptionKeys.section.value, OptionKeys.mmm_update_alert.name, str(alert))
@staticmethod
def setMMMUpdateAlert(alert: bool = True) -> None:
OptionsManager.config.set(OptionKeys.section.value, OptionKeys.mmm_update_alert.name, str(alert))

def getTheme(self) -> str:
self.def_read()
return self.get(OptionKeys.section.value, OptionKeys.color_theme.name, fallback=LIGHT)
@staticmethod
def getTheme() -> str:
return OptionsManager.config.get(OptionKeys.section.value, OptionKeys.color_theme.name, fallback=LIGHT)

def setTheme(self, theme: str = LIGHT) -> None:
self.set(OptionKeys.section.value, OptionKeys.color_theme.value, theme)
@staticmethod
def setTheme(theme: str = LIGHT) -> None:
OptionsManager.config.set(OptionKeys.section.value, OptionKeys.color_theme.value, theme)

def getGamepath(self) -> str:
self.def_read()
return os.path.abspath(self.get(OptionKeys.section.value, OptionKeys.game_path, fallback=''))
@staticmethod
def getGamepath() -> str:
return os.path.abspath(OptionsManager.config.get(OptionKeys.section.value, OptionKeys.game_path, fallback=''))

def setGamepath(self, path: str = '') -> None:
self.set(OptionKeys.section.value, OptionKeys.game_path.name, os.path.abspath(path))
@staticmethod
def setGamepath(path: str = '') -> None:
OptionsManager.config.set(OptionKeys.section.value, OptionKeys.game_path.name, os.path.abspath(path))

def getDispath(self) -> str:
self.def_read()
return os.path.abspath(self.get(OptionKeys.section, OptionKeys.dispath, fallback=MODS_DISABLED_PATH_DEFAULT))
@staticmethod
def getDispath() -> str:
return os.path.abspath(OptionsManager.config.get(OptionKeys.section, OptionKeys.dispath, fallback=MODS_DISABLED_PATH_DEFAULT))

def setDispath(self, path: str = MODS_DISABLED_PATH_DEFAULT) -> None:
self.set(OptionKeys.section.value, OptionKeys.dispath.value, os.path.abspath(path))
@staticmethod
def setDispath(path: str = MODS_DISABLED_PATH_DEFAULT) -> None:
OptionsManager.config.set(OptionKeys.section.value, OptionKeys.dispath.value, os.path.abspath(path))

def getWindowSize(self) -> QSize:
self.def_read()
width = self.getint(OptionKeys.section.value, OptionKeys.windowsize_w.value, fallback=800)
height = self.getint(OptionKeys.section.value, OptionKeys.windowsize_h.value, fallback=800)
@staticmethod
def getWindowSize() -> QSize:
width = OptionsManager.config.getint(OptionKeys.section.value, OptionKeys.windowsize_w.value, fallback=800)
height = OptionsManager.config.getint(OptionKeys.section.value, OptionKeys.windowsize_h.value, fallback=800)
return QSize(width, height)

def setWindowSize(self, size: QSize = QSize(800, 800)) -> None:
self.set(OptionKeys.section.value, OptionKeys.windowsize_w.value, str(size.width()))
self.set(OptionKeys.section.value, OptionKeys.windowsize_h.value, str(size.height()))
@staticmethod
def setWindowSize(size: QSize = QSize(800, 800)) -> None:
OptionsManager.config.set(OptionKeys.section.value, OptionKeys.windowsize_w.value, str(size.width()))
OptionsManager.config.set(OptionKeys.section.value, OptionKeys.windowsize_h.value, str(size.height()))
9 changes: 5 additions & 4 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import pytest

from src.constant_vars import OptionKeys, ModKeys, ModType
from src.constant_vars import OptionKeys, ModKeys, ModType, LIGHT

@pytest.fixture(scope='session')
def getDir() -> str:
Expand Down Expand Up @@ -35,9 +35,9 @@ def createTemp_Mod_ini() -> Generator:
ModKeys.ignored.value : False},

'make game easy mod' : {ModKeys.type.value : ModType.mods.value,
ModKeys.modworkshopid.value : '2523',
ModKeys.enabled.value : True,
ModKeys.ignored.value : False}
ModKeys.modworkshopid.value : '2523',
ModKeys.enabled.value : True,
ModKeys.ignored.value : False}
}

with tempfile.NamedTemporaryFile('w', suffix='.json', delete=False) as tmp:
Expand All @@ -59,6 +59,7 @@ def createTemp_Config_ini(getDir: str) -> Generator:
config.read(tmp_filename)

config.add_section(OptionKeys.section.value)
config.set(OptionKeys.section.value, OptionKeys.color_theme.value, LIGHT)
config.set(OptionKeys.section.value, OptionKeys.game_path.value, os.path.join(getDir, 'game_path'))
config.set(OptionKeys.section.value, OptionKeys.dispath.value, os.path.join(getDir, 'game_path', 'disabledMods'))
config.set(OptionKeys.section.value, OptionKeys.mmm_update_alert.value, str(False))
Expand Down
11 changes: 7 additions & 4 deletions tests/tabs/test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from pytestqt.qtbot import QtBot

import PySide6.QtWidgets as qtw
from PySide6.QtCore import Qt as qt

from src.settings import Options
from src.constant_vars import DARK, LIGHT, OptionKeys
Expand Down Expand Up @@ -49,14 +50,16 @@ def test_cancelChanges(create_Settings: Options) -> None:

assert sum(list(create_Settings.optionChanged.values())) == 0

def test_applySettings(create_Settings: Options) -> None:
create_Settings.optionsGeneral.colorThemeLight.setChecked(True)
def test_applySettings(qtbot: QtBot, create_Settings: Options) -> None:
qtbot.addWidget(create_Settings)
qtbot.mouseClick(create_Settings.optionsGeneral.colorThemeDark, qt.MouseButton.LeftButton)

create_Settings.optionsGeneral.gameDir.setText(MOCK_GAMEPATH)
create_Settings.optionsGeneral.disabledModDir.setText(MOCK_DISMODS)

create_Settings.applySettings()
qtbot.mouseClick(create_Settings.applyButton, qt.MouseButton.LeftButton)

assert create_Settings.optionsManager.getTheme() == LIGHT
assert create_Settings.optionsManager.getTheme() == DARK
assert create_Settings.optionsManager.getGamepath() == MOCK_GAMEPATH
assert create_Settings.optionsManager.getDispath() == MOCK_DISMODS

Expand Down
Loading

0 comments on commit e707459

Please sign in to comment.