imagery 0.0.2 → 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.
- data/README.markdown +11 -4
- data/VERSION +1 -1
- data/imagery.gemspec +5 -2
- data/lib/imagery.rb +6 -5
- data/lib/imagery/faking.rb +6 -0
- data/lib/imagery/missing.rb +19 -0
- data/lib/imagery/model.rb +41 -24
- data/lib/imagery/s3.rb +44 -8
- data/test/fixtures/lake.jpg +0 -0
- data/test/test_imagery.rb +9 -1
- data/test/test_missing.rb +30 -0
- data/test/test_with_s3.rb +54 -3
- metadata +6 -3
data/README.markdown
CHANGED
@@ -99,14 +99,21 @@ Then you may proceed using it.
|
|
99
99
|
# For cases where we want to use S3 for some and normal filesystem for others
|
100
100
|
class S3Photo < Imagery::Model
|
101
101
|
include Imagery::S3
|
102
|
-
|
102
|
+
s3_bucket 'my-bucket'
|
103
103
|
end
|
104
104
|
|
105
105
|
# then maybe some other files are using cloudfront
|
106
106
|
class CloudfrontPhoto < Imagery::Model
|
107
107
|
include Imagery::S3
|
108
|
-
|
109
|
-
|
108
|
+
s3_bucket 'my-bucket'
|
109
|
+
s3_distribution_domain 'assets.site.com'
|
110
|
+
end
|
111
|
+
|
112
|
+
# some might be using S3 EU, in which case you can specify the s3_host
|
113
|
+
class CustomS3Host < Imagery::Model
|
114
|
+
include Imagery::S3
|
115
|
+
s3_host 'http://my.custom.host'
|
116
|
+
s3_bucket 'my-bucket-name'
|
110
117
|
end
|
111
118
|
|
112
119
|
3. Flexibility and Extensibility
|
@@ -133,7 +140,7 @@ Now you can just start using it:
|
|
133
140
|
|
134
141
|
class Imagery::Model
|
135
142
|
include Imagery::S3
|
136
|
-
|
143
|
+
s3_bucket 'my-bucket'
|
137
144
|
end
|
138
145
|
|
139
146
|
i = Imagery.new(Photo.new(1001))
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/imagery.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{imagery}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Cyril David"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-06-07}
|
13
13
|
s.description = %q{Uses ImageMagick directly underneath. Nuff said.}
|
14
14
|
s.email = %q{cyx.ucron@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -26,12 +26,14 @@ Gem::Specification.new do |s|
|
|
26
26
|
"imagery.gemspec",
|
27
27
|
"lib/imagery.rb",
|
28
28
|
"lib/imagery/faking.rb",
|
29
|
+
"lib/imagery/missing.rb",
|
29
30
|
"lib/imagery/model.rb",
|
30
31
|
"lib/imagery/s3.rb",
|
31
32
|
"lib/imagery/test.rb",
|
32
33
|
"test/fixtures/lake.jpg",
|
33
34
|
"test/helper.rb",
|
34
35
|
"test/test_imagery.rb",
|
36
|
+
"test/test_missing.rb",
|
35
37
|
"test/test_with_s3.rb"
|
36
38
|
]
|
37
39
|
s.homepage = %q{http://github.com/sinefunc/imagery}
|
@@ -42,6 +44,7 @@ Gem::Specification.new do |s|
|
|
42
44
|
s.test_files = [
|
43
45
|
"test/helper.rb",
|
44
46
|
"test/test_imagery.rb",
|
47
|
+
"test/test_missing.rb",
|
45
48
|
"test/test_with_s3.rb"
|
46
49
|
]
|
47
50
|
|
data/lib/imagery.rb
CHANGED
@@ -2,12 +2,13 @@ require 'escape'
|
|
2
2
|
require 'fileutils'
|
3
3
|
|
4
4
|
module Imagery
|
5
|
-
VERSION = "0.0.
|
5
|
+
VERSION = "0.0.3"
|
6
6
|
|
7
|
-
autoload :Model,
|
8
|
-
autoload :Faking,
|
9
|
-
autoload :S3,
|
10
|
-
autoload :
|
7
|
+
autoload :Model, "imagery/model"
|
8
|
+
autoload :Faking, "imagery/faking"
|
9
|
+
autoload :S3, "imagery/s3"
|
10
|
+
autoload :Missing, "imagery/missing"
|
11
|
+
autoload :Test, "imagery/test"
|
11
12
|
|
12
13
|
# Syntactic sugar for Imagery::Model::new
|
13
14
|
# @see Imagery::Model#initialize for details
|
data/lib/imagery/faking.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
module Imagery
|
2
|
+
module Missing
|
3
|
+
def existing=(existing)
|
4
|
+
@existing = existing
|
5
|
+
end
|
6
|
+
|
7
|
+
def existing
|
8
|
+
@existing
|
9
|
+
end
|
10
|
+
|
11
|
+
def url(size = self.default_size)
|
12
|
+
if existing.to_s.empty?
|
13
|
+
return ['', 'missing', namespace, filename(size)].join('/')
|
14
|
+
else
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/imagery/model.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Imagery
|
2
2
|
class Model
|
3
|
-
UnknownSize
|
3
|
+
UnknownSize = Class.new(StandardError)
|
4
|
+
UndefinedRoot = Class.new(StandardError)
|
4
5
|
|
5
6
|
@@directory = 'public/system'
|
6
7
|
@@default = { :original => ["1920x1200>"] }
|
@@ -90,31 +91,47 @@ module Imagery
|
|
90
91
|
|
91
92
|
root_path(directory, namespace, key, filename(size))
|
92
93
|
end
|
93
|
-
|
94
|
-
#
|
94
|
+
|
95
|
+
# The Web module is basically here to let plugins override
|
96
|
+
# the url as they see fit.
|
95
97
|
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
99
|
-
#
|
100
|
-
#
|
101
|
-
#
|
102
|
-
# # raise Imagery::Model::UnknownSize
|
103
|
-
#
|
104
|
-
# i.sizes = { :thumb => ["100x100"] }
|
105
|
-
# i.file(:thumb) == '/system/photo/1001/thumb.png
|
106
|
-
# # => true
|
98
|
+
# @example
|
99
|
+
# module FunkyUrls
|
100
|
+
# def url(size = default_size)
|
101
|
+
# super.gsub('/system', '/funky')
|
102
|
+
# end
|
103
|
+
# end
|
107
104
|
#
|
108
|
-
#
|
109
|
-
#
|
110
|
-
#
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
105
|
+
# class Imagery::Model
|
106
|
+
# include FunkyUrls
|
107
|
+
# end
|
108
|
+
module Web
|
109
|
+
# Gives the absolute URI path for use in a web context.
|
110
|
+
#
|
111
|
+
# Photo = Class.new(Struct.new(:id))
|
112
|
+
# i = Imagery.new(Photo.new(1001))
|
113
|
+
# i.url(:original) == '/system/photo/1001/original.png
|
114
|
+
# # => true
|
115
|
+
#
|
116
|
+
# i.file(:thumb)
|
117
|
+
# # raise Imagery::Model::UnknownSize
|
118
|
+
#
|
119
|
+
# i.sizes = { :thumb => ["100x100"] }
|
120
|
+
# i.file(:thumb) == '/system/photo/1001/thumb.png
|
121
|
+
# # => true
|
122
|
+
#
|
123
|
+
# @param [Symbol] size the size specific url.
|
124
|
+
# @raise [UnknownSize] if the size is not found in
|
125
|
+
# Imagery::Model#sizes.
|
126
|
+
# @return [String] the absolute URI path of the size specific url e.g.
|
127
|
+
# /system/photo/1/thumb.png
|
128
|
+
# where photo is the namespace and 1 is the key.
|
129
|
+
def url(size = self.default_size)
|
130
|
+
file(size).split('public').last
|
131
|
+
end
|
116
132
|
end
|
117
|
-
|
133
|
+
include Web
|
134
|
+
|
118
135
|
# This module is basically here so that plugins like Imagery::S3
|
119
136
|
# can override #save and #delete and call super.
|
120
137
|
module Persistence
|
@@ -190,7 +207,7 @@ module Imagery
|
|
190
207
|
|
191
208
|
def root(root = defined?(ROOT_DIR) && ROOT_DIR)
|
192
209
|
@root ||= root if root
|
193
|
-
@root
|
210
|
+
@root || raise(UndefinedRoot, "You must define Imagery::Model#root or have a ROOT_DIR constant present")
|
194
211
|
end
|
195
212
|
|
196
213
|
def root_path(*args)
|
data/lib/imagery/s3.rb
CHANGED
@@ -3,13 +3,49 @@ require 'aws/s3'
|
|
3
3
|
module Imagery
|
4
4
|
module S3
|
5
5
|
def self.included(base)
|
6
|
+
base.extend Configs
|
6
7
|
class << base
|
7
|
-
|
8
|
+
attr_writer :s3_bucket, :s3_distribution_domain, :s3_host
|
8
9
|
end
|
9
10
|
end
|
10
|
-
|
11
|
-
|
11
|
+
|
12
|
+
module Configs
|
13
|
+
def s3_bucket(bucket = nil)
|
14
|
+
@s3_bucket = bucket if bucket
|
15
|
+
@s3_bucket || raise(UndefinedBucket, BUCKET_ERROR_MSG)
|
16
|
+
end
|
17
|
+
|
18
|
+
BUCKET_ERROR_MSG = (<<-MSG).gsub(/^ {6}/, '')
|
19
|
+
|
20
|
+
You need to define a bucket name. Example:
|
21
|
+
|
22
|
+
class Imagery::Model
|
23
|
+
include Imagery::S3
|
24
|
+
|
25
|
+
s3_bucket 'my-bucket-name'
|
26
|
+
end
|
27
|
+
MSG
|
28
|
+
|
29
|
+
def s3_distribution_domain(domain = nil)
|
30
|
+
@s3_distribution_domain = domain if domain
|
31
|
+
@s3_distribution_domain
|
32
|
+
end
|
12
33
|
|
34
|
+
# Allows you to customize the S3 host. Usually happens when you use
|
35
|
+
# amazon S3 EU.
|
36
|
+
#
|
37
|
+
# @param [String] host the custom host you want to use instead.
|
38
|
+
# @return [String] the s3 host currently set.
|
39
|
+
def s3_host(host = nil)
|
40
|
+
@s3_host = host if host
|
41
|
+
@s3_host || S3_HOST
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
UndefinedBucket = Class.new(StandardError)
|
46
|
+
|
47
|
+
S3_HOST = "http://s3.amazonaws.com"
|
48
|
+
|
13
49
|
# Returns a url publicly accessible. If a distribution domain is set,
|
14
50
|
# then the url will be based on that.
|
15
51
|
#
|
@@ -18,7 +54,7 @@ module Imagery
|
|
18
54
|
# class Imagery::Model
|
19
55
|
# include Imagery::S3
|
20
56
|
#
|
21
|
-
#
|
57
|
+
# s3_bucket 'bucket-name'
|
22
58
|
# end
|
23
59
|
#
|
24
60
|
# Photo = Class.new(Struct.new(:id))
|
@@ -36,13 +72,13 @@ module Imagery
|
|
36
72
|
#
|
37
73
|
# class CloudFront < Imagery::Model
|
38
74
|
# include Imagery::S3
|
39
|
-
#
|
40
|
-
#
|
75
|
+
# s3_bucket 'cloudfront'
|
76
|
+
# s3_distribution_domain 'assets.site.com'
|
41
77
|
# end
|
42
78
|
#
|
43
79
|
# class RegularS3 < Imagery::Model
|
44
80
|
# include Imagery::S3
|
45
|
-
#
|
81
|
+
# s3_bucket 'cloudfront'
|
46
82
|
# end
|
47
83
|
#
|
48
84
|
# @param [Symbol] size the preferred size you want for the url.
|
@@ -51,7 +87,7 @@ module Imagery
|
|
51
87
|
if domain = self.class.s3_distribution_domain
|
52
88
|
[domain, namespace, key, filename(size)].join('/')
|
53
89
|
else
|
54
|
-
[
|
90
|
+
[self.class.s3_host, self.class.s3_bucket, namespace, key, filename(size)].join('/')
|
55
91
|
end
|
56
92
|
end
|
57
93
|
|
data/test/fixtures/lake.jpg
CHANGED
Binary file
|
data/test/test_imagery.rb
CHANGED
@@ -16,6 +16,14 @@ class TestImagery < Test::Unit::TestCase
|
|
16
16
|
assert_equal '1001', Imagery.new(Photo.new(1001)).key
|
17
17
|
end
|
18
18
|
|
19
|
+
test "root_path when root not defined" do
|
20
|
+
imagery = Imagery.new(Photo.new(1001))
|
21
|
+
|
22
|
+
assert_raise Imagery::Model::UndefinedRoot do
|
23
|
+
imagery.file
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
19
27
|
test "root_path when no ROOT_DIR" do
|
20
28
|
imagery = Imagery.new(Photo.new(1001))
|
21
29
|
imagery.root = '/'
|
@@ -119,7 +127,7 @@ class TestImagery < Test::Unit::TestCase
|
|
119
127
|
|
120
128
|
test "when mode == :fake" do
|
121
129
|
time = Benchmark.realtime {
|
122
|
-
Imagery.faked {
|
130
|
+
Imagery::Model.faked {
|
123
131
|
assert @imagery.save(File.open(FIXTURES + '/lake.jpg'))
|
124
132
|
}
|
125
133
|
}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class MissingTest < Test::Unit::TestCase
|
4
|
+
Photo = Class.new(Struct.new(:id))
|
5
|
+
|
6
|
+
test "adding it using extend" do
|
7
|
+
imagery = Imagery.new(Photo.new(1001))
|
8
|
+
imagery.extend Imagery::Missing
|
9
|
+
imagery.existing = ""
|
10
|
+
assert_equal '/missing/photo/original.png', imagery.url
|
11
|
+
end
|
12
|
+
|
13
|
+
class WithMissing < Imagery::Model
|
14
|
+
include Imagery::Missing
|
15
|
+
end
|
16
|
+
|
17
|
+
test "adding it using include" do
|
18
|
+
imagery = WithMissing.new(Photo.new(1001))
|
19
|
+
imagery.existing = ""
|
20
|
+
|
21
|
+
assert_equal '/missing/photo/original.png', imagery.url
|
22
|
+
end
|
23
|
+
|
24
|
+
test "still returns as normal when not missing" do
|
25
|
+
imagery = WithMissing.new(Photo.new(1001))
|
26
|
+
imagery.root = '/tmp'
|
27
|
+
imagery.existing = 'lake.jpg'
|
28
|
+
assert_equal '/system/photo/1001/original.png', imagery.url
|
29
|
+
end
|
30
|
+
end
|
data/test/test_with_s3.rb
CHANGED
@@ -5,12 +5,26 @@ class WithS3Test < Test::Unit::TestCase
|
|
5
5
|
include Imagery::Faking
|
6
6
|
include Imagery::S3
|
7
7
|
|
8
|
-
|
8
|
+
s3_bucket "tmp-bucket-name"
|
9
9
|
end
|
10
10
|
|
11
|
+
class NoBucket < Imagery::Model
|
12
|
+
include Imagery::Faking
|
13
|
+
include Imagery::S3
|
14
|
+
end
|
15
|
+
|
16
|
+
class WithS3CustomHost < Imagery::Model
|
17
|
+
include Imagery::Faking
|
18
|
+
include Imagery::S3
|
19
|
+
|
20
|
+
s3_bucket "tmp-bucket-name"
|
21
|
+
s3_host "http://test.host"
|
22
|
+
end
|
23
|
+
|
24
|
+
|
11
25
|
SuperSecretPhoto = Class.new(Struct.new(:id))
|
12
26
|
|
13
|
-
test "urls" do
|
27
|
+
test "default urls" do
|
14
28
|
imagery = WithS3.new(SuperSecretPhoto.new(1001))
|
15
29
|
imagery.root = '/tmp'
|
16
30
|
imagery.sizes = {
|
@@ -28,6 +42,43 @@ class WithS3Test < Test::Unit::TestCase
|
|
28
42
|
assert_equal s % 'large', imagery.url(:large)
|
29
43
|
end
|
30
44
|
|
45
|
+
test "customized s3_host urls" do
|
46
|
+
imagery = WithS3CustomHost.new(SuperSecretPhoto.new(1001))
|
47
|
+
imagery.root = '/tmp'
|
48
|
+
imagery.sizes = {
|
49
|
+
:thumb => ["56x56^"],
|
50
|
+
:small => ["100x100^", "100x100"],
|
51
|
+
:large => ["200x200>", "200x200"]
|
52
|
+
}
|
53
|
+
|
54
|
+
s = 'http://test.host/tmp-bucket-name/supersecretphoto/1001/%s.png'
|
55
|
+
|
56
|
+
assert_equal s % 'original', imagery.url
|
57
|
+
assert_equal s % 'original', imagery.url(:original)
|
58
|
+
assert_equal s % 'thumb', imagery.url(:thumb)
|
59
|
+
assert_equal s % 'small', imagery.url(:small)
|
60
|
+
assert_equal s % 'large', imagery.url(:large)
|
61
|
+
end
|
62
|
+
|
63
|
+
test "url when no bucket" do
|
64
|
+
imagery = NoBucket.new(SuperSecretPhoto.new(1001))
|
65
|
+
imagery.sizes = {
|
66
|
+
:thumb => ["56x56^"],
|
67
|
+
:small => ["100x100^", "100x100"],
|
68
|
+
:large => ["200x200>", "200x200"]
|
69
|
+
}
|
70
|
+
|
71
|
+
assert_raise Imagery::S3::UndefinedBucket do
|
72
|
+
imagery.url
|
73
|
+
end
|
74
|
+
|
75
|
+
begin
|
76
|
+
imagery.url
|
77
|
+
rescue Imagery::S3::UndefinedBucket => e
|
78
|
+
assert_equal Imagery::S3::Configs::BUCKET_ERROR_MSG, e.message
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
31
82
|
test "urls with a distribution domain" do
|
32
83
|
imagery = WithS3.new(SuperSecretPhoto.new(1001))
|
33
84
|
imagery.root = '/tmp'
|
@@ -39,7 +90,7 @@ class WithS3Test < Test::Unit::TestCase
|
|
39
90
|
|
40
91
|
s = 'http://assets.site.com/supersecretphoto/1001/%s.png'
|
41
92
|
|
42
|
-
WithS3.s3_distribution_domain
|
93
|
+
WithS3.s3_distribution_domain 'http://assets.site.com'
|
43
94
|
|
44
95
|
assert_equal s % 'original', imagery.url
|
45
96
|
assert_equal s % 'original', imagery.url(:original)
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 3
|
9
|
+
version: 0.0.3
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Cyril David
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-06-07 00:00:00 +08:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -84,12 +84,14 @@ files:
|
|
84
84
|
- imagery.gemspec
|
85
85
|
- lib/imagery.rb
|
86
86
|
- lib/imagery/faking.rb
|
87
|
+
- lib/imagery/missing.rb
|
87
88
|
- lib/imagery/model.rb
|
88
89
|
- lib/imagery/s3.rb
|
89
90
|
- lib/imagery/test.rb
|
90
91
|
- test/fixtures/lake.jpg
|
91
92
|
- test/helper.rb
|
92
93
|
- test/test_imagery.rb
|
94
|
+
- test/test_missing.rb
|
93
95
|
- test/test_with_s3.rb
|
94
96
|
has_rdoc: true
|
95
97
|
homepage: http://github.com/sinefunc/imagery
|
@@ -124,4 +126,5 @@ summary: Image resizing without all the bloat
|
|
124
126
|
test_files:
|
125
127
|
- test/helper.rb
|
126
128
|
- test/test_imagery.rb
|
129
|
+
- test/test_missing.rb
|
127
130
|
- test/test_with_s3.rb
|