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,25 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/errors/config_file_error'
3
- require_lib 'reek/configuration/excluded_paths'
4
-
5
- RSpec.describe Reek::Configuration::ExcludedPaths do
6
- describe '#add' do
7
- let(:exclusions) { [].extend(described_class) }
8
- let(:paths) do
9
- %w(samples/directory_does_not_exist/
10
- samples/source_with_non_ruby_files/
11
- samples/**/ignore_me*)
12
- end
13
-
14
- let(:expected_exclude_paths) do
15
- [Pathname('samples/source_with_non_ruby_files/'),
16
- Pathname('samples/source_with_exclude_paths/ignore_me'),
17
- Pathname('samples/source_with_exclude_paths/nested/ignore_me_as_well')]
18
- end
19
-
20
- it 'adds the given paths as Pathname' do
21
- exclusions.add(paths)
22
- expect(exclusions).to match_array expected_exclude_paths
23
- end
24
- end
25
- end
@@ -1,33 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/configuration/rake_task_converter'
3
-
4
- RSpec.describe Reek::Configuration::RakeTaskConverter do
5
- describe 'convert' do
6
- let(:configuration_for_smell_detector) do
7
- {
8
- 'exclude' => [/Klass#foobar$/, /^Klass#omg$/],
9
- 'reject' => [/^[a-z]$/, /[0-9]$/, /[A-Z]/],
10
- 'accept' => [/^_$/]
11
- }
12
- end
13
-
14
- let(:expected_exclude) { ['/Klass#foobar$/', '/^Klass#omg$/'] }
15
- let(:expected_reject) { ['/^[a-z]$/', '/[0-9]$/', '/[A-Z]/'] }
16
- let(:expected_accept) { ['/^_$/'] }
17
-
18
- it 'converts exclude regexes to strings' do
19
- converted_configuration = described_class.convert configuration_for_smell_detector
20
- expect(converted_configuration['exclude']).to eq(expected_exclude)
21
- end
22
-
23
- it 'converts reject regexes to strings' do
24
- converted_configuration = described_class.convert configuration_for_smell_detector
25
- expect(converted_configuration['reject']).to eq(expected_reject)
26
- end
27
-
28
- it 'converts accept regexes to strings' do
29
- converted_configuration = described_class.convert configuration_for_smell_detector
30
- expect(converted_configuration['accept']).to eq(expected_accept)
31
- end
32
- end
33
- end
@@ -1,165 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/configuration/schema_validator'
3
- require_lib 'reek/errors/config_file_error'
4
-
5
- RSpec.describe Reek::Configuration::SchemaValidator do
6
- describe 'validate' do
7
- subject(:validator) { described_class.new configuration }
8
-
9
- context 'when configuration is valid' do
10
- let(:configuration) do
11
- {
12
- Reek::DETECTORS_KEY => {
13
- 'UncommunicativeVariableName' => { 'enabled' => false },
14
- 'UncommunicativeMethodName' => { 'enabled' => false }
15
- }
16
- }
17
- end
18
-
19
- it 'returns nil' do
20
- expect(validator.validate).to eq(nil)
21
- end
22
- end
23
-
24
- context 'when detector is invalid' do
25
- let(:configuration) do
26
- {
27
- Reek::DETECTORS_KEY => {
28
- 'DoesNotExist' => { 'enabled' => false }
29
- }
30
- }
31
- end
32
-
33
- it 'raises an error' do
34
- message = %r{\[/detectors/DoesNotExist\] key 'DoesNotExist:' is undefined}
35
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
36
- end
37
- end
38
-
39
- context 'when `enabled` has a non-boolean value' do
40
- let(:configuration) do
41
- {
42
- Reek::DETECTORS_KEY => {
43
- 'FeatureEnvy' => { 'enabled' => 'foo' }
44
- }
45
- }
46
- end
47
-
48
- it 'raises an error' do
49
- message = %r{\[/detectors/FeatureEnvy/enabled\] 'foo': not a boolean}
50
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
51
- end
52
- end
53
-
54
- context 'when detector has an unknown option' do
55
- let(:configuration) do
56
- {
57
- Reek::DETECTORS_KEY => {
58
- 'DataClump' => { 'does_not_exist' => 42 }
59
- }
60
- }
61
- end
62
-
63
- it 'raises an error' do
64
- message = %r{\[/detectors/DataClump/does_not_exist\] key 'does_not_exist:' is undefined}
65
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
66
- end
67
- end
68
-
69
- context 'when `exclude`, `reject` and `accept`' do
70
- %w(exclude reject accept).each do |attribute|
71
- context 'when a scalar' do
72
- let(:configuration) do
73
- {
74
- Reek::DETECTORS_KEY => {
75
- 'UncommunicativeMethodName' => { attribute => 42 }
76
- }
77
- }
78
- end
79
-
80
- it 'raises an error' do
81
- message = %r{\[/detectors/UncommunicativeMethodName/#{attribute}\] '42': not a sequence}
82
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
83
- end
84
- end
85
-
86
- context 'when types are mixed' do
87
- let(:configuration) do
88
- {
89
- Reek::DETECTORS_KEY => {
90
- 'UncommunicativeMethodName' => { attribute => [42, 'foo'] }
91
- }
92
- }
93
- end
94
-
95
- it 'raises an error' do
96
- message = %r{\[/detectors/UncommunicativeMethodName/#{attribute}/0\] '42': not a string}
97
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
98
- end
99
- end
100
- end
101
- end
102
-
103
- context 'when `exclude_paths` is a scalar' do
104
- let(:configuration) do
105
- {
106
- Reek::EXCLUDE_PATHS_KEY => 42
107
- }
108
- end
109
-
110
- it 'raises an error' do
111
- message = %r{\[/exclude_paths\] '42': not a sequence}
112
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
113
- end
114
- end
115
-
116
- context 'when `exclude_paths` mixes types' do
117
- let(:configuration) do
118
- {
119
- Reek::EXCLUDE_PATHS_KEY => [42, 'foo']
120
- }
121
- end
122
-
123
- it 'raises an error' do
124
- message = %r{\[/exclude_paths/0\] '42': not a string}
125
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
126
- end
127
- end
128
-
129
- context 'with directory directives' do
130
- context 'when bad detector' do
131
- let(:configuration) do
132
- {
133
- Reek::DIRECTORIES_KEY => {
134
- 'web_app/app/helpers' => {
135
- 'Bar' => { 'enabled' => false }
136
- }
137
- }
138
- }
139
- end
140
-
141
- it 'raises an error' do
142
- message = %r{\[/directories/web_app/app/helpers/Bar\] key 'Bar:' is undefined}
143
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
144
- end
145
- end
146
-
147
- context 'when unknown attribute' do
148
- let(:configuration) do
149
- {
150
- Reek::DIRECTORIES_KEY => {
151
- 'web_app/app/controllers' => {
152
- 'NestedIterators' => { 'foo' => false }
153
- }
154
- }
155
- }
156
- end
157
-
158
- it 'raises an error' do
159
- message = %r{\[/directories/web_app/app/controllers/NestedIterators/foo\] key 'foo:' is undefined}
160
- expect { validator.validate }.to raise_error(Reek::Errors::ConfigFileError, message)
161
- end
162
- end
163
- end
164
- end
165
- end
@@ -1,192 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/method_context'
3
- require_lib 'reek/context/module_context'
4
-
5
- RSpec.describe Reek::Context::CodeContext do
6
- describe '#full_name' do
7
- let(:ctx) { described_class.new(exp) }
8
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
9
- let(:exp_name) { 'random_name' }
10
- let(:full_name) { "::::::::::::::::::::#{exp_name}" }
11
-
12
- before do
13
- allow(exp).to receive(:name).and_return(exp_name)
14
- allow(exp).to receive(:full_name).and_return(full_name)
15
- end
16
-
17
- it 'creates the correct full name' do
18
- expect(ctx.full_name).to eq(full_name)
19
- end
20
-
21
- context 'when there is an outer' do
22
- let(:outer_name) { 'another_random sting' }
23
- let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
24
-
25
- before do
26
- ctx.register_with_parent outer
27
- allow(outer).to receive(:full_name).at_least(:once).and_return(outer_name)
28
- end
29
-
30
- it 'creates the correct full name' do
31
- expect(ctx.full_name).to eq(full_name)
32
- end
33
-
34
- it 'passes the outer name to exp#full_name' do
35
- ctx.full_name
36
- expect(exp).to have_received(:full_name).with outer_name
37
- end
38
- end
39
- end
40
-
41
- describe '#name' do
42
- let(:ctx) { described_class.new(exp) }
43
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
44
- let(:exp_name) { 'random_name' }
45
-
46
- before do
47
- allow(exp).to receive(:name).and_return(exp_name)
48
- end
49
-
50
- it 'gets its short name from the exp' do
51
- expect(ctx.name).to eq(exp_name)
52
- end
53
- end
54
-
55
- describe '#matches?' do
56
- let(:ctx) { described_class.new(exp) }
57
- let(:exp) { instance_double('Reek::AST::SexpExtensions::ModuleNode') }
58
- let(:exp_name) { 'random_name' }
59
- let(:full_name) { "::::::::::::::::::::#{exp_name}" }
60
-
61
- before do
62
- allow(exp).to receive(:name).and_return(exp_name)
63
- allow(exp).to receive(:full_name).and_return(full_name)
64
- end
65
-
66
- it 'does not match an empty list' do
67
- expect(ctx.matches?([])).to eq(false)
68
- end
69
-
70
- it 'does not match when its own short name is not given' do
71
- expect(ctx.matches?(['banana'])).to eq(false)
72
- end
73
-
74
- it 'does not let pipe-ended Strings make matching ignore the rest' do
75
- expect(ctx.matches?(['banana|'])).to eq(false)
76
- end
77
-
78
- it 'recognises its own short name' do
79
- expect(ctx.matches?([exp_name])).to eq(true)
80
- end
81
-
82
- it 'recognises its own short name in a list' do
83
- expect(ctx.matches?(['banana', exp_name])).to eq(true)
84
- end
85
-
86
- it 'recognises its short name as a regex' do
87
- expect(ctx.matches?([/#{exp_name}/])).to eq(true)
88
- end
89
-
90
- it 'does not blow up on []-ended Strings' do
91
- expect(ctx.matches?(['banana[]', exp_name])).to eq(true)
92
- end
93
-
94
- it 'recognises its own full name' do
95
- expect(ctx.matches?(['banana', full_name])).to eq(true)
96
- end
97
-
98
- it 'recognises its full name as a regex' do
99
- expect(ctx.matches?([/banana/, /#{full_name}/])).to eq(true)
100
- end
101
-
102
- context 'when there is an outer' do
103
- let(:outer_name) { 'another_random sting' }
104
- let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
105
-
106
- before do
107
- ctx.register_with_parent outer
108
- allow(outer).to receive(:full_name).at_least(:once).and_return(outer_name)
109
- end
110
-
111
- it 'recognises its own full name' do
112
- expect(ctx.matches?(['banana', full_name])).to eq(true)
113
- end
114
-
115
- it 'recognises its full name as a regex' do
116
- expect(ctx.matches?([/banana/, /#{full_name}/])).to eq(true)
117
- end
118
- end
119
- end
120
-
121
- describe '#config_for' do
122
- let(:src) do
123
- <<-RUBY
124
- # :reek:DuplicateMethodCall { allow_calls: [ puts ] }')
125
- def repeated_greeting
126
- puts 'Hello!'
127
- puts 'Hello!'
128
- end
129
- RUBY
130
- end
131
- let(:expression) { Reek::Source::SourceCode.from(src).syntax_tree }
132
- let(:outer) { nil }
133
- let(:context) { described_class.new(expression) }
134
- let(:sniffer) { class_double('Reek::SmellDetectors::BaseDetector') }
135
-
136
- before do
137
- context.register_with_parent(outer)
138
- allow(sniffer).to receive(:smell_type).and_return('DuplicateMethodCall')
139
- end
140
-
141
- context 'when there is no outer context' do
142
- it 'gets its configuration from the expression comments' do
143
- expect(context.config_for(sniffer)).to eq('allow_calls' => ['puts'])
144
- end
145
- end
146
-
147
- context 'when there is an outer context' do
148
- let(:outer) { described_class.new(instance_double('Reek::AST::Node')) }
149
-
150
- before do
151
- allow(outer).to receive(:config_for).with(sniffer).and_return(
152
- 'max_calls' => 2)
153
- end
154
-
155
- it 'merges the outer config with its own configuration' do
156
- expect(context.config_for(sniffer)).to eq('allow_calls' => ['puts'],
157
- 'max_calls' => 2)
158
- end
159
- end
160
- end
161
-
162
- describe '#register_with_parent' do
163
- let(:context) { described_class.new(instance_double('Reek::AST::Node')) }
164
- let(:first_child) { described_class.new(instance_double('Reek::AST::Node')) }
165
- let(:second_child) { described_class.new(instance_double('Reek::AST::Node')) }
166
-
167
- it "appends the element to the parent context's list of children" do
168
- first_child.register_with_parent context
169
- second_child.register_with_parent context
170
-
171
- expect(context.children).to eq [first_child, second_child]
172
- end
173
- end
174
-
175
- describe '#each' do
176
- let(:context) { described_class.new(instance_double('Reek::AST::Node')) }
177
- let(:first_child) { described_class.new(instance_double('Reek::AST::Node')) }
178
- let(:second_child) { described_class.new(instance_double('Reek::AST::Node')) }
179
-
180
- it 'yields each child' do
181
- first_child.register_with_parent context
182
- second_child.register_with_parent context
183
-
184
- result = []
185
- context.each do |ctx|
186
- result << ctx
187
- end
188
-
189
- expect(result).to eq [context, first_child, second_child]
190
- end
191
- end
192
- end
@@ -1,60 +0,0 @@
1
- require_relative '../../spec_helper'
2
- require_lib 'reek/context/code_context'
3
- require_lib 'reek/context/ghost_context'
4
-
5
- RSpec.describe Reek::Context::GhostContext do
6
- let(:exp) { instance_double('Reek::AST::Node') }
7
- let(:parent) { Reek::Context::CodeContext.new(exp) }
8
-
9
- describe '#register_with_parent' do
10
- it 'does not append itself to its parent' do
11
- ghost = described_class.new(nil)
12
- ghost.register_with_parent(parent)
13
- expect(parent.children).not_to include ghost
14
- end
15
- end
16
-
17
- describe '#append_child_context' do
18
- let(:ghost) { described_class.new(nil) }
19
-
20
- before do
21
- ghost.register_with_parent(parent)
22
- end
23
-
24
- it 'appends the child to the grandparent context' do
25
- child = Reek::Context::CodeContext.new(sexp(:foo))
26
- child.register_with_parent(ghost)
27
-
28
- expect(parent.children).to include child
29
- end
30
-
31
- it "sets the child's parent to the grandparent context" do
32
- child = Reek::Context::CodeContext.new(sexp(:foo))
33
- child.register_with_parent(ghost)
34
-
35
- expect(child.parent).to eq parent
36
- end
37
-
38
- it 'appends the child to the list of children' do
39
- child = Reek::Context::CodeContext.new(sexp(:foo))
40
- child.register_with_parent(ghost)
41
-
42
- expect(ghost.children).to include child
43
- end
44
-
45
- context 'when the grandparent is also a ghost' do
46
- let(:child_ghost) { described_class.new(nil) }
47
-
48
- before do
49
- child_ghost.register_with_parent(ghost)
50
- end
51
-
52
- it 'sets the childs parent to its remote ancestor' do
53
- child = Reek::Context::CodeContext.new(sexp(:foo))
54
- child.register_with_parent(child_ghost)
55
-
56
- expect(child.parent).to eq parent
57
- end
58
- end
59
- end
60
- end