Skip to content

Commit 6d392f4

Browse files
committed
💚 Add release.yml
1 parent 0a0e844 commit 6d392f4

File tree

5 files changed

+203
-0
lines changed

5 files changed

+203
-0
lines changed

.github/workflows/release.yml

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
name: Release
2+
3+
on:
4+
push:
5+
tags:
6+
- "v*"
7+
8+
jobs:
9+
build:
10+
name: Build (${{ matrix.os }})
11+
runs-on: ${{ matrix.os }}
12+
strategy:
13+
matrix:
14+
include:
15+
- os: ubuntu-latest
16+
target: x86_64-unknown-linux-gnu
17+
artifact_name: mq
18+
asset_name: mq-x86_64-unknown-linux-gnu
19+
- os: ubuntu-latest
20+
target: aarch64-unknown-linux-gnu
21+
artifact_name: mq
22+
asset_name: mq-aarch64-unknown-linux-gnu
23+
- os: windows-latest
24+
target: x86_64-pc-windows-msvc
25+
artifact_name: mq.exe
26+
asset_name: mq-x86_64-pc-windows-msvc.exe
27+
- os: macos-13
28+
target: x86_64-apple-darwin
29+
artifact_name: mq
30+
asset_name: mq-x86_64-apple-darwin
31+
- os: macos-latest
32+
target: aarch64-apple-darwin
33+
artifact_name: mq
34+
asset_name: mq-aarch64-apple-darwin
35+
steps:
36+
- uses: actions/checkout@v4
37+
- uses: actions-rust-lang/setup-rust-toolchain@v1
38+
- uses: extractions/setup-just@v2
39+
- name: Build
40+
run: just build
41+
- name: Upload artifact
42+
uses: actions/upload-artifact@v4
43+
with:
44+
name: ${{ matrix.asset_name }}
45+
path: target/${{ matrix.target }}/release/${{ matrix.artifact_name }}
46+
if-no-files-found: error
47+
48+
docker:
49+
name: Build and Push Docker image
50+
runs-on: ubuntu-latest
51+
permissions:
52+
packages: write
53+
contents: read
54+
steps:
55+
- uses: actions/checkout@v4
56+
- name: Set up Docker Buildx
57+
uses: docker/setup-buildx-action@v3
58+
- name: Login to GitHub Container Registry
59+
uses: docker/login-action@v3
60+
with:
61+
registry: ghcr.io
62+
username: ${{ github.actor }}
63+
password: ${{ secrets.GITHUB_TOKEN }}
64+
- name: Extract metadata for Docker
65+
id: meta
66+
uses: docker/metadata-action@v5
67+
with:
68+
images: ghcr.io/${{ github.repository }}
69+
tags: |
70+
type=semver,pattern={{version}}
71+
type=semver,pattern={{major}}.{{minor}}
72+
- name: Build and push Docker image
73+
uses: docker/build-push-action@v6
74+
with:
75+
context: .
76+
push: true
77+
tags: ${{ steps.meta.outputs.tags }}
78+
labels: ${{ steps.meta.outputs.labels }}
79+
80+
release:
81+
name: Create Release
82+
needs: build
83+
runs-on: ubuntu-latest
84+
steps:
85+
- name: Download artifacts
86+
uses: actions/download-artifact@v4
87+
with:
88+
path: artifacts
89+
- name: Create Release
90+
id: create_release
91+
uses: softprops/action-gh-release@v2
92+
with:
93+
files: artifacts/*/*
94+
draft: true
95+
prerelease: false
96+
generate_release_notes: true
97+
env:
98+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

crates/mq-hir/src/error.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,14 @@ mod tests {
124124
}
125125
}
126126
}
127+
128+
#[test]
129+
fn test_error_ranges() {
130+
let mut hir = Hir::default();
131+
let url = Url::parse("file:///test").unwrap();
132+
let _ = hir.add_code(url.clone(), "let abc = 1 | unknown_var | let xyz = 2");
133+
134+
let error_ranges = hir.error_ranges();
135+
assert_eq!(error_ranges.len(), 1);
136+
}
127137
}

crates/mq-hir/src/hir.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -806,6 +806,9 @@ def foo(): 1", vec![" test".to_owned(), " test".to_owned(), "".to_owned()], vec!
806806
#[case::call("foo()", "foo", SymbolKind::Call)]
807807
#[case::elif_("if (true): 1 elif (false): 2 else: 3;", "elif", SymbolKind::Elif)]
808808
#[case::else_("if (true): 1 else: 2;", "else", SymbolKind::Else)]
809+
#[case::until("until (true): 1;", "until", SymbolKind::Until)]
810+
#[case::literal("42", "42", SymbolKind::Number)]
811+
#[case::selector(".h", ".h", SymbolKind::Selector)]
809812
fn test_add_code(
810813
#[case] code: &str,
811814
#[case] expected_name: &str,

crates/mq-lang/src/cst/parser.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,4 +1881,91 @@ mod tests {
18811881
assert_eq!(errors, expected.1);
18821882
assert_eq!(nodes, expected.0);
18831883
}
1884+
1885+
#[test]
1886+
fn test_error_reporter_error_ranges() {
1887+
let text = "def foo():\n bar()\n";
1888+
1889+
let mut reporter = ErrorReporter::new(100);
1890+
1891+
let unexpected_token = Arc::new(Token {
1892+
range: Range {
1893+
start: Position { line: 1, column: 4 },
1894+
end: Position { line: 1, column: 7 },
1895+
},
1896+
kind: TokenKind::Ident("foo".into()),
1897+
module_id: 1.into(),
1898+
});
1899+
reporter.report(ParseError::UnexpectedToken(Arc::clone(&unexpected_token)));
1900+
1901+
let insufficient_token = Arc::new(Token {
1902+
range: Range {
1903+
start: Position { line: 1, column: 4 },
1904+
end: Position { line: 1, column: 7 },
1905+
},
1906+
kind: TokenKind::Ident("bar".into()),
1907+
module_id: 1.into(),
1908+
});
1909+
reporter.report(ParseError::InsufficientTokens(Arc::clone(
1910+
&insufficient_token,
1911+
)));
1912+
1913+
reporter.report(ParseError::UnexpectedEOFDetected);
1914+
1915+
let ranges = reporter.error_ranges(text);
1916+
1917+
assert_eq!(ranges.len(), 3);
1918+
1919+
assert_eq!(ranges[0].1.start.line, 1);
1920+
assert_eq!(ranges[0].1.start.column, 4);
1921+
assert_eq!(ranges[0].1.end.line, 1);
1922+
assert_eq!(ranges[0].1.end.column, 7);
1923+
1924+
assert_eq!(ranges[1].1.start.line, 1);
1925+
assert_eq!(ranges[1].1.start.column, 4);
1926+
assert_eq!(ranges[1].1.end.line, 1);
1927+
assert_eq!(ranges[1].1.end.column, 7);
1928+
1929+
assert_eq!(ranges[2].1.start.line, 2);
1930+
assert_eq!(ranges[2].1.start.column, 6);
1931+
assert_eq!(ranges[2].1.end.line, 2);
1932+
assert_eq!(ranges[2].1.end.column, 6);
1933+
}
1934+
1935+
#[test]
1936+
fn test_error_reporter_has_errors() {
1937+
let mut reporter = ErrorReporter::new(100);
1938+
assert!(!reporter.has_errors());
1939+
1940+
reporter.report(ParseError::UnexpectedEOFDetected);
1941+
assert!(reporter.has_errors());
1942+
}
1943+
1944+
#[test]
1945+
fn test_error_reporter_max_errors() {
1946+
let mut reporter = ErrorReporter::new(2);
1947+
1948+
reporter.report(ParseError::UnexpectedEOFDetected);
1949+
reporter.report(ParseError::UnexpectedEOFDetected);
1950+
reporter.report(ParseError::UnexpectedEOFDetected);
1951+
1952+
assert_eq!(reporter.errors.len(), 2);
1953+
}
1954+
1955+
#[test]
1956+
fn test_error_reporter_display() {
1957+
let mut reporter = ErrorReporter::new(100);
1958+
1959+
reporter.report(ParseError::UnexpectedEOFDetected);
1960+
let token = Arc::new(Token {
1961+
range: Range::default(),
1962+
kind: TokenKind::Ident("foo".into()),
1963+
module_id: 1.into(),
1964+
});
1965+
reporter.report(ParseError::UnexpectedToken(token));
1966+
1967+
let display = format!("{}", reporter);
1968+
assert!(display.contains("Unexpected EOF detected"));
1969+
assert!(display.contains("Unexpected token"));
1970+
}
18841971
}

crates/mq-lang/src/eval.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2524,6 +2524,11 @@ mod tests {
25242524
], false))
25252525
],
25262526
Ok(vec![RuntimeValue::NONE]))]
2527+
#[case::slice(vec![RuntimeValue::NONE],
2528+
vec![
2529+
ast_node(ast::Expr::Call(ast::Ident::new("len"), vec![], false))
2530+
],
2531+
Ok(vec![RuntimeValue::Number(0.into())]))]
25272532
fn test_eval_process_none(
25282533
token_arena: Rc<RefCell<Arena<Rc<Token>>>>,
25292534
#[case] runtime_values: Vec<RuntimeValue>,

0 commit comments

Comments
 (0)