ruby_cop 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
1
  RubyCop
2
- =======
3
2
 
4
3
  RubyCop scans Ruby code and tells you whether it's safe or not. We use
5
4
  it at [CodeSchool][1] to check user-submitted code before we eval it on
@@ -0,0 +1,6 @@
1
+ require 'ripper'
2
+
3
+ require 'ruby_cop/analyzer/ruby'
4
+ require 'ruby_cop/analyzer/node_builder'
5
+ require 'ruby_cop/analyzer/gray_list'
6
+ require 'ruby_cop/analyzer/policy'
@@ -72,6 +72,7 @@ module RubyCop
72
72
  class_eval
73
73
  const_get
74
74
  const_set
75
+ dup
75
76
  eval
76
77
  exec
77
78
  exit
@@ -90,6 +91,7 @@ module RubyCop
90
91
  redo
91
92
  remove_const
92
93
  require
94
+ retry
93
95
  send
94
96
  set_trace_func
95
97
  sleep
@@ -1,3 +1,3 @@
1
1
  module RubyCop
2
- VERSION = '1.0.1'
2
+ VERSION = '1.0.2'
3
3
  end
data/ruby_cop.gemspec CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Dray Lacy", "Eric Allam"]
10
10
  s.email = ["dray@envylabs.com", "eric@envylabs.com"]
11
- s.homepage = ""
11
+ s.homepage = "https://github.com/envylabs/RubyCop"
12
12
  s.summary = %q{Statically analyze Ruby and neutralize nefarious code}
13
13
  s.description = %q{Statically analyze Ruby and neutralize nefarious code}
14
14
 
@@ -57,6 +57,8 @@ describe RubyCop::Policy do
57
57
  it { should_not allow('`ls` rescue 1') }
58
58
  it { should_not allow('x rescue `ls`') }
59
59
  it { should_not allow('begin; x; rescue (`ls`; RuntimeError) => err; end') }
60
+ it { should_not allow(%{begin ; begin ; ":D" ; rescue ; retry ; ensure ; raise ":D" ; end ; rescue ; retry ; end})}
61
+ it { should_not allow(%{begin ; while(true) ; 'x' ; end ; rescue Exception ; retry ; end}) }
60
62
  end
61
63
 
62
64
  context "blocks" do
@@ -74,6 +76,7 @@ describe RubyCop::Policy do
74
76
  # This is a tricky case where we want to allow methods like
75
77
  # Enumerable#select, but not Kernel#select / IO#select.
76
78
  it { should allow('[1, 2, 3].select { |x| x.odd? }') }
79
+ it { should_not allow('select([$stdin], nil, nil, 1.5)') }
77
80
  it { pending('Kernel#select') { should_not allow('select([$stdin], nil, nil, 1.5)') } }
78
81
 
79
82
  # TODO: these are a possible concern because symbols are not GC'ed and
@@ -136,6 +139,7 @@ describe RubyCop::Policy do
136
139
  it { should_not allow('trap("EXIT") { }') }
137
140
  it { should_not allow('undef :raise') }
138
141
  it { should_not allow('undef raise') }
142
+ it { should_not allow(%{''.dup}) }
139
143
  end
140
144
  end
141
145
 
