Skip to content

Commit

Permalink
Update run_tests.yml
Browse files Browse the repository at this point in the history
  • Loading branch information
oerc0122 committed Jul 16, 2024
1 parent 78691b3 commit 30b22df
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 51 deletions.
21 changes: 14 additions & 7 deletions .github/workflows/run_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,29 @@ jobs:
strategy:
matrix:
os: [windows-latest, ubuntu-latest]
matlab_version: [latest]
matlab_version: [R2022a, R2023a, R2023b, latest]
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:
run:
shell: bash -l {0} # Needed to use conda environments
steps:
- name: Check out Horace-Euphonic-Interface
uses: actions/checkout@v3
uses: actions/checkout@v4
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:
Expand All @@ -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:
Expand Down
109 changes: 65 additions & 44 deletions create_mltbx.py
Original file line number Diff line number Diff line change
@@ -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 <topic>\n' \
' %\n' \
' % where <topic> 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 <topic>
%
% where <topic> 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('<param.version>1.0</param.version>', f'<param.version>{version}</param.version>'), end='')
# FileInput redirects stdout to the file, for inplace replacement
print(line.replace('<param.version>1.0</param.version>',
f'<param.version>{version}</param.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)

0 comments on commit 30b22df

Please sign in to comment.