mirror of
https://github.com/status-im/sourcecred.git
synced 2025-02-20 00:08:10 +00:00
Add nodeDescription
for GitHub nodes (#261)
`nodeDescription` gives a short, readable description of the content at a given node. Test plan: View the included snapshot test.
This commit is contained in:
parent
d21ad1312b
commit
ed1f17f8ca
@ -79,6 +79,17 @@ Object {
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
exports[`GitHub porcelain nodes have nice descriptions 1`] = `
|
||||||
|
Object {
|
||||||
|
"https://github.com/decentralion": "@decentralion",
|
||||||
|
"https://github.com/sourcecred/example-github/issues/2": "#2: A referencing issue.",
|
||||||
|
"https://github.com/sourcecred/example-github/issues/2#issuecomment-373768703": "comment by @decentralion on #2",
|
||||||
|
"https://github.com/sourcecred/example-github/pull/5": "#5: This pull request will be more contentious. I can feel it...",
|
||||||
|
"https://github.com/sourcecred/example-github/pull/5#discussion_r171460198": "review comment by @wchargin on #5",
|
||||||
|
"https://github.com/sourcecred/example-github/pull/5#pullrequestreview-100313899": "review by @wchargin on #5",
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
exports[`GitHub porcelain posts have authors 1`] = `
|
exports[`GitHub porcelain posts have authors 1`] = `
|
||||||
Object {
|
Object {
|
||||||
"https://github.com/sourcecred/example-github/issues/2": Array [
|
"https://github.com/sourcecred/example-github/issues/2": Array [
|
||||||
|
@ -24,6 +24,8 @@ import {
|
|||||||
PULL_REQUEST_REVIEW_COMMENT_NODE_TYPE,
|
PULL_REQUEST_REVIEW_COMMENT_NODE_TYPE,
|
||||||
} from "./types";
|
} from "./types";
|
||||||
|
|
||||||
|
import {nodeDescription} from "./render";
|
||||||
|
|
||||||
import {PLUGIN_NAME} from "./pluginName";
|
import {PLUGIN_NAME} from "./pluginName";
|
||||||
|
|
||||||
describe("GitHub porcelain", () => {
|
describe("GitHub porcelain", () => {
|
||||||
@ -331,4 +333,14 @@ describe("GitHub porcelain", () => {
|
|||||||
expect(referenced.login()).toBe("wchargin");
|
expect(referenced.login()).toBe("wchargin");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("nodes have nice descriptions", () => {
|
||||||
|
// This test really should be in its own file, but for expedience I am
|
||||||
|
// putting it here. TODO: Refactor general purpose testutils out of this
|
||||||
|
// file, and move this test to render.test.js (assuming we don't move the
|
||||||
|
// description method into the porcelain anyway...)
|
||||||
|
expectPropertiesToMatchSnapshot(allWrappers, (e) =>
|
||||||
|
nodeDescription(e.graph, e.address())
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
67
src/plugins/github/render.js
Normal file
67
src/plugins/github/render.js
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
// @flow
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Methods for rendering and displaying GitHub nodes.
|
||||||
|
*/
|
||||||
|
import stringify from "json-stable-stringify";
|
||||||
|
import {Graph} from "../../core/graph";
|
||||||
|
import type {Address} from "../../core/address";
|
||||||
|
import {
|
||||||
|
asEntity,
|
||||||
|
Issue,
|
||||||
|
PullRequest,
|
||||||
|
Comment,
|
||||||
|
PullRequestReview,
|
||||||
|
PullRequestReviewComment,
|
||||||
|
Author,
|
||||||
|
Repository,
|
||||||
|
} from "./porcelain";
|
||||||
|
|
||||||
|
/* Give a short description for the GitHub node at given address.
|
||||||
|
* Useful for e.g. displaying a title.
|
||||||
|
*/
|
||||||
|
export function nodeDescription(graph: Graph<any, any>, addr: Address) {
|
||||||
|
const entity = asEntity(graph, addr);
|
||||||
|
const type = entity.type();
|
||||||
|
switch (type) {
|
||||||
|
case "REPOSITORY": {
|
||||||
|
const repo = Repository.from(entity);
|
||||||
|
return `${repo.owner()}/${repo.name()}`;
|
||||||
|
}
|
||||||
|
case "ISSUE": {
|
||||||
|
const issue = Issue.from(entity);
|
||||||
|
return `#${issue.number()}: ${issue.title()}`;
|
||||||
|
}
|
||||||
|
case "PULL_REQUEST": {
|
||||||
|
const pr = PullRequest.from(entity);
|
||||||
|
return `#${pr.number()}: ${pr.title()}`;
|
||||||
|
}
|
||||||
|
case "COMMENT": {
|
||||||
|
const comment = Comment.from(entity);
|
||||||
|
const author = comment.authors()[0];
|
||||||
|
return `comment by @${author.login()} on #${comment.parent().number()}`;
|
||||||
|
}
|
||||||
|
case "PULL_REQUEST_REVIEW": {
|
||||||
|
const review = PullRequestReview.from(entity);
|
||||||
|
const author = review.authors()[0];
|
||||||
|
return `review by @${author.login()} on #${review.parent().number()}`;
|
||||||
|
}
|
||||||
|
case "PULL_REQUEST_REVIEW_COMMENT": {
|
||||||
|
const comment = PullRequestReviewComment.from(entity);
|
||||||
|
const author = comment.authors()[0];
|
||||||
|
const pr = comment.parent().parent();
|
||||||
|
return `review comment by @${author.login()} on #${pr.number()}`;
|
||||||
|
}
|
||||||
|
case "AUTHOR": {
|
||||||
|
const author = Author.from(entity);
|
||||||
|
return `@${author.login()}`;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
// eslint-disable-next-line no-unused-expressions
|
||||||
|
(type: empty);
|
||||||
|
throw new Error(
|
||||||
|
`Tried to write description for invalid type ${stringify(addr)}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user