@@ -0,0 +1,408 @@
1
+ require 'ruby_cop'
2
+
3
+ describe RubyCop::Policy do
4
+ let(:policy) { described_class.new }
5
+ subject { policy }
6
+
7
+ RSpec::Matchers.define(:allow) do |ruby|
8
+ match { |policy| RubyCop::NodeBuilder.build(ruby).accept(policy) }
9
+ end
10
+
11
+ context "assignment" do
12
+ context "class variables" do
13
+ it { should_not allow('@@x = 1') }
14
+ it { should_not allow('@@x ||= 1') }
15
+ it { should_not allow('@@x += 1') }
16
+ end
17
+
18
+ context "constants" do
19
+ it { should allow('Foo = 1') }
20
+ it { should allow('Foo::Bar = 1') }
21
+ it { should allow('::Bar = 1') }
22
+
23
+ it { should_not allow('Foo = Kernel') }
24
+ it { should_not allow('Foo = ::Kernel') }
25
+ it { should_not allow('Foo = Object::Kernel') }
26
+ end
27
+
28
+ context "globals" do
29
+ it { should_not allow('$x = 1') }
30
+ it { should_not allow('$x ||= 1') }
31
+ it { should_not allow('$x += 1') }
32
+ end
33
+
34
+ context "instance variables" do
35
+ it { should allow('@x = 1') }
36
+ it { should allow('@x += 1') }
37
+ it { should_not allow('@x = $x') }
38
+ it { should_not allow('@x = @@x') }
39
+ end
40
+
41
+ context "locals" do
42
+ it { should allow('x = 1') }
43
+ it { should allow('x ||= 1') }
44
+ it { should allow('x += 1') }
45
+ it { should_not allow('x = $x') }
46
+ it { should_not allow('x = @@x') }
47
+ end
48
+ end
49
+
50
+ context "begin/rescue/ensure" do
51
+ it { should allow('begin; x; rescue; end') }
52
+ it { should allow('x rescue 1') }
53
+
54
+ it { should_not allow('begin; `ls`; rescue; x; end') }
55
+ it { should_not allow('begin; x; rescue; `ls`; end') }
56
+ it { should_not allow('begin; x; rescue; 1; ensure `ls`; end') }
57
+ it { should_not allow('`ls` rescue 1') }
58
+ it { should_not allow('x rescue `ls`') }
59
+ it { should_not allow('begin; x; rescue (`ls`; RuntimeError) => err; end') }
60
+ it { should_not allow(%{begin ; begin ; ":D" ; rescue ; retry ; ensure ; raise ":D" ; end ; rescue ; retry ; end})}
61
+ it { should_not allow(%{begin ; while(true) ; 'x' ; end ; rescue Exception ; retry ; end}) }
62
+ end
63
+
64
+ context "blocks" do
65
+ it { should_not allow('->(a = $x) { }') }
66
+ it { should_not allow('->(a) { $x }') }
67
+ it { should_not allow('lambda { $x }') }
68
+ it { should_not allow('proc { $x }') }
69
+ end
70
+
71
+ context "calls" do
72
+ it { should allow('foo { 1 }') }
73
+ it { should_not allow('foo { $x }') }
74
+
75
+ context "blacklist" do
76
+ # This is a tricky case where we want to allow methods like
77
+ # Enumerable#select, but not Kernel#select / IO#select.
78
+ it { should allow('[1, 2, 3].select { |x| x.odd? }') }
79
+ it { should_not allow('select([$stdin], nil, nil, 1.5)') }
80
+
81
+ # TODO: these are a possible concern because symbols are not GC'ed and
82
+ # an attacker could create a large number of them to eat up memory. If
83
+ # these methods are blacklisted, then dyna-symbols (:"foo#{x}") need to
84
+ # be restricted as well.
85
+ it { should allow('"abc".intern') }
86
+ it { should allow('"abc".to_sym') }
87
+
88
+ it { should_not allow('abort("fail")') }
89
+ it { should_not allow('alias :foo :bar') }
90
+ it { should_not allow('alias foo bar') }
91
+ it { should_not allow('alias_method(:foo, :bar)') }
92
+ it { should_not allow('at_exit { puts "Bye!" }')}
93
+ it { should_not allow('autoload(:Foo, "foo")') }
94
+ it { should_not allow('binding') }
95
+ it { should_not allow('binding()') }
96
+ it { should_not allow('callcc { |cont| }') }
97
+ it { should_not allow('caller') }
98
+ it { should_not allow('caller()') }
99
+ it { should_not allow('caller(1)') }
100
+ it { should_not allow('class_eval("$x = 1")') }
101
+ it { should_not allow('const_get(:Kernel)') }
102
+ it { should_not allow('const_set(:Foo, ::Kernel)') }
103
+ it { should_not allow('eval("`ls`")') }
104
+ it { should_not allow('exec("ls")') }
105
+ it { should_not allow('exit') }
106
+ it { should_not allow('exit()') }
107
+ it { should_not allow('fail') }
108
+ it { should_not allow('fail("failed")') }
109
+ it { should_not allow('fail()') }
110
+ it { should_not allow('fork { }') }
111
+ it { should_not allow('fork') }
112
+ it { should_not allow('fork()') }
113
+ it { should_not allow('gets') }
114
+ it { should_not allow('gets()') }
115
+ it { should_not allow('global_variables') }
116
+ it { should_not allow('global_variables()') }
117
+ it { should_not allow('load("foo")') }
118
+ it { should_not allow('loop { }') }
119
+ it { should_not allow('method(:eval)') }
120
+ it { should_not allow('module_eval("`ls`")') }
121
+ it { should_not allow('open("/etc/passwd")') }
122
+ it { should_not allow('readline') }
123
+ it { should_not allow('readline()') }
124
+ it { should_not allow('readlines') }
125
+ it { should_not allow('readlines()') }
126
+ it { should_not allow('redo') }
127
+ it { should_not allow('remove_const(:Kernel)') }
128
+ it { should_not allow('require("digest/md5")') }
129
+ it { should_not allow('send(:eval, "`ls`")') }
130
+ it { should_not allow('set_trace_func(proc { |event,file,line,id,binding,classname| })') }
131
+ it { should_not allow('sleep(100**100)') }
132
+ it { should_not allow('spawn("ls", :chdir => "/")') }
133
+ it { should_not allow('srand') }
134
+ it { should_not allow('srand()') }
135
+ it { should_not allow('srand(1)') }
136
+ it { should_not allow('syscall(4, 1, "hello\n", 6)') }
137
+ it { should_not allow('system("ls")') }
138
+ it { should_not allow('trap("EXIT") { }') }
139
+ it { should_not allow('undef :raise') }
140
+ it { should_not allow('undef raise') }
141
+ it { should_not allow(%{''.dup})}
142
+ end
143
+ end
144
+
145
+ context "case" do
146
+ it { should allow('case x; when 1; 2; end') }
147
+
148
+ it { should_not allow('case $x; when 1; 2; end') }
149
+ it { should_not allow('case $x = 1; when 1; 2; end') }
150
+ it { should_not allow('case x; when $x; 2; end') }
151
+ it { should_not allow('case x; when 1; $x; end') }
152
+ end
153
+
154
+ context "class / module definition" do
155
+ it { should allow("class Foo\nend") }
156
+ it { should allow("class Foo::Bar\nend") }
157
+
158
+ it { should allow("module Foo\nend") }
159
+ it { should allow("module Foo::Bar\nend") }
160
+ it { should_not allow("module Kernel\nend") }
161
+ it { should_not allow("module ::Kernel\nend") }
162
+ end
163
+
164
+ context "defined?" do
165
+ it { should_not allow('defined?(Kernel)') }
166
+ end
167
+
168
+ context "dynamic strings" do
169
+ it { should_not allow('"abc#{`ls`}"') }
170
+ it { should_not allow('"#{`ls`}abc"') }
171
+ it { should_not allow('"#$0"') }
172
+ end
173
+
174
+ context "dynamic symbols" do
175
+ it { should_not allow(':"abc#{`ls`}"') }
176
+ it { should_not allow(':"#{`ls`}abc"') }
177
+ end
178
+
179
+ context "for" do
180
+ it { should_not allow('for i in ENV; puts i; end') }
181
+ it { should_not allow('for $x in [1, 2, 3]; puts $x; end') }
182
+ end
183
+
184
+ context "if/elsif/else" do
185
+ it { should allow('x if true') }
186
+
187
+ it { should_not allow('$x ? 1 : 2') }
188
+ it { should_not allow('true ? $x : 2') }
189
+ it { should_not allow('true ? 1 : $x') }
190
+ it { should_not allow('if $x; 1; end') }
191
+ it { should_not allow('if true; $x; end') }
192
+ it { should_not allow('$x if true') }
193
+ it { should_not allow('true if $x') }
194
+ it { should_not allow('if $x; 1; else 2; end') }
195
+ it { should_not allow('if 1; $x; else 2; end') }
196
+ it { should_not allow('if 1; 1; else $x; end') }
197
+ it { should_not allow('if 1; 1; elsif 2; 2; else $x; end') }
198
+ end
199
+
200
+ context "literals" do
201
+ it { should allow('"abc"') }
202
+ it { should allow('/abc/') }
203
+ it { should allow('1') }
204
+ it { should allow('1..2') }
205
+ it { should allow('1.2') }
206
+ it { should allow('false') }
207
+ it { should allow('nil') }
208
+ it { should allow('true') }
209
+ it { should allow('[]') }
210
+ it { should allow('[1,2,3]') }
211
+ it { should allow('{}') }
212
+ it { should allow('{1 => 2}') }
213
+ end
214
+
215
+ context "magic variables" do
216
+ it { should_not allow('__callee__') }
217
+ it { should_not allow('__FILE__') }
218
+ it { should_not allow('__method__') }
219
+ end
220
+
221
+ context "methods" do
222
+ it { should allow('def initialize(attributes={}); end') }
223
+ end
224
+
225
+ context "singleton class" do
226
+ it { should_not allow('class << Kernel; end') }
227
+ it { should_not allow('class << Kernel; `ls`; end') }
228
+ end
229
+
230
+ context "super" do
231
+ it { should allow('super') }
232
+ it { should allow('super()') }
233
+ it { should allow('super(1)') }
234
+ it { should_not allow('super($x)') }
235
+ end
236
+
237
+ context "system" do
238
+ it { should_not allow('`ls`') }
239
+ it { should_not allow('%x[ls]') }
240
+ it { should_not allow('system("ls")') }
241
+ end
242
+
243
+ context "unless" do
244
+ it { should_not allow('unless $x; 1; end') }
245
+ it { should_not allow('unless true; $x; end') }
246
+ it { should_not allow('$x unless true') }
247
+ it { should_not allow('true unless $x') }
248
+ it { should_not allow('unless $x; 1; else 2; end') }
249
+ it { should_not allow('unless 1; $x; else 2; end') }
250
+ it { should_not allow('unless 1; 1; else $x; end') }
251
+ end
252
+
253
+ context "until" do
254
+ it { should_not allow('true until false') }
255
+ end
256
+
257
+ context "while" do
258
+ it { should_not allow('true while true') }
259
+ end
260
+
261
+ context "yield" do
262
+ it { should allow('def foo; yield; end') }
263
+ end
264
+
265
+ context "Rails for Zombies" do
266
+ before(:each) do
267
+ policy.whitelist_const('GenericController')
268
+ policy.whitelist_const('Tweet')
269
+ policy.whitelist_const('Weapon')
270
+ policy.whitelist_const('Zombie')
271
+ policy.whitelist_const('ZombiesController')
272
+ end
273
+
274
+ [
275
+ "1 = Ash\nAsh = Glen Haven Memorial Cemetary",
276
+ "<% zombies = Zombie.all %>\n\n<ul>\n <% zombies.each do |zombie| %>\n <li>\n <%= zombie.name %>\n <% if zombie.Tweet >= 1 %>\n <p><%= SMART ZOMBIE =%></p>\n <% end %>\n </li>\n <% end %>\n</ul>\n",
277
+ "class HelloRils",
278
+ "Class NAme\n\nend",
279
+ "class tweet < ActiveRecord::Base\n belongs_to :zombie \n z = zombie.find(2)\nend",
280
+ "class zombie < ActiveRecord :: Base\n\nend\n",
281
+ "Class Zombie < ActiveRecord::Base\n validates_presence_of :name\nend",
282
+ "Class Zombie < ActiveRecord::Base\nend",
283
+ "Class Zombie < ActiveRecord::Base\nvalidates_presence_of :status\nvalidates_presence_of :ww\nend",
284
+ "Class Zombie < ActiveRecord::Base{\ndef name\ndef graveyard\n\n}\n",
285
+ "class zombie < ActiveRecord\nend class",
286
+ "Class Zombie <ActiveRecord :: Base\n\nend\n\n\n",
287
+ "Class Zombie <ActiveRecord::Base>\nvalidates_presence_of\nend",
288
+ "class.load(Zombie)",
289
+ "Poop = Zombie.find(:id=1)",
290
+ "SELECT * WHERE ID = 1;",
291
+ "String myNewZombie = select name from Zombies where id=1",
292
+ "w = Weapon.find(1)\nZombie.create( :Weapon => \"Hammer\", Zombie => 1)\nend\n",
293
+ "Zodfsdsfdsdfsz=Zombies.find()1\n"
294
+ ].each do |error|
295
+ it "raises SyntaxError on #{error.inspect}" do
296
+ expect { RubyCop::NodeBuilder.build(error) }.to raise_error(SyntaxError)
297
+ end
298
+ end
299
+
300
+ [
301
+ "1\nZombie = 1\n",
302
+ "A = t.find(1)\n\n\n\n",
303
+ "Ash = 1\n",
304
+ "Ash = 1\n\n",
305
+ "Ash = Weapons.find.zombie_id(1)",
306
+ "Ash = Zombie.find(1)\nAsh.weapons.count",
307
+ "class Com\n\nhasmany dog\n\nend",
308
+ "class Finder < Tweet\n z = Tweet.find(1)\nend",
309
+ "class Post < ActiveRecord::Base\nend",
310
+ "class Weapons < ActiveRecord::Base\n belongs_to :Zombies\nend\n\nclass Zombies < ActiveRecord::Base\n has_many :Weapons\nend",
311
+ "Class Zombie < ActiveRecord::Base\n\nEnd",
312
+ "class Zombie < Rails::ActiveModel\n \nend",
313
+ "Class Zombie {\n validates :name, :presence => true\n}",
314
+ "Class Zombies < ActiveRecord::Base\nEnd",
315
+ "class ZombiesController < ApplicationController\n before_filter :find_zombie, :only => [:show]\n\n def show\n render :action => :show\n end\n\n def find_zombie\n @zombie = Zombie.find params[:id]\n @numTweets = Tweet.where(:zombie_id => @zombie).count\n if @numTweets < 1 \n redirect_to(zombies_path)\n end\n end\nend\n",
316
+ "class Zomvie <ActiveRecord::Base\nhas_many:Zombies\nend\n",
317
+ "class Zoombie < ActiveRecord::Base\nend\nz = Zoombie.last",
318
+ "class Zoombie\nend\nZoombie.create(:name => \"Jim\", :graveyard=> \"My Fathers Basement\")",
319
+ "cuntZombie=Zombies[1];",
320
+ "def create\n @newZombie = Zombie.create( :name => params[:name], :graveyard => params[:graveyard] )\n \n render action => :create\nend\n",
321
+ "Destroy Zombie where ID = 3",
322
+ "Find.Tweet.id = (1)\nZombie = Tweet.id",
323
+ "firstZombie = Zombies[id '1']\n",
324
+ "First_user = initialuser\n",
325
+ "Hash tag + lik",
326
+ "Hold = Tweets.find 1",
327
+ "jh = new Zombie()\njh.name = \"JHDI\"\njh.graveYard = \"JHDI cemetary\"\njh.save",
328
+ "Location = puts graveyard.Ash",
329
+ "newZombie = Zombie.new\nnewZombie.name = \"Craig\"\nnewZombie.graveyard = \"my cube\"\nnewZombie.save",
330
+ "newZombie = Zombie.new\nnewZombie['name'] = \"Renan\"\nnewZombie['graveyard'] = \"Lavras Cemetary\"\nnewZombie.save\n",
331
+ "newZombie = Zombies.new\nnewZombie.id = 4\nnewZombie.name = \"Arek\"\nnewZombie.graveyard = \"Centralny cmentarz komunalny\"\nnewZombie.save",
332
+ "newZombie=Zombie.new {}\nnewZombie.name = \"Manish\"\nnewZombie.graveyard = \"Shillong Bastards Cemetary\"",
333
+ "numeroUno = Zombie(1).name;\n",
334
+ "splatid = id.find(1)\nsplatName = splatid[:name]",
335
+ "t = new Tweet();\nminTweet == t.find(3);",
336
+ "t = Tweet.find(1)\nZombie = t.id",
337
+ "T = Zombie.find(3)\nT.graveyard = 'Benny Hills Memorial'\nT.save",
338
+ "t = Zombie.find(3)\nt.Zombie = \"Benny Hills Memorial\"\nt.save\n",
339
+ "T = Zombie.where(1)\nputs t.name\n",
340
+ "t= \nt.Name=\"Hello\"\nt.Graveyard=\"yes\"\nt.save",
341
+ "t=Zombie.find(3)\nt.Zombie = \"pucho\"",
342
+ "T=Zombie[1]\n",
343
+ "Ticket = Tweet.find(1)",
344
+ "Tweet = new Tweet;\na = Tweet.find(1);\n",
345
+ "Tweet = new Tweet\nt = Tweet.where(:id => 1)\n",
346
+ "Tweet = t\nt.zombie = 1",
347
+ "Tweet.find(1)\nZombie1 = tweet(1)",
348
+ "Tweet=id1\n",
349
+ "UPDATE Zombies\nSET name='vijay',graveyard='Ahmedabad'\nWhere Id='2';\n",
350
+ "w = Weapon.create(:name => \"Punto\", :Zombie => z)\nash = Zombie.find(1)",
351
+ "z = ID=1",
352
+ "Z = Zombie.find(1)\n",
353
+ "z = Zombie.find(1)\nWeapon.where( :Zombie => z )",
354
+ "z = Zombie.find(1)\nZombie1 = z.name",
355
+ "Z = Zombie.find(1)\n\n\n\n\n",
356
+ "Z = Zombie.find(3)",
357
+ "Z = zombie.id(1)",
358
+ "z = Zombie.new\nz.name = \"Charly\"\nz.Graveyard = \"EL carlos\"",
359
+ "Z=Zombie.new\nz.find(1)",
360
+ "Zombie = new Zombie",
361
+ "Zombie = Tweet.find(1)",
362
+ "Zombie = Zombie.find(Weapons.find(:zombie_id))",
363
+ "Zombie = Zombie.find[1]",
364
+ "Zombie = Zombies.find(1)",
365
+ "Zombie3=Zombie.find(3)\nZombie3.graveyard = \"Benny Hills Memorial\"\nZombie3.save",
366
+ "Zombies = '123456'",
367
+ "Zombies = id \nZombies.create( :name=>\"roger\" )",
368
+ "Zombies = Zombies.find(1)\nput Zombies",
369
+ "Zombies = {:Ash => \"Glen Haven mernorial Cemetary\"}\nvar = Zombies.find(1)\nvar.save\n\n",
370
+ "Zombies = {:name => [\"Ash\", \"Bob\", \"Jim\"], :graveyard => [\"Glen Haven Memorial Cemetary\",\"Chapel Hill Cemetary\",\"My Fathers Basement\"] }\na = z.find(1)",
371
+ "Zombies = {\n :id => 1 }\nt = zombie.find(1)",
372
+ "Zombies.find(1)\nputs Zombies.find(1)\nZ=Zombies.find(1)\nZ.lat=[:id]\nz.save\nz\n",
373
+ "zoombieID = table.find(1)\n",
374
+ 'class << Zombie; self; end',
375
+ 'myZombie = Tweet.find(1)',
376
+ 'Zombie.create(:name => "Whoa. A Green String")',
377
+ 'Zombie.create(name: "Fal", graveyard: "fail")',
378
+ ].each do |good|
379
+ it "allows #{good.inspect}" do
380
+ should allow(good)
381
+ end
382
+ end
383
+
384
+ [
385
+ "Class",
386
+ "def show\n @zombie = Zombie.find(params[:id])\n\n respond_to do |format|\n `ls`\n end\nend\n",
387
+ "Module.delete(3)",
388
+ "Module.find(\"Ash\")",
389
+ "require 'tweet'\nt = Tweet.find(1)",
390
+ "require 'Tweet'\nTweet.find(2).name\n",
391
+ "require \"tempfile\"\nt = Zombies.new('Zombies')\nZombies.where(:id => 1)\nt.save",
392
+ "system('ls')",
393
+ "t = Zombies.open()",
394
+ "Tweet.find(1)\nDim var as String\nvar=Tweet.name",
395
+ "Zombie.load(1)\n\n",
396
+ "`echo 1`",
397
+ "`ls -l`",
398
+ "`ps ax`\n",
399
+ "`uname -a`",
400
+ 'const_get',
401
+ 'const_get()'
402
+ ].each do |bad|
403
+ it "does not allow #{bad.inspect}" do
404
+ should_not allow(bad)
405
+ end
406
+ end
407
+ end
408
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_cop
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -14,7 +14,7 @@ date: 2012-02-20 00:00:00.000000000Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: geminabox
17
- requirement: &70324209695840 !ruby/object:Gem::Requirement
17
+ requirement: &70301443701120 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70324209695840
25
+ version_requirements: *70301443701120
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rspec
28
- requirement: &70324209695340 !ruby/object:Gem::Requirement
28
+ requirement: &70301443700620 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: 2.3.0
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70324209695340
36
+ version_requirements: *70301443700620
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: yard
39
- requirement: &70324209694920 !ruby/object:Gem::Requirement
39
+ requirement: &70301443700200 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *70324209694920
47
+ version_requirements: *70301443700200
48
48
  description: Statically analyze Ruby and neutralize nefarious code
