feat: add offline support for linguist

Signed-off-by: Jos Craw <me.joscraw@gmail.com>
This commit is contained in:
Jos Craw
2023-03-02 19:56:42 +13:00
parent a315fc68c0
commit 8a298b4724
5 changed files with 24 additions and 2 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-linguist-backend': minor
---
Added support for offline language data
+8
View File
@@ -85,6 +85,14 @@ return createRouter({ schedule: schedule, age: { days: 30 } }, { ...env });
With the `age` setup like this if the language breakdown is older than 15 days it will get regenerated. It's recommended that if you choose to use this configuration to set it to a large value - 30, 90, or 180 - as this data generally does not change drastically.
## Offline
The default setup will pull the language data from GitHub, by setting `offline` to `true` a packaged offline version of this data is used instead.
```ts
return createRouter({ schedule: schedule, offline: true }, { ...env });
```
## Use Source Location
You may wish to use the `backstage.io/source-location` annotation over using the `backstage.io/linguist` as you may not be able to quickly add that annotation to your Entities. To do this you'll just need to set the `useSourceLocation` boolean to `true` in your `packages/backend/src/plugins/linguist.ts` when you call `createRouter`:
+3
View File
@@ -35,6 +35,7 @@ export class LinguistBackendApi {
batchSize?: number,
useSourceLocation?: boolean,
kind?: string[],
offline?: boolean,
);
// (undocumented)
getEntityLanguages(entityRef: string): Promise<Languages>;
@@ -82,6 +83,8 @@ export interface PluginOptions {
// (undocumented)
kind?: string[];
// (undocumented)
offline?: boolean;
// (undocumented)
schedule?: TaskScheduleDefinition;
// (undocumented)
useSourceLocation?: boolean;
@@ -57,6 +57,7 @@ export class LinguistBackendApi {
private readonly batchSize?: number;
private readonly useSourceLocation?: boolean;
private readonly kind: string[];
private readonly offline?: boolean;
public constructor(
logger: Logger,
store: LinguistBackendStore,
@@ -67,6 +68,7 @@ export class LinguistBackendApi {
batchSize?: number,
useSourceLocation?: boolean,
kind?: string[],
offline?: boolean,
) {
this.logger = logger;
this.store = store;
@@ -78,6 +80,7 @@ export class LinguistBackendApi {
this.age = age;
this.useSourceLocation = useSourceLocation;
this.kind = kindOrDefault(kind);
this.offline = offline;
}
public async getEntityLanguages(entityRef: string): Promise<Languages> {
@@ -190,7 +193,7 @@ export class LinguistBackendApi {
const readTreeResponse = await this.urlReader.readTree(url);
const dir = await readTreeResponse.dir();
const results = await linguist(dir);
const results = await linguist(dir, { offline: this.offline });
try {
const totalBytes = results.languages.bytes;
@@ -38,6 +38,7 @@ export interface PluginOptions {
age?: HumanDuration;
batchSize?: number;
useSourceLocation?: boolean;
offline?: boolean;
kind?: string[];
}
@@ -57,7 +58,8 @@ export async function createRouter(
pluginOptions: PluginOptions,
routerOptions: RouterOptions,
): Promise<express.Router> {
const { schedule, age, batchSize, useSourceLocation, kind } = pluginOptions;
const { schedule, age, batchSize, useSourceLocation, kind, offline } =
pluginOptions;
const { logger, reader, database, discovery, scheduler, tokenManager } =
routerOptions;
@@ -78,6 +80,7 @@ export async function createRouter(
batchSize,
useSourceLocation,
kind,
offline,
);
if (scheduler && schedule) {