image_finder 0.0.1.beta
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.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Rakefile +1 -0
- data/image_finder.gemspec +27 -0
- data/lib/image_finder/crawler.rb +44 -0
- data/lib/image_finder/handler.rb +30 -0
- data/lib/image_finder/helpers/get_image_fields.rb +11 -0
- data/lib/image_finder/helpers/get_image_path.rb +9 -0
- data/lib/image_finder/helpers/get_klass.rb +11 -0
- data/lib/image_finder/helpers.rb +8 -0
- data/lib/image_finder/logger.rb +63 -0
- data/lib/image_finder/version.rb +3 -0
- data/lib/image_finder.rb +38 -0
- data/lib/paperclip_fields.yml +57 -0
- metadata +82 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "image_finder/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "image_finder"
|
7
|
+
s.version = ImageFinder::VERSION
|
8
|
+
s.authors = ["psylone"]
|
9
|
+
s.email = ["spaceflow@gmail.com"]
|
10
|
+
s.homepage = ""
|
11
|
+
s.summary = %q{Find corrupted images}
|
12
|
+
s.description = %q{For models with images uploaded by PaperClip You can find corrupted ones}
|
13
|
+
|
14
|
+
s.rubyforge_project = "image_finder"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency('paperclip', '>= 2.3.11')
|
22
|
+
s.add_dependency('activesupport', '>= 3.0.0')
|
23
|
+
|
24
|
+
# specify any dependencies here; for example:
|
25
|
+
# s.add_development_dependency "rspec"
|
26
|
+
# s.add_runtime_dependency "rest-client"
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'logger'
|
2
|
+
|
3
|
+
module ImageFinder
|
4
|
+
class Crawler
|
5
|
+
|
6
|
+
# write_to_original means that corrupted image of :original style and
|
7
|
+
# we can't repair it
|
8
|
+
attr_accessor :write_to_original, :logger
|
9
|
+
|
10
|
+
def initialize model_name, batch_size = 500, start = nil
|
11
|
+
@batch_size = batch_size
|
12
|
+
@start = start
|
13
|
+
@model_name = model_name
|
14
|
+
@fields = get_image_fields @model_name
|
15
|
+
@logger = Logger.new @model_name
|
16
|
+
end
|
17
|
+
|
18
|
+
# Interface
|
19
|
+
|
20
|
+
def find_corrupted
|
21
|
+
klass = get_klass @model_name
|
22
|
+
klass.find_in_batches(batch_size: @batch_size, start: @start) do |group|
|
23
|
+
puts "Processing new objects batch"
|
24
|
+
for object in group
|
25
|
+
image_status object rescue logger.std.write object
|
26
|
+
end
|
27
|
+
puts "Batch was successful processed with last object id = #{object.id} of #{klass_name} class"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def image_status object
|
32
|
+
@fields.each do |field, styles|
|
33
|
+
@write_to_original = false
|
34
|
+
styles.each do |style|
|
35
|
+
next unless object.send "#{field}?" # next if object hasn't image
|
36
|
+
handle object, field, style, use_log: true
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Realization
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ImageFinder
|
2
|
+
module Handler
|
3
|
+
def handle object, field, style, options = {}
|
4
|
+
use_log = options[:use_log] || false
|
5
|
+
path = get_image_path object, field, style
|
6
|
+
status = check_image_consistency path
|
7
|
+
exitcode = $?.exitstatus
|
8
|
+
case [ status, exitcode ]
|
9
|
+
when [ true, 0 ]
|
10
|
+
"Image was successfully open"
|
11
|
+
when [ false, 1 ]
|
12
|
+
return logger.std.write object, field, style unless use_log
|
13
|
+
@write_to_original = true if style == :original
|
14
|
+
if write_to_original
|
15
|
+
logger.corrupted.write object, field, style
|
16
|
+
else
|
17
|
+
logger.recoverable.write object, field, style
|
18
|
+
end
|
19
|
+
when [ false, 127 ]
|
20
|
+
raise "Command not found: #{$?}"
|
21
|
+
else
|
22
|
+
raise "Unknown error type for ImageFinder: #{$?}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def check_image_consistency path
|
27
|
+
system %Q[identify "#{path}" >/dev/null 2>&1]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
module ImageFinder
|
2
|
+
class Logger
|
3
|
+
|
4
|
+
def initialize model_name
|
5
|
+
@corrupted = init_logger model_name, :corrupted
|
6
|
+
@recoverable = init_logger model_name, :recoverable
|
7
|
+
@std = init_logger
|
8
|
+
end
|
9
|
+
|
10
|
+
# Interface
|
11
|
+
|
12
|
+
def write object, field = nil, style = nil
|
13
|
+
@current.warn log_entry(object, field, style)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Need to refactor this horror
|
17
|
+
def corrupted
|
18
|
+
@current = @corrupted
|
19
|
+
self
|
20
|
+
end
|
21
|
+
def recoverable
|
22
|
+
@current = @recoverable
|
23
|
+
self
|
24
|
+
end
|
25
|
+
def std
|
26
|
+
@current = @std
|
27
|
+
self
|
28
|
+
end
|
29
|
+
|
30
|
+
# Realization
|
31
|
+
|
32
|
+
def init_logger model_name = $stdout, type = nil
|
33
|
+
path = logger_path(model_name, type)
|
34
|
+
if path.is_a? Pathname
|
35
|
+
dir = path.dirname
|
36
|
+
FileUtils.mkdir_p dir unless File.exists? dir
|
37
|
+
end
|
38
|
+
::Logger.new path
|
39
|
+
end
|
40
|
+
|
41
|
+
# model_name = STDOUT if type is nil
|
42
|
+
def logger_path model_name, type
|
43
|
+
type == nil ? model_name : base_path.join(model_name.to_s.pluralize, logger_type(type)) # logger_type type sounds bad, need to change it
|
44
|
+
end
|
45
|
+
|
46
|
+
def logger_type type
|
47
|
+
type.to_s.concat '.log'
|
48
|
+
end
|
49
|
+
|
50
|
+
def base_path
|
51
|
+
LogPath.get_path
|
52
|
+
end
|
53
|
+
|
54
|
+
def log_entry object, field, style
|
55
|
+
if field
|
56
|
+
"#{object.class.name}.#{field} was corrupted: {id: #{object.id}, style: #{style}, path: #{get_image_path object, field, style}}"
|
57
|
+
else
|
58
|
+
"RuntimeError (#{$?}): #{object.class.name} = #{object.id}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
data/lib/image_finder.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require "image_finder/version"
|
2
|
+
require "image_finder/crawler"
|
3
|
+
require "image_finder/helpers"
|
4
|
+
require "image_finder/handler"
|
5
|
+
require "image_finder/logger"
|
6
|
+
|
7
|
+
# TODO Maybe it's possible to require entire custom rails application and run ImageFinder from bash
|
8
|
+
|
9
|
+
module ImageFinder
|
10
|
+
class Crawler
|
11
|
+
include Helpers::GetKlass
|
12
|
+
include Helpers::GetImageFields
|
13
|
+
include Helpers::GetImagePath
|
14
|
+
include Handler
|
15
|
+
end
|
16
|
+
|
17
|
+
class Logger
|
18
|
+
include Helpers::GetKlass
|
19
|
+
include Helpers::GetImagePath
|
20
|
+
end
|
21
|
+
|
22
|
+
class LogPath < Rails::Railtie
|
23
|
+
config.after_initialize do
|
24
|
+
LOG_PATH = Rails.root.join '..', '..', 'shared', 'log', 'corrupted_images'
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.get_path
|
28
|
+
LOG_PATH
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
module Helpers
|
33
|
+
module GetImageFields
|
34
|
+
PAPERCLIP_FILE_NAME = 'paperclip_fields.yml'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
@@ -0,0 +1,57 @@
|
|
1
|
+
---
|
2
|
+
:user:
|
3
|
+
:avatar:
|
4
|
+
- :original
|
5
|
+
- :small
|
6
|
+
- :mini
|
7
|
+
- :thumb
|
8
|
+
:logo_company_1:
|
9
|
+
- :original
|
10
|
+
- :normal
|
11
|
+
:logo_company_2:
|
12
|
+
- :original
|
13
|
+
- :normal
|
14
|
+
:logo_company_3:
|
15
|
+
- :original
|
16
|
+
- :normal
|
17
|
+
:clan:
|
18
|
+
:avatar:
|
19
|
+
- :original
|
20
|
+
- :small
|
21
|
+
- :mini
|
22
|
+
- :thumb
|
23
|
+
:calendar_event:
|
24
|
+
:logo:
|
25
|
+
- :original
|
26
|
+
- :thumb
|
27
|
+
- :small
|
28
|
+
:game:
|
29
|
+
:logo:
|
30
|
+
- :original
|
31
|
+
- :thumb
|
32
|
+
:logo_company_1:
|
33
|
+
- :original
|
34
|
+
- :small
|
35
|
+
- :mini
|
36
|
+
- :thumb
|
37
|
+
:logo_company_2:
|
38
|
+
- :original
|
39
|
+
- :small
|
40
|
+
- :mini
|
41
|
+
- :thumb
|
42
|
+
:top:
|
43
|
+
- :original
|
44
|
+
:toptop:
|
45
|
+
- :original
|
46
|
+
:center:
|
47
|
+
- :original
|
48
|
+
:bottom:
|
49
|
+
- :original
|
50
|
+
:center_clear:
|
51
|
+
- :original
|
52
|
+
:attached_image:
|
53
|
+
:image:
|
54
|
+
- :original
|
55
|
+
- :small
|
56
|
+
- :thumb
|
57
|
+
- :normal
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: image_finder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1.beta
|
5
|
+
prerelease: 6
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- psylone
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-04-20 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: paperclip
|
16
|
+
requirement: &79778290 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.3.11
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *79778290
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: activesupport
|
27
|
+
requirement: &79777910 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.0.0
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *79777910
|
36
|
+
description: For models with images uploaded by PaperClip You can find corrupted ones
|
37
|
+
email:
|
38
|
+
- spaceflow@gmail.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- Rakefile
|
46
|
+
- image_finder.gemspec
|
47
|
+
- lib/image_finder.rb
|
48
|
+
- lib/image_finder/crawler.rb
|
49
|
+
- lib/image_finder/handler.rb
|
50
|
+
- lib/image_finder/helpers.rb
|
51
|
+
- lib/image_finder/helpers/get_image_fields.rb
|
52
|
+
- lib/image_finder/helpers/get_image_path.rb
|
53
|
+
- lib/image_finder/helpers/get_klass.rb
|
54
|
+
- lib/image_finder/logger.rb
|
55
|
+
- lib/image_finder/version.rb
|
56
|
+
- lib/paperclip_fields.yml
|
57
|
+
homepage: ''
|
58
|
+
licenses: []
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options: []
|
61
|
+
require_paths:
|
62
|
+
- lib
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ! '>'
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 1.3.1
|
75
|
+
requirements: []
|
76
|
+
rubyforge_project: image_finder
|
77
|
+
rubygems_version: 1.8.15
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Find corrupted images
|
81
|
+
test_files: []
|
82
|
+
has_rdoc:
|