rubycop 0.5.1 → 1.0.1

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 (71) hide show
  1. data/.gitignore +2 -0
  2. data/Gemfile +1 -1
  3. data/README.md +43 -2
  4. data/Rakefile +3 -1
  5. data/lib/ruby_cop.rb +10 -0
  6. data/lib/ruby_cop/gray_list.rb +26 -0
  7. data/lib/ruby_cop/node_builder.rb +521 -0
  8. data/lib/ruby_cop/policy.rb +354 -0
  9. data/lib/ruby_cop/ruby.rb +23 -0
  10. data/lib/ruby_cop/ruby/args.rb +26 -0
  11. data/lib/ruby_cop/ruby/array.rb +13 -0
  12. data/lib/ruby_cop/ruby/assignment.rb +43 -0
  13. data/lib/ruby_cop/ruby/assoc.rb +13 -0
  14. data/lib/ruby_cop/ruby/blocks.rb +21 -0
  15. data/lib/ruby_cop/ruby/call.rb +31 -0
  16. data/lib/ruby_cop/ruby/case.rb +22 -0
  17. data/lib/ruby_cop/ruby/constants.rb +47 -0
  18. data/lib/ruby_cop/ruby/definitions.rb +25 -0
  19. data/lib/ruby_cop/ruby/for.rb +15 -0
  20. data/lib/ruby_cop/ruby/hash.rb +11 -0
  21. data/lib/ruby_cop/ruby/if.rb +31 -0
  22. data/lib/ruby_cop/ruby/list.rb +15 -0
  23. data/lib/ruby_cop/ruby/node.rb +9 -0
  24. data/lib/ruby_cop/ruby/operators.rb +52 -0
  25. data/lib/ruby_cop/ruby/params.rb +21 -0
  26. data/lib/ruby_cop/ruby/position.rb +13 -0
  27. data/lib/ruby_cop/ruby/range.rb +15 -0
  28. data/lib/ruby_cop/ruby/statements.rb +32 -0
  29. data/lib/ruby_cop/ruby/string.rb +24 -0
  30. data/lib/ruby_cop/ruby/tokens.rb +44 -0
  31. data/lib/ruby_cop/ruby/variables.rb +24 -0
  32. data/lib/ruby_cop/ruby/while.rb +27 -0
  33. data/lib/ruby_cop/version.rb +3 -0
  34. data/ruby_cop.gemspec +25 -0
  35. data/spec/{node_builder_spec.rb → analyzer/node_builder_spec.rb} +3 -3
  36. data/spec/{policy_spec.rb → analyzer/policy_spec.rb} +6 -8
  37. data/spec/spec_helper.rb +13 -0
  38. data/tasks/rspec.rake +8 -0
  39. data/tasks/yard.rake +2 -0
  40. metadata +69 -44
  41. data/lib/rubycop.rb +0 -6
  42. data/lib/rubycop/analyzer.rb +0 -6
  43. data/lib/rubycop/analyzer/gray_list.rb +0 -28
  44. data/lib/rubycop/analyzer/node_builder.rb +0 -523
  45. data/lib/rubycop/analyzer/policy.rb +0 -356
  46. data/lib/rubycop/analyzer/ruby.rb +0 -24
  47. data/lib/rubycop/analyzer/ruby/args.rb +0 -28
  48. data/lib/rubycop/analyzer/ruby/array.rb +0 -11
  49. data/lib/rubycop/analyzer/ruby/assignment.rb +0 -45
  50. data/lib/rubycop/analyzer/ruby/assoc.rb +0 -15
  51. data/lib/rubycop/analyzer/ruby/blocks.rb +0 -23
  52. data/lib/rubycop/analyzer/ruby/call.rb +0 -33
  53. data/lib/rubycop/analyzer/ruby/case.rb +0 -24
  54. data/lib/rubycop/analyzer/ruby/constants.rb +0 -49
  55. data/lib/rubycop/analyzer/ruby/definitions.rb +0 -27
  56. data/lib/rubycop/analyzer/ruby/for.rb +0 -17
  57. data/lib/rubycop/analyzer/ruby/hash.rb +0 -13
  58. data/lib/rubycop/analyzer/ruby/if.rb +0 -33
  59. data/lib/rubycop/analyzer/ruby/list.rb +0 -17
  60. data/lib/rubycop/analyzer/ruby/node.rb +0 -11
  61. data/lib/rubycop/analyzer/ruby/operators.rb +0 -54
  62. data/lib/rubycop/analyzer/ruby/params.rb +0 -23
  63. data/lib/rubycop/analyzer/ruby/position.rb +0 -15
  64. data/lib/rubycop/analyzer/ruby/range.rb +0 -17
  65. data/lib/rubycop/analyzer/ruby/statements.rb +0 -34
  66. data/lib/rubycop/analyzer/ruby/string.rb +0 -26
  67. data/lib/rubycop/analyzer/ruby/tokens.rb +0 -46
  68. data/lib/rubycop/analyzer/ruby/variables.rb +0 -26
  69. data/lib/rubycop/analyzer/ruby/while.rb +0 -29
  70. data/lib/rubycop/version.rb +0 -3
  71. data/rubycop.gemspec +0 -25
@@ -1,356 +0,0 @@
1
- require 'set'
2
-
3
- module Rubycop
4
- module Analyzer
5
- class Policy
6
- def initialize
7
- @const_list = GrayList.new
8
- initialize_const_blacklist
9
- end
10
-
11
- def inspect
12
- '#<%s:0x%x>' % [self.class.name, object_id]
13
- end
14
-
15
- def blacklist_const(const)
16
- @const_list.blacklist(const)
17
- end
18
-
19
- def const_allowed?(const)
20
- @const_list.allow?(const)
21
- end
22
-
23
- def whitelist_const(const)
24
- @const_list.whitelist(const)
25
- end
26
-
27
- def visit(node)
28
- klass = node.class.ancestors.detect do |ancestor|
29
- respond_to?("visit_#{ancestor.name.split('::').last}")
30
- end
31
- if klass
32
- send("visit_#{klass.name.split('::').last}", node)
33
- else
34
- warn "unhandled node type: #{node.inspect}:#{node.class.name}"
35
- true
36
- end
37
- end
38
-
39
- def visit_Alias(node)
40
- false # never allowed
41
- end
42
-
43
- def visit_Args(node)
44
- node.elements.all? { |e| visit(e) }
45
- end
46
-
47
- def visit_Array(node)
48
- node.elements.all? { |e| visit(e) }
49
- end
50
-
51
- def visit_Assoc(node)
52
- visit(node.key) && visit(node.value)
53
- end
54
-
55
- def visit_Binary(node)
56
- visit(node.lvalue) && visit(node.rvalue)
57
- end
58
-
59
- def visit_Block(node)
60
- (node.params.nil? || visit(node.params)) && node.elements.all? { |e| visit(e) }
61
- end
62
-
63
- CALL_BLACKLIST = %w[
64
- abort
65
- alias_method
66
- at_exit
67
- autoload
68
- binding
69
- callcc
70
- caller
71
- class_eval
72
- const_get
73
- const_set
74
- eval
75
- exec
76
- exit
77
- dup
78
- fail
79
- fork
80
- gets
81
- global_variables
82
- instance_eval
83
- load
84
- loop
85
- method
86
- module_eval
87
- open
88
- readline
89
- readlines
90
- redo
91
- remove_const
92
- retry
93
- require
94
- send
95
- set_trace_func
96
- sleep
97
- spawn
98
- srand
99
- syscall
100
- system
101
- trap
102
- undef
103
- __callee__
104
- __method__
105
- ].to_set.freeze
106
-
107
- def visit_Call(node)
108
- !CALL_BLACKLIST.include?(node.identifier.token.to_s) && [node.target, node.arguments, node.block].compact.all? { |e| visit(e) }
109
- end
110
-
111
- def visit_Case(node)
112
- visit(node.expression) && visit(node.block)
113
- end
114
-
115
- def visit_ChainedBlock(node)
116
- node.elements.all? { |e| visit(e) } && node.blocks.all? { |e| visit(e) } && (node.params.nil? || visit(node.params))
117
- end
118
-
119
- def visit_Class(node)
120
- visit(node.const) && (node.superclass.nil? || visit(node.superclass)) && visit(node.body)
121
- end
122
-
123
- def visit_ClassVariable(node)
124
- false # never allowed
125
- end
126
-
127
- def visit_ClassVariableAssignment(node)
128
- false # never allowed
129
- end
130
-
131
- def visit_Char(node)
132
- true
133
- end
134
-
135
- def visit_Constant(node)
136
- const_allowed?(node.token)
137
- end
138
-
139
- def visit_ConstantAssignment(node)
140
- visit(node.lvalue) && visit(node.rvalue)
141
- end
142
-
143
- def visit_Defined(node)
144
- false # never allowed (though it's probably safe)
145
- end
146
-
147
- def visit_Else(node)
148
- node.elements.all? { |e| visit(e) }
149
- end
150
-
151
- def visit_ExecutableString(node)
152
- false # never allowed
153
- end
154
-
155
- def visit_Float(node)
156
- true
157
- end
158
-
159
- def visit_For(node)
160
- visit(node.variable) && visit(node.range) && visit(node.statements)
161
- end
162
-
163
- def visit_GlobalVariable(node)
164
- false # never allowed
165
- end
166
-
167
- def visit_GlobalVariableAssignment(node)
168
- false # never allowed
169
- end
170
-
171
- def visit_Hash(node)
172
- node.assocs.nil? || node.assocs.all? { |e| visit(e) }
173
- end
174
-
175
- def visit_Identifier(node)
176
- !CALL_BLACKLIST.include?(node.token)
177
- end
178
-
179
- def visit_If(node)
180
- visit(node.expression) && node.elements.all? { |e| visit(e) } && node.blocks.all? { |e| visit(e) }
181
- end
182
- alias_method :visit_Unless, :visit_If
183
-
184
- def visit_IfMod(node)
185
- visit(node.expression) && node.elements.all? { |e| visit(e) }
186
- end
187
- alias_method :visit_UnlessMod, :visit_IfMod
188
-
189
- def visit_IfOp(node)
190
- visit(node.condition) && visit(node.then_part) && visit(node.else_part)
191
- end
192
-
193
- def visit_InstanceVariable(node)
194
- true
195
- end
196
-
197
- def visit_InstanceVariableAssignment(node)
198
- visit(node.rvalue)
199
- end
200
-
201
- def visit_Integer(node)
202
- true
203
- end
204
-
205
- KEYWORD_WHITELIST = %w[
206
- false
207
- nil
208
- self
209
- true
210
- ].to_set.freeze
211
-
212
- def visit_Keyword(node)
213
- KEYWORD_WHITELIST.include?(node.token)
214
- end
215
-
216
- def visit_Label(node)
217
- true
218
- end
219
-
220
- def visit_LocalVariableAssignment(node)
221
- visit(node.rvalue)
222
- end
223
-
224
- def visit_Method(node)
225
- [node.target, node.params, node.body].compact.all? { |e| visit(e) }
226
- end
227
-
228
- def visit_Module(node)
229
- visit(node.const) && visit(node.body)
230
- end
231
-
232
- def visit_MultiAssignment(node)
233
- visit(node.lvalue) && visit(node.rvalue)
234
- end
235
-
236
- def visit_MultiAssignmentList(node)
237
- node.elements.all? { |e| visit(e) }
238
- end
239
-
240
- def visit_Params(node)
241
- node.elements.all? { |e| visit(e) }
242
- end
243
-
244
- def visit_Program(node)
245
- node.elements.all? { |e| visit(e) }
246
- end
247
-
248
- def visit_Range(node)
249
- visit(node.min) && visit(node.max)
250
- end
251
-
252
- def visit_RescueMod(node)
253
- node.elements.all? { |e| visit(e) } && visit(node.expression)
254
- end
255
-
256
- def visit_RescueParams(node)
257
- node.elements.all? { |e| visit(e) }
258
- end
259
-
260
- def visit_SingletonClass(node)
261
- visit(node.superclass) && visit(node.body)
262
- end
263
-
264
- def visit_SplatArg(node)
265
- visit(node.arg)
266
- end
267
-
268
- def visit_Statements(node)
269
- node.elements.all? { |e| visit(e) }
270
- end
271
-
272
- def visit_String(node)
273
- # embedded strings can have statements in them, so check those
274
- node.elements.reject { |e| e.is_a?(::String) }.all? { |e| visit(e) }
275
- end
276
-
277
- def visit_StringConcat(node)
278
- node.elements.all? { |e| visit(e) }
279
- end
280
-
281
- def visit_Symbol(node)
282
- true
283
- end
284
-
285
- def visit_Unary(node)
286
- visit(node.operand)
287
- end
288
-
289
- def visit_Until(node)
290
- false # never allowed
291
- end
292
- alias_method :visit_UntilMod, :visit_Until
293
-
294
- def visit_When(node)
295
- visit(node.expression) && node.elements.all? { |e| visit(e) }
296
- end
297
-
298
- def visit_While(node)
299
- false # never allowed
300
- end
301
- alias_method :visit_WhileMod, :visit_While
302
-
303
- private
304
-
305
- CONST_BLACKLIST = %w[
306
- ARGF
307
- ARGV
308
- Array
309
- Base64
310
- Class
311
- Dir
312
- ENV
313
- Enumerable
314
- Error
315
- Exception
316
- Fiber
317
- File
318
- FileUtils
319
- GC
320
- Gem
321
- Hash
322
- IO
323
- IRB
324
- Kernel
325
- Module
326
- Net
327
- Object
328
- ObjectSpace
329
- OpenSSL
330
- OpenURI
331
- PLATFORM
332
- Proc
333
- Process
334
- RUBY_COPYRIGHT
335
- RUBY_DESCRIPTION
336
- RUBY_ENGINE
337
- RUBY_PATCHLEVEL
338
- RUBY_PLATFORM
339
- RUBY_RELEASE_DATE
340
- RUBY_VERSION
341
- Rails
342
- STDERR
343
- STDIN
344
- STDOUT
345
- String
346
- TOPLEVEL_BINDING
347
- Thread
348
- VERSION
349
- ].freeze
350
-
351
- def initialize_const_blacklist
352
- CONST_BLACKLIST.each { |const| blacklist_const(const) }
353
- end
354
- end
355
- end
356
- end
@@ -1,24 +0,0 @@
1
- require 'rubycop/analyzer/ruby/node'
2
-
3
- require 'rubycop/analyzer/ruby/list'
4
- require 'rubycop/analyzer/ruby/array'
5
- require 'rubycop/analyzer/ruby/args'
6
- require 'rubycop/analyzer/ruby/assignment'
7
- require 'rubycop/analyzer/ruby/assoc'
8
- require 'rubycop/analyzer/ruby/statements'
9
- require 'rubycop/analyzer/ruby/blocks'
10
- require 'rubycop/analyzer/ruby/call'
11
- require 'rubycop/analyzer/ruby/case'
12
- require 'rubycop/analyzer/ruby/tokens'
13
- require 'rubycop/analyzer/ruby/constants'
14
- require 'rubycop/analyzer/ruby/definitions'
15
- require 'rubycop/analyzer/ruby/for'
16
- require 'rubycop/analyzer/ruby/hash'
17
- require 'rubycop/analyzer/ruby/if'
18
- require 'rubycop/analyzer/ruby/operators'
19
- require 'rubycop/analyzer/ruby/params'
20
- require 'rubycop/analyzer/ruby/position'
21
- require 'rubycop/analyzer/ruby/range'
22
- require 'rubycop/analyzer/ruby/string'
23
- require 'rubycop/analyzer/ruby/variables'
24
- require 'rubycop/analyzer/ruby/while'
@@ -1,28 +0,0 @@
1
- module Rubycop
2
- module Analyzer
3
- module Ruby
4
- class Args < List
5
- attr_reader :block
6
-
7
- def add_block(block)
8
- @block = block
9
- end
10
-
11
- def to_array
12
- Array.new(@elements)
13
- end
14
- end
15
-
16
- class Arg < Node
17
- def initialize(arg)
18
- @arg = arg
19
- end
20
-
21
- attr_reader :arg
22
- end
23
-
24
- class SplatArg < Arg
25
- end
26
- end
27
- end
28
- end
@@ -1,11 +0,0 @@
1
- module Rubycop
2
- module Analyzer
3
- module Ruby
4
- class Array < List
5
- # def inspect
6
- # '[%s]' % @elements.collect { |e| e.inspect }.join(', ')
7
- # end
8
- end
9
- end
10
- end
11
- end
@@ -1,45 +0,0 @@
1
- module Rubycop
2
- module Analyzer
3
- module Ruby
4
- class Assignment < Node
5
- def initialize(lvalue, rvalue, operator)
6
- @lvalue = lvalue
7
- @rvalue = rvalue
8
- @operator = operator
9
- end
10
-
11
- attr_reader :lvalue
12
- attr_reader :rvalue
13
- attr_reader :operator
14
-
15
- # def inspect
16
- # "#{@lvalue.inspect} #{@operator} #{@rvalue.inspect}"
17
- # end
18
- end
19
-
20
- class ClassVariableAssignment < Assignment
21
- end
22
-
23
- class ConstantAssignment < Assignment
24
- end
25
-
26
- class GlobalVariableAssignment < Assignment
27
- end
28
-
29
- class InstanceVariableAssignment < Assignment
30
- end
31
-
32
- class LocalVariableAssignment < Assignment
33
- end
34
-
35
- class MultiAssignment < Assignment
36
- end
37
-
38
- class MultiAssignmentList < List
39
- def assignment(rvalue, operator)
40
- MultiAssignment.new(self, rvalue, operator)
41
- end
42
- end
43
- end
44
- end
45
- end