Skip to content

Commit b103931

Browse files
authored
Merge pull request #29 from petrobras/develop
Separate executable resolution from build skipping and centralize lookup
2 parents 1d305eb + ebaefc7 commit b103931

9 files changed

Lines changed: 36 additions & 66 deletions

File tree

.github/workflows/build-test-release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ concurrency:
2121

2222
env:
2323
MARLIM3_SKIP_BUILD: "1"
24+
MARLIM3_SKIP_EXECUTABLE_RESOLUTION: "1"
2425
ARTIFACT_RETENTION_DAYS: "7"
2526

2627
jobs:
@@ -586,6 +587,8 @@ jobs:
586587
- windows-2022
587588
- macos-14
588589
runs-on: ${{ matrix.os }}
590+
env:
591+
MARLIM3_SKIP_EXECUTABLE_RESOLUTION: "0"
589592

590593
steps:
591594
- name: Set up Python

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ See [Compilation](#compilation) below. After building, copy `build/Marlim3` to `
6060
MARLIM3_SKIP_BUILD=1 uv sync --locked
6161
```
6262

63+
`MARLIM3_SKIP_BUILD=1` skips local CMake compilation. Set `MARLIM3_SKIP_EXECUTABLE_RESOLUTION=1` only when an import must not resolve or download the executable.
64+
6365
## Usage
6466

6567
### Option 1: Python Package
@@ -177,6 +179,8 @@ Then activate the package locally (skipping recompilation):
177179
MARLIM3_SKIP_BUILD=1 uv sync --locked
178180
```
179181

182+
`MARLIM3_SKIP_BUILD=1` skips local CMake compilation; installed packages can still download the release executable on import.
183+
180184
### Run tests
181185

182186
```bash

marlim3/__init__.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44

55
# Import version from root _version.py
6-
import sys
6+
from importlib.metadata import PackageNotFoundError, version
77
from pathlib import Path
88

99
# Try to import from root _version.py (for development)
@@ -12,10 +12,8 @@
1212
if (_root_dir / '_version.py').exists():
1313
exec(open(_root_dir / '_version.py').read())
1414
else:
15-
# Fallback for installed package
16-
__version__ = '3.3.0'
17-
except:
18-
# Fallback
15+
__version__ = version("marlim3")
16+
except PackageNotFoundError:
1917
__version__ = '3.3.0'
2018

2119
# Ensure executable is downloaded on first import
@@ -27,4 +25,4 @@
2725
from ._rede._rede import Rede
2826
from ._cenarios._cenarios import Cenarios
2927

30-
__all__ = ['Tramo','Rede','Cenarios', '__version__']
28+
__all__ = ['Tramo','Rede','Cenarios', '__version__']

marlim3/_download.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,11 @@
1111
import urllib.request
1212
from pathlib import Path
1313

14+
15+
def _env_flag(name):
16+
return os.environ.get(name, "").strip().lower() not in {"", "0", "false", "no", "off"}
17+
18+
1419
def get_platform_asset_info():
1520
"""Determine which asset to download based on the platform.
1621
@@ -155,6 +160,9 @@ def _try_build_from_source():
155160
import subprocess
156161
import shutil
157162

163+
if _env_flag('MARLIM3_SKIP_BUILD'):
164+
return False
165+
158166
package_dir = Path(__file__).parent
159167
root_dir = package_dir.parent
160168

@@ -207,8 +215,7 @@ def ensure_executable():
207215
208216
This is called automatically on package import.
209217
"""
210-
# Skip if user wants to skip
211-
if os.environ.get('MARLIM3_SKIP_BUILD'):
218+
if _env_flag('MARLIM3_SKIP_EXECUTABLE_RESOLUTION'):
212219
return
213220

214221
# Check if executable exists and works

marlim3/_rede/_rede.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import importlib.resources as pkg_resources
21
import os
32
import numpy as np
43
import json
54
import shutil
5+
from contextlib import nullcontext
6+
from .._download import get_executable_path
67
from .._plots._plots_perfis import _plotar_perfis, _plotar_perfis_animados
78
from .._plots._plots_redes import _plotar_rede
89
from .._tramo._tramo import Tramo
@@ -130,17 +131,10 @@ def simular(self, label='marlim3_rede',
130131
tracker=None,
131132
sanitized=False):
132133

133-
# Verificar o sistema operacional
134-
if platform.system() == 'Windows':
135-
executavel_name = 'Marlim3.exe'
136-
else:
137-
executavel_name = 'Marlim3'
138-
139134
if label != 'marlim3_rede':
140135
self.label = label
141136

142-
with pkg_resources.as_file(
143-
pkg_resources.files('marlim3').joinpath(executavel_name)) as executavel:
137+
with nullcontext(get_executable_path()) as executavel:
144138

145139
filename = label+'.json'
146140

marlim3/_tramo/_tramo.py

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
import importlib.resources as pkg_resources
21
import pandas as pd
32
import json
43
import os
54
import shutil
65
import requests
6+
from contextlib import nullcontext
7+
from .._download import get_executable_path
78
from .._conversores._conversor_marlim3_tplppl import convert_to_ppl_tpl
89
import matplotlib.cm as cm
910
import matplotlib.pyplot as plt
@@ -282,17 +283,10 @@ def simular(self, kind='PRODUTOR',
282283
tracker=None,
283284
sanitized=False):
284285

285-
# Verificar o sistema operacional
286-
if platform.system() == 'Windows':
287-
executavel_name = 'Marlim3.exe'
288-
else:
289-
executavel_name = 'Marlim3'
290-
291286
if label != 'marlim3_model':
292287
self.label = label
293288

294-
with pkg_resources.as_file(
295-
pkg_resources.files('marlim3').joinpath(executavel_name)) as executavel:
289+
with nullcontext(get_executable_path()) as executavel:
296290

297291
filename = label+'.json'
298292

tests/test_configure_simulation.py

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,27 @@
99
"""
1010

1111
import copy
12-
import importlib.resources as pkg_resources
1312
import os
14-
import platform
1513

1614
import numpy as np
1715
import pandas as pd
1816
import pytest
1917

2018
import marlim3
19+
from marlim3._download import executable_exists
2120

2221

2322
# ============================================================================
2423
# Verificação do executável
2524
# ============================================================================
2625

2726
def _executavel_disponivel():
28-
exe_name = "marlim3.exe" if platform.system() == "Windows" else "marlim3"
29-
for name in [exe_name, "Marlim3.exe" if platform.system() == "Windows" else "Marlim3"]:
30-
try:
31-
ref = pkg_resources.files("marlim3").joinpath(name)
32-
with pkg_resources.as_file(ref) as p:
33-
if p.exists():
34-
return True
35-
except (FileNotFoundError, AttributeError, TypeError):
36-
continue
37-
return False
27+
return executable_exists()
3828

3929

4030
skip_sem_executavel = pytest.mark.skipif(
4131
not _executavel_disponivel(),
42-
reason="Executável Marlim3 não encontrado no pacote",
32+
reason="Executável Marlim3 não encontrado",
4333
)
4434

4535

@@ -121,4 +111,4 @@ def test_simulacao_vertical_roda(self, caso_base_vertical, tmp_path):
121111
assert "perfilProducao" in caso_base_vertical.resultados
122112
df = caso_base_vertical.resultados["perfilProducao"]
123113
assert isinstance(df, pd.DataFrame)
124-
assert not df.empty
114+
assert not df.empty

tests/test_demos_steady_state.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,36 +8,26 @@
88
pytest tests/test_demos.py -v -m simulacao
99
"""
1010

11-
import importlib.resources as pkg_resources
1211
import os
13-
import platform
1412
import shutil
1513

1614
import pandas as pd
1715
import pytest
1816

1917
import marlim3
18+
from marlim3._download import executable_exists
2019

2120
# ============================================================================
2221
# Verificação do executável
2322
# ============================================================================
2423

2524
def _executavel_disponivel():
26-
exe_name = "marlim3.exe" if platform.system() == "Windows" else "marlim3"
27-
for name in [exe_name, "Marlim3.exe" if platform.system() == "Windows" else "Marlim3"]:
28-
try:
29-
ref = pkg_resources.files("marlim3").joinpath(name)
30-
with pkg_resources.as_file(ref) as p:
31-
if p.exists():
32-
return True
33-
except (FileNotFoundError, AttributeError, TypeError):
34-
continue
35-
return False
25+
return executable_exists()
3626

3727

3828
skip_sem_executavel = pytest.mark.skipif(
3929
not _executavel_disponivel(),
40-
reason="Executável Marlim3 não encontrado no pacote",
30+
reason="Executável Marlim3 não encontrado",
4131
)
4232

4333
# ============================================================================

tests/test_regression.py

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,37 +9,27 @@
99
pytest tests/test_regression.py -v -m regressao
1010
"""
1111

12-
import importlib.resources as pkg_resources
1312
import os
14-
import platform
1513
import shutil
1614

1715
import numpy as np
1816
import pandas as pd
1917
import pytest
2018

2119
import marlim3
20+
from marlim3._download import executable_exists
2221

2322
# ============================================================================
2423
# Verificação do executável
2524
# ============================================================================
2625

2726
def _executavel_disponivel():
28-
exe_name = "marlim3.exe" if platform.system() == "Windows" else "marlim3"
29-
for name in [exe_name, "Marlim3.exe" if platform.system() == "Windows" else "Marlim3"]:
30-
try:
31-
ref = pkg_resources.files("marlim3").joinpath(name)
32-
with pkg_resources.as_file(ref) as p:
33-
if p.exists():
34-
return True
35-
except (FileNotFoundError, AttributeError, TypeError):
36-
continue
37-
return False
27+
return executable_exists()
3828

3929

4030
skip_sem_executavel = pytest.mark.skipif(
4131
not _executavel_disponivel(),
42-
reason="Executável Marlim3 não encontrado no pacote",
32+
reason="Executável Marlim3 não encontrado",
4333
)
4434

4535
# ============================================================================

0 commit comments

Comments
 (0)