Add `analysisAdapter` (#950)
For #704, we're adding plugin adapters that are specific to the needs of the analysis module. They have a simple scope: they just provide a way to get the declaration, and to load the corresponding graph. Adapters for the `git` and `github` plugins have been implemented, along with unit tests. Test plan: `yarn test` suffices.
This commit is contained in:
parent
1db146ba70
commit
b86b0b32ec
|
@ -0,0 +1,10 @@
|
|||
// @flow
|
||||
|
||||
import {Graph} from "../core/graph";
|
||||
import type {RepoId} from "../core/repoId";
|
||||
import type {PluginDeclaration} from "./pluginDeclaration";
|
||||
|
||||
export interface IAnalysisAdapter {
|
||||
declaration(): PluginDeclaration;
|
||||
load(sourcecredDirectory: string, repoId: RepoId): Promise<Graph>;
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
// @flow
|
||||
|
||||
import fs from "fs-extra";
|
||||
import path from "path";
|
||||
import {Graph} from "../../core/graph";
|
||||
import type {IAnalysisAdapter} from "../../analysis/analysisAdapter";
|
||||
import {type RepoId, repoIdToString} from "../../core/repoId";
|
||||
import {declaration} from "./declaration";
|
||||
|
||||
export class AnalysisAdapter implements IAnalysisAdapter {
|
||||
declaration() {
|
||||
return declaration;
|
||||
}
|
||||
async load(sourcecredDirectory: string, repoId: RepoId): Promise<Graph> {
|
||||
const file = path.join(
|
||||
sourcecredDirectory,
|
||||
"data",
|
||||
repoIdToString(repoId),
|
||||
"git",
|
||||
"graph.json"
|
||||
);
|
||||
const rawData = await fs.readFile(file);
|
||||
const json = JSON.parse(rawData.toString());
|
||||
return Graph.fromJSON(json);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
// @flow
|
||||
|
||||
import fs from "fs-extra";
|
||||
import path from "path";
|
||||
import {AnalysisAdapter} from "./analysisAdapter";
|
||||
import {stringToRepoId} from "../../core/repoId";
|
||||
import {declaration} from "./declaration";
|
||||
import {Graph} from "../../core/graph";
|
||||
|
||||
describe("plugins/git/analysisAdapter", () => {
|
||||
it("provides the declaration", () => {
|
||||
const aa = new AnalysisAdapter();
|
||||
expect(aa.declaration()).toEqual(declaration);
|
||||
});
|
||||
it("loads the Git graph", async () => {
|
||||
const sourcecredDirectory = path.join(
|
||||
"sharness",
|
||||
"__snapshots__",
|
||||
"example-github-load"
|
||||
);
|
||||
const expectedPath = path.join(
|
||||
sourcecredDirectory,
|
||||
"data",
|
||||
"sourcecred",
|
||||
"example-github",
|
||||
"git",
|
||||
"graph.json"
|
||||
);
|
||||
const expectedGraphBuffer: Buffer = await fs.readFile(expectedPath);
|
||||
const expectedGraphJSON = JSON.parse(expectedGraphBuffer.toString());
|
||||
const expectedGraph = Graph.fromJSON(expectedGraphJSON);
|
||||
const aa = new AnalysisAdapter();
|
||||
const actualGraph = await aa.load(
|
||||
sourcecredDirectory,
|
||||
stringToRepoId("sourcecred/example-github")
|
||||
);
|
||||
expect(actualGraph.equals(expectedGraph)).toBe(true);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,30 @@
|
|||
// @flow
|
||||
|
||||
import fs from "fs-extra";
|
||||
import path from "path";
|
||||
import pako from "pako";
|
||||
import {type RepoId, repoIdToString} from "../../core/repoId";
|
||||
import {Graph} from "../../core/graph";
|
||||
import type {IAnalysisAdapter} from "../../analysis/analysisAdapter";
|
||||
import {declaration} from "./declaration";
|
||||
import {RelationalView} from "./relationalView";
|
||||
import {createGraph} from "./createGraph";
|
||||
|
||||
export class AnalysisAdapter implements IAnalysisAdapter {
|
||||
declaration() {
|
||||
return declaration;
|
||||
}
|
||||
async load(sourcecredDirectory: string, repoId: RepoId): Promise<Graph> {
|
||||
const file = path.join(
|
||||
sourcecredDirectory,
|
||||
"data",
|
||||
repoIdToString(repoId),
|
||||
"github",
|
||||
"view.json.gz"
|
||||
);
|
||||
const compressedData = await fs.readFile(file);
|
||||
const json = JSON.parse(pako.ungzip(compressedData, {to: "string"}));
|
||||
const view = RelationalView.fromJSON(json);
|
||||
return createGraph(view);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
// @flow
|
||||
|
||||
import fs from "fs-extra";
|
||||
import path from "path";
|
||||
import pako from "pako";
|
||||
import {AnalysisAdapter} from "./analysisAdapter";
|
||||
import {stringToRepoId} from "../../core/repoId";
|
||||
import {declaration} from "./declaration";
|
||||
import {RelationalView} from "./relationalView";
|
||||
import {createGraph} from "./createGraph";
|
||||
|
||||
describe("plugins/github/analysisAdapter", () => {
|
||||
it("provides the declaration", () => {
|
||||
const aa = new AnalysisAdapter();
|
||||
expect(aa.declaration()).toEqual(declaration);
|
||||
});
|
||||
it("loads the GitHub graph", async () => {
|
||||
const sourcecredDirectory = path.join(
|
||||
"sharness",
|
||||
"__snapshots__",
|
||||
"example-github-load"
|
||||
);
|
||||
const expectedPath = path.join(
|
||||
sourcecredDirectory,
|
||||
"data",
|
||||
"sourcecred",
|
||||
"example-github",
|
||||
"github",
|
||||
"view.json.gz"
|
||||
);
|
||||
const blob = await fs.readFile(expectedPath);
|
||||
const json = JSON.parse(pako.ungzip(blob, {to: "string"}));
|
||||
const view = RelationalView.fromJSON(json);
|
||||
const graph = createGraph(view);
|
||||
const aa = new AnalysisAdapter();
|
||||
const actualGraph = await aa.load(
|
||||
sourcecredDirectory,
|
||||
stringToRepoId("sourcecred/example-github")
|
||||
);
|
||||
expect(actualGraph.equals(graph)).toBe(true);
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue