smartcropper 0.6.1 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/Gemfile +2 -14
- data/Gemfile.lock +39 -13
- data/README.md +7 -3
- data/Rakefile +1 -27
- data/VERSION +1 -1
- data/lib/smartcropper.rb +6 -6
- data/smartcropper.gemspec +6 -36
- data/test/test_croptoelie.rb +6 -0
- metadata +28 -70
- data/.document +0 -5
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
YWUzYmVjMThjYjkyOGFlYTVkMzBlYzU3YmVmMjExMzBiOTlkMjYxNw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YmMyNWFjMGM0NzAyNTAyMDM3NGU3ZDMzZDQ3NDQxOTYzYWY2NWNmYg==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
YmViZmU3NTY4YzVmNmQ5YjJmYmM3ZTkzZTM3YzRmZGVmNzE2YWFkODRhODNj
|
10
|
+
YjE5Y2E4MTQzMmM5MzFlMjcwYmE3ZDI2YWM1MmY5NDRhMTI3Njc5YjJkNjNk
|
11
|
+
ZWZmMDZhM2JlMDM2Nzg1NTQzZGJkNGQ3YjNjOGE3OWViYWFkMTQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MGZiZDMyNGI5NTJkODY2ZWQ0ZWY0MTM2ZDMyZjY3ZjUxMGE5ZmZiZmYzNWRj
|
14
|
+
NjBkOTg4ZTEwODg2MWJiNzE2NzVhMTYyNzcwODk2Njk3OWFiNjdiMzUyMTAy
|
15
|
+
MzgyMjFhZjNmYmEzNjc0NjJjMDU4NjJmNDliZDgyYjlkMzA5ZWM=
|
data/Gemfile
CHANGED
@@ -1,15 +1,3 @@
|
|
1
|
-
source "
|
2
|
-
# Add dependencies required to use your gem here.
|
3
|
-
# Example:
|
4
|
-
# gem "activesupport", ">= 2.3.5"
|
1
|
+
source "https://rubygems.org"
|
5
2
|
|
6
|
-
|
7
|
-
|
8
|
-
# Add dependencies to develop your gem here.
|
9
|
-
# Include everything needed to run rake, tests, features, etc.
|
10
|
-
group :development do
|
11
|
-
gem "shoulda", ">= 0"
|
12
|
-
gem "bundler", "~> 1.0.0"
|
13
|
-
gem "jeweler", "~> 1.5.2"
|
14
|
-
gem "rcov", ">= 0"
|
15
|
-
end
|
3
|
+
gemspec
|
data/Gemfile.lock
CHANGED
@@ -1,22 +1,48 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
smartcropper (0.6.1)
|
5
|
+
rmagick (> 2.11.0)
|
6
|
+
|
1
7
|
GEM
|
2
|
-
remote:
|
8
|
+
remote: https://rubygems.org/
|
3
9
|
specs:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
10
|
+
activesupport (4.0.0)
|
11
|
+
i18n (~> 0.6, >= 0.6.4)
|
12
|
+
minitest (~> 4.2)
|
13
|
+
multi_json (~> 1.3)
|
14
|
+
thread_safe (~> 0.1)
|
15
|
+
tzinfo (~> 0.3.37)
|
16
|
+
atomic (1.1.10)
|
17
|
+
diff-lcs (1.2.4)
|
18
|
+
i18n (0.6.4)
|
19
|
+
minitest (4.7.5)
|
20
|
+
multi_json (1.7.7)
|
9
21
|
rake (0.8.7)
|
10
|
-
|
11
|
-
|
12
|
-
|
22
|
+
rmagick (2.13.2)
|
23
|
+
rspec (2.14.0)
|
24
|
+
rspec-core (~> 2.14.0)
|
25
|
+
rspec-expectations (~> 2.14.0)
|
26
|
+
rspec-mocks (~> 2.14.0)
|
27
|
+
rspec-core (2.14.2)
|
28
|
+
rspec-expectations (2.14.0)
|
29
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
30
|
+
rspec-mocks (2.14.1)
|
31
|
+
shoulda (3.5.0)
|
32
|
+
shoulda-context (~> 1.0, >= 1.0.1)
|
33
|
+
shoulda-matchers (>= 1.4.1, < 3.0)
|
34
|
+
shoulda-context (1.1.4)
|
35
|
+
shoulda-matchers (2.2.0)
|
36
|
+
activesupport (>= 3.0.0)
|
37
|
+
thread_safe (0.1.0)
|
38
|
+
atomic
|
39
|
+
tzinfo (0.3.37)
|
13
40
|
|
14
41
|
PLATFORMS
|
15
42
|
ruby
|
16
43
|
|
17
44
|
DEPENDENCIES
|
18
|
-
|
19
|
-
|
20
|
-
rcov
|
21
|
-
rmagick
|
45
|
+
rake
|
46
|
+
rspec
|
22
47
|
shoulda
|
48
|
+
smartcropper!
|
data/README.md
CHANGED
@@ -17,7 +17,7 @@ File *uploaders/attachement_uploader.rb*:
|
|
17
17
|
|
18
18
|
def smart_crop_and_scale(width, height)
|
19
19
|
manipulate! do |img|
|
20
|
-
img =
|
20
|
+
img = SmartCropper.new(img)
|
21
21
|
img = img.smart_crop_and_scale(width, height)
|
22
22
|
img = yield(img) if block_given?
|
23
23
|
img
|
@@ -48,8 +48,12 @@ File *uploaders/attachement_uploader.rb*:
|
|
48
48
|
2011-04-18: Limit to N steps, instead of step_size.
|
49
49
|
2011-04-16: Introduce tests and a profiler script, to profile performance.
|
50
50
|
|
51
|
-
##
|
52
|
-
|
51
|
+
## Roadmap
|
52
|
+
|
53
|
+
1. Refactoring: It must be cleaned up. There is a lot of smelly code, fat methods and DRY.
|
54
|
+
1. Performance: I want to make it smarter when cropping (really) large images.
|
55
|
+
1. Improve slicing. The results are okay-ish when merely squaring images, but lack when you cut tiny areas from a large image.
|
56
|
+
1. Release 1.0.0
|
53
57
|
|
54
58
|
## Copyright
|
55
59
|
|
data/Rakefile
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'bundler'
|
5
|
+
|
5
6
|
begin
|
6
7
|
Bundler.setup(:default, :development)
|
7
8
|
rescue Bundler::BundlerError => e
|
@@ -9,25 +10,6 @@ rescue Bundler::BundlerError => e
|
|
9
10
|
$stderr.puts "Run `bundle install` to install missing gems"
|
10
11
|
exit e.status_code
|
11
12
|
end
|
12
|
-
require 'rake'
|
13
|
-
|
14
|
-
require 'jeweler'
|
15
|
-
Jeweler::Tasks.new do |gem|
|
16
|
-
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
17
|
-
gem.name = "smartcropper"
|
18
|
-
gem.homepage = "http://github.com/berkes/smartcropper"
|
19
|
-
gem.license = "GPL"
|
20
|
-
gem.summary = %Q{Content aware cropper.}
|
21
|
-
gem.description = %Q{Crops images based on entropy: leaving the most interesting part intact. Don't expect this to be a replacement for human cropping, it is an algorythm and not an extremely smart one at that :). Best results achieved in combination with scaling: the cropping is then only used to square the image, cutting off the least interesting part. The trimming simply chops off te edge that is least interesting, and continues doing so, untill it reached the requested size.}
|
22
|
-
gem.email = "ber@webschuur.com"
|
23
|
-
gem.authors = ["Bèr Kessels"]
|
24
|
-
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
25
|
-
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
26
|
-
|
27
|
-
gem.add_runtime_dependency 'rmagick', '> 2.11.0'
|
28
|
-
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
29
|
-
end
|
30
|
-
Jeweler::RubygemsDotOrgTasks.new
|
31
13
|
|
32
14
|
require 'rake/testtask'
|
33
15
|
Rake::TestTask.new(:test) do |test|
|
@@ -35,14 +17,6 @@ Rake::TestTask.new(:test) do |test|
|
|
35
17
|
test.pattern = 'test/**/test_*.rb'
|
36
18
|
test.verbose = true
|
37
19
|
end
|
38
|
-
|
39
|
-
require 'rcov/rcovtask'
|
40
|
-
Rcov::RcovTask.new do |test|
|
41
|
-
test.libs << 'test'
|
42
|
-
test.pattern = 'test/**/test_*.rb'
|
43
|
-
test.verbose = true
|
44
|
-
end
|
45
|
-
|
46
20
|
task :default => :test
|
47
21
|
|
48
22
|
require 'rake/rdoctask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.0
|
data/lib/smartcropper.rb
CHANGED
@@ -2,7 +2,7 @@ require 'RMagick'
|
|
2
2
|
class SmartCropper
|
3
3
|
include Magick
|
4
4
|
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :image
|
6
6
|
attr_accessor :steps
|
7
7
|
|
8
8
|
# Create a new SmartCropper object from a ImageList single image object.
|
@@ -14,7 +14,7 @@ class SmartCropper
|
|
14
14
|
@steps = 10
|
15
15
|
|
16
16
|
# Preprocess image.
|
17
|
-
@
|
17
|
+
@quantized_image = @image.quantize
|
18
18
|
|
19
19
|
# Prepare some often-used internal variables.
|
20
20
|
@rows = @image.rows
|
@@ -83,8 +83,8 @@ class SmartCropper
|
|
83
83
|
while (width > requested_x)
|
84
84
|
slice_width = [(width - requested_x), step_size].min
|
85
85
|
|
86
|
-
left_entropy = entropy_slice(@
|
87
|
-
right_entropy = entropy_slice(@
|
86
|
+
left_entropy = entropy_slice(@quantized_image, left, 0, slice_width, bottom)
|
87
|
+
right_entropy = entropy_slice(@quantized_image, (right - slice_width), 0, slice_width, bottom)
|
88
88
|
|
89
89
|
#remove the slice with the least entropy
|
90
90
|
if left_entropy < right_entropy
|
@@ -100,8 +100,8 @@ class SmartCropper
|
|
100
100
|
while (height > requested_y)
|
101
101
|
slice_height = [(height - step_size), step_size].min
|
102
102
|
|
103
|
-
top_entropy = entropy_slice(@
|
104
|
-
bottom_entropy = entropy_slice(@
|
103
|
+
top_entropy = entropy_slice(@quantized_image, 0, top, @columns, slice_height)
|
104
|
+
bottom_entropy = entropy_slice(@quantized_image, 0, (bottom - slice_height), @columns, slice_height)
|
105
105
|
|
106
106
|
#remove the slice with the least entropy
|
107
107
|
if top_entropy < bottom_entropy
|
data/smartcropper.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{smartcropper}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.7.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Bèr Kessels"]
|
@@ -17,8 +17,6 @@ Gem::Specification.new do |s|
|
|
17
17
|
"README.md"
|
18
18
|
]
|
19
19
|
s.files = [
|
20
|
-
".document",
|
21
|
-
".rvmrc",
|
22
20
|
"Gemfile",
|
23
21
|
"Gemfile.lock",
|
24
22
|
"LICENSE.txt",
|
@@ -33,38 +31,10 @@ Gem::Specification.new do |s|
|
|
33
31
|
s.require_paths = ["lib"]
|
34
32
|
s.rubygems_version = %q{1.5.2}
|
35
33
|
s.summary = %q{Content aware image cropping in Ruby and Carrierwave}
|
36
|
-
s.test_files =
|
37
|
-
|
38
|
-
"test/profiler.rb",
|
39
|
-
"test/test_croptoelie.rb",
|
40
|
-
"test/fixtures/*"
|
41
|
-
]
|
42
|
-
|
43
|
-
if s.respond_to? :specification_version then
|
44
|
-
s.specification_version = 3
|
34
|
+
s.test_files = `git ls-files test`.split("\n")
|
35
|
+
s.add_dependency(%q<rmagick>, ["> 2.11.0"])
|
45
36
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
50
|
-
s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
|
51
|
-
s.add_development_dependency(%q<rcov>, [">= 0"])
|
52
|
-
s.add_runtime_dependency(%q<rmagick>, ["> 2.11.0"])
|
53
|
-
else
|
54
|
-
s.add_dependency(%q<rmagick>, [">= 0"])
|
55
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
56
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
57
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
58
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
59
|
-
s.add_dependency(%q<rmagick>, ["> 2.11.0"])
|
60
|
-
end
|
61
|
-
else
|
62
|
-
s.add_dependency(%q<rmagick>, [">= 0"])
|
63
|
-
s.add_dependency(%q<shoulda>, [">= 0"])
|
64
|
-
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
65
|
-
s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
|
66
|
-
s.add_dependency(%q<rcov>, [">= 0"])
|
67
|
-
s.add_dependency(%q<rmagick>, ["> 2.11.0"])
|
68
|
-
end
|
37
|
+
s.add_development_dependency('rake', [">= 0"])
|
38
|
+
s.add_development_dependency('rspec', [">= 0"])
|
39
|
+
s.add_development_dependency('shoulda', [">= 0"])
|
69
40
|
end
|
70
|
-
|
data/test/test_croptoelie.rb
CHANGED
@@ -59,6 +59,12 @@ class TestSmartcropper < Test::Unit::TestCase
|
|
59
59
|
assert_equal([19, 19], size)
|
60
60
|
end
|
61
61
|
|
62
|
+
should "return original image, not quantized" do
|
63
|
+
img = SmartCropper.new(@image)
|
64
|
+
assert_equal(img.image, @image)
|
65
|
+
end
|
66
|
+
|
67
|
+
|
62
68
|
###########################################################################
|
63
69
|
# Images reported to fail by issue #5 #
|
64
70
|
###########################################################################
|
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: smartcropper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.7.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Bèr Kessels
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2011-04-19 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rmagick
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ! '
|
17
|
+
- - ! '>'
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
19
|
+
version: 2.11.0
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ! '
|
24
|
+
- - ! '>'
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version:
|
26
|
+
version: 2.11.0
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
28
|
+
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ! '>='
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,47 +34,27 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ! '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
42
|
+
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.0.0
|
54
|
-
type: :development
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.0.0
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: jeweler
|
64
|
-
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
|
-
requirements:
|
67
|
-
- - ~>
|
45
|
+
- - ! '>='
|
68
46
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
47
|
+
version: '0'
|
70
48
|
type: :development
|
71
49
|
prerelease: false
|
72
50
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
51
|
requirements:
|
75
|
-
- -
|
52
|
+
- - ! '>='
|
76
53
|
- !ruby/object:Gem::Version
|
77
|
-
version:
|
54
|
+
version: '0'
|
78
55
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
56
|
+
name: shoulda
|
80
57
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
58
|
requirements:
|
83
59
|
- - ! '>='
|
84
60
|
- !ruby/object:Gem::Version
|
@@ -86,33 +62,12 @@ dependencies:
|
|
86
62
|
type: :development
|
87
63
|
prerelease: false
|
88
64
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
65
|
requirements:
|
91
66
|
- - ! '>='
|
92
67
|
- !ruby/object:Gem::Version
|
93
68
|
version: '0'
|
94
|
-
- !ruby/object:Gem::Dependency
|
95
|
-
name: rmagick
|
96
|
-
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
|
-
requirements:
|
99
|
-
- - ! '>'
|
100
|
-
- !ruby/object:Gem::Version
|
101
|
-
version: 2.11.0
|
102
|
-
type: :runtime
|
103
|
-
prerelease: false
|
104
|
-
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
|
-
requirements:
|
107
|
-
- - ! '>'
|
108
|
-
- !ruby/object:Gem::Version
|
109
|
-
version: 2.11.0
|
110
69
|
description: ! 'Crops images based on entropy: leaving the most interesting part intact.
|
111
|
-
|
112
|
-
not an extremely smart one at that :). Best results achieved in combination with
|
113
|
-
scaling: the cropping is then only used to square the image, cutting off the least
|
114
|
-
interesting part. The trimming simply chops off te edge that is least interesting,
|
115
|
-
and continues doing so, untill it reached the requested size.'
|
70
|
+
Usefull for automatic cropping or resizing of images. '
|
116
71
|
email: ber@webschuur.com
|
117
72
|
executables: []
|
118
73
|
extensions: []
|
@@ -120,15 +75,14 @@ extra_rdoc_files:
|
|
120
75
|
- LICENSE.txt
|
121
76
|
- README.md
|
122
77
|
files:
|
123
|
-
- .document
|
124
78
|
- Gemfile
|
125
79
|
- Gemfile.lock
|
126
80
|
- LICENSE.txt
|
127
81
|
- README.md
|
128
82
|
- Rakefile
|
129
83
|
- VERSION
|
130
|
-
- lib/smartcropper.rb
|
131
84
|
- smartcropper.gemspec
|
85
|
+
- lib/smartcropper.rb
|
132
86
|
- test/fixtures/20x20.png
|
133
87
|
- test/fixtures/entropyish.png
|
134
88
|
- test/fixtures/entropyish.txt
|
@@ -139,35 +93,39 @@ files:
|
|
139
93
|
- test/helper.rb
|
140
94
|
- test/profiler.rb
|
141
95
|
- test/test_croptoelie.rb
|
142
|
-
homepage: http://
|
96
|
+
homepage: http://berk.es/smartcropper
|
143
97
|
licenses:
|
144
98
|
- GPL
|
99
|
+
metadata: {}
|
145
100
|
post_install_message:
|
146
101
|
rdoc_options: []
|
147
102
|
require_paths:
|
148
103
|
- lib
|
149
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
-
none: false
|
151
105
|
requirements:
|
152
106
|
- - ! '>='
|
153
107
|
- !ruby/object:Gem::Version
|
154
108
|
version: '0'
|
155
|
-
segments:
|
156
|
-
- 0
|
157
|
-
hash: -779265411
|
158
109
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
159
|
-
none: false
|
160
110
|
requirements:
|
161
111
|
- - ! '>='
|
162
112
|
- !ruby/object:Gem::Version
|
163
113
|
version: '0'
|
164
114
|
requirements: []
|
165
115
|
rubyforge_project:
|
166
|
-
rubygems_version:
|
116
|
+
rubygems_version: 2.0.3
|
167
117
|
signing_key:
|
168
|
-
specification_version:
|
169
|
-
summary: Content aware
|
118
|
+
specification_version: 4
|
119
|
+
summary: Content aware image cropping in Ruby and Carrierwave
|
170
120
|
test_files:
|
121
|
+
- test/fixtures/20x20.png
|
122
|
+
- test/fixtures/entropyish.png
|
123
|
+
- test/fixtures/entropyish.txt
|
124
|
+
- test/fixtures/errors/flo-rida.png
|
125
|
+
- test/fixtures/errors/hollywood-undead.jpg
|
126
|
+
- test/fixtures/errors/maroon-5.jpg
|
127
|
+
- test/fixtures/errors/yo-gotti.jpg
|
171
128
|
- test/helper.rb
|
172
129
|
- test/profiler.rb
|
173
130
|
- test/test_croptoelie.rb
|
131
|
+
has_rdoc:
|