diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index afd4c48..cd6b54e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -4,6 +4,17 @@ on: push: paths: - 'templates/rde/flake.lock' + - 'templates/rde/**/*.nix' + - 'templates/rde/**/*.sh' + - 'templates/rde/**/*.lua' + - '.github/workflows/check.yml' + pull_request: + paths: + - 'templates/rde/flake.lock' + - 'templates/rde/**/*.nix' + - 'templates/rde/**/*.sh' + - 'templates/rde/**/*.lua' + - '.github/workflows/check.yml' concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true @@ -27,5 +38,186 @@ jobs: authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' extraPullNames: rstats-on-nix, nix-community # - uses: DeterminateSystems/magic-nix-cache-action@main - - run: nix build ./templates/rde - - run: nix flake check ./templates/rde + + # Build and basic checks + - name: Build template + run: nix build ./templates/rde + - name: Run flake check + run: nix flake check ./templates/rde + + # Test development shell functionality + - name: Test dev shell enters successfully + run: | + cd templates/rde + nix develop --command bash -c "echo 'Dev shell works'" + + # Test R functionality (default enabled) + - name: Test R command is available + run: | + cd templates/rde + nix develop --command bash -c "which p-r" + + - name: Test R launches and runs basic command + run: | + cd templates/rde + nix develop --command bash -c "p-r --version" + + - name: Test R can execute simple code + run: | + cd templates/rde + nix develop --command bash -c "p-r -e 'print(1+1)'" + + - name: Test Quarto is available in R environment + run: | + cd templates/rde + nix develop --command bash -c "quarto --version" + + # Test Neovim functionality + - name: Test Neovim command is available + run: | + cd templates/rde + nix develop --command bash -c "which p" + + - name: Test Neovim launches in headless mode + run: | + cd templates/rde + nix develop --command bash -c "p --headless --version" + + # Test utility commands + - name: Test p-initProject command is available + run: | + cd templates/rde + nix develop --command bash -c "which p-initProject" + + - name: Test p-initProject creates project structure + run: | + TEST_DIR=$(mktemp -d) + cd "$TEST_DIR" + nix develop $GITHUB_WORKSPACE/templates/rde --command bash -c "p-initProject" + # Verify directories were created + test -d data/raw || exit 1 + test -d data/processed || exit 1 + test -d src || exit 1 + test -f README.md || exit 1 + test -f .gitignore || exit 1 + echo "Project structure created successfully" + # Cleanup + rm -rf "$TEST_DIR" + + - name: Test p-updateDeps command is available + run: | + cd templates/rde + nix develop --command bash -c "which p-updateDeps" + + # Test that package is built correctly + - name: Test default package can be run + run: | + cd templates/rde + nix run . -- --headless --version + + test-with-python: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: wimpysworld/nothing-but-nix@main + with: + hatchet-protocol: 'carve' + - uses: cachix/install-nix-action@v31 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + - uses: cachix/cachix-action@v16 + with: + name: rde + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + extraPullNames: rstats-on-nix, nix-community + + # Create a temporary directory with Python enabled + - name: Setup test directory with Python enabled + run: | + TEST_DIR=$(mktemp -d) + cp -r templates/rde/. "$TEST_DIR/" + cd "$TEST_DIR" + # Enable Python in the config (handle variations in whitespace) + sed -i 's/python[[:space:]]*=[[:space:]]*false;/python = true;/' flake.nix + # Verify the change was successful + grep -q "python[[:space:]]*=[[:space:]]*true;" flake.nix || { + echo "Error: Failed to enable Python in flake.nix" + exit 1 + } + echo "TEST_PYTHON_DIR=$TEST_DIR" >> $GITHUB_ENV + + - name: Build with Python enabled + run: | + cd "$TEST_PYTHON_DIR" + nix build + + - name: Test Python commands are available + run: | + cd "$TEST_PYTHON_DIR" + nix develop --command bash -c "which p-py && which p-ipy && which p-initPython" + + - name: Test Python launches + run: | + cd "$TEST_PYTHON_DIR" + nix develop --command bash -c "p-py --version" + + - name: Test Python can execute code + run: | + cd "$TEST_PYTHON_DIR" + nix develop --command bash -c "p-py -c 'print(1+1)'" + + - name: Test UV package manager is available + run: | + cd "$TEST_PYTHON_DIR" + nix develop --command bash -c "uv --version" + + test-with-julia: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: wimpysworld/nothing-but-nix@main + with: + hatchet-protocol: 'carve' + - uses: cachix/install-nix-action@v31 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + - uses: cachix/cachix-action@v16 + with: + name: rde + authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}' + extraPullNames: rstats-on-nix, nix-community + + # Create a temporary directory with Julia enabled + - name: Setup test directory with Julia enabled + run: | + TEST_DIR=$(mktemp -d) + cp -r templates/rde/. "$TEST_DIR/" + cd "$TEST_DIR" + # Enable Julia in the config (handle variations in whitespace) + sed -i 's/julia[[:space:]]*=[[:space:]]*false;/julia = true;/' flake.nix + # Verify the change was successful + grep -q "julia[[:space:]]*=[[:space:]]*true;" flake.nix || { + echo "Error: Failed to enable Julia in flake.nix" + exit 1 + } + echo "TEST_JULIA_DIR=$TEST_DIR" >> $GITHUB_ENV + + - name: Build with Julia enabled + run: | + cd "$TEST_JULIA_DIR" + nix build + + - name: Test Julia commands are available + run: | + cd "$TEST_JULIA_DIR" + nix develop --command bash -c "which p-jl && which p-initJl" + + - name: Test Julia launches + run: | + cd "$TEST_JULIA_DIR" + nix develop --command bash -c "p-jl --version" + + - name: Test Julia can execute code + run: | + cd "$TEST_JULIA_DIR" + nix develop --command bash -c "p-jl -e 'println(1+1)'" diff --git a/README.md b/README.md new file mode 100644 index 0000000..bfa3c32 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# Nix Project Templates (np) + +A collection of Nix flake templates for reproducible development environments. + +## Templates + +### RDE (Research Development Environment) + +The default template for data science and research projects with support for R, Python, and Julia. + +**Quick start:** +```bash +nix flake init -t github:dwinkler1/np#rde +nix develop +``` + +**Features:** +- 🔬 Multi-language support (R, Python, Julia) +- 📦 Reproducible with Nix +- 🎨 Neovim-based IDE with LSP support +- 📊 Research-focused workflows +- 🔧 Modular and customizable + +See [templates/rde/README.md](templates/rde/README.md) for full documentation. + +## CI/CD + +All templates are automatically tested to ensure functionality: + +- **Build Tests**: Templates build successfully on Linux and macOS +- **Functionality Tests**: All commands and language support are verified +- **Configuration Tests**: Multiple configurations (R, Python, Julia) are tested +- **Automated Updates**: Dependencies are updated daily via automated PRs + +### CI Workflows + +- `.github/workflows/check.yml` - Comprehensive functionality tests (Ubuntu) +- `.github/workflows/check_macos.yml` - macOS compatibility tests +- `.github/workflows/update.yml` - Automated dependency updates + +## Usage + +1. **Initialize a new project:** + ```bash + nix flake init -t github:dwinkler1/np#rde + ``` + +2. **Enter development environment:** + ```bash + nix develop + # or with direnv + echo "use flake" > .envrc && direnv allow + ``` + +3. **Start working:** + ```bash + p-initProject # Create project structure + p # Launch Neovim + ``` + +## Contributing + +Contributions are welcome! Please ensure: +- All templates pass CI tests +- Documentation is updated for new features +- Code follows existing patterns + +## License + +See [LICENSE](LICENSE) file for details. diff --git a/templates/rde/README.md b/templates/rde/README.md index 5b048ff..c28ac3c 100644 --- a/templates/rde/README.md +++ b/templates/rde/README.md @@ -337,6 +337,36 @@ p-updateDeps # Or check overlays/r.nix for package name ``` +## CI and Testing + +This template is automatically tested on every change to ensure all functionality works correctly. The CI workflow (`.github/workflows/check.yml`) runs comprehensive tests including: + +### Default Configuration Tests (R enabled) +- ✅ Template builds successfully +- ✅ Flake check passes +- ✅ Development shell enters without errors +- ✅ Neovim launches in headless mode +- ✅ R console is available and runs code +- ✅ Utility commands (initProject, updateDeps) are available +- ✅ Project structure creation works correctly + +### Python Configuration Tests +- ✅ Template builds with Python enabled +- ✅ Python commands (p-py, p-ipy, p-initPython) are available +- ✅ Python interpreter launches and executes code + +### Julia Configuration Tests +- ✅ Template builds with Julia enabled +- ✅ Julia commands (p-jl, p-initJl) are available +- ✅ Julia REPL launches and executes code + +The CI runs on: +- Every push to template files (`.nix`, `.sh`, `.lua`, `flake.lock`) +- Every pull request affecting the template +- Manual dispatch for testing + +This ensures that users can confidently use the template knowing that all advertised functionality has been verified. + ## Related Documentation - [REFACTORING.md](REFACTORING.md) - Technical details about the modular structure diff --git a/templates/rde/flake.nix b/templates/rde/flake.nix index 2fc5749..f83ec3f 100644 --- a/templates/rde/flake.nix +++ b/templates/rde/flake.nix @@ -202,10 +202,16 @@ # Development shell configuration devShells = forSystems (system: let pkgs = import nixpkgs {inherit system;}; + # Language-specific packages that should be available in shell + languagePackages = with pkgs; + [] + ++ (if config.enabledLanguages.r then [quarto] else []) + ++ (if config.enabledLanguages.python then [uv] else []) + ++ (if config.enabledLanguages.julia then [] else []); in { default = pkgs.mkShell { name = config.defaultPackageName; - packages = [projectConfig.${system}.default]; + packages = [projectConfig.${system}.default] ++ languagePackages; inputsFrom = []; # Welcome message when entering the shell shellHook = import ./lib/shell-hook.nix config pkgs;