Skip to content

Commit 43d3500

Browse files
authored
add openssl compat handling (#55)
* add openssl compat handling * add tests --------- Co-authored-by: Christopher Doris <github.com/cjdoris>
1 parent 7879d52 commit 43d3500

File tree

3 files changed

+57
-15
lines changed

3 files changed

+57
-15
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
# Changelog
22

3+
## Unreleased
4+
* Add special handling of `<=python` version for OpenSSL compatibility between Julia and Python.
5+
36
## v0.1.16 (2025-02-18)
47
* Adds file-locking to protect multiple concurrent resolves.
58

src/juliapkg/deps.py

Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,19 @@ def deps_files():
193193
)
194194

195195

196+
def openssl_compat(version=None):
197+
if version is None:
198+
import ssl
199+
200+
version = ssl.OPENSSL_VERSION_INFO
201+
202+
major, minor, patch = version[:3]
203+
if major >= 3:
204+
return f"{major} - {major}.{minor}"
205+
else:
206+
return f"{major}.{minor} - {major}.{minor}.{patch}"
207+
208+
196209
def find_requirements():
197210
# read all dependencies into a dict: name -> key -> file -> value
198211
# read all julia compats into a dict: file -> compat
@@ -213,6 +226,13 @@ def find_requirements():
213226
os.path.normpath(os.path.join(os.path.dirname(fn), v))
214227
)
215228
dep.setdefault(k, {})[fn] = v
229+
# special handling of `verion = "<=python"` for `OpenSSL_jll
230+
if (
231+
name == "OpenSSL_jll"
232+
and dep.get("uuid").get(fn) == "458c3c95-2e84-50aa-8efc-19380b2a3a95"
233+
and dep.get("version").get(fn) == "<=python"
234+
):
235+
dep["version"][fn] = openssl_compat()
216236
c = deps.get("julia")
217237
if c is not None:
218238
compats[fn] = Compat.parse(c)
@@ -331,33 +351,42 @@ def resolve(force=False, dry_run=False):
331351
if not STATE["offline"]:
332352
# write a Project.toml specifying UUIDs and compatibility of required
333353
# packages
354+
projtoml = []
355+
projtoml.append("[deps]")
356+
projtoml.extend(f'{pkg.name} = "{pkg.uuid}"' for pkg in pkgs)
357+
projtoml.append("[compat]")
358+
projtoml.extend(
359+
f'{pkg.name} = "{pkg.version}"' for pkg in pkgs if pkg.version
360+
)
361+
log("Writing Project.toml:")
362+
for line in projtoml:
363+
log(" ", line, cont=True)
334364
with open(os.path.join(project, "Project.toml"), "wt") as fp:
335-
print("[deps]", file=fp)
336-
for pkg in pkgs:
337-
print(f'{pkg.name} = "{pkg.uuid}"', file=fp)
338-
print(file=fp)
339-
print("[compat]", file=fp)
340-
for pkg in pkgs:
341-
if pkg.version:
342-
print(f'{pkg.name} = "{pkg.version}"', file=fp)
343-
print(file=fp)
365+
for line in projtoml:
366+
print(line, file=fp)
344367
# remove Manifest.toml
345368
manifest_path = os.path.join(project, "Manifest.toml")
346369
if os.path.exists(manifest_path):
347370
os.remove(manifest_path)
348371
# install the packages
349-
dev_pkgs = ", ".join([pkg.jlstr() for pkg in pkgs if pkg.dev])
350-
add_pkgs = ", ".join([pkg.jlstr() for pkg in pkgs if not pkg.dev])
372+
dev_pkgs = [pkg for pkg in pkgs if pkg.dev]
373+
add_pkgs = [pkg for pkg in pkgs if not pkg.dev]
351374
script = ["import Pkg", "Pkg.Registry.update()"]
352375
if dev_pkgs:
353-
script.append(f"Pkg.develop([{dev_pkgs}])")
376+
script.append("Pkg.develop([")
377+
for pkg in dev_pkgs:
378+
script.append(f" {pkg.jlstr()},")
379+
script.append("])")
354380
if add_pkgs:
355-
script.append(f"Pkg.add([{add_pkgs}])")
381+
script.append("Pkg.add([")
382+
for pkg in add_pkgs:
383+
script.append(f" {pkg.jlstr()},")
384+
script.append("])")
356385
script.append("Pkg.resolve()")
357386
script.append("Pkg.precompile()")
358387
log("Installing packages:")
359388
for line in script:
360-
log("julia>", line, cont=True)
389+
log(" ", line, cont=True)
361390
env = os.environ.copy()
362391
if sys.executable:
363392
# prefer PythonCall to use the current Python executable
@@ -370,7 +399,7 @@ def resolve(force=False, dry_run=False):
370399
"--project=" + project,
371400
"--startup-file=no",
372401
"-e",
373-
"; ".join(script),
402+
"\n".join(script),
374403
],
375404
check=True,
376405
env=env,

test/test_internals.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import juliapkg
2+
3+
4+
def test_openssl_compat():
5+
assert juliapkg.deps.openssl_compat((1, 2, 3)) == "1.2 - 1.2.3"
6+
assert juliapkg.deps.openssl_compat((2, 3, 4)) == "2.3 - 2.3.4"
7+
assert juliapkg.deps.openssl_compat((3, 0, 0)) == "3 - 3.0"
8+
assert juliapkg.deps.openssl_compat((3, 1, 0)) == "3 - 3.1"
9+
assert juliapkg.deps.openssl_compat((3, 1, 2)) == "3 - 3.1"
10+
assert isinstance(juliapkg.deps.openssl_compat(), str)

0 commit comments

Comments
 (0)