Skip to content

Commit bee3e61

Browse files
authored
Merge branch 'main' into modernize-relax-integer-vars
2 parents 76065d9 + 88940a9 commit bee3e61

File tree

9 files changed

+73
-58
lines changed

9 files changed

+73
-58
lines changed

.github/workflows/test_branches.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -534,9 +534,8 @@ jobs:
534534
echo "DYLD_LIBRARY_PATH=${env:DYLD_LIBRARY_PATH}:$GAMS_DIR" `
535535
Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
536536
$INSTALLER = "${env:DOWNLOAD_DIR}/gams_install.exe"
537-
# We are pinning to 29.1.0 because a license is required for
538-
# versions after this in order to run in demo mode.
539-
$URL = "https://d37drm4t2jghv5.cloudfront.net/distributions/29.1.0"
537+
# Demo licenses are included for 5mo from the newest release
538+
$URL = "https://d37drm4t2jghv5.cloudfront.net/distributions/50.1.0"
540539
if ( "${{matrix.TARGET}}" -eq "win" ) {
541540
$URL = "$URL/windows/windows_x64_64.exe"
542541
} elseif ( "${{matrix.TARGET}}" -eq "osx" ) {

.github/workflows/test_pr_and_main.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -586,9 +586,8 @@ jobs:
586586
echo "DYLD_LIBRARY_PATH=${env:DYLD_LIBRARY_PATH}:$GAMS_DIR" `
587587
Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append
588588
$INSTALLER = "${env:DOWNLOAD_DIR}/gams_install.exe"
589-
# We are pinning to 29.1.0 because a license is required for
590-
# versions after this in order to run in demo mode.
591-
$URL = "https://d37drm4t2jghv5.cloudfront.net/distributions/29.1.0"
589+
# Demo licenses are included for 5mo from the newest release
590+
$URL = "https://d37drm4t2jghv5.cloudfront.net/distributions/50.1.0"
592591
if ( "${{matrix.TARGET}}" -eq "win" ) {
593592
$URL = "$URL/windows/windows_x64_64.exe"
594593
} elseif ( "${{matrix.TARGET}}" -eq "osx" ) {

pyomo/common/dependencies.py

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -443,25 +443,9 @@ def check_min_version(module, min_version):
443443
module = indicator._module
444444
else:
445445
return False
446-
if check_min_version._parser is None:
447-
try:
448-
from packaging import version as _version
449-
450-
_parser = _version.parse
451-
except ImportError:
452-
# pkg_resources is an order of magnitude slower to import than
453-
# packaging. Only use it if the preferred (but optional)
454-
# packaging library is not present
455-
from pkg_resources import parse_version as _parser
456-
check_min_version._parser = _parser
457-
else:
458-
_parser = check_min_version._parser
459446

460447
version = getattr(module, '__version__', '0.0.0')
461-
return _parser(min_version) <= _parser(version)
462-
463-
464-
check_min_version._parser = None
448+
return packaging.version.parse(min_version) <= packaging.version.parse(version)
465449

466450

467451
#
@@ -993,6 +977,12 @@ def _finalize_pympler(module, available):
993977
import pympler.muppy
994978

995979

980+
def _finalize_packaging(module, available):
981+
if available:
982+
# Import key subpackages that we will want to assume are present
983+
import packaging.version
984+
985+
996986
def _finalize_matplotlib(module, available):
997987
if not available:
998988
return
@@ -1094,6 +1084,10 @@ def _pyutilib_importer():
10941084
)
10951085
random, _ = attempt_import('random')
10961086

1087+
# Necessary for minimum version checking for other optional dependencies
1088+
packaging, packaging_available = attempt_import(
1089+
'packaging', deferred_submodules=['version'], callback=_finalize_packaging
1090+
)
10971091
# Commonly-used optional dependencies
10981092
dill, dill_available = attempt_import('dill')
10991093
mpi4py, mpi4py_available = attempt_import(

pyomo/common/tests/test_dependencies.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
dill,
3232
dill_available,
3333
mpi4py_available,
34+
packaging_available,
3435
)
3536

3637
import pyomo.common.tests.dep_mod as dep_mod
@@ -125,6 +126,9 @@ def test_imported_deferred_import(self):
125126
self.assertIs(dep_mod.bogus_nonexisting_module_available, False)
126127
self.assertIs(type(dep_mod.bogus_nonexisting_module), ModuleUnavailable)
127128

129+
@unittest.skipUnless(
130+
packaging_available, "min_version tests require packaging module"
131+
)
128132
def test_min_version(self):
129133
mod, avail = attempt_import(
130134
'pyomo.common.tests.dep_mod', minimum_version='1.0', defer_import=False
@@ -177,6 +181,9 @@ def test_min_version(self):
177181
mod, avail = attempt_import('pyomo.common.tests.bogus', minimum_version='1.0')
178182
self.assertFalse(check_min_version(mod, '1.0'))
179183

184+
@unittest.skipUnless(
185+
packaging_available, "min_version tests require packaging module"
186+
)
180187
def test_and_or(self):
181188
mod0, avail0 = attempt_import('ply', defer_import=True)
182189
mod1, avail1 = attempt_import('pyomo.common.tests.dep_mod', defer_import=True)
@@ -231,6 +238,9 @@ def test_and_or(self):
231238
self.assertIsInstance(_ror, _DeferredOr)
232239
self.assertTrue(_ror)
233240

241+
@unittest.skipUnless(
242+
packaging_available, "min_version tests require packaging module"
243+
)
234244
def test_callbacks(self):
235245
ans = []
236246

pyomo/contrib/appsi/solvers/maingo.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -173,11 +173,18 @@ def available(self):
173173
return self._available
174174

175175
def version(self):
176-
import pkg_resources
176+
import importlib.metadata
177177

178-
version = pkg_resources.get_distribution('maingopy').version
179-
180-
return tuple(int(k) for k in version.split('.'))
178+
try:
179+
version = importlib.metadata.version('maingopy').split('.')
180+
except ImportError:
181+
return None
182+
for i, n in enumerate(version):
183+
try:
184+
version[i] = int(version[i])
185+
except:
186+
pass
187+
return tuple(version)
181188

182189
@property
183190
def config(self) -> MAiNGOConfig:

pyomo/neos/kestrel.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,12 @@ def setup_connection(self):
122122
try:
123123
result = self.neos.ping()
124124
logger.info("OK.")
125-
except (socket.error, xmlrpclib.ProtocolError, http.client.BadStatusLine):
125+
except (
126+
socket.error,
127+
xmlrpclib.ProtocolError,
128+
http.client.BadStatusLine,
129+
NotImplementedError,
130+
):
126131
e = sys.exc_info()[1]
127132
self.neos = None
128133
logger.info("Fail: %s" % (e,))

pyomo/scripting/pyomo_main.py

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,28 @@
1313
import copy
1414
from pyomo.common.deprecation import deprecation_warning
1515

16-
try:
17-
import pkg_resources
1816

19-
pyomo_commands = pkg_resources.iter_entry_points('pyomo.command')
20-
except:
21-
pyomo_commands = []
22-
#
23-
# Load modules associated with Plugins that are defined in
24-
# EGG files.
25-
#
26-
for entrypoint in pyomo_commands:
27-
try:
28-
plugin_class = entrypoint.load()
29-
except Exception:
30-
exctype, err, tb = sys.exc_info() # BUG?
31-
import traceback
17+
pyomo_commands = []
3218

33-
msg = (
34-
"Error loading pyomo.command entry point %s:\nOriginal %s: %s\n"
35-
"Traceback:\n%s"
36-
% (entrypoint, exctype.__name__, err, ''.join(traceback.format_tb(tb)))
37-
)
38-
# clear local variables to remove circular references
39-
exctype = err = tb = None
40-
# TODO: Should this just log an error and re-raise the original
41-
# exception?
42-
raise ImportError(msg)
19+
20+
def load_entry_points():
21+
import importlib.metadata
22+
23+
try:
24+
# Python >= 3.10
25+
ep_list = importlib.metadata.entry_points(group='pyomo.command')
26+
except:
27+
# Python 3.8 - 3.9
28+
ep_list = importlib.metadata.entry_points().get('pyomo.command', [])
29+
for ep in ep_list:
30+
try:
31+
pyomo_commands.append(ep.load())
32+
except:
33+
logger.error(
34+
f"Importing 'pyomo.command' entry point '{ep.name}' failed:\n"
35+
f"{traceback.format_exc(limit=1)}"
36+
)
37+
raise
4338

4439

4540
def main(args=None):
@@ -49,6 +44,11 @@ def main(args=None):
4944
from pyomo.scripting import pyomo_parser
5045
import pyomo.environ
5146

47+
#
48+
# Load the pyomo.command entry points
49+
#
50+
if not pyomo_commands:
51+
load_entry_points()
5252
#
5353
# Parse the arguments
5454
#

pyomo/version/tests/test_version.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ def test_releaselevel(self):
2020

2121
def test_version(self):
2222
try:
23-
import pkg_resources
23+
from importlib.metadata import version
2424

25-
version = pkg_resources.get_distribution('pyomo').version
25+
pyomo_version = version('pyomo')
2626
except:
27-
self.skipTest('pkg_resources is not available')
27+
self.skipTest('importlib.metadata is not available')
2828

2929
if pyomo_ver.version_info[3] == 'final':
30-
self.assertEqual(pyomo_ver.version, version)
30+
self.assertEqual(pyomo_ver.version, pyomo_version)
3131

3232
else:
33-
tmp_ = version.split('.')
33+
tmp_ = pyomo_version.split('.')
3434
self.assertEqual(str(tmp_[0]), str(pyomo_ver.version_info[0]))
3535
self.assertEqual(str(tmp_[1]), str(pyomo_ver.version_info[1]))
3636
if tmp_[-1].startswith('dev'):

setup.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ def __ne__(self, other):
244244
'networkx; python_version>="3.9"',
245245
'numpy',
246246
'openpyxl', # dataportals
247+
'packaging', # for checking other dependency versions
247248
#'pathos', # requested for #963, but PR currently closed
248249
'pint', # units
249250
'plotly', # incidence_analysis

0 commit comments

Comments
 (0)