reek 4.4.1 → 4.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +46 -0
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +5 -1
  5. data/docs/Duplicate-Method-Call.md +96 -0
  6. data/docs/How-To-Write-New-Detectors.md +16 -0
  7. data/docs/Large-Class.md +2 -1
  8. data/docs/Simulated-Polymorphism.md +1 -1
  9. data/features/configuration_via_source_comments/erroneous_source_comments.feature +39 -0
  10. data/lib/reek/ast/node.rb +4 -0
  11. data/lib/reek/code_comment.rb +11 -3
  12. data/lib/reek/context/code_context.rb +3 -1
  13. data/lib/reek/context/module_context.rb +1 -1
  14. data/lib/reek/errors.rb +32 -0
  15. data/lib/reek/examiner.rb +6 -1
  16. data/lib/reek/rake/task.rb +0 -2
  17. data/lib/reek/smells/boolean_parameter.rb +1 -1
  18. data/lib/reek/smells/class_variable.rb +2 -2
  19. data/lib/reek/smells/instance_variable_assumption.rb +1 -1
  20. data/lib/reek/smells/prima_donna_method.rb +18 -17
  21. data/lib/reek/smells/smell_detector.rb +19 -2
  22. data/lib/reek/smells/unused_private_method.rb +1 -1
  23. data/lib/reek/spec/should_reek_of.rb +2 -0
  24. data/lib/reek/version.rb +1 -1
  25. data/spec/factories/factories.rb +11 -0
  26. data/spec/quality/reek_source_spec.rb +1 -1
  27. data/spec/reek/ast/node_spec.rb +40 -0
  28. data/spec/reek/ast/object_refs_spec.rb +20 -59
  29. data/spec/reek/ast/sexp_extensions_spec.rb +16 -19
  30. data/spec/reek/cli/application_spec.rb +25 -25
  31. data/spec/reek/cli/command/report_command_spec.rb +1 -2
  32. data/spec/reek/cli/command/todo_list_command_spec.rb +1 -1
  33. data/spec/reek/cli/options_spec.rb +7 -5
  34. data/spec/reek/code_comment_spec.rb +74 -44
  35. data/spec/reek/configuration/default_directive_spec.rb +3 -3
  36. data/spec/reek/configuration/directory_directives_spec.rb +10 -10
  37. data/spec/reek/configuration/excluded_paths_spec.rb +2 -2
  38. data/spec/reek/context/code_context_spec.rb +22 -26
  39. data/spec/reek/context/ghost_context_spec.rb +1 -1
  40. data/spec/reek/context/method_context_spec.rb +13 -7
  41. data/spec/reek/context/module_context_spec.rb +4 -4
  42. data/spec/reek/context/root_context_spec.rb +1 -1
  43. data/spec/reek/context_builder_spec.rb +34 -38
  44. data/spec/reek/examiner_spec.rb +43 -22
  45. data/spec/reek/rake/task_spec.rb +3 -3
  46. data/spec/reek/report/code_climate_formatter_spec.rb +42 -40
  47. data/spec/reek/report/code_climate_report_spec.rb +1 -1
  48. data/spec/reek/report/html_report_spec.rb +1 -1
  49. data/spec/reek/report/json_report_spec.rb +1 -1
  50. data/spec/reek/report/location_formatter_spec.rb +18 -16
  51. data/spec/reek/report/text_report_spec.rb +12 -8
  52. data/spec/reek/report/xml_report_spec.rb +1 -1
  53. data/spec/reek/report/yaml_report_spec.rb +1 -1
  54. data/spec/reek/report_spec.rb +4 -4
  55. data/spec/reek/smells/attribute_spec.rb +7 -10
  56. data/spec/reek/smells/boolean_parameter_spec.rb +14 -20
  57. data/spec/reek/smells/class_variable_spec.rb +6 -5
  58. data/spec/reek/smells/control_parameter_spec.rb +3 -2
  59. data/spec/reek/smells/data_clump_spec.rb +3 -6
  60. data/spec/reek/smells/duplicate_method_call_spec.rb +10 -14
  61. data/spec/reek/smells/feature_envy_spec.rb +34 -25
  62. data/spec/reek/smells/instance_variable_assumption_spec.rb +6 -9
  63. data/spec/reek/smells/irresponsible_module_spec.rb +3 -6
  64. data/spec/reek/smells/long_parameter_list_spec.rb +5 -7
  65. data/spec/reek/smells/long_yield_list_spec.rb +3 -6
  66. data/spec/reek/smells/manual_dispatch_spec.rb +3 -6
  67. data/spec/reek/smells/nested_iterators_spec.rb +10 -8
  68. data/spec/reek/smells/nil_check_spec.rb +2 -1
  69. data/spec/reek/smells/prima_donna_method_spec.rb +5 -8
  70. data/spec/reek/smells/smell_configuration_spec.rb +3 -3
  71. data/spec/reek/smells/smell_detector_spec.rb +10 -0
  72. data/spec/reek/smells/smell_repository_spec.rb +6 -6
  73. data/spec/reek/smells/smell_warning_spec.rb +35 -39
  74. data/spec/reek/smells/subclassed_from_core_class_spec.rb +5 -5
  75. data/spec/reek/smells/too_many_constants_spec.rb +10 -10
  76. data/spec/reek/smells/too_many_instance_variables_spec.rb +1 -1
  77. data/spec/reek/smells/too_many_methods_spec.rb +1 -1
  78. data/spec/reek/smells/too_many_statements_spec.rb +3 -6
  79. data/spec/reek/smells/uncommunicative_method_name_spec.rb +9 -6
  80. data/spec/reek/smells/uncommunicative_module_name_spec.rb +3 -3
  81. data/spec/reek/smells/uncommunicative_parameter_name_spec.rb +6 -9
  82. data/spec/reek/smells/uncommunicative_variable_name_spec.rb +20 -24
  83. data/spec/reek/smells/unused_parameters_spec.rb +35 -24
  84. data/spec/reek/smells/unused_private_method_spec.rb +25 -33
  85. data/spec/reek/smells/utility_function_spec.rb +27 -14
  86. data/spec/reek/source/source_code_spec.rb +6 -6
  87. data/spec/reek/source/source_locator_spec.rb +34 -17
  88. data/spec/reek/spec/should_reek_of_spec.rb +17 -12
  89. data/spec/reek/spec/should_reek_only_of_spec.rb +5 -5
  90. data/spec/reek/spec/should_reek_spec.rb +3 -3
  91. data/spec/reek/tree_dresser_spec.rb +6 -4
  92. data/spec/spec_helper.rb +3 -0
  93. data/tasks/rubocop.rake +9 -3
  94. metadata +4 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6f4239287ce5d453034915801d47bd07738e0a09
