couch_photo 0.0.1

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 ADDED
@@ -0,0 +1,80 @@
1
+ #Introduction
2
+
3
+ A mixin for auto-generating image variations on Image documents with CouchDB.
4
+
5
+ ##Installation
6
+
7
+ $ gem install couch_photo
8
+
9
+ ## Documentation
10
+
11
+ Browse the documentation on rdoc.info: http://rdoc.info/github/moonmaster9000/couch_photo
12
+
13
+ ##How does it work?
14
+
15
+ Just "include CouchPhoto" in your "CouchRest::Model::Base" classes and define some variations.
16
+
17
+ ###Simple Variations
18
+
19
+ Let's imagine we want to auto-generate small, medium, and large variations of our image everytime it gets updated.
20
+
21
+ First, define an Image document and set the versions on it:
22
+
23
+ class Image < CouchRest::Model::Base
24
+ use_database IMAGE_DB
25
+ include CouchPhoto
26
+
27
+ override_id! # the id of the document will be the basename of the original image file
28
+
29
+ variations do
30
+ small "20x20"
31
+ medium "100x100"
32
+ large "500x500"
33
+ end
34
+ end
35
+
36
+ Next, create an instance of the image document and set the "original" image on it.
37
+
38
+ i = Image.new
39
+ i.original "avatar.jpg"
40
+ i.save
41
+
42
+ By calling the original method with a string, CouchPhoto will attempt to open a file with the same name and use that as the original image. If you don't have
43
+ an actual file (e.g., maybe this was a form upload), then simply pass a blob as the second parameter. For example,
44
+
45
+ blob = File.read "avatar.jpg"
46
+ i.original "avatar.jpg", blob
47
+
48
+ Now, if you look in your image document in CouchDB, you'd see the following attachments:
49
+
50
+ http://your_couch_server/your_image_database/avatar.jpg/original.jpg
51
+ http://your_couch_server/your_image_database/avatar.jpg/variations/small.jpg
52
+ http://your_couch_server/your_image_database/avatar.jpg/variations/medium.jpg
53
+ http://your_couch_server/your_image_database/avatar.jpg/variations/large.jpg
54
+
55
+ Notice that, because we called the `override_id!` method, `CouchPhoto` set the ID of your image document to the basename of your original image.
56
+
57
+ ###Complex Variations
58
+
59
+ The previous variations were all simple image resizings. What if we wanted to do something a little more complex? Like grayscale the original image? Or create a watermark? No prob!
60
+
61
+ class Image < CouchRest::Model::Base
62
+ use_database IMAGE_DB
63
+ include CouchPhoto
64
+
65
+ override_id! # the id of the document will be the basename of the original image file
66
+
67
+ variations do
68
+ grayscale do |original_image|
69
+ original_image.monochrome
70
+ end
71
+
72
+ watermark do |original_image|
73
+ original_image.composite(MiniMagick::Image.open("watermark.png", "jpg") do |c|
74
+ c.gravity "center"
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ The `original_image` variable in the blocks is simply the MiniMagick::Image instance of your original image.
@@ -0,0 +1,5 @@
1
+ require 'mini_magick'
2
+ require 'couchrest_model'
3
+ require 'couch_photo/variations'
4
+ require 'couch_photo/attachment'
5
+ require 'couch_photo/couch_photo'
@@ -0,0 +1,9 @@
1
+ module CouchPhoto
2
+ class Attachment #:nodoc:
3
+ attr_reader :read, :path
4
+ def initialize(data, path=nil)
5
+ @read = data
6
+ @path = nil
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,44 @@
1
+ module CouchPhoto
2
+ def self.included(base)
3
+ base.extend ClassMethods
4
+ end
5
+
6
+ def original(filepath, blob=nil)
7
+ self["_id"] = File.basename filepath if self.class.override_id?
8
+ blob ||= File.read filepath
9
+ image_format = filepath.match(/^.*\.([^\.]*)$/)[1]
10
+ attachment_name = "original.#{image_format}"
11
+ attachment = {:name => attachment_name, :file => Attachment.new(blob, attachment_name)}
12
+ update_or_create_attachment attachment
13
+ self.class.variation_definitions.run_variations(blob).each do |variation_name, variation_blob|
14
+ update_or_create_attachment :name => "variations/#{variation_name}.#{image_format}", :file => Attachment.new(variation_blob, attachment_name)
15
+ end
16
+ end
17
+
18
+ def update_or_create_attachment(attachment)
19
+ if self.has_attachment? attachment[:name]
20
+ self.update_attachment attachment
21
+ else
22
+ self.create_attachment attachment
23
+ end
24
+ end
25
+
26
+ module ClassMethods
27
+ def variations(&block)
28
+ raise "You must pass a block to the `variations' method." unless block
29
+ variation_definitions.instance_eval(&block)
30
+ end
31
+
32
+ def variation_definitions
33
+ @variation_definitions ||= Variations.new
34
+ end
35
+
36
+ def override_id!
37
+ @override_id = true
38
+ end
39
+
40
+ def override_id?
41
+ @override_id
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,39 @@
1
+ module CouchPhoto
2
+ class Variations
3
+ def initialize
4
+ @variations = {}
5
+ end
6
+
7
+ def method_missing(method_name, *args, &block)
8
+ if block
9
+ @variations[method_name.to_sym] = Variation.new method_name, *args, &block
10
+ else
11
+ @variations[method_name.to_sym] = Variation.new method_name, *args
12
+ end
13
+ end
14
+
15
+ def run_variations(blob)
16
+ results = {}
17
+ @variations.each do |variation_name, variation|
18
+ results[variation_name] = variation.create_variation blob
19
+ end
20
+ results
21
+ end
22
+ end
23
+
24
+ class Variation
25
+ def initialize(name, format=nil, &block)
26
+ raise "A variation can not have both a format and a block. Choose one." if format and block
27
+ raise "A variation must have either a format (e.g., '20x20>') or a block." if !format and !block
28
+ @name = name
29
+ @format = format
30
+ @block = block
31
+ end
32
+
33
+ def create_variation(blob)
34
+ image = MiniMagick::Image.read(blob)
35
+ @format ? image.resize(@format) : @block.call(image)
36
+ image.to_blob
37
+ end
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: couch_photo
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Matt Parker
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-11-27 00:00:00 -05:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: couchrest_model
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - "="
28
+ - !ruby/object:Gem::Version
29
+ hash: -1848230057
30
+ segments:
31
+ - 1
32
+ - 0
33
+ - 0
34
+ - beta7
35
+ version: 1.0.0.beta7
36
+ type: :runtime
37
+ version_requirements: *id001
38
+ description: Automatically create image variations on your CouchDB image documents.
39
+ email: moonmaster9000@gmail.com
40
+ executables: []
41
+
42
+ extensions: []
43
+
44
+ extra_rdoc_files:
45
+ - README.markdown
46
+ files:
47
+ - lib/couch_photo.rb
48
+ - lib/couch_photo/attachment.rb
49
+ - lib/couch_photo/couch_photo.rb
50
+ - lib/couch_photo/variations.rb
51
+ - README.markdown
52
+ has_rdoc: true
53
+ homepage: http://github.com/moonmaster9000/couch_photo
54
+ licenses: []
55
+
56
+ post_install_message:
57
+ rdoc_options: []
58
+
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ none: false
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ hash: 3
67
+ segments:
68
+ - 0
69
+ version: "0"
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ requirements: []
80
+
81
+ rubyforge_project:
82
+ rubygems_version: 1.3.7
83
+ signing_key:
84
+ specification_version: 3
85
+ summary: Mixin for CouchDB/couchrest_model image models.
86
+ test_files: []
87
+