Skip to content

Commit

Permalink
Merge pull request #54 from zharinov/zprint
Browse files Browse the repository at this point in the history
Support for zprint formatter
  • Loading branch information
DeLaGuardo authored Jul 1, 2022
2 parents d3f93a4 + 9677d20 commit 31b5c0c
Show file tree
Hide file tree
Showing 9 changed files with 282 additions and 2 deletions.
32 changes: 32 additions & 0 deletions .github/workflows/smoke-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,34 @@ jobs:
- name: Check cljstyle version
run: cljstyle version

test-zprint:

strategy:
matrix:
operating-system: [ubuntu-latest, macOS-latest, windows-latest]

runs-on: ${{ matrix.operating-system }}

steps:
- name: Checkout
uses: actions/checkout@v2

- name: Prepare java
uses: actions/setup-java@v3
with:
distribution: 'zulu'
java-version: '8'

- name: Install zprint
# uses: DeLaGuardo/setup-clojure@master
uses: ./
with:
zprint: latest
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Check zprint version
run: zprint --version

all-together:

runs-on: ubuntu-latest
Expand All @@ -231,6 +259,7 @@ jobs:
bb: latest
clj-kondo: latest
cljstyle: latest
zprint: latest
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Check Clojure CLI
Expand All @@ -250,3 +279,6 @@ jobs:

- name: Check cljstyle version
run: cljstyle version

- name: Check zprint version
run: zprint --version
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ This action sets up Clojure tools environment for using in GitHub Actions.
* Babashka
* Clj-kondo
* cljstyle
* zprint

All three major tools available for MacOS and ubuntu based runners, Leiningen and Clojure CLI also available on Windows

Expand Down Expand Up @@ -81,6 +82,9 @@ jobs:
# cljstyle is not yet available for windows
if: ${{ matrix.os != 'windows-latest' }}
run: cljstyle version

- name: Get zprint version
run: zprint --version
```
For more application cases please check [Smoke Test Workflow file](https://github.com/DeLaGuardo/setup-clojure/blob/master/.github/workflows/smoke-tests.yml)
Expand Down
2 changes: 1 addition & 1 deletion __tests__/babashka.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const tc: jest.Mocked<typeof _tc> = _tc as never
jest.mock('@actions/core')
const core: jest.Mocked<typeof _core> = _core as never

describe('tdeps tests', () => {
describe('babashka tests', () => {
beforeEach(() => {
jest.resetAllMocks()
})
Expand Down
2 changes: 1 addition & 1 deletion __tests__/clj-kondo.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const tc: jest.Mocked<typeof _tc> = _tc as never
jest.mock('@actions/core')
const core: jest.Mocked<typeof _core> = _core as never

describe('tdeps tests', () => {
describe('clj-kondo tests', () => {
beforeEach(() => {
jest.resetAllMocks()
})
Expand Down
13 changes: 13 additions & 0 deletions __tests__/entrypoint.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as _cli from '../src/cli'
import * as _bb from '../src/babashka'
import * as _cljKondo from '../src/clj-kondo'
import * as _cljstyle from '../src/cljstyle'
import * as _zprint from '../src/zprint'
import * as _utils from '../src/utils'
import {run} from '../src/entrypoint'

Expand All @@ -29,6 +30,9 @@ const cljKondo: jest.Mocked<typeof _cljKondo> = _cljKondo as never
jest.mock('../src/cljstyle')
const cljstyle: jest.Mocked<typeof _cljstyle> = _cljstyle as never

jest.mock('../src/zprint')
const zprint: jest.Mocked<typeof _zprint> = _zprint as never

jest.mock('../src/utils')
const utils: jest.Mocked<typeof _utils> = _utils as never

Expand Down Expand Up @@ -158,4 +162,13 @@ describe('setup-clojure', () => {
await run()
expect(core.setFailed).toHaveBeenCalledWith('Unknown failure')
})

it('sets up zprint', async () => {
inputs['zprint'] = '1.2.3'
inputs['github-token'] = 'abc'

await run()

expect(zprint.setup).toHaveBeenCalledWith('1.2.3', 'token abc')
})
})
154 changes: 154 additions & 0 deletions __tests__/zprint.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import _os from 'os'
import * as _core from '@actions/core'
import * as _tc from '@actions/tool-cache'
import * as zprint from '../src/zprint'

const getJson = jest.fn()
jest.mock('@actions/http-client', () => ({
HttpClient: function () {
return {getJson}
}
}))

jest.mock('os')
const os: jest.Mocked<typeof _os> = _os as never

jest.mock('@actions/tool-cache')
const tc: jest.Mocked<typeof _tc> = _tc as never

jest.mock('@actions/core')
const core: jest.Mocked<typeof _core> = _core as never

jest.mock('../src/fs')

describe('zprint tests', () => {
beforeEach(() => {
jest.resetAllMocks()
})

describe('getLatestZprint', () => {
it('uses tag_name as latest version', async () => {
getJson.mockResolvedValueOnce({
result: {tag_name: 'v1.2.3'}
})
const res = await zprint.getLatestZprint()
expect(res).toBe('1.2.3')
expect(getJson).toHaveBeenCalledWith(
'https://api.github.com/repos/kkinnear/zprint/releases/latest',
undefined
)
})

it('supports authorization', async () => {
getJson.mockResolvedValueOnce({
result: {tag_name: 'v1.2.3'}
})
const res = await zprint.getLatestZprint('token 123')
expect(res).toBe('1.2.3')
expect(getJson).toHaveBeenCalledWith(
'https://api.github.com/repos/kkinnear/zprint/releases/latest',
{Authorization: 'token 123'}
)
})

it('throws on http client error', async () => {
getJson.mockRejectedValueOnce(new Error('some error'))
await expect(zprint.getLatestZprint()).rejects.toThrow('some error')
})

it('throws on wrong client answer', async () => {
getJson.mockResolvedValueOnce({result: {foo: 'bar'}})
await expect(zprint.getLatestZprint()).rejects.toThrow(
`Can't obtain latest zprint version`
)
})
})

