papermill 1.2.0 → 1.3.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/README.rdoc CHANGED
@@ -1,7 +1,5 @@
1
1
  = Papermill
2
2
 
3
-
4
-
5
3
  * Asset management made easy, 10 minutes integration.
6
4
  * All-you-can-eat glue around Polymorphic Paperclip table, SWFUpload & JQuery.
7
5
  * Associate any image or list of images with any model and any key.
@@ -165,6 +163,8 @@ Copy static assets to your public directory:
165
163
 
166
164
  Create the option file config/initializers/papermill.rb
167
165
  ./script/generate papermill_initializer
166
+
167
+ Go have a look to config/initializers/papermill.rb, lots of info there.
168
168
 
169
169
  === environment.rb:
170
170
 
@@ -172,7 +172,6 @@ Create the option file config/initializers/papermill.rb
172
172
  Rails::Initializer.run do |config|
173
173
  ...
174
174
  config.gem papermill
175
- config.gem "mime-types", :lib => "mime/types" # required for windows OS
176
175
  end
177
176
 
178
177
  === In your layout:
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'rake'
2
3
  require 'rake/testtask'
3
4
  require 'rake/rdoctask'
@@ -32,6 +33,7 @@ begin
32
33
  gemspec.homepage = "http://github.com/bbenezech/papermill"
33
34
  gemspec.authors = ["Benoit Bénézech"]
34
35
  gemspec.add_dependency('paperclip', '>= 2.3.1.1')
36
+ gemspec.add_dependency('mime-types')
35
37
  end
36
38
  rescue LoadError
37
39
  puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
data/TODO.txt CHANGED
@@ -1,5 +1,6 @@
1
1
  Edit views :
2
- * use Jcrop
3
2
  * try Picnic API
4
3
  * trad errors
5
- * migration with/whithout url_key
4
+ * migration with/whithout url_key
5
+
6
+ Errors on asset #create (to handle Paperclip validation)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.2.0
1
+ 1.3.0
@@ -3,6 +3,8 @@ class PapermillController < ApplicationController
3
3
  prepend_before_filter :load_assets, :only => [ "sort", "mass_delete", "mass_edit", "mass_thumbnail_reset" ]
4
4
 
5
5
  def show
6
+ # first escaping is done by rails prior to route recognition, need to do a second one on MSWIN systems to get original one.
7
+ params[:style] = CGI::unescape(params[:style]) if RUBY_PLATFORM =~ /win/
6
8
  if @asset.has_valid_url_key?(params[:url_key], params[:style]) && @asset.create_thumb_file(params[:style])
7
9
  redirect_to @asset.url(params[:style])
8
10
  else
@@ -29,10 +31,7 @@ class PapermillController < ApplicationController
29
31
  end
30
32
 
31
33
  def update
32
- if params[:target]
33
- @asset.create_thumb_file(params[:target], params[:papermill_asset].merge({ :geometry => "original#" }))
34
- end
35
-
34
+ @asset.create_thumb_file(params[:target], params[:papermill_asset].merge({ :geometry => "#{params[:target]}#" })) if params[:target]
36
35
  render :update do |page|
37
36
  if @asset.update_attributes(params[:papermill_asset])
38
37
  page << %{ notify("#{@asset.name}", "#{ escape_javascript t("papermill.updated", :resource => @asset.name)}", "notice"); close_popup(self); }
@@ -5,7 +5,7 @@
5
5
  <% @asset.papermill_options[:editable_fields].each do |field| %>
6
6
  <% key = field.keys.first %>
7
7
  <p>
8
- <%= form.label key, field[key][:label] || t("papermill.#{key}") %><br />
8
+ <%= form.label(key, (field[key][:label] || t("papermill.#{key}")).to_s) %><br />
9
9
  <% case field[key][:type]
10
10
  when "text" %>
11
11
  <%= form.text_area key %>
@@ -1,18 +1,44 @@
1
1
  <%= image_tag(@asset.url, :id => "cropbox") %>
