sequel_paperclip 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/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010-2010 Corin Langosch
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19
+
data/README.rdoc ADDED
@@ -0,0 +1,158 @@
1
+ =About
2
+
3
+ Paperclip is intended as an easy file attachment library for Sequel. It was heavily
4
+ inspired by {Paperclip for Activerecord}[http://github.com/thoughtbot/paperclip]. The
5
+ intent behind it was to keep setup as easy as possible and to treat files as
6
+ much like other attributes as possible. This means they aren't saved to their
7
+ final locations on disk, nor are they deleted if set to nil, until #save is called.
8
+ It has support for interpolations and postprocessors, including standart ones like
9
+ a thumbnail generator by default.
10
+
11
+ ==Install
12
+
13
+ Simply install it as any other gem:
14
+
15
+ gem install sequel_paperclip
16
+
17
+ Or when using bundler, add it got your Gemfile:
18
+
19
+ gem sequel_paperclip
20
+
21
+ Some postprocessors depend on external libraries or programs. Please see the processors
22
+ sections for details.
23
+
24
+ ==Quick Start
25
+
26
+ In your model:
27
+
28
+ class User < Sequel::Model
29
+ plugin :paperclip
30
+
31
+ attachment :photo,
32
+ :url => ":host:/:model:/:id:_:basename:_:style:.:format:",
33
+ :path => ":path:/:model:/:id:_:basename:_:style:.:format:",
34
+ :styles => {
35
+ :small => { :geometry => "60x60#", :format => :jpg },
36
+ :medium => { :geometry => "250x200>", :format => :jpg },
37
+ :huge => { :geometry => "600x500>", :format => :jpg },
38
+ },
39
+ :processors => [
40
+ {
41
+ :type => :image,
42
+ :convert_arguments => %w(-auto-orient -quality 75 -strip), # optional
43
+ },
44
+ ]
45
+ end
46
+
47
+ In your migrations:
48
+
49
+ class AddPhotoToUser < Sequel::Migration
50
+ def up
51
+ alter_table :users do
52
+ add_column :photo_basename, String
53
+ add_column :avatar_file_size, Integer # optional
54
+ end
55
+ end
56
+
57
+ def down
58
+ alter_table :users do
59
+ drop_column :photo_file_name
60
+ drop_column :avatar_file_size
61
+ end
62
+ end
63
+ end
64
+
65
+ In your edit and new views:
66
+
67
+ <% form_for @user, :html => { :multipart => true } do |form| %>
68
+ <%= form.file_field :photo %>
69
+ <% end %>
70
+
71
+ In your controller:
72
+
73
+ def create
74
+ # nothing need's to be changed
75
+ end
76
+
77
+ def update
78
+ # nothing need's to be changed
79
+ end
80
+
81
+ def destroy
82
+ # nothing need's to be changed
83
+ end
84
+
85
+ In your show view:
86
+
87
+ <%= image_tag @user.photo_url(:small) %>
88
+ <%= image_tag @user.photo_url(:medium) %>
89
+ <%= image_tag @user.photo_url(:huge) %>
90
+
91
+ ==Interpolations
92
+
93
+ To support flexible urls and paths Paperclip supports variable interploations.
94
+ Strings to be interpolated look like :xxx:. The following predefined interpolations
95
+ exist:
96
+
97
+ id: record id
98
+ model: underscored, pluralized class name
99
+ host: "/system"
100
+ path: Rails public system folder
101
+ style: style (user.photo_url(:thumb) -> :thumb)
102
+ format: format defined for the passed style
103
+ filename: filename
104
+ filesize: only available if a database column photo_file_size exists
105
+ basename: basename of the filename
106
+ extname: extname of the filename
107
+ rails_root: Rails.root
108
+ rails_ev: Rails.env
109
+
110
+ To add your own interploation, put the following code in some initializer. If
111
+ using rails a good location is initializers/paperclip.rb:
112
+
113
+ Sequel::Plugins::Paperclip::Interpolations.set(:host) do |attachment, model, style|
114
+ Rails.env.production? ? "http://some.fancy.mirror.com" : "/system"
115
+ end
116
+
117
+ This would add/ replace the :host: interpolation.
118
+
119
+ ==Processors
120
+
121
+ Processors are run before the attachment is saved. Multiple processors can be
122
+ specified, and they will be invoked in the order they are defined in the
123
+ :processors array.
124
+
125
+ The following processors are included by default:
126
+
127
+ ===image
128
+ Adds the ability to generate thumbnails. Requires imagemagick to installed and the
129
+ convert and identify commands being in the path and executable. Expects a geometry
130
+ definition for each defined style. If a format is defined for a style, the image
131
+ is converted to that format.
132
+
133
+ ===dummy
134
+ This processor is only used internally and should never be used.
135
+
136
+ ==Storage
137
+
138
+ Attachments are stored as files in the file system. To specify the location,
139
+ please have a look at the example above and interpolations.
140
+
141
+ ==Todo
142
+
143
+ * Source documentation (rdoc)
144
+ * Tests
145
+
146
+ ==Contributing
147
+
148
+ If you'd like to contribute a feature or bugfix: Thanks! To make sure your
149
+ fix/feature has a high chance of being included, please read the following
150
+ guidelines:
151
+
152
+ 1. Fork the project.
153
+ 2. Make your feature addition or bug fix.
154
+ 3. Add tests for it. This is important so we don’t break anything in a future version unintentionally.
155
+ 4. Commit, do not mess with rakefile, version, or history. (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)
156
+ 5. Send me a pull request. Bonus points for topic branches.
157
+
158
+
data/Rakefile ADDED
@@ -0,0 +1,46 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = 'sequel_paperclip'
8
+ gem.authors = ['Corin Langosch']
9
+ gem.date = Date.today.to_s
10
+ gem.email = 'info@netskin.com'
11
+ gem.homepage = 'http://github.com/gucki/sequel_paperclip'
12
+ gem.summary = 'Easy file attachment management for Sequel'
13
+ gem.description = 'Sequel plugin which provides Paperclip (attachments, thumbnail resizing, etc.) functionality for model.'
14
+ gem.add_development_dependency "rspec", ">= 1.2.9"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'spec/rake/spectask'
23
+ Spec::Rake::SpecTask.new(:spec) do |spec|
24
+ spec.libs << 'lib' << 'spec'
25
+ spec.spec_files = FileList['spec/**/*_spec.rb']
26
+ end
27
+
28
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.pattern = 'spec/**/*_spec.rb'
31
+ spec.rcov = true
32
+ end
33
+
34
+ task :spec => :check_dependencies
35
+
36
+ task :default => :spec
37
+
38
+ require 'rake/rdoctask'
39
+ Rake::RDocTask.new do |rdoc|
40
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
41
+
42
+ rdoc.rdoc_dir = 'rdoc'
43
+ rdoc.title = "sequel_paperclip #{version}"
44
+ rdoc.rdoc_files.include('README*')
45
+ rdoc.rdoc_files.include('lib/**/*.rb')
46
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,60 @@
1
+ module Sequel
2
+ module Plugins
3
+ module Paperclip
4
+ class Attachment
5
+ attr_reader :name
6
+ attr_reader :options
7
+ attr_accessor :processors
8
+
9
+ def initialize(name, options = {})
10
+ unless options[:styles]
11
+ options[:styles] = {
12
+ :original => {}
13
+ }
14
+ end
15
+
16
+ unless options[:processors]
17
+ options[:processors] = [
18
+ {
19
+ :type => :dummy,
20
+ }
21
+ ]
22
+ end
23
+
24
+ @name = name
25
+ @options = options
26
+ self.processors = []
27
+ options[:processors].each do |processor|
28
+ self.processors << "Sequel::Plugins::Paperclip::Processors::#{processor[:type].to_s.capitalize}".constantize.new(self, processor)
29
+ end
30
+ end
31
+
32
+ def process(model, src_path)
33
+ files_to_store = {}
34
+ processors.each do |processor|
35
+ processor.pre_runs(model, src_path)
36
+ options[:styles].each_pair do |style, style_options|
37
+ files_to_store[style] ||= Tempfile.new("paperclip")
38
+ puts "processing #{name} for style #{style} with processor #{processor.name}"
39
+ processor.run(style, style_options, files_to_store[style])
40
+ end
41
+ processor.post_runs
42
+ end
43
+ files_to_store
44
+ end
45
+
46
+ def exists?(model)
47
+ !!model.send("#{name}_basename")
48
+ end
49
+
50
+ def path(model, style)
51
+ Interpolations.interpolate(options[:path], self, model, style)
52
+ end
53
+
54
+ def url(model, style)
55
+ Interpolations.interpolate(options[:url], self, model, style)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,68 @@
1
+ module Sequel
2
+ module Plugins
3
+ module Paperclip
4
+ class Interpolations
5
+ def self.set(name, &block)
6
+ (class << self; self; end).instance_eval do
7
+ define_method(name, &block)
8
+ end
9
+ end
10
+
11
+ def self.interpolate(string, attachment, model, style)
12
+ string.gsub(/:\w+:/i) do |tag|
13
+ send(tag[1..-2], attachment, model, style)
14
+ end
15
+ end
16
+
17
+ def self.id(attachment, model, style)
18
+ model.id
19
+ end
20
+
21
+ def self.model(attachment, model, style)
22
+ model.class.to_s.underscore.pluralize
23
+ end
24
+
25
+ def self.host(attachment, model, style)
26
+ "/system"
27
+ end
28
+
29
+ def self.path(attachment, model, style)
30
+ "#{Rails.root}/public/system"
31
+ end
32
+
33
+ def self.style(attachment, model, style)
34
+ style
35
+ end
36
+
37
+ def self.format(attachment, model, style)
38
+ attachment.options[:styles][style][:format]
39
+ end
40
+
41
+ def self.filename(attachment, model, style)
42
+ model.send("#{attachment.name}_filename")
43
+ end
44
+
45
+ def self.filesize(attachment, model, style)
46
+ model.send("#{attachment.name}_filesize")
47
+ end
48
+
49
+ def self.basename(attachment, model, style)
50
+ model.send("#{attachment.name}_basename")
51
+ end
52
+
53
+ def self.extname(attachment, model, style)
54
+ File.extname(filename(attachment, model, style))
55
+ end
56
+
57
+ def self.rails_root(attachment, model, style)
58
+ Rails.root
59
+ end
60
+
61
+ def self.rails_env(attachment, model, style)
62
+ Rails.env
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+
@@ -0,0 +1,29 @@
1
+ module Sequel
2
+ module Plugins
3
+ module Paperclip
4
+ module Processors
5
+ class Dummy
6
+ attr_reader :name
7
+ attr_reader :attachment
8
+ attr_reader :options
9
+
10
+ def initialize(attachment, options)
11
+ @name = self.class.name
12
+ end
13
+
14
+ def pre_runs(model, src_path)
15
+ @src_path = src_path
16
+ end
17
+
18
+ def run(style, style_options, dst_file)
19
+ FileUtils.cp(@src_path, dst_file.path)
20
+ end
21
+
22
+ def post_runs
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,131 @@
1
+ module Sequel
2
+ module Plugins
3
+ module Paperclip
4
+ module Processors
5
+ class Image
6
+ attr_reader :name
7
+ attr_reader :attachment
8
+ attr_reader :options
9
+
10
+ def initialize(attachment, options)
11
+ @name = self.class.name
12
+ @attachment = attachment
13
+ @options = options
14
+ end
15
+
16
+ def pre_runs(model, src_path)
17
+ @model = model
18
+ @src_path = src_path
19
+ @src_geometry = Geometry.from_file(@src_path)
20
+ end
21
+
22
+ def run(style, style_options, dst_file)
23
+ dst_geometry = Geometry.from_s(style_options[:geometry])
24
+ dst_crop = style_options[:geometry][-1,1] == "#"
25
+ resize_str, crop_str = @src_geometry.transform(dst_geometry, dst_crop)
26
+
27
+ cmd = []
28
+ cmd << "convert"
29
+ cmd << "-resize"
30
+ cmd << "'#{resize_str}'"
31
+ if crop_str
32
+ cmd << "-crop"
33
+ cmd << "'#{crop_str}'"
34
+ end
35
+ if options[:convert_arguments]
36
+ cmd << options[:convert_arguments]
37
+ end
38
+ cmd << @src_path
39
+ cmd << "#{style_options[:format]}:#{dst_file.path}"
40
+ `#{cmd*" "}`
41
+ end
42
+
43
+ def post_runs
44
+ end
45
+ end
46
+
47
+ class Image
48
+ class Geometry
49
+ attr_accessor :height, :width, :modifiers
50
+
51
+ def initialize(width = nil, height = nil, modifiers = nil)
52
+ self.width = width.to_f
53
+ self.height = height.to_f
54
+ self.modifiers = modifiers
55
+ end
56
+
57
+ def self.from_file(file)
58
+ path = file.respond_to?(:path) ? file.path : file
59
+ geometry = `identify -format %wx%h #{path}`
60
+ from_s(geometry)
61
+ end
62
+
63
+ def self.from_s(string)
64
+ match = string.match(/(\d+)x(\d+)(.*)/)
65
+ if match
66
+ Geometry.new(match[1], match[2], match[3])
67
+ end
68
+ end
69
+
70
+ def to_s
71
+ "%dx%d"%[self.width, self.height]+self.modifiers
72
+ end
73
+
74
+ def square?
75
+ height == width
76
+ end
77
+
78
+ def horizontal?
79
+ height < width
80
+ end
81
+
82
+ def vertical?
83
+ height > width
84
+ end
85
+
86
+ def aspect
87
+ width/height
88
+ end
89
+
90
+ def larger
91
+ [height, width].max
92
+ end
93
+
94
+ def smaller
95
+ [height, width].min
96
+ end
97
+
98
+ def transform(dst, crop = false)
99
+ if crop
100
+ ratio = Geometry.new(dst.width/self.width, dst.height/self.height)
101
+ scale_geometry, scale = scaling(dst, ratio)
102
+ crop_geometry = cropping(dst, ratio, scale)
103
+ else
104
+ scale_geometry = dst.to_s
105
+ crop_geometry = nil
106
+ end
107
+ [scale_geometry, crop_geometry]
108
+ end
109
+
110
+ def scaling(dst, ratio)
111
+ if ratio.horizontal? || ratio.square?
112
+ ["%dx"%dst.width, ratio.width]
113
+ else
114
+ ["x%d"%dst.height, ratio.height]
115
+ end
116
+ end
117
+
118
+ def cropping(dst, ratio, scale)
119
+ if ratio.horizontal? || ratio.square?
120
+ "%dx%d+%d+%d"%[dst.width, dst.height, 0, (self.height*scale-dst.height)/2]
121
+ else
122
+ "%dx%d+%d+%d"%[dst.width, dst.height, (self.width*scale-dst.width)/2, 0]
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ class PaperclipValidator < ActiveModel::EachValidator
3
+ def humanized_size(num)
4
+ for x in ['Byte','KB','MB','GB','TB']
5
+ return "%d %s"%[num, x] if num < 1024.0
6
+ num /= 1024.0
7
+ end
8
+ end
9
+
10
+ def validate_each(model, attribute, value)
11
+ return unless value
12
+
13
+ if options[:size]
14
+ min = options[:size].min
15
+ max = options[:size].max
16
+ if value.size < min
17
+ model.errors.add(attribute, "zu klein (mindestes #{humanized_size(min)})")
18
+ end
19
+ if value.size > max
20
+ model.errors.add(attribute, "zu groß (maximal #{humanized_size(max)})")
21
+ end
22
+ end
23
+
24
+ if options[:geometry]
25
+ geo1 = Sequel::Plugins::Paperclip::Processors::Image::Geometry.from_s(options[:geometry])
26
+ geo2 = Sequel::Plugins::Paperclip::Processors::Image::Geometry.from_file(value)
27
+ if geo2
28
+ if geo2.width < geo1.width
29
+ model.errors.add(attribute, "zu klein (weniger als %d Pixel breit)"%[geo1.width])
30
+ end
31
+ if geo2.height < geo1.height
32
+ model.errors.add(attribute, "zu klein (weniger als %d Pixel hoch)"%[geo1.height])
33
+ end
34
+ else
35
+ model.errors.add(attribute, "unbekanntes Bildformat oder Datei beschäftigt")
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,133 @@
1
+ require 'tempfile'
2
+ require 'sequel_paperclip/interpolations'
3
+ require 'sequel_paperclip/attachment'
4
+ require 'sequel_paperclip/processors/dummy'
5
+ require 'sequel_paperclip/processors/image'
6
+ require 'sequel_paperclip/validators/activemodel'
7
+
8
+ module Sequel
9
+ module Plugins
10
+ module Paperclip
11
+ def self.apply(model, opts={}, &block)
12
+ end
13
+
14
+ def self.configure(model, opts={}, &block)
15
+ model.class_inheritable_hash :attachments
16
+ model.attachments = {}
17
+ end
18
+
19
+ module ClassMethods
20
+ def attachment(name, options)
21
+ attr_accessor name
22
+
23
+ attachment = Attachment.new(name, options)
24
+ attachments[name] = attachment
25
+
26
+ columns = db_schema.keys
27
+ unless columns.include?(:"#{name}_filename") || columns.include?(:"#{name}_basename")
28
+ raise ArgumentError, "a column named #{name}_filename or #{name}_basename has to exist"
29
+ end
30
+
31
+ if columns.include?(:"#{name}_filename")
32
+ if columns.include?(:"#{name}_basename")
33
+ raise ArgumentError, "it does not make sense to have a column named #{name}_filename and #{name}_basename"
34
+ end
35
+
36
+ define_method("#{name}_basename") do
37
+ filename = send("#{name}_filename")
38
+ filename ? File.basename(filename) : nil
39
+ end
40
+
41
+ define_method("#{name}_basename=") do |basename|
42
+ old_filename = send("#{name}_filename")
43
+ extname = old_filename ? File.extname(old_filename) : ""
44
+ send("#{name}_filename=", basename+extname)
45
+ end
46
+ end
47
+
48
+ define_method("#{name}?") do
49
+ attachment.exists?(self)
50
+ end
51
+
52
+ define_method("#{name}_url") do |style|
53
+ attachment.url(self, style)
54
+ end
55
+
56
+ define_method("#{name}_path") do |style|
57
+ attachment.path(self, style)
58
+ end
59
+ end
60
+ end
61
+
62
+ module InstanceMethods
63
+ def before_save
64
+ self.class.attachments.each_value do |attachment|
65
+ file = send(attachment.name)
66
+ next unless file
67
+
68
+ unless file.is_a?(File) || file.is_a?(Tempfile)
69
+ raise ArgumentError, "#{attachment.name} is not a File"
70
+ end
71
+
72
+ basename = send("#{attachment.name}_basename")
73
+ if basename.blank?
74
+ basename = ActiveSupport::SecureRandom.hex(4).to_s
75
+ send("#{attachment.name}_basename=", basename)
76
+ end
77
+
78
+ if respond_to?("#{attachment.name}_filename")
79
+ send("#{attachment.name}_filename=", basename+File.extname(file.original_filename).downcase)
80
+ end
81
+
82
+ if respond_to?("#{attachment.name}_filesize")
83
+ send("#{attachment.name}_filesize=", file.size)
84
+ end
85
+
86
+ if respond_to?("#{attachment.name}_originalname")
87
+ send("#{attachment.name}_originalname=", file.original_filename)
88
+ end
89
+ end
90
+ super
91
+ end
92
+
93
+ def after_save
94
+ self.class.attachments.each_value do |attachment|
95
+ file = send(attachment.name)
96
+ next unless file
97
+
98
+ files_to_store = attachment.process(self, file.path)
99
+ attachment.options[:styles].each_key do |style|
100
+ src_file = files_to_store[style]
101
+ dst_path = attachment.path(self, style)
102
+ puts "saving #{dst_path} (#{src_file.size} bytes)"
103
+ FileUtils.mkdir_p(File.dirname(dst_path))
104
+ FileUtils.cp(src_file.path, dst_path)
105
+ src_file.close!
106
+ end
107
+ end
108
+ super
109
+ end
110
+
111
+ def after_destroy
112
+ self.class.attachments.each_value do |attachment|
113
+ attachment.options[:styles].each_key do |style|
114
+ next unless attachment.exists?(self)
115
+ dst_path = attachment.path(self, style)
116
+
117
+ puts "deleting #{dst_path}"
118
+ begin
119
+ FileUtils.rm(dst_path)
120
+ rescue Errno::ENOENT => error
121
+ end
122
+ end
123
+ end
124
+ super
125
+ end
126
+ end
127
+
128
+ module DatasetMethods
129
+ end
130
+ end
131
+ end
132
+ end
133
+
@@ -0,0 +1,60 @@
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{sequel_paperclip}
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Corin Langosch"]
12
+ s.date = %q{2010-08-31}
13
+ s.description = %q{Sequel plugin which provides Paperclip (attachments, thumbnail resizing, etc.) functionality for model.}
14
+ s.email = %q{info@netskin.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/sequel_paperclip.rb",
27
+ "lib/sequel_paperclip/attachment.rb",
28
+ "lib/sequel_paperclip/interpolations.rb",
29
+ "lib/sequel_paperclip/processors/dummy.rb",
30
+ "lib/sequel_paperclip/processors/image.rb",
31
+ "lib/sequel_paperclip/validators/activemodel.rb",
32
+ "sequel_paperclip.gemspec",
33
+ "spec/sequel_paperclip_spec.rb",
34
+ "spec/spec.opts",
35
+ "spec/spec_helper.rb"
36
+ ]
37
+ s.homepage = %q{http://github.com/gucki/sequel_paperclip}
38
+ s.rdoc_options = ["--charset=UTF-8"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = %q{1.3.7}
41
+ s.summary = %q{Easy file attachment management for Sequel}
42
+ s.test_files = [
43
+ "spec/spec_helper.rb",
44
+ "spec/sequel_paperclip_spec.rb"
45
+ ]
46
+
47
+ if s.respond_to? :specification_version then
48
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
49
+ s.specification_version = 3
50
+
51
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
53
+ else
54
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
58
+ end
59
+ end
60
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "SequelPaperclip" do
4
+ it "fails" do
5
+ fail "hey buddy, you should probably rename this file and start specing for real"
6
+ end
7
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,9 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'sequel_paperclip'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+
7
+ Spec::Runner.configure do |config|
8
+
9
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: sequel_paperclip
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Corin Langosch
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-08-31 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 2
31
+ - 9
32
+ version: 1.2.9
33
+ type: :development
34
+ version_requirements: *id001
35
+ description: Sequel plugin which provides Paperclip (attachments, thumbnail resizing, etc.) functionality for model.
36
+ email: info@netskin.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files:
42
+ - LICENSE
43
+ - README.rdoc
44
+ files:
45
+ - .document
46
+ - .gitignore
47
+ - LICENSE
48
+ - README.rdoc
49
+ - Rakefile
50
+ - VERSION
51
+ - lib/sequel_paperclip.rb
52
+ - lib/sequel_paperclip/attachment.rb
53
+ - lib/sequel_paperclip/interpolations.rb
54
+ - lib/sequel_paperclip/processors/dummy.rb
55
+ - lib/sequel_paperclip/processors/image.rb
56
+ - lib/sequel_paperclip/validators/activemodel.rb
57
+ - sequel_paperclip.gemspec
58
+ - spec/sequel_paperclip_spec.rb
59
+ - spec/spec.opts
60
+ - spec/spec_helper.rb
61
+ has_rdoc: true
62
+ homepage: http://github.com/gucki/sequel_paperclip
63
+ licenses: []
64
+
65
+ post_install_message:
66
+ rdoc_options:
67
+ - --charset=UTF-8
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ required_rubygems_version: !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ segments:
84
+ - 0
85
+ version: "0"
86
+ requirements: []
87
+
88
+ rubyforge_project:
89
+ rubygems_version: 1.3.7
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: Easy file attachment management for Sequel
93
+ test_files:
94
+ - spec/spec_helper.rb
95
+ - spec/sequel_paperclip_spec.rb