reek 6.0.3 → 6.0.4

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 (217) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -1
  3. data/CONTRIBUTING.md +3 -0
  4. data/Dockerfile +1 -1
  5. data/Gemfile +6 -6
  6. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  7. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  8. data/lib/reek/smell_detectors/base_detector.rb +1 -1
  9. data/lib/reek/smell_warning.rb +1 -1
  10. data/lib/reek/source/source_locator.rb +1 -3
  11. data/lib/reek/version.rb +1 -1
  12. data/reek.gemspec +4 -1
  13. metadata +3 -208
  14. data/docs/API.md +0 -174
  15. data/docs/Attribute.md +0 -39
  16. data/docs/Basic-Smell-Options.md +0 -85
  17. data/docs/Boolean-Parameter.md +0 -54
  18. data/docs/Class-Variable.md +0 -40
  19. data/docs/Code-Smells.md +0 -39
  20. data/docs/Command-Line-Options.md +0 -119
  21. data/docs/Control-Couple.md +0 -26
  22. data/docs/Control-Parameter.md +0 -32
  23. data/docs/Data-Clump.md +0 -46
  24. data/docs/Duplicate-Method-Call.md +0 -264
  25. data/docs/Feature-Envy.md +0 -93
  26. data/docs/How-To-Write-New-Detectors.md +0 -132
  27. data/docs/How-reek-works-internally.md +0 -114
  28. data/docs/Instance-Variable-Assumption.md +0 -163
  29. data/docs/Irresponsible-Module.md +0 -47
  30. data/docs/Large-Class.md +0 -16
  31. data/docs/Long-Parameter-List.md +0 -39
  32. data/docs/Long-Yield-List.md +0 -37
  33. data/docs/Manual-Dispatch.md +0 -30
  34. data/docs/Missing-Safe-Method.md +0 -92
  35. data/docs/Module-Initialize.md +0 -62
  36. data/docs/Nested-Iterators.md +0 -59
  37. data/docs/Nil-Check.md +0 -47
  38. data/docs/RSpec-matchers.md +0 -129
  39. data/docs/Rake-Task.md +0 -66
  40. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  41. data/docs/Reek-Driven-Development.md +0 -46
  42. data/docs/Repeated-Conditional.md +0 -47
  43. data/docs/Simulated-Polymorphism.md +0 -16
  44. data/docs/Smell-Suppression.md +0 -96
  45. data/docs/Style-Guide.md +0 -19
  46. data/docs/Subclassed-From-Core-Class.md +0 -79
  47. data/docs/Too-Many-Constants.md +0 -37
  48. data/docs/Too-Many-Instance-Variables.md +0 -43
  49. data/docs/Too-Many-Methods.md +0 -56
  50. data/docs/Too-Many-Statements.md +0 -54
  51. data/docs/Uncommunicative-Method-Name.md +0 -94
  52. data/docs/Uncommunicative-Module-Name.md +0 -92
  53. data/docs/Uncommunicative-Name.md +0 -18
  54. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  55. data/docs/Uncommunicative-Variable-Name.md +0 -96
  56. data/docs/Unused-Parameters.md +0 -28
  57. data/docs/Unused-Private-Method.md +0 -101
  58. data/docs/Utility-Function.md +0 -56
  59. data/docs/Versioning-Policy.md +0 -7
  60. data/docs/YAML-Reports.md +0 -93
  61. data/docs/defaults.reek.yml +0 -129
  62. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  63. data/docs/templates/default/docstring/setup.rb +0 -35
  64. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  65. data/docs/yard_plugin.rb +0 -17
  66. data/features/command_line_interface/basic_usage.feature +0 -15
  67. data/features/command_line_interface/options.feature +0 -123
  68. data/features/command_line_interface/show_progress.feature +0 -33
  69. data/features/command_line_interface/smell_selection.feature +0 -15
  70. data/features/command_line_interface/smells_count.feature +0 -38
  71. data/features/command_line_interface/stdin.feature +0 -65
  72. data/features/configuration_files/accept_setting.feature +0 -87
  73. data/features/configuration_files/directory_specific_directives.feature +0 -274
  74. data/features/configuration_files/exclude_directives.feature +0 -35
  75. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  76. data/features/configuration_files/masking_smells.feature +0 -94
  77. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  78. data/features/configuration_files/reject_setting.feature +0 -89
  79. data/features/configuration_files/schema_validation.feature +0 -59
  80. data/features/configuration_files/show_configuration_file.feature +0 -44
  81. data/features/configuration_files/unused_private_method.feature +0 -68
  82. data/features/configuration_loading.feature +0 -91
  83. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  84. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  85. data/features/locales.feature +0 -32
  86. data/features/programmatic_access.feature +0 -41
  87. data/features/rake_task/rake_task.feature +0 -138
  88. data/features/reports/codeclimate.feature +0 -59
  89. data/features/reports/json.feature +0 -59
  90. data/features/reports/reports.feature +0 -219
  91. data/features/reports/yaml.feature +0 -52
  92. data/features/rspec_matcher.feature +0 -41
  93. data/features/samples.feature +0 -305
  94. data/features/step_definitions/.rubocop.yml +0 -5
  95. data/features/step_definitions/reek_steps.rb +0 -102
  96. data/features/step_definitions/sample_file_steps.rb +0 -63
  97. data/features/support/env.rb +0 -33
  98. data/features/todo_list.feature +0 -108
  99. data/samples/checkstyle.xml +0 -7
  100. data/samples/clean_source/clean.rb +0 -6
  101. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  102. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  103. data/samples/configuration/corrupt.reek +0 -1
  104. data/samples/configuration/empty.reek +0 -0
  105. data/samples/configuration/full_configuration.reek +0 -13
  106. data/samples/configuration/full_mask.reek +0 -6
  107. data/samples/configuration/home/home.reek.yml +0 -4
  108. data/samples/configuration/partial_mask.reek +0 -4
  109. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  110. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  111. data/samples/configuration/with_excluded_paths.reek +0 -5
  112. data/samples/no_config_file/.keep +0 -0
  113. data/samples/paths.rb +0 -5
  114. data/samples/smelly_source/inline.rb +0 -704
  115. data/samples/smelly_source/optparse.rb +0 -1788
  116. data/samples/smelly_source/redcloth.rb +0 -1130
  117. data/samples/smelly_source/ruby.rb +0 -368
  118. data/samples/smelly_source/smelly.rb +0 -7
  119. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  120. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  121. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  122. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  123. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  124. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  125. data/samples/source_with_non_ruby_files/gibberish +0 -1
  126. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  127. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  128. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -15
  129. data/spec/quality/documentation_spec.rb +0 -41
  130. data/spec/quality/reek_source_spec.rb +0 -11
  131. data/spec/reek/ast/node_spec.rb +0 -211
  132. data/spec/reek/ast/object_refs_spec.rb +0 -83
  133. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  134. data/spec/reek/ast/sexp_extensions_spec.rb +0 -498
  135. data/spec/reek/cli/application_spec.rb +0 -168
  136. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  137. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  138. data/spec/reek/cli/options_spec.rb +0 -51
  139. data/spec/reek/cli/silencer_spec.rb +0 -28
  140. data/spec/reek/code_comment_spec.rb +0 -184
  141. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  142. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  143. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  144. data/spec/reek/configuration/directory_directives_spec.rb +0 -122
  145. data/spec/reek/configuration/excluded_paths_spec.rb +0 -25
  146. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  147. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  148. data/spec/reek/context/code_context_spec.rb +0 -192
  149. data/spec/reek/context/ghost_context_spec.rb +0 -60
  150. data/spec/reek/context/method_context_spec.rb +0 -72
  151. data/spec/reek/context/module_context_spec.rb +0 -55
  152. data/spec/reek/context/root_context_spec.rb +0 -12
  153. data/spec/reek/context/statement_counter_spec.rb +0 -24
  154. data/spec/reek/context_builder_spec.rb +0 -457
  155. data/spec/reek/detector_repository_spec.rb +0 -22
  156. data/spec/reek/documentation_link_spec.rb +0 -20
  157. data/spec/reek/errors/base_error_spec.rb +0 -13
  158. data/spec/reek/examiner_spec.rb +0 -309
  159. data/spec/reek/logging_error_handler_spec.rb +0 -24
  160. data/spec/reek/rake/task_spec.rb +0 -56
  161. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -22
  162. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  163. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  164. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  165. data/spec/reek/report/html_report_spec.rb +0 -19
  166. data/spec/reek/report/json_report_spec.rb +0 -58
  167. data/spec/reek/report/location_formatter_spec.rb +0 -32
  168. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  169. data/spec/reek/report/text_report_spec.rb +0 -89
  170. data/spec/reek/report/xml_report_spec.rb +0 -24
  171. data/spec/reek/report/yaml_report_spec.rb +0 -55
  172. data/spec/reek/report_spec.rb +0 -28
  173. data/spec/reek/smell_configuration_spec.rb +0 -56
  174. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  175. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -50
  176. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  177. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  178. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  179. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -134
  180. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  181. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  182. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  183. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  184. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  185. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  186. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  187. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -68
  188. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  189. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  190. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  191. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  192. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  193. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  194. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  195. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  196. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  197. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  198. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  199. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  200. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  201. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  202. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  203. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -309
  204. data/spec/reek/smell_warning_spec.rb +0 -137
  205. data/spec/reek/source/source_code_spec.rb +0 -79
  206. data/spec/reek/source/source_locator_spec.rb +0 -166
  207. data/spec/reek/spec/should_reek_of_spec.rb +0 -153
  208. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  209. data/spec/reek/spec/should_reek_spec.rb +0 -52
  210. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  211. data/spec/reek/tree_dresser_spec.rb +0 -46
  212. data/spec/spec_helper.rb +0 -110
  213. data/tasks/configuration.rake +0 -18
  214. data/tasks/console.rake +0 -5
  215. data/tasks/reek.rake +0 -6
  216. data/tasks/rubocop.rake +0 -11
  217. data/tasks/test.rake +0 -32
