Skip to content

Commit

Permalink
feat: Adds unity3d versioning
Browse files Browse the repository at this point in the history
  • Loading branch information
ViMaSter committed Feb 19, 2024
1 parent 2a987c6 commit 085d70b
Show file tree
Hide file tree
Showing 4 changed files with 152 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/modules/versioning/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import * as semverCoerced from './semver-coerced';
import * as swift from './swift';
import type { VersioningApi, VersioningApiConstructor } from './types';
import * as ubuntu from './ubuntu';
import * as unity3d from './unity3d';

const api = new Map<string, VersioningApi | VersioningApiConstructor>();
export default api;
Expand Down Expand Up @@ -77,3 +78,4 @@ api.set(semver.id, semver.api);
api.set(semverCoerced.id, semverCoerced.api);
api.set(swift.id, swift.api);
api.set(ubuntu.id, ubuntu.api);
api.set(unity3d.id, unity3d.api);
64 changes: 64 additions & 0 deletions lib/modules/versioning/unity3d/index.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import unity3d from '.';

describe('modules/versioning/unity3d/index', () => {
it.each`
input | expected
${'9.0.3'} | ${false}
${'1.2019.3.22'} | ${false}
${'3.0.0-beta'} | ${false}
${'2.0.2-pre20191018090318'} | ${false}
${'1.0.0+c30d7625'} | ${false}
${'2.3.4-beta+1990ef74'} | ${false}
${'17.04'} | ${false}
${'3.0.0.beta'} | ${false}
${'5.1.2-+'} | ${false}
${'2022.2.12f1 (1234567890ab)'} | ${true}
${'2022.2.11 (1234567890ab)'} | ${false}
${'2021.1.10p1 (1234567890ab)'} | ${true}
${'2021.1.9b1 (1234567890ab)'} | ${true}
${'2021.1.1a1 (1234567890ab)'} | ${true}
`('isValid("$input") === $expected', ({ input, expected }) => {
const res = !!unity3d.isValid(input);
expect(res).toBe(expected);
});

it.each`
input | expected
${'2022.2.12f1 (1234567890ab)'} | ${true}
${'2021.1.10p1 (1234567890ab)'} | ${false}
${'2021.1.9b1 (1234567890ab)'} | ${false}
${'2021.1.1a1 (1234567890ab)'} | ${false}
`('isStable("$input") === $expected', ({ input, expected }) => {
expect(unity3d.isStable(input)).toBe(expected);
});

it.each`
a | b | expected
${'2022.2.12f1 (1234567890ab)'} | ${'2022.2.12f1 (1234567890ab)'} | ${true}
${'2021.1.10p1 (1234567890ab)'} | ${'2021.1.10p1 (1234567890ab)'} | ${true}
${'2021.1.9b1 (1234567890ab)'} | ${'2021.1.9b1 (1234567890ab)'} | ${true}
${'2021.1.1a1 (1234567890ab)'} | ${'2021.1.1a1 (1234567890ab)'} | ${true}
`('equals($a, $b) === $expected', ({ a, b, expected }) => {
expect(unity3d.equals(a, b)).toBe(expected);
});

it.each`
a | b | expected
${'2022.2.12f1 (1234567890ab)'} | ${'2022.2.12b1 (1234567890ab)'} | ${true}
${'2022.2.12f1 (1234567890ab)'} | ${'2021.1.10p1 (1234567890ab)'} | ${true}
${'2021.1.10p1 (1234567890ab)'} | ${'2021.1.9b1 (1234567890ab)'} | ${true}
${'2021.1.9b1 (1234567890ab)'} | ${'2021.1.1a1 (1234567890ab)'} | ${true}
${'2021.1.10p1 (1234567890ab)'} | ${'2022.2.12f1 (1234567890ab)'} | ${false}
${'2021.1.9b1 (1234567890ab)'} | ${'2021.1.10p1 (1234567890ab)'} | ${false}
${'2021.1.1a1 (1234567890ab)'} | ${'2021.1.9b1 (1234567890ab)'} | ${false}
${'2022.2.12b1 (1234567890ab)'} | ${'2022.2.12f1 (1234567890ab)'} | ${false}
${'2021.1.10p1 (1234567890ab)'} | ${'2022.2.12f1 (1234567890ab)'} | ${false}
${'2021.1.9b1 (1234567890ab)'} | ${'2021.1.10p1 (1234567890ab)'} | ${false}
${'2021.1.1a1 (1234567890ab)'} | ${'2021.1.9b1 (1234567890ab)'} | ${false}
${'2022.2.12f1 (1234567890ab)'} | ${'2021.1.10p1 (1234567890ab)'} | ${true}
${'2021.1.10p1 (1234567890ab)'} | ${'2021.1.9b1 (1234567890ab)'} | ${true}
${'2021.1.9b1 (1234567890ab)'} | ${'2021.1.1a1 (1234567890ab)'} | ${true}
`('isGreaterThan($a, $b) === $expected', ({ a, b, expected }) => {
expect(unity3d.isGreaterThan(a, b)).toBe(expected);
});
});
81 changes: 81 additions & 0 deletions lib/modules/versioning/unity3d/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
import semver from 'semver';
import { regEx } from '../../../util/regex';
import { GenericVersion, GenericVersioningApi } from '../generic';
import type { VersioningApi } from '../types';

