rubocop-kata

A RuboCop plugin that replaces a pile of linter gems and config with one dependency. Install it and your .rubocop.yml shrinks to project-specific overrides. Everything else comes from the gem: a curated stack of RuboCop extensions, opinionated style defaults, and fifteen house cops.

Kata/GoodMethodName asks for one word per method name. A second word is allowed only when it is not hiding a missing object: a role prefix (after_fork), a role suffix (file_of), or a compound noun you have added to Terms on purpose. The wrong way to satisfy the cop is matching_idsmatchingids: if you need two words, that is a modelling smell — the concept is missing, or the method belongs on a different object. Kata/RealWords catches that dodge with a shipped dictionary instead of a word list you maintain: matchingids is not a word, so it fails with zero configuration — and so does cfg.

  • One dependency. Bundles rubocop-rspec, rubocop-performance, rubocop-elegant, rubocop-packaging, and rubocop-thread_safety behind a single gem.
  • Opinionated defaults. Methods under 5 lines, classes under 100, 4 parameters max, 120-column lines, double quotes, NewCops: enable. See config/default.yml.
  • Fifteen house cops. Naming, dependency discipline, and data honesty in the Elegant Objects spirit — from Kata/AgentNoun to Kata/ClockDiscipline.
class PaymentProcessor  # Kata/AgentNoun: `PaymentProcessor` names a doer;
end                     #   name the class for the thing it is, not the work it does.

class Payment           # OK
end

Getting started

Add the gem to your Gemfile:

gem "rubocop-kata", group: :development, require: false

Install it and point .rubocop.yml at the plugin:

plugins:
  - rubocop-kata

AllCops:
  TargetRubyVersion: 3.4
bundle install
bundle exec rubocop

That's it. The plugin loads the bundled extensions and the shared defaults, so your .rubocop.yml keeps only what's specific to your project. Requires Ruby >= 3.4 and RuboCop ~> 1.75.

The cops

Cop Default What it enforces
Kata/AgentNoun on Classes named for what they are, not -er/-or doers. Allow exceptions via AllowedNames.
Kata/NoComments on No prose comments; say it in the code. Magic comments, linter directives, and licence headers survive. Autocorrects.
Kata/IoDiscipline on No bare puts/warn/pp/p outside specs/scripts; write through an injected @io or an explicit receiver.
Kata/ProsePlacement off Sentence-length strings belong in the presentation layer. Enable with an Include/Exclude matching your layering.
Kata/NoUtilName on No junk-drawer names (Util, Helper, Manager, Service, …). Tune via BannedNames.
Kata/RealWords on Every name segment is a word the shipped dictionary knows — errorcount (smash) and cfg (abbreviation) both fail, with no word list to maintain. Tune via Terms/BannedWords/AllowedNames.
Kata/GoodMethodName on One word per method name; a second word needs a role prefix (after_fork), a role suffix (file_of), or a reviewed Terms entry. Tune via MaxWords/Prefixes/Suffixes/Terms/AllowedNames.
Kata/GoodVariableName on The same rule for locals, parameters, ivars, class variables, and globals; _name and @_name stay exempt.
Kata/BuilderNoun on Builders named for what they return: total, not calculate_total. Tune via BannedPrefixes.
Kata/NoBooleanFlag on No positional boolean arguments; split the method or use a keyword.
Kata/ConstructorDiscipline on initialize assigns, raises, or freezes — never computes.
Kata/NoClassMethodLogic on Class methods construct (build, parse, of, from_*); instances do the work.
Kata/NoHashAsObject on A hash with MaxKeys+ keys (default 4) wants to be an object. Keyword-argument call sites exempt.
Kata/ClockDiscipline on No bare Time.now/Date.today/.current; inject a clock.
Kata/EnvDiscipline on ENV reads only in the boot layer (config/, bin/, exe/).

The defaults

Double-quoted strings, Metrics/MethodLength: 5, Metrics/ClassLength: 100, Metrics/ParameterLists: 4, 120-column lines, endless methods on one line, rescue => error, NewCops: enable, and heredocs counted as one line in spec examples. See config/default.yml.

License

MIT.