dynamic_image 1.0.4 → 2.0.0.beta1
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.
- checksums.yaml +7 -0
- data/{LICENSE → MIT-LICENSE} +1 -1
- data/README.md +57 -80
- data/Rakefile +7 -30
- data/lib/dynamic_image/belongs_to.rb +22 -0
- data/lib/dynamic_image/controller.rb +94 -0
- data/lib/dynamic_image/digest_verifier.rb +62 -0
- data/lib/dynamic_image/errors.rb +10 -0
- data/lib/dynamic_image/helper.rb +139 -85
- data/lib/dynamic_image/image_sizing.rb +156 -0
- data/lib/dynamic_image/metadata.rb +84 -0
- data/lib/dynamic_image/model/dimensions.rb +95 -0
- data/lib/dynamic_image/model/validations.rb +94 -0
- data/lib/dynamic_image/model.rb +130 -0
- data/lib/dynamic_image/processed_image.rb +119 -0
- data/lib/dynamic_image/railtie.rb +18 -0
- data/lib/dynamic_image/routing.rb +24 -0
- data/lib/dynamic_image/version.rb +5 -0
- data/lib/dynamic_image.rb +14 -71
- data/lib/rails/generators/dynamic_image/resource/resource_generator.rb +74 -0
- metadata +130 -97
- data/VERSION +0 -1
- data/app/controllers/images_controller.rb +0 -79
- data/app/models/image.rb +0 -188
- data/config/routes.rb +0 -16
- data/dynamic_image.gemspec +0 -62
- data/dynamic_image.sublime-project +0 -9
- data/dynamic_image.sublime-workspace +0 -1599
- data/init.rb +0 -1
- data/install.rb +0 -1
- data/lib/binary_storage/active_record_extensions.rb +0 -144
- data/lib/binary_storage/blob.rb +0 -104
- data/lib/binary_storage.rb +0 -28
- data/lib/dynamic_image/active_record_extensions.rb +0 -60
- data/lib/dynamic_image/engine.rb +0 -6
- data/lib/dynamic_image/filterset.rb +0 -79
- data/lib/generators/dynamic_image/USAGE +0 -5
- data/lib/generators/dynamic_image/dynamic_image_generator.rb +0 -38
- data/lib/generators/dynamic_image/templates/migrations/create_images.rb +0 -21
- data/uninstall.rb +0 -1
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module DynamicImage
|
4
|
+
# = DynamicImage Routing
|
5
|
+
#
|
6
|
+
# Extends +ActionDispatch::Routing::Mapper+ and provides a shortcut for
|
7
|
+
# defining routes for +DynamicImage::Controller+.
|
8
|
+
module Routing
|
9
|
+
# Declares an image resource.
|
10
|
+
#
|
11
|
+
# image_resources :avatars
|
12
|
+
def image_resources(resource_name, options={})
|
13
|
+
options = {
|
14
|
+
path: "#{resource_name}/:digest(/:size)",
|
15
|
+
constraints: { size: /\d+x\d+/ },
|
16
|
+
only: [:show]
|
17
|
+
}.merge(options)
|
18
|
+
resources resource_name, options do
|
19
|
+
get :uncropped, on: :member
|
20
|
+
get :original, on: :member
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/dynamic_image.rb
CHANGED
@@ -1,78 +1,21 @@
|
|
1
|
-
|
2
|
-
require 'digest/sha1'
|
3
|
-
require 'open-uri'
|
1
|
+
# encoding: utf-8
|
4
2
|
|
5
|
-
|
6
|
-
require '
|
3
|
+
require 'mini_magick'
|
4
|
+
require 'dis'
|
7
5
|
require 'vector2d'
|
8
|
-
require 'rails'
|
9
|
-
require 'action_controller'
|
10
|
-
require 'active_support'
|
11
|
-
require 'active_record'
|
12
6
|
|
13
|
-
require '
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
require 'dynamic_image/engine' if defined?(Rails)
|
18
|
-
end
|
19
|
-
|
20
|
-
require 'dynamic_image/active_record_extensions'
|
21
|
-
require 'dynamic_image/filterset'
|
7
|
+
require 'dynamic_image/belongs_to'
|
8
|
+
require 'dynamic_image/controller'
|
9
|
+
require 'dynamic_image/digest_verifier'
|
10
|
+
require 'dynamic_image/errors'
|
22
11
|
require 'dynamic_image/helper'
|
12
|
+
require 'dynamic_image/image_sizing'
|
13
|
+
require 'dynamic_image/metadata'
|
14
|
+
require 'dynamic_image/model'
|
15
|
+
require 'dynamic_image/processed_image'
|
16
|
+
require 'dynamic_image/railtie'
|
17
|
+
require 'dynamic_image/routing'
|
23
18
|
|
24
19
|
module DynamicImage
|
25
|
-
|
26
|
-
@@page_caching = true
|
27
|
-
|
28
|
-
class << self
|
29
|
-
|
30
|
-
def dirty_memory=(flag)
|
31
|
-
@@dirty_memory = flag
|
32
|
-
end
|
33
|
-
|
34
|
-
def dirty_memory
|
35
|
-
@@dirty_memory
|
36
|
-
end
|
37
|
-
|
38
|
-
def page_caching=(flag)
|
39
|
-
@@page_caching = flag
|
40
|
-
end
|
41
|
-
|
42
|
-
def page_caching
|
43
|
-
@@page_caching
|
44
|
-
end
|
45
|
-
|
46
|
-
def max_size
|
47
|
-
@@max_size ||= "2000x2000"
|
48
|
-
end
|
49
|
-
|
50
|
-
def max_size=(new_max_size)
|
51
|
-
@@max_size = new_max_size
|
52
|
-
end
|
53
|
-
|
54
|
-
def crash_size
|
55
|
-
@@crash_size ||= "10000x10000"
|
56
|
-
end
|
57
|
-
|
58
|
-
def crash_size=(new_crash_size)
|
59
|
-
@@crash_size = new_crash_size
|
60
|
-
end
|
61
|
-
|
62
|
-
# RMagick stores image data internally, Ruby doesn't see the used memory.
|
63
|
-
# This method performs garbage collection if @@dirty_memory has been flagged.
|
64
|
-
# More details here: http://rubyforge.org/forum/message.php?msg_id=1995
|
65
|
-
def clean_dirty_memory(options={})
|
66
|
-
options.symbolize_keys!
|
67
|
-
if @@dirty_memory || options[:force]
|
68
|
-
gc_disabled = GC.enable
|
69
|
-
GC.start
|
70
|
-
GC.disable if gc_disabled
|
71
|
-
@@dirty_memory = false
|
72
|
-
true
|
73
|
-
else
|
74
|
-
false
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
20
|
+
cattr_accessor :digest_verifier
|
78
21
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rails/generators'
|
4
|
+
require 'rails/generators/rails/resource/resource_generator'
|
5
|
+
|
6
|
+
module DynamicImage
|
7
|
+
module Generators
|
8
|
+
class ResourceGenerator < Rails::Generators::ResourceGenerator
|
9
|
+
desc "Creates a DynamicImage resource"
|
10
|
+
|
11
|
+
def initialize(args, *options)
|
12
|
+
super(inject_dynamic_image_attributes(args), *options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_controller_extension
|
16
|
+
inject_into_file(
|
17
|
+
File.join('app/controllers', class_path, "#{file_name.pluralize}_controller.rb"),
|
18
|
+
after: "ApplicationController\n"
|
19
|
+
) do
|
20
|
+
" include DynamicImage::Controller\n\n" +
|
21
|
+
" private\n\n" +
|
22
|
+
" def model\n" +
|
23
|
+
" #{class_name}\n" +
|
24
|
+
" end\n"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_model_extension
|
29
|
+
inject_into_file(
|
30
|
+
File.join('app/models', class_path, "#{file_name}.rb"),
|
31
|
+
after: "ActiveRecord::Base\n"
|
32
|
+
) do
|
33
|
+
" include DynamicImage::Model\n"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def alter_resource_routes
|
38
|
+
gsub_file(
|
39
|
+
File.join('config', 'routes.rb'),
|
40
|
+
" resources :#{file_name.pluralize}",
|
41
|
+
" image_resources :#{file_name.pluralize}"
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def inject_dynamic_image_attributes(args)
|
48
|
+
if args.any?
|
49
|
+
args = [args[0]] + dynamic_image_attributes + args[1..args.length]
|
50
|
+
else
|
51
|
+
args
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def dynamic_image_attributes
|
56
|
+
%w{
|
57
|
+
content_hash:string
|
58
|
+
content_type:string
|
59
|
+
content_length:integer
|
60
|
+
filename:string
|
61
|
+
colorspace:string
|
62
|
+
real_width:integer
|
63
|
+
real_height:integer
|
64
|
+
crop_width:integer
|
65
|
+
crop_height:integer
|
66
|
+
crop_start_x:integer
|
67
|
+
crop_start_y:integer
|
68
|
+
crop_gravity_x:integer
|
69
|
+
crop_gravity_y:integer
|
70
|
+
}
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,120 +1,153 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: dynamic_image
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 0
|
9
|
-
- 4
|
10
|
-
version: 1.0.4
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 2.0.0.beta1
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
13
|
-
-
|
6
|
+
authors:
|
7
|
+
- Inge Jørgensen
|
14
8
|
autorequire:
|
15
9
|
bindir: bin
|
16
10
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
- - ~>
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
hash: 63
|
29
|
-
segments:
|
30
|
-
- 2
|
31
|
-
- 13
|
32
|
-
- 2
|
33
|
-
version: 2.13.2
|
11
|
+
date: 2014-09-23 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: 4.1.0
|
34
20
|
type: :runtime
|
35
|
-
|
36
|
-
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.1.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
37
28
|
name: vector2d
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.0.2
|
37
|
+
type: :runtime
|
38
|
+
prerelease: false
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - "~>"
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '2.0'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.0.2
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: mini_magick
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - "~>"
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 3.8.1
|
54
|
+
type: :runtime
|
38
55
|
prerelease: false
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - "~>"
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 3.8.1
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: dis
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - "~>"
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 0.9.0
|
50
68
|
type: :runtime
|
51
|
-
|
52
|
-
|
53
|
-
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - "~>"
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.9.0
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: sqlite3
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: '0'
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: rspec-rails
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - "~>"
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 3.0.0
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - "~>"
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 3.0.0
|
103
|
+
description: DynamicImage is a Rails plugin that simplifies image uploading and processing
|
104
|
+
email:
|
105
|
+
- inge@elektronaut.no
|
54
106
|
executables: []
|
55
|
-
|
56
107
|
extensions: []
|
57
|
-
|
58
|
-
|
59
|
-
- LICENSE
|
60
|
-
- README.md
|
61
|
-
files:
|
62
|
-
- LICENSE
|
108
|
+
extra_rdoc_files: []
|
109
|
+
files:
|
110
|
+
- MIT-LICENSE
|
63
111
|
- README.md
|
64
112
|
- Rakefile
|
65
|
-
- VERSION
|
66
|
-
- app/controllers/images_controller.rb
|
67
|
-
- app/models/image.rb
|
68
|
-
- config/routes.rb
|
69
|
-
- dynamic_image.gemspec
|
70
|
-
- dynamic_image.sublime-project
|
71
|
-
- dynamic_image.sublime-workspace
|
72
|
-
- init.rb
|
73
|
-
- install.rb
|
74
|
-
- lib/binary_storage.rb
|
75
|
-
- lib/binary_storage/active_record_extensions.rb
|
76
|
-
- lib/binary_storage/blob.rb
|
77
113
|
- lib/dynamic_image.rb
|
78
|
-
- lib/dynamic_image/
|
79
|
-
- lib/dynamic_image/
|
80
|
-
- lib/dynamic_image/
|
114
|
+
- lib/dynamic_image/belongs_to.rb
|
115
|
+
- lib/dynamic_image/controller.rb
|
116
|
+
- lib/dynamic_image/digest_verifier.rb
|
117
|
+
- lib/dynamic_image/errors.rb
|
81
118
|
- lib/dynamic_image/helper.rb
|
82
|
-
- lib/
|
83
|
-
- lib/
|
84
|
-
- lib/
|
85
|
-
-
|
86
|
-
|
87
|
-
|
88
|
-
|
119
|
+
- lib/dynamic_image/image_sizing.rb
|
120
|
+
- lib/dynamic_image/metadata.rb
|
121
|
+
- lib/dynamic_image/model.rb
|
122
|
+
- lib/dynamic_image/model/dimensions.rb
|
123
|
+
- lib/dynamic_image/model/validations.rb
|
124
|
+
- lib/dynamic_image/processed_image.rb
|
125
|
+
- lib/dynamic_image/railtie.rb
|
126
|
+
- lib/dynamic_image/routing.rb
|
127
|
+
- lib/dynamic_image/version.rb
|
128
|
+
- lib/rails/generators/dynamic_image/resource/resource_generator.rb
|
129
|
+
homepage: https://github.com/elektronaut/dynamic_image
|
130
|
+
licenses:
|
131
|
+
- MIT
|
132
|
+
metadata: {}
|
89
133
|
post_install_message:
|
90
134
|
rdoc_options: []
|
91
|
-
|
92
|
-
require_paths:
|
135
|
+
require_paths:
|
93
136
|
- lib
|
94
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
95
|
-
|
96
|
-
requirements:
|
97
|
-
- - ">="
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
hash: 3
|
100
|
-
segments:
|
101
|
-
- 0
|
102
|
-
version: "0"
|
103
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
-
none: false
|
105
|
-
requirements:
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
106
139
|
- - ">="
|
107
|
-
- !ruby/object:Gem::Version
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 1.9.2
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">"
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: 1.3.1
|
112
147
|
requirements: []
|
113
|
-
|
114
148
|
rubyforge_project:
|
115
|
-
rubygems_version:
|
149
|
+
rubygems_version: 2.4.1
|
116
150
|
signing_key:
|
117
|
-
specification_version:
|
118
|
-
summary:
|
151
|
+
specification_version: 4
|
152
|
+
summary: Rails plugin that simplifies image uploading and processing
|
119
153
|
test_files: []
|
120
|
-
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.0.4
|
@@ -1,79 +0,0 @@
|
|
1
|
-
class ImagesController < ActionController::Base
|
2
|
-
|
3
|
-
after_filter :cache_dynamic_image
|
4
|
-
after_filter :run_garbage_collection_for_dynamic_image_controller
|
5
|
-
|
6
|
-
unloadable
|
7
|
-
|
8
|
-
public
|
9
|
-
|
10
|
-
# Return the requested image. Rescale, filter and cache it where appropriate.
|
11
|
-
def render_dynamic_image
|
12
|
-
|
13
|
-
render_missing_image and return unless Image.exists?(params[:id])
|
14
|
-
image = Image.find(params[:id])
|
15
|
-
|
16
|
-
minTime = Time.rfc2822(request.env["HTTP_IF_MODIFIED_SINCE"]) rescue nil
|
17
|
-
if minTime && image.created_at? && image.created_at <= minTime
|
18
|
-
render :text => '304 Not Modified', :status => 304
|
19
|
-
return
|
20
|
-
end
|
21
|
-
|
22
|
-
unless image.data?
|
23
|
-
logger.warn "Image #{image.id} exists, but has no data"
|
24
|
-
render_missing_image and return
|
25
|
-
end
|
26
|
-
|
27
|
-
if size = params[:size]
|
28
|
-
if size =~ /^x[\d]+$/ || size =~ /^[\d]+x$/
|
29
|
-
if params[:original]
|
30
|
-
image.cropped = false
|
31
|
-
end
|
32
|
-
size = Vector2d.new(size)
|
33
|
-
image_size = Vector2d.new(image.size)
|
34
|
-
size = image_size.constrain_both(size).round.to_s
|
35
|
-
end
|
36
|
-
imagedata = image.get_processed(size, params[:filterset])
|
37
|
-
else
|
38
|
-
imagedata = image
|
39
|
-
end
|
40
|
-
|
41
|
-
DynamicImage.dirty_memory = true # Flag memory for GC
|
42
|
-
|
43
|
-
if image
|
44
|
-
response.headers['Cache-Control'] = nil
|
45
|
-
response.headers['Last-Modified'] = imagedata.created_at.httpdate if imagedata.created_at?
|
46
|
-
send_data(
|
47
|
-
imagedata.data,
|
48
|
-
:filename => image.filename,
|
49
|
-
:type => image.content_type,
|
50
|
-
:disposition => 'inline'
|
51
|
-
)
|
52
|
-
end
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
protected
|
57
|
-
|
58
|
-
def render_missing_image
|
59
|
-
if self.respond_to?(:render_error)
|
60
|
-
render_error 404
|
61
|
-
else
|
62
|
-
render :status => 404, :text => "404: Image not found"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Enforce caching of dynamic images, even if caching is turned off
|
67
|
-
def cache_dynamic_image
|
68
|
-
cache_setting = ActionController::Base.perform_caching
|
69
|
-
ActionController::Base.perform_caching = true
|
70
|
-
cache_page
|
71
|
-
ActionController::Base.perform_caching = cache_setting
|
72
|
-
end
|
73
|
-
|
74
|
-
# Perform garbage collection if necessary
|
75
|
-
def run_garbage_collection_for_dynamic_image_controller
|
76
|
-
DynamicImage.clean_dirty_memory
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|