Commit Graph

73 Commits

Author SHA1 Message Date
Radon Rosborough 7d780661db New solution that works on the free tier
Let's just require some languages to be built and published locally.
Easy enough.
2021-01-14 21:56:22 -08:00
Radon Rosborough 65c5403b6f Use http for now for Red
There seems to be a problem specific to my laptop's kernel or network
stack that causes an SSL error.
2021-01-13 17:00:57 -08:00
Radon Rosborough b9eaccfc66 Rename some files that I missed 2021-01-11 22:24:54 -08:00
Radon Rosborough f7b0b43551 Almost all languages working in new system 2021-01-11 22:17:09 -08:00
Radon Rosborough f013f7e26c Work on a number of additional languages 2021-01-11 19:34:44 -08:00
Radon Rosborough 5895b5f3e4 Everything through MongoDB 2021-01-10 15:52:23 -08:00
Radon Rosborough ac39b15e16 Make more languages work 2021-01-09 15:36:14 -08:00
Radon Rosborough f50c177007 Get a bunch of new languages working 2021-01-09 14:07:10 -08:00
Radon Rosborough 9a99429f48 Miscellaneous work starting to support langs 2021-01-06 21:44:27 -08:00
Radon Rosborough 6450df047f Configure more package managers 2021-01-02 15:41:47 -08:00
Radon Rosborough d782cc1fb5 Import APT package installation 2021-01-02 11:08:14 -08:00
Radon Rosborough ec94a44030 Re-add install clause for Python 2021-01-02 10:18:15 -08:00
Radon Rosborough b849045d12 Fix Markdown test
It previously relied on multiple trailing newlines and that is not
allowed by our new YAML format.
2021-01-02 10:14:56 -08:00
Radon Rosborough a6adfea206 Rename Node.js => JavaScript 2021-01-02 10:14:56 -08:00
Radon Rosborough 8cd93a744f Remove some spurious trailing newlines 2021-01-02 10:14:56 -08:00
Radon Rosborough 2daa11c7aa Import all language configs into YAML
This was an absolutely disgusting operation. Here's the commands I
used to do it (see <https://docs.gomplate.ca/> for the tool):

$ node
> require('fs').writeFile('langs.json', JSON.stringify(require('./langs').langs), console.log)
$ ./gomplate -c .=langs.json -f template.yaml > langs.yaml
$ cat langs.json | jq 'keys[]' -r L | while read lang; do cat langs.yaml | sed -n "/^ #START $lang\$/,/^ #END $lang\$/p" | tail -n+2 | head -n-1 | sed 's/^  //' > langs/$lang.yaml; done

I had some difficulty getting valid YAML to be generated, so I found
the tool at <http://www.yamllint.com/> to be helpful in identifying
errors.

For validation that nothing important had changed in the
transformation, I used <http://www.jsondiff.com/> to compare
langs.json against the output of this command:

$ ./gomplate -c .=langs.json -f template.yaml | node yaml2json.js | jq '(.. | select(type == "string")) |= sub("\n+$";"") | (.. | select(.template?) | .template?) |= (.+"\n") | (.. | select(.format?.input?) | .format?.input?) |= (.+"\n")'

Here's yaml2json.js:

import fs from "fs";
import YAML from "yaml";

console.log(JSON.stringify(YAML.parse(fs.readFileSync(0, "utf-8")), null, 2));

And here's the template.yaml, which is approximately the worst thing
ever:

{{ range . }}
"{{ .id }}":
 #START {{ .id }}
  id: "{{ .id }}"
{{ if has . "aliases" }}  aliases:
{{ range .aliases }}    - "{{ . }}"
{{ end }}{{ end }}  name: "{{ .name }}"
{{ if has . "monacoLang" }}  monacoLang: {{ .monacoLang }}
{{ end }}{{ if has . "info" }}
  info:
{{ if has .info "impl" }}    impl: "{{ .info.impl }}"
{{ end }}{{ if has .info "version" }}    version: "{{ .info.version }}"
{{ end }}    year: {{ .info.year }}
    desc: "{{ .info.desc }}"
{{ if eq "string" (printf "%T" .info.ext) }}    ext: {{ .info.ext }}
{{ else if eq 0 (len .info.ext) }}    ext: []
{{ else }}    ext:
{{ range .info.ext }}      - {{ . }}
{{ end }}{{ end }}    web:
{{ if has .info.web "wiki" }}      wiki: "{{ .info.web.wiki }}"
{{ end }}{{ if has .info.web "esolang" }}      esolang: "{{ .info.web.esolang }}"
{{ end }}{{ if has .info.web "home" }}      home: "{{ .info.web.home }}"
{{ end }}{{ if has .info.web "impl" }}      impl: "{{ .info.web.impl }}"
{{ end }}      source: {{ if eq "string" (printf "%T" .info.web.source) }}"{{ .info.web.source }}"
{{ else }}null
{{ end }}{{ if eq "string" (printf "%T" .info.category) }}    category: {{ .info.category }}
{{ else if eq 0 (len .info.category) }}    category: []
{{ else }}    category:
{{ range .info.category }}      - {{ . }}
{{ end }}{{ end }}{{ if eq "string" (printf "%T" .info.mode) }}    mode: {{ .info.mode }}
{{ else if eq 0 (len .info.mode) }}    mode: []
{{ else }}    mode:
{{ range .info.mode }}      - {{ . }}
{{ end }}{{ end }}{{ if eq "string" (printf "%T" .info.platform) }}    platform: {{ .info.platform }}
{{ else if eq 0 (len .info.platform) }}    platform: []
{{ else }}    platform:
{{ range .info.platform }}      - {{ . }}
{{ end }}{{ end }}{{ if eq "string" (printf "%T" .info.syntax) }}    syntax: {{ .info.syntax }}
{{ else if eq 0 (len .info.syntax) }}    syntax: []
{{ else }}    syntax:
{{ range .info.syntax }}      - {{ . }}
{{ end }}{{ end }}{{ if eq "string" (printf "%T" .info.typing) }}    typing: {{ .info.typing }}
{{ else if eq 0 (len .info.typing) }}    typing: []
{{ else }}    typing:
{{ range .info.typing }}      - {{ . }}
{{ end }}{{ end }}{{ if eq "string" (printf "%T" .info.paradigm) }}    paradigm: {{ .info.paradigm }}
{{ else if eq 0 (len .info.paradigm) }}    paradigm: []
{{ else }}    paradigm:
{{ range .info.paradigm }}      - {{ . }}
{{ end }}{{ end }}{{ if eq "string" (printf "%T" .info.usage) }}    usage: {{ .info.usage }}
{{ else if eq 0 (len .info.usage) }}    usage: []
{{ else }}    usage:
{{ range .info.usage }}      - {{ . }}
{{ end }}{{ end }}{{ end }}{{ if or (has . "daemon") (has . "setup") }}
{{ end }}{{ if has . "daemon" }}  daemon: |
{{ .daemon | indent 4 }}
{{ end }}{{ if has . "setup" }}  setup: |
{{ .setup | indent 4 }}
{{ end }}{{ if has . "repl" }}
  repl: |
{{ .repl | indent 4 }}
{{ end }}{{ if has . "input" }}{{ if .input | strings.Contains "\x1b" }}  input: "{{ .input | strings.ReplaceAll "\x1b" "\\x1b" }}"
{{ else }}  input: |{{ if .input | regexp.Match "^\\s" }}2{{ end }}
{{ .input | indent 4 }}
{{ end }}{{ end }}{{ if has . "output" }}  output: |
{{ .output | indent 4 }}
{{ end }}
  main: "{{ .main }}"
  template: {{ if eq .id "whitespace" }}{{ .template | strings.Quote }}
{{ else }}|{{ if .template | regexp.Match "^\\s" }}2{{ end }}
{{ .template | indent 4 }}{{ end }}{{ if has . "prefix" }}  prefix: |
{{ .prefix | indent 4 }}
{{ end }}{{ if has . "suffix" }}  suffix: |
{{ .suffix | indent 4 }}
{{ end }}{{ if has . "createEmpty" }}  createEmpty: "{{ .createEmpty }}"
{{ end }}
{{ if has . "compile" }}  compile: |
{{ .compile | indent 4 }}
{{ end }}  run: |
{{ .run | indent 4 }}
{{ if has . "helloInput" }}  helloInput: |
{{ .helloInput | indent 4 }}
{{ end }}{{ if has . "hello" }}  hello: |
{{ .hello | indent 4 }}
{{ end }}{{ if has . "helloMaxLength" }}  helloMaxLength: {{ .helloMaxLength }}
{{ end }}{{ if has . "runReplInput" }}  runReplInput: |
{{ .runReplInput | indent 4 }}
{{ end }}{{ if has . "runReplOutput" }}  runReplOutput: |
{{ .runReplOutput | indent 4 }}
{{ end }}{{ if has . "scope" }}
  scope:
    code: |
{{ .scope.code | indent 6 }}
{{ if has .scope "after" }}    after: "{{ .scope.after }}"
{{ end }}{{ if has .scope "input" }}{{ if .scope.input | strings.Contains "\x1b" }}    input: "{{ .scope.input | strings.ReplaceAll "\x1b" "\\x1b" }}"
{{ else }}    input: |
{{ .scope.input | indent 6 }}
{{ end }}{{ end }}{{ if has .scope "output" }}    output: |
{{ .scope.output | indent 6 }}
{{ end }}{{ end }}{{ if has . "format" }}
  format:
    run: |
{{ .format.run | indent 6 }}
{{ if has .format "input" }}    input: |
{{ .format.input | indent 6 }}{{ end }}{{ if has .format "output" }}    output: |
{{ .format.output | indent 6 }}{{ end }}{{ end }}{{ if has . "pkg" }}
  pkg:
    install: |
{{ .pkg.install | indent 6 }}
{{ if has .pkg "uninstall" }}
    uninstall: |
{{ .pkg.uninstall | indent 6 }}
{{ end }}{{ if has .pkg "all" }}
    all: |
{{ .pkg.all | indent 6 }}
{{ end }}{{ if has .pkg "search" }}
    search: |
{{ .pkg.search | indent 6 }}
{{ end }}{{ end }}{{ if has . "lsp" }}
  lsp:
{{ if has .lsp "setup" }}    setup: |
{{ .lsp.setup | indent 6 }}
{{ end }}    start: |
{{ .lsp.start | indent 6 }}
{{ if has .lsp "disableDynamicRegistration" }}    disableDynamicRegistration: {{ .lsp.disableDynamicRegistration }}
{{ end }}{{ if has .lsp "init" }}    init:
{{ .lsp.init | data.ToYAML | indent 6 }}{{ end }}{{ if has .lsp "config" }}    config: {{ .lsp.config | data.ToYAML }}{{ end }}{{ if has .lsp "lang" }}    lang: "{{ .lsp.lang }}"
{{ end }}{{ if has .lsp "code" }}    code: {{ .lsp.code | strings.Quote }}
{{ end }}{{ if has .lsp "after" }}    after: {{ .lsp.after | strings.Quote }}
{{ end }}{{ if has .lsp "item" }}    item: {{ .lsp.item | strings.Quote }}
{{ end }}{{ end }}{{ if has . "skip" }}
  skip:
{{ range .skip }}    - {{ . }}
{{ end }}{{ end }} #END {{ .id }}
{{ end }}
2021-01-02 10:14:26 -08:00
Radon Rosborough accc4da201 All tests are passing for Python 2020-12-27 13:12:29 -08:00
Radon Rosborough 2dd3e31f1a I hate writing Webpack configs. I hate it so much. 2020-12-27 12:42:06 -08:00
Radon Rosborough bc010b0ae5 Rearrange again, enable Docker-in-Docker-in-Docker 2020-12-24 09:35:05 -08:00
Radon Rosborough 93507ce964 Runtime image and further Makefile updates 2020-12-23 18:00:52 -08:00
Radon Rosborough eeadee7349 Generate Python .deb from config 2020-12-22 21:16:35 -08:00
Radon Rosborough 3670c78cb1 Add initial builder 2020-12-17 20:58:41 -08:00
Radon Rosborough 2759e4df69 Some initial progress 2020-12-17 19:04:02 -08:00