Skip to content

Commit

Permalink
Add cleanFlexgetVersion to process semver strings (#183)
Browse files Browse the repository at this point in the history
  • Loading branch information
shawnphoffman committed Aug 17, 2023
1 parent ecd9c49 commit b492741
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 2 deletions.
11 changes: 11 additions & 0 deletions src/core/layout/SideNav/Version.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,15 @@ describe('core/layout/Version', () => {
expect(await findByText('Flexget: 2.10.11')).toBeInTheDocument();
expect(queryByLabelText('flexget update available')).toBeInTheDocument();
});

it('handles incomplete semver versions', async () => {
fetchMock.get('/api/server/version', {
apiVersion: '1.1.2',
flexgetVersion: '2.10',
latestVersion: '2.11',
});
const { findByText, queryByLabelText } = renderWithWrapper(component);
expect(await findByText('Flexget: 2.10')).toBeInTheDocument();
expect(queryByLabelText('flexget update available')).toBeInTheDocument();
});
});
6 changes: 4 additions & 2 deletions src/core/layout/SideNav/Version.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { css } from '@emotion/core';
import { IconButton, Theme } from '@material-ui/core';
import HelpOutlineIcon from '@material-ui/icons/HelpOutline';
import Typography from '@material-ui/core/Typography';
import { cleanFlexgetVersion } from 'utils/version';
import { useVersion } from './hooks';

interface Props {
Expand All @@ -26,14 +27,15 @@ const Version: FC<Props> = ({ className }) => {

const { flexgetVersion, apiVersion, latestVersion } = version;

const normalizedVersion = flexgetVersion.replace('.dev', '-dev.0');
const normalizedVersion = cleanFlexgetVersion(flexgetVersion);
const normalizedLatest = cleanFlexgetVersion(latestVersion);

return (
<div css={wrapper} className={className}>
<Typography>Version Info</Typography>
<Typography>
{`Flexget: ${flexgetVersion} `}
{gt(latestVersion, normalizedVersion) && (
{gt(normalizedLatest, normalizedVersion) && (
<IconButton
href="https://flexget.com/ChangeLog"
color="inherit"
Expand Down
57 changes: 57 additions & 0 deletions src/utils/tests/version.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { cleanFlexgetVersion } from 'utils/version';

describe('utils/version', () => {
it('parses valid semver', async () => {
let version = '1.2.3';
let cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.3');

version = '2.1.0';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('2.1.0');

version = '1.2.3-dev';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.3-dev.0');

version = '1.2.3-dev.1';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.3-dev.1');
});

it('parses incomplete semver', async () => {
let version = '1.1';
let cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.1.0');

version = '1';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.0.0');
});

it('parses .dev prerelease tags', async () => {
let version = '1.2.3.dev';
let cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.3-dev.0');

version = '1.2.3.dev.1';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.3-dev.1');

version = '1.2.dev';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.0-dev.0');

version = '1.2.dev.1';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.2.0-dev.1');

version = '1.dev';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.0.0-dev.0');

version = '1.dev.1';
cleaned = cleanFlexgetVersion(version);
expect(cleaned).toEqual('1.0.0-dev.1');
});
});
13 changes: 13 additions & 0 deletions src/utils/version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { coerce } from 'semver';

export const cleanFlexgetVersion = (version: string) => {
const coercedVersion = coerce(version, { includePrerelease: true });
if (!coercedVersion) {
return '';
}

const regexPrerelease = /(?:\.|-)dev(?:(\.\d+))?/;
const preMatch = version.match(regexPrerelease);
const preString = preMatch ? `-dev${preMatch[1] || '.0'}` : '';
return `${coercedVersion?.format()}${preString}`;
};

0 comments on commit b492741

Please sign in to comment.