Add Gleam (#67)

This commit is contained in:
Paulo F. Oliveira
2021-08-03 18:56:12 +01:00
committed by GitHub
parent 4fbbcf2e6c
commit c988d89031
39 changed files with 442 additions and 64 deletions
+18 -4
View File
@@ -14,6 +14,7 @@ jobs:
name: > name: >
OTP ${{matrix.combo.otp-version}}, OTP ${{matrix.combo.otp-version}},
Elixir ${{matrix.combo.elixir-version}}, Elixir ${{matrix.combo.elixir-version}},
Gleam ${{matrix.combo.gleam-version}},
rebar3 ${{matrix.combo.rebar3-version}} rebar3 ${{matrix.combo.rebar3-version}}
runs-on: ${{matrix.combo.os}} runs-on: ${{matrix.combo.os}}
strategy: strategy:
@@ -106,6 +107,10 @@ jobs:
- elixir-version: 'master' - elixir-version: 'master'
otp-version: '23.1' otp-version: '23.1'
os: 'ubuntu-20.04' os: 'ubuntu-20.04'
- gleam-version: '0.16'
otp-version: '24'
rebar3-version: '3.16'
os: 'ubuntu-latest'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
@@ -114,6 +119,7 @@ jobs:
with: with:
otp-version: ${{matrix.combo.otp-version}} otp-version: ${{matrix.combo.otp-version}}
elixir-version: ${{matrix.combo.elixir-version}} elixir-version: ${{matrix.combo.elixir-version}}
gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}} rebar3-version: ${{matrix.combo.rebar3-version}}
version-type: ${{matrix.combo.version-type}} version-type: ${{matrix.combo.version-type}}
- name: Erlang/OTP version (action) - name: Erlang/OTP version (action)
@@ -121,6 +127,9 @@ jobs:
- name: Elixir version (action) - name: Elixir version (action)
run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}"
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Gleam version (action)
run: echo "Gleam ${{steps.setup-beam.outputs.gleam-version}}"
if: ${{matrix.combo.gleam-version}}
- name: rebar3 version (action) - name: rebar3 version (action)
run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
if: ${{matrix.combo.rebar3-version}} if: ${{matrix.combo.rebar3-version}}
@@ -130,14 +139,19 @@ jobs:
mix help local.rebar mix help local.rebar
mix help local.hex mix help local.hex
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run Mix project tests - name: Run Elixir/Mix project tests
run: | run: |
cd test-projects/mix cd test-projects/elixir_mix
mix deps.get mix deps.get
mix test mix test
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run rebar3 project tests - name: Run Erlang/rebar3 project tests
run: | run: |
cd test-projects/rebar3 cd test-projects/erlang_rebar3
rebar3 ct rebar3 ct
if: ${{matrix.combo.rebar3-version}} if: ${{matrix.combo.rebar3-version}}
- name: Run Gleam/rebar3 project tests
run: |
cd test-projects/gleam_rebar3
rebar3 eunit
if: ${{matrix.combo.gleam-version}}
+18 -4
View File
@@ -14,6 +14,7 @@ jobs:
name: > name: >
OTP ${{matrix.combo.otp-version}}, OTP ${{matrix.combo.otp-version}},
Elixir ${{matrix.combo.elixir-version}}, Elixir ${{matrix.combo.elixir-version}},
Gleam ${{matrix.combo.gleam-version}},
rebar3 ${{matrix.combo.rebar3-version}} rebar3 ${{matrix.combo.rebar3-version}}
runs-on: ${{matrix.combo.os}} runs-on: ${{matrix.combo.os}}
strategy: strategy:
@@ -52,6 +53,10 @@ jobs:
otp-version: '24' otp-version: '24'
rebar3-version: '3.15' rebar3-version: '3.15'
os: 'windows-latest' os: 'windows-latest'
- gleam-version: '0.16'
otp-version: '24'
rebar3-version: '3.16'
os: 'windows-latest'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Use erlef/setup-beam - name: Use erlef/setup-beam
@@ -60,12 +65,16 @@ jobs:
with: with:
otp-version: ${{matrix.combo.otp-version}} otp-version: ${{matrix.combo.otp-version}}
elixir-version: ${{matrix.combo.elixir-version}} elixir-version: ${{matrix.combo.elixir-version}}
gleam-version: ${{matrix.combo.gleam-version}}
rebar3-version: ${{matrix.combo.rebar3-version}} rebar3-version: ${{matrix.combo.rebar3-version}}
- name: Erlang/OTP version (action) - name: Erlang/OTP version (action)
run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}" run: echo "Erlang/OTP ${{steps.setup-beam.outputs.otp-version}}"
- name: Elixir version (action) - name: Elixir version (action)
run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}" run: echo "Elixir ${{steps.setup-beam.outputs.elixir-version}}"
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Gleam version (action)
run: echo "Gleam ${{steps.setup-beam.outputs.gleam-version}}"
if: ${{matrix.combo.gleam-version}}
- name: rebar3 version (action) - name: rebar3 version (action)
run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}" run: echo "rebar3 ${{steps.setup-beam.outputs.rebar3-version}}"
- name: mix version and help (CLI) - name: mix version and help (CLI)
@@ -74,14 +83,19 @@ jobs:
mix help local.rebar mix help local.rebar
mix help local.hex mix help local.hex
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run Mix project tests - name: Run Elixir/Mix project tests
run: | run: |
cd test-projects/mix cd test-projects/elixir_mix
mix deps.get mix deps.get
mix test mix test
if: ${{matrix.combo.elixir-version}} if: ${{matrix.combo.elixir-version}}
- name: Run rebar3 project tests - name: Run Erlang/rebar3 project tests
run: | run: |
cd test-projects/rebar3 cd test-projects/erlang_rebar3
rebar3 ct rebar3 ct
if: ${{matrix.combo.rebar3-version}} if: ${{matrix.combo.rebar3-version}}
- name: Run Gleam/rebar3 project tests
run: |
cd test-projects/gleam_rebar3
rebar3 eunit
if: ${{matrix.combo.gleam-version}}
+1 -1
View File
@@ -1810,7 +1810,7 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
----- -----
The following software may be included in this product: has-bigints, unbox-primitive, which-boxed-primitive. A copy of the source code may be downloaded from git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below: The following software may be included in this product: has-bigints, internal-slot, side-channel, unbox-primitive, which-boxed-primitive. A copy of the source code may be downloaded from git+https://github.com/ljharb/has-bigints.git (has-bigints), git+https://github.com/ljharb/internal-slot.git (internal-slot), git+https://github.com/ljharb/side-channel.git (side-channel), git+https://github.com/ljharb/unbox-primitive.git (unbox-primitive), git+https://github.com/inspect-js/which-boxed-primitive.git (which-boxed-primitive). This software contains the following license and notice below:
MIT License MIT License
+26 -43
View File
@@ -13,6 +13,7 @@ workflow by:
- installing Erlang/OTP - installing Erlang/OTP
- optionally, installing Elixir - optionally, installing Elixir
- optionally, installing Gleam
- optionally, installing `rebar3` - optionally, installing `rebar3`
- optionally, installing `hex` - optionally, installing `hex`
@@ -24,13 +25,13 @@ See [action.yml](action.yml) for the action's specification.
**Note**: The Erlang/OTP release version specification is [relatively **Note**: The Erlang/OTP release version specification is [relatively
complex](http://erlang.org/doc/system_principles/versions.html#version-scheme). complex](http://erlang.org/doc/system_principles/versions.html#version-scheme).
For best results, we recommend specifying exact Erlang/OTP, Elixir versions, and For best results, we recommend specifying exact
`rebar3` versions, and setting option `version-type` to `strict`. versions, and setting option `version-type` to `strict`.
However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them However, values like `22.x`, or even `>22`, are also accepted, and we attempt to resolve them
according to semantic versioning rules. This implicitly means `version-type` is `loose`, according to semantic versioning rules. This implicitly means `version-type` is `loose`,
which is also the default value for this option. which is also the default value for this option.
Additionally, it is recommended that one specifies Erlang/OTP, Elixir and `rebar3` versions Additionally, it is recommended that one specifies versions
using YAML strings, as these examples do, so that numbers like `23.0` don't using YAML strings, as these examples do, so that numbers like `23.0` don't
end up being parsed as `23`, which is not equivalent. end up being parsed as `23`, which is not equivalent.
@@ -82,44 +83,7 @@ jobs:
... ...
``` ```
### Basic example (Erlang/OTP + Elixir, on Ubuntu) ### Example (Erlang/OTP + Elixir, on Ubuntu)
```yaml
# create this in .github/workflows/ci.yml
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
otp-version: '22.2'
elixir-version: '1.9.4'
- run: mix deps.get
- run: mix test
```
### Basic example (Erlang/OTP + `rebar3`, on Ubuntu)
```yaml
# create this in .github/workflows/ci.yml
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
otp-version: '22.2'
rebar3-version: '3.14.2'
- run: rebar3 ct
```
### Matrix example (Erlang/OTP + Elixir, on Ubuntu)
```yaml ```yaml
# create this in .github/workflows/ci.yml # create this in .github/workflows/ci.yml
@@ -143,7 +107,7 @@ jobs:
- run: mix test - run: mix test
``` ```
### Matrix example (Erlang/OTP + `rebar3`, on Ubuntu) ### Example (Erlang/OTP + `rebar3`, on Ubuntu)
```yaml ```yaml
# create this in .github/workflows/ci.yml # create this in .github/workflows/ci.yml
@@ -166,7 +130,7 @@ jobs:
- run: rebar3 ct - run: rebar3 ct
``` ```
### Basic example (Erlang/OTP + `rebar3`, on Windows) ### Example (Erlang/OTP + `rebar3`, on Windows)
```yaml ```yaml
# create this in .github/workflows/ci.yml # create this in .github/workflows/ci.yml
@@ -184,6 +148,25 @@ jobs:
- run: rebar3 ct - run: rebar3 ct
``` ```
### Example (Gleam + `rebar3`, on Ubuntu)
```yaml
# create this in .github/workflows/ci.yml
on: push
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: erlef/setup-beam@v1
with:
otp-version: '24'
gleam-version: '0.16'
rebar3-version: '3.16'
- run: rebar3 ct
```
## Elixir Problem Matchers ## Elixir Problem Matchers
The Elixir Problem Matchers in this repository are adapted from [here](https://github.com/fr1zle/vscode-elixir/blob/45eddb589acd7ac98e0c7305d1c2b24668ca709a/package.json#L70-L118). See [MATCHER_NOTICE](MATCHER_NOTICE.md) for license details. The Elixir Problem Matchers in this repository are adapted from [here](https://github.com/fr1zle/vscode-elixir/blob/45eddb589acd7ac98e0c7305d1c2b24668ca709a/package.json#L70-L118). See [MATCHER_NOTICE](MATCHER_NOTICE.md) for license details.
+43
View File
@@ -11,10 +11,12 @@ const installer = require('../src/installer')
async function all() { async function all() {
await testFailInstallOTP() await testFailInstallOTP()
await testFailInstallElixir() await testFailInstallElixir()
await testFailInstallGleam()
await testFailInstallRebar3() await testFailInstallRebar3()
await testOTPVersions() await testOTPVersions()
await testElixirVersions() await testElixirVersions()
await testGleamVersions()
await testRebar3Versions() await testRebar3Versions()
await testGetVersionFromSpec() await testGetVersionFromSpec()
@@ -63,6 +65,20 @@ async function testFailInstallElixir() {
) )
} }
async function testFailInstallGleam() {
const gleamVersion = '0.1.3'
assert.rejects(
async () => {
await installer.installGleam(gleamVersion)
},
(err) => {
assert.ok(err instanceof Error)
return true
},
`Installing Gleam ${gleamVersion} is supposed to fail`,
)
}
async function testFailInstallRebar3() { async function testFailInstallRebar3() {
const r3Version = '0.14.4' const r3Version = '0.14.4'
assert.rejects( assert.rejects(
@@ -197,6 +213,33 @@ async function testElixirVersions() {
simulateInput('version-type', 'loose') simulateInput('version-type', 'loose')
} }
async function testGleamVersions() {
let got
let expected
let spec
let otpVersion
spec = 'v0.3.0'
otpVersion = 'OTP-23'
expected = 'v0.3.0'
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
spec = '0.13.2'
otpVersion = 'OTP-24'
expected = 'v0.13.2'
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'strict')
spec = 'v0.14.0-rc2'
otpVersion = 'OTP-22'
expected = 'v0.14.0-rc2'
got = await setupBeam.getGleamVersion(spec, otpVersion)
assert.deepStrictEqual(got, expected)
simulateInput('version-type', 'loose')
}
async function testRebar3Versions() { async function testRebar3Versions() {
let got let got
let expected let expected
+4
View File
@@ -12,6 +12,8 @@ inputs:
description: Version range or exact version of Elixir to use description: Version range or exact version of Elixir to use
otp-version: otp-version:
description: Version range or exact version of Erlang/OTP to use description: Version range or exact version of Erlang/OTP to use
gleam-version:
description: Version range or exact version of Gleam to use
install-hex: install-hex:
description: Whether to install Hex (with Mix) description: Whether to install Hex (with Mix)
default: true default: true
@@ -29,6 +31,8 @@ outputs:
description: Exact version of Elixir that was installed description: Exact version of Elixir that was installed
otp-version: otp-version:
description: Exact version of Erlang/OTP that was installed description: Exact version of Erlang/OTP that was installed
gleam-version:
description: Exact version of Gleam that was installed
rebar3-version: rebar3-version:
description: Exact version of rebar3 that was installed description: Exact version of rebar3 that was installed
runs: runs:
+75 -5
View File
@@ -4618,6 +4618,21 @@ async function installElixir(elixirVersion) {
} }
} }
/**
* Install Gleam.
*
* @param {string} gleamVersion
*/
async function installGleam(gleamVersion) {
const OS = process.platform
if (OS === 'linux') {
await exec(__nccwpck_require__.ab + "install-gleam.sh", [gleamVersion])
} else if (OS === 'win32') {
const script = __nccwpck_require__.ab + "install-gleam.ps1"
await exec(`pwsh.exe ${script} -VSN:${gleamVersion}`)
}
}
/** /**
* Install rebar3. * Install rebar3.
* *
@@ -4644,6 +4659,7 @@ function checkPlatform() {
module.exports = { module.exports = {
installOTP, installOTP,
installElixir, installElixir,
installGleam,
installRebar3, installRebar3,
checkPlatform, checkPlatform,
} }
@@ -4686,6 +4702,9 @@ async function main() {
await mix(shouldMixHex, 'hex') await mix(shouldMixHex, 'hex')
} }
const gleamSpec = core.getInput('gleam-version', { required: false })
await maybeInstallGleam(gleamSpec)
const rebar3Spec = core.getInput('rebar3-version', { required: false }) const rebar3Spec = core.getInput('rebar3-version', { required: false })
await maybeInstallRebar3(rebar3Spec) await maybeInstallRebar3(rebar3Spec)
} }
@@ -4742,6 +4761,23 @@ async function mix(shouldMix, what) {
} }
} }
async function maybeInstallGleam(gleamSpec) {
let installed = false
if (gleamSpec) {
const gleamVersion = await getGleamVersion(gleamSpec)
console.log(`##[group]Installing Gleam ${gleamVersion}`)
await installer.installGleam(gleamVersion)
core.setOutput('gleam-version', gleamVersion)
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/gleam/bin`)
console.log('##[endgroup]')
installed = true
}
return installed
}
async function maybeInstallRebar3(rebar3Spec) { async function maybeInstallRebar3(rebar3Spec) {
let installed = false let installed = false
@@ -4830,10 +4866,21 @@ async function getElixirVersion(exSpec0, otpVersion) {
) )
} }
const DigitStart = new RegExp('^\\d+') return maybePrependWithV(elixirVersionWithOTP, elixirVersion)
return DigitStart.test(elixirVersion) }
? `v${elixirVersionWithOTP}`
: elixirVersionWithOTP async function getGleamVersion(gleamSpec0) {
const gleamSpec = gleamSpec0.match(/^v?(.+)/)
const gleamVersions = await getGleamVersions()
const gleamVersion = getVersionFromSpec(gleamSpec[1], gleamVersions)
if (gleamVersion === null) {
throw new Error(
`Requested Gleam version (${gleamSpec0}) not found in version list ` +
"(should you be using option 'version-type': 'strict'?)",
)
}
return maybePrependWithV(gleamVersion, gleamVersion)
} }
async function getRebar3Version(r3Spec) { async function getRebar3Version(r3Spec) {
@@ -4916,6 +4963,21 @@ async function getElixirVersions() {
return otpVersionsForElixirMap return otpVersionsForElixirMap
} }
async function getGleamVersions() {
const resultJSONs = await get(
'https://api.github.com/repos/gleam-lang/gleam/releases?per_page=100',
[1, 2, 3],
)
const gleamVersionsListing = []
resultJSONs.forEach((resultJSON) => {
JSON.parse(resultJSON)
.map((x) => x.tag_name)
.sort()
.forEach((v) => gleamVersionsListing.push(v))
})
return gleamVersionsListing
}
async function getRebar3Versions() { async function getRebar3Versions() {
const resultJSONs = await get( const resultJSONs = await get(
'https://api.github.com/repos/erlang/rebar3/releases?per_page=100', 'https://api.github.com/repos/erlang/rebar3/releases?per_page=100',
@@ -4959,7 +5021,7 @@ function getVersionFromSpec(spec, versions) {
} }
} }
return version return version === null || version === undefined ? null : version
} }
function maybeCoerced(v) { function maybeCoerced(v) {
@@ -5066,9 +5128,17 @@ async function get(url0, pageIdxs) {
return ret return ret
} }
function maybePrependWithV(versionToPrepend, specVersion) {
const digitStart = new RegExp('^\\d+')
return digitStart.test(specVersion)
? `v${versionToPrepend}`
: versionToPrepend
}
module.exports = { module.exports = {
getOTPVersion, getOTPVersion,
getElixirVersion, getElixirVersion,
getGleamVersion,
getRebar3Version, getRebar3Version,
getVersionFromSpec, getVersionFromSpec,
} }
+1 -1
View File
@@ -15,5 +15,5 @@ New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue" $ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}" Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue" $ProgressPreference="Continue"
Write-Output "Installed Erlang/OTP version follows" Write-Output "Installed Elixir version follows"
& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output & "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output
+19
View File
@@ -0,0 +1,19 @@
param([Parameter(Mandatory=$true)][string]$VSN)
$ErrorActionPreference="Stop"
Set-Location $Env:RUNNER_TEMP
$FILE_INPUT="gleam-${VSN}-windows-64bit.zip"
$FILE_OUTPUT="gleam.zip"
$DIR_FOR_BIN=".setup-beam/gleam/bin"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}" -OutFile "$FILE_OUTPUT"
$ProgressPreference="Continue"
New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Gleam version follows"
& "$DIR_FOR_BIN/gleam" "--version" | Write-Output
Vendored Executable
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
set -eo pipefail
cd "$RUNNER_TEMP"
VSN=${1}
FILE_INPUT=gleam-${VSN}-linux-amd64.tar.gz
FILE_OUTPUT=gleam.tar.gz
DIR_FOR_BIN=.setup-beam/gleam/bin
wget -q -O "${FILE_OUTPUT}" "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}"
echo "Installed Gleam version follows"
${DIR_FOR_BIN}/gleam --version
+1 -1
View File
@@ -15,5 +15,5 @@ New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue" $ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}" Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue" $ProgressPreference="Continue"
Write-Output "Installed Erlang/OTP version follows" Write-Output "Installed Elixir version follows"
& "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output & "$DIR_FOR_BIN/bin/iex" "-v" | Write-Output
+19
View File
@@ -0,0 +1,19 @@
param([Parameter(Mandatory=$true)][string]$VSN)
$ErrorActionPreference="Stop"
Set-Location $Env:RUNNER_TEMP
$FILE_INPUT="gleam-${VSN}-windows-64bit.zip"
$FILE_OUTPUT="gleam.zip"
$DIR_FOR_BIN=".setup-beam/gleam/bin"
$ProgressPreference="SilentlyContinue"
Invoke-WebRequest "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}" -OutFile "$FILE_OUTPUT"
$ProgressPreference="Continue"
New-Item "$DIR_FOR_BIN" -ItemType Directory | Out-Null
$ProgressPreference="SilentlyContinue"
Expand-Archive -DestinationPath "${DIR_FOR_BIN}" -Path "${FILE_OUTPUT}"
$ProgressPreference="Continue"
Write-Output "Installed Gleam version follows"
& "$DIR_FOR_BIN/gleam" "--version" | Write-Output
+17
View File
@@ -0,0 +1,17 @@
#!/bin/bash
set -eo pipefail
cd "$RUNNER_TEMP"
VSN=${1}
FILE_INPUT=gleam-${VSN}-linux-amd64.tar.gz
FILE_OUTPUT=gleam.tar.gz
DIR_FOR_BIN=.setup-beam/gleam/bin
wget -q -O "${FILE_OUTPUT}" "https://github.com/gleam-lang/gleam/releases/download/${VSN}/${FILE_INPUT}"
mkdir -p "${DIR_FOR_BIN}"
tar zxf "${FILE_OUTPUT}" -C "${DIR_FOR_BIN}"
echo "Installed Gleam version follows"
${DIR_FOR_BIN}/gleam --version
+16
View File
@@ -32,6 +32,21 @@ async function installElixir(elixirVersion) {
} }
} }
/**
* Install Gleam.
*
* @param {string} gleamVersion
*/
async function installGleam(gleamVersion) {
const OS = process.platform
if (OS === 'linux') {
await exec(path.join(__dirname, 'install-gleam.sh'), [gleamVersion])
} else if (OS === 'win32') {
const script = path.join(__dirname, 'install-gleam.ps1')
await exec(`pwsh.exe ${script} -VSN:${gleamVersion}`)
}
}
/** /**
* Install rebar3. * Install rebar3.
* *
@@ -58,6 +73,7 @@ function checkPlatform() {
module.exports = { module.exports = {
installOTP, installOTP,
installElixir, installElixir,
installGleam,
installRebar3, installRebar3,
checkPlatform, checkPlatform,
} }
+59 -5
View File
@@ -30,6 +30,9 @@ async function main() {
await mix(shouldMixHex, 'hex') await mix(shouldMixHex, 'hex')
} }
const gleamSpec = core.getInput('gleam-version', { required: false })
await maybeInstallGleam(gleamSpec)
const rebar3Spec = core.getInput('rebar3-version', { required: false }) const rebar3Spec = core.getInput('rebar3-version', { required: false })
await maybeInstallRebar3(rebar3Spec) await maybeInstallRebar3(rebar3Spec)
} }
@@ -86,6 +89,23 @@ async function mix(shouldMix, what) {
} }
} }
async function maybeInstallGleam(gleamSpec) {
let installed = false
if (gleamSpec) {
const gleamVersion = await getGleamVersion(gleamSpec)
console.log(`##[group]Installing Gleam ${gleamVersion}`)
await installer.installGleam(gleamVersion)
core.setOutput('gleam-version', gleamVersion)
core.addPath(`${process.env.RUNNER_TEMP}/.setup-beam/gleam/bin`)
console.log('##[endgroup]')
installed = true
}
return installed
}
async function maybeInstallRebar3(rebar3Spec) { async function maybeInstallRebar3(rebar3Spec) {
let installed = false let installed = false
@@ -174,10 +194,21 @@ async function getElixirVersion(exSpec0, otpVersion) {
) )
} }
const DigitStart = new RegExp('^\\d+') return maybePrependWithV(elixirVersionWithOTP, elixirVersion)
return DigitStart.test(elixirVersion) }
? `v${elixirVersionWithOTP}`
: elixirVersionWithOTP async function getGleamVersion(gleamSpec0) {
const gleamSpec = gleamSpec0.match(/^v?(.+)/)
const gleamVersions = await getGleamVersions()
const gleamVersion = getVersionFromSpec(gleamSpec[1], gleamVersions)
if (gleamVersion === null) {
throw new Error(
`Requested Gleam version (${gleamSpec0}) not found in version list ` +
"(should you be using option 'version-type': 'strict'?)",
)
}
return maybePrependWithV(gleamVersion, gleamVersion)
} }
async function getRebar3Version(r3Spec) { async function getRebar3Version(r3Spec) {
@@ -260,6 +291,21 @@ async function getElixirVersions() {
return otpVersionsForElixirMap return otpVersionsForElixirMap
} }
async function getGleamVersions() {
const resultJSONs = await get(
'https://api.github.com/repos/gleam-lang/gleam/releases?per_page=100',
[1, 2, 3],
)
const gleamVersionsListing = []
resultJSONs.forEach((resultJSON) => {
JSON.parse(resultJSON)
.map((x) => x.tag_name)
.sort()
.forEach((v) => gleamVersionsListing.push(v))
})
return gleamVersionsListing
}
async function getRebar3Versions() { async function getRebar3Versions() {
const resultJSONs = await get( const resultJSONs = await get(
'https://api.github.com/repos/erlang/rebar3/releases?per_page=100', 'https://api.github.com/repos/erlang/rebar3/releases?per_page=100',
@@ -303,7 +349,7 @@ function getVersionFromSpec(spec, versions) {
} }
} }
return version return version === null || version === undefined ? null : version
} }
function maybeCoerced(v) { function maybeCoerced(v) {
@@ -410,9 +456,17 @@ async function get(url0, pageIdxs) {
return ret return ret
} }
function maybePrependWithV(versionToPrepend, specVersion) {
const digitStart = new RegExp('^\\d+')
return digitStart.test(specVersion)
? `v${versionToPrepend}`
: versionToPrepend
}
module.exports = { module.exports = {
getOTPVersion, getOTPVersion,
getElixirVersion, getElixirVersion,
getGleamVersion,
getRebar3Version, getRebar3Version,
getVersionFromSpec, getVersionFromSpec,
} }
+23
View File
@@ -0,0 +1,23 @@
name: test
on:
push:
branches:
- master
- main
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2.0.0
- uses: gleam-lang/setup-erlang@v1.1.2
with:
otp-version: 23.2
- uses: gleam-lang/setup-gleam@v1.0.2
with:
gleam-version: 0.16.1
- run: rebar3 install_deps
- run: rebar3 eunit
- run: gleam format --check src test
+21
View File
@@ -0,0 +1,21 @@
*.beam
*.iml
*.o
*.plt
*.swo
*.swp
*~
.erlang.cookie
.eunit
.idea
.rebar
.rebar3
_*
_build
docs
ebin
erl_crash.dump
gen
log
logs
rebar3.crashdump
+24
View File
@@ -0,0 +1,24 @@
# gleam_rebar3
A Gleam project
## Quick start
```sh
# Run the eunit tests
rebar3 eunit
# Run the Erlang REPL
rebar3 shell
```
## Installation
If [available in Hex](https://rebar3.org/docs/configuration/dependencies/#declaring-dependencies)
this package can be installed by adding `gleam_rebar3` to your `rebar.config` dependencies:
```erlang
{deps, [
gleam_rebar3
]}.
```
+3
View File
@@ -0,0 +1,3 @@
name = "gleam_rebar3"
# repository = { type = "github", user = "my-user", repo = "gleam_rebar3" }
+12
View File
@@ -0,0 +1,12 @@
{erl_opts, [debug_info]}.
{src_dirs, ["src", "gen/src"]}.
{profiles, [
{test, [{src_dirs, ["src", "test", "gen/src", "gen/test"]}]}
]}.
{project_plugins, [rebar_gleam]}.
{deps, [
{gleam_stdlib, "0.16.0"}
]}.
@@ -0,0 +1,15 @@
{application, gleam_rebar3,
[{description, "A Gleam project"},
{vsn, "0.1.0"},
{registered, []},
{applications,
[kernel,
stdlib,
gleam_stdlib
]},
{env,[]},
{modules, []},
{include_files, ["gleam.toml", "gen"]},
{links, []}
]}.
@@ -0,0 +1,3 @@
pub fn hello_world() -> String {
"Hello, from gleam_rebar3!"
}
@@ -0,0 +1,7 @@
import gleam_rebar3
import gleam/should
pub fn hello_world_test() {
gleam_rebar3.hello_world()
|> should.equal("Hello, from gleam_rebar3!")
}