- (Al Snow) Upgrade parser dependency
- (mvz) Add support for Ruby 2.6.
- (mvz) Add support for JRuby 9.1 and 9.2
- (troessner) Enable exclusion of single files.
- (troessner) Simplify todo list feature.
- (troessner) Show configuration path.
- (mvz) Parser 2.5.1.1 seems broken. Disallow it.
- (mvz) Improve control parameter recursion performance.
- (troessner) Fix uninitialized constant error
Breaking changes:
- (David Fisher) Change PrimaDonnaMethod to MissingSafeMethod
- (mvz) Always include documentation in JSON and YAML
- (mvz) Remove Syntax smell detector
- (mvz) Remove deprecated Examiner#description (in favor of Examiner#origin)
- (mvz) Allow only detector names in configuration hash
- (mvz) Do not accept a class as parameter for reek_of
- (mvz) Allow only .reek.yml instead of any file name ending in .reek
- (troessner) Validate our configuration by using a schema
- (troessner) Scope detectors in the configuration under
detectors
- (troessner) Move directory directives under a special key
- (troessner) Use strings not regexes in our configuration file
- (troessner) Replace
wiki-links
flag withdocumentation
flag - (troessner) Add yml extension to Reeks configuration file
- (troessner) Drop legacy code comment separator
- (troessner) Drop Ruby 2.2 support
- (troessner) Drop Ruby 2.1 support
Non breaking changes:
- (Paul Sadauskas) Add support for --stdin-filename
- (mvz) Generate versioned documentation links
- (mvz) Bugfix: Only report FeatureEnvy for instance methods
- (troessner) List all smells
- (mvz) Only report FeatureEnvy for instance methods
- (mvz) Generate versioned documentation links
- (mvz) Loosen dependency on rainbow
- (pocke) Support Ruby 2.5
- (mvz) Print original exception class in certain error messages
- (mvz) Only include long exception message in CLI output
- (chastell) Add official support for Ruby 2.5
- (mvz) Do not detect ModuleInitialize for nested dynamic classes
- (mvz) Handle UTF-8 files in all locales
- (troessner) Handle encoding and other errors when parsing the source
- (mvz) Report method source line in PrimaDonnaMethod
- (mvz) Pick up config file in reek matcher
- (mvz) Let REEK_SRC override set values in rake task
- (mvz) Also report unused uncommunicative parameter names
- (mvz) Track visibility correctly when using method definition visibility modifiers
- (mvz) Handle method comments when using method definition visibility modifiers
- (mvz) Improve IrresponsibleModule and fix some bugs along
- (pocke) Introduce Syntax smell detector
- (pocke) Prevent from breaking on a string with escape sequence incompatible with UTF-8
- (pocke) Use Ruby 2.4 parser for parsing code
- (IanWhitney) Properly handle absolute paths.
- (IanWhitney) Implement
--force-exclusion
flag - (mvz) Raise Reek-specific error on parse errors
- (mvz) Raise on errors inside of Examiner#smells instead of outputting to STDERR
- (mvz) Update parser dependency
- (mvz) Load YAML in code comments safely
- (mvz) Combine lines for manual dispatch smells
- (mvz) Respect exclude_paths when passing sources on the command line
- (mvz) Ensure explicit arguments of super() are processed
- (troessner) Improve documentation and fix PrimaDonnaMethod detector configuration via comment.
- (jhubert) Stop reporting FeatureEnvy with super and arguments.
- (troessner) Warn about multiple configuration files.
- (troessner) Validate configuration keys in code comments.
- (jhubert) Add progress formatters for showing progress on each file
- (mvz) Update progress formatter to match changed file location
- (mvz) Disable progress for piped output
- (maxjacobson) Emit fingerprints in Code Climate reporter
- (troessner) Create a fresh todo file on every run
- (troessner) Handle garbage in comment config properly
- (troessner) Improve handling of internal errors in detectors and the corresponding error messages
- (troessner) Fail properly on bad configuration comments
- (troessner) Quote names in smell detector messages
- (troessner) Make our CodeComment regex more lenient
- (troessner) Fix UncommunicativeVariableName does not take regex configuration into account
- (waldyr) Add ignored nodes parameter to local_nodes
- (waldyr) Add Instance Variable Assumption smell detector
- (waldyr) Remove memoized instance variables from accounting of TooManyInstanceVariables smell
- (backus) Add ManualDispatch smell.
- (mvz) Detect safe navigation operator and report on it.
- (troessner) Make Reek more resilient on incomprehensible source.
- (troessner) Make our parameter handling consistent in smell detectors.
- (Drenmi) Rename
#inspect
method to#sniff
- (soutaro) Add SexpExtensions::CSendNode for safe navigation operator
- (soutaro) Use bundler to load libs during test
- (waldyr) Fix TooManyConstants for outer module when inner module suppress
- (waldyr) Add Too Many Constants smell detector
- (waldyr) Checking lambda should not raise error
- (waldyr) Add SubclassedFromCoreClass detector
- (mvz) Handle new lambda syntax in NestedIterators
- (troessner) Bump parser
- (mvz) Include default exclusions in generated TODO file
- (mvz) Avoid generating duplicate context entries in exclusions
- (mvz) Stop UnusedPrivateMethod getting confused by nested classes
- (mvz) Implement and use ShouldReekOf#with_config
- (mvz) Automatically enable smell in reek_of matcher
- (thepry) Fix excluded paths for custom config formats.
- (troessner) Fix disabling UnusedPrivateMethod via
exclude
in configuration. - (troessner) Fix
accept
andreject
configuration handling. - (troessner) Fix UnusedParameter detector for lvasgn.
- (troessner) Remove deprecated method
from_map
fromAppConfiguration
. The successor isAppConfiguration.from_hash
.
- First pre-release for Reek 4.
- (troessner) Make all optional arguments to Examiner's constructor keyword arguments.
- (troessner) Use keyword arguments without defaults as allowed by Ruby 2.1.
- (mvz) Remove smell category concept:
- The smell category is removed from the YAML and JSON outputs.
- The smell category can no longer be used to select smells in the reek_of matcher.
- (chastell) Make HTML report print to stdout like the other reports
- (troessner) Drop support for CRuby 2.0
- (mvz) Speed up reek_of matcher by only running the given smell
- (troessner) Add a --todo cli flag that will generate a todo list.
- (troessner) Bump parser to 2.3.0.6 as minimum to fix problems with invalid syntax.
- (mvz) Fix edge case syntax problems
- (troessner) Disable UnusedPrivateMethod detector by default
- Add CodeClimate Docker integration. This will allow users to deduct their own docker image
from the existing one and use it for their own CI set up in whatever ways they see fit.
Furthermore this will enable users to run
Reek
locally in combination withcodeclimate cli
.
- (troessner) Actually use the corresponding parser for Ruby 2.3
- (chastell) Bump Parser dependency to support Ruby 2.3
- (mvz) Remove the
unparser
gem as dependency
- (avdgaag) Accept FileList as Rake task source file
- (pocke) Skip path if path doesn't exist.
- (troessner) Don't raise on missing directory for directive.
- (troessner) Report unused private instance methods.
- (troessner) Add Rake task for console.
- (troessner) Reverse merge default directives into directory directives.
- (andyw8) Add Code Climate JSON report format:
--format code_climate
- (chastell) Simplify
text
report format and enable--wiki-links
by default
- (mvz) Make UtilityFunction not report methods that call
super
with arguments.
- (mvz) Make Attribute respect suppressing comments
- (chastell) Adjust parser dependency to allow versions 2.2.3+ (and even 2.3+)
- (tansaku + mvz) Allow matches in reek_of for message, lines, context and source.
- (mvz) Deprecate AppConfiguration.from_map in favor of AppConfiguration.from_hash.
- (troessner) Ignore iterators without block arguments for NestedIterators
- (chastell) Fix parsing
Foo = bar.new(new)
- (chastell) Sort line numbers in reports of multi-line smells
- (chastell) Fix parsing bare
attr
- (troessner) Fix
reek_of
not checkingsmell_details
- (chastell) Fix parsing
Foo = new
- (chastell) Fix parsing
Foo = Class.new do … end.new
- (troessner) Make UtilityFunction configurable for non-public methods
- (troessner) Make FeatureEnvy and UtilityFunction messages more helpful
- (mvz) Mark public API @public
- (troessner) Fix file list as argument in rake task
- (troessner) Ignore
Object#tap
for NestedIterators - (mvz) Ensure all YAML methods are loaded (workaround for #653)
- (HParker / Adam Hess) add support for or-assign constants
- (troessner) Update TooManyMethods default value to 15
- (troessner) Revert 864f0a9 to hotfix #642
- (mvz) Detect attribute writers created with
attr
in Attribute smell - (beanieboi) Report
attr_writer
andattr_accessor
in Attribute smell - (troessner) Update TooManyInstanceVariables default from 9 to 4
- (troessner) Make smells configurable on a directory base
- (mvz) Handle modules defined by constant assignment
- (mvz) Handle modifier style use of module_function for UtilityFunction
- (troessner) Fix wiki-link cli option.
- (troessner) Recognize singleton methods defined via module function.
- (chastell) Report all envious lines for FeatureEnvy
- (mvz) Report IrresponsibleModule for modules in addition to classes
- (mvz) Do not report IrresponsibleModule for namespace modules
- (troessner) Fix finding sources when using just the current directory.
- (troessner) Only use Ruby source files.
- (troessner) Fix Reek descending into hidden directories
- (troessner) Make directories excludable via configuration.
- (mvz) Define and document public API
- (troessner) Recognize methods defined with class << self syntax as singleton methods.
- (troessner) Use Ruby22 instead of Ruby21 for parsing.
- (nTraum) Drop support for Ruby 1.9
- (mvz) Support methods using array decomposition arguments
- (sauliusgrigaitis) Add support for XML reports
- (beanieboi) Don’t track private methods in the Attributes smell
- (Sebastian Boehm) Do not enable colorization if stdout is not a TTY
- (mvz) Ensure require 'reek' is enough to use Reek's classes
- (mvz) Pick config file that comes first alphabetically
- (mvz) Separate FeatureEnvy and UtilityFunction
- (chastell) Recognise .reek as a valid configuration file
- (mvz) Make NestedIterators handle super with arguments
- (mvz) Handle shadow block arguments
- (CoralineAda) Allow all formatters to support -U (wiki links)
- (tuexss) Make defaults transparent in help message
- (troessner) Fix version command
- (leonelgalan) Add support for json reports
- (chastell) Escape Regexp-like Strings on CodeContext matches (Bug troessner#397)
- (troessner) Revise, improve & refactor our Rspec matcher and remove smell_of
- (guilhermesimoes) Fix generating HTML report
- (mvz) Re-organize CLI options
- (maser) Fix file arguments without TTY
- (marcofognog) Make NestedIterator not break if iterator is called on super
- (troessner) Revamp & refactor our rake task
- (mvz) Support Ruby 2.2
- (mvz) Fix rake task bug when no config file was given explicitly.
- (troessner) Run on working directory when no source is given.
- (mvz) Fix regression in rake task: Provide alias for backward compatibility
-
(troessner) Revise configuration handling: Now there are 3 ways of passing Reek a configuration file:
- Using the cli "-c" switch
- Having a file ending with .reek either in your current working directory or in a parent directory (more on that later)
- Having a file ending with .reek in your HOME directory
The order in which Reek tries to find such a configuration file is exactly like above: First Reek checks if we have given it a configuration file explicitly via CLI. Then it checks the current working directory for a file and if it can't find one, it traverses up the directories until it hits the root directory. And lastly, it checks your HOME directory. As soon as Reek detects a configuration file it stops searching immediately, meaning that from Reek's point of view there exists one configuration file and one configuration only regardless of how many ".reek" files you might have on your filesystem.
-
(chastell) Add keyword arguments support after switching to 'parser'
-
(mvz) Handle nil-block in iterators
- (mvz) Fix support for empty block in NestedIterators
- (mvz) Update minimum required Ruby version to 1.9.3
- (chastell) Fix support for required keyword arguments
- (mvz) Parse with the parser gem
- (mvz) Add ModuleInitialize smell
- (Gilles Leblanc) Corrects UnusedParameter with keyword arguments with splat
- (mvz) Consider block parameter for DuplicateMethodCall
- (mvz) Add support for detecting specific smells
- (troessner) Add ultra verbose warning formatter.
- Internal improvements
- (gilles-leblanc) Add color to Reek's output
- (mvz) Ignore unused parameters if method calls super in nested context
- (mvz) Only mark parameters uncommunicative if used
- (troessner) Add
Prima Donna Method
smell
- (troessner) Allow sorting by issue count
- (mvz) Improve cli options
- (apiology) Add --single-line option for reporting
- (gilles-leblanc) Allow config files to override default config values
- (gilles-leblanc) Added line numbers by default when you run the reek command
- (mvz) Support Ruby 2.0 syntax
- (bf4) Loosen ruby_parser version dependency
- (gilles-leblanc) Added total warning count
- (mvz) Allow duplicate calls to variable-like methods
- (mvz) Improve NestedIterators smell detector
- (mvz) Make combination of -n and -q options work
- (EmilRehnberg) Added smell for nil checks
- (geoffharcourt) Updated dependencies to use ruby2ruby 2.0.2 and ruby_parser 3.1.1
- (EmilRehnberg) Added command-line option for printing line numbers with the smell lines
- (mvz) Use new ruby_parser 3 and friends
- (EmilRehnberg) Unused parameter smell added
- (dkubb) Fix problem with IrresponsibleModule flagging the same module twice
- (mvz) Update to rspec2.
- (petrjanda) Fix undefined method
chr
on an instance of String on Rubinius
- (mvz) Use ripper_ruby_parser on Ruby 1.9.3 and up (thus making Reek able to parse the new 1.9 hash syntax).
- (mvz) Make Bundler a development dependency.
- (troessner) Use bundler rake tasks.
- (marktabler) Allow single underscore as a variable assignment without triggering UncommunicativeVariableName.
- Smell detectors can be configured or disabled in code comments
- Comment with
:reek:smell_name
disables the named smell for a class, module or method - Comment with
:reek:smell_name:{...}
for more detailed configuration
- Comment with
- Additional config file(s) can be specified:
- on the command-line using -c
- via Reek::Rake::Task in the rakefile
- Duplication can be configured to ignore specific calls
- IrresponsibleModule now reports scoped module names correctly (#66)
- NestedIterators is now more configurable:
- Option to specify permitted nesting depth (#14)
- Option to ignore certain iterator methods
- UtilityFunction no longer reported when local method called in param initializer (#60)
- Spaces removed from smell class names in report output
- Masked smells are no longer reported
- the -a command-line option has been removed
- some methods on Examiner are now deprecated
- DataClump no longer needs infinite memory for large classes (#57 again)
- Number of masked smells is no longer shown in report headers
- Masked smells are no longer listed in --yaml reports
- DataClump no longer needs infinite memory for large classes (#57)
- DataClump reports the names of the offending methods in the YAML report
- UncommunicativeMethodName now accepts operator names (+, -, ...)
- Uncommunicative Name now warns about uppercase letters in method & var names
- Fixed crash on a case statement with no condition (#58)
- New option --yaml reports smells in YAML format
- Now require 'reek/rake/task' to use the rake task
- Now require 'reek/spec' to use the Rspec matchers
- Developer API completely revised and documented
- New smell: Irresponsible Module (has no meaningful comment)
- ControlCouple no longer checks arguments yielded to blocks
- FeatureEnvy and UtilityFunction are now subclasses of a new smell: LowCohesion
- NestedIterators now reports the nesting depth
- Fixed problem checking for UtilityFunctions in Object
- Improved detection of invalid config files
- Invalid config files are now ignored
- Non-existent files are now ignored
See http://wiki.github.com/kevinrutherford/reek for further details.
- Corrected display of module methods to use # (#56)
- Ignores ruby_parser errors and pretends the offending file was empty
- The -f, -c and -s options for formatting smell warnings have been removed
- ControlCouple now warns about parameters defaulted to true/false
- New smell: Attribute (disabled by default)
- Expanded DataClump to check modules (#9)
- Fixed LargeClass to ignore inner classes and modules
- Fixed LargeClass to ignore singleton methods
- Removed support for MyClass.should_not reek due to ParseTree EOL
- Removed internal requiring of 'rubygems'
- New smell: Class Variable
See http://wiki.github.com/kevinrutherford/reek for details
- Reek passes all its tests under Ruby 1.8.6, 1.8.7 and 1.9.1 (fixed #16)
- New smell -- Data Clump:
- Looks within a class for 3 or more methods taking the same 2 or more parameters
- New smell -- Simulated Polymorphism:
- Currently only performs basic check for multiple tests of same value
- Reek's output reports are now formatted differently:
- Reek is no longer silent about smell-free source code
- Output now reports on all files examined, even if they have no smells
- Smell warnings are indented in the report; file summary headers are not
- Reports for multiple sources are run together; no more blank lines
- Reports in spec matcher failures are quiet (fixed #38)
- The smells masked by
*.reek
config files can now be seen:- The header for each source file now counts masked smells
- The --show-all (-a) option shows masked warnings in the report
- The spec matchers are now accessed by requiring 'reek/adapters/spec'
- Reek's RDoc is now hosted at http://rdoc.info/projects/kevinrutherford/reek
- If a dir is passed on the command-line all
**/*.rb
files below it are examined (fixed #41) - Duplication warnings now report the number of identical calls
- FeatureEnvy no longer ignores :self when passed as a method parameter
- LargeClass is disabled when checking in-memory classes (fixed #28)
- LongParameterList accepts upto 5 parameters for #initialize methods
- Several changes to the LongMethod counting algorithm:
- LongMethod now counts statements deeper into each method (fixed #25)
- LongMethod no longer counts control structures, only their contained stmts
- See http://wiki.github.com/kevinrutherford/reek/long-method for details
- UncommunicativeName warns about any name ending in a number (fixed #18)
- UtilityFunction has been relaxed somewhat:
- no longer reports methods that call 'super' (fixed #39)
- no longer reports simple helper methods
- can be configured based on number of calls out
- Now reports an error for corrupt config files
- Empty config files are ignored
- Smells can be configured with scope-specific overrides for any config item
- No longer depends directly on the sexp_processor gem
- LargeClass now relies only on the given source code (fixed #26)
- Switched from ParseTree to ruby_parser for source code parsing
- 'MyClass.should_not reek' now only possible if ParseTree gem installed
- LargeClass now also warns about any class with > 9 instance variables (fixed #6)
- Now depends on ruby2ruby, to display code better
- Duplication notices more repeated method calls
- Smells within blocks are now reported better
- Now possible to write 'MyClass.should_not reek' (fixed #33)
- Now counts attr assignments ([]= etc) in feature envy calculations
- Doesn't attempt to find
*.reek
files when reading code from stdin
- Dir[...].to_source now creates a Report that can be browsed (fixed #36)
- Use
*.reek
files in source tree to configure Reek's behaviour - Added -f option to configure report format
- --sort_order replaced by -f, -c and -s
- Matchers provided for rspec; eg. foo.should_not reek
- Smells in singleton methods are now analysed
- Uncommunicative parameter names in blocks now reported
- Modules and blocks now reflected in scope of smell reports
- Corrected false reports of long arg lists to yield
- A method can now be a UtilityFunction only when it includes a call
- Uncommunicative Name now checks instance variables more thoroughly
- Uncommunicative Name now warns about names of the form 'x2'
- Added check for duplicated calls within a method
- Reduced scope of Feature Envy warnings to cover only overuse of lvars
- Added rdoc comments explaining what each smell is about
- Chained iterators are no longer mis-reported as nested
- New smell: first naive checks for Control Couple
- Reek now only checks sources passed on the command line
- Code snippets can be supplied on the commandline
- Added headings and warnings count when smells in multiple files
- Added Reek::RakeTask to run Reek from rakefiles
- Fixed: Returns exit status 2 when smells are reported
- Fixed: no longer claims an empty method is a Utility Function
- Minor enhancements:
- Only reports Feature Envy when the method isn't a Utility Function
- General improvements to assessing Feature Envy
- Tweaks:
- Fixed: coping with parameterless yield call
- Fixed: copes with :self as an expression
- Fixed: displaying the receiver of many more kinds of Feature Envy
- Fixed: Large Class calculation for Object
- Tweaks:
- Fixed --version!
- Tweaks:
- Now works from the source code, instead of requiring each named file
- Added integration tests that run Reek on a couple of gems
- Minor enhancements:
- Added --help, --version options
- Added --sort option to sort the report by smell or by code location
- Some tweaks:
- Fixed report printing for Feature Envy when the receiver is a block
- Fixed: successive iterators reported as nested
- Fixed: Long Method now reports the total length of the method
- Fixed: each smell reported only once
- 1 minor enhancement:
- Added a check for nested iterators within a method
- Some tweaks:
- Begun adding some rdoc
- Split some of the specs into more meaningful chunks
- Updated the rakefile so that rcov is no longer the default
- 1 major enhancement:
- Initial release