diff --git a/.gitmodules b/.gitmodules
index 941dc61a..be2d7b30 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -680,3 +680,6 @@
[submodule "vendor/grammars/Stata.tmbundle"]
path = vendor/grammars/Stata.tmbundle
url = https://github.com/pschumm/Stata.tmbundle
+[submodule "vendor/grammars/FreeMarker.tmbundle"]
+ path = vendor/grammars/FreeMarker.tmbundle
+ url = https://github.com/freemarker/FreeMarker.tmbundle
diff --git a/grammars.yml b/grammars.yml
index 4bd66f12..4eee0d23 100644
--- a/grammars.yml
+++ b/grammars.yml
@@ -42,6 +42,8 @@ vendor/grammars/Docker.tmbundle:
- source.dockerfile
vendor/grammars/Elm.tmLanguage:
- source.elm
+vendor/grammars/FreeMarker.tmbundle:
+- text.html.ftl
vendor/grammars/G-Code/:
- source.LS
- source.MCPOST
diff --git a/lib/linguist/blob.rb b/lib/linguist/blob.rb
new file mode 100644
index 00000000..1be9f0b2
--- /dev/null
+++ b/lib/linguist/blob.rb
@@ -0,0 +1,73 @@
+require 'linguist/blob_helper'
+
+module Linguist
+ # A Blob is a wrapper around the content of a file to make it quack
+ # like a Grit::Blob. It provides the basic interface: `name`,
+ # `data`, `path` and `size`.
+ class Blob
+ include BlobHelper
+
+ # Public: Initialize a new Blob.
+ #
+ # path - A path String (does not necessarily exists on the file system).
+ # content - Content of the file.
+ #
+ # Returns a FileBlob.
+ def initialize(path, content)
+ @path = path
+ @content = content
+ end
+
+ # Public: Filename
+ #
+ # Examples
+ #
+ # Blob.new("/path/to/linguist/lib/linguist.rb", "").path
+ # # => "/path/to/linguist/lib/linguist.rb"
+ #
+ # Returns a String
+ attr_reader :path
+
+ # Public: File name
+ #
+ # Returns a String
+ def name
+ File.basename(@path)
+ end
+
+ # Public: File contents.
+ #
+ # Returns a String.
+ def data
+ @content
+ end
+
+ # Public: Get byte size
+ #
+ # Returns an Integer.
+ def size
+ @content.bytesize
+ end
+
+ # Public: Get file extension.
+ #
+ # Returns a String.
+ def extension
+ extensions.last || ""
+ end
+
+ # Public: Return an array of the file extensions
+ #
+ # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions
+ # => [".html.erb", ".erb"]
+ #
+ # Returns an Array
+ def extensions
+ basename, *segments = name.downcase.split(".")
+
+ segments.map.with_index do |segment, index|
+ "." + segments[index..-1].join(".")
+ end
+ end
+ end
+end
diff --git a/lib/linguist/file_blob.rb b/lib/linguist/file_blob.rb
index 20d87bb0..5f8bc373 100644
--- a/lib/linguist/file_blob.rb
+++ b/lib/linguist/file_blob.rb
@@ -1,10 +1,11 @@
require 'linguist/blob_helper'
+require 'linguist/blob'
module Linguist
# A FileBlob is a wrapper around a File object to make it quack
# like a Grit::Blob. It provides the basic interface: `name`,
# `data`, `path` and `size`.
- class FileBlob
+ class FileBlob < Blob
include BlobHelper
# Public: Initialize a new FileBlob from a path
@@ -18,20 +19,6 @@ module Linguist
@path = base_path ? path.sub("#{base_path}/", '') : path
end
- # Public: Filename
- #
- # Examples
- #
- # FileBlob.new("/path/to/linguist/lib/linguist.rb").path
- # # => "/path/to/linguist/lib/linguist.rb"
- #
- # FileBlob.new("/path/to/linguist/lib/linguist.rb",
- # "/path/to/linguist").path
- # # => "lib/linguist.rb"
- #
- # Returns a String
- attr_reader :path
-
# Public: Read file permissions
#
# Returns a String like '100644'
@@ -39,13 +26,6 @@ module Linguist
File.stat(@fullpath).mode.to_s(8)
end
- # Public: File name
- #
- # Returns a String
- def name
- File.basename(@fullpath)
- end
-
# Public: Read file contents.
#
# Returns a String.
@@ -59,26 +39,5 @@ module Linguist
def size
File.size(@fullpath)
end
-
- # Public: Get file extension.
- #
- # Returns a String.
- def extension
- extensions.last || ""
- end
-
- # Public: Return an array of the file extensions
- #
- # >> Linguist::FileBlob.new("app/views/things/index.html.erb").extensions
- # => [".html.erb", ".erb"]
- #
- # Returns an Array
- def extensions
- basename, *segments = name.downcase.split(".")
-
- segments.map.with_index do |segment, index|
- "." + segments[index..-1].join(".")
- end
- end
end
end
diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb
index d107e737..35766e4d 100644
--- a/lib/linguist/generated.rb
+++ b/lib/linguist/generated.rb
@@ -71,7 +71,8 @@ module Linguist
generated_jni_header? ||
vcr_cassette? ||
generated_module? ||
- generated_unity3d_meta?
+ generated_unity3d_meta? ||
+ generated_racc?
end
# Internal: Is the blob an Xcode file?
@@ -359,5 +360,18 @@ module Linguist
return false unless lines.count > 1
return lines[0].include?("fileFormatVersion: ")
end
+
+ # Internal: Is this a Racc-generated file?
+ #
+ # A Racc-generated file contains:
+ # # This file is automatically generated by Racc x.y.z
+ # on the third line.
+ #
+ # Return true or false
+ def generated_racc?
+ return false unless extname == '.rb'
+ return false unless lines.count > 2
+ return lines[2].start_with?("# This file is automatically generated by Racc")
+ end
end
end
diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml
index 420965c4..c1191dbc 100644
--- a/lib/linguist/languages.yml
+++ b/lib/linguist/languages.yml
@@ -1029,6 +1029,16 @@ Forth:
- .fs
ace_mode: forth
+FreeMarker:
+ type: programming
+ color: "#0050b2"
+ aliases:
+ - ftl
+ extensions:
+ - .ftl
+ tm_scope: text.html.ftl
+ ace_mode: ftl
+
Frege:
type: programming
color: "#00cafe"
@@ -1323,6 +1333,16 @@ HTML+Django:
- htmldjango
ace_mode: django
+HTML+EEX:
+ type: markup
+ tm_scope: text.html.elixir
+ group: HTML
+ aliases:
+ - eex
+ extensions:
+ - .eex
+ ace_mode: text
+
HTML+ERB:
type: markup
tm_scope: text.html.erb
@@ -1332,7 +1352,7 @@ HTML+ERB:
extensions:
- .erb
- .erb.deface
- ace_mode: html_ruby
+ ace_mode: text
HTML+PHP:
type: markup
@@ -2063,6 +2083,14 @@ Mercury:
tm_scope: source.mercury
ace_mode: prolog
+Metal:
+ type: programming
+ color: "#8f14e9"
+ extensions:
+ - .metal
+ tm_scope: source.c++
+ ace_mode: c_cpp
+
MiniD: # Legacy
type: programming
searchable: false
diff --git a/samples/FreeMarker/example.ftl b/samples/FreeMarker/example.ftl
new file mode 100644
index 00000000..10a6ee95
--- /dev/null
+++ b/samples/FreeMarker/example.ftl
@@ -0,0 +1,31 @@
+<#import "layout.ftl" as layout>
+
+<#assign results = [
+ {
+ "title": "Example Result",
+ "description": "Lorem ipsum dolor sit amet, pede id pellentesque, sollicitudin turpis sed in sed sed, libero dictum."
+ }
+ ] />
+
+<@layout.page title="FreeMarker Example">
+ <#if results?size == 0>
+ There were no results.
+ <#else>
+
+ <#list results as result>
+ -
+ ${result.title}
+
${result.description}
+
+ #list>
+
+ #if>
+
+ <#-- This is a FreeMarker comment -->
+ <@currentTime />
+@layout.page>
+
+
+<#macro currentTime>
+ ${.now?string.full}
+#macro>
diff --git a/samples/FreeMarker/layout.ftl b/samples/FreeMarker/layout.ftl
new file mode 100644
index 00000000..18512dd6
--- /dev/null
+++ b/samples/FreeMarker/layout.ftl
@@ -0,0 +1,32 @@
+<#ftl strip_text=true />
+
+<#macro page title>
+
+
+
+ ${title}
+ <@metaTags />
+
+
+ <#nested />
+ <@footer />
+
+
+#macro>
+
+
+<#---
+ Default meta tags
+-->
+<#macro metaTags>
+ <#compress>
+
+
+
+
+ #compress>
+#macro>
+
+<#macro footer>
+ This page is using FreeMarker v${.version}
+#macro>
diff --git a/samples/HTML+EEX/index.html.eex b/samples/HTML+EEX/index.html.eex
new file mode 100644
index 00000000..5960a441
--- /dev/null
+++ b/samples/HTML+EEX/index.html.eex
@@ -0,0 +1,26 @@
+Listing Books
+
+
+
+ | Title |
+ Summary |
+ |
+ |
+ |
+
+
+<%= for book <- @books do %>
+
+ <%# comment %>
+ | <%= book.title %> |
+ <%= book.content %> |
+ <%= link "Show", to: book_path(@conn, :show, book) %> |
+ <%= link "Edit", to: book_path(@conn, :edit, book) %> |
+ <%= link "Delete", to: book_path(@conn, :delete, book), method: :delete, data: [confirm: "Are you sure?"] %> |
+
+<% end %>
+
+
+
+
+<%= link "New book", to: book_path(@conn, :new) %>
diff --git a/samples/Metal/ITMVisualisationEngine.metal b/samples/Metal/ITMVisualisationEngine.metal
new file mode 100644
index 00000000..a1372178
--- /dev/null
+++ b/samples/Metal/ITMVisualisationEngine.metal
@@ -0,0 +1,99 @@
+// Copyright 2014 Isis Innovation Limited and the authors of InfiniTAM
+
+#include
+
+#include "../../DeviceAgnostic/ITMSceneReconstructionEngine.h"
+#include "../../DeviceAgnostic/ITMVisualisationEngine.h"
+#include "ITMVisualisationEngine_Metal.h"
+
+using namespace metal;
+
+kernel void genericRaycastVH_device(DEVICEPTR(Vector4f) *pointsRay [[ buffer(0) ]],
+ const CONSTPTR(ITMVoxel) *voxelData [[ buffer(1) ]],
+ const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex [[ buffer(2) ]],
+ const CONSTPTR(Vector2f) *minmaxdata [[ buffer(3) ]],
+ const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(4) ]],
+ uint2 threadIdx [[ thread_position_in_threadgroup ]],
+ uint2 blockIdx [[ threadgroup_position_in_grid ]],
+ uint2 blockDim [[ threads_per_threadgroup ]])
+{
+ int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;
+
+ if (x >= params->imgSize.x || y >= params->imgSize.y) return;
+
+ int locId = x + y * params->imgSize.x;
+ int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x;
+
+ castRay(pointsRay[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams,
+ params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]);
+}
+
+kernel void genericRaycastVGMissingPoints_device(DEVICEPTR(Vector4f) *forwardProjection [[ buffer(0) ]],
+ const CONSTPTR(int) *fwdProjMissingPoints [[ buffer(1) ]],
+ const CONSTPTR(ITMVoxel) *voxelData [[ buffer(2) ]],
+ const CONSTPTR(typename ITMVoxelIndex::IndexData) *voxelIndex [[ buffer(3) ]],
+ const CONSTPTR(Vector2f) *minmaxdata [[ buffer(4) ]],
+ const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(5) ]],
+ uint2 threadIdx [[ thread_position_in_threadgroup ]],
+ uint2 blockIdx [[ threadgroup_position_in_grid ]],
+ uint2 blockDim [[ threads_per_threadgroup ]])
+{
+ int pointId = threadIdx.x + blockIdx.x * blockDim.x;
+
+ if (pointId >= params->imgSize.z) return;
+
+ int locId = fwdProjMissingPoints[pointId];
+ int y = locId / params->imgSize.x, x = locId - y * params->imgSize.x;
+ int locId2 = (int)floor((float)x / minmaximg_subsample) + (int)floor((float)y / minmaximg_subsample) * params->imgSize.x;
+
+ castRay(forwardProjection[locId], x, y, voxelData, voxelIndex, params->invM, params->invProjParams,
+ params->voxelSizes.y, params->lightSource.w, minmaxdata[locId2]);
+}
+
+kernel void renderICP_device(const CONSTPTR(Vector4f) *pointsRay [[ buffer(0) ]],
+ DEVICEPTR(Vector4f) *pointsMap [[ buffer(1) ]],
+ DEVICEPTR(Vector4f) *normalsMap [[ buffer(2) ]],
+ DEVICEPTR(Vector4u) *outRendering [[ buffer(3) ]],
+ const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(4) ]],
+ uint2 threadIdx [[ thread_position_in_threadgroup ]],
+ uint2 blockIdx [[ threadgroup_position_in_grid ]],
+ uint2 blockDim [[ threads_per_threadgroup ]])
+{
+ int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;
+
+ if (x >= params->imgSize.x || y >= params->imgSize.y) return;
+
+ processPixelICP(outRendering, pointsMap, normalsMap, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource));
+}
+
+kernel void renderForward_device(DEVICEPTR(Vector4u) *outRendering [[ buffer(0) ]],
+ const CONSTPTR(Vector4f) *pointsRay [[ buffer(1) ]],
+ const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(2) ]],
+ uint2 threadIdx [[ thread_position_in_threadgroup ]],
+ uint2 blockIdx [[ threadgroup_position_in_grid ]],
+ uint2 blockDim [[ threads_per_threadgroup ]])
+{
+ int x = threadIdx.x + blockIdx.x * blockDim.x, y = threadIdx.y + blockIdx.y * blockDim.y;
+
+ if (x >= params->imgSize.x || y >= params->imgSize.y) return;
+
+ processPixelForwardRender(outRendering, pointsRay, params->imgSize.xy, x, y, params->voxelSizes.x, TO_VECTOR3(params->lightSource));
+}
+
+kernel void forwardProject_device(DEVICEPTR(Vector4f) *forwardProjection [[ buffer(0) ]],
+ const CONSTPTR(Vector4f) *pointsRay [[ buffer(1) ]],
+ const CONSTPTR(CreateICPMaps_Params) *params [[ buffer(2) ]],
+ uint2 threadIdx [[ thread_position_in_threadgroup ]],
+ uint2 blockIdx [[ threadgroup_position_in_grid ]],
+ uint2 blockDim [[ threads_per_threadgroup ]])
+{
+ int x = (threadIdx.x + blockIdx.x * blockDim.x), y = (threadIdx.y + blockIdx.y * blockDim.y);
+
+ if (x >= params->imgSize.x || y >= params->imgSize.y) return;
+
+ int locId = x + y * params->imgSize.x;
+ Vector4f pixel = pointsRay[locId];
+
+ int locId_new = forwardProjectPixel(pixel * params->voxelSizes.x, params->M, params->projParams, params->imgSize.xy);
+ if (locId_new >= 0) forwardProjection[locId_new] = pixel;
+}
\ No newline at end of file
diff --git a/samples/Ruby/racc.rb b/samples/Ruby/racc.rb
new file mode 100644
index 00000000..a3e7f51c
--- /dev/null
+++ b/samples/Ruby/racc.rb
@@ -0,0 +1,267 @@
+#
+# DO NOT MODIFY!!!!
+# This file is automatically generated by Racc 1.4.7
+# from Racc grammer file "".
+#
+
+require 'racc/parser.rb'
+module RJSON
+ class Parser < Racc::Parser
+
+
+ require 'rjson/handler'
+
+ attr_reader :handler
+
+ def initialize tokenizer, handler = Handler.new
+ @tokenizer = tokenizer
+ @handler = handler
+ super()
+ end
+
+ def next_token
+ @tokenizer.next_token
+ end
+
+ def parse
+ do_parse
+ handler
+ end
+##### State transition tables begin ###
+
+racc_action_table = [
+ 9, 33, 9, 11, 13, 16, 19, 22, 9, 7,
+ 23, 1, 9, 11, 13, 16, 19, 29, 30, 7,
+ 21, 1, 9, 11, 13, 16, 19, 31, nil, 7,
+ 21, 1, 23, 7, nil, 1 ]
+
+racc_action_check = [
+ 6, 27, 33, 33, 33, 33, 33, 3, 31, 33,
+ 6, 33, 29, 29, 29, 29, 29, 12, 22, 29,
+ 12, 29, 2, 2, 2, 2, 2, 25, nil, 2,
+ 2, 2, 25, 0, nil, 0 ]
+
+racc_action_pointer = [
+ 24, nil, 20, 7, nil, nil, -2, nil, nil, nil,
+ nil, nil, 10, nil, nil, nil, nil, nil, nil, nil,
+ nil, nil, 18, nil, nil, 20, nil, -7, nil, 10,
+ nil, 6, nil, 0, nil, nil, nil ]
+
+racc_action_default = [
+ -27, -12, -21, -27, -1, -2, -27, -10, -15, -26,
+ -8, -22, -27, -23, -17, -16, -24, -20, -18, -25,
+ -19, -11, -27, -13, -3, -27, -6, -27, -9, -21,
+ 37, -27, -4, -21, -14, -5, -7 ]
+
+racc_goto_table = [
+ 8, 26, 24, 27, 10, 3, 25, 5, 4, 12,
+ nil, nil, nil, nil, 28, nil, nil, nil, nil, nil,
+ nil, 32, nil, nil, nil, nil, 35, 34, 27, nil,
+ nil, 36 ]
+
+racc_goto_check = [
+ 9, 7, 5, 8, 11, 1, 6, 3, 2, 12,
+ nil, nil, nil, nil, 11, nil, nil, nil, nil, nil,
+ nil, 5, nil, nil, nil, nil, 7, 9, 8, nil,
+ nil, 9 ]
+
+racc_goto_pointer = [
+ nil, 5, 8, 7, nil, -4, 0, -5, -3, -2,
+ nil, 2, 7, nil, nil ]
+
+racc_goto_default = [
+ nil, nil, 14, 18, 6, nil, nil, nil, 20, nil,
+ 2, nil, nil, 15, 17 ]
+
+racc_reduce_table = [
+ 0, 0, :racc_error,
+ 1, 14, :_reduce_none,
+ 1, 14, :_reduce_none,
+ 2, 15, :_reduce_none,
+ 3, 15, :_reduce_none,
+ 3, 19, :_reduce_none,
+ 1, 19, :_reduce_none,
+ 3, 20, :_reduce_none,
+ 2, 16, :_reduce_none,
+ 3, 16, :_reduce_none,
+ 1, 23, :_reduce_10,
+ 1, 24, :_reduce_11,
+ 1, 17, :_reduce_12,
+ 1, 18, :_reduce_13,
+ 3, 25, :_reduce_none,
+ 1, 25, :_reduce_none,
+ 1, 22, :_reduce_none,
+ 1, 22, :_reduce_none,
+ 1, 22, :_reduce_none,
+ 1, 26, :_reduce_none,
+ 1, 26, :_reduce_20,
+ 0, 27, :_reduce_none,
+ 1, 27, :_reduce_22,
+ 1, 27, :_reduce_23,
+ 1, 27, :_reduce_24,
+ 1, 27, :_reduce_25,
+ 1, 21, :_reduce_26 ]
+
+racc_reduce_n = 27
+
+racc_shift_n = 37
+
+racc_token_table = {
+ false => 0,
+ :error => 1,
+ :STRING => 2,
+ :NUMBER => 3,
+ :TRUE => 4,
+ :FALSE => 5,
+ :NULL => 6,
+ "," => 7,
+ ":" => 8,
+ "[" => 9,
+ "]" => 10,
+ "{" => 11,
+ "}" => 12 }
+
+racc_nt_base = 13
+
+racc_use_result_var = true
+
+Racc_arg = [
+ racc_action_table,
+ racc_action_check,
+ racc_action_default,
+ racc_action_pointer,
+ racc_goto_table,
+ racc_goto_check,
+ racc_goto_default,
+ racc_goto_pointer,
+ racc_nt_base,
+ racc_reduce_table,
+ racc_token_table,
+ racc_shift_n,
+ racc_reduce_n,
+ racc_use_result_var ]
+
+Racc_token_to_s_table = [
+ "$end",
+ "error",
+ "STRING",
+ "NUMBER",
+ "TRUE",
+ "FALSE",
+ "NULL",
+ "\",\"",
+ "\":\"",
+ "\"[\"",
+ "\"]\"",
+ "\"{\"",
+ "\"}\"",
+ "$start",
+ "document",
+ "object",
+ "array",
+ "start_object",
+ "end_object",
+ "pairs",
+ "pair",
+ "string",
+ "value",
+ "start_array",
+ "end_array",
+ "values",
+ "scalar",
+ "literal" ]
+
+Racc_debug_parser = false
+
+##### State transition tables end #####
+
+# reduce 0 omitted
+
+# reduce 1 omitted
+
+# reduce 2 omitted
+
+# reduce 3 omitted
+
+# reduce 4 omitted
+
+# reduce 5 omitted
+
+# reduce 6 omitted
+
+# reduce 7 omitted
+
+# reduce 8 omitted
+
+# reduce 9 omitted
+
+def _reduce_10(val, _values, result)
+ @handler.start_array
+ result
+end
+
+def _reduce_11(val, _values, result)
+ @handler.end_array
+ result
+end
+
+def _reduce_12(val, _values, result)
+ @handler.start_object
+ result
+end
+
+def _reduce_13(val, _values, result)
+ @handler.end_object
+ result
+end
+
+# reduce 14 omitted
+
+# reduce 15 omitted
+
+# reduce 16 omitted
+
+# reduce 17 omitted
+
+# reduce 18 omitted
+
+# reduce 19 omitted
+
+def _reduce_20(val, _values, result)
+ @handler.scalar val[0]
+ result
+end
+
+# reduce 21 omitted
+
+def _reduce_22(val, _values, result)
+ n = val[0]; result = n.count('.') > 0 ? n.to_f : n.to_i
+ result
+end
+
+def _reduce_23(val, _values, result)
+ result = true
+ result
+end
+
+def _reduce_24(val, _values, result)
+ result = false
+ result
+end
+
+def _reduce_25(val, _values, result)
+ result = nil
+ result
+end
+
+def _reduce_26(val, _values, result)
+ @handler.scalar val[0].gsub(/^"|"$/, '')
+ result
+end
+
+def _reduce_none(val, _values, result)
+ val[0]
+end
+
+ end # class Parser
+ end # module RJSON
diff --git a/test/helper.rb b/test/helper.rb
index 80060c29..deb7ef5b 100644
--- a/test/helper.rb
+++ b/test/helper.rb
@@ -3,6 +3,7 @@ require "minitest/autorun"
require "mocha/setup"
require "linguist"
require 'color-proximity'
+require "linguist/blob"
require 'licensee'
def fixtures_path
@@ -10,8 +11,14 @@ def fixtures_path
end
def fixture_blob(name)
- name = File.join(fixtures_path, name) unless name =~ /^\//
- Linguist::FileBlob.new(name, fixtures_path)
+ filepath = (name =~ /^\//)? name : File.join(fixtures_path, name)
+ Linguist::FileBlob.new(filepath, fixtures_path)
+end
+
+def fixture_blob_memory(name)
+ filepath = (name =~ /^\//)? name : File.join(fixtures_path, name)
+ content = File.read(filepath)
+ Linguist::Blob.new(name, content)
end
def samples_path
@@ -19,6 +26,12 @@ def samples_path
end
def sample_blob(name)
- name = File.join(samples_path, name) unless name =~ /^\//
- Linguist::FileBlob.new(name, samples_path)
+ filepath = (name =~ /^\//)? name : File.join(samples_path, name)
+ Linguist::FileBlob.new(filepath, samples_path)
+end
+
+def sample_blob_memory(name)
+ filepath = (name =~ /^\//)? name : File.join(samples_path, name)
+ content = File.read(filepath)
+ Linguist::Blob.new(name, content)
end
diff --git a/test/test_blob.rb b/test/test_blob.rb
index 1ba647b0..352d4b07 100644
--- a/test/test_blob.rb
+++ b/test/test_blob.rb
@@ -15,50 +15,47 @@ class TestBlob < Minitest::Test
end
def script_blob(name)
- blob = sample_blob(name)
+ blob = sample_blob_memory(name)
blob.instance_variable_set(:@name, 'script')
blob
end
def test_name
- assert_equal "foo.rb", sample_blob("foo.rb").name
+ assert_equal "foo.rb", sample_blob_memory("Ruby/foo.rb").name
end
def test_mime_type
- assert_equal "application/postscript", fixture_blob("Binary/octocat.ai").mime_type
- assert_equal "application/x-ruby", sample_blob("Ruby/grit.rb").mime_type
- assert_equal "application/x-sh", sample_blob("Shell/script.sh").mime_type
- assert_equal "application/xml", sample_blob("XML/bar.xml").mime_type
- assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").mime_type
- assert_equal "text/plain", fixture_blob("Data/README").mime_type
+ assert_equal "application/postscript", fixture_blob_memory("Binary/octocat.ai").mime_type
+ assert_equal "application/x-ruby", sample_blob_memory("Ruby/grit.rb").mime_type
+ assert_equal "application/x-sh", sample_blob_memory("Shell/script.sh").mime_type
+ assert_equal "text/plain", fixture_blob_memory("Data/README").mime_type
end
def test_content_type
- assert_equal "application/pdf", fixture_blob("Binary/foo.pdf").content_type
- assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").content_type
- assert_equal "image/png", fixture_blob("Binary/foo.png").content_type
- assert_equal "text/plain; charset=iso-8859-2", fixture_blob("Data/README").content_type
+ assert_equal "application/pdf", fixture_blob_memory("Binary/foo.pdf").content_type
+ assert_equal "image/png", fixture_blob_memory("Binary/foo.png").content_type
+ assert_equal "text/plain; charset=iso-8859-2", fixture_blob_memory("Data/README").content_type
end
def test_disposition
- assert_equal "attachment; filename=foo+bar.jar", fixture_blob("Binary/foo bar.jar").disposition
- assert_equal "attachment; filename=foo.bin", fixture_blob("Binary/foo.bin").disposition
- assert_equal "attachment; filename=linguist.gem", fixture_blob("Binary/linguist.gem").disposition
- assert_equal "attachment; filename=octocat.ai", fixture_blob("Binary/octocat.ai").disposition
- assert_equal "inline", fixture_blob("Data/README").disposition
- assert_equal "inline", sample_blob("Text/foo.txt").disposition
- assert_equal "inline", sample_blob("Ruby/grit.rb").disposition
- assert_equal "inline", fixture_blob("Binary/octocat.png").disposition
+ assert_equal "attachment; filename=foo+bar.jar", fixture_blob_memory("Binary/foo bar.jar").disposition
+ assert_equal "attachment; filename=foo.bin", fixture_blob_memory("Binary/foo.bin").disposition
+ assert_equal "attachment; filename=linguist.gem", fixture_blob_memory("Binary/linguist.gem").disposition
+ assert_equal "attachment; filename=octocat.ai", fixture_blob_memory("Binary/octocat.ai").disposition
+ assert_equal "inline", fixture_blob_memory("Data/README").disposition
+ assert_equal "inline", sample_blob_memory("Text/foo.txt").disposition
+ assert_equal "inline", sample_blob_memory("Ruby/grit.rb").disposition
+ assert_equal "inline", fixture_blob_memory("Binary/octocat.png").disposition
end
def test_data
- assert_equal "module Foo\nend\n", sample_blob("Ruby/foo.rb").data
+ assert_equal "module Foo\nend\n", sample_blob_memory("Ruby/foo.rb").data
end
def test_lines
- assert_equal ["module Foo", "end", ""], sample_blob("Ruby/foo.rb").lines
- assert_equal ["line 1", "line 2", ""], sample_blob("Text/mac.txt").lines
- assert_equal 475, sample_blob("Emacs Lisp/ess-julia.el").lines.length
+ assert_equal ["module Foo", "end", ""], sample_blob_memory("Ruby/foo.rb").lines
+ assert_equal ["line 1", "line 2", ""], sample_blob_memory("Text/mac.txt").lines
+ assert_equal 475, sample_blob_memory("Emacs Lisp/ess-julia.el").lines.length
end
def test_lines_maintains_original_encoding
@@ -66,534 +63,173 @@ class TestBlob < Minitest::Test
# earlier versions of the gem made implicit guarantees that the encoding of
# each `line` is in the same encoding as the file was originally read (in
# practice, UTF-8 or ASCII-8BIT)
- assert_equal Encoding.default_external, fixture_blob("Data/utf16le").lines.first.encoding
+ assert_equal Encoding.default_external, fixture_blob_memory("Data/utf16le").lines.first.encoding
end
def test_size
- assert_equal 15, sample_blob("Ruby/foo.rb").size
+ assert_equal 15, sample_blob_memory("Ruby/foo.rb").size
end
def test_loc
- assert_equal 3, sample_blob("Ruby/foo.rb").loc
+ assert_equal 3, sample_blob_memory("Ruby/foo.rb").loc
end
def test_sloc
- assert_equal 2, sample_blob("Ruby/foo.rb").sloc
- assert_equal 3, fixture_blob("Data/utf16le-windows").sloc
- assert_equal 1, fixture_blob("Data/iso8859-8-i").sloc
+ assert_equal 2, sample_blob_memory("Ruby/foo.rb").sloc
+ assert_equal 3, fixture_blob_memory("Data/utf16le-windows").sloc
+ assert_equal 1, fixture_blob_memory("Data/iso8859-8-i").sloc
end
def test_encoding
- assert_equal "ISO-8859-2", fixture_blob("Data/README").encoding
- assert_equal "ISO-8859-2", fixture_blob("Data/README").ruby_encoding
- assert_equal "UTF-8", sample_blob("Text/foo.txt").encoding
- assert_equal "UTF-8", sample_blob("Text/foo.txt").ruby_encoding
- assert_equal "UTF-16LE", fixture_blob("Data/utf16le").encoding
- assert_equal "UTF-16LE", fixture_blob("Data/utf16le").ruby_encoding
- assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").encoding
- assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").ruby_encoding
- assert_equal "ISO-2022-KR", sample_blob("Text/ISO-2022-KR.txt").encoding
- assert_equal "binary", sample_blob("Text/ISO-2022-KR.txt").ruby_encoding
- assert_nil fixture_blob("Binary/dog.o").encoding
+ assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").encoding
+ assert_equal "ISO-8859-2", fixture_blob_memory("Data/README").ruby_encoding
+ assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").encoding
+ assert_equal "UTF-8", sample_blob_memory("Text/foo.txt").ruby_encoding
+ assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").encoding
+ assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le").ruby_encoding
+ assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").encoding
+ assert_equal "UTF-16LE", fixture_blob_memory("Data/utf16le-windows").ruby_encoding
+ assert_equal "ISO-2022-KR", sample_blob_memory("Text/ISO-2022-KR.txt").encoding
+ assert_equal "binary", sample_blob_memory("Text/ISO-2022-KR.txt").ruby_encoding
+ assert_nil fixture_blob_memory("Binary/dog.o").encoding
end
def test_binary
- # Large blobs aren't loaded
- large_blob = sample_blob("git.exe")
- large_blob.instance_eval do
- def data; end
- end
- assert large_blob.binary?
-
- assert fixture_blob("Binary/git.deb").binary?
- assert fixture_blob("Binary/git.exe").binary?
- assert fixture_blob("Binary/hello.pbc").binary?
- assert fixture_blob("Binary/linguist.gem").binary?
- assert fixture_blob("Binary/octocat.ai").binary?
- assert fixture_blob("Binary/octocat.png").binary?
- assert fixture_blob("Binary/zip").binary?
- assert !fixture_blob("Data/README").binary?
- assert !sample_blob("Ruby/foo.rb").binary?
- assert !sample_blob("Perl/script.pl").binary?
+ assert fixture_blob_memory("Binary/git.deb").binary?
+ assert fixture_blob_memory("Binary/hello.pbc").binary?
+ assert fixture_blob_memory("Binary/linguist.gem").binary?
+ assert fixture_blob_memory("Binary/octocat.ai").binary?
+ assert fixture_blob_memory("Binary/octocat.png").binary?
+ assert fixture_blob_memory("Binary/zip").binary?
+ assert !fixture_blob_memory("Data/README").binary?
+ assert !sample_blob_memory("Ruby/foo.rb").binary?
+ assert !sample_blob_memory("Perl/script.pl").binary?
end
def test_all_binary
Samples.each do |sample|
- blob = sample_blob(sample[:path])
+ blob = sample_blob_memory(sample[:path])
assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file"
end
end
def test_text
- assert fixture_blob("Data/README").text?
- assert fixture_blob("Data/md").text?
- assert sample_blob("Shell/script.sh").text?
- assert fixture_blob("Data/txt").text?
+ assert fixture_blob_memory("Data/README").text?
+ assert fixture_blob_memory("Data/md").text?
+ assert sample_blob_memory("Shell/script.sh").text?
+ assert fixture_blob_memory("Data/txt").text?
end
def test_image
- assert fixture_blob("Binary/octocat.gif").image?
- assert fixture_blob("Binary/octocat.jpeg").image?
- assert fixture_blob("Binary/octocat.jpg").image?
- assert fixture_blob("Binary/octocat.png").image?
- assert !fixture_blob("Binary/octocat.ai").image?
- assert !fixture_blob("Binary/octocat.psd").image?
+ assert fixture_blob_memory("Binary/octocat.png").image?
+ assert !fixture_blob_memory("Binary/octocat.ai").image?
+ assert !fixture_blob_memory("Binary/octocat.psd").image?
end
def test_solid
- assert fixture_blob("Binary/cube.stl").solid?
- assert fixture_blob("Data/cube.stl").solid?
+ assert fixture_blob_memory("Binary/cube.stl").solid?
+ assert fixture_blob_memory("Data/cube.stl").solid?
end
def test_csv
- assert fixture_blob("Data/cars.csv").csv?
+ assert fixture_blob_memory("Data/cars.csv").csv?
end
def test_pdf
- assert fixture_blob("Binary/foo.pdf").pdf?
+ assert fixture_blob_memory("Binary/foo.pdf").pdf?
end
def test_viewable
- assert fixture_blob("Data/README").viewable?
- assert sample_blob("Ruby/foo.rb").viewable?
- assert sample_blob("Perl/script.pl").viewable?
- assert !fixture_blob("Binary/linguist.gem").viewable?
- assert !fixture_blob("Binary/octocat.ai").viewable?
- assert !fixture_blob("Binary/octocat.png").viewable?
+ assert fixture_blob_memory("Data/README").viewable?
+ assert sample_blob_memory("Ruby/foo.rb").viewable?
+ assert sample_blob_memory("Perl/script.pl").viewable?
+ assert !fixture_blob_memory("Binary/linguist.gem").viewable?
+ assert !fixture_blob_memory("Binary/octocat.ai").viewable?
+ assert !fixture_blob_memory("Binary/octocat.png").viewable?
end
def test_generated
- assert !fixture_blob("Data/README").generated?
-
- # Xcode project files
- assert !sample_blob("XML/MainMenu.xib").generated?
- assert fixture_blob("Binary/MainMenu.nib").generated?
- assert !sample_blob("XML/project.pbxproj").generated?
-
- # Gemfile.lock is NOT generated
- assert !sample_blob("Gemfile.lock").generated?
+ assert !fixture_blob_memory("Data/README").generated?
# Generated .NET Docfiles
- assert sample_blob("XML/net_docfile.xml").generated?
+ assert sample_blob_memory("XML/net_docfile.xml").generated?
# Long line
- assert !sample_blob("JavaScript/uglify.js").generated?
+ assert !sample_blob_memory("JavaScript/uglify.js").generated?
# Inlined JS, but mostly code
- assert !sample_blob("JavaScript/json2_backbone.js").generated?
+ assert !sample_blob_memory("JavaScript/json2_backbone.js").generated?
# Minified JS
- assert !sample_blob("JavaScript/jquery-1.6.1.js").generated?
- assert sample_blob("JavaScript/jquery-1.6.1.min.js").generated?
- assert sample_blob("JavaScript/jquery-1.4.2.min.js").generated?
-
- # CoffeeScript-generated JS
- # TODO
-
- # TypeScript-generated JS
- # TODO
+ assert !sample_blob_memory("JavaScript/jquery-1.6.1.js").generated?
+ assert sample_blob_memory("JavaScript/jquery-1.6.1.min.js").generated?
+ assert sample_blob_memory("JavaScript/jquery-1.4.2.min.js").generated?
# Composer generated composer.lock file
- assert sample_blob("JSON/composer.lock").generated?
+ assert sample_blob_memory("JSON/composer.lock").generated?
# PEG.js-generated parsers
- assert sample_blob("JavaScript/parser.js").generated?
+ assert sample_blob_memory("JavaScript/parser.js").generated?
# Generated PostScript
- assert !sample_blob("PostScript/sierpinski.ps").generated?
+ assert !sample_blob_memory("PostScript/sierpinski.ps").generated?
# These examples are too basic to tell
- assert !sample_blob("JavaScript/hello.js").generated?
+ assert !sample_blob_memory("JavaScript/hello.js").generated?
- assert sample_blob("JavaScript/intro-old.js").generated?
- assert sample_blob("JavaScript/classes-old.js").generated?
+ assert sample_blob_memory("JavaScript/intro-old.js").generated?
+ assert sample_blob_memory("JavaScript/classes-old.js").generated?
- assert sample_blob("JavaScript/intro.js").generated?
- assert sample_blob("JavaScript/classes.js").generated?
+ assert sample_blob_memory("JavaScript/intro.js").generated?
+ assert sample_blob_memory("JavaScript/classes.js").generated?
# Protocol Buffer generated code
- assert sample_blob("C++/protocol-buffer.pb.h").generated?
- assert sample_blob("C++/protocol-buffer.pb.cc").generated?
- assert sample_blob("Java/ProtocolBuffer.java").generated?
- assert sample_blob("Python/protocol_buffer_pb2.py").generated?
- assert sample_blob("Go/api.pb.go").generated?
- assert sample_blob("Go/embedded.go").generated?
+ assert sample_blob_memory("C++/protocol-buffer.pb.h").generated?
+ assert sample_blob_memory("C++/protocol-buffer.pb.cc").generated?
+ assert sample_blob_memory("Java/ProtocolBuffer.java").generated?
+ assert sample_blob_memory("Python/protocol_buffer_pb2.py").generated?
+ assert sample_blob_memory("Go/api.pb.go").generated?
+ assert sample_blob_memory("Go/embedded.go").generated?
# Apache Thrift generated code
- assert sample_blob("Python/gen-py-linguist-thrift.py").generated?
- assert sample_blob("Go/gen-go-linguist-thrift.go").generated?
- assert sample_blob("Java/gen-java-linguist-thrift.java").generated?
- assert sample_blob("JavaScript/gen-js-linguist-thrift.js").generated?
- assert sample_blob("Ruby/gen-rb-linguist-thrift.rb").generated?
- assert sample_blob("Objective-C/gen-cocoa-linguist-thrift.m").generated?
+ assert sample_blob_memory("Python/gen-py-linguist-thrift.py").generated?
+ assert sample_blob_memory("Go/gen-go-linguist-thrift.go").generated?
+ assert sample_blob_memory("Java/gen-java-linguist-thrift.java").generated?
+ assert sample_blob_memory("JavaScript/gen-js-linguist-thrift.js").generated?
+ assert sample_blob_memory("Ruby/gen-rb-linguist-thrift.rb").generated?
+ assert sample_blob_memory("Objective-C/gen-cocoa-linguist-thrift.m").generated?
# Generated JNI
- assert sample_blob("C/jni_layer.h").generated?
+ assert sample_blob_memory("C/jni_layer.h").generated?
# Minified CSS
- assert !sample_blob("CSS/bootstrap.css").generated?
- assert sample_blob("CSS/bootstrap.min.css").generated?
+ assert !sample_blob_memory("CSS/bootstrap.css").generated?
+ assert sample_blob_memory("CSS/bootstrap.min.css").generated?
# Generated VCR
- assert sample_blob("YAML/vcr_cassette.yml").generated?
+ assert sample_blob_memory("YAML/vcr_cassette.yml").generated?
# Generated by Zephir
- assert sample_blob("Zephir/filenames/exception.zep.c").generated?
- assert sample_blob("Zephir/filenames/exception.zep.h").generated?
- assert sample_blob("Zephir/filenames/exception.zep.php").generated?
- assert !sample_blob("Zephir/Router.zep").generated?
-
- assert sample_blob("node_modules/grunt/lib/grunt.js").generated?
-
- # Godep saved dependencies
- assert sample_blob("Godeps/Godeps.json").generated?
- assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated?
+ assert !sample_blob_memory("Zephir/Router.zep").generated?
# Cython-generated C/C++
- assert sample_blob("C/sgd_fast.c").generated?
- assert sample_blob("C++/wrapper_inner.cpp").generated?
+ assert sample_blob_memory("C/sgd_fast.c").generated?
+ assert sample_blob_memory("C++/wrapper_inner.cpp").generated?
# Unity3D-generated metadata
- assert sample_blob("Unity3D Asset/Tiles.meta").generated?
+ assert sample_blob_memory("Unity3D Asset/Tiles.meta").generated?
+
+ # Racc-generated Ruby
+ assert sample_blob_memory("Ruby/racc.rb").generated?
end
def test_vendored
- assert !fixture_blob("Data/README").vendored?
- assert !sample_blob("ext/extconf.rb").vendored?
-
- # Dependencies
- assert sample_blob("dependencies/windows/headers/GL/glext.h").vendored?
-
- # Node dependencies
- assert sample_blob("node_modules/coffee-script/lib/coffee-script.js").vendored?
-
- # Bower Components
- assert sample_blob("bower_components/custom/custom.js").vendored?
- assert sample_blob("app/bower_components/custom/custom.js").vendored?
- assert sample_blob("vendor/assets/bower_components/custom/custom.js").vendored?
-
- # Go dependencies
- assert !sample_blob("Godeps/Godeps.json").vendored?
- assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored?
-
- # Rails vendor/
- assert sample_blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
-
- # Vendor/
- assert sample_blob("Vendor/my_great_file.h").vendored?
-
- # 'thirdparty' directory
- assert sample_blob("thirdparty/lib/main.c").vendored?
-
- # 'extern(al)' directory
- assert sample_blob("extern/util/__init__.py").vendored?
- assert sample_blob("external/jquery.min.js").vendored?
-
- # C deps
- assert sample_blob("deps/http_parser/http_parser.c").vendored?
- assert sample_blob("deps/v8/src/v8.h").vendored?
-
- assert sample_blob("tools/something/else.c").vendored?
-
- # Chart.js
- assert sample_blob("some/vendored/path/Chart.js").vendored?
- assert !sample_blob("some/vendored/path/chart.js").vendored?
-
- # Codemirror deps
- assert sample_blob("codemirror/mode/blah.js").vendored?
- assert sample_blob("codemirror/5.0/mode/blah.js").vendored?
-
- # Debian packaging
- assert sample_blob("debian/cron.d").vendored?
-
- # Erlang
- assert sample_blob("rebar").vendored?
-
- # git config files
-
- assert_predicate fixture_blob("some/path/.gitattributes"), :vendored?
- assert_predicate fixture_blob(".gitignore"), :vendored?
- assert_predicate fixture_blob("special/path/.gitmodules"), :vendored?
-
- # Minified JavaScript and CSS
- assert sample_blob("foo.min.js").vendored?
- assert sample_blob("foo.min.css").vendored?
- assert sample_blob("foo-min.js").vendored?
- assert sample_blob("foo-min.css").vendored?
- assert !sample_blob("foomin.css").vendored?
- assert !sample_blob("foo.min.txt").vendored?
-
- #.osx
- assert sample_blob(".osx").vendored?
-
- # Prototype
- assert !sample_blob("public/javascripts/application.js").vendored?
- assert sample_blob("public/javascripts/prototype.js").vendored?
- assert sample_blob("public/javascripts/effects.js").vendored?
- assert sample_blob("public/javascripts/controls.js").vendored?
- assert sample_blob("public/javascripts/dragdrop.js").vendored?
-
- # jQuery
- assert sample_blob("jquery.js").vendored?
- assert sample_blob("public/javascripts/jquery.js").vendored?
- assert sample_blob("public/javascripts/jquery.min.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.7.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.7.min.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.5.2.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.6.1.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.6.1.min.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.10.1.js").vendored?
- assert sample_blob("public/javascripts/jquery-1.10.1.min.js").vendored?
- assert !sample_blob("public/javascripts/jquery.github.menu.js").vendored?
-
- # jQuery UI
- assert sample_blob("themes/ui-lightness/jquery-ui.css").vendored?
- assert sample_blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored?
- assert sample_blob("themes/ui-lightness/jquery.ui.accordion.css").vendored?
- assert sample_blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored?
- assert sample_blob("ui/i18n/jquery-ui-i18n.js").vendored?
- assert sample_blob("ui/jquery.effects.blind.js").vendored?
- assert sample_blob("ui/jquery-ui-1.8.22.custom.js").vendored?
- assert sample_blob("ui/jquery-ui-1.8.22.custom.min.js").vendored?
- assert sample_blob("ui/jquery-ui-1.8.22.js").vendored?
- assert sample_blob("ui/jquery-ui-1.8.js").vendored?
- assert sample_blob("ui/jquery-ui.min.js").vendored?
- assert sample_blob("ui/jquery.ui.accordion.js").vendored?
- assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored?
- assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored?
-
- # jQuery Gantt
- assert sample_blob("web-app/jquery-gantt/js/jquery.fn.gantt.js").vendored?
-
- # jQuery fancyBox
- assert sample_blob("web-app/fancybox/jquery.fancybox.js").vendored?
-
- # Fuel UX
- assert sample_blob("web-app/fuelux/js/fuelux.js").vendored?
-
- # jQuery File Upload
- assert sample_blob("fileupload-9.0.0/jquery.fileupload-process.js").vendored?
-
- # Slick
- assert sample_blob("web-app/slickgrid/controls/slick.columnpicker.js").vendored?
-
- # Leaflet plugins
- assert sample_blob("leaflet-plugins/Leaflet.Coordinates-0.5.0.src.js").vendored?
- assert sample_blob("leaflet-plugins/leaflet.draw-src.js").vendored?
- assert sample_blob("leaflet-plugins/leaflet.spin.js").vendored?
-
- # MooTools
- assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored?
- assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored?
-
- # Dojo
- assert sample_blob("public/javascripts/dojo.js").vendored?
-
- # MochiKit
- assert sample_blob("public/javascripts/MochiKit.js").vendored?
-
- # YUI
- assert sample_blob("public/javascripts/yahoo-dom-event.js").vendored?
- assert sample_blob("public/javascripts/yahoo-min.js").vendored?
- assert sample_blob("public/javascripts/yuiloader-dom-event.js").vendored?
-
- # WYS editors
- assert sample_blob("public/javascripts/ckeditor.js").vendored?
- assert sample_blob("public/javascripts/tiny_mce.js").vendored?
- assert sample_blob("public/javascripts/tiny_mce_popup.js").vendored?
- assert sample_blob("public/javascripts/tiny_mce_src.js").vendored?
-
- # AngularJS
- assert sample_blob("public/javascripts/angular.js").vendored?
- assert sample_blob("public/javascripts/angular.min.js").vendored?
-
- # D3.js
- assert sample_blob("public/javascripts/d3.v3.js").vendored?
- assert sample_blob("public/javascripts/d3.v3.min.js").vendored?
-
- # Modernizr
- assert sample_blob("public/javascripts/modernizr-2.7.1.js").vendored?
- assert sample_blob("public/javascripts/modernizr.custom.01009.js").vendored?
-
- # Fabric
- assert sample_blob("fabfile.py").vendored?
-
- # WAF
- assert sample_blob("waf").vendored?
-
- # Visual Studio IntelliSense
- assert sample_blob("Scripts/jquery-1.7-vsdoc.js").vendored?
-
- # Microsoft Ajax
- assert sample_blob("Scripts/MicrosoftAjax.debug.js").vendored?
- assert sample_blob("Scripts/MicrosoftAjax.js").vendored?
- assert sample_blob("Scripts/MicrosoftMvcAjax.debug.js").vendored?
- assert sample_blob("Scripts/MicrosoftMvcAjax.js").vendored?
- assert sample_blob("Scripts/MicrosoftMvcValidation.debug.js").vendored?
- assert sample_blob("Scripts/MicrosoftMvcValidation.js").vendored?
-
- # jQuery validation plugin (MS bundles this with asp.net mvc)
- assert sample_blob("Scripts/jquery.validate.js").vendored?
- assert sample_blob("Scripts/jquery.validate.min.js").vendored?
- assert sample_blob("Scripts/jquery.validate.unobtrusive.js").vendored?
- assert sample_blob("Scripts/jquery.validate.unobtrusive.min.js").vendored?
- assert sample_blob("Scripts/jquery.unobtrusive-ajax.js").vendored?
- assert sample_blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored?
-
- # NuGet Packages
- assert sample_blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored?
-
- # Font Awesome
- assert sample_blob("some/asset/path/font-awesome.min.css").vendored?
- assert sample_blob("some/asset/path/font-awesome.css").vendored?
-
- # Normalize
- assert sample_blob("some/asset/path/normalize.css").vendored?
-
- # Carthage
- assert sample_blob('Carthage/blah').vendored?
-
- # Cocoapods
- assert sample_blob('Pods/blah').vendored?
-
- # Html5shiv
- assert sample_blob("Scripts/html5shiv.js").vendored?
- assert sample_blob("Scripts/html5shiv.min.js").vendored?
-
- # Test fixtures
- assert sample_blob("test/fixtures/random.rkt").vendored?
- assert sample_blob("Test/fixtures/random.rkt").vendored?
- assert sample_blob("tests/fixtures/random.rkt").vendored?
-
- # Cordova/PhoneGap
- assert sample_blob("cordova.js").vendored?
- assert sample_blob("cordova.min.js").vendored?
- assert sample_blob("cordova-2.1.0.js").vendored?
- assert sample_blob("cordova-2.1.0.min.js").vendored?
-
- # Foundation js
- assert sample_blob("foundation.js").vendored?
- assert sample_blob("foundation.min.js").vendored?
- assert sample_blob("foundation.abide.js").vendored?
-
- # Vagrant
- assert sample_blob("Vagrantfile").vendored?
-
- # Gradle
- assert sample_blob("gradlew").vendored?
- assert sample_blob("gradlew.bat").vendored?
- assert sample_blob("gradle/wrapper/gradle-wrapper.properties").vendored?
- assert sample_blob("subproject/gradlew").vendored?
- assert sample_blob("subproject/gradlew.bat").vendored?
- assert sample_blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored?
-
- # Octicons
- assert sample_blob("octicons.css").vendored?
- assert sample_blob("public/octicons.min.css").vendored?
- assert sample_blob("public/octicons/sprockets-octicons.scss").vendored?
-
- # Typesafe Activator
- assert sample_blob("activator").vendored?
- assert sample_blob("activator.bat").vendored?
- assert sample_blob("subproject/activator").vendored?
- assert sample_blob("subproject/activator.bat").vendored?
-
- assert_predicate fixture_blob(".google_apis/bar.jar"), :vendored?
- assert_predicate fixture_blob("foo/.google_apis/bar.jar"), :vendored?
-
- # Sphinx docs
- assert sample_blob("docs/_build/asset.doc").vendored?
- assert sample_blob("docs/theme/file.css").vendored?
-
- # Vagrant
- assert sample_blob("puphpet/file.pp").vendored?
-
- # Fabric.io
- assert sample_blob("Fabric.framework/Fabric.h").vendored?
-
- # Crashlytics
- assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored?
-
- # Xcode
- assert sample_blob("myapp/My Template.xctemplate/___FILEBASENAME___.h").vendored?
- assert sample_blob("myapp/My Images.xcassets/some/stuff.imageset/Contents.json").vendored?
- assert !sample_blob("myapp/MyData.json").vendored?
- end
-
- def test_documentation
- assert_predicate fixture_blob("doc/foo.html"), :documentation?
- assert_predicate fixture_blob("docs/foo.html"), :documentation?
- refute_predicate fixture_blob("project/doc/foo.html"), :documentation?
- refute_predicate fixture_blob("project/docs/foo.html"), :documentation?
-
- assert_predicate fixture_blob("Documentation/foo.md"), :documentation?
- assert_predicate fixture_blob("documentation/foo.md"), :documentation?
- assert_predicate fixture_blob("project/Documentation/foo.md"), :documentation?
- assert_predicate fixture_blob("project/documentation/foo.md"), :documentation?
-
- assert_predicate fixture_blob("javadoc/foo.html"), :documentation?
- assert_predicate fixture_blob("project/javadoc/foo.html"), :documentation?
-
- assert_predicate fixture_blob("man/foo.html"), :documentation?
- refute_predicate fixture_blob("project/man/foo.html"), :documentation?
-
- assert_predicate fixture_blob("README"), :documentation?
- assert_predicate fixture_blob("README.md"), :documentation?
- assert_predicate fixture_blob("README.txt"), :documentation?
- assert_predicate fixture_blob("Readme"), :documentation?
- assert_predicate fixture_blob("readme"), :documentation?
- assert_predicate fixture_blob("foo/README"), :documentation?
-
- assert_predicate fixture_blob("CHANGE"), :documentation?
- assert_predicate fixture_blob("CHANGE.md"), :documentation?
- assert_predicate fixture_blob("CHANGE.txt"), :documentation?
- assert_predicate fixture_blob("foo/CHANGE"), :documentation?
-
- assert_predicate fixture_blob("CHANGELOG"), :documentation?
- assert_predicate fixture_blob("CHANGELOG.md"), :documentation?
- assert_predicate fixture_blob("CHANGELOG.txt"), :documentation?
- assert_predicate fixture_blob("foo/CHANGELOG"), :documentation?
-
- assert_predicate fixture_blob("CHANGES"), :documentation?
- assert_predicate fixture_blob("CHANGES.md"), :documentation?
- assert_predicate fixture_blob("CHANGES.txt"), :documentation?
- assert_predicate fixture_blob("foo/CHANGES"), :documentation?
-
- assert_predicate fixture_blob("CONTRIBUTING"), :documentation?
- assert_predicate fixture_blob("CONTRIBUTING.md"), :documentation?
- assert_predicate fixture_blob("CONTRIBUTING.txt"), :documentation?
- assert_predicate fixture_blob("foo/CONTRIBUTING"), :documentation?
-
- assert_predicate fixture_blob("examples/some-file.pl"), :documentation?
- assert_predicate fixture_blob("Examples/some-example-file.rb"), :documentation?
-
- assert_predicate fixture_blob("LICENSE"), :documentation?
- assert_predicate fixture_blob("LICENCE.md"), :documentation?
- assert_predicate fixture_blob("License.txt"), :documentation?
- assert_predicate fixture_blob("LICENSE.txt"), :documentation?
- assert_predicate fixture_blob("foo/LICENSE"), :documentation?
-
- assert_predicate fixture_blob("COPYING"), :documentation?
- assert_predicate fixture_blob("COPYING.md"), :documentation?
- assert_predicate fixture_blob("COPYING.txt"), :documentation?
- assert_predicate fixture_blob("foo/COPYING"), :documentation?
-
- assert_predicate fixture_blob("INSTALL"), :documentation?
- assert_predicate fixture_blob("INSTALL.md"), :documentation?
- assert_predicate fixture_blob("INSTALL.txt"), :documentation?
- assert_predicate fixture_blob("foo/INSTALL"), :documentation?
-
- refute_predicate fixture_blob("foo.md"), :documentation?
-
- # Samples
- assert sample_blob("Samples/Ruby/foo.rb").documentation?
-
- assert_predicate fixture_blob("INSTALL.txt"), :documentation?
+ assert !fixture_blob_memory("Data/README").vendored?
end
def test_language
Samples.each do |sample|
- blob = sample_blob(sample[:path])
+ blob = sample_blob_memory(sample[:path])
assert blob.language, "No language for #{sample[:path]}"
assert_equal sample[:language], blob.language.name, blob.name
end
@@ -612,7 +248,7 @@ class TestBlob < Minitest::Test
filepath = File.join(dirname, filename)
next unless File.file?(filepath)
- blob = fixture_blob(filepath)
+ blob = fixture_blob_memory(filepath)
if language == 'Data'
assert blob.language.nil?, "A language was found for #{filepath}"
elsif language == 'Generated'
@@ -626,7 +262,7 @@ class TestBlob < Minitest::Test
end
def test_minified_files_not_safe_to_highlight
- assert !sample_blob("JavaScript/jquery-1.6.1.min.js").safe_to_colorize?
+ assert !sample_blob_memory("JavaScript/jquery-1.6.1.min.js").safe_to_colorize?
end
def test_empty
@@ -639,27 +275,19 @@ class TestBlob < Minitest::Test
end
def test_include_in_language_stats
- vendored = sample_blob("bower_components/custom/custom.js")
- assert_predicate vendored, :vendored?
- refute_predicate vendored, :include_in_language_stats?
-
- documentation = fixture_blob("README")
- assert_predicate documentation, :documentation?
- refute_predicate documentation, :include_in_language_stats?
-
- generated = sample_blob("CSS/bootstrap.min.css")
+ generated = sample_blob_memory("CSS/bootstrap.min.css")
assert_predicate generated, :generated?
refute_predicate generated, :include_in_language_stats?
- data = sample_blob("Ant Build System/filenames/ant.xml")
+ data = sample_blob_memory("Ant Build System/filenames/ant.xml")
assert_equal :data, data.language.type
refute_predicate data, :include_in_language_stats?
- prose = sample_blob("Markdown/tender.md")
+ prose = sample_blob_memory("Markdown/tender.md")
assert_equal :prose, prose.language.type
refute_predicate prose, :include_in_language_stats?
- included = sample_blob("HTML/pages.html")
+ included = sample_blob_memory("HTML/pages.html")
assert_predicate included, :include_in_language_stats?
end
end
diff --git a/test/test_file_blob.rb b/test/test_file_blob.rb
index 30d483fe..08e2e49b 100644
--- a/test/test_file_blob.rb
+++ b/test/test_file_blob.rb
@@ -1,9 +1,669 @@
require_relative "./helper"
-class TestFileBlob < Minitest::Test
+class TestBlob < Minitest::Test
+ include Linguist
+
+ def setup
+ # git blobs are normally loaded as ASCII-8BIT since they may contain data
+ # with arbitrary encoding not known ahead of time
+ @original_external = Encoding.default_external
+ Encoding.default_external = Encoding.find("ASCII-8BIT")
+ end
+
+ def teardown
+ Encoding.default_external = @original_external
+ end
+
+ def script_blob(name)
+ blob = sample_blob(name)
+ blob.instance_variable_set(:@name, 'script')
+ blob
+ end
+
def test_extensions
assert_equal [".gitignore"], Linguist::FileBlob.new(".gitignore").extensions
assert_equal [".xml"], Linguist::FileBlob.new("build.xml").extensions
assert_equal [".html.erb", ".erb"], Linguist::FileBlob.new("dotted.dir/index.html.erb").extensions
end
+
+ def test_name
+ assert_equal "foo.rb", sample_blob("foo.rb").name
+ end
+
+ def test_mime_type
+ assert_equal "application/postscript", fixture_blob("Binary/octocat.ai").mime_type
+ assert_equal "application/x-ruby", sample_blob("Ruby/grit.rb").mime_type
+ assert_equal "application/x-sh", sample_blob("Shell/script.sh").mime_type
+ assert_equal "application/xml", sample_blob("XML/bar.xml").mime_type
+ assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").mime_type
+ assert_equal "text/plain", fixture_blob("Data/README").mime_type
+ end
+
+ def test_content_type
+ assert_equal "application/pdf", fixture_blob("Binary/foo.pdf").content_type
+ assert_equal "audio/ogg", fixture_blob("Binary/foo.ogg").content_type
+ assert_equal "image/png", fixture_blob("Binary/foo.png").content_type
+ assert_equal "text/plain; charset=iso-8859-2", fixture_blob("Data/README").content_type
+ end
+
+ def test_disposition
+ assert_equal "attachment; filename=foo+bar.jar", fixture_blob("Binary/foo bar.jar").disposition
+ assert_equal "attachment; filename=foo.bin", fixture_blob("Binary/foo.bin").disposition
+ assert_equal "attachment; filename=linguist.gem", fixture_blob("Binary/linguist.gem").disposition
+ assert_equal "attachment; filename=octocat.ai", fixture_blob("Binary/octocat.ai").disposition
+ assert_equal "inline", fixture_blob("Data/README").disposition
+ assert_equal "inline", sample_blob("Text/foo.txt").disposition
+ assert_equal "inline", sample_blob("Ruby/grit.rb").disposition
+ assert_equal "inline", fixture_blob("Binary/octocat.png").disposition
+ end
+
+ def test_data
+ assert_equal "module Foo\nend\n", sample_blob("Ruby/foo.rb").data
+ end
+
+ def test_lines
+ assert_equal ["module Foo", "end", ""], sample_blob("Ruby/foo.rb").lines
+ assert_equal ["line 1", "line 2", ""], sample_blob("Text/mac.txt").lines
+ assert_equal 475, sample_blob("Emacs Lisp/ess-julia.el").lines.length
+ end
+
+ def test_lines_maintains_original_encoding
+ # Even if the file's encoding is detected as something like UTF-16LE,
+ # earlier versions of the gem made implicit guarantees that the encoding of
+ # each `line` is in the same encoding as the file was originally read (in
+ # practice, UTF-8 or ASCII-8BIT)
+ assert_equal Encoding.default_external, fixture_blob("Data/utf16le").lines.first.encoding
+ end
+
+ def test_size
+ assert_equal 15, sample_blob("Ruby/foo.rb").size
+ end
+
+ def test_loc
+ assert_equal 3, sample_blob("Ruby/foo.rb").loc
+ end
+
+ def test_sloc
+ assert_equal 2, sample_blob("Ruby/foo.rb").sloc
+ assert_equal 3, fixture_blob("Data/utf16le-windows").sloc
+ assert_equal 1, fixture_blob("Data/iso8859-8-i").sloc
+ end
+
+ def test_encoding
+ assert_equal "ISO-8859-2", fixture_blob("Data/README").encoding
+ assert_equal "ISO-8859-2", fixture_blob("Data/README").ruby_encoding
+ assert_equal "UTF-8", sample_blob("Text/foo.txt").encoding
+ assert_equal "UTF-8", sample_blob("Text/foo.txt").ruby_encoding
+ assert_equal "UTF-16LE", fixture_blob("Data/utf16le").encoding
+ assert_equal "UTF-16LE", fixture_blob("Data/utf16le").ruby_encoding
+ assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").encoding
+ assert_equal "UTF-16LE", fixture_blob("Data/utf16le-windows").ruby_encoding
+ assert_equal "ISO-2022-KR", sample_blob("Text/ISO-2022-KR.txt").encoding
+ assert_equal "binary", sample_blob("Text/ISO-2022-KR.txt").ruby_encoding
+ assert_nil fixture_blob("Binary/dog.o").encoding
+ end
+
+ def test_binary
+ # Large blobs aren't loaded
+ large_blob = sample_blob("git.exe")
+ large_blob.instance_eval do
+ def data; end
+ end
+ assert large_blob.binary?
+
+ assert fixture_blob("Binary/git.deb").binary?
+ assert fixture_blob("Binary/git.exe").binary?
+ assert fixture_blob("Binary/hello.pbc").binary?
+ assert fixture_blob("Binary/linguist.gem").binary?
+ assert fixture_blob("Binary/octocat.ai").binary?
+ assert fixture_blob("Binary/octocat.png").binary?
+ assert fixture_blob("Binary/zip").binary?
+ assert !fixture_blob("Data/README").binary?
+ assert !sample_blob("Ruby/foo.rb").binary?
+ assert !sample_blob("Perl/script.pl").binary?
+ end
+
+ def test_all_binary
+ Samples.each do |sample|
+ blob = sample_blob(sample[:path])
+ assert ! (blob.likely_binary? || blob.binary?), "#{sample[:path]} is a binary file"
+ end
+ end
+
+ def test_text
+ assert fixture_blob("Data/README").text?
+ assert fixture_blob("Data/md").text?
+ assert sample_blob("Shell/script.sh").text?
+ assert fixture_blob("Data/txt").text?
+ end
+
+ def test_image
+ assert fixture_blob("Binary/octocat.gif").image?
+ assert fixture_blob("Binary/octocat.jpeg").image?
+ assert fixture_blob("Binary/octocat.jpg").image?
+ assert fixture_blob("Binary/octocat.png").image?
+ assert !fixture_blob("Binary/octocat.ai").image?
+ assert !fixture_blob("Binary/octocat.psd").image?
+ end
+
+ def test_solid
+ assert fixture_blob("Binary/cube.stl").solid?
+ assert fixture_blob("Data/cube.stl").solid?
+ end
+
+ def test_csv
+ assert fixture_blob("Data/cars.csv").csv?
+ end
+
+ def test_pdf
+ assert fixture_blob("Binary/foo.pdf").pdf?
+ end
+
+ def test_viewable
+ assert fixture_blob("Data/README").viewable?
+ assert sample_blob("Ruby/foo.rb").viewable?
+ assert sample_blob("Perl/script.pl").viewable?
+ assert !fixture_blob("Binary/linguist.gem").viewable?
+ assert !fixture_blob("Binary/octocat.ai").viewable?
+ assert !fixture_blob("Binary/octocat.png").viewable?
+ end
+
+ def test_generated
+ assert !fixture_blob("Data/README").generated?
+
+ # Xcode project files
+ assert !sample_blob("XML/MainMenu.xib").generated?
+ assert fixture_blob("Binary/MainMenu.nib").generated?
+ assert !sample_blob("XML/project.pbxproj").generated?
+
+ # Gemfile.lock is NOT generated
+ assert !sample_blob("Gemfile.lock").generated?
+
+ # Generated .NET Docfiles
+ assert sample_blob("XML/net_docfile.xml").generated?
+
+ # Long line
+ assert !sample_blob("JavaScript/uglify.js").generated?
+
+ # Inlined JS, but mostly code
+ assert !sample_blob("JavaScript/json2_backbone.js").generated?
+
+ # Minified JS
+ assert !sample_blob("JavaScript/jquery-1.6.1.js").generated?
+ assert sample_blob("JavaScript/jquery-1.6.1.min.js").generated?
+ assert sample_blob("JavaScript/jquery-1.4.2.min.js").generated?
+
+ # CoffeeScript-generated JS
+ # TODO
+
+ # TypeScript-generated JS
+ # TODO
+
+ # Composer generated composer.lock file
+ assert sample_blob("JSON/composer.lock").generated?
+
+ # PEG.js-generated parsers
+ assert sample_blob("JavaScript/parser.js").generated?
+
+ # Generated PostScript
+ assert !sample_blob("PostScript/sierpinski.ps").generated?
+
+ # These examples are too basic to tell
+ assert !sample_blob("JavaScript/hello.js").generated?
+
+ assert sample_blob("JavaScript/intro-old.js").generated?
+ assert sample_blob("JavaScript/classes-old.js").generated?
+
+ assert sample_blob("JavaScript/intro.js").generated?
+ assert sample_blob("JavaScript/classes.js").generated?
+
+ # Protocol Buffer generated code
+ assert sample_blob("C++/protocol-buffer.pb.h").generated?
+ assert sample_blob("C++/protocol-buffer.pb.cc").generated?
+ assert sample_blob("Java/ProtocolBuffer.java").generated?
+ assert sample_blob("Python/protocol_buffer_pb2.py").generated?
+ assert sample_blob("Go/api.pb.go").generated?
+ assert sample_blob("Go/embedded.go").generated?
+
+ # Apache Thrift generated code
+ assert sample_blob("Python/gen-py-linguist-thrift.py").generated?
+ assert sample_blob("Go/gen-go-linguist-thrift.go").generated?
+ assert sample_blob("Java/gen-java-linguist-thrift.java").generated?
+ assert sample_blob("JavaScript/gen-js-linguist-thrift.js").generated?
+ assert sample_blob("Ruby/gen-rb-linguist-thrift.rb").generated?
+ assert sample_blob("Objective-C/gen-cocoa-linguist-thrift.m").generated?
+
+ # Generated JNI
+ assert sample_blob("C/jni_layer.h").generated?
+
+ # Minified CSS
+ assert !sample_blob("CSS/bootstrap.css").generated?
+ assert sample_blob("CSS/bootstrap.min.css").generated?
+
+ # Generated VCR
+ assert sample_blob("YAML/vcr_cassette.yml").generated?
+
+ # Generated by Zephir
+ assert sample_blob("Zephir/filenames/exception.zep.c").generated?
+ assert sample_blob("Zephir/filenames/exception.zep.h").generated?
+ assert sample_blob("Zephir/filenames/exception.zep.php").generated?
+ assert !sample_blob("Zephir/Router.zep").generated?
+
+ assert sample_blob("node_modules/grunt/lib/grunt.js").generated?
+
+ # Godep saved dependencies
+ assert sample_blob("Godeps/Godeps.json").generated?
+ assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").generated?
+
+ # Cython-generated C/C++
+ assert sample_blob("C/sgd_fast.c").generated?
+ assert sample_blob("C++/wrapper_inner.cpp").generated?
+
+ # Unity3D-generated metadata
+ assert sample_blob("Unity3D Asset/Tiles.meta").generated?
+ end
+
+ def test_vendored
+ assert !fixture_blob("Data/README").vendored?
+ assert !sample_blob("ext/extconf.rb").vendored?
+
+ # Dependencies
+ assert sample_blob("dependencies/windows/headers/GL/glext.h").vendored?
+
+ # Node dependencies
+ assert sample_blob("node_modules/coffee-script/lib/coffee-script.js").vendored?
+
+ # Bower Components
+ assert sample_blob("bower_components/custom/custom.js").vendored?
+ assert sample_blob("app/bower_components/custom/custom.js").vendored?
+ assert sample_blob("vendor/assets/bower_components/custom/custom.js").vendored?
+
+ # Go dependencies
+ assert !sample_blob("Godeps/Godeps.json").vendored?
+ assert sample_blob("Godeps/_workspace/src/github.com/kr/s3/sign.go").vendored?
+
+ # Rails vendor/
+ assert sample_blob("vendor/plugins/will_paginate/lib/will_paginate.rb").vendored?
+
+ # Vendor/
+ assert sample_blob("Vendor/my_great_file.h").vendored?
+
+ # 'thirdparty' directory
+ assert sample_blob("thirdparty/lib/main.c").vendored?
+
+ # 'extern(al)' directory
+ assert sample_blob("extern/util/__init__.py").vendored?
+ assert sample_blob("external/jquery.min.js").vendored?
+
+ # C deps
+ assert sample_blob("deps/http_parser/http_parser.c").vendored?
+ assert sample_blob("deps/v8/src/v8.h").vendored?
+
+ assert sample_blob("tools/something/else.c").vendored?
+
+ # Chart.js
+ assert sample_blob("some/vendored/path/Chart.js").vendored?
+ assert !sample_blob("some/vendored/path/chart.js").vendored?
+
+ # Codemirror deps
+ assert sample_blob("codemirror/mode/blah.js").vendored?
+ assert sample_blob("codemirror/5.0/mode/blah.js").vendored?
+
+ # Debian packaging
+ assert sample_blob("debian/cron.d").vendored?
+
+ # Erlang
+ assert sample_blob("rebar").vendored?
+
+ # git config files
+
+ assert_predicate fixture_blob("some/path/.gitattributes"), :vendored?
+ assert_predicate fixture_blob(".gitignore"), :vendored?
+ assert_predicate fixture_blob("special/path/.gitmodules"), :vendored?
+
+ # Minified JavaScript and CSS
+ assert sample_blob("foo.min.js").vendored?
+ assert sample_blob("foo.min.css").vendored?
+ assert sample_blob("foo-min.js").vendored?
+ assert sample_blob("foo-min.css").vendored?
+ assert !sample_blob("foomin.css").vendored?
+ assert !sample_blob("foo.min.txt").vendored?
+
+ #.osx
+ assert sample_blob(".osx").vendored?
+
+ # Prototype
+ assert !sample_blob("public/javascripts/application.js").vendored?
+ assert sample_blob("public/javascripts/prototype.js").vendored?
+ assert sample_blob("public/javascripts/effects.js").vendored?
+ assert sample_blob("public/javascripts/controls.js").vendored?
+ assert sample_blob("public/javascripts/dragdrop.js").vendored?
+
+ # jQuery
+ assert sample_blob("jquery.js").vendored?
+ assert sample_blob("public/javascripts/jquery.js").vendored?
+ assert sample_blob("public/javascripts/jquery.min.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.7.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.7.min.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.5.2.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.6.1.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.6.1.min.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.10.1.js").vendored?
+ assert sample_blob("public/javascripts/jquery-1.10.1.min.js").vendored?
+ assert !sample_blob("public/javascripts/jquery.github.menu.js").vendored?
+
+ # jQuery UI
+ assert sample_blob("themes/ui-lightness/jquery-ui.css").vendored?
+ assert sample_blob("themes/ui-lightness/jquery-ui-1.8.22.custom.css").vendored?
+ assert sample_blob("themes/ui-lightness/jquery.ui.accordion.css").vendored?
+ assert sample_blob("ui/i18n/jquery.ui.datepicker-ar.js").vendored?
+ assert sample_blob("ui/i18n/jquery-ui-i18n.js").vendored?
+ assert sample_blob("ui/jquery.effects.blind.js").vendored?
+ assert sample_blob("ui/jquery-ui-1.8.22.custom.js").vendored?
+ assert sample_blob("ui/jquery-ui-1.8.22.custom.min.js").vendored?
+ assert sample_blob("ui/jquery-ui-1.8.22.js").vendored?
+ assert sample_blob("ui/jquery-ui-1.8.js").vendored?
+ assert sample_blob("ui/jquery-ui.min.js").vendored?
+ assert sample_blob("ui/jquery.ui.accordion.js").vendored?
+ assert sample_blob("ui/minified/jquery.effects.blind.min.js").vendored?
+ assert sample_blob("ui/minified/jquery.ui.accordion.min.js").vendored?
+
+ # jQuery Gantt
+ assert sample_blob("web-app/jquery-gantt/js/jquery.fn.gantt.js").vendored?
+
+ # jQuery fancyBox
+ assert sample_blob("web-app/fancybox/jquery.fancybox.js").vendored?
+
+ # Fuel UX
+ assert sample_blob("web-app/fuelux/js/fuelux.js").vendored?
+
+ # jQuery File Upload
+ assert sample_blob("fileupload-9.0.0/jquery.fileupload-process.js").vendored?
+
+ # Slick
+ assert sample_blob("web-app/slickgrid/controls/slick.columnpicker.js").vendored?
+
+ # Leaflet plugins
+ assert sample_blob("leaflet-plugins/Leaflet.Coordinates-0.5.0.src.js").vendored?
+ assert sample_blob("leaflet-plugins/leaflet.draw-src.js").vendored?
+ assert sample_blob("leaflet-plugins/leaflet.spin.js").vendored?
+
+ # MooTools
+ assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat.js").vendored?
+ assert sample_blob("public/javascripts/mootools-core-1.3.2-full-compat-yc.js").vendored?
+
+ # Dojo
+ assert sample_blob("public/javascripts/dojo.js").vendored?
+
+ # MochiKit
+ assert sample_blob("public/javascripts/MochiKit.js").vendored?
+
+ # YUI
+ assert sample_blob("public/javascripts/yahoo-dom-event.js").vendored?
+ assert sample_blob("public/javascripts/yahoo-min.js").vendored?
+ assert sample_blob("public/javascripts/yuiloader-dom-event.js").vendored?
+
+ # WYS editors
+ assert sample_blob("public/javascripts/ckeditor.js").vendored?
+ assert sample_blob("public/javascripts/tiny_mce.js").vendored?
+ assert sample_blob("public/javascripts/tiny_mce_popup.js").vendored?
+ assert sample_blob("public/javascripts/tiny_mce_src.js").vendored?
+
+ # AngularJS
+ assert sample_blob("public/javascripts/angular.js").vendored?
+ assert sample_blob("public/javascripts/angular.min.js").vendored?
+
+ # D3.js
+ assert sample_blob("public/javascripts/d3.v3.js").vendored?
+ assert sample_blob("public/javascripts/d3.v3.min.js").vendored?
+
+ # Modernizr
+ assert sample_blob("public/javascripts/modernizr-2.7.1.js").vendored?
+ assert sample_blob("public/javascripts/modernizr.custom.01009.js").vendored?
+
+ # Fabric
+ assert sample_blob("fabfile.py").vendored?
+
+ # WAF
+ assert sample_blob("waf").vendored?
+
+ # Visual Studio IntelliSense
+ assert sample_blob("Scripts/jquery-1.7-vsdoc.js").vendored?
+
+ # Microsoft Ajax
+ assert sample_blob("Scripts/MicrosoftAjax.debug.js").vendored?
+ assert sample_blob("Scripts/MicrosoftAjax.js").vendored?
+ assert sample_blob("Scripts/MicrosoftMvcAjax.debug.js").vendored?
+ assert sample_blob("Scripts/MicrosoftMvcAjax.js").vendored?
+ assert sample_blob("Scripts/MicrosoftMvcValidation.debug.js").vendored?
+ assert sample_blob("Scripts/MicrosoftMvcValidation.js").vendored?
+
+ # jQuery validation plugin (MS bundles this with asp.net mvc)
+ assert sample_blob("Scripts/jquery.validate.js").vendored?
+ assert sample_blob("Scripts/jquery.validate.min.js").vendored?
+ assert sample_blob("Scripts/jquery.validate.unobtrusive.js").vendored?
+ assert sample_blob("Scripts/jquery.validate.unobtrusive.min.js").vendored?
+ assert sample_blob("Scripts/jquery.unobtrusive-ajax.js").vendored?
+ assert sample_blob("Scripts/jquery.unobtrusive-ajax.min.js").vendored?
+
+ # NuGet Packages
+ assert sample_blob("packages/Modernizr.2.0.6/Content/Scripts/modernizr-2.0.6-development-only.js").vendored?
+
+ # Font Awesome
+ assert sample_blob("some/asset/path/font-awesome.min.css").vendored?
+ assert sample_blob("some/asset/path/font-awesome.css").vendored?
+
+ # Normalize
+ assert sample_blob("some/asset/path/normalize.css").vendored?
+
+ # Carthage
+ assert sample_blob('Carthage/blah').vendored?
+
+ # Cocoapods
+ assert sample_blob('Pods/blah').vendored?
+
+ # Html5shiv
+ assert sample_blob("Scripts/html5shiv.js").vendored?
+ assert sample_blob("Scripts/html5shiv.min.js").vendored?
+
+ # Test fixtures
+ assert sample_blob("test/fixtures/random.rkt").vendored?
+ assert sample_blob("Test/fixtures/random.rkt").vendored?
+ assert sample_blob("tests/fixtures/random.rkt").vendored?
+
+ # Cordova/PhoneGap
+ assert sample_blob("cordova.js").vendored?
+ assert sample_blob("cordova.min.js").vendored?
+ assert sample_blob("cordova-2.1.0.js").vendored?
+ assert sample_blob("cordova-2.1.0.min.js").vendored?
+
+ # Foundation js
+ assert sample_blob("foundation.js").vendored?
+ assert sample_blob("foundation.min.js").vendored?
+ assert sample_blob("foundation.abide.js").vendored?
+
+ # Vagrant
+ assert sample_blob("Vagrantfile").vendored?
+
+ # Gradle
+ assert sample_blob("gradlew").vendored?
+ assert sample_blob("gradlew.bat").vendored?
+ assert sample_blob("gradle/wrapper/gradle-wrapper.properties").vendored?
+ assert sample_blob("subproject/gradlew").vendored?
+ assert sample_blob("subproject/gradlew.bat").vendored?
+ assert sample_blob("subproject/gradle/wrapper/gradle-wrapper.properties").vendored?
+
+ # Octicons
+ assert sample_blob("octicons.css").vendored?
+ assert sample_blob("public/octicons.min.css").vendored?
+ assert sample_blob("public/octicons/sprockets-octicons.scss").vendored?
+
+ # Typesafe Activator
+ assert sample_blob("activator").vendored?
+ assert sample_blob("activator.bat").vendored?
+ assert sample_blob("subproject/activator").vendored?
+ assert sample_blob("subproject/activator.bat").vendored?
+
+ assert_predicate fixture_blob(".google_apis/bar.jar"), :vendored?
+ assert_predicate fixture_blob("foo/.google_apis/bar.jar"), :vendored?
+
+ # Sphinx docs
+ assert sample_blob("docs/_build/asset.doc").vendored?
+ assert sample_blob("docs/theme/file.css").vendored?
+
+ # Vagrant
+ assert sample_blob("puphpet/file.pp").vendored?
+
+ # Fabric.io
+ assert sample_blob("Fabric.framework/Fabric.h").vendored?
+
+ # Crashlytics
+ assert sample_blob("Crashlytics.framework/Crashlytics.h").vendored?
+ assert sample_blob("myapp/My Template.xctemplate/___FILEBASENAME___.h").vendored?
+ assert sample_blob("myapp/My Images.xcassets/some/stuff.imageset/Contents.json").vendored?
+ assert !sample_blob("myapp/MyData.json").vendored?
+ end
+
+ def test_documentation
+ assert_predicate fixture_blob("doc/foo.html"), :documentation?
+ assert_predicate fixture_blob("docs/foo.html"), :documentation?
+ refute_predicate fixture_blob("project/doc/foo.html"), :documentation?
+ refute_predicate fixture_blob("project/docs/foo.html"), :documentation?
+
+ assert_predicate fixture_blob("Documentation/foo.md"), :documentation?
+ assert_predicate fixture_blob("documentation/foo.md"), :documentation?
+ assert_predicate fixture_blob("project/Documentation/foo.md"), :documentation?
+ assert_predicate fixture_blob("project/documentation/foo.md"), :documentation?
+
+ assert_predicate fixture_blob("javadoc/foo.html"), :documentation?
+ assert_predicate fixture_blob("project/javadoc/foo.html"), :documentation?
+
+ assert_predicate fixture_blob("man/foo.html"), :documentation?
+ refute_predicate fixture_blob("project/man/foo.html"), :documentation?
+
+ assert_predicate fixture_blob("README"), :documentation?
+ assert_predicate fixture_blob("README.md"), :documentation?
+ assert_predicate fixture_blob("README.txt"), :documentation?
+ assert_predicate fixture_blob("Readme"), :documentation?
+ assert_predicate fixture_blob("readme"), :documentation?
+ assert_predicate fixture_blob("foo/README"), :documentation?
+
+ assert_predicate fixture_blob("CHANGE"), :documentation?
+ assert_predicate fixture_blob("CHANGE.md"), :documentation?
+ assert_predicate fixture_blob("CHANGE.txt"), :documentation?
+ assert_predicate fixture_blob("foo/CHANGE"), :documentation?
+
+ assert_predicate fixture_blob("CHANGELOG"), :documentation?
+ assert_predicate fixture_blob("CHANGELOG.md"), :documentation?
+ assert_predicate fixture_blob("CHANGELOG.txt"), :documentation?
+ assert_predicate fixture_blob("foo/CHANGELOG"), :documentation?
+
+ assert_predicate fixture_blob("CHANGES"), :documentation?
+ assert_predicate fixture_blob("CHANGES.md"), :documentation?
+ assert_predicate fixture_blob("CHANGES.txt"), :documentation?
+ assert_predicate fixture_blob("foo/CHANGES"), :documentation?
+
+ assert_predicate fixture_blob("CONTRIBUTING"), :documentation?
+ assert_predicate fixture_blob("CONTRIBUTING.md"), :documentation?
+ assert_predicate fixture_blob("CONTRIBUTING.txt"), :documentation?
+ assert_predicate fixture_blob("foo/CONTRIBUTING"), :documentation?
+
+ assert_predicate fixture_blob("examples/some-file.pl"), :documentation?
+ assert_predicate fixture_blob("Examples/some-example-file.rb"), :documentation?
+
+ assert_predicate fixture_blob("LICENSE"), :documentation?
+ assert_predicate fixture_blob("LICENCE.md"), :documentation?
+ assert_predicate fixture_blob("License.txt"), :documentation?
+ assert_predicate fixture_blob("LICENSE.txt"), :documentation?
+ assert_predicate fixture_blob("foo/LICENSE"), :documentation?
+
+ assert_predicate fixture_blob("COPYING"), :documentation?
+ assert_predicate fixture_blob("COPYING.md"), :documentation?
+ assert_predicate fixture_blob("COPYING.txt"), :documentation?
+ assert_predicate fixture_blob("foo/COPYING"), :documentation?
+
+ assert_predicate fixture_blob("INSTALL"), :documentation?
+ assert_predicate fixture_blob("INSTALL.md"), :documentation?
+ assert_predicate fixture_blob("INSTALL.txt"), :documentation?
+ assert_predicate fixture_blob("foo/INSTALL"), :documentation?
+
+ refute_predicate fixture_blob("foo.md"), :documentation?
+
+ # Samples
+ assert sample_blob("Samples/Ruby/foo.rb").documentation?
+
+ assert_predicate fixture_blob("INSTALL.txt"), :documentation?
+ end
+
+ def test_language
+ Samples.each do |sample|
+ blob = sample_blob(sample[:path])
+ assert blob.language, "No language for #{sample[:path]}"
+ assert_equal sample[:language], blob.language.name, blob.name
+ end
+
+ # Test language detection for files which shouldn't be used as samples
+ root = File.expand_path('../fixtures', __FILE__)
+ Dir.entries(root).each do |language|
+ next if language == '.' || language == '..' || language == 'Binary' ||
+ File.basename(language) == 'ace_modes.json'
+
+ # Each directory contains test files of a language
+ dirname = File.join(root, language)
+ Dir.entries(dirname).each do |filename|
+ # By default blob search the file in the samples;
+ # thus, we need to give it the absolute path
+ filepath = File.join(dirname, filename)
+ next unless File.file?(filepath)
+
+ blob = fixture_blob(filepath)
+ if language == 'Data'
+ assert blob.language.nil?, "A language was found for #{filepath}"
+ elsif language == 'Generated'
+ assert blob.generated?, "#{filepath} is not a generated file"
+ else
+ assert blob.language, "No language for #{filepath}"
+ assert_equal language, blob.language.name, blob.name
+ end
+ end
+ end
+ end
+
+ def test_minified_files_not_safe_to_highlight
+ assert !sample_blob("JavaScript/jquery-1.6.1.min.js").safe_to_colorize?
+ end
+
+ def test_empty
+ blob = Struct.new(:data) { include Linguist::BlobHelper }
+
+ assert blob.new("").empty?
+ assert blob.new(nil).empty?
+ refute blob.new(" ").empty?
+ refute blob.new("nope").empty?
+ end
+
+ def test_include_in_language_stats
+ vendored = sample_blob("bower_components/custom/custom.js")
+ assert_predicate vendored, :vendored?
+ refute_predicate vendored, :include_in_language_stats?
+
+ documentation = fixture_blob("README")
+ assert_predicate documentation, :documentation?
+ refute_predicate documentation, :include_in_language_stats?
+
+ generated = sample_blob("CSS/bootstrap.min.css")
+ assert_predicate generated, :generated?
+ refute_predicate generated, :include_in_language_stats?
+
+ data = sample_blob("Ant Build System/filenames/ant.xml")
+ assert_equal :data, data.language.type
+ refute_predicate data, :include_in_language_stats?
+
+ prose = sample_blob("Markdown/tender.md")
+ assert_equal :prose, prose.language.type
+ refute_predicate prose, :include_in_language_stats?
+
+ included = sample_blob("HTML/pages.html")
+ assert_predicate included, :include_in_language_stats?
+ end
end
diff --git a/vendor/grammars/FreeMarker.tmbundle b/vendor/grammars/FreeMarker.tmbundle
new file mode 160000
index 00000000..6b7b880c
--- /dev/null
+++ b/vendor/grammars/FreeMarker.tmbundle
@@ -0,0 +1 @@
+Subproject commit 6b7b880c533626b8e943ed686007c06771da3b42
diff --git a/vendor/grammars/InnoSetup b/vendor/grammars/InnoSetup
index 9a8fca6c..a7f79fd1 160000
--- a/vendor/grammars/InnoSetup
+++ b/vendor/grammars/InnoSetup
@@ -1 +1 @@
-Subproject commit 9a8fca6c05a59dcbd90113c06545e45f83a7a075
+Subproject commit a7f79fd1a530adbcfe8f660eb1b9c48dc3bd5ede
diff --git a/vendor/grammars/NimLime b/vendor/grammars/NimLime
index 50d7344f..51118338 160000
--- a/vendor/grammars/NimLime
+++ b/vendor/grammars/NimLime
@@ -1 +1 @@
-Subproject commit 50d7344f9b4f50823ac64d14c162982edf8b8056
+Subproject commit 5111833868d63c7a35e6e9f0aa443e0d1832db7a
diff --git a/vendor/grammars/Stylus b/vendor/grammars/Stylus
index 8b1c77d0..9766d8d9 160000
--- a/vendor/grammars/Stylus
+++ b/vendor/grammars/Stylus
@@ -1 +1 @@
-Subproject commit 8b1c77d0543d12984ebb872180d942629edc31ac
+Subproject commit 9766d8d936a9939dfd11b5d73cb0e9542b2a078f
diff --git a/vendor/grammars/abap.tmbundle b/vendor/grammars/abap.tmbundle
index e8619c96..8ab33a89 160000
--- a/vendor/grammars/abap.tmbundle
+++ b/vendor/grammars/abap.tmbundle
@@ -1 +1 @@
-Subproject commit e8619c9692b0ef74e288832660257f6e3477030c
+Subproject commit 8ab33a89780139f8ceb37cc412c30cef2f206a49
diff --git a/vendor/grammars/atom-fsharp b/vendor/grammars/atom-fsharp
index 053f5dc3..7051d65d 160000
--- a/vendor/grammars/atom-fsharp
+++ b/vendor/grammars/atom-fsharp
@@ -1 +1 @@
-Subproject commit 053f5dc3abd329369d272afd4cca3114636e0c70
+Subproject commit 7051d65d639ee209533354097a4b31e4f097d37d
diff --git a/vendor/grammars/dart-sublime-bundle b/vendor/grammars/dart-sublime-bundle
index 2e5295ab..d891fb36 160000
--- a/vendor/grammars/dart-sublime-bundle
+++ b/vendor/grammars/dart-sublime-bundle
@@ -1 +1 @@
-Subproject commit 2e5295ab32859d12714c8b44516d8a214eb73ecd
+Subproject commit d891fb36c98ca0b111a35cba109b05a16b6c4b83
diff --git a/vendor/grammars/factor b/vendor/grammars/factor
index 0f387e75..9b5cb445 160000
--- a/vendor/grammars/factor
+++ b/vendor/grammars/factor
@@ -1 +1 @@
-Subproject commit 0f387e750d4f7a8dca06af95faacdd9482d467d4
+Subproject commit 9b5cb445ee65d70d6b16bd65abb979f932441b93
diff --git a/vendor/grammars/haxe-sublime-bundle b/vendor/grammars/haxe-sublime-bundle
index c3b96f1c..94cc8eea 160000
--- a/vendor/grammars/haxe-sublime-bundle
+++ b/vendor/grammars/haxe-sublime-bundle
@@ -1 +1 @@
-Subproject commit c3b96f1c754ebc91bacc2926412042567fabbb5a
+Subproject commit 94cc8eea31127365556ef9bbb1db78ef6bfdd2e5
diff --git a/vendor/grammars/language-babel b/vendor/grammars/language-babel
index b49eb323..44ff68da 160000
--- a/vendor/grammars/language-babel
+++ b/vendor/grammars/language-babel
@@ -1 +1 @@
-Subproject commit b49eb3238820a00f8034e50b4b632915ce17368d
+Subproject commit 44ff68da9ee1df3710513d3b4de21f46ec6d0ed0
diff --git a/vendor/grammars/language-clojure b/vendor/grammars/language-clojure
index 6dfdabde..3173abe9 160000
--- a/vendor/grammars/language-clojure
+++ b/vendor/grammars/language-clojure
@@ -1 +1 @@
-Subproject commit 6dfdabde51699585f1f648bce10012b24befc4a3
+Subproject commit 3173abe9956a597944468fcef7b877b017149d50
diff --git a/vendor/grammars/language-csharp b/vendor/grammars/language-csharp
index 4c4dbea3..f635e67e 160000
--- a/vendor/grammars/language-csharp
+++ b/vendor/grammars/language-csharp
@@ -1 +1 @@
-Subproject commit 4c4dbea32393a32510bb60d95b49633dd09e9e06
+Subproject commit f635e67edef4e2fe68c3526e1ad26ed66f01aa62
diff --git a/vendor/grammars/language-hy b/vendor/grammars/language-hy
index f9750744..93d267de 160000
--- a/vendor/grammars/language-hy
+++ b/vendor/grammars/language-hy
@@ -1 +1 @@
-Subproject commit f9750744ae4b8519314dff7d57abc527b91a0ef2
+Subproject commit 93d267de4cdd8a099f34fb334bae0515a9734cd9
diff --git a/vendor/grammars/language-javascript b/vendor/grammars/language-javascript
index f7e166b6..9d69b86e 160000
--- a/vendor/grammars/language-javascript
+++ b/vendor/grammars/language-javascript
@@ -1 +1 @@
-Subproject commit f7e166b65d38069345ff0a8bbe59847a5f43ef4d
+Subproject commit 9d69b86e30ac05b300937d14ac7168ccace8d857
diff --git a/vendor/grammars/language-python b/vendor/grammars/language-python
index 44e1d183..6d7b52b8 160000
--- a/vendor/grammars/language-python
+++ b/vendor/grammars/language-python
@@ -1 +1 @@
-Subproject commit 44e1d1836675a9b19928a5b2cfce83613fd5b706
+Subproject commit 6d7b52b8823954c33a698e5d10721cee326c5fa1
diff --git a/vendor/grammars/language-shellscript b/vendor/grammars/language-shellscript
index d034fecc..0bbc7eee 160000
--- a/vendor/grammars/language-shellscript
+++ b/vendor/grammars/language-shellscript
@@ -1 +1 @@
-Subproject commit d034fecce883fe047ef8fd3b5ef2179182815ed3
+Subproject commit 0bbc7eee5af6c591c02e2af8d02fe35927b4f4cb
diff --git a/vendor/grammars/latex.tmbundle b/vendor/grammars/latex.tmbundle
index 6358337b..d40245e1 160000
--- a/vendor/grammars/latex.tmbundle
+++ b/vendor/grammars/latex.tmbundle
@@ -1 +1 @@
-Subproject commit 6358337b629fd9c17ac8c92f00e88859e6577d4f
+Subproject commit d40245e130abc81e0df5d7cb50f3bec995335b8c
diff --git a/vendor/grammars/nesC.tmbundle b/vendor/grammars/nesC.tmbundle
index d0d322ce..f58def8c 160000
--- a/vendor/grammars/nesC.tmbundle
+++ b/vendor/grammars/nesC.tmbundle
@@ -1 +1 @@
-Subproject commit d0d322ceafe3c4d8affc0e8b767fb6ad65c52704
+Subproject commit f58def8c5552dcb3ab6b55632fcad8a54ba2724e
diff --git a/vendor/grammars/php.tmbundle b/vendor/grammars/php.tmbundle
index baad8758..2ecaa60d 160000
--- a/vendor/grammars/php.tmbundle
+++ b/vendor/grammars/php.tmbundle
@@ -1 +1 @@
-Subproject commit baad875878c402b7b404a63616531644e538bf0c
+Subproject commit 2ecaa60d92b92d4c07f243207ba1d5b2114bb70a
diff --git a/vendor/grammars/sublime-rust b/vendor/grammars/sublime-rust
index 4fcfd98b..06a278cc 160000
--- a/vendor/grammars/sublime-rust
+++ b/vendor/grammars/sublime-rust
@@ -1 +1 @@
-Subproject commit 4fcfd98b22f179ed4d1f3dde4a0f21f8c651d4f3
+Subproject commit 06a278ccfaf5e542d26a95d66c734b4407bc4912
diff --git a/vendor/grammars/sublime-typescript b/vendor/grammars/sublime-typescript
index 066599f6..d80e89cb 160000
--- a/vendor/grammars/sublime-typescript
+++ b/vendor/grammars/sublime-typescript
@@ -1 +1 @@
-Subproject commit 066599f6afba3838c8fb053b6a0efb1308d626ad
+Subproject commit d80e89cbfb458279c45f32bb2d821ef72cb3d73d