export const id = 'unity3d';
export const displayName = 'Unity3D';
export const urls = [
'https://docs.unity3d.com/Manual/ScriptCompilationAssemblyDefinitionFiles.html#version-define-expressions:~:text=characters%20are%20supported.-,Unity%20version%20numbers,-Current%20versions%20of',
];
export const supportsRanges = false;

class Unity3dVersioningApi extends GenericVersioningApi {
private static readonly ReleaseStreamType = new Map([
['Alpha', 'a'],
['Beta', 'b'],
['Patch', 'p'],
['Experimental', 'x'],
['Stable', 'f'],
['Stable (China)', 'c'],
]);
private static readonly ReleaseStreamTypeKeyOrder = Array.from(
Unity3dVersioningApi.ReleaseStreamType.values(),
);

protected _parse(version: string): GenericVersion | null {
const matches = regEx(
/^(?<Major>\d+)\.(?<Minor>\d+)\.(?<Patch>\d+)(?<ReleaseStream>\w)(?<Build>\d+)/gm,
).exec(version);
if (!matches?.groups) {
return null;
}
const { Major, Minor, Patch, ReleaseStream, Build } = matches.groups;

const release = [
parseInt(Major),
parseInt(Minor),
parseInt(Patch) * 1000 + parseInt(Build),
];
const stable = [
Unity3dVersioningApi.ReleaseStreamType.get('Stable'),
Unity3dVersioningApi.ReleaseStreamType.get('Stable (China)'),
].includes(ReleaseStream);

let suffix = '';
if (version.match(/\([a-f0-9]+\)$/)) {
suffix = version.substring(1).substring(version.length - 2);
}
return { release, prerelease: stable ? undefined : Build, suffix };
}

protected override _compare(lhs: string, rhs: string): number {
const semverLhs = semver.parse(lhs.split(/(?=[a-z])/)[0])!;
const semverRhs = semver.parse(rhs.split(/(?=[a-z])/)[0])!;

const releaseStreamLhs = lhs.match(/([a-z])/)![0];
const releaseStreamRhs = rhs.match(/([a-z])/)![0];

const indexLhs =
Unity3dVersioningApi.ReleaseStreamTypeKeyOrder.indexOf(releaseStreamLhs);
const indexRhs =
Unity3dVersioningApi.ReleaseStreamTypeKeyOrder.indexOf(releaseStreamRhs);

const semVerCompare = semverLhs.compare(semverRhs);
if (semVerCompare !== 0) {
return semVerCompare;
}

if (indexLhs > indexRhs) {
return 1;
}
if (indexLhs < indexRhs) {
return -1;
}
return 0;
}
}

export const api: VersioningApi = new Unity3dVersioningApi();

export default api;
5 changes: 5 additions & 0 deletions lib/modules/versioning/unity3d/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Unity versioning follow semantic versioning, followed by a letter, number and hash.

- The letter denotes a stream (**a**lpha, **b**eta, **f**inal release, etc.)
- The number is a growing index
- The hash is calculated by Unity internally

0 comments on commit 085d70b

Please sign in to comment.