witch_doctor 0.0.3

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 (56) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +115 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/witch_doctor/application_controller.rb +4 -0
  6. data/app/controllers/witch_doctor/virus_scans_controller.rb +60 -0
  7. data/app/helpers/witch_doctor/application_helper.rb +15 -0
  8. data/app/models/virus_scan.rb +41 -0
  9. data/config/routes.rb +3 -0
  10. data/db/migrate/20150209121818_create_witch_doctor_virus_scans.rb +19 -0
  11. data/lib/tasks/witch_doctor_tasks.rake +4 -0
  12. data/lib/witch_doctor.rb +6 -0
  13. data/lib/witch_doctor/antivirus.rb +36 -0
  14. data/lib/witch_doctor/antivirus_concern.rb +32 -0
  15. data/lib/witch_doctor/engine.rb +11 -0
  16. data/lib/witch_doctor/version.rb +3 -0
  17. data/spec/controllers/virus_scans_controller_spec.rb +145 -0
  18. data/spec/dummy/README.rdoc +261 -0
  19. data/spec/dummy/Rakefile +7 -0
  20. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  21. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  22. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  23. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  24. data/spec/dummy/app/models/document.rb +11 -0
  25. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  26. data/spec/dummy/config.ru +4 -0
  27. data/spec/dummy/config/application.rb +59 -0
  28. data/spec/dummy/config/boot.rb +10 -0
  29. data/spec/dummy/config/database.yml +25 -0
  30. data/spec/dummy/config/environment.rb +5 -0
  31. data/spec/dummy/config/environments/development.rb +37 -0
  32. data/spec/dummy/config/environments/production.rb +67 -0
  33. data/spec/dummy/config/environments/test.rb +37 -0
  34. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  35. data/spec/dummy/config/initializers/inflections.rb +15 -0
  36. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  37. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  38. data/spec/dummy/config/initializers/session_store.rb +8 -0
  39. data/spec/dummy/config/initializers/witch_doctor.rb +1 -0
  40. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  41. data/spec/dummy/config/locales/en.yml +5 -0
  42. data/spec/dummy/config/routes.rb +3 -0
  43. data/spec/dummy/db/migrate/20150209121125_create_document.rb +10 -0
  44. data/spec/dummy/db/schema.rb +33 -0
  45. data/spec/dummy/public/404.html +26 -0
  46. data/spec/dummy/public/422.html +26 -0
  47. data/spec/dummy/public/500.html +25 -0
  48. data/spec/dummy/public/favicon.ico +0 -0
  49. data/spec/dummy/script/rails +6 -0
  50. data/spec/factories/witch_doctor_documents.rb +5 -0
  51. data/spec/factories/witch_doctor_virus_scans.rb +10 -0
  52. data/spec/helpers/application_helper_spec.rb +39 -0
  53. data/spec/lib/antivirus_spec.rb +58 -0
  54. data/spec/models/virus_scan_spec.rb +52 -0
  55. data/spec/spec_helper.rb +42 -0
  56. metadata +249 -0
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>The change you wanted was rejected (422)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/422.html -->
21
+ <div class="dialog">
22
+ <h1>The change you wanted was rejected.</h1>
23
+ <p>Maybe you tried to change something you didn't have access to.</p>
24
+ </div>
25
+ </body>
26
+ </html>
@@ -0,0 +1,25 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>We're sorry, but something went wrong (500)</title>
5
+ <style type="text/css">
6
+ body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
7
+ div.dialog {
8
+ width: 25em;
9
+ padding: 0 4em;
10
+ margin: 4em auto 0 auto;
11
+ border: 1px solid #ccc;
12
+ border-right-color: #999;
13
+ border-bottom-color: #999;
14
+ }
15
+ h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <!-- This file lives in public/500.html -->
21
+ <div class="dialog">
22
+ <h1>We're sorry, but something went wrong.</h1>
23
+ </div>
24
+ </body>
25
+ </html>
File without changes
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ APP_PATH = File.expand_path('../../config/application', __FILE__)
5
+ require File.expand_path('../../config/boot', __FILE__)
6
+ require 'rails/commands'
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :document do
3
+
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ FactoryGirl.define do
2
+ factory :virus_scan do
3
+ association :resource, factory: :document
4
+ mount_point 'attachment'
5
+
6
+ trait :clean do
7
+ scan_result 'Clean'
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe WitchDoctor::ApplicationHelper, type: :helper do
4
+ describe '#antivirus' do
5
+ subject { antivirus(resource, :attachment) { link_to 'abc', 'http://abc.test'} }
6
+
7
+ let(:resource) {
8
+ build(:document)
9
+ .tap { |document|
10
+ document.virus_scans.new(scan_result: scan_resault, mount_point: 'attachment')
11
+ }
12
+ }
13
+
14
+ context 'when not checked' do
15
+ let(:scan_resault) { nil }
16
+
17
+ it { expect(subject).to have_content 'File waiting for Antivirus check' }
18
+ end
19
+
20
+ context 'when clean' do
21
+ let(:scan_resault) { 'Clean' }
22
+
23
+ it { expect(subject).to have_content 'abc' }
24
+ it { expect(subject).to have_selector 'a[href="http://abc.test"]' }
25
+ end
26
+
27
+ context 'when infected' do
28
+ let(:scan_resault) { 'VirusInfected' }
29
+ it { expect(subject).to have_content 'File Contains Virus' }
30
+ end
31
+
32
+ context 'when error' do
33
+ let(:scan_resault) { 'FileDownloadError' }
34
+ it { expect(subject).to have_content "Antivirus scan couldn't be completed" }
35
+ end
36
+ end
37
+ end
38
+
39
+
@@ -0,0 +1,58 @@
1
+ require 'rspec/matchers'
2
+ require 'ostruct'
3
+ require_relative '../../lib/witch_doctor/antivirus'
4
+ RSpec.describe WitchDoctor::Antivirus do
5
+ subject { described_class.new(resource, :avatar) }
6
+ let(:resource) { double virus_scans: [virus_scan] }
7
+
8
+ context "when unchecked resource" do
9
+ let(:virus_scan) { double scan_result: nil, scanned_at: nil, mount_point: 'avatar' }
10
+
11
+ it { expect(subject.checked?).to be false }
12
+ it { expect { subject.infected? } .to throw_symbol(:file_not_scanned) }
13
+ it { expect { subject.clean? } .to throw_symbol(:file_not_scanned) }
14
+ it { expect { subject.error? } .to throw_symbol(:file_not_scanned) }
15
+
16
+ context 'along different mont point virus scan' do
17
+ let(:virus_scan2) { double scan_result: 'Clean', scanned_at: Time.now - 3600, mount_point: 'different'}
18
+ let(:resource) { double virus_scans: [virus_scan2, virus_scan, virus_scan2] }
19
+
20
+ it { expect(subject.checked?).to be false }
21
+ end
22
+ end
23
+
24
+ context "when checked clean resource" do
25
+ let(:virus_scan) { double scan_result: 'Clean', scanned_at: Time.now - 3600, mount_point: 'avatar'}
26
+
27
+ it { expect(subject.checked?).to be true }
28
+ it { expect(subject.infected?).to be false }
29
+ it { expect(subject.clean?).to be true }
30
+ it { expect(subject.error?).to be false }
31
+ end
32
+
33
+ context "when checked with dowload error" do
34
+ let(:virus_scan) { double scan_result: 'FileDownloadError', scanned_at: Time.now - 3600, mount_point: 'avatar'}
35
+
36
+ it { expect(subject.checked?).to be true }
37
+ it { expect(subject.infected?).to be false }
38
+ it { expect(subject.clean?).to be false }
39
+ it { expect(subject.error?).to be true }
40
+ end
41
+
42
+ context "when checked with virus resource" do
43
+ let(:virus_scan) { double scan_result: 'VirusInfected', scanned_at: Time.now - 3600, mount_point: 'avatar' }
44
+
45
+ it { expect(subject.checked?).to be true }
46
+ it { expect(subject.infected?).to be true }
47
+ it { expect(subject.clean?).to be false }
48
+ it { expect(subject.error?).to be false }
49
+
50
+ context 'along different mont point virus scan' do
51
+ let(:virus_scan2) { double scan_result: 'Clean', scanned_at: Time.now - 3600, mount_point: 'different'}
52
+ let(:resource) { double virus_scans: [virus_scan2, virus_scan, virus_scan2] }
53
+
54
+ it { expect(subject.infected?).to be true }
55
+ it { expect(subject.clean?).to be false }
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe VirusScan do
4
+ describe '#scanned_at' do
5
+ let!(:virus_scan) { create :virus_scan }
6
+
7
+ context 'after updating record with scan results' do
8
+ before { virus_scan.update_attributes({scan_result: 'Clean'}, as: :scan_update ) }
9
+
10
+ it 'should be generate' do
11
+ expect(virus_scan.scanned_at).not_to be nil
12
+ expect(virus_scan.scanned_at).to be_within(20.seconds).of(Time.now)
13
+ end
14
+ end
15
+
16
+ context 'after updating record not related to scan result' do
17
+ before { virus_scan.update_attributes({scan_result: nil} ) }
18
+
19
+ it 'should be generate' do
20
+ expect(virus_scan.scanned_at).to be nil
21
+ end
22
+ end
23
+ end
24
+
25
+ describe '.not_scanned' do
26
+ let!(:clean) { create :virus_scan, scan_result: 'Clean' }
27
+ let!(:not_scanned) { create :virus_scan, scan_result: nil }
28
+
29
+ it do
30
+ expect(VirusScan.not_scanned).to include not_scanned
31
+ expect(VirusScan.not_scanned).not_to include clean
32
+ end
33
+ end
34
+
35
+ describe "as_json" do
36
+ let(:document) { create :document, attachment: 'blank_pdf.pdf' }
37
+ let(:virus_scan) {
38
+ build_stubbed :virus_scan,
39
+ scan_result: nil,
40
+ mount_point: 'attachment',
41
+ resource: document
42
+ }
43
+
44
+ it do
45
+ expect(virus_scan.as_json['id']).to eq virus_scan.id
46
+ expect(virus_scan.as_json['scan_result']).to be nil
47
+ expect(virus_scan.as_json['file_url'])
48
+ .to match("https://my-s3-bucket.dummy/uploads/documents/blank_pdf.pdf")
49
+ expect(virus_scan.as_json['scanned_at']).to be nil
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,42 @@
1
+ ENV["RAILS_ENV"] ||= "test"
2
+
3
+ require "codeclimate-test-reporter"
4
+ CodeClimate::TestReporter.start
5
+
6
+ require File.expand_path("../dummy/config/environment.rb", __FILE__)
7
+ require 'rspec/rails'
8
+ require 'database_cleaner'
9
+ require 'factory_girl_rails'
10
+
11
+ unless FactoryGirl.factories.registered?(:document)
12
+ # this is not needed when running `rspec spec` but
13
+ # due to rake changing context of appliction when you
14
+ # run `rake test` factories are not found corectly.
15
+ # This ensures factories are registered
16
+ ENGINE_RAILS_ROOT=File.join(File.dirname(__FILE__), '../')
17
+ Dir[File.join(ENGINE_RAILS_ROOT, "spec/factories/**/*.rb")].each {|f| require f }
18
+ end
19
+
20
+
21
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
22
+
23
+ RSpec.configure do |config|
24
+ config.mock_with :rspec
25
+ config.use_transactional_fixtures = true
26
+ config.infer_base_class_for_anonymous_controllers = false
27
+ config.order = "random"
28
+ config.include FactoryGirl::Syntax::Methods
29
+
30
+ config.before :each do
31
+ DatabaseCleaner.strategy = :deletion
32
+ DatabaseCleaner.start
33
+ end
34
+
35
+ config.after :each do
36
+ DatabaseCleaner.clean
37
+ end
38
+ end
39
+
40
+ # test-unit gem (required by Rails 3) has nasty habit executing itsef automaticly
41
+ # after rspec is done
42
+ Test::Unit::AutoRunner.need_auto_run = false if defined?(Test::Unit::AutoRunner)
metadata ADDED
@@ -0,0 +1,249 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: witch_doctor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Tomas Valent
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: sqlite3
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec-rails
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: capybara
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 2.4.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 2.4.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: factory_girl_rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '4.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '4.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: database_cleaner
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.7'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: codeclimate-test-reporter
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: test-unit
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ description: Rails engine that provides simple API so that external antivirus script
126
+ can pull down files that need to be scanned and update their results.
127
+ email:
128
+ - equivalent@eq8.eu
129
+ executables: []
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - MIT-LICENSE
134
+ - README.md
135
+ - Rakefile
136
+ - app/controllers/witch_doctor/application_controller.rb
137
+ - app/controllers/witch_doctor/virus_scans_controller.rb
138
+ - app/helpers/witch_doctor/application_helper.rb
139
+ - app/models/virus_scan.rb
140
+ - config/routes.rb
141
+ - db/migrate/20150209121818_create_witch_doctor_virus_scans.rb
142
+ - lib/tasks/witch_doctor_tasks.rake
143
+ - lib/witch_doctor.rb
144
+ - lib/witch_doctor/antivirus.rb
145
+ - lib/witch_doctor/antivirus_concern.rb
146
+ - lib/witch_doctor/engine.rb
147
+ - lib/witch_doctor/version.rb
148
+ - spec/controllers/virus_scans_controller_spec.rb
149
+ - spec/dummy/README.rdoc
150
+ - spec/dummy/Rakefile
151
+ - spec/dummy/app/assets/javascripts/application.js
152
+ - spec/dummy/app/assets/stylesheets/application.css
153
+ - spec/dummy/app/controllers/application_controller.rb
154
+ - spec/dummy/app/helpers/application_helper.rb
155
+ - spec/dummy/app/models/document.rb
156
+ - spec/dummy/app/views/layouts/application.html.erb
157
+ - spec/dummy/config.ru
158
+ - spec/dummy/config/application.rb
159
+ - spec/dummy/config/boot.rb
160
+ - spec/dummy/config/database.yml
161
+ - spec/dummy/config/environment.rb
162
+ - spec/dummy/config/environments/development.rb
163
+ - spec/dummy/config/environments/production.rb
164
+ - spec/dummy/config/environments/test.rb
165
+ - spec/dummy/config/initializers/backtrace_silencers.rb
166
+ - spec/dummy/config/initializers/inflections.rb
167
+ - spec/dummy/config/initializers/mime_types.rb
168
+ - spec/dummy/config/initializers/secret_token.rb
169
+ - spec/dummy/config/initializers/session_store.rb
170
+ - spec/dummy/config/initializers/witch_doctor.rb
171
+ - spec/dummy/config/initializers/wrap_parameters.rb
172
+ - spec/dummy/config/locales/en.yml
173
+ - spec/dummy/config/routes.rb
174
+ - spec/dummy/db/migrate/20150209121125_create_document.rb
175
+ - spec/dummy/db/schema.rb
176
+ - spec/dummy/public/404.html
177
+ - spec/dummy/public/422.html
178
+ - spec/dummy/public/500.html
179
+ - spec/dummy/public/favicon.ico
180
+ - spec/dummy/script/rails
181
+ - spec/factories/witch_doctor_documents.rb
182
+ - spec/factories/witch_doctor_virus_scans.rb
183
+ - spec/helpers/application_helper_spec.rb
184
+ - spec/lib/antivirus_spec.rb
185
+ - spec/models/virus_scan_spec.rb
186
+ - spec/spec_helper.rb
187
+ homepage: https://github.com/equivalent/witch_doctor
188
+ licenses: []
189
+ metadata: {}
190
+ post_install_message:
191
+ rdoc_options: []
192
+ require_paths:
193
+ - lib
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ required_rubygems_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ requirements: []
205
+ rubyforge_project:
206
+ rubygems_version: 2.4.3
207
+ signing_key:
208
+ specification_version: 4
209
+ summary: Rails engine for virus scaning
210
+ test_files:
211
+ - spec/controllers/virus_scans_controller_spec.rb
212
+ - spec/spec_helper.rb
213
+ - spec/dummy/app/controllers/application_controller.rb
214
+ - spec/dummy/app/views/layouts/application.html.erb
215
+ - spec/dummy/app/models/document.rb
216
+ - spec/dummy/app/assets/javascripts/application.js
217
+ - spec/dummy/app/assets/stylesheets/application.css
218
+ - spec/dummy/app/helpers/application_helper.rb
219
+ - spec/dummy/Rakefile
220
+ - spec/dummy/README.rdoc
221
+ - spec/dummy/config/locales/en.yml
222
+ - spec/dummy/config/application.rb
223
+ - spec/dummy/config/database.yml
224
+ - spec/dummy/config/environments/development.rb
225
+ - spec/dummy/config/environments/test.rb
226
+ - spec/dummy/config/environments/production.rb
227
+ - spec/dummy/config/routes.rb
228
+ - spec/dummy/config/environment.rb
229
+ - spec/dummy/config/boot.rb
230
+ - spec/dummy/config/initializers/inflections.rb
231
+ - spec/dummy/config/initializers/secret_token.rb
232
+ - spec/dummy/config/initializers/witch_doctor.rb
233
+ - spec/dummy/config/initializers/mime_types.rb
234
+ - spec/dummy/config/initializers/session_store.rb
235
+ - spec/dummy/config/initializers/wrap_parameters.rb
236
+ - spec/dummy/config/initializers/backtrace_silencers.rb
237
+ - spec/dummy/config.ru
238
+ - spec/dummy/db/schema.rb
239
+ - spec/dummy/db/migrate/20150209121125_create_document.rb
240
+ - spec/dummy/script/rails
241
+ - spec/dummy/public/500.html
242
+ - spec/dummy/public/422.html
243
+ - spec/dummy/public/favicon.ico
244
+ - spec/dummy/public/404.html
245
+ - spec/models/virus_scan_spec.rb
246
+ - spec/factories/witch_doctor_virus_scans.rb
247
+ - spec/factories/witch_doctor_documents.rb
248
+ - spec/lib/antivirus_spec.rb
249
+ - spec/helpers/application_helper_spec.rb