2
2
 
3
- <form onsubmit="jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()), dataType:'script', type:'post', url:'/papermill/<%= @asset.id %>'}); return false;" method="post">
4
- <input type="hidden" value="put" name="_method"/>
5
- <input type="hidden" value="<%= params[:target] %>" name="target"/>
6
- <% fields_for :papermill_asset, @asset do |f| %>
7
- <% for attribute in [:crop_x, :crop_y, :crop_w, :crop_h] %>
8
- <%= f.hidden_field attribute, :id => attribute %>
9
- <% end %>
10
- <%= submit_tag I18n.t('papermill.save') %>
11
- <% end -%>
12
- </form>
3
+ <style type="text/css">
4
+ .jc_coords form {
5
+ -moz-background-clip:border;
6
+ -moz-background-inline-policy:continuous;
7
+ -moz-background-origin:padding;
8
+ background:#CCCCCC none repeat scroll 0 0;
9
+ border-color:#C3C3C3 #8B8B8B #8B8B8B #C3C3C3;
10
+ border-style:solid;
11
+ border-width:1px;
12
+ margin:0.5em 0;
13
+ padding:0.5em;
14
+ }
15
+ .jc_coords label {
16
+ font-size:12px;
17
+ font-weight:bold;
18
+ margin-right:0.5em;
19
+ }
20
+ .jc_coords .submit, .jc_coords a {
21
+ margin-right: 0.5em;
22
+ }
23
+ </style>
24
+
25
+ <div class="jc_coords">
26
+ <form onsubmit="jQuery.ajax({data:jQuery.param(jQuery(this).serializeArray()), dataType:'script', type:'post', url:'/papermill/<%= @asset.id %>'}); return false;" method="post">
27
+ <input type="hidden" value="put" name="_method"/>
28
+ <input type="hidden" value="<%= params[:target] %>" name="target"/>
29
+ <% fields_for :papermill_asset, @asset do |f| %>
30
+ <label>W <%= f.text_field :crop_w, :id => :crop_w, :size => 4, :readonly => "readonly" %></label>
31
+ <label>H <%= f.text_field :crop_h, :id => :crop_h, :size => 4, :readonly => "readonly" %></label>
32
+ <%= f.hidden_field :crop_x, :id => :crop_x %>
33
+ <%= f.hidden_field :crop_y, :id => :crop_y %>
34
+ <%= f.submit I18n.t('papermill.save'), :class => "submit" %>
35
+ <%= link_to_function I18n.t("papermill.back"), "popup('#{edit_papermill_path(@asset)}')" %>
36
+ <% end -%>
37
+ </form>
38
+ </div>
13
39
 
14
40
  <div style="margin:6px"></div>
15
- <%= link_to_function I18n.t("papermill.back"), "popup('#{edit_papermill_path(@asset)}')" %>
41
+
16
42
 
17
43
  <script type="text/javascript" charset="utf-8">
18
44
  jQuery(function() {
@@ -29,5 +55,13 @@
29
55
  jQuery("#crop_y").val(coords.y);
30
56
  jQuery("#crop_w").val(coords.w);
31
57
  jQuery("#crop_h").val(coords.h);
32
- }
58
+
59
+ };
60
+
61
+ /* browser don't know about windows content size when loading facebox if image not in cache, fixing facebox left */
62
+ jQuery(document).bind('reveal.facebox', function() {
63
+ jQuery(document).unbind('reveal.facebox'); /* clear self (one-shot binding) */
64
+ jQuery('#facebox').css('left', jQuery(window).width() / 2 - (<%= @asset.width %> / 2));
65
+ });
66
+
33
67
  </script>
data/lib/papermill.rb CHANGED
@@ -1,11 +1,17 @@
1
- #require "digest/sha2"
1
+ require "rbconfig"
2
+ begin
3
+ require "mime/types"
4
+ MIME_TYPE_LOADED = true
5
+ rescue
6
+ MIME_TYPE_LOADED = false
7
+ end
8
+
2
9
  I18n.load_path = [File.join(File.dirname(__FILE__), "../config/locales/papermill.yml")] + I18n.load_path
3
10
  require 'papermill/extensions'
4
11
  require 'papermill/flash_session_cookie_middleware.rb'
5
12
 
6
13
  Object.send :include, PapermillObjectExtensions
7
14
  Hash.send :include, PapermillHashExtensions
8
- File.send :include, PapermillFileExtensions
9
15
  String.send :include, StringToUrlNotFound unless String.instance_methods.include? "to_url"
10
16
  Formtastic::SemanticFormBuilder.send(:include, PapermillFormtasticExtensions) rescue NameError
11
17
 
@@ -21,16 +21,6 @@ module PapermillObjectExtensions
21
21
  end
22
22
  end
23
23
 
24
- module PapermillFileExtensions
25
- def get_content_type
26
- begin
27
- MIME::Types.type_for(self.original_filename).to_s
28
- rescue NameError
29
- `file --mime -br #{self.path}`.strip.split(";").first
30
- end
31
- end
32
- end
33
-
34
24
  module PapermillFormtasticExtensions
35
25
  def image_upload_input(method, options)
36
26
  self.label(method, options_for_label(options)) +
@@ -8,6 +8,8 @@ module Papermill
8
8
  @options ||= BASE_OPTIONS.deep_merge(defined?(OPTIONS) ? OPTIONS : {})
9
9
  end
10
10
 
11
+ MSWIN = (Config::CONFIG['host_os'] =~ /mswin|mingw/)
12
+
11
13
  def self.compute_paperclip_path
12
14
  path = []
13
15
  path << (options[:use_id_partition] ? ":id_partition" : ":id")
@@ -5,8 +5,8 @@ class PapermillAsset < ActiveRecord::Base
5
5
 
6
6
  has_attached_file :file,
7
7
  :processors => [:papermill_paperclip_processor],
8
- :url => "/#{Papermill::options[:papermill_url_prefix]}/#{Papermill::compute_paperclip_path.gsub(':style', ':escaped_style')}",
9
- :path => "#{Papermill::options[:public_root]}/#{Papermill::options[:papermill_path_prefix]}/#{Papermill::compute_paperclip_path}"
8
+ :url => "#{Papermill::options[:papermill_url_prefix]}/#{Papermill::compute_paperclip_path.gsub(':style', ':escape_style_in_url')}",
9
+ :path => "#{Papermill::options[:papermill_path_prefix]}/#{Papermill::compute_paperclip_path.gsub(':style', ':escape_style_in_path')}"
10
10
 
11
11
  before_post_process :set_file_name
12
12
 
@@ -21,14 +21,25 @@ class PapermillAsset < ActiveRecord::Base
21
21
  attachment.instance.compute_url_key((style || "original").to_s)
22
22
  end
23
23
 
24
- Paperclip.interpolates :escaped_style do |attachment, style|
25
- CGI::escape((style || "original").to_s)
24
+ Paperclip.interpolates :escape_style_in_url do |attachment, style|
25
+ # double escaping needed for windows (complains about '< > " | / \' ), to match escaped filesystem from front webserver pov
26
+ s = (style || "original").to_s
27
+ Papermill::MSWIN ? CGI::escape(CGI::escape(s)) : CGI::escape(s)
26
28
  end
27
29
 
30
+ Paperclip.interpolates :escape_style_in_path do |attachment, style|
31
+ s = (style || "original").to_s
32
+ Papermill::MSWIN ? CGI::escape(s) : s
33
+ end
34
+
28
35
  attr_accessor :crop_h, :crop_w, :crop_x, :crop_y
29
36
 
30
37
  def Filedata=(data)
31
- data.content_type = data.get_content_type # SWFUpload content-type fix
38
+ if !Papermill::MSWIN && !(mime = `file --mime -br #{File.new(data).path}`).blank? && !mime.starts_with?("cannot open")
39
+ data.content_type = mime.strip.split(";").first
40
+ elsif MIME_TYPE_LOADED && (mime = MIME::Types.type_for(data.original_filename))
41
+ data.content_type = mime.first.simplified
42
+ end
32
43
  self.file = data
33
44
  end
34
45
 
@@ -32,8 +32,8 @@ module Papermill
32
32
  # :form_helper_elements => [:upload_button, :container, :dashboard],
33
33
 
34
34
  # Dashboard elements
35
- # You can remove/change order of HTML elements.
36
- # :dashboard => [:mass_edit, :mass_thumbnail_reset, :mass_delete ],
35
+ # You can remove/change order of HTML elements. You can add :mass_thumbnail_reset to add a link to reset all thumbnails, although you shouldn't need it.
36
+ # :dashboard => [:mass_edit, :mass_delete ],
37
37
 
38
38
  # Attributes editable at once for all assets in a gallery
39
39
  # :mass_editable_fields => ["title", "copyright", "description"],
@@ -170,9 +170,9 @@ module Papermill
170
170
  # :url_key_salt => "change-me-to-your-favorite-pet-name",
171
171
  # :url_key_generator => Proc.new { |style, asset| Digest::SHA512.hexdigest("#{style}#{asset.id}#{Papermill::options[:url_key_salt]}")[0..10] },
172
172
 
173
- # added to :public_root as the root folder for all papermill assets (system is a default for static assets with capistrano)
174
- # :papermill_url_prefix => "system/papermill",
173
+ # added before path/url. Your front webserver will need to be able to find your assets
175
174
  # :papermill_path_prefix => ":rails_root/public/system/papermill",
175
+ # :papermill_url_prefix => "/system/papermill",
176
176
 
177
177
  # you can set it to false if you don't plan to have too many assets. (dangerous)
178
178
  # :use_id_partition => true,
@@ -4,7 +4,7 @@ module Papermill
4
4
  :inline_css => true,
5
5
  :images_only => false,
6
6
  :form_helper_elements => [:upload_button, :container, :dashboard],
7
- :dashboard => [:mass_edit, :mass_thumbnail_reset, :mass_delete],
7
+ :dashboard => [:mass_edit, :mass_delete],
8
8
  :mass_editable_fields => ["title", "copyright", "description"],
9
9
  :editable_fields => [
10
10
  {:title => {:type => "string"}},
@@ -54,7 +54,7 @@ module Papermill
54
54
  :url_key_salt => "change-me-please",
55
55
  :url_key_generator => Proc.new { |style, asset| Digest::SHA512.hexdigest("#{style}#{asset.id}#{Papermill::options[:url_key_salt]}")[0..10] },
56
56
  :use_id_partition => true,
57
- :papermill_url_prefix => "system/papermill",
57
+ :papermill_url_prefix => "/system/papermill",
58
58
  :papermill_path_prefix => ":rails_root/public/system/papermill",
59
59
  }
60
60
  end
@@ -1,3 +1,5 @@
1
+ # encoding: utf-8
2
+
1
3
  module Paperclip
2
4
 
3
5
  # Handles thumbnailing images that are uploaded.
@@ -113,7 +113,6 @@ class PapermillTest < Test::Unit::TestCase
113
113
  end
114
114
 
115
115
  def test_content_type
116
- assert_equal @file.get_content_type, "image/png"
117
116
  assert_equal @asset1.content_type, "image/png"
118
117
  end
119
118
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: papermill
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - "Benoit B\xC3\xA9n\xC3\xA9zech"
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-08 00:00:00 +01:00
12
+ date: 2009-12-15 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -22,6 +22,16 @@ dependencies:
22
22
  - !ruby/object:Gem::Version
23
23
  version: 2.3.1.1
24
24
  version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: mime-types
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
25
35
  description: Paperclip Swfupload UploadHelper wrapper
26
36
  email: benoit.benezech@gmail.com
27
37
  executables: []