Skip to main content

Linters and formatters for ensuring WPILib's source code conforms to its style guide

Project description

wpiformat

Provides linters and formatters for ensuring WPILib's C++, Java, and Python code conform to its style guide. WPILib uses a variant of the Google style guides.

Dependencies

Installation

On Windows, execute:

py -m pip install wpiformat

On Linux/OSX, execute:

pip install wpiformat

Project Setup

To use these tools with a new project, copy .styleguide, and .styleguide-license from the examples folder into the project and create a new .clang-format file based on the desired C/C++ style.

Note: Since wpiformat already handles include ordering, it is recommended to use SortIncludes: false in .clang-format.

.styleguide

wpiformat checks the current directory for the .styleguide file. If one doesn't exist, all parent directories are tried as well. This file contains groups of filename regular expressions.

groupName {
  regex_here
}

The regexes are matched using re.search(), so they don't have to match the whole filename.

Empty config groups can be omitted. Directory separators must be "/", not "\". During processing, they will be replaced internally with an os.sep that is automatically escaped for regexes.

See the .styleguide file in the docs/examples directory for all possible groups.

Specifying C/C++ files to format

The cHeaderFileInclude group specifies C headers to format, the cppHeaderFileInclude group specifies C++ headers to format, and the cppSrcFileInclude group specifies C++ source files to format. It's common to match just the file extension like so: \.hpp$.

Ignoring files

There are two groups of regexes which prevent tasks (i.e., formatters and linters) from running on matching files:

  • generatedFileExclude (generated files)
  • modifiableFileExclude (modifiable files)

Generated files should not be modified by the user; if they are, wpiformat will emit warnings. No warnings are emitted for modifications to modifiable files.

All files ignored by patterns in a repository's .gitignore file are considered modifiable files. Exclusion groups take precedence over inclusion groups.

License update exclusion

Filenames matching regexes in the group licenseUpdateExclude will be skipped by the license header update task.

Include guards

Valid include guard patterns have the following properties:

  • Use capital letters
  • Start with the repository name
  • Include the path to the file and the filename itself
  • Have directory separators and hyphens replaced with underscores
  • Have a trailing underscore

The path to the file starts from the repository root by default. Other paths, such as include directories, can be specified in the includeGuardRoots group. If a path matches, that string will be truncated from the include guard pattern.

For example, given a file at allwpilib/src/main/native/include/wpiutil/support/ConcurrentQueue.h and an include path of src/main/native/include/, the resulting include guard would be ALLWPILIB_WPIUTIL_SUPPORT_CONCURRENTQUEUE_H_.

The repoRootNameOverride group allows one to override the repository name used in include guards. This is useful for giving subprojects within one repository different repository roots in their include guards. Only specify one name in this group because subsequent names will be ignored.

Include sorting

The following groups correspond to the header groups in the style guide. If a header name matches a regex in one of the groups, it overrides the default ordering and is placed in the corresponding group. The groups of regexes are checked in order of include group precedence (the order shown below).

  • includeRelated (headers related to a .cpp file, like File.h included by File.cpp)
  • includeCSys (C system headers)
  • includeCppSys (C++ system headers)
  • includeOtherLibs (headers from thirdparty libraries or other monorepo subprojects)
  • includeProject (headers from the current subproject)

includeCSys produces false positives on headers from "other libraries". Regexes for them should be added to includeOtherLibs. Libraries with many headers generally group them within a folder, so a regex for just the folder will suffice.

Appending a // NOLINT comment to a header include to prevent wpiformat's header include sorter from modifying it and to maintain its relative ordering with other header includes. This will, in effect, treat it as a barrier across which no header includes will be moved. Header includes on each side of the barrier will still be sorted as normal.

.styleguide-license

This file contains the license header template. It should contain Copyright (c) followed by the company name and the string {year}. See the .styleguide-license file in the docs/examples directory.

wpiformat checks the currently processed file's directory for a .styleguide file first and traverses up the directory tree if one isn't found. This allows templates which are closer to the processed file to override a project's main template.

License header semantics

The license header is always at the beginning of the file and ends after two newlines. If there isn't one, or it doesn't contain the required copyright contents, wpiformat inserts a new one containing the current year.

.styleguide-license special variables

{year} is replaced with a year range from the earliest copyright year in the file to the current year. If the earliest year is the current year, only that year will be written.

{padding} is optional and represents an expanding space which pads the line to 80 columns. Multiple instances of {padding} on the same line share the padding equally.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wpiformat-2025.34.tar.gz (117.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wpiformat-2025.34-py3-none-any.whl (112.6 kB view details)

Uploaded Python 3

File details

Details for the file wpiformat-2025.34.tar.gz.

File metadata

  • Download URL: wpiformat-2025.34.tar.gz
  • Upload date:
  • Size: 117.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for wpiformat-2025.34.tar.gz
Algorithm Hash digest
SHA256 57f1784b193b562ccdaef735a5f53ee17d2df7923ff480da5a650df8b91a42ba
MD5 a73ef6e4e4a89b54cfd2236bc27d51ac
BLAKE2b-256 f9e26b33d9aa758be84b3abd78278addceecd47d9ce73c77a644d3a544c193f6

See more details on using hashes here.

Provenance

The following attestation bundles were made for wpiformat-2025.34.tar.gz:

Publisher: ci.yml on wpilibsuite/styleguide

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wpiformat-2025.34-py3-none-any.whl.

File metadata

  • Download URL: wpiformat-2025.34-py3-none-any.whl
  • Upload date:
  • Size: 112.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for wpiformat-2025.34-py3-none-any.whl
Algorithm Hash digest
SHA256 96b0b9241f0fbb7a7a01f0e630ed7719e3b789f00397a69177ad6e70170981c4
MD5 fdb4362dec891991c477ead97c745c69
BLAKE2b-256 c73f1d2d9b973d07a2bb269a17cbdb21ce77113397302422a33d68b199b57dfb

See more details on using hashes here.

Provenance

The following attestation bundles were made for wpiformat-2025.34-py3-none-any.whl:

Publisher: ci.yml on wpilibsuite/styleguide

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page