49
49
  email:
50
50
  - dray@envylabs.com
@@ -58,6 +58,7 @@ files:
58
58
  - README.md
59
59
  - Rakefile
60
60
  - lib/ruby_cop.rb
61
+ - lib/ruby_cop/analyzer.rb
61
62
  - lib/ruby_cop/gray_list.rb
62
63
  - lib/ruby_cop/node_builder.rb
63
64
  - lib/ruby_cop/policy.rb
@@ -84,16 +85,16 @@ files:
84
85
  - lib/ruby_cop/ruby/string.rb
85
86
  - lib/ruby_cop/ruby/tokens.rb
86
87
  - lib/ruby_cop/ruby/variables.rb
87
- - lib/ruby_cop/ruby/version.rb
88
88
  - lib/ruby_cop/ruby/while.rb
89
89
  - lib/ruby_cop/version.rb
90
90
  - ruby_cop.gemspec
91
91
  - spec/analyzer/node_builder_spec.rb
92
92
  - spec/analyzer/policy_spec.rb
93
+ - spec/policy_spec.rb
93
94
  - spec/spec_helper.rb
94
95
  - tasks/rspec.rake
95
96
  - tasks/yard.rake
96
- homepage: ''
97
+ homepage: https://github.com/envylabs/RubyCop
97
98
  licenses: []
98
99
  post_install_message:
99
100
  rdoc_options: []
@@ -113,11 +114,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
114
  version: '0'
114
115
  requirements: []
115
116
  rubyforge_project: ruby_cop
116
- rubygems_version: 1.8.15
117
+ rubygems_version: 1.8.17
117
118
  signing_key:
118
119
  specification_version: 3
119
120
  summary: Statically analyze Ruby and neutralize nefarious code
120
121
  test_files:
121
122
  - spec/analyzer/node_builder_spec.rb
122
123
  - spec/analyzer/policy_spec.rb
124
+ - spec/policy_spec.rb
123
125
  - spec/spec_helper.rb
@@ -1,3 +0,0 @@
1
- module RubyCop
2
- VERSION = "1.0.0"
3
- end