4
- data.tar.gz: 717f8ac8b8a9e0093a4aaa2ee9c5f739fd27be57
3
+ metadata.gz: 9726cb15a47090a670c986a90860b2ba22826416
4
+ data.tar.gz: 61c5759684ec24d5d0e7bd1e4d2e035a5263d25f
5
5
  SHA512:
6
- metadata.gz: ccbb4be4cf7bb2d47ce72f5fd7d709ca3b3b4e49b95253aa549a14d62a7468a176c9b10cb1d21da9667963791c3f8eca66137e0f2dd03bd5507e65c94deb6953
7
- data.tar.gz: 90eb9358f3f66271fa0a568e4582f9d473911723730a30e1b9de7771e5f79381832be59c3d511ddae81c614d772d67a6e49a07ddece6de756f482663976ee5ea
6
+ metadata.gz: ee0920b75d4b8be3d47940587f97aea414a0eb9faa83b2871d1d8627021c155674e108746a74588357f576b0d2783c59fadb40eae2d1972493eeb873e268b5af
7
+ data.tar.gz: 235a55cefe8256fb4d20529f10e1db0c3f4719641cd34c1c8e8d7b20d6c4e86fe07ae541990c92c4f22f838c2fe2476c9ce48b1a7145af2d74c735867d4940b0
@@ -1,3 +1,6 @@
1
+ require:
2
+ - rubocop-rspec
3
+
1
4
  AllCops:
2
5
  Exclude:
3
6
  - 'samples/**/*'
@@ -23,6 +26,49 @@ Metrics/LineLength:
23
26
  Metrics/ParameterLists:
24
27
  CountKeywordArgs: false
25
28
 
29
+ # FIXME: Update specs to avoid offenses
30
+ RSpec/AnyInstance:
31
+ Exclude:
32
+ - 'spec/reek/cli/application_spec.rb'
33
+
34
+ # This file does not test a class
35
+ RSpec/DescribeClass:
36
+ Exclude:
37
+ - 'spec/quality/reek_source_spec.rb'
38
+
39
+ # Our examples are large because we have source literals in them
40
+ RSpec/ExampleLength:
41
+ Enabled: false
42
+
43
+ # FIXME: Split up files to avoid offenses
44
+ RSpec/MultipleDescribes:
45
+ Exclude:
46
+ - 'spec/reek/ast/sexp_extensions_spec.rb'
47
+ - 'spec/reek/report/location_formatter_spec.rb'
48
+
49
+ # FIXME: Update specs to avoid offenses
50
+ RSpec/MultipleExpectations:
51
+ Exclude:
52
+ - 'spec/reek/cli/application_spec.rb'
53
+ - 'spec/reek/code_comment_spec.rb'
54
+ - 'spec/reek/configuration/app_configuration_spec.rb'
55
+ - 'spec/reek/context/module_context_spec.rb'
56
+ - 'spec/reek/context_builder_spec.rb'
57
+ - 'spec/reek/examiner_spec.rb'
58
+ - 'spec/reek/spec/should_reek_of_spec.rb'
59
+
60
+ # FIXME: Update specs to avoid offenses
61
+ RSpec/NestedGroups:
62
+ Exclude:
63
+ - 'spec/reek/cli/application_spec.rb'
64
+
65
+ # FIXME: Update specs to avoid offenses
66
+ RSpec/VerifiedDoubles:
67
+ Exclude:
68
+ - 'spec/reek/context/code_context_spec.rb'
69
+ - 'spec/reek/context/method_context_spec.rb'
70
+ - 'spec/reek/context/module_context_spec.rb'
71
+
26
72
  Style/AccessorMethodName:
27
73
  Exclude:
28
74
  - 'lib/reek/context/visibility_tracker.rb'
@@ -1,5 +1,9 @@
1
1
  # Change log
2
2
 
3
+ ## 4.4.2 (2016-09-21)
4
+
5
+ * (troessner) Fail properly on bad configuration comments
6
+
3
7
  ## 4.4.1 (2016-09-13)
4
8
 
5
9
  * (troessner) Quote names in smell detector messages
data/Gemfile CHANGED
@@ -10,11 +10,15 @@ group :development do
10
10
  gem 'mutant-rspec', '~> 0.8.8'
11
11
  gem 'rake', '~> 11.1'
12
12
  gem 'rspec', '~> 3.0'
13
- gem 'rubocop', '~> 0.42.0'
14
13
  gem 'simplecov', '~> 0.12.0'
15
14
  gem 'yard', '~> 0.9.5'
16
15
  gem 'activesupport', '~> 4.2'
17
16
 
17
+ if RUBY_VERSION >= '2.3'
18
+ gem 'rubocop', '~> 0.42.0'
19
+ gem 'rubocop-rspec', '~> 1.7'
20
+ end
21
+
18
22
  platforms :mri do
19
23
  gem 'redcarpet', '~> 3.3.1'
20
24
  end
@@ -51,3 +51,99 @@ Reek's Duplicate Method Call detector currently offers the [Basic Smell Options]
51
51
  Option | Value | Effect
52
52
  -------|-------|-------
53
53
  `max_calls` | integer | The maximum number of duplicate calls allowed within a method. Defaults to 1.