describe('getArtifactName', () => {
test.each`
platform | artifact
${'win32'} | ${`zprint-filter-1.2.3`}
${'darwin'} | ${`zprintm-1.2.3`}
${'linux'} | ${`zprintl-1.2.3`}
${'foobar'} | ${`zprintl-1.2.3`}
`('$platform -> $artifact', ({platform, artifact}) => {
os.platform.mockReturnValueOnce(platform as never)
expect(zprint.getArtifactName('1.2.3')).toBe(artifact)
})
})

describe('getArtifactUrl', () => {
test.each`
platform | artifact
${'win32'} | ${`zprint-filter-1.2.3`}
${'darwin'} | ${`zprintm-1.2.3`}
${'linux'} | ${`zprintl-1.2.3`}
${'foobar'} | ${`zprintl-1.2.3`}
`('$platform -> $artifact', ({platform, artifact}) => {
os.platform.mockReturnValueOnce(platform as never)
expect(zprint.getArtifactUrl('1.2.3')).toBe(
`https://github.com/kkinnear/zprint/releases/download/1.2.3/${artifact}`
)
})
})

describe('setup', () => {
it('uses cache', async () => {
tc.find.mockReturnValueOnce('/foo/bar')

await zprint.setup('1.2.3')

expect(tc.find).toHaveBeenCalledWith('zprint', '1.2.3')
expect(core.addPath).toHaveBeenCalledWith('/foo/bar')
})

it('fetches exact version', async () => {
tc.downloadTool.mockResolvedValueOnce('/foo/zprint')
tc.cacheFile.mockResolvedValueOnce('/bar/zprint')

await zprint.setup('1.2.3', 'token 123')

expect(tc.find).toHaveBeenCalledWith('zprint', '1.2.3')
expect(tc.downloadTool).toHaveBeenCalledWith(
'https://github.com/kkinnear/zprint/releases/download/1.2.3/zprintl-1.2.3',
undefined,
'token 123'
)
expect(tc.cacheFile).toHaveBeenCalledWith(
'/foo/zprint',
'zprint',
'zprint',
'1.2.3'
)
expect(core.addPath).toHaveBeenCalledWith('/bar/zprint')
})

it('fetches latest version', async () => {
getJson.mockResolvedValueOnce({
result: {tag_name: 'v9.9.9'}
})
tc.downloadTool.mockResolvedValueOnce('/foo/zprint')
tc.cacheFile.mockResolvedValueOnce('/bar/zprint')

await zprint.setup('latest', 'token 123')

expect(getJson).toHaveBeenCalledWith(
'https://api.github.com/repos/kkinnear/zprint/releases/latest',
{Authorization: 'token 123'}
)
expect(tc.find).toHaveBeenCalledWith('zprint', '9.9.9')
expect(tc.downloadTool).toHaveBeenCalledWith(
'https://github.com/kkinnear/zprint/releases/download/9.9.9/zprintl-9.9.9',
undefined,
'token 123'
)
expect(tc.cacheFile).toHaveBeenCalledWith(
'/foo/zprint',
'zprint',
'zprint',
'9.9.9'
)
expect(core.addPath).toHaveBeenCalledWith('/bar/zprint')
})
})
})
2 changes: 2 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ inputs:
description: 'Clj-kondo version to install, `latest` can be used.'
cljstyle:
description: 'cljstyle version to install, `latest` can be used.'
zprint:
description: 'zprint version to install, `latest` can be used.'
github-token:
description: >+
To fix rate limit errors, provide `secrets.GITHUB_TOKEN` value to this field.
Expand Down
6 changes: 6 additions & 0 deletions src/entrypoint.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import * as cli from './cli'
import * as bb from './babashka'
import * as cljKondo from './clj-kondo'
import * as cljstyle from './cljstyle'
import * as zprint from './zprint'
import * as utils from './utils'

