Begin supporting run
I'd like to be able to just call `run file.py` and have a program DWIM. I'm working on run as a step in this direction. Define a simple configuration that maps file extensions to template strings where "$file" is replaced with the argv[1]. It basically works but there are outstanding TODOs. See the README and source code for more information.
This commit is contained in:
		
							parent
							
								
									a50153c141
								
							
						
					
					
						commit
						3afb56a5e5
					
				
					 5 changed files with 104 additions and 0 deletions
				
			
		
							
								
								
									
										2
									
								
								run/.envrc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								run/.envrc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					source_up
 | 
				
			||||||
 | 
					eval "$(lorri direnv)"
 | 
				
			||||||
							
								
								
									
										30
									
								
								run/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								run/README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					# run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Simplify the commands you call to run scripts on the command line.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					> run path/to/file.py
 | 
				
			||||||
 | 
					> run path/to/file.ts
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## How?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Define a run.json configuration mapping commands to filename extensions like
 | 
				
			||||||
 | 
					so:
 | 
				
			||||||
 | 
					```json
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  ".ts": "npx ts-node $file",
 | 
				
			||||||
 | 
					  ".py": "python3 $file"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Then call `run path/to/some/file.ts` on the command line, and `npx ts-node
 | 
				
			||||||
 | 
					file.ts` will run.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Installation
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Install `run` using Nix.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```shell
 | 
				
			||||||
 | 
					> nix-env -iA briefcase.run
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
							
								
								
									
										16
									
								
								run/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								run/default.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,16 @@
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  pkgs ? import <nixpkgs> {},
 | 
				
			||||||
 | 
					  depot ? import <depot> {},
 | 
				
			||||||
 | 
					  briefcase ? import <briefcase> {},
 | 
				
			||||||
 | 
					  ...
 | 
				
			||||||
 | 
					}:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					depot.buildGo.program {
 | 
				
			||||||
 | 
					  name = "run";
 | 
				
			||||||
 | 
					  srcs = [
 | 
				
			||||||
 | 
					    ./main.go
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					  deps = with briefcase.gopkgs; [
 | 
				
			||||||
 | 
					    utils
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										49
									
								
								run/main.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								run/main.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,49 @@
 | 
				
			||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"encoding/json"
 | 
				
			||||||
 | 
						"fmt"
 | 
				
			||||||
 | 
						"io/ioutil"
 | 
				
			||||||
 | 
						"log"
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
 | 
						"os/exec"
 | 
				
			||||||
 | 
						"path/filepath"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
						"utils"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func main() {
 | 
				
			||||||
 | 
						if len(os.Args) != 2 {
 | 
				
			||||||
 | 
							log.Fatal("You can only call run with a single file at a time.")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rulesPath := utils.Resolve("run.json", []string{"/home/wpcarro/.config/run/run.json"})
 | 
				
			||||||
 | 
						b, err := ioutil.ReadFile(rulesPath)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Could not locate a run.json file: ", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						rules := map[string]string{}
 | 
				
			||||||
 | 
						err = json.Unmarshal(b, &rules)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal("Could not decode run.json as JSON: ", err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fileName := os.Args[1]
 | 
				
			||||||
 | 
						ext := filepath.Ext(fileName)
 | 
				
			||||||
 | 
						cmd, ok := rules[ext]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if !ok {
 | 
				
			||||||
 | 
							log.Fatalf("No rules for extension, %s, have been defined.", ext)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// TODO(wpcarro): Support more sophisticated parsing than just string
 | 
				
			||||||
 | 
						// splitting. To handle 'cases like this'.
 | 
				
			||||||
 | 
						tokens := strings.Split(strings.Replace(cmd, "$file", fileName, 1), " ")
 | 
				
			||||||
 | 
						c := exec.Command(tokens[0], tokens[1:]...)
 | 
				
			||||||
 | 
						err = c.Start()
 | 
				
			||||||
 | 
						// TODO(wpcarro): Forward STDERR and STDOUT.
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							log.Fatal(err)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						fmt.Println(c.Wait())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										7
									
								
								run/shell.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								run/shell.nix
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					{ pkgs ? import <nixpkgs> {}, ... }:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pkgs.mkShell {
 | 
				
			||||||
 | 
					  buildInputs = with pkgs; [
 | 
				
			||||||
 | 
					    go
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue