github-linguist 9.6.0 → 9.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/grammars/gno.mod.json +1 -0
  3. data/grammars/source.abl.json +1 -1
  4. data/grammars/source.aleo.json +1 -0
  5. data/grammars/source.astro.json +1 -1
  6. data/grammars/source.baml.json +1 -1
  7. data/grammars/source.bird2.json +1 -0
  8. data/grammars/source.blueprint.json +1 -0
  9. data/grammars/source.bnd.json +1 -1
  10. data/grammars/source.bsl.json +1 -1
  11. data/grammars/source.carbon.json +1 -0
  12. data/grammars/source.cl.json +1 -1
  13. data/grammars/source.clar.json +1 -1
  14. data/grammars/source.clarion.json +1 -1
  15. data/grammars/source.cmd.json +1 -1
  16. data/grammars/source.comment-string.wesl.json +1 -1
  17. data/grammars/source.comment-string.wgsl.json +1 -1
  18. data/grammars/source.cs.json +1 -1
  19. data/grammars/source.csswg.json +1 -1
  20. data/grammars/source.curlrc.json +1 -1
  21. data/grammars/source.dart.json +1 -1
  22. data/grammars/source.dds.dspf.json +1 -1
  23. data/grammars/source.dds.icff.json +1 -1
  24. data/grammars/source.dds.lf.json +1 -1
  25. data/grammars/source.dds.pf.json +1 -1
  26. data/grammars/source.dds.prtf.json +1 -1
  27. data/grammars/source.deq.json +1 -0
  28. data/grammars/source.fift.json +1 -0
  29. data/grammars/source.flix.json +1 -1
  30. data/grammars/source.fpp.json +1 -0
  31. data/grammars/source.func.json +1 -0
  32. data/grammars/source.gdscript.json +1 -1
  33. data/grammars/source.gedcom.json +1 -1
  34. data/grammars/source.gitconfig.json +1 -1
  35. data/grammars/source.gno.json +1 -0
  36. data/grammars/source.graphql.json +1 -1
  37. data/grammars/source.hack.json +1 -1
  38. data/grammars/source.hx.json +1 -1
  39. data/grammars/source.hxml.json +1 -1
  40. data/grammars/source.ink.json +1 -1
  41. data/grammars/source.jac.json +1 -1
  42. data/grammars/source.jass.json +1 -0
  43. data/grammars/source.julia.json +1 -1
  44. data/grammars/source.kcl.json +1 -1
  45. data/grammars/source.koka.json +1 -1
  46. data/grammars/source.leo.json +1 -1
  47. data/grammars/source.lobster.json +1 -0
  48. data/grammars/source.logos.json +1 -1
  49. data/grammars/source.luau.json +1 -1
  50. data/grammars/source.m2.json +1 -1
  51. data/grammars/source.mi.json +1 -1
  52. data/grammars/source.mojo.json +1 -1
  53. data/grammars/source.ms.json +1 -0
  54. data/grammars/source.nim.json +1 -1
  55. data/grammars/source.openqasm.json +1 -1
  56. data/grammars/source.opy.json +1 -1
  57. data/grammars/source.paperspecs.json +1 -0
  58. data/grammars/source.pl.json +1 -0
  59. data/grammars/source.pnlgrp.json +1 -1
  60. data/grammars/source.qsharp.json +1 -1
  61. data/grammars/source.rarlist.json +1 -0
  62. data/grammars/source.rascal.json +1 -1
  63. data/grammars/source.rego.json +1 -1
  64. data/grammars/source.rhai.json +1 -0
  65. data/grammars/source.rpg.json +1 -1
  66. data/grammars/source.rpgle.json +1 -1
  67. data/grammars/source.rust.json +1 -1
  68. data/grammars/source.scala.json +1 -1
  69. data/grammars/source.smithy.json +1 -1
  70. data/grammars/source.spicedb.json +1 -1
  71. data/grammars/source.stim.json +1 -0
  72. data/grammars/source.surrealql.json +1 -1
  73. data/grammars/source.swift.json +1 -1
  74. data/grammars/source.tasm.json +1 -0
  75. data/grammars/source.tlb.json +1 -0
  76. data/grammars/source.tolk.json +1 -0
  77. data/grammars/source.ucode-template.json +1 -0
  78. data/grammars/source.ucode.json +1 -0
  79. data/grammars/source.vento.json +1 -1
  80. data/grammars/source.verse.json +1 -0
  81. data/grammars/source.vespaSchema.json +1 -0
  82. data/grammars/source.vhs.json +1 -0
  83. data/grammars/source.wgsl.json +1 -1
  84. data/grammars/source.yaml.salt.json +1 -1
  85. data/grammars/text.bbcode.json +1 -0
  86. data/grammars/text.html.handlebars.json +1 -1
  87. data/grammars/text.recfile.json +1 -0
  88. data/grammars/text.roff.json +1 -1
  89. data/grammars/version +1 -1
  90. data/lib/linguist/VERSION +1 -1
  91. data/lib/linguist/blob_helper.rb +19 -0
  92. data/lib/linguist/generated.rb +24 -0
  93. data/lib/linguist/generic.yml +1 -0
  94. data/lib/linguist/heuristics.yml +80 -5
  95. data/lib/linguist/language.rb +5 -9
  96. data/lib/linguist/languages.yml +231 -27
  97. data/lib/linguist/languages_data.rb +7663 -0
  98. data/lib/linguist/lazy_blob.rb +6 -1
  99. data/lib/linguist/samples.rb +4 -10
  100. data/lib/linguist/samples_data.rb +196100 -0
  101. metadata +31 -19
  102. data/grammars/markdown.bicep.codeblock.json +0 -1
  103. data/grammars/source.baml-jinja.json +0 -1
  104. data/lib/linguist/languages.json +0 -1
  105. data/lib/linguist/samples.json +0 -1
data/grammars/version CHANGED
@@ -1 +1 @@
1
- 9.6.0
1
+ 9.7.0
data/lib/linguist/VERSION CHANGED
@@ -1 +1 @@
1
- 9.6.0
1
+ 9.7.0
@@ -119,6 +119,24 @@ module Linguist
119
119
  @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data
120
120
  end
121
121
 
122
+ # Public: Is the blob content a Git LFS pointer file?
123
+ #
124
+ # Return true or false
125
+ def lfs_pointer?
126
+ return false unless data
127
+
128
+ data.start_with?("version https://git-lfs.github.com/spec/v1\n") &&
129
+ data.include?("\noid sha256:") &&
130
+ data.match?(/\nsize \d+\n?\z/)
131
+ end
132
+
133
+ # Public: Is the blob path tracked by Git LFS?
134
+ #
135
+ # Return true or false
136
+ def lfs_tracked?
137
+ false
138
+ end
139
+
122
140
  # Public: Is the blob binary?
123
141
  #
124
142
  # Return true or false
@@ -380,6 +398,7 @@ module Linguist
380
398
  !vendored? &&
381
399
  !documentation? &&
382
400
  !generated? &&
401
+ !(lfs_tracked? && lfs_pointer?) &&
383
402
  language && ( defined?(detectable?) && !detectable?.nil? ?
384
403
  detectable? :
385
404
  DETECTABLE_TYPES.include?(language.type)
@@ -93,12 +93,14 @@ module Linguist
93
93
  gradle_wrapper? ||
94
94
  maven_wrapper? ||
95
95
  mise_lock? ||
96
+ secrets_baseline? ||
96
97
  julia_manifest? ||
97
98
  generated_go? ||
98
99
  generated_protocol_buffer_from_go? ||
99
100
  generated_protocol_buffer? ||
100
101
  generated_javascript_protocol_buffer? ||
101
102
  generated_typescript_protocol_buffer? ||
103
+ generated_twirp_ruby? ||
102
104
  generated_apache_thrift? ||
103
105
  generated_jni_header? ||
104
106
  vcr_cassette? ||
@@ -400,6 +402,21 @@ module Linguist
400
402
  return lines[0].include?("Code generated by protoc-gen-ts_proto. DO NOT EDIT.")
401
403
  end
402
404
 
405
+ # Internal: Is the blob a Ruby source file generated by the
406
+ # protoc-gen-twirp_ruby plugin?
407
+ #
408
+ # Files generated by protoc-gen-twirp_ruby start with a header like:
409
+ #
410
+ # # Code generated by protoc-gen-twirp_ruby 1.14.1, DO NOT EDIT.
411
+ #
412
+ # Returns true or false.
413
+ def generated_twirp_ruby?
414
+ return false unless extname == ".rb"
415
+ return false unless lines.count > 1
416
+
417
+ return lines.first(3).any? { |l| l.include?("Code generated by protoc-gen-twirp_ruby") && l.include?("DO NOT EDIT.") }
418
+ end
419
+
403
420
  APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php']
404
421
 
405
422
  # Internal: Is the blob generated by Apache Thrift compiler?
@@ -591,6 +608,13 @@ module Linguist
591
608
  !!name.match(/(?:^|\/)mise(?:\.[^\/]+)?\.lock$/)
592
609
  end
593
610
 
611
+ # Internal: Is the blob a detect-secrets baseline file?
612
+ #
613
+ # Returns true or false.
614
+ def secrets_baseline?
615
+ !!name.match(/(?:^|\/)\.secrets\.baseline$/)
616
+ end
617
+
594
618
  # Internal: Is the blob a Julia Manifest.toml file?
595
619
  #
596
620
  # Returns true or false.
@@ -21,6 +21,7 @@ extensions:
21
21
  - ".msg"
22
22
  - ".network"
23
23
  - ".resource"
24
+ - ".sd"
24
25
  - ".sol"
25
26
  - ".srv"
26
27
  - ".stl"
@@ -65,8 +65,20 @@ disambiguations:
65
65
  rules:
66
66
  # AL pattern source from https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage - keyword.other.applicationobject.al
67
67
  - language: AL
68
- and:
69
- - pattern: '\b(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|DOTNET|ENUM|ENUMEXTENSION|VALUE|QUERY|REPORT|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|CONTROLADDIN|REPORTEXTENSION|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\b'
68
+ pattern:
69
+ # An object declaration, "<kind> <id> <name>", starting a line, with the
70
+ # name required. The anchor matters: page and table are common Perl
71
+ # variable names and "Table of contents" is ordinary prose, so matching
72
+ # these keywords anywhere would claim Perl AutoLoader chunks.
73
+ # AL tooling commonly writes a UTF-8 BOM. It cannot be matched as bytes
74
+ # here: blob data is ASCII-8BIT, and a pattern containing the BOM bytes
75
+ # compiles to a UTF-8 Regexp, which raises Encoding::CompatibilityError.
76
+ # \A\W{0,3} skips it, the same way the B4X rule below does.
77
+ - '(?:\A\W{0,3}|^)\s*(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|ENUM|ENUMEXTENSION|QUERY|REPORT|REPORTEXTENSION|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|PROFILEEXTENSION|CONTROLADDIN|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\b\s+(?:\d|"|[A-Z])'
78
+ # DotNet alias objects are a bare keyword on their own line
79
+ - '(?:\A\W{0,3}|^)\s*(?i:DOTNET)\s*$'
80
+ # Namespace and using declarations, always terminated with a semicolon
81
+ - '(?:\A\W{0,3}|^)\s*(?i:(NAMESPACE|USING))\s+[\w.]+\s*;'
70
82
  # Open-ended fallback to Perl AutoLoader
71
83
  - language: Perl
72
84
  - extensions: ['.alg']
@@ -107,6 +119,15 @@ disambiguations:
107
119
  - language: LTspice Symbol
108
120
  pattern: '^SymbolType[ \t]'
109
121
  - language: Asymptote
122
+ - extensions: ['.b']
123
+ rules:
124
+ - language: B
125
+ pattern: '^\s*(?:extrn|auto|goto)\b'
126
+ negative_pattern: '^\s*(?:implement|include|load|ref)\b'
127
+ - language: Brainfuck
128
+ pattern: '(>\+>|>\+<)'
129
+ - language: Limbo
130
+ pattern: '(?:^\w+\s*:\s*module\s*\{)|(implement \w+;)'
110
131
  - extensions: ['.bas']
111
132
  rules:
112
133
  - language: B4X
@@ -280,6 +301,11 @@ disambiguations:
280
301
  pattern: '^\s*(?:%%|main\s*\(.*?\)\s*->)'
281
302
  - language: JavaScript
282
303
  pattern: '\/\/|["'']use strict["'']|export\s+default\s|\/\*(?:.|[\r\n])*?\*\/'
304
+ - extensions: ['.eslintrc']
305
+ rules:
306
+ - language: YAML
307
+ named_pattern: yaml
308
+ - language: JSON with Comments
283
309
  - extensions: ['.ex']
284
310
  rules:
285
311
  - language: Elixir
@@ -303,6 +329,15 @@ disambiguations:
303
329
  pattern: '^: '
304
330
  - language: Fortran
305
331
  named_pattern: fortran
332
+ - extensions: ['.fpp']
333
+ rules:
334
+ - language: FPP
335
+ pattern:
336
+ - '^\s*(active|passive|queued)\s+component\s'
337
+ - '^\s*(module|topology|struct|enum|port|interface)\s+[A-Za-z_$][A-Za-z0-9_]*\s*\{'
338
+ - '^\s*instance\s+[A-Za-z_$][A-Za-z0-9_]*\s*:'
339
+ - language: Fortran
340
+ named_pattern: fortran
306
341
  - extensions: ['.fr']
307
342
  rules:
308
343
  - language: Forth
@@ -442,6 +477,17 @@ disambiguations:
442
477
  pattern:
443
478
  - '^(?i)[^"m]*mov\s+[^\s]+,'
444
479
  - '^\s+(?i)db\s+[a-z\d]'
480
+ - extensions: ['.j']
481
+ rules:
482
+ - language: Jasmin
483
+ pattern: '^\s*\.(?:class|super|method|end\s+method|limit|field|source|bytecode)\b'
484
+ - language: Objective-J
485
+ pattern: '^\s*@(?:import|implementation|protocol|interface|typedef|end)\b'
486
+ - language: JASS
487
+ pattern:
488
+ - '^\s*(?:constant\s+)?(?:function|native)\s+\w+\s+takes\b'
489
+ - '^\s*end(?:function|globals|loop)\s*$'
490
+ - '^\s*(?:call|set|local|exitwhen)\s+\S'
445
491
  - extensions: ['.json']
446
492
  rules:
447
493
  - language: OASv2-json
@@ -480,7 +526,7 @@ disambiguations:
480
526
  - extensions: ['.lp']
481
527
  rules:
482
528
  - language: Lambdapi
483
- pattern: '(?:^|\s)symbol(?:$|\s)|(?:^|\s)rule(?:$|\s)'
529
+ pattern: '^\s*(?:opaque\s+symbol|symbol|rule|notation|constant|injective|require(?:\s+open)?|open|type|assert(?:not)?|compute)\b'
484
530
  - language: Linear Programming
485
531
  pattern: '(?i)^\s*(?:minimize|minimum|min|maximize|maximum|max)(?:\s+multi-objectives)?\s*$'
486
532
  - language: Answer Set Programming
@@ -580,6 +626,8 @@ disambiguations:
580
626
  and:
581
627
  - negative_pattern: '/\*'
582
628
  - pattern: '^\s*\.(?:include\s|globa?l\s|[A-Za-z][_A-Za-z0-9]*:)'
629
+ - language: MiniScript
630
+ pattern: '^\s*\bend (?:function|while|if|for)\b|\s\b(?:isa)\b\s'
583
631
  - language: MAXScript
584
632
  - extensions: ['.msg']
585
633
  rules:
@@ -766,6 +814,11 @@ disambiguations:
766
814
  pattern:
767
815
  - '^\s*#(?:(?:if|ifdef|define|pragma)\s+\w|\s*include\s+<[^>]+>)'
768
816
  - '^\s*template\s*<'
817
+ - extensions: ['.releaserc']
818
+ rules:
819
+ - language: YAML
820
+ named_pattern: yaml
821
+ - language: JSON
769
822
  - extensions: ['.res']
770
823
  rules:
771
824
  - language: ReScript
@@ -836,6 +889,15 @@ disambiguations:
836
889
  - '\(#[\w-]+[!\?]'
837
890
  - '(?:[\)\]]\s*[\*\+\?](?:\s|$))'
838
891
  - '@[\w.-]+(?:\)\s|$)'
892
+ - extensions: ['.sd']
893
+ rules:
894
+ - language: Vespa Schema Definition
895
+ pattern: '^[ \t]*(?:schema|search|document)[ \t]+[\w.\/-]+[ \t]*(?:inherits[ \t][^{\n]*)?\{'
896
+ - extensions: ['.sip']
897
+ rules:
898
+ - language: Quartus Simulation IP
899
+ pattern: '^[ \t]*set_global_assignment\b'
900
+ - language: SIP
839
901
  - extensions: ['.sol']
840
902
  rules:
841
903
  - language: Solidity
@@ -846,7 +908,7 @@ disambiguations:
846
908
  rules:
847
909
  # Postgres
848
910
  - language: PLpgSQL
849
- pattern: '(?i:^\\i\b|AS\s+\$\$|LANGUAGE\s+''?plpgsql''?|BEGIN(\s+WORK)?\s*;)'
911
+ pattern: '(?i:^\\i\b|^\s*DO\s+\$|LANGUAGE\s+''?plpgsql''?|BEGIN(\s+WORK)?\s*;)'
850
912
  # IBM db2
851
913
  - language: SQLPL
852
914
  pattern: '(?i:ALTER\s+MODULE|MODE\s+DB2SQL|\bSYS(CAT|PROC)\.|ASSOCIATE\s+RESULT\s+SET|\bEND!\s*$)'
@@ -1019,6 +1081,11 @@ disambiguations:
1019
1081
  - language: Typst
1020
1082
  pattern: '^#(import|show|let|set)'
1021
1083
  - language: XML
1084
+ - extensions: ['.uc']
1085
+ rules:
1086
+ - language: ucode
1087
+ named_pattern: ucode
1088
+ - language: UnrealScript
1022
1089
  - extensions: ['.url']
1023
1090
  rules:
1024
1091
  - language: INI
@@ -1033,7 +1100,7 @@ disambiguations:
1033
1100
  pattern: '\$(?:if|else)[ \t]|^[ \t]*fn\s+[^\s()]+\(.*?\).*?\{|^[ \t]*for\s*\{'
1034
1101
  - extensions: ['.vba']
1035
1102
  rules:
1036
- - language: Vim Script
1103
+ - language: Vim script
1037
1104
  pattern: '^UseVimball'
1038
1105
  - language: VBA
1039
1106
  - extensions: ['.vcf']
@@ -1137,6 +1204,13 @@ named_patterns:
1137
1204
  - '(?i)^[ ]*\$(CONSOLE|CHECKING):'
1138
1205
  - '(?i)^[ ]*\$(FULLSCREEN|RESIZE|STATIC|DYNAMIC|NOPREFIX|SCREENSHOW|SCREENHIDE|EXEICON)\b'
1139
1206
  raku: '^\s*(?:use\s+v6\b|\bmodule\b|\b(?:my\s+)?class\b)'
1207
+ ucode:
1208
+ - '^#!.*\bucode\b'
1209
+ - '^\s*[''"]use strict[''"];'
1210
+ - '^[ \t]*(?:export|import)\b'
1211
+ - '\b(?:require|include)\s*\(\s*[''"]'
1212
+ - '^\s*let\s+\w+'
1213
+ - '\b(?:printf|sprintf)\s*\('
1140
1214
  vb-class: '^[ ]*VERSION [0-9]\.[0-9] CLASS'
1141
1215
  vb-form: '^[ ]*VERSION [0-9]\.[0-9]{2}'
1142
1216
  vb-module: '^[ ]*Attribute VB_Name = '
@@ -1156,3 +1230,4 @@ named_patterns:
1156
1230
  # Excel objects
1157
1231
  - '\b(?:(?:This|Active)?Workbooks?|Worksheets?|Active(?:Sheet|Chart|Cell)|WorksheetFunction)\b'
1158
1232
  - '\b(?:Range\(".*|Cells\([0-9a-zA-Z_]*, (?:[0-9a-zA-Z_]*|"[a-zA-Z]{1,3}"))\)'
1233
+ yaml: '^[ \t]*(?:#|(?:[^/"\s:{}\[\]]|\/[^/*:\n])[^:\n]*:)'
@@ -1,10 +1,5 @@
1
1
  require 'cgi'
2
2
  require 'yaml'
3
- begin
4
- require 'yajl'
5
- rescue LoadError
6
- require 'json'
7
- end
8
3
 
9
4
  require 'linguist/classifier'
10
5
  require 'linguist/heuristics'
@@ -501,11 +496,12 @@ module Linguist
501
496
  popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__))
502
497
 
503
498
  languages_yml = File.expand_path("../languages.yml", __FILE__)
504
- languages_json = File.expand_path("../languages.json", __FILE__)
499
+ languages_rb = File.expand_path("../languages_data.rb", __FILE__)
505
500
 
506
- if File.exist?(languages_json)
507
- serializer = defined?(Yajl) ? Yajl : JSON
508
- languages = serializer.load(File.read(languages_json))
501
+ if File.exist?(languages_rb)
502
+ mod = Module.new
503
+ load(languages_rb, mod)
504
+ languages = mod::DATA
509
505
  else
510
506
  languages = YAML.load_file(languages_yml)
511
507
  end