mirror of
https://github.com/pyscript/pyscript.git
synced 2026-05-13 16:00:04 -04:00
Use Promise.all to fetch files part of py-config (#1322)
This is a first step towards loading more stuff simultaneously rather than sequentially. The functional part of this is pretty small: call `calculateFetchPaths` and then `Promise.all(fetchPaths.map(loadFileFromURL));`. I also transposed the return type of `calculateFetchPaths` since it's more convenient to consume this way. I redid the logic in `calculateFetchPaths` a bit. I renamed `src/plugins/fetch.ts` to `calculateFetchPaths.ts` since the file performs no fetching. I also renamed `loadFromFile` to `loadFileFromURL`.
This commit is contained in:
@@ -1,55 +1,62 @@
|
||||
import { calculatePaths } from '../../src/plugins/fetch';
|
||||
import { calculateFetchPaths } from '../../src/plugins/calculateFetchPaths';
|
||||
import { FetchConfig } from '../../src/pyconfig';
|
||||
|
||||
describe('CalculateFetchPaths', () => {
|
||||
it('should calculate paths when only from is provided', () => {
|
||||
const fetch_cfg: FetchConfig[] = [{ from: 'http://a.com/data.csv' }];
|
||||
const [paths, fetchPaths] = calculatePaths(fetch_cfg);
|
||||
expect(paths).toStrictEqual(['./data.csv']);
|
||||
expect(fetchPaths).toStrictEqual(['http://a.com/data.csv']);
|
||||
const res = calculateFetchPaths(fetch_cfg);
|
||||
expect(res).toStrictEqual([{ url: 'http://a.com/data.csv', path: 'data.csv' }]);
|
||||
});
|
||||
|
||||
it('should calculate paths when only files is provided', () => {
|
||||
const fetch_cfg: FetchConfig[] = [{ files: ['foo/__init__.py', 'foo/mod.py'] }];
|
||||
const [paths, fetchPaths] = calculatePaths(fetch_cfg);
|
||||
expect(paths).toStrictEqual(['./foo/__init__.py', './foo/mod.py']);
|
||||
expect(fetchPaths).toStrictEqual(['foo/__init__.py', 'foo/mod.py']);
|
||||
const fetch_cfg: FetchConfig[] = [{ files: ['foo/__init__.py', 'foo/mod.py', 'foo2/mod.py'] }];
|
||||
const res = calculateFetchPaths(fetch_cfg);
|
||||
expect(res).toStrictEqual([
|
||||
{ url: 'foo/__init__.py', path: 'foo/__init__.py' },
|
||||
{ url: 'foo/mod.py', path: 'foo/mod.py' },
|
||||
{ url: 'foo2/mod.py', path: 'foo2/mod.py' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('should calculate paths when files and to_folder is provided', () => {
|
||||
const fetch_cfg: FetchConfig[] = [{ files: ['foo/__init__.py', 'foo/mod.py'], to_folder: '/my/lib/' }];
|
||||
const [paths, fetchPaths] = calculatePaths(fetch_cfg);
|
||||
expect(paths).toStrictEqual(['/my/lib/foo/__init__.py', '/my/lib/foo/mod.py']);
|
||||
expect(fetchPaths).toStrictEqual(['foo/__init__.py', 'foo/mod.py']);
|
||||
const res = calculateFetchPaths(fetch_cfg);
|
||||
expect(res).toStrictEqual([
|
||||
{ url: 'foo/__init__.py', path: '/my/lib/foo/__init__.py' },
|
||||
{ url: 'foo/mod.py', path: '/my/lib/foo/mod.py' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('should calculate paths when from and files and to_folder is provided', () => {
|
||||
const fetch_cfg: FetchConfig[] = [
|
||||
{ from: 'http://a.com/download/', files: ['foo/__init__.py', 'foo/mod.py'], to_folder: '/my/lib/' },
|
||||
];
|
||||
const [paths, fetchPaths] = calculatePaths(fetch_cfg);
|
||||
expect(paths).toStrictEqual(['/my/lib/foo/__init__.py', '/my/lib/foo/mod.py']);
|
||||
expect(fetchPaths).toStrictEqual(['http://a.com/download/foo/__init__.py', 'http://a.com/download/foo/mod.py']);
|
||||
const res = calculateFetchPaths(fetch_cfg);
|
||||
expect(res).toStrictEqual([
|
||||
{ url: 'http://a.com/download/foo/__init__.py', path: '/my/lib/foo/__init__.py' },
|
||||
{ url: 'http://a.com/download/foo/mod.py', path: '/my/lib/foo/mod.py' },
|
||||
]);
|
||||
});
|
||||
|
||||
it("should error out while calculating paths when filename cannot be determined from 'from'", () => {
|
||||
const fetch_cfg: FetchConfig[] = [{ from: 'http://google.com/', to_folder: '/tmp' }];
|
||||
expect(() => calculatePaths(fetch_cfg)).toThrowError(
|
||||
expect(() => calculateFetchPaths(fetch_cfg)).toThrowError(
|
||||
"Couldn't determine the filename from the path http://google.com/",
|
||||
);
|
||||
});
|
||||
|
||||
it('should calculate paths when to_file is explicitly supplied', () => {
|
||||
const fetch_cfg: FetchConfig[] = [{ from: 'http://a.com/data.csv?version=1', to_file: 'pkg/tmp/data.csv' }];
|
||||
const [paths, fetchPaths] = calculatePaths(fetch_cfg);
|
||||
expect(paths).toStrictEqual(['./pkg/tmp/data.csv']);
|
||||
expect(fetchPaths).toStrictEqual(['http://a.com/data.csv?version=1']);
|
||||
const res = calculateFetchPaths(fetch_cfg);
|
||||
expect(res).toStrictEqual([{ path: 'pkg/tmp/data.csv', url: 'http://a.com/data.csv?version=1' }]);
|
||||
});
|
||||
|
||||
it('should error out when both to_file and files parameters are provided', () => {
|
||||
const fetch_cfg: FetchConfig[] = [
|
||||
{ from: 'http://a.com/data.csv?version=1', to_file: 'pkg/tmp/data.csv', files: ['a.py', 'b.py'] },
|
||||
];
|
||||
expect(() => calculatePaths(fetch_cfg)).toThrowError("Cannot use 'to_file' and 'files' parameters together!");
|
||||
expect(() => calculateFetchPaths(fetch_cfg)).toThrowError(
|
||||
"Cannot use 'to_file' and 'files' parameters together!",
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user