Skip to content
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

Dependency checks and environment setup assistance #55

Merged
merged 68 commits into from
Jul 22, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
2d28b57
Start dependency checking system.
petervdonovan May 20, 2022
656a3ca
Refactor extension.ts.
petervdonovan May 20, 2022
a23aef9
[tests] Get integration tests up and running.
petervdonovan May 24, 2022
7414b99
[style] Minor cleanups.
petervdonovan May 24, 2022
34a765c
[tests] Various bugfixes.
petervdonovan May 24, 2022
16ae135
Track debug configurations.
petervdonovan May 24, 2022
e3667d2
[CI] Set up tests in CI.
petervdonovan May 24, 2022
94c041e
[style] Minor cleanup.
petervdonovan May 27, 2022
e6b1ef7
[tests] Distinguish between basic and semi-optional dependencies.
petervdonovan May 27, 2022
82fbd71
[tests] Check that check for Python works.
petervdonovan May 27, 2022
5a6a002
[style] Cleanups.
petervdonovan May 27, 2022
6870c4c
Add Node dependency checking logic.
petervdonovan May 27, 2022
ed96e72
[tests] Do not bother with deleting dependencies.
petervdonovan May 28, 2022
68807f5
Add PNPM dependency checking logic.
petervdonovan May 28, 2022
abdd695
[CI] Reorganize a bit.
petervdonovan May 28, 2022
3654080
[CI] Workaround a quirk of PNPM installation.
petervdonovan May 30, 2022
290c410
[tests] Update debug configuration.
petervdonovan May 30, 2022
cb9d7fb
[dependencies] Bugfix.
petervdonovan May 30, 2022
abb1db3
Update submodule.
petervdonovan May 31, 2022
a26a009
[dependencies] Hook dependency checks into the UI.
petervdonovan May 30, 2022
64c4f6e
Give up checking if PNPM is installed.
petervdonovan Jun 2, 2022
802a40b
[CI] Delete Python in MacOS.
petervdonovan Jun 2, 2022
758671f
[dependencies] Add Rust version checker.
petervdonovan Jun 14, 2022
7005bee
[build] Separate npm install from build LDS.
petervdonovan Jun 14, 2022
eeba86b
Merge branch 'main' of https://github.com/lf-lang/vscode-lingua-franc…
petervdonovan Jun 14, 2022
3a13cf2
Update submodule.
petervdonovan Jun 14, 2022
10d2853
Merge branch 'main' into check-versions
petervdonovan Jun 14, 2022
29ee078
Update CI.yml.
petervdonovan Jun 14, 2022
f0ca034
Bugfix.
petervdonovan Jun 14, 2022
22e0f0b
[dependencies] The Rust install script is interactive.
petervdonovan Jun 14, 2022
a9971b0
[dependencies] Remove Rust if OS is MacOS.
petervdonovan Jun 14, 2022
c9990b2
[dependencies] Add check for cmake.
petervdonovan Jun 14, 2022
cb80001
[CI] MacOS does not permit removal of python3.
petervdonovan Jun 14, 2022
127aca0
[CI] MacOS apparently forbids removal of Java.
petervdonovan Jun 14, 2022
9e5c536
[dependencies] Set a minimum Rust version.
petervdonovan Jun 14, 2022
c2669c9
[dependencies] `python` may point to `python3`.
petervdonovan Jun 14, 2022
dc25309
[dependencies] Update dependency watcher registry.
petervdonovan Jun 14, 2022
87cfbe0
[dependencies] Offer to install Node.
petervdonovan Jun 14, 2022
a23037a
[CI] Do not download useless version history.
petervdonovan Jun 15, 2022
a0b064f
[dependencies] Bugfix.
petervdonovan Jun 15, 2022
0974227
[tests] More precisely specify what is on PATH.
petervdonovan Jun 15, 2022
827589e
[tests] Give up testing Node install in MacOS.
petervdonovan Jun 15, 2022
ef5da92
[tests] Give up testing Node install at all.
petervdonovan Jun 15, 2022
cc0a43b
[dependencies] openExternal function breaks CI.
petervdonovan Jun 15, 2022
b44351b
[dependencies] Check for RTI if appropriate.
petervdonovan Jun 16, 2022
d046ec5
[tests] Do not skip Python, Java dependency tests.
petervdonovan Jun 16, 2022
f77c309
[CI] Address CI failures.
petervdonovan Jun 16, 2022
968a838
[CI] Cleanups.
petervdonovan Jun 16, 2022
40ac333
[dependencies] Cleanups.
petervdonovan Jun 16, 2022
ccebe4b
[dependencies] Superficial UI improvements.
petervdonovan Jun 16, 2022
2e7738b
[dependencies] Add update commands.
petervdonovan Jun 16, 2022
9770aa8
[dependencies] Add back Rust installer.
petervdonovan Jun 16, 2022
53d2662
[dependencies] Improve "wrong version" messages.
petervdonovan Jun 16, 2022
d0539ce
[dependencies] Reduce redundancy.
petervdonovan Jun 16, 2022
ed77389
[tests] "Fix" a nondeterministic test.
petervdonovan Jun 17, 2022
1a3e278
[dependencies] Cleanups and a bugfix.
petervdonovan Jun 17, 2022
90a73e1
[dependencies] Refactor.
petervdonovan Jun 17, 2022
c1d1cfb
[dependencies] Another UI change.
petervdonovan Jun 17, 2022
d807980
[tests] Check that hyperlinks are not broken.
petervdonovan Jun 17, 2022
846778d
[build] Add back `npm install` script.
petervdonovan Jun 17, 2022
bcb99d7
[build] Bring back install-code.
petervdonovan Jun 17, 2022
e204452
[tests] Add tests for update commands.
petervdonovan Jun 18, 2022
56d0cd6
Merge branch 'main' into check-versions
petervdonovan Jul 16, 2022
86c7f35
Update src/version_checker.ts
petervdonovan Jul 16, 2022
a2c5860
Repair regexes.
petervdonovan Jul 21, 2022
9687328
Address comments from code review.
petervdonovan Jul 21, 2022
9ad2d80
Update LF submodule.
petervdonovan Jul 22, 2022
8294e4a
Bugfix.
petervdonovan Jul 22, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[tests] Various bugfixes.
  • Loading branch information