54
+ `allow_calls` | an array of strings or regular expressions | Ignores any context who matches it |
55
+
56
+ ## Example configuration
57
+
58
+ ### Adjusting `max_calls`
59
+
60
+ Imagine code like this:
61
+
62
+ ```Ruby
63
+ class Alfa
64
+ def bravo
65
+ charlie.delta
66
+ charlie.delta
67
+ end
68
+ end
69
+ ```
70
+
71
+ This would report:
72
+
73
+ >>
74
+ src.rb -- 1 warning:
75
+ [4, 5]:DuplicateMethodCall: Alfa#bravo calls 'charlie.delta' 2 times
76
+
77
+ If you want to allow those double calls here you can disable it in 2 different ways:
78
+
79
+ 1.) Via source code comment:
80
+
81
+ ```Ruby
82
+ class Alfa
83
+ # :reek:DuplicateMethodCall { max_calls: 2 }
84
+ def bravo
85
+ charlie.delta
86
+ charlie.delta
87
+ end
88
+ end
89
+ ```
90
+
91
+ 2.) Via configuration file:
92
+
93
+ ```Yaml
94
+ DuplicateMethodCall:
95
+ max_calls: 2
96
+ ```
97
+
98
+ Note though that the latter way will set `max_calls` to 2 for all instances
99
+ of the smell detector which might not be what you want - in this case
100
+ you'll have to use source code comments.
101
+
102
+ ### Adjusting `allow_calls`
103
+
104
+ Imagine code like this:
105
+
106
+ ```Ruby
107
+ class Alfa
108
+ def bravo
109
+ charlie.delta
110
+ charlie.delta
111
+ echo.foxtrot
112
+ echo.foxtrot
113
+ end
114
+ end
115
+ ```
116
+
117
+ This would report:
118
+
119
+ >>
120
+ src.rb -- 2 warnings:
121
+ [4, 5]:DuplicateMethodCall: Alfa#bravo calls charlie.delta 2 times
122
+ [6, 7]:DuplicateMethodCall: Alfa#bravo calls echo.foxtrot 2 times
123
+
124
+ So let's say you're ok with the `echo.foxtrot` calls you can stop reporting them like this:
125
+
126
+ 1.) Via source code comment:
127
+
128
+ ```Ruby
129
+ class Alfa
130
+ # :reek:DuplicateMethodCall { allow_calls: ['echo.foxtrot'] }
131
+ def bravo
132
+ charlie.delta
133
+ charlie.delta
134
+ echo.foxtrot
135
+ echo.foxtrot
136
+ end
137
+ end
138
+ ```
139
+
140
+ 2.) Via configuration file:
141
+
142
+ ```Yaml
143
+ DuplicateMethodCall:
144
+ allow_calls:
145
+ - 'echo.foxtrot'
146
+ ```
147
+
148
+ Note though that the latter way will allow those calls across your source code which might not be what you want.
149
+ In this case you'll have to use source code comments.
@@ -59,6 +59,20 @@ module Reek
59
59
  end
60
60
  ```
61
61
 
62
+ For your detector to be properly loaded you need to require it in `lib/reek/smells.rb` as well.
63
+
64
+ ### defaults.reek
65
+
66
+ After you ran
67
+
68
+ ```
69
+ bundle exec rake
70
+ ```
71
+
72
+ for the first time with your shiny new detector in place the `defaults.reek`
73
+ file should have been updated automatically. Make sure you don't forget to check
74
+ in those changes as well.
75
+
62
76
  ### Documentation
63
77
 
64
78
  * Above every `SmellDetector::sniff` method it should be documented what the expected AST is
@@ -66,6 +80,8 @@ end
66
80
  take any arbitrary existing smell detector documentation page as template (since
67
81
  they all have the same structure already)
68
82
  * The detector should be listed under [Code Smells](docs/Code-Smells.md)
83
+ * Depending on what your detector does it might make sense to add it to other doc pages as
84
+ well e.g. [Simulated Polymorphism](docs/Simulated-Polymorphism.md)
69
85
 
70
86
  ### Rspec examples
71
87
 
@@ -9,7 +9,8 @@ size of the corresponding instance of `Class`.)
9
9
 
10
10
  ## Current Support in Reek
11
11
 
12
- Reek offers two checks in this category.
12
+ Reek offers three checks in this category.
13
13
 
14
+ * [Too Many Constants](Too-Many-Constants.md)
14
15
  * [Too Many Instance Variables](Too-Many-Instance-Variables.md)
15
16
  * [Too Many Methods](Too-Many-Methods.md)
@@ -13,4 +13,4 @@ Conditional code is hard to read and understand, because the reader must hold mo
13
13
 
14
14
  ## Current Support in Reek
15
15
 
16
- Reek checks for [Repeated Conditional](Repeated-Conditional.md) and for [Nil Check](Nil-Check.md).
16
+ Reek checks for [Manual Dispatch](Manual-Dispatch.md), [Repeated Conditional](Repeated-Conditional.md) and for [Nil Check](Nil-Check.md).
@@ -0,0 +1,39 @@
1
+ Feature: Erroneous source comments are handled properly
2
+ Erroneous source comments should be handled in a way that is intuitive and helpful
3
+ for the user. Reek should neither crash nor silently swallow it.
4
+ If there is something wrong - no matter how small it is - Reek should report it back
5
+ to the user right away so the user can actually do something about it.
6
+ If a user tries to deactivate an unknown smell detector (e.g. because he made a typo)
7
+ we should just skip this file and tell the user about it so he can fix it and then
8
+ re-run Reek.
9
+
10
+ Scenario: Unknown smell detector
11
+ Given a file named "bad_detector.rb" with:
12
+ """
13
+ # Test class
14
+ # :reek:UnknownDetectorName
15
+ def x
16
+ end
17
+ """
18
+ When I run reek bad_detector.rb
19
+ Then it reports the error "Error: You are trying to configure an unknown smell detector 'UnknownDetectorName'"
20
+
21
+ Scenario: One good file, one bad file
22
+ Given a file named "bad_detector.rb" with:
23
+ """
24
+ # Test class
25
+ # :reek:UnknownDetectorName
26
+ def x
27
+ end
28
+ """
29
+ Given the smelly file 'smelly.rb'
30
+ When I run reek bad_detector.rb smelly.rb
31
+ Then it reports the error "Error: You are trying to configure an unknown smell detector 'UnknownDetectorName'"
32
+ And the exit status indicates smells
33
+ And it reports:
34
+ """
35
+ smelly.rb -- 2 warnings:
36
+ [4]:UncommunicativeMethodName: Smelly#x has the name 'x' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Method-Name.md]
37
+ [5]:UncommunicativeVariableName: Smelly#x has the variable name 'y' [https://github.com/troessner/reek/blob/master/docs/Uncommunicative-Variable-Name.md]
38
+ 2 total warnings
39
+ """
@@ -106,6 +106,10 @@ module Reek
106
106
  1
107
107
  end
108
108
 
109
+ def source
110
+ loc.expression.source_buffer.name
111
+ end
112
+
109
113
  protected
110
114
 
111
115
  # See ".each_node" for documentation.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require 'yaml'
3
+ require_relative 'smells/smell_detector'
4
+ require_relative 'errors'
3
5
 
4
6
  module Reek
5
7
  #
@@ -25,14 +27,20 @@ module Reek
25
27
 
26
28
  #
27
29
  # @param comment [String] - the original comment as found in the source code
28
- # E.g.:
29
- # "\n # :reek:Duplication: { enabled: false }\n "
30
+ # @param line [Integer] - start of the expression the comment belongs to
31
+ # @param source [String] - Path to source file or "string"
30
32
  #
31
- def initialize(comment)
33
+ def initialize(comment:, line: nil, source: nil)
32
34
  @original_comment = comment
33
35
  @config = Hash.new { |hash, key| hash[key] = {} }
34
36
 
35
37
  @original_comment.scan(CONFIGURATION_REGEX) do |detector, _option_string, options|
38
+ unless Smells::SmellDetector.valid_detector?(detector)
39
+ raise BadDetectorInCommentError, detector: detector,
40
+ source: source,
41
+ line: line,
42
+ original_comment: @original_comment
43
+ end
36
44
  @config.merge! detector => YAML.load(options || DISABLE_DETECTOR_CONFIGURATION)
37
45
  end
38
46
  end
@@ -161,7 +161,9 @@ module Reek
161
161
  attr_reader :refs
162
162
 
163
163
  def configuration_via_code_commment
164
- @configuration_via_code_commment ||= CodeComment.new(full_comment).config
164
+ @configuration_via_code_commment ||= CodeComment.new(comment: full_comment,
165
+ line: exp.line,
166
+ source: exp.source).config
165
167
  end
166
168
 
167
169
  def full_comment
@@ -64,7 +64,7 @@ module Reek
64
64
  end
65
65
 
66
66
  def descriptively_commented?
67
- CodeComment.new(exp.leading_comment).descriptive?
67
+ CodeComment.new(comment: exp.leading_comment).descriptive?
68
68
  end
69
69
 
70
70
  # A namespace module is a module (or class) that is only there for namespacing
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ module Reek
3
+ # Gets raised when trying to configure a detector which is unknown to us.
4
+ # This might happen for multiple reasons. The users might have a typo in
5
+ # his comment or he might use a detector that does not exist anymore.
6
+ class BadDetectorInCommentError < RuntimeError
7
+ UNKNOWN_SMELL_DETECTOR_MESSAGE = <<-EOS.freeze
8
+
9
+ Error: You are trying to configure an unknown smell detector '%s' in one
10
+ of your source code comments.
11
+ The source is '%s' and the comment belongs to the expression starting in line %d.
12
+ Here's the original comment:
13
+
14
+ %s
15
+
16
+ Please see the Reek docs for:
17
+ * how to configure Reek via source code comments: https://github.com/troessner/reek/blob/master/docs/Smell-Suppression.md
18
+ * what smell detectors are available: https://github.com/troessner/reek/blob/master/docs/Code-Smells.md
19
+ Update the offensive comment (or remove it if no longer applicable) and re-run Reek.
20
+
21
+ EOS
22
+
23
+ def initialize(detector:, source:, line:, original_comment:)
24
+ message = format(UNKNOWN_SMELL_DETECTOR_MESSAGE,
25
+ detector,
26
+ source,
27
+ line,
28
+ original_comment)
29
+ super message
30
+ end
31
+ end
32
+ end
@@ -96,12 +96,17 @@ module Reek
96
96
  # and continue with the analysis.
97
97
  #
98
98
  # @return [Array<SmellWarning>] the smells found in the source
99
+ #
100
+ # :reek:TooManyStatements { max_statements: 8 }
99
101
  def run
100
102
  return [] unless syntax_tree
101
103
  begin
102
104
  examine_tree
105
+ rescue BadDetectorInCommentError => exception
106
+ warn exception
107
+ []
103
108
  rescue StandardError => exception
104
- $stderr.puts format(INCOMPREHENSIBLE_SOURCE_TEMPLATE, origin, exception.inspect)
109
+ warn format(INCOMPREHENSIBLE_SOURCE_TEMPLATE, origin, exception.inspect)
105
110
  []
106
111
  end
107
112
  end
@@ -9,8 +9,6 @@ require 'English'
9
9
  module Reek
10
10
  #
11
11
  # Defines a task library for running Reek.
12
- # (Classes here will be configured via the Rakefile, and therefore will
13
- # possess a :reek:attribute or two.)
14
12
  #
15
13
  # @public
16
14
  module Rake
@@ -21,7 +21,7 @@ module Reek
21
21
  #
22
22
  # :reek:FeatureEnvy
23
23
  def sniff(ctx)
24
- ctx.default_assignments.select do |_param, value|
24
+ ctx.default_assignments.select do |_parameter, value|
25
25
  [:true, :false].include?(value.type)
26
26
  end.map do |parameter, _value|
27
27
  smell_warning(
@@ -40,13 +40,13 @@ module Reek
40
40
  #
41
41
  # :reek:TooManyStatements: { max_statements: 7 }
42
42
  # :reek:FeatureEnvy
43
- def class_variables_in(ast)
43
+ def class_variables_in(exp)
44
44
  result = Hash.new { |hash, key| hash[key] = [] }
45
45
  collector = proc do |cvar_node|
46
46
  result[cvar_node.name].push(cvar_node.line)
47
47
  end
48
48
  [:cvar, :cvasgn, :cvdecl].each do |stmt_type|
49
- ast.each_node(stmt_type, [:class, :module], &collector)
49
+ exp.each_node(stmt_type, [:class, :module], &collector)
50
50
  end
51
51
  result
52
52
  end
@@ -39,7 +39,7 @@ module Reek
39
39
  context: ctx,
40
40
  lines: [ctx.exp.line],
41
41
  message: message,
42
- parameters: { assumption: assumption })
42
+ parameters: { assumption: assumption.to_s })
43
43
  end
44
44
 
45
45
  # :reek:UtilityFunction