diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index e7de4af..4ddc4f5 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -13,15 +13,14 @@ jobs: strategy: matrix: os: [windows-latest, ubuntu-latest] - matlab_version: [latest] + matlab_version: [R2023a] python_version: [3.9] - euphonic_version: [''] + euphonic_version: ['--version 1.3.1'] # Test lowest supported Python/Euphonic versions, and lowest available Matlab include: - os: ubuntu-latest - matlab_version: R2020a + matlab_version: R2021b python_version: 3.9 - euphonic_version: '--version 1.3.1' fail-fast: false runs-on: ${{ matrix.os }} defaults: @@ -32,6 +31,11 @@ jobs: uses: actions/checkout@v3 with: submodules: true + run: | + cd light_python_wrapper + git remote add personal https://github.com/oerc0122/light_python_wrapper.git + git fetch personal + git checkout patch-1 - name: Set up MATLAB uses: matlab-actions/setup-matlab@v2 # v1.1.0 required for Windows/MacOS support with: @@ -54,11 +58,14 @@ jobs: python -m pip install --upgrade pip && python -m pip install requests && python create_mltbx.py + - name: create_toolbox + uses: matlab-actions/run-command@v2 + with: + command: cd('mltbx'); create_mltbx() - name: Install base Euphonic run: | - python -m pip install numpy && + python -m pip install numpy==1.26.4 && python euphonic_sqw_models/apply_requirements.py ${{ matrix.euphonic_version }} - python create_mltbx.py - name: Run tests with base Euphonic uses: matlab-actions/run-command@v2 with: diff --git a/create_mltbx.py b/create_mltbx.py index 502750d..1f8b354 100644 --- a/create_mltbx.py +++ b/create_mltbx.py @@ -1,58 +1,79 @@ -import os +import fileinput import re -import subprocess import shutil -import glob +import subprocess +from pathlib import Path -import versioneer import update_module_versions +import versioneer __version__ = versioneer.get_version() -HELPDOCSTR = '\n' \ - ' % Overloaded help command to display Python help in Matlab\n' \ - ' % To use it, please type\n' \ - ' %\n' \ - ' % >> import euphonic.help\n' \ - ' % >> help \n' \ - ' %\n' \ - ' % where is a Python class or method which has been wrapped for use in Matlab.\n' \ - ' % If the topic is not wrapped, the normal Matlab help is displayed.\n' \ - -def replace_matlab_docstring(filename, replacement_str): - with open(filename) as f: - txt = f.read() - cm = [m.start() for m in re.finditer(r'\n\s*%', txt)] - nl = [m.start() for m in re.finditer(r'\n', txt)] - idx = [cm[idx] for idx in range(len(cm)) if cm[idx] == nl[idx]] +HELPDOCSTR = """ + % Overloaded help command to display Python help in Matlab + % To use it, please type + % + % >> import euphonic.help + % >> help + % + % where is a Python class or method which has been wrapped for use in Matlab. + % If the topic is not wrapped, the normal Matlab help is displayed. +""" + + +def replace_matlab_docstring(filename: Path, replacement_str: str): + txt = filename.read_text(encoding="utf-8") + comment = [m.start() for m in re.finditer(r'\n\s*%', txt)] + newline = [m.start() for m in re.finditer(r'\n', txt)] + idx = [cm for cm, nl in zip(comment, newline) if cm == nl] newtxt = txt[:idx[0]] + replacement_str + txt[idx[-1]:] - with open(filename, 'w') as f: - f.write(newtxt) - -def create_mltbx(): - import fileinput - # replace version string - version = __version__.split('+')[0] if '+' in __version__ else __version__ # Matlab only accepts numbers - with fileinput.FileInput('mltbx/horace_euphonic_interface.prj', inplace=True) as prj: + filename.write_text(newtxt, encoding="utf-8") + + +def create_mltbx(base_path: Path): + """ + Create toolbox assuming files relative to `base_path` + """ + + # replace version string as MATLAB only accepts numbers + version = __version__.split('+')[0] if '+' in __version__ else __version__ + base_path = base_path.absolute() + + lpw_src = base_path / "light_python_wrapper" + eup_src = base_path / "+euphonic" + mdl_src = base_path / "euphonic_sqw_models" / "euphonic_sqw_models" + mltbx_path = base_path / 'mltbx' + lpw_dest = mltbx_path / "+light_python_wrapper" + eup_dest = mltbx_path / "+euphonic" + mdl_dest = mltbx_path / "euphonic_sqw_models" / "euphonic_sqw_models" + + with fileinput.FileInput(mltbx_path / 'horace_euphonic_interface.prj', inplace=True) as prj: for line in prj: - # FileInput redirect stdout to the file, for inplace replacement; end='' means don't add extra newlines - print(line.replace('1.0', f'{version}'), end='') + # FileInput redirects stdout to the file, for inplace replacement + print(line.replace('1.0', + f'{version}'), end='') + update_module_versions.update_module_versions() # shutil.copytree expects destination to not exist for dest_folder in ['+light_python_wrapper', 'euphonic_sqw_models', '+euphonic']: - if os.path.isdir('mltbx/' + dest_folder): shutil.rmtree('mltbx/' + dest_folder) - shutil.copyfile('LICENSE', 'mltbx/LICENSE') - shutil.copyfile('CITATION.cff', 'mltbx/CITATION.cff') - shutil.copytree('light_python_wrapper/+light_python_wrapper', 'mltbx/+light_python_wrapper') - shutil.copytree('euphonic_sqw_models/euphonic_sqw_models', 'mltbx/euphonic_sqw_models/euphonic_sqw_models') - shutil.copytree('+euphonic', 'mltbx/+euphonic') - for fil in glob.glob('light_python_wrapper/helputils/*.m'): shutil.copy(fil, 'mltbx/+euphonic') - for fil in glob.glob('light_python_wrapper/helputils/private/*.m'): shutil.copy(fil, 'mltbx/+euphonic/private') - replace_matlab_docstring('mltbx/+euphonic/help.m', HELPDOCSTR) - replace_matlab_docstring('mltbx/+euphonic/doc.m', HELPDOCSTR.replace('help', 'doc')) - subprocess.run(['matlab', '-batch', 'create_mltbx'], cwd='mltbx') - print('.mltbx created') + if (dest := mltbx_path / dest_folder).is_dir(): + shutil.rmtree(dest) -if __name__ == '__main__': - create_mltbx() + for file in ('LICENSE', 'CITATION.cff'): + shutil.copy(file, mltbx_path) + shutil.copytree(lpw_src / "+light_python_wrapper", lpw_dest) + shutil.copytree(mdl_src, mdl_dest) + shutil.copytree(eup_src, eup_dest) + for fil in (lpw_src / "helputils").glob("*.m"): + shutil.copy(fil, eup_dest) + for fil in (lpw_src / "helputils/private").glob("*.m"): + shutil.copy(fil, eup_dest / "private") + + replace_matlab_docstring(eup_dest / "help.m", HELPDOCSTR) + replace_matlab_docstring(eup_dest / "doc.m", HELPDOCSTR.replace('help', 'doc')) + + +if __name__ == '__main__': + curr_path = Path(__file__).parent + create_mltbx(curr_path)