From 49247e9ec2eae8e8ec40f0e7f12d3d2ea8559d73 Mon Sep 17 00:00:00 2001 From: Adam Roben Date: Fri, 21 Nov 2014 09:46:43 -0500 Subject: [PATCH] Test that all languages have grammars This will make CI fail if someone adds a new language but neglects to add a new grammar for it. This should make it easier for people to review PRs, as CI will help them to make sure a new grammar gets added. However, we currently support some languages that have no grammars, and we may support more in the future. So you can explicitly mark the language as having no grammar by setting `tm_scope: NONE` in languages.yml. --- lib/linguist/languages.yml | 76 ++++++++++++++++++++++++++++++++++++++ test/test_language.rb | 12 ++++++ 2 files changed, 88 insertions(+) diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index b8230b6b..26a01d16 100644 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -45,6 +45,7 @@ APL: extensions: - .apl - .dyalog + tm_scope: NONE ASP: type: programming @@ -146,6 +147,7 @@ Arc: color: "#ca2afe" extensions: - .arc + tm_scope: NONE Arduino: type: programming @@ -162,12 +164,14 @@ AsciiDoc: - .asciidoc - .adoc - .asc + tm_scope: NONE AspectJ: type: programming color: "#1957b0" extensions: - .aj + tm_scope: NONE Assembly: type: programming @@ -185,6 +189,7 @@ Augeas: type: programming extensions: - .aug + tm_scope: NONE AutoHotkey: type: programming @@ -194,6 +199,7 @@ AutoHotkey: extensions: - .ahk - .ahkl + tm_scope: NONE AutoIt: type: programming @@ -286,6 +292,7 @@ Brightscript: type: programming extensions: - .brs + tm_scope: NONE Bro: type: programming @@ -359,6 +366,7 @@ CLIPS: type: programming extensions: - .clp + tm_scope: NONE CMake: extensions: @@ -421,6 +429,7 @@ Clean: extensions: - .icl - .dcl + tm_scope: NONE Clojure: type: programming @@ -537,6 +546,7 @@ Creole: wrap: true extensions: - .creole + tm_scope: NONE Crystal: type: programming @@ -604,6 +614,7 @@ Darcs Patch: extensions: - .darcspatch - .dpatch + tm_scope: NONE Dart: type: programming @@ -631,6 +642,7 @@ Dogescript: color: "#cca760" extensions: - .djs + tm_scope: NONE Dylan: type: programming @@ -646,6 +658,7 @@ E: color: "#ccce35" extensions: - .E + tm_scope: NONE ECL: type: programming @@ -653,6 +666,7 @@ ECL: extensions: - .ecl - .eclxml + tm_scope: NONE Eagle: type: markup @@ -736,6 +750,7 @@ FLUX: extensions: - .fx - .flux + tm_scope: NONE FORTRAN: type: programming @@ -809,11 +824,13 @@ G-code: - .g - .gco - .gcode + tm_scope: NONE GAMS: type: programming extensions: - .gms + tm_scope: NONE GAP: type: programming @@ -822,6 +839,7 @@ GAP: - .gap - .gd - .gi + tm_scope: NONE GAS: type: programming @@ -835,6 +853,7 @@ GDScript: type: programming extensions: - .gd + tm_scope: NONE GLSL: group: C @@ -919,6 +938,7 @@ Golo: color: "#f6a51f" extensions: - .golo + tm_scope: NONE Gosu: type: programming @@ -934,6 +954,7 @@ Grace: type: programming extensions: - .grace + tm_scope: NONE Grammatical Framework: type: programming @@ -950,6 +971,7 @@ Graph Modeling Language: type: data extensions: - .gml + tm_scope: NONE Graphviz (DOT): type: data @@ -1039,6 +1061,7 @@ HTTP: type: data extensions: - .http + tm_scope: NONE Hack: type: programming @@ -1046,6 +1069,7 @@ Hack: extensions: - .hh - .php + tm_scope: NONE Haml: group: HTML @@ -1068,6 +1092,7 @@ Harbour: color: "#0e60e3" extensions: - .hb + tm_scope: NONE Haskell: type: programming @@ -1093,6 +1118,7 @@ Hy: - .hy aliases: - hylang + tm_scope: NONE IDL: type: programming @@ -1108,6 +1134,7 @@ IGOR Pro: aliases: - igor - igorpro + tm_scope: NONE INI: type: data @@ -1128,6 +1155,7 @@ IRC log: extensions: - .irclog - .weechatlog + tm_scope: NONE Idris: type: programming @@ -1149,6 +1177,7 @@ Inform 7: Inno Setup: extensions: - .iss + tm_scope: NONE Io: type: programming @@ -1167,11 +1196,13 @@ Isabelle: color: "#fdcd00" extensions: - .thy + tm_scope: NONE J: type: programming extensions: - .ijs + tm_scope: NONE JSON: type: data @@ -1279,6 +1310,7 @@ KRL: color: "#f5c800" extensions: - .krl + tm_scope: NONE Kit: type: markup @@ -1312,6 +1344,7 @@ LOLCODE: extensions: - .lol color: "#cc9900" + tm_scope: NONE LSL: type: programming @@ -1326,6 +1359,7 @@ LabVIEW: type: programming extensions: - .lvproj + tm_scope: NONE Lasso: type: programming @@ -1364,12 +1398,14 @@ Liquid: type: markup extensions: - .liquid + tm_scope: NONE Literate Agda: type: programming group: Agda extensions: - .lagda + tm_scope: NONE Literate CoffeeScript: type: programming @@ -1546,6 +1582,7 @@ MediaWiki: wrap: true extensions: - .mediawiki + tm_scope: NONE Mercury: type: programming @@ -1560,6 +1597,7 @@ MiniD: # Legacy searchable: false extensions: - .minid # Dummy extension + tm_scope: NONE Mirah: type: programming @@ -1581,6 +1619,7 @@ Moocode: type: programming extensions: - .moo + tm_scope: NONE MoonScript: type: programming @@ -1592,6 +1631,7 @@ MoonScript: Myghty: extensions: - .myt + tm_scope: NONE NSIS: extensions: @@ -1637,6 +1677,7 @@ Nit: color: "#0d8921" extensions: - .nit + tm_scope: NONE Nix: type: programming @@ -1644,6 +1685,7 @@ Nix: - .nix aliases: - nixos + tm_scope: NONE Nu: type: programming @@ -1662,6 +1704,7 @@ NumPy: - .numpy - .numpyw - .numsc + tm_scope: NONE OCaml: type: programming @@ -1722,6 +1765,7 @@ Omgrofl: extensions: - .omgrofl color: "#cabbff" + tm_scope: NONE Opa: type: programming @@ -1733,6 +1777,7 @@ Opal: color: "#f7ede0" extensions: - .opal + tm_scope: NONE OpenCL: type: programming @@ -1757,12 +1802,14 @@ OpenSCAD: type: programming extensions: - .scad + tm_scope: NONE Org: type: prose wrap: true extensions: - .org + tm_scope: NONE Ox: type: programming @@ -1770,12 +1817,14 @@ Ox: - .ox - .oxh - .oxo + tm_scope: NONE Oxygene: type: programming color: "#5a63a3" extensions: - .oxygene + tm_scope: NONE PAWN: type: programming @@ -1811,18 +1860,21 @@ Pan: color: '#cc0000' extensions: - .pan + tm_scope: NONE Papyrus: type: programming color: "#6600cc" extensions: - .psc + tm_scope: NONE Parrot: type: programming color: "#f3ca0a" extensions: - .parrot # Dummy extension + tm_scope: NONE Parrot Assembly: group: Parrot @@ -1831,6 +1883,7 @@ Parrot Assembly: - pasm extensions: - .pasm + tm_scope: NONE Parrot Internal Representation: group: Parrot @@ -1882,12 +1935,14 @@ Perl6: - .p6m - .pl6 - .pm6 + tm_scope: NONE PigLatin: type: programming color: "#fcd7de" extensions: - .pig + tm_scope: NONE Pike: type: programming @@ -1902,12 +1957,14 @@ Pod: wrap: true extensions: - .pod + tm_scope: NONE PogoScript: type: programming color: "#d80074" extensions: - .pogo + tm_scope: NONE PostScript: type: markup @@ -1948,6 +2005,7 @@ Propeller Spin: color: "#2b446d" extensions: - .spin + tm_scope: NONE Protocol Buffer: type: markup @@ -1971,6 +2029,7 @@ Pure Data: color: "#91de79" extensions: - .pd + tm_scope: NONE PureScript: type: programming @@ -2077,6 +2136,7 @@ RMarkdown: extensions: - .rmd - .Rmd + tm_scope: NONE Racket: type: programming @@ -2096,6 +2156,7 @@ Ragel in Ruby Host: aliases: - ragel-rb - ragel-ruby + tm_scope: NONE Raw token data: search_term: raw @@ -2103,6 +2164,7 @@ Raw token data: - raw extensions: - .raw + tm_scope: NONE Rebol: type: programming @@ -2122,10 +2184,12 @@ Red: - .reds aliases: - red/system + tm_scope: NONE Redcode: extensions: - .cw + tm_scope: NONE RobotFramework: type: programming @@ -2199,6 +2263,7 @@ SAS: color: "#1E90FF" extensions: - .sas + tm_scope: NONE SCSS: type: markup @@ -2292,6 +2357,7 @@ Self: color: "#0579aa" extensions: - .self + tm_scope: NONE Shell: type: programming @@ -2330,6 +2396,7 @@ Shen: color: "#120F14" extensions: - .shen + tm_scope: NONE Slash: type: programming @@ -2400,6 +2467,7 @@ Stylus: group: CSS extensions: - .styl + tm_scope: NONE SuperCollider: type: programming @@ -2407,6 +2475,7 @@ SuperCollider: extensions: - .scd - .sc + tm_scope: NONE Swift: type: programming @@ -2432,6 +2501,7 @@ TXL: type: programming extensions: - .txl + tm_scope: NONE Tcl: type: programming @@ -2488,6 +2558,7 @@ Textile: wrap: true extensions: - .textile + tm_scope: NONE Thrift: type: programming @@ -2501,6 +2572,7 @@ Turing: extensions: - .t - .tu + tm_scope: NONE Twig: type: markup @@ -2761,6 +2833,7 @@ Zimpl: - .zimpl - .zmpl - .zpl + tm_scope: NONE eC: type: programming @@ -2768,6 +2841,7 @@ eC: extensions: - .ec - .eh + tm_scope: NONE edn: type: data @@ -2782,6 +2856,7 @@ fish: group: Shell extensions: - .fish + tm_scope: NONE mupad: extensions: @@ -2822,3 +2897,4 @@ xBase: color: "#3a4040" extensions: - .prg + tm_scope: NONE diff --git a/test/test_language.rb b/test/test_language.rb index a23715d2..8dd4f97b 100644 --- a/test/test_language.rb +++ b/test/test_language.rb @@ -1,5 +1,6 @@ require 'linguist/language' require 'test/unit' +require 'yaml' class TestLanguage < Test::Unit::TestCase include Linguist @@ -359,4 +360,15 @@ class TestLanguage < Test::Unit::TestCase def test_by_type assert !Language.by_type(:prose).nil? end + + def test_all_languages_have_grammars + scopes = YAML.load(File.read(File.expand_path("../../grammars.yml", __FILE__))).values.flatten + missing = Language.all.reject { |language| language.tm_scope == "NONE" || scopes.include?(language.tm_scope) } + message = "The following languages' scopes are not listed in grammars.yml. Please add grammars for all new languages.\n" + message << "If no grammar exists for a language, mark the language with `tm_scope: NONE` in lib/linguist/languages.yml.\n" + + width = missing.map { |language| language.name.length }.max + message << missing.map { |language| sprintf("%-#{width}s %s", language.name, language.tm_scope) }.sort.join("\n") + assert missing.empty?, message + end end