SIGN IN SIGN UP
PRQL / prql UNCLAIMED

PRQL is a modern language for transforming data — a simple, powerful, pipelined SQL replacement

0 0 0 Rust
# yaml-language-server: $schema=https://json.schemastore.org/taskfile.json
# Root Taskfile - handles setup, orchestration, and repo-wide operations.
#
2022-04-06 08:50:42 -07:00
# This file gives new contributors an easy way to get everything they need,
2022-09-14 12:29:38 -07:00
# assuming `cargo` and [Task](https://taskfile.dev) are installed.
#
# Structure:
# - Root (this file): Setup, orchestration, repo-wide tasks (lint, test-all, build-all)
# - prqlc/: Core development tasks (test, test-all, pull-request)
# - web/: Web-related tasks (build, run-*)
#
2022-09-14 12:29:38 -07:00
# Beyond installing requirements, we generally shouldn't be using this as a
# Makefile — in other words, we shouldn't require running this as part of normal
# development. Rust tools are independently good, and adding an intermediate
# layer means we're reimplementing things or getting in the way. Instead, this
# can be used to aggregate commands that are currently separate; e.g. check out
# `test-all`.
2022-04-06 08:50:42 -07:00
# Some of the file may be somewhat over-engineered!
version: "3"
2023-12-03 11:00:30 +01:00
includes:
prqlc:
taskfile: ./prqlc
dir: ./prqlc
zig:
taskfile: ./prqlc/bindings/prqlc-c/examples/minimal-zig
dir: ./prqlc/bindings/prqlc-c/examples/minimal-zig
web:
taskfile: ./web
dir: ./web
python:
taskfile: ./prqlc/bindings/prqlc-python
dir: ./prqlc/bindings/prqlc-python
2023-12-03 11:00:30 +01:00
vars:
# Keep in sync with .vscode/extensions.json
vscode_extensions: |
budparr.language-hugo-vscode
esbenp.prettier-vscode
mitsuhiko.insta
prql-lang.prql-vscode
rust-lang.rust-analyzer
cargo_crates: >
bacon cbindgen cargo-audit cargo-insta cargo-llvm-cov cargo-release
cargo-nextest default-target mdbook mdbook-admonish mdbook-footnote
mdbook-toc wasm-bindgen-cli wasm-opt
# wasm-pack waiting on https://github.com/rustwasm/wasm-pack/issues/1426
#
# Excluding `elixir` atm given it's not enabled on Mac and currently unsupported
brew_dependencies: |
hugo
jq
npm
uv
pre-commit
python3
tasks:
# main installer is "setup-dev" which calls other tasks
setup-dev:
preconditions:
- sh: which clang
msg: |
🔴 Can't find `clang`, which is required to install a full development environment (we use `duckdb` in our tests, which requires it).
2024-02-26 04:59:59 -08:00
Please install it. On macOS, that's
xcode-select --install
On Debian Linux, that's
apt-get update && apt-get install clang
desc: Install tools for PRQL development.
cmds:
- task: install-cargo-tools
# We only suggest, rather than install; we don't want to intrude (maybe
# we're being too conservative?).
- cmd: task check-vscode-extensions
ignore_error: true
- cmd: task check-brew-dependencies
ignore_error: true
- task: install-maturin
- task: install-npm-dependencies
- pre-commit install-hooks
- rustup component add llvm-tools-preview
- cmd: |
echo "
🟢 Setup complete! ✅🚀"
silent: true
install-cargo-tools:
desc: Install cargo tools for PRQL development.
cmds:
# In CI we use `binstall`, because it's faster, and without it we can't
# even get the arm64 docker image to build within the GHA timeout. But it
# produces lots of confusing warning messages about 429 errors, I think
# because it's querying GitHub for so many packages; so we only use it for
# CI atm. If the warnings were less alarming, we could use for all
# installs.
#
- |
{{ if .CI }}
task install-cargo-tools-binstall
{{ else }}
task install-cargo-tools-source
{{ end }}
- cmd: |
[ "$(which cargo-insta)" ] || echo "🔴 Can't find a binary that cargo just installed. Is the cargo bin path (generally at `~/.cargo/bin`) on the \$PATH?"
silent: true
install-maturin:
desc: Install maturin.
# Someone might have this installed with another approach, so only install
# if it can't be found.
status:
- which maturin
cmds:
- uv tool install maturin
- uv tool upgrade maturin
install-cargo-tools-source:
cmds:
# `--locked` installs from the underlying lock files (which is not the
# default...)
- "cargo install --locked {{.cargo_crates}}"
- cargo install wasm-pack
install-cargo-tools-binstall:
cmds:
2024-07-27 16:30:10 -07:00
- cmd: cargo install --locked cargo-binstall
platforms: [linux, darwin]
- "cargo binstall -y --locked {{.cargo_crates}}"
- cargo binstall -y wasm-pack
check-vscode-extensions:
2023-03-27 11:37:02 -07:00
desc: Check and suggest VS Code extensions.
vars:
extensions:
# List extensions, or just return true if we can't find `code`.
sh: which code && code --list-extensions || true
missing_extensions: |
{{ range ( .vscode_extensions | trim | splitLines ) -}}
{{ if not (contains . $.extensions) }}❌ {{.}} {{else}}✅ {{.}} {{ end }}
{{ end -}}
status:
# If vscode isn't installed, or there are no missing extensions,
# return 0 and exit early.
- '[ ! -x "$(which code)" ] || {{ not (contains "❌" .missing_extensions)
}}'
silent: true
cmds:
- |
echo "
2023-03-27 11:37:02 -07:00
🟡 It looks like VS Code is installed but doesn't have all recommended extensions installed:
{{ .missing_extensions }}
Install them with:
task install-vscode-extensions
"
- exit 1
install-vscode-extensions:
2023-03-27 11:37:02 -07:00
desc: Install recommended VS Code extensions.
cmds:
- |
{{ range ( .vscode_extensions | trim | splitLines ) -}}
code --install-extension {{.}}
{{ end -}}
2022-04-06 08:50:42 -07:00
check-brew-dependencies:
status:
- |
2023-09-08 13:45:32 -07:00
{{ range (.brew_dependencies | trim | splitLines) -}}
[ -n "$(which {{ . }})" ]
{{ end -}}
- |
[ "$(npm -v | awk -F. '{print ($1 > 9 || ($1 == 9 && $2 > 4)) ? 0 : 1}')" -eq 0 ]
silent: true
cmds:
- cmd: |
echo "
🟡 It looks like at least one brew dependency is missing from:
{{ .brew_dependencies }}
...or alternatively that npm < 9.4
These aren't required for initial PRQL development, but they are required for some of the extras.
Install them with:
task install-brew-dependencies
"
- exit 1
install-brew-dependencies:
preconditions:
- sh: which brew
msg: |
🔴 Can't find `brew`, which we use to install {{ .brew_dependencies | trim | splitLines | join " & " }}.
Either install brew & re-run this, or install the dependencies with a different approach, or use PRQL without them.
Brew installation instructions at:
https://brew.sh/
status:
- task check-brew-dependencies
cmds:
- brew install {{.brew_dependencies | trim | splitLines | join " " }}
install-npm-dependencies:
cmds:
- npm install --global prettier prettier-plugin-go-template
2022-06-23 16:10:14 -07:00
- cmd:
2023-03-27 11:37:02 -07:00
echo "In order to get nice auto-formatting of web code in VS Code, VS
Code requires configuration to use the system-wide install of
prettier. See
2022-06-23 16:10:14 -07:00
https://github.com/NiklasPor/prettier-plugin-go-template/issues/58#issuecomment-1085060511
for more info."
silent: true
2022-04-06 08:50:42 -07:00
build-all:
desc: Build everything.
summary: |
Build everything.
Running this isn't required when developing; it's for caching or as a reference.
2022-04-06 08:50:42 -07:00
cmds:
- cargo build --all-targets --all-features --quiet
- cargo build --all-targets --all-features --target=wasm32-unknown-unknown
--quiet
# Build without features, as the dependencies have slightly different
# features themselves and so require recompiling. This is only useful for
# caching.
- cargo build --all-targets --quiet
- cargo build --all-targets --features=default,test-dbs --quiet
- cargo doc --quiet
2023-09-08 13:45:32 -07:00
- task: build-each-crate
- task: web:build
- task: python:build
2023-09-08 13:45:32 -07:00
build-each-crate:
summary: |
Builds each crates individually. This is helpful for caching, since often
we'll want to run `cargo build -p prqlc`, and the dependencies can have
2023-09-08 13:45:32 -07:00
different features for that relative to `cargo build`.
vars:
PACKAGES:
sh:
cargo metadata --format-version=1 | jq -r '.workspace_members[] |
split(" ")[0]'
preconditions:
- sh: command -v jq
msg: "jq is not available. Please install it to continue."
cmds:
- |
{{ range ( .PACKAGES | splitLines ) -}}
cargo build --all-targets -p {{ . }} --quiet
2023-09-08 13:45:32 -07:00
{{ end -}}
test-rust-api:
summary: |
Run tests, excluding some internal crates
vars:
PACKAGES:
sh:
cargo metadata --format-version=1 | jq -r '.workspace_members[] |
split(" ")[0]'
cmds:
- |
cargo test {{ range without (splitLines .PACKAGES) "prqlc-parser" }} -p={{ . }} {{ end }}
test-all:
desc: Test everything across all workspaces, accepting snapshots.
summary: |
Test everything, accepting snapshots.
Running this isn't required when developing; it's for caching or as a reference.
cmds:
# TODO:
# - We could add `prqlc-c` here.
# - We deliberately don't test some other bindings, such as `prql-php`,
2024-05-11 11:40:37 -07:00
# given they require more dependencies and aren't yet Supported. They
# run in CI.
- task: prqlc:pull-request
- task: test-js
# No nextest here as doesn't work with wasm
- cargo test --target=wasm32-unknown-unknown
- task: python:test
2023-09-08 13:45:32 -07:00
- task: build-all
test-rust-coverage:
desc: Run tests with instrumentation for code coverage.
summary:
Run tests with instrumentation for code coverage. This works with VS
Code's [Coverage
Gutters](https://marketplace.visualstudio.com/items?itemName=ryanluker.vscode-coverage-gutters)
extension.
2024-06-24 17:21:02 -07:00
# We previously had a different target dir, but the default seems to use `target/llvm-cov` as its target already, so we can remove this assuming it works OK
# env:
# CARGO_TARGET_DIR: "./target-cov"
cmds:
- cargo llvm-cov --lcov --output-path lcov.info
--features=default,test-dbs
lint:
desc: Run all lints (pre-commit & cargo clippy).
cmds:
- pre-commit run --all-files
- cargo clippy --all-targets --all-features
test-rust-external-dbs:
desc: Run tests which require external databases, with docker
cmds:
- cmd:
echo "🔵 Starting docker containers. In some circumstances the tests
will start before images are ready. After one initial failure, try
re-running."
silent: true
- cd prqlc/prqlc/tests/integration/dbs && docker compose up --wait
# This _only_ runs the external dbs tests, but we could make it run
# everything?
- cargo test --features=test-dbs-external --test=integration --
--nocapture queries::results
# We could run this ourselves, but makes iteration times much longer
- cmd: |
echo "🔵 To remove containers and remove local built images, run
cd prqlc/prqlc/tests/integration/dbs && docker compose down --rmi local"
silent: true
test-js:
2023-10-18 19:11:37 +02:00
dir: prqlc/bindings/js
cmds:
- npm cit
# Currently disabled; see prql-elixir/README.md for details
test-elixir:
2023-10-18 19:11:37 +02:00
dir: prqlc/bindings/elixir
cmds:
# We could move this line into an `install` task
- mix local.hex --force
- mix deps.get --force
- mix compile
- mix test
feat: Elixir Bindings for PRQL (#1500) * (prql-elixir): initialize the elixir project * (prql-elixir): added nif module * (prql-elixir): finalize the nif integration * (prql-elixir): added ex_doc * (prql-elixir): added doc test * (prql-elixir): finalize native module * (prql-elixir): wip docs * (prql-elixir): wip tests * (prql-elixir): updated docs * (prql-elixir): added unit test * (prql-elixir): update readme * (prql-elixir): update directory name * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * chore: update author on cargo package * chore: remove redundant .gitignore * chore: added elixir tests to the task file * chore: update the elixir crate version * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * fix: build task for elixir * fix: use single words for dialects * fix: simplify the compile function * fix: simplify the options casting * fix: disable signature comment for tests * ci: added test-elirix workflow * ci: fix script * ci: rename task * pre-commit * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * ci: disable autocrlf * chore: added todo * ci: try disable crlf * ci: fix working dir * ci: correct cache paths * pre-commit * docs: added development instructions to prql-elixir * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Update prql-elixir/README.md * Update prql-elixir/README.md * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * docs: readme update * docs: fixed nif readme Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Maximilian Roos <m@maxroos.com> Co-authored-by: Maximilian Roos <5635139+max-sixty@users.noreply.github.com>
2023-01-14 14:17:28 +05:30
build-php:
- cargo build --package prqlc-c --release
2023-10-18 19:11:37 +02:00
- mkdir -p prqlc/bindings/php/lib/
- cp target/release/libprqlc_c.* prqlc/bindings/prqlc-c/prqlc.h
2023-10-18 19:11:37 +02:00
prqlc/bindings/php/lib/
- cd prqlc/bindings/php && composer install
build-prqlc-c-header:
desc: Build the C header for the C bindings.
dir: prqlc/bindings/prqlc-c
cmds:
- cbindgen --crate prqlc-c --output prqlc.h
- cbindgen --crate prqlc-c --lang C++ --output prqlc.hpp
test-php:
2023-10-18 19:11:37 +02:00
dir: prqlc/bindings/php
cmds:
- vendor/bin/phpunit tests
2024-05-11 11:40:37 -07:00
# The next two tasks are not used for either:
# - the Dockerfile (installing brew takes forever)
# so the Dockerfile simply installs hugo & nodejs directly
# - the "desktop setup" - it uses other tasks in the Taskfile.yaml
# They remain in the Taskfile.yaml as a hint if they should ever be needed
# install-hugo:
# cmds:
# # - /home/linuxbrew/.linuxbrew/bin/brew install hugo
# - curl -L https://github.com/gohugoio/hugo/releases/download/v0.91.2/hugo_0.91.2_Linux-64bit.deb -o hugo.deb
# - apt install ./hugo.deb
# install-nodejs:
# cmds:
# # - /home/linuxbrew/.linuxbrew/bin/brew install nodejs
# - curl -fsSL https://deb.nodesource.com/setup_16.x | bash -
# - apt install -y nodejs
# - cd /app/playground/ ; npm install