petervdonovan committed May 24, 2022
commit 34a765cee27b732b09ad0ecce13afca5e91af174
6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,9 @@
"build": "npx ts-node src/build_lds.ts",
"deploy": "vsce package && code --install-extension vscode-lingua-franca-*.vsix",
"install": "npm run build && npm run deploy",
"test": "npx tsc --outDir out/test --inlineSourceMap && node ./out/test/test/test_runner.js --dependencies=present",
"test:watch": "jest --watch"
"compile-tests": "npx tsc --outDir out/test --inlineSourceMap",
"test": "npm run compile-tests && node ./out/test/test/test_runner.js --dependencies=present",
"test-dependencies-outdated": "npm run compile-tests && node ./out/test/test/test_runner.js --dependencies=outdated",
"test-dependencies-missing": "npm run compile-tests && node ./out/test/test/test_runner.js --dependencies=missing"
}
}
2 changes: 1 addition & 1 deletion src/check_dependencies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ const checkDependency: UserFacingVersionCheckerMaker = (missingDependency: Missi
(messageShower: MessageShower) => async () => {
const checkerResult = await missingDependency.checker();
if (checkerResult.isCorrect) return true;
const message: string = !checkerResult.isCorrect ? (
const message: string = checkerResult.isCorrect === false ? (
missingDependency.wrongVersionMessage ?? missingDependency.message
) : missingDependency.message;
if (!missingDependency.installCommand && !missingDependency.installLink) {
Expand Down
72 changes: 40 additions & 32 deletions src/test/check_dependencies.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import spies from 'chai-spies';
import { expect } from 'chai';
import { after } from 'mocha';
import { MessageShower } from '../utils';
import { Config } from '../config';

chai.use(spies);

Expand All @@ -29,51 +30,58 @@ suite('test dependency checking', () => {
);
})();

const getMockMessageShower = () => {
const fn = (message: string, ...items: string[]) => Promise.resolve('');
return { mockMessageShower: fn, spy: chai.spy(fn) }
type Spy = ChaiSpies.SpyFunc1Proxy<string, Thenable<string>>;

function getMockMessageShower(): Spy {
const mock: MessageShower = (message: string, ...items: string[]) => Promise.resolve('');
return chai.spy(mock);
};
const expectSuccess = async (checker: UserFacingVersionChecker, mockMessageShower: MessageShower, spy) => {
expect(await checker(mockMessageShower)()).to.be.true;

const expectSuccess = async (checker: UserFacingVersionChecker, spy: Spy) => {
expect(await checker(spy)()).to.be.true;
expect(spy).not.to.have.been.called;
};
const expectFailure = async (checker: UserFacingVersionChecker, mockMessageShower: MessageShower, spy) => {
expect(await checker(mockMessageShower)()).to.be.false;
const expectFailure = async (checker: UserFacingVersionChecker, spy: Spy) => {
expect(await checker(spy)()).to.be.false;
expect(spy).to.have.been.called;
expect(spy.arguments.join()).to.contain('Install');
};

test('java', () => {
const { mockMessageShower, spy } = getMockMessageShower();
test('java', async () => {
const spy = getMockMessageShower();
switch (dependencies) {
case Dependencies.Present:
expectSuccess(checkJava, mockMessageShower, spy);
await expectSuccess(checkJava, spy);
break;
case Dependencies.Missing:
case Dependencies.Outdated:
expectFailure(checkJava, mockMessageShower, spy);
expect(spy.arguments.join()).to.contain('Java');
await expectFailure(checkJava, spy);
expect(spy).to.have.been.called.with(
`Java version ${Config.javaVersion.major} is required for Lingua Franca diagrams `
+ `and code analysis.`
);
break;
}
});

// it('pylint', () => {
// const mockMessageShower = getMockMessageShower();
// switch (dependencies) {
// case Dependencies.Present:
// expectSuccess(checkPylint, mockMessageShower);
// break;
// case Dependencies.Missing:
// expectFailure(checkPylint, mockMessageShower);
// expect(mockMessageShower.mock.calls[0][0])
// .toEqual(expect.stringContaining('recommended'));
// break;
// case Dependencies.Outdated:
// expectFailure(checkPylint, mockMessageShower);
// expect(mockMessageShower.mock.calls[0][0])
// .toEqual(expect.stringContaining('version'));
// break;
// }
// });
test('pylint', async () => {
const spy = getMockMessageShower();
switch (dependencies) {
case Dependencies.Present:
await expectSuccess(checkPylint, spy);
break;
case Dependencies.Missing:
await expectFailure(checkPylint, spy);
expect(spy).to.have.been.called.with(
`Pylint is a recommended linter for Lingua Franca's Python target.`
);
break;
case Dependencies.Outdated:
await expectFailure(checkPylint, spy);
expect(spy).to.have.been.called.with(
`The Lingua Franca language server is tested with Pylint version `
+ `${Config.pylintVersion.major}.${Config.pylintVersion.minor} and newer.`
);
break;
}
});
});
25 changes: 16 additions & 9 deletions src/version_checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ export type VersionCheckResult = {

export type VersionChecker = () => Promise<VersionCheckResult>;

type VersionCheckerMaker = (command: string, sameMajor: boolean) => VersionChecker
type VersionCheckerMaker = (desiredVersion: Version, command: string, sameMajor: boolean) =>
VersionChecker

/**
* Create a basic version checker. Note that this assumes that the first valid version number
Expand All @@ -20,19 +21,25 @@ type VersionCheckerMaker = (command: string, sameMajor: boolean) => VersionCheck
* other text.
* @returns A VersionChecker that checks the desired version number.
*/
const basicVersionChecker: VersionCheckerMaker = (command, sameMajor) => async () => {
const {stdout} = await runCmd(command);
const basicVersionChecker: VersionCheckerMaker = (desiredVersion, command, sameMajor) => async () => {
const nullResult = { version: new Version('0.0.0'), isCorrect: null };
let stdout: string;
try {
stdout = (await runCmd(command)).stdout;
} catch (error) {
return nullResult;
}
const found = stdout.match(Version.regex);
if (found === null) return { version: new Version('0.0.0'), isCorrect: null };
if (found === null) return nullResult;
const version = new Version(stdout);
return {
version: version,
isCorrect: version.isAtLeast(Config.javaVersion) && (
!sameMajor || version.isCompatibleWith(Config.javaVersion)
isCorrect: version.isAtLeast(desiredVersion) && (
!sameMajor || version.isCompatibleWith(desiredVersion)
)
};
}

export const javaVersionChecker: VersionChecker = basicVersionChecker('java --version', true);
export const javacVersionChecker: VersionChecker = basicVersionChecker('javac --version', true);
export const pylintVersionChecker: VersionChecker = basicVersionChecker('pylint --version', false);
export const javaVersionChecker: VersionChecker = basicVersionChecker(Config.javaVersion, 'java --version', true);
export const javacVersionChecker: VersionChecker = basicVersionChecker(Config.javacVersion, 'javac --version', true);
export const pylintVersionChecker: VersionChecker = basicVersionChecker(Config.pylintVersion, 'pylint --version', false);