Skip to content

Commit f27b51c

Browse files
authored
Merge pull request #60 from Distributive-Network/Xmader/feat/pm.require
Add a globally-available `pm.require` that gets the caller’s filename from the Python call stack
2 parents b11532d + 65d8bae commit f27b51c

File tree

5 files changed

+19
-11
lines changed

5 files changed

+19
-11
lines changed

examples/use-python-module.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@
55

66
import pythonmonkey as pm
77

8-
require = pm.createRequire(__file__)
9-
require('./use-python-module');
8+
pm.require('./use-python-module');

examples/use-require.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import pythonmonkey as pm
77

8-
require = pm.createRequire(__file__)
9-
require('./use-require/test1');
8+
pm.require('./use-require/test1');
109
print("Done")
1110

js-test-runner

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import sys, os
88
import pythonmonkey as pm
99

1010
# Main
11-
require = pm.createRequire(__file__)
12-
require('console');
11+
pm.require('console');
1312

1413
testName = os.path.realpath(sys.argv[1]);
1514
testDir = os.path.dirname(testName);

pmjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import pythonmonkey as pm
88

99
globalThis = pm.eval("globalThis;")
1010
globalThis.python.write = sys.stdout.write
11-
pm.createRequire(__file__)('./pmjs-require')
11+
pm.require('./pmjs-require')
1212

1313
pm.eval("""'use strict';
1414
const cmds = {};

python/pythonmonkey/require.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@
2323
# @date May 2023
2424
#
2525

26-
import sys, os, types
27-
from typing import Union, Dict, Callable
26+
import sys, os
27+
from typing import Union, Dict
2828
import importlib
2929
from importlib import machinery
30-
from importlib import util
30+
import inspect
31+
import functools
3132

3233
from . import pythonmonkey as pm
3334

@@ -223,7 +224,9 @@ def load(filename: str) -> Dict:
223224
require = createRequire(__file__)
224225
require('./my-javascript-module')
225226
"""
226-
def createRequire(filename):
227+
# We cache the return value of createRequire to always use the same require for the same filename
228+
@functools.lru_cache(maxsize=None) # unbounded function cache that won't remove any old values
229+
def createRequire(filename: str):
227230
createRequireInner = pm.eval("""'use strict';(
228231
function createRequire(filename, bootstrap_broken)
229232
{
@@ -245,3 +248,11 @@ def createRequire(filename):
245248
return module.require;
246249
})""")
247250
return createRequireInner(filename)
251+
252+
def require(moduleIdentifier: str):
253+
# Retrieve the caller’s filename from the call stack
254+
filename = inspect.stack()[1].filename
255+
# From the REPL, the filename is "<stdin>", which is not a valid path
256+
if not os.path.exists(filename):
257+
filename = os.path.join(os.getcwd(), "__main__") # use the CWD instead
258+
return createRequire(filename)(moduleIdentifier)

0 commit comments

Comments
 (0)