file_upload_cache 1.0.0

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/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'uuid'
4
+ gem "rails", ">= 3.0.12"
5
+
6
+ group :test do
7
+ # For testing the formtastic input. Not required, we won't add the
8
+ # input if it doesn't exist
9
+ gem 'formtastic'
10
+ end
11
+
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+ require 'rubygems'
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ require 'rake'
10
+
11
+ require 'rake/testtask'
12
+
13
+ Rake::TestTask.new(:test) do |t|
14
+ t.libs << 'lib'
15
+ t.libs << 'test'
16
+ t.pattern = 'test/**/*_test.rb'
17
+ t.verbose = false
18
+ end
19
+
20
+ task :default => :test
21
+
@@ -0,0 +1,21 @@
1
+ module FileUploadCache
2
+ class CachedFilesController < ActionController::Base
3
+ before_filter :require_current_cached_file, :only => :show
4
+
5
+ def show
6
+ options = {:disposition => 'inline'}
7
+ options.merge!({:type => current_cached_file.content_type}) if current_cached_file.content_type
8
+ send_data current_cached_file.read, options
9
+ end
10
+
11
+ private
12
+
13
+ def current_cached_file
14
+ @current_cached_file ||= FileUploadCache::CachedFile.find(params[:id])
15
+ end
16
+
17
+ def require_current_cached_file
18
+ render :text => 'not found', :status => :not_found unless current_cached_file
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,53 @@
1
+ # A formtastic input which incorporates a cache_id that can be fetched from server
2
+ #
3
+ # Example: `form.input :file, as: "uploader"`
4
+ if defined?(Formtastic)
5
+ class UploaderInput < Formtastic::Inputs::FileInput
6
+ def method_present?
7
+ object.send(method).present?
8
+ end
9
+
10
+ def wrapper_html_options
11
+ super.tap do |options|
12
+ options[:class] << " present" if method_present?
13
+ end
14
+ end
15
+
16
+ def cache_html
17
+ builder.hidden_field("#{method}_cache_id", :value => object.send("cached_#{method}").try(:id), :id => "#{base_id}_cache")
18
+ end
19
+
20
+ def file_html
21
+ builder.file_field(method, input_html_options.merge(:class => 'cached_file', :id => base_id))
22
+ end
23
+
24
+ def existing_html
25
+ if method_present?
26
+ existing = template.content_tag(:span, object.send("cached_#{method}").try(:original_filename))
27
+ template.content_tag(:div, :id => "#{base_id}_existing") do
28
+ template.link_to(existing, Rails.application.routes.url_helpers.file_upload_cache_cached_file_path(object.send("cached_#{method}").try(:id))) <<
29
+ template.content_tag(:span, " replace", :id => "#{base_id}_replace")
30
+ end
31
+ end or "".html_safe
32
+ end
33
+
34
+ def replace_html
35
+ file_html
36
+ end
37
+
38
+ def to_html
39
+ input_wrapping do
40
+ label_html <<
41
+ cache_html <<
42
+ existing_html <<
43
+ file_html
44
+ end
45
+ end
46
+
47
+ def base_id
48
+ input_html_options[:id] || method
49
+ end
50
+
51
+ end
52
+
53
+ end
@@ -0,0 +1,29 @@
1
+ module FileUploadCache
2
+ class CachedFile
3
+ attr_accessor :read, :id, :original_filename, :content_type
4
+
5
+ def initialize(attributes)
6
+ attributes.each do |k, v|
7
+ self.send("#{k}=", v)
8
+ end
9
+ end
10
+
11
+ def self.store(image)
12
+ id = UUID.generate(:compact)
13
+ cached_file = self.new(:read => image.read,
14
+ :original_filename => image.respond_to?(:original_filename) ? image.original_filename : nil,
15
+ :id => id,
16
+ :content_type => image.respond_to?(:content_type) ? image.content_type : nil)
17
+
18
+ FileUploadCache.file_cache.write("FileUploadCache::#{id}", cached_file)
19
+
20
+ cached_file
21
+ end
22
+
23
+ def self.find(id)
24
+ FileUploadCache.file_cache.read("FileUploadCache::#{id}")
25
+ end
26
+
27
+ end
28
+
29
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,6 @@
1
+ Rails.application.routes.draw do
2
+ namespace :file_upload_cache do
3
+ resources :cached_files, :only => :show
4
+ end
5
+ end
6
+
@@ -0,0 +1,43 @@
1
+ module FileUploadCache
2
+ module CachedAttributes
3
+ extend ActiveSupport::Concern
4
+
5
+ module ClassMethods
6
+
7
+ def cached_file_for(field)
8
+ attr_accessor :"#{field}_cache_id", :"cached_#{field}"
9
+ define_method "#{field}_with_cache=" do |value|
10
+ instance_variable_set("@#{field}_original", value)
11
+ self.send("#{field}_without_cache=", value)
12
+ end
13
+
14
+ alias_method_chain :"#{field}=", :cache
15
+
16
+ before_validation lambda {
17
+ original = self.instance_variable_get("@#{field}_original")
18
+ self.send("cached_#{field}=", CachedFile.store(original)) unless original.blank?
19
+ if( ! self.send("#{field}_cache_id").blank? && original.blank? )
20
+ cached_file = CachedFile.find(self.send("#{field}_cache_id"))
21
+
22
+ tf = Tempfile.new("temp_file")
23
+
24
+ begin
25
+ tf.binmode
26
+ tf.write(cached_file.read)
27
+
28
+ tf.rewind
29
+ self.send("#{field}=", tf)
30
+ self.send("cached_#{field}=", cached_file)
31
+ ensure
32
+ tf.close
33
+ end
34
+
35
+ end
36
+ }
37
+ end
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ ActiveRecord::Base.send(:include, FileUploadCache::CachedAttributes)
@@ -0,0 +1,4 @@
1
+ module FileUploadCache
2
+ class Engine < Rails::Engine
3
+ end
4
+ end
@@ -0,0 +1,20 @@
1
+ require 'file_upload_cache/engine.rb'
2
+ require 'active_support/core_ext/module/attribute_accessors.rb'
3
+ require 'file_upload_cache/cached_attributes.rb'
4
+ require 'uuid'
5
+
6
+ module FileUploadCache
7
+ mattr_accessor :cache
8
+
9
+ def self.file_cache
10
+ if cache
11
+ cache
12
+ elsif defined?(Rails)
13
+ Rails.cache
14
+ else
15
+ raise "Unspecified Cache Store for File Upload Cache"
16
+ end
17
+ end
18
+
19
+ end
20
+
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: file_upload_cache
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ken Mazaika
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: uuid
16
+ requirement: &70190206724540 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70190206724540
25
+ - !ruby/object:Gem::Dependency
26
+ name: rails
27
+ requirement: &70190206724100 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *70190206724100
36
+ description: Insert FileUploadCache description.
37
+ email:
38
+ executables: []
39
+ extensions: []
40
+ extra_rdoc_files: []
41
+ files:
42
+ - app/controllers/file_upload_cache/cached_files_controller.rb
43
+ - app/inputs/uploader_input.rb
44
+ - app/models/file_upload_cache/cached_file.rb
45
+ - lib/file_upload_cache/cached_attributes.rb
46
+ - lib/file_upload_cache/engine.rb
47
+ - lib/file_upload_cache.rb
48
+ - config/routes.rb
49
+ - Rakefile
50
+ - Gemfile
51
+ homepage:
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 1.8.10
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Insert FileUploadCache summary.
75
+ test_files: []