reek 4.4.1 → 4.4.2

Sign up to get free protection for your applications and to get access to all the features.
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