@@ -1,24 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/examiner'
3
- require_lib 'reek/report/xml_report'
4
-
5
- RSpec.describe Reek::Report::XMLReport do
6
- let(:xml_report) { described_class.new }
7
-
8
- context 'with an empty source' do
9
- it 'prints empty checkstyle XML' do
10
- xml_report.add_examiner Reek::Examiner.new('')
11
- xml = "<?xml version='1.0'?>\n<checkstyle/>\n"
12
- expect { xml_report.show }.to output(xml).to_stdout
13
- end
14
- end
15
-
16
- context 'with a source with violations' do
17
- it 'prints non-empty checkstyle XML' do
18
- xml_report.add_examiner Reek::Examiner.new(SMELLY_FILE)
19
- xml = SAMPLES_DIR.join('checkstyle.xml').read
20
- xml = xml.gsub(SMELLY_FILE.to_s, SMELLY_FILE.expand_path.to_s)
21
- expect { xml_report.show }.to output(xml).to_stdout
22
- end
23
- end
24
- end
@@ -1,55 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/examiner'
3
- require_lib 'reek/report/yaml_report'
4
-
5
- require 'yaml'
6
- require 'stringio'
7
-
8
- RSpec.describe Reek::Report::YAMLReport do
9
- let(:options) { {} }
10
- let(:instance) { described_class.new(**options) }
11
- let(:examiner) { Reek::Examiner.new(source) }
12
-
13
- before do
14
- instance.add_examiner examiner
15
- end
16
-
17
- context 'with empty source' do
18
- let(:source) { '' }
19
-
20
- it 'prints empty yaml' do
21
- expect { instance.show }.to output(/^--- \[\]\n.*$/).to_stdout
22
- end
23
- end
24
-
25
- context 'with smelly source' do
26
- let(:source) { 'def simple(a) a[3] end' }
27
-
28
- it 'prints smells as yaml' do
29
- out = StringIO.new
30
- instance.show(out)
31
- out.rewind
32
- result = YAML.safe_load(out.read)
33
- expected = YAML.safe_load <<~YAML
34
- ---
35
- - context: "simple"
36
- lines:
37
- - 1
38
- message: "has the parameter name 'a'"
39
- smell_type: "UncommunicativeParameterName"
40
- source: "string"
41
- name: "a"
42
- documentation_link: "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Uncommunicative-Parameter-Name.md"
43
- - context: "simple"
44
- lines:
45
- - 1
46
- message: "doesn't depend on instance state (maybe move it to another class?)"
47
- smell_type: "UtilityFunction"
48
- source: "string"
49
- documentation_link: "https://github.com/troessner/reek/blob/v#{Reek::Version::STRING}/docs/Utility-Function.md"
50
- YAML
51
-
52
- expect(result).to eq expected
53
- end
54
- end
55
- end
@@ -1,28 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/report'
3
-
4
- RSpec.describe Reek::Report do
5
- describe '.report_class' do
6
- it 'returns the correct class' do
7
- expect(described_class.report_class(:text)).to eq Reek::Report::TextReport
8
- end
9
- end
10
-
11
- describe '.location_formatter' do
12
- it 'returns the correct class' do
13
- expect(described_class.location_formatter(:plain)).to eq Reek::Report::BlankLocationFormatter
14
- end
15
- end
16
-
17
- describe '.heading_formatter' do
18
- it 'returns the correct class' do
19
- expect(described_class.heading_formatter(:quiet)).to eq Reek::Report::QuietHeadingFormatter
20
- end
21
- end
22
-
23
- describe '.warning_formatter_class' do
24
- it 'returns the correct class' do
25
- expect(described_class.warning_formatter_class(:simple)).to eq Reek::Report::SimpleWarningFormatter
26
- end
27
- end
28
- end
@@ -1,56 +0,0 @@
1
- require_relative '../spec_helper'
2
- require_lib 'reek/smell_configuration'
3
-
4
- RSpec.describe Reek::SmellConfiguration do
5
- context 'when overriding default configs' do
6
- let(:base_config) do
7
- {
8
- 'accept' => ['_'],
9
- 'enabled' => true,
10
- 'exclude' => [],
11
- 'reject' => [/^.$/, /[0-9]$/, /[A-Z]/]
12
- }
13
- end
14
-
15
- let(:smell_config) { described_class.new(base_config) }
16
-
17
- it { expect(smell_config.merge({})).to eq(base_config) }
18
- it { expect(smell_config.merge('enabled' => true)).to eq(base_config) }
19
- it { expect(smell_config.merge('exclude' => [])).to eq(base_config) }
20
- it { expect(smell_config.merge('accept' => ['_'])).to eq(base_config) }
21
-
22
- it do
23
- updated = smell_config.merge('reject' => [/^.$/, /[0-9]$/, /[A-Z]/])
24
- expect(updated).to eq(base_config)
25
- end
26
-
27
- it do
28
- updated = smell_config.merge('accept' => ['_'], 'enabled' => true)
29
- expect(updated).to eq(base_config)
30
- end
31
-
32
- it 'overrides single values' do
33
- updated = smell_config.merge('enabled' => false)
34
- expect(updated).to eq('accept' => ['_'],
35
- 'enabled' => false,
36
- 'exclude' => [],
37
- 'reject' => [/^.$/, /[0-9]$/, /[A-Z]/])
38
- end
39
-
40
- it 'overrides arrays of values' do
41
- updated = smell_config.merge('reject' => [/^.$/, /[3-9]$/])
42
- expect(updated).to eq('accept' => ['_'],
43
- 'enabled' => true,
44
- 'exclude' => [],
45
- 'reject' => [/^.$/, /[3-9]$/])
46
- end
47
-
48
- it 'overrides multiple values' do
49
- updated = smell_config.merge('accept' => [/[A-Z]$/], 'enabled' => false)
50
- expect(updated).to eq('accept' => [/[A-Z]$/],
51
- 'enabled' => false,
52
- 'exclude' => [],
53
- 'reject' => [/^.$/, /[0-9]$/, /[A-Z]/])
54
- end
55
- end
56
- end
@@ -1,197 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/attribute'
3
-
4
- RSpec.describe Reek::SmellDetectors::Attribute do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- class Alfa
8
- attr_writer :bravo
9
- end
10
- RUBY
11
-
12
- expect(src).to reek_of(:Attribute,
13
- lines: [2],
14
- context: 'Alfa#bravo',
15
- message: 'is a writable attribute')
16
- end
17
-
18
- it 'does count all occurences' do
19
- src = <<-RUBY
20
- class Alfa
21
- attr_writer :bravo
22
- attr_writer :charlie
23
- end
24
- RUBY
25
-
26
- expect(src).
27
- to reek_of(:Attribute, lines: [2], context: 'Alfa#bravo').
28
- and reek_of(:Attribute, lines: [3], context: 'Alfa#charlie')
29
- end
30
-
31
- it 'records nothing with no attributes' do
32
- src = <<-RUBY
33
- class Alfa
34
- end
35
- RUBY
36
-
37
- expect(src).not_to reek_of(:Attribute)
38
- end
39
-
40
- context 'with attributes' do
41
- it 'records nothing for attribute readers' do
42
- src = <<-RUBY
43
- class Alfa
44
- attr :bravo
45
- attr_reader :charlie
46
- end
47
- RUBY
48
-
49
- expect(src).not_to reek_of(:Attribute)
50
- end
51
-
52
- it 'records writer attribute' do
53
- src = <<-RUBY
54
- class Alfa
55
- attr_writer :bravo
56
- end
57
- RUBY
58
-
59
- expect(src).to reek_of(:Attribute, context: 'Alfa#bravo')
60
- end
61
-
62
- it 'does not record writer attribute if suppressed with a preceding code comment' do
63
- src = <<-RUBY
64
- class Alfa
65
- # :reek:Attribute
66
- attr_writer :bravo
67
- end
68
- RUBY
69
-
70
- expect(src).not_to reek_of(:Attribute)
71
- end
72
-
73
- it 'records attr_writer attribute in a module' do
74
- src = <<-RUBY
75
- module Mod
76
- attr_writer :bravo
77
- end
78
- RUBY
79
-
80
- expect(src).to reek_of(:Attribute)
81
- end
82
-
83
- it 'records accessor attribute' do
84
- src = <<-RUBY
85
- class Alfa
86
- attr_accessor :bravo
87
- end
88
- RUBY
89
-
90
- expect(src).to reek_of(:Attribute)
91
- end
92
-
93
- it 'records attr defining a writer' do
94
- src = <<-RUBY
95
- class Alfa
96
- attr :bravo, true
97
- end
98
- RUBY
99
-
100
- expect(src).to reek_of(:Attribute)
101
- end
102
-
103
- it "doesn't record protected attributes" do
104
- src = <<-RUBY
105
- class Alfa
106
- protected
107
- attr_writer :alfa
108
- attr_accessor :bravo
109
- attr :charlie
110
- attr :delta, true
111
- attr_reader :echo
112
- end
113
- RUBY
114
-
115
- expect(src).not_to reek_of(:Attribute)
116
- end
117
-
118
- it "doesn't record private attributes" do
119
- src = <<-RUBY
120
- class Alfa
121
- private
122
- attr_writer :alfa
123
- attr_accessor :bravo
124
- attr :charlie
125
- attr :delta, true
126
- attr_reader :echo
127
- end
128
- RUBY
129
-
130
- expect(src).not_to reek_of(:Attribute)
131
- end
132
-
133
- it 'records attr_writer defined in public section' do
134
- src = <<-RUBY
135
- class Alfa
136
- private
137
- public
138
- attr_writer :bravo
139
- end
140
- RUBY
141
-
142
- expect(src).to reek_of(:Attribute)
143
- end
144
-
145
- it 'records attr_writer after switching visbility to public' do
146
- src = <<-RUBY
147
- class Alfa
148
- private
149
- attr_writer :bravo
150
- public :bravo
151
- end
152
- RUBY
153
-
154
- expect(src).to reek_of(:Attribute)
155
- end
156
-
157
- it 'resets visibility in new contexts' do
158
- src = <<-RUBY
159
- class Alfa
160
- private
161
- attr_writer :bravo
162
- end
163
-
164
- class Charlie
165
- attr_writer :delta
166
- end
167
- RUBY
168
-
169
- expect(src).to reek_of(:Attribute, context: 'Charlie#delta')
170
- end
171
-
172
- it 'records attr_writer defining a class attribute' do
173
- src = <<-RUBY
174
- class Alfa
175
- class << self
176
- attr_writer :bravo
177
- end
178
- end
179
- RUBY
180
-
181
- expect(src).to reek_of(:Attribute)
182
- end
183
-
184
- it 'does not record private class attributes' do
185
- src = <<-RUBY
186
- class Alfa
187
- class << self
188
- private
189
- attr_writer :bravo
190
- end
191
- end
192
- RUBY
193
-
194
- expect(src).not_to reek_of(:Attribute)
195
- end
196
- end
197
- end
@@ -1,50 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/base_detector'
3
- require_lib 'reek/smell_detectors/duplicate_method_call'
4
-
5
- RSpec.describe Reek::SmellDetectors::BaseDetector do
6
- describe '.todo_configuration_for' do
7
- it 'returns exclusion configuration for the given smells' do
8
- smell = build_smell_warning(smell_type: 'Foo', context: 'Foo#bar')
9
- result = described_class.todo_configuration_for([smell])
10
- expect(result).to eq('BaseDetector' => { 'exclude' => ['Foo#bar'] })
11
- end
12
-
13
- it 'merges identical contexts' do
14
- smell = build_smell_warning(smell_type: 'Foo', context: 'Foo#bar')
15
- result = described_class.todo_configuration_for([smell, smell])
16
- expect(result).to eq('BaseDetector' => { 'exclude' => ['Foo#bar'] })
17
- end
18
-
19
- context 'with default exclusions present' do
20
- let(:subclass) { Reek::SmellDetectors::TooManyStatements }
21
-
22
- it 'includes default exclusions' do
23
- smell = build_smell_warning(smell_type: 'TooManyStatements', context: 'Foo#bar')
24
- result = subclass.todo_configuration_for([smell])
25
-
26
- aggregate_failures do
27
- expect(subclass.default_config['exclude']).to eq ['initialize']
28
- expect(result).to eq('TooManyStatements' => { 'exclude' => ['initialize', 'Foo#bar'] })
29
- end
30
- end
31
- end
32
- end
33
-
34
- describe '.to_detector' do
35
- it 'returns the right detector' do
36
- expect(described_class.to_detector('DuplicateMethodCall')).to eq(Reek::SmellDetectors::DuplicateMethodCall)
37
- end
38
-
39
- it 'raise NameError for an invalid detector name' do
40
- expect { described_class.to_detector('Unknown') }.to raise_error(NameError)
41
- end
42
- end
43
-
44
- describe '.configuration_keys' do
45
- it 'returns the right keys' do
46
- expected_keys = Reek::SmellDetectors::DuplicateMethodCall.configuration_keys.to_a
47
- expect(expected_keys).to eq([:enabled, :exclude, :max_calls, :allow_calls])
48
- end
49
- end
50
- end
@@ -1,93 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/smell_detectors/boolean_parameter'
3
-
4
- RSpec.describe Reek::SmellDetectors::BooleanParameter do
5
- it 'reports the right values' do
6
- src = <<-RUBY
7
- def alfa(bravo = true)
8
- end
9
- RUBY
10
-
11
- expect(src).to reek_of(:BooleanParameter,
12
- lines: [1],
13
- context: 'alfa',
14
- message: "has boolean parameter 'bravo'",
15
- source: 'string',
16
- parameter: 'bravo')
17
- end
18
-
19
- it 'does count all occurences' do
20
- src = <<-RUBY
21
- def alfa(bravo = true, charlie = true)
22
- end
23
- RUBY
24
-
25
- expect(src).
26
- to reek_of(:BooleanParameter, lines: [1], context: 'alfa', parameter: 'bravo').
27
- and reek_of(:BooleanParameter, lines: [1], context: 'alfa', parameter: 'charlie')
28
- end
29
-
30
- context 'when examining an instance method' do
31
- it 'reports a parameter defaulted to false' do
32
- src = 'def alfa(bravo = false) end'
33
- expect(src).to reek_of(:BooleanParameter)
34
- end
35
-
36
- it 'reports two parameters defaulted to booleans in a mixed parameter list' do
37
- src = 'def alfa(bravo, charlie = true, delta = false, &echo) end'
38
-
39
- expect(src).to reek_of(:BooleanParameter, parameter: 'charlie').
40
- and reek_of(:BooleanParameter, parameter: 'delta').
41
- and not_reek_of(:BooleanParameter, parameter: 'bravo').
42
- and not_reek_of(:BooleanParameter, parameter: 'echo')
43
- end
44
-
45
- it 'reports keyword parameters defaulted to booleans' do
46
- src = 'def alfa(bravo: true, charlie: false) end'
47
- expect(src).
48
- to reek_of(:BooleanParameter, parameter: 'bravo').
49
- and reek_of(:BooleanParameter, parameter: 'charlie')
50
- end
51
-
52
- it 'does not report regular parameters' do
53
- src = 'def alfa(bravo, charlie) end'
54
- expect(src).not_to reek_of(:BooleanParameter)
55
- end
56
-
57
- it 'does not report array decomposition parameters' do
58
- src = 'def alfa((bravo, charlie)) end'
59
- expect(src).not_to reek_of(:BooleanParameter)
60
- end
61
-
62
- it 'does not report keyword parameters with no default' do
63
- src = 'def alfa(bravo:, charlie:) end'
64
- expect(src).not_to reek_of(:BooleanParameter)
65
- end
66
-
67
- it 'does not report keyword parameters with non-boolean default' do
68
- src = 'def alfa(bravo: 42, charlie: "32") end'
69
- expect(src).not_to reek_of(:BooleanParameter)
70
- end
71
- end
72
-
73
- context 'when examining a singleton method' do
74
- it 'reports a parameter defaulted to true' do
75
- src = 'def self.alfa(bravo = true) end'
76
- expect(src).to reek_of(:BooleanParameter)
77
- end
78
-
79
- it 'reports a parameter defaulted to false' do
80
- src = 'def self.alfa(bravo = false) end'
81
- expect(src).to reek_of(:BooleanParameter)
82
- end
83
-
84
- it 'reports two parameters defaulted to booleans' do
85
- src = 'def self.alfa(bravo, charlie = true, delta = false, &echo) end'
86
-
87
- expect(src).to reek_of(:BooleanParameter, parameter: 'charlie').
88
- and reek_of(:BooleanParameter, parameter: 'delta').
89
- and not_reek_of(:BooleanParameter, parameter: 'bravo').
90
- and not_reek_of(:BooleanParameter, parameter: 'echo')
91
- end
92
- end
93
- end