imagery 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -20,3 +20,5 @@ pkg
20
20
 
21
21
  ## PROJECT::SPECIFIC
22
22
  /.rvmrc
23
+ /.yardoc
24
+ /doc
@@ -0,0 +1,231 @@
1
+ Imagery
2
+ =======
3
+
4
+ (See documentation at [http://labs.sinefunc.com/imagery/doc](http://labs.sinefunc.com/imagery/doc))
5
+
6
+ ## Image manipulation should be simple. It should be customizable. It should allow for flexibility. Imagery attempts to solve these.
7
+
8
+ ### Imagery favors:
9
+
10
+ 1. Simplicity and explicitness over magic DSLs.
11
+ 2. OOP principles such as inheritance and composition.
12
+ 3. Flexibility and extensibility.
13
+ 4. Not being tied to any form of ORM.
14
+
15
+ 1. Simplicity and Explicitness
16
+ ------------------------------
17
+ To get started using Imagery you only need ImageMagick, ruby and Imagery of
18
+ course.
19
+
20
+ # on debian based systems
21
+ sudo apt-get install imagemagick
22
+ # or maybe using macports
23
+ sudo port install ImageMagick
24
+ [sudo] gem install imagery
25
+
26
+ Then you may proceed using it.
27
+
28
+ require 'rubygems'
29
+ require 'imagery'
30
+
31
+ Photo = Class.new(Struct.new(:id))
32
+
33
+ i = Imagery.new(Photo.new(1001))
34
+ i.root = '/some/path/here'
35
+ i.sizes = { :thumb => ["48x48^", "48x48"], :large => ["480x320"] }
36
+ i.save(File.open('/some/path/to/image.jpg'))
37
+
38
+ File.exist?('/some/path/here/public/system/photo/1001/thumb.png')
39
+ # => true
40
+
41
+ File.exist?('/some/path/here/public/system/photo/1001/large.png')
42
+ # => true
43
+
44
+ File.exist?('/some/path/here/public/system/photo/1001/original.png')
45
+ # => true
46
+
47
+ # the defaut is to use the .id and the name of the class passed,
48
+ # but you can specify a different scheme.
49
+
50
+ i = Imagery.new(Photo.new(1001), `uuidgen`.strip, "photos")
51
+ i.root = '/some/path/here'
52
+ i.file == '/some/path/here/public/system/photos/1c2030a6-6bfa-11df-8997-67a71f1f84c7/original.png'
53
+ # => true
54
+
55
+ 2. OOP Principles (that we already know)
56
+ ----------------------------------------
57
+
58
+ ### Ohm example (See [http://ohm.keyvalue.org](http://ohm.keyvalue.org))
59
+
60
+ # Imagery will use ROOT_DIR if its available
61
+ ROOT_DIR = "/u/apps/site/current"
62
+
63
+ class User < Ohm::Model
64
+ include Ohm::Callbacks
65
+
66
+ after :save, :write_avatar
67
+
68
+ def avatar=(fp)
69
+ @avatar_fp = fp
70
+ end
71
+
72
+ def avatar
73
+ @avatar ||=
74
+ Imagery.new(self).tap do |i|
75
+ i.sizes = { :thumb => ["48x48^", "48x48"], :medium => ["120x120"] }
76
+ end
77
+ end
78
+
79
+ protected
80
+ def write_avatar
81
+ avatar.save(@avatar_fp[:tempfile]) if @avatar_fp
82
+ end
83
+ end
84
+
85
+ # Since we're using composition, we can customize the dimensions on an
86
+ # instance level.
87
+ class Collage < Ohm::Model
88
+ attribute :width
89
+ attribute :height
90
+
91
+ def photo
92
+ @photo ||=
93
+ Imagery.new(self).tap do |i|
94
+ i.sizes = { :thumb => ["%sx%s" % [width, height]] }
95
+ end
96
+ end
97
+ end
98
+
99
+ # For cases where we want to use S3 for some and normal filesystem for others
100
+ class S3Photo < Imagery::Model
101
+ include Imagery::S3
102
+ self.s3_bucket = 'my-bucket'
103
+ end
104
+
105
+ # then maybe some other files are using cloudfront
106
+ class CloudfrontPhoto < Imagery::Model
107
+ include Imagery::S3
108
+ self.s3_bucket = 'my-bucket'
109
+ self.s3_distribution_domain = 'assets.site.com'
110
+ end
111
+
112
+ 3. Flexibility and Extensibility
113
+ --------------------------------
114
+ ### Existing plugins: Faking and S3
115
+
116
+ #### Imagery::S3
117
+
118
+ As was shown in some examples above you can easily do S3 integration.
119
+ The access credentials are assumed to be stored in
120
+
121
+ ENV["AMAZON_ACCESS_KEY_ID"]
122
+ ENV["AMAZON_SECRET_ACCESS_KEY"]
123
+
124
+ you can do this by setting it on your .bash_profile / .bashrc or just
125
+ manually setting them somewhere in your appication
126
+
127
+ ENV["AMAZON_ACCESS_KEY_ID"] = '_access_key_id_'
128
+ ENV["AMAZON_SECRET_ACCESS_KEY"] = '_secret_access_key_'
129
+
130
+ Now you can just start using it:
131
+
132
+ Photo = Class.new(Struct.new(:id))
133
+
134
+ class Imagery::Model
135
+ include Imagery::S3
136
+ self.s3_bucket = 'my-bucket'
137
+ end
138
+
139
+ i = Imagery.new(Photo.new(1001))
140
+ i.root = '/tmp'
141
+ i.save(File.open('/some/path/to/image.jpg'))
142
+
143
+ #### Imagery::Faking
144
+
145
+ When doing testing, you definitely don't want to run image
146
+ resizing everytime. Enter Faking.
147
+
148
+ # in your test_helper / spec_helper
149
+ Imagery::Model.send :include, Imagery::Faking
150
+ Imagery::Model.mode = :fake
151
+
152
+ # but what if we want to run it for real on a case to case basis?
153
+ # sure we can!
154
+ Imagery::Model.real {
155
+ # do some imagery testing here
156
+ }
157
+
158
+ #### Imagery::Test
159
+
160
+ There is a module you can include in your test context to automate the pattern
161
+ of testing / faking on an opt-in basis.
162
+
163
+ # in your test_helper / spec_helper
164
+ class Test::Unit::TestCase
165
+ include Imagery::Test
166
+ end
167
+
168
+ # now when you do some testing... (User assumes the user example above)
169
+ imagery do |is_real|
170
+ user = User.new(:avatar => { tempfile: File.open('avatar.jpg') })
171
+ user.save
172
+
173
+ if is_real
174
+ assert File.exist?(user.avatar.file)
175
+ end
176
+ end
177
+
178
+ Running your test suite:
179
+
180
+ REAL_IMAGERY=true rake test
181
+
182
+ It's off by default though, so you don't have to do anything to make sure
183
+ Imagery doesn't run.
184
+
185
+ ### Extending Imagery
186
+ By making use of standard Ruby idioms, we can easily do lots with it.
187
+ Exensibility is addressed via Ruby modules for example:
188
+
189
+ module Imagery
190
+ module MogileStore
191
+ def self.included(base)
192
+ class << base
193
+ attr_accessor :mogile_config
194
+ end
195
+ end
196
+
197
+ def save(io)
198
+ if super
199
+ # do some mogie FS stuff here
200
+ end
201
+ end
202
+
203
+ def delete
204
+ super
205
+ # remove the mogile stuff here
206
+ end
207
+ end
208
+ end
209
+
210
+ # Now just include the module however, whenever you want
211
+ module Imagery
212
+ class Model
213
+ include Imagery::MogileStore
214
+ self.mogile_config = { :foo => :bar }
215
+ end
216
+ end
217
+
218
+
219
+ ### Note on Patches/Pull Requests
220
+
221
+ * Fork the project.
222
+ * Make your feature addition or bug fix.
223
+ * Add tests for it. This is important so I don't break it in a
224
+ future version unintentionally.
225
+ * Commit, do not mess with rakefile, version, or history.
226
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
227
+ * Send me a pull request. Bonus points for topic branches.
228
+
229
+ ### Copyright
230
+
231
+ Copyright (c) 2010 Cyril David. See LICENSE for details.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
@@ -0,0 +1,70 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{imagery}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Cyril David"]
12
+ s.date = %q{2010-05-31}
13
+ s.description = %q{Uses ImageMagick directly underneath. Nuff said.}
14
+ s.email = %q{cyx.ucron@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.markdown"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.markdown",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "imagery.gemspec",
27
+ "lib/imagery.rb",
28
+ "lib/imagery/faking.rb",
29
+ "lib/imagery/model.rb",
30
+ "lib/imagery/s3.rb",
31
+ "lib/imagery/test.rb",
32
+ "test/fixtures/lake.jpg",
33
+ "test/helper.rb",
34
+ "test/test_imagery.rb",
35
+ "test/test_with_s3.rb"
36
+ ]
37
+ s.homepage = %q{http://github.com/sinefunc/imagery}
38
+ s.rdoc_options = ["--charset=UTF-8"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = %q{1.3.6}
41
+ s.summary = %q{Image resizing without all the bloat}
42
+ s.test_files = [
43
+ "test/helper.rb",
44
+ "test/test_imagery.rb",
45
+ "test/test_with_s3.rb"
46
+ ]
47
+
48
+ if s.respond_to? :specification_version then
49
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
50
+ s.specification_version = 3
51
+
52
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
53
+ s.add_runtime_dependency(%q<escape>, [">= 0"])
54
+ s.add_development_dependency(%q<contest>, [">= 0"])
55
+ s.add_development_dependency(%q<aws-s3>, [">= 0"])
56
+ s.add_development_dependency(%q<mocha>, [">= 0"])
57
+ else
58
+ s.add_dependency(%q<escape>, [">= 0"])
59
+ s.add_dependency(%q<contest>, [">= 0"])
60
+ s.add_dependency(%q<aws-s3>, [">= 0"])
61
+ s.add_dependency(%q<mocha>, [">= 0"])
62
+ end
63
+ else
64
+ s.add_dependency(%q<escape>, [">= 0"])
65
+ s.add_dependency(%q<contest>, [">= 0"])
66
+ s.add_dependency(%q<aws-s3>, [">= 0"])
67
+ s.add_dependency(%q<mocha>, [">= 0"])
68
+ end
69
+ end
70
+
@@ -2,19 +2,17 @@ require 'escape'
2
2
  require 'fileutils'
3
3
 
4
4
  module Imagery
5
- VERSION = "0.0.1"
5
+ VERSION = "0.0.2"
6
6
 
7
7
  autoload :Model, "imagery/model"
8
8
  autoload :Faking, "imagery/faking"
9
9
  autoload :S3, "imagery/s3"
10
-
10
+ autoload :Test, "imagery/test"
11
+
12
+ # Syntactic sugar for Imagery::Model::new
13
+ # @see Imagery::Model#initialize for details
11
14
  def new(*args, &blk)
12
15
  Model.new(*args, &blk)
13
16
  end
14
17
  module_function :new
15
-
16
- def faked(&blk)
17
- Model.faked(&blk)
18
- end
19
- module_function :faked
20
18
  end
@@ -19,6 +19,13 @@ module Imagery
19
19
  ensure
20
20
  @mode = @omode
21
21
  end
22
+
23
+ def real
24
+ @omode, @mode = @mode, nil
25
+ yield
26
+ ensure
27
+ @mode = @omode
28
+ end
22
29
  end
23
30
 
24
31
  def save(io)
@@ -1,41 +1,146 @@
1
1
  module Imagery
2
2
  class Model
3
3
  UnknownSize = Class.new(StandardError)
4
+
5
+ @@directory = 'public/system'
6
+ @@default = { :original => ["1920x1200>"] }
4
7
 
8
+ # This is typically the database ID, you may also use something
9
+ # like a GUID for it, the sky's the limit.
5
10
  attr :key
11
+
12
+ # Used as a grouping scheme, if you name this as `photos` for example,
13
+ # you will have public/system/photos as the path.
6
14
  attr :namespace
15
+
16
+ # Returns a single key => value pair hash, defaulting to @@default.
7
17
  attr :default
18
+
19
+ # Returns the directory used which defaults to public/system.
8
20
  attr :directory
21
+
22
+ # Defaulting to :original, the value used here will be the default
23
+ # size used when calling Imagery::Model#url and Imagery::Model#file.
24
+ attr_accessor :default_size
9
25
 
10
- attr_writer :root, :sizes
26
+ # Allows you to define the root of your application, all other paths
27
+ # are determined relative to this.
28
+ attr_writer :root
29
+
30
+ # Allows you to define the different sizes you want as a hash of
31
+ # :style => [geometry] pairs.
32
+ attr_writer :sizes
11
33
 
12
- def initialize(model, key = model.id, namespace = model.class.name.split('::').last.downcase)
13
- @key = key.to_s
14
- @namespace = namespace
15
- @default = { :original => ["1920x1200>"] }
16
- @directory = 'public/system'
17
- @sizes = {}
34
+ # @param [#id] model any ruby object
35
+ # @param [#to_s] key typically the database ID of a model. But you may also
36
+ # use anything here just as long as its unique across the
37
+ # namespace.
38
+ # @param [String] namespace used as a grouping mechanism for your images.
39
+ def initialize(model, key = model.id, namespace = namespace_for(model.class))
40
+ @key = key.to_s
41
+ @namespace = namespace
42
+ @default = @@default
43
+ @directory = @@directory
44
+ @sizes = {}
45
+ @default_size = :original
18
46
  end
19
47
 
48
+ # Returns all the sizes defined including the default size.
49
+ #
50
+ # @example
51
+ # Photo = Class.new(Struct.new(:id))
52
+ # i = Imagery::Model.new(Photo.new(1001))
53
+ # i.sizes == { :original => ["1920x1280"] }
54
+ # # => true
55
+ #
56
+ # i.sizes = { :thumb => ["48x48"] }
57
+ # i.sizes == { :thumb => ["48x48"], :original => ["1920x1280"] }
58
+ # # => true
59
+ #
60
+ # @return [Hash] size => [dimension] pairs.
20
61
  def sizes
21
- @sizes.merge(@default)
62
+ @sizes.merge(default)
22
63
  end
23
64
 
24
- def file(size = :original)
65
+ # Gives the absolute file for a specified size.
66
+ #
67
+ # @example
68
+ #
69
+ # Photo = Class.new(Struct.new(:id))
70
+ # i = Imagery.new(Photo.new(1001))
71
+ # i.root = '/tmp'
72
+ # i.file(:original) == '/tmp/public/system/photo/1001/original.png
73
+ # # => true
74
+ #
75
+ # i.file(:thumb)
76
+ # # raise Imagery::Model::UnknownSize
77
+ #
78
+ # i.sizes = { :thumb => ["100x100"] }
79
+ # i.file(:thumb) == '/tmp/public/system/photo/1001/thumb.png
80
+ # # => true
81
+ #
82
+ # @param [Symbol] size the size specific filename.
83
+ # @raise [UnknownSize] if the size is not found in
84
+ # Imagery::Model#sizes.
85
+ # @return [String] the absolute path of the size specific filename e.g.
86
+ # /u/apps/reddit/current/public/system/photo/1/thumb.png
87
+ # where photo is the namespace and 1 is the key.
88
+ def file(size = self.default_size)
25
89
  raise UnknownSize, "#{ size } is not defined" unless sizes.has_key?(size)
26
90
 
27
91
  root_path(directory, namespace, key, filename(size))
28
92
  end
29
93
 
30
- def tmp
31
- root_path(directory, namespace, key, 'tmp')
32
- end
33
-
34
- def url(size = :original)
94
+ # Gives the absolute URI path for use in a web context.
95
+ #
96
+ # Photo = Class.new(Struct.new(:id))
97
+ # i = Imagery.new(Photo.new(1001))
98
+ # i.url(:original) == '/system/photo/1001/original.png
99
+ # # => true
100
+ #
101
+ # i.file(:thumb)
102
+ # # raise Imagery::Model::UnknownSize
103
+ #
104
+ # i.sizes = { :thumb => ["100x100"] }
105
+ # i.file(:thumb) == '/system/photo/1001/thumb.png
106
+ # # => true
107
+ #
108
+ # @param [Symbol] size the size specific url.
109
+ # @raise [UnknownSize] if the size is not found in
110
+ # Imagery::Model#sizes.
111
+ # @return [String] the absolute URI path of the size specific url e.g.
112
+ # /system/photo/1/thumb.png
113
+ # where photo is the namespace and 1 is the key.
114
+ def url(size = self.default_size)
35
115
  file(size).split('public').last
36
116
  end
37
117
 
118
+ # This module is basically here so that plugins like Imagery::S3
119
+ # can override #save and #delete and call super.
38
120
  module Persistence
121
+ # Writes the data in `io` and resizes them according to the different
122
+ # geometry strings.
123
+ #
124
+ # @example
125
+ #
126
+ # Photo = Class.new(Struct.new(:id))
127
+ # i = Imagery.new(Photo.new(1001))
128
+ # i.root = '/tmp'
129
+ # i.size = { :thumb => ["48x48"] }
130
+ # i.save(File.open('/path/to/file.jpg'))
131
+ #
132
+ # File.exist?("/tmp/public/system/photo/1001/thumb.png")
133
+ # # => true
134
+ #
135
+ # File.exist?("/tmp/public/system/photo/1001/original.png")
136
+ # # => true
137
+ #
138
+ # @param [#read] io any object responding to read. Typically
139
+ # a Rack filehandle is passed here from a
140
+ # controller in rails or a Sinatra handler.
141
+ # You may also use File.open to provide a proper
142
+ # IO handle.
143
+ # @return [true] returns when all other file operations are done.
39
144
  def save(io)
40
145
  FileUtils.mkdir_p(File.dirname(tmp))
41
146
  File.open(tmp, "wb") { |target| target.write(io.read) }
@@ -44,7 +149,9 @@ module Imagery
44
149
 
45
150
  return true
46
151
  end
47
-
152
+
153
+ # Deletes all of the files related to this Imagery::Model instance.
154
+ # @return [true] when successfully deleted.
48
155
  def delete
49
156
  FileUtils.rm_rf File.dirname(file)
50
157
  return true
@@ -53,6 +160,14 @@ module Imagery
53
160
  include Persistence
54
161
 
55
162
  private
163
+ def tmp
164
+ root_path(directory, namespace, key, 'tmp')
165
+ end
166
+
167
+ def namespace_for(klass)
168
+ klass.name.split('::').last.downcase
169
+ end
170
+
56
171
  def filename(size)
57
172
  "%s.png" % size
58
173
  end
@@ -9,8 +9,45 @@ module Imagery
9
9
  end
10
10
 
11
11
  S3_HOST = "http://s3.amazonaws.com"
12
-
13
- def url(size = :original)
12
+
13
+ # Returns a url publicly accessible. If a distribution domain is set,
14
+ # then the url will be based on that.
15
+ #
16
+ # @example
17
+ #
18
+ # class Imagery::Model
19
+ # include Imagery::S3
20
+ #
21
+ # self.s3_bucket = 'bucket-name'
22
+ # end
23
+ #
24
+ # Photo = Class.new(Struct.new(:id))
25
+ # i = Imagery.new(Photo.new(1001))
26
+ #
27
+ # i.url == 'http://s3.amazonaws.com/bucket-name/photo/1001/original.png'
28
+ # # => true
29
+ #
30
+ # Imagery::Model.s3_distribution_domain = 'assets.site.com'
31
+ # i.url == 'http://assets.site.com/photo/1001/original.png'
32
+ # # => true
33
+ #
34
+ # # You may also subclass this of course since it's just a ruby object
35
+ # # and configure them differently as needed.
36
+ #
37
+ # class CloudFront < Imagery::Model
38
+ # include Imagery::S3
39
+ # self.s3_bucket = 'cloudfront'
40
+ # self.s3_distribution_domain = 'assets.site.com'
41
+ # end
42
+ #
43
+ # class RegularS3 < Imagery::Model
44
+ # include Imagery::S3
45
+ # self.s3_bucket = 'cloudfront'
46
+ # end
47
+ #
48
+ # @param [Symbol] size the preferred size you want for the url.
49
+ # @return [String] the size specific url.
50
+ def url(size = self.default_size)
14
51
  if domain = self.class.s3_distribution_domain
15
52
  [domain, namespace, key, filename(size)].join('/')
16
53
  else
@@ -18,6 +55,8 @@ module Imagery
18
55
  end
19
56
  end
20
57
 
58
+ # In addition to saving the files and resizing them locally, uploads all
59
+ # the different sizes to amazon S3.
21
60
  def save(io)
22
61
  if super
23
62
  s3_object_keys.each do |key, size|
@@ -31,6 +70,8 @@ module Imagery
31
70
  end
32
71
  end
33
72
 
73
+ # Deletes all the files related to this Imagery instance and also
74
+ # all the S3 keys.
34
75
  def delete
35
76
  super
36
77
  s3_object_keys.each do |key, size|
@@ -46,11 +87,36 @@ module Imagery
46
87
  end
47
88
 
48
89
  module Gateway
90
+ # A wrapper for AWS::S3::S3Object.store. Basically auto-connects
91
+ # using the environment vars.
92
+ #
93
+ # @example
94
+ #
95
+ # AWS::S3::Base.connected?
96
+ # # => false
97
+ #
98
+ # Imagery::S3::Gateway.store(
99
+ # 'avatar', File.open('avatar.jpg'), 'bucket'
100
+ # )
101
+ # AWS::S3::Base.connected?
102
+ # # => true
103
+ #
49
104
  def store(*args)
50
105
  execute(:store, *args)
51
106
  end
52
107
  module_function :store
53
108
 
109
+ # A wrapper for AWS::S3::S3Object.delete. Basically auto-connects
110
+ # using the environment vars.
111
+ #
112
+ # @example
113
+ #
114
+ # AWS::S3::Base.connected?
115
+ # # => false
116
+ #
117
+ # Imagery::S3::Gateway.delete('avatar', 'bucket')
118
+ # AWS::S3::Base.connected?
119
+ # # => true
54
120
  def delete(*args)
55
121
  execute(:delete, *args)
56
122
  end
@@ -0,0 +1,17 @@
1
+ module Imagery
2
+ module Test
3
+ def self.included(base)
4
+ Imagery::Model.send :include, Imagery::Faking
5
+ Imagery::Model.mode = :fake
6
+ end
7
+
8
+ protected
9
+ def imagery
10
+ if ENV["REAL_IMAGERY"]
11
+ Imagery::Model.real { yield true }
12
+ else
13
+ Imagery::Model.faked { yield false }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -19,14 +19,14 @@ class TestImagery < Test::Unit::TestCase
19
19
  test "root_path when no ROOT_DIR" do
20
20
  imagery = Imagery.new(Photo.new(1001))
21
21
  imagery.root = '/'
22
- assert_equal "/public/system/photo/1001/tmp", imagery.tmp
22
+ assert_equal "/public/system/photo/1001/tmp", imagery.send(:tmp)
23
23
  end
24
24
 
25
25
  test "root_path when ROOT_DIR defined on imagery" do
26
26
  Imagery::ROOT_DIR = '/root/dir'
27
27
 
28
28
  imagery = Imagery.new(Photo.new(1001))
29
- assert_equal "/root/dir/public/system/photo/1001/tmp", imagery.tmp
29
+ assert_equal "/root/dir/public/system/photo/1001/tmp", imagery.send(:tmp)
30
30
 
31
31
  Imagery.send :remove_const, :ROOT_DIR
32
32
  end
@@ -35,7 +35,7 @@ class TestImagery < Test::Unit::TestCase
35
35
  Object::ROOT_DIR = '/root/dir'
36
36
 
37
37
  imagery = Imagery.new(Photo.new(1001))
38
- assert_equal "/root/dir/public/system/photo/1001/tmp", imagery.tmp
38
+ assert_equal "/root/dir/public/system/photo/1001/tmp", imagery.send(:tmp)
39
39
 
40
40
  Object.send :remove_const, :ROOT_DIR
41
41
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 2
9
+ version: 0.0.2
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-05-28 00:00:00 +08:00
17
+ date: 2010-05-31 00:00:00 +08:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -73,18 +73,20 @@ extensions: []
73
73
 
74
74
  extra_rdoc_files:
75
75
  - LICENSE
76
- - README.rdoc
76
+ - README.markdown
77
77
  files:
78
78
  - .document
79
79
  - .gitignore
80
80
  - LICENSE
81
- - README.rdoc
81
+ - README.markdown
82
82
  - Rakefile
83
83
  - VERSION
84
+ - imagery.gemspec
84
85
  - lib/imagery.rb
85
86
  - lib/imagery/faking.rb
86
87
  - lib/imagery/model.rb
87
88
  - lib/imagery/s3.rb
89
+ - lib/imagery/test.rb
88
90
  - test/fixtures/lake.jpg
89
91
  - test/helper.rb
90
92
  - test/test_imagery.rb
@@ -1,17 +0,0 @@
1
- = imagery
2
-
3
- Description goes here.
4
-
5
- == Note on Patches/Pull Requests
6
-
7
- * Fork the project.
8
- * Make your feature addition or bug fix.
9
- * Add tests for it. This is important so I don't break it in a
10
- future version unintentionally.
11
- * Commit, do not mess with rakefile, version, or history.
12
- (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
- * Send me a pull request. Bonus points for topic branches.
14
-
15
- == Copyright
16
-
17
- Copyright (c) 2010 Cyril David. See LICENSE for details.