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 ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in image_finder.gemspec
4
+ gemspec
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,11 @@
1
+ require 'yaml'
2
+
3
+ module ImageFinder
4
+ module Helpers
5
+ module GetImageFields
6
+ def get_image_fields model_name
7
+ YAML.load_file(File.join File.dirname(__FILE__), '..', '..', PAPERCLIP_FILE_NAME)[model_name]
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module ImageFinder
2
+ module Helpers
3
+ module GetImagePath
4
+ def get_image_path object, field, style
5
+ object.send(field).path style
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,11 @@
1
+ require 'active_support/core_ext'
2
+
3
+ module ImageFinder
4
+ module Helpers
5
+ module GetKlass
6
+ def get_klass name
7
+ name.to_s.camelize.constantize
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,8 @@
1
+ require 'image_finder/helpers/get_klass'
2
+ require 'image_finder/helpers/get_image_fields'
3
+ require 'image_finder/helpers/get_image_path'
4
+
5
+ module ImageFinder
6
+ module Helpers
7
+ end
8
+ 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
@@ -0,0 +1,3 @@
1
+ module ImageFinder
2
+ VERSION = "0.0.1.beta"
3
+ end
@@ -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: