Skip to content

Commit 26b6023

Browse files
authored
Extract external api usage name component and reuse it (#2765)
1 parent e61f619 commit 26b6023

File tree

8 files changed

+99
-32
lines changed

8 files changed

+99
-32
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import * as React from "react";
2+
3+
import { Meta, StoryFn } from "@storybook/react";
4+
5+
import { ExternalApiUsageName as ExternalApiUsageNameComponent } from "../../view/model-editor/ExternalApiUsageName";
6+
import { createExternalApiUsage } from "../../../test/factories/data-extension/external-api-factories";
7+
8+
export default {
9+
title: "CodeQL Model Editor/External API Usage Name",
10+
component: ExternalApiUsageNameComponent,
11+
} as Meta<typeof ExternalApiUsageNameComponent>;
12+
13+
const Template: StoryFn<typeof ExternalApiUsageNameComponent> = (args) => (
14+
<ExternalApiUsageNameComponent {...args} />
15+
);
16+
17+
export const ExternalApiUsageName = Template.bind({});
18+
ExternalApiUsageName.args = createExternalApiUsage();

extensions/ql-vscode/src/view/method-modeling/MethodModeling.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import {
44
ModelingStatus,
55
ModelingStatusIndicator,
66
} from "../model-editor/ModelingStatusIndicator";
7+
import { ExternalApiUsage } from "../../model-editor/external-api-usage";
8+
import { ExternalApiUsageName } from "../model-editor/ExternalApiUsageName";
79

810
const Container = styled.div`
911
background-color: var(--vscode-peekViewResult-background);
@@ -21,21 +23,20 @@ const DependencyContainer = styled.div`
2123
justify-content: space-between;
2224
`;
2325

24-
const DependencyName = styled.span`
25-
font-family: var(--vscode-editor-font-family);
26-
`;
27-
2826
export type MethodModelingProps = {
2927
modelingStatus: ModelingStatus;
28+
externalApiUsage: ExternalApiUsage;
3029
};
3130

32-
export const MethodModeling = (props: MethodModelingProps) => {
33-
const { modelingStatus } = props;
31+
export const MethodModeling = ({
32+
modelingStatus,
33+
externalApiUsage,
34+
}: MethodModelingProps): JSX.Element => {
3435
return (
3536
<Container>
3637
<Title>API or Method</Title>
3738
<DependencyContainer>
38-
<DependencyName>that.dependency.THENAME</DependencyName>
39+
<ExternalApiUsageName {...externalApiUsage} />
3940
<ModelingStatusIndicator status={modelingStatus} />
4041
</DependencyContainer>
4142
</Container>

extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as React from "react";
22
import { useEffect } from "react";
33
import { MethodModeling } from "./MethodModeling";
44
import { ModelingStatus } from "../model-editor/ModelingStatusIndicator";
5+
import { ExternalApiUsage } from "../../model-editor/external-api-usage";
56

67
export function MethodModelingView(): JSX.Element {
78
useEffect(() => {
@@ -22,5 +23,22 @@ export function MethodModelingView(): JSX.Element {
2223
}, []);
2324

2425
const modelingStatus: ModelingStatus = "saved";
25-
return <MethodModeling modelingStatus={modelingStatus} />;
26+
const externalApiUsage: ExternalApiUsage = {
27+
library: "sql2o",
28+
libraryVersion: "1.6.0",
29+
signature: "org.sql2o.Connection#createQuery(String)",
30+
packageName: "org.sql2o",
31+
typeName: "Connection",
32+
methodName: "createQuery",
33+
methodParameters: "(String)",
34+
supported: true,
35+
supportedType: "summary",
36+
usages: [],
37+
};
38+
return (
39+
<MethodModeling
40+
modelingStatus={modelingStatus}
41+
externalApiUsage={externalApiUsage}
42+
/>
43+
);
2644
}
Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
import * as React from "react";
22
import { render as reactRender, screen } from "@testing-library/react";
33
import { MethodModeling, MethodModelingProps } from "../MethodModeling";
4+
import { createExternalApiUsage } from "../../../../test/factories/data-extension/external-api-factories";
45

56
describe(MethodModeling.name, () => {
67
const render = (props: MethodModelingProps) =>
78
reactRender(<MethodModeling {...props} />);
89

9-
it("renders method name", () => {
10-
render({ modelingStatus: "saved" });
10+
it("renders method modeling panel", () => {
11+
render({
12+
modelingStatus: "saved",
13+
externalApiUsage: createExternalApiUsage(),
14+
});
1115

12-
expect(screen.getByText("that.dependency.THENAME")).toBeInTheDocument();
16+
expect(screen.getByText("API or Method")).toBeInTheDocument();
1317
});
1418
});
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as React from "react";
2+
import { styled } from "styled-components";
3+
import { ExternalApiUsage } from "../../model-editor/external-api-usage";
4+
5+
const Name = styled.span`
6+
font-family: var(--vscode-editor-font-family);
7+
`;
8+
9+
export const ExternalApiUsageName = (
10+
externalApiUsage: ExternalApiUsage,
11+
): JSX.Element => {
12+
return (
13+
<Name>
14+
{externalApiUsage.packageName && <>{externalApiUsage.packageName}.</>}
15+
{externalApiUsage.typeName}.{externalApiUsage.methodName}
16+
{externalApiUsage.methodParameters}
17+
</Name>
18+
);
19+
};

extensions/ql-vscode/src/view/model-editor/MethodRow.tsx

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
ModelingStatusIndicator,
2626
} from "./ModelingStatusIndicator";
2727
import { InProgressDropdown } from "./InProgressDropdown";
28+
import { ExternalApiUsageName } from "./ExternalApiUsageName";
2829

2930
const ApiOrMethodCell = styled(VSCodeDataGridCell)`
3031
display: flex;
@@ -218,7 +219,7 @@ function ModelableMethodRow(props: Props) {
218219
<ApiOrMethodCell gridColumn={1}>
219220
<ModelingStatusIndicator status={modelingStatus} />
220221
<MethodClassifications externalApiUsage={externalApiUsage} />
221-
<ExternalApiUsageName {...props} />
222+
<ExternalApiUsageName {...props.externalApiUsage} />
222223
{mode === Mode.Application && (
223224
<UsagesButton onClick={jumpToUsage}>
224225
{externalApiUsage.usages.length}
@@ -294,7 +295,7 @@ function UnmodelableMethodRow(props: Props) {
294295
<VSCodeDataGridRow>
295296
<ApiOrMethodCell gridColumn={1}>
296297
<ModelingStatusIndicator status="saved" />
297-
<ExternalApiUsageName {...props} />
298+
<ExternalApiUsageName {...props.externalApiUsage} />
298299
{mode === Mode.Application && (
299300
<UsagesButton onClick={jumpToUsage}>
300301
{externalApiUsage.usages.length}
@@ -310,18 +311,6 @@ function UnmodelableMethodRow(props: Props) {
310311
);
311312
}
312313

313-
function ExternalApiUsageName(props: { externalApiUsage: ExternalApiUsage }) {
314-
return (
315-
<span>
316-
{props.externalApiUsage.packageName && (
317-
<>{props.externalApiUsage.packageName}.</>
318-
)}
319-
{props.externalApiUsage.typeName}.{props.externalApiUsage.methodName}
320-
{props.externalApiUsage.methodParameters}
321-
</span>
322-
);
323-
}
324-
325314
function sendJumpToUsageMessage(externalApiUsage: ExternalApiUsage) {
326315
vscode.postMessage({
327316
t: "jumpToUsage",
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import * as React from "react";
2+
import { render as reactRender, screen } from "@testing-library/react";
3+
import { ExternalApiUsageName } from "../ExternalApiUsageName";
4+
import { ExternalApiUsage } from "../../../model-editor/external-api-usage";
5+
import { createExternalApiUsage } from "../../../../test/factories/data-extension/external-api-factories";
6+
7+
describe(ExternalApiUsageName.name, () => {
8+
const render = (props: ExternalApiUsage) =>
9+
reactRender(<ExternalApiUsageName {...props} />);
10+
11+
it("renders method name", () => {
12+
const apiUsage = createExternalApiUsage();
13+
render(apiUsage);
14+
15+
const name = `${apiUsage.packageName}.${apiUsage.typeName}.${apiUsage.methodName}${apiUsage.methodParameters}`;
16+
expect(screen.getByText(name)).toBeInTheDocument();
17+
});
18+
});

extensions/ql-vscode/test/factories/data-extension/external-api-factories.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import { ModeledMethodType } from "../../../src/model-editor/modeled-method";
77
import { ResolvableLocationValue } from "../../../src/common/bqrs-cli-types";
88

99
export function createExternalApiUsage({
10-
library = "test",
10+
library = "sql2o-1.6.0.jar",
1111
supported = true,
12-
supportedType = "none" as ModeledMethodType,
12+
supportedType = "summary" as ModeledMethodType,
1313
usages = [],
14-
signature = "test",
15-
packageName = "test",
16-
typeName = "test",
17-
methodName = "test",
18-
methodParameters = "test",
14+
signature = "org.sql2o.Sql2o#open()",
15+
packageName = "org.sql2o",
16+
typeName = "Sql2o",
17+
methodName = "open",
18+
methodParameters = "()",
1919
}: {
2020
library?: string;
2121
supported?: boolean;

0 commit comments

Comments
 (0)