-
Notifications
You must be signed in to change notification settings - Fork 246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: add support for bin-scripts (python only) #1941
Changes from 7 commits
b1547a2
aaf8d7e
7e9c9e2
a1a8847
66943e6
48ad9f5
dcfe863
d5edeb2
191650e
375147b
7ccdd96
db66ffd
122b17e
26b3a5b
2735e68
1d7ced4
f42d160
fc2ec7c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -9,6 +9,7 @@ import * as api from './api'; | |||||||||||||||||||||||||||||||||||||||||||||||||||
import { TOKEN_REF } from './api'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ObjectTable, tagJsiiConstructor } from './objects'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import * as wire from './serialization'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
import * as cp from 'child_process'; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
export class Kernel { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -66,24 +67,11 @@ export class Kernel { | |||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.installDir) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
this.installDir = fs.mkdtempSync(path.join(os.tmpdir(), 'jsii-kernel-')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.mkdirpSync(path.join(this.installDir, 'node_modules')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
this._debug('creating jsii-kernel modules workdir:', this.installDir); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
process.on('exit', () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.installDir) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
this._debug('removing install dir', this.installDir); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.removeSync(this.installDir); // can't use async version during exit | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const pkgname = req.name; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const pkgver = req.version; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
// check if we already have such a module | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const packageDir = path.join(this.installDir, 'node_modules', pkgname); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const packageDir = this._getPackageDir(pkgname); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if (fs.pathExistsSync(packageDir)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
// module exists, verify version | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const epkg = fs.readJsonSync(path.join(packageDir, 'package.json')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -148,6 +136,45 @@ export class Kernel { | |||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
public invokeBinScript( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
req: api.InvokeScriptRequest, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
): api.InvokeScriptResponse { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const packageDir = this._getPackageDir(req.assembly); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if (fs.pathExistsSync(packageDir)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
// module exists, verify version | ||||||||||||||||||||||||||||||||||||||||||||||||||||
const epkg = fs.readJsonSync(path.join(packageDir, 'package.json')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!epkg.bin) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error('There is no bin scripts defined for this package.'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const scriptPath = epkg.bin[req.script]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!epkg.bin) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error(`Script with name ${req.script} was not defined.`); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
const result = cp.spawnSync( | ||||||||||||||||||||||||||||||||||||||||||||||||||||
process.execPath, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
[ | ||||||||||||||||||||||||||||||||||||||||||||||||||||
...process.execArgv, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
'--', | ||||||||||||||||||||||||||||||||||||||||||||||||||||
path.join(packageDir, scriptPath), | ||||||||||||||||||||||||||||||||||||||||||||||||||||
...(req.args ?? []), | ||||||||||||||||||||||||||||||||||||||||||||||||||||
], | ||||||||||||||||||||||||||||||||||||||||||||||||||||
{ encoding: 'utf-8' }, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The script might not be a node script (could be bash, etc...), so this feels a little unsafe.
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
stdout: result.stdout, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
stderr: result.stderr, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
status: result.status, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
signal: result.signal, | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
throw new Error(`Package with name ${req.assembly} was not loaded.`); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
public create(req: api.CreateRequest): api.CreateResponse { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return this._create(req); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -494,6 +521,22 @@ export class Kernel { | |||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
private _getPackageDir(pkgname: string): string { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if (!this.installDir) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
this.installDir = fs.mkdtempSync(path.join(os.tmpdir(), 'jsii-kernel-')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.mkdirpSync(path.join(this.installDir, 'node_modules')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
this._debug('creating jsii-kernel modules workdir:', this.installDir); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
process.on('exit', () => { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
if (this.installDir) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
this._debug('removing install dir', this.installDir); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.removeSync(this.installDir); // can't use async version during exit | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
}); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
return path.join(this.installDir, 'node_modules', pkgname); | ||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
// prefixed with _ to allow calling this method internally without | ||||||||||||||||||||||||||||||||||||||||||||||||||||
// getting it recorded for testing. | ||||||||||||||||||||||||||||||||||||||||||||||||||||
private _create(req: api.CreateRequest): api.CreateResponse { | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2133,6 +2133,15 @@ defineTest('Override transitive property', (sandbox) => { | |
expect(propValue).toBe('N3W'); | ||
}); | ||
|
||
defineTest('invokeBinScript() return output', (sandbox) => { | ||
const result = sandbox.invokeBinScript({ | ||
assembly: 'jsii-calc', | ||
script: 'calc', | ||
}); | ||
|
||
expect(result.stdout).toEqual('Hello World!\n'); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You probably should also asset the value of |
||
}); | ||
|
||
// ================================================================================================= | ||
|
||
const testNames: { [name: string]: boolean } = {}; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -85,6 +85,7 @@ | |
from scope.jsii_calc_lib import IFriendly, EnumFromScopedModule, Number | ||
from scope.jsii_calc_lib.custom_submodule_name import IReflectable, ReflectableEntry | ||
|
||
from subprocess import Popen, PIPE, STDOUT | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That doesn't appear to be necessary. |
||
|
||
# Note: The names of these test functions have been chosen to map as closely to the | ||
# Java Compliance tests as possible. | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
#!/usr/bin/env node | ||
require('./calc.js'); |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
#!/usr/bin/env node | ||
|
||
/* eslint-disable no-console */ | ||
|
||
console.info('Hello World!'); |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,9 @@ | |
], | ||
"url": "https://aws.amazon.com" | ||
}, | ||
"bin": { | ||
"calc": "bin/calc" | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Might be interesting to rename For example, you could call it There's also a chance this does not test fine on Windows (because Windows is hard 🤓). In such cases you'd need to drop in a CMD entry point (I'll give you more info on this once we know this is necessary, hopefully it won't be). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good idea. |
||
}, | ||
"bundled": { | ||
"@fixtures/jsii-calc-bundled": "^0.19.0" | ||
}, | ||
|
@@ -14229,5 +14232,5 @@ | |
} | ||
}, | ||
"version": "0.0.0", | ||
"fingerprint": "azqNkkl+/4FLzTVBLkOyHcokS4xLoYtHsri0z9kIehQ=" | ||
"fingerprint": "QHc8YZS13IljwCQpg6AZlBxIZvkAbfnCFh6Vi+e0Cgg=" | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.