export async function run(): Promise<void> {
Expand All @@ -16,6 +17,7 @@ export async function run(): Promise<void> {
const BB_VERSION = core.getInput('bb')
const CLJ_KONDO_VERSION = core.getInput('clj-kondo')
const CLJSTYLE_VERSION = core.getInput('cljstyle')
const ZPRINT_VERSION = core.getInput('zprint')

const githubToken = core.getInput('github-token')
const githubAuth = githubToken ? `token ${githubToken}` : undefined
Expand Down Expand Up @@ -65,6 +67,10 @@ export async function run(): Promise<void> {
tools.push(cljstyle.setup(CLJSTYLE_VERSION, githubAuth))
}

if (ZPRINT_VERSION) {
tools.push(zprint.setup(ZPRINT_VERSION, githubAuth))
}

if (tools.length === 0) {
throw new Error('You must specify at least one clojure tool.')
}
Expand Down
69 changes: 69 additions & 0 deletions src/zprint.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import * as core from '@actions/core'
import * as http from '@actions/http-client'
import * as os from 'os'
import * as tc from '@actions/tool-cache'
import * as fs from './fs'

export async function getLatestZprint(githubAuth?: string): Promise<string> {
const client = new http.HttpClient('actions/setup-zprint', undefined, {
allowRetries: true,
maxRetries: 3
})

const res = await client.getJson<{tag_name: string}>(
`https://api.github.com/repos/kkinnear/zprint/releases/latest`,
githubAuth ? {Authorization: githubAuth} : undefined
)

const result = res.result?.tag_name?.replace(/^v/, '')
if (result) {
return result
}

throw new Error(`Can't obtain latest zprint version`)
}

export function getArtifactName(version: string): string {
const platform = os.platform()
switch (platform) {
case 'win32':
return `zprint-filter-${version}`
case 'darwin':
return `zprintm-${version}`
default:
return `zprintl-${version}`
}
}

export function getArtifactUrl(version: string): string {
const archiveName = getArtifactName(version)
return `https://github.com/kkinnear/zprint/releases/download/${version}/${archiveName}`
}

export async function setup(
version: string,
githubAuth?: string
): Promise<void> {
const ver = version === 'latest' ? await getLatestZprint(githubAuth) : version

let toolDir = tc.find('zprint', ver)
if (!toolDir) {
const archiveUrl = getArtifactUrl(ver)
core.info(`Artifact: ${archiveUrl}`)

const artifactFile = await tc.downloadTool(
archiveUrl,
undefined,
githubAuth
)

await fs.chmod(artifactFile, '0755')

toolDir = await tc.cacheFile(artifactFile, 'zprint', 'zprint', ver)
core.info(`Saved: ${toolDir}`)
} else {
core.info(`Cached: ${toolDir}`)
}

core.addPath(toolDir)
}

0 comments on commit 31b5c0c

Please sign in to comment.