Skip to content
internal/classify
Edit
On this page

Group naming and text/binary classification: extension normalization, the ext, type and hybrid methods, sniffing on a map miss, and the empty-file rule.

#internal/classify

#internal/classify

Package classify determines a file's group name (format) and its text/binary classification, according to the selected grouping method.

#MethodExt

Go go
const MethodExt    = "ext"

Grouping method names.

#MethodType

Go go
const MethodType   = "type"

#MethodHybrid

Go go
const MethodHybrid = "hybrid"

#FormatsRaw

Go go
const FormatsRaw       = "raw"

Format naming modes: how the group name a file lands in is spelled.

#FormatsCanonical

Go go
const FormatsCanonical = "canonical"

#GroupNoExtension

Go go
const GroupNoExtension = "(no extension)"

Group names for files that could not be assigned a real format.

#GroupUnknown

Go go
const GroupUnknown     = "(unknown)"

#Class

Go go
type Class struct

Class is the classification outcome for a single file.

#Classifier

Go go
type Classifier struct

Classifier classifies files per a fixed method and embedded lists.

#New

Go go
func New(method, formats string, textExts, textMimes map[string]struct{}, aliases map[string]string) *Classifier

New returns a Classifier for the given method ("ext", "type", or "hybrid") and format naming mode ("raw" or "canonical"). aliases is the canonical alias table, read only in canonical mode.

#NormalizeExt

Go go
func NormalizeExt(name string) string

NormalizeExt returns the normalized extension of a file name: the suffix after the last dot, lowercased, without the dot. Following Python's Path.suffix semantics: "archive.tar.gz" -> "gz"; dotfiles like ".bashrc", bare names like "Makefile", and trailing-dot names have no extension.

#ShebangFormat

Go go
func ShebangFormat(line string) (string, bool)

ShebangFormat maps a shebang line to the format name its scripts are grouped under in canonical mode. The second result is false when the line is not a shebang, names no interpreter, or names one with no unambiguous format.

The interpreter is found by stripping an env wrapper (its flags, its -S/--split-string forms, and any NAME=value assignments), then unwrapping the uv run X and uvx X runner forms. A trailing version suffix on the interpreter's base name is dropped, so python3.12 reads as python.

#Classifier.ExtIsText

Go go
func (c *Classifier) ExtIsText(ext string) bool

ExtIsText reports whether a normalized extension classifies as text.

#Classifier.MimeIsText

Go go
func (c *Classifier) MimeIsText(mime string) bool

MimeIsText reports whether a MIME type classifies as text: it starts with "text/" or is in the embedded text-mimetypes list.

#Classifier.File

Go go
func (c *Classifier) File(absPath, name string, size int64) (Class, error)

File classifies the file at absPath whose base name is name and whose size in bytes is size. A non-nil error means the file could not be read during sniffing; the caller must treat it as unreadable. Class.Sniffed is valid even when err is non-nil.

More tools from this site

  • claudestream Drive Claude Code from Python: run it as a subprocess and read its output as typed events, with async and sync sessions, sandbox policies, and tools you define in Python
  • claudewheel A TUI Claude Code Launcher that lets you have more than one profile, manage sessions lifecycle, pick the exact CC version, model to use (even older unlisted ones), pick which GitHub account to use, etc.
  • fastware A batteries-included ASGI framework: msgspec JSON, a managed Granian server, dependency injection, SSE, WebSockets, auth, and a test client
  • go-toml-edit Zero-dep TOML editing library for Go with comment preservation
  • howmuchleft The fastest Claude Code statusline: context window, 5-hour, and weekly limit usage as three customizable gradient bars, rendering in about 6 ms
  • orxtra
  • pgdesign
  • predraw Declarative rendering pipeline: describe a scene in JSON and get SVG, PNG and WebP out, with light and dark style tokens, reusable components and text converted to path outlines
  • reposummary Turn a git repository's history into a Markdown journal: pick a time window or revision range and get a readable digest of what changed, optionally narrated by an LLM
  • rlsbl Release orchestration and project scaffolding CLI that bumps versions, validates a structured JSONL changelog, tags only the commit CI verified, and publishes to npm, PyPI, Go and more
  • safegit git wrapper CLI that gives each commit its own temporary index and retries ref updates on conflict, so concurrent agents share one repository
  • saferm Command-line replacement for rm that archives every deletion with a mandatory reason and the context it ran in, so deleted files can be listed, inspected and restored
  • selfdoc Static Site Generator that builds a project's documentation site directly from its source code, so the docs can never drift from the code they describe, with SEO/AEO, first-class blog, search, and cross-project linking built in
  • strictcli
  • stricttest An always-on test-isolation floor: a pytest plugin and a Go env-hygiene module that make a test suite structurally unable to reach real credentials, the real HOME, the network, or the development repository.
  • wesktop A Python framework that turns an ASGI web app into a desktop application, serving it from a local Granian server and displaying it in a native OS window via pywebview
Search