papermill 1.1.0 → 1.1.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.rdoc +64 -56
- data/VERSION +1 -1
- data/app/controllers/papermill_controller.rb +0 -4
- data/generators/papermill_table/templates/migrate/papermill_migration.rb.erb +11 -6
- data/lib/papermill.rb +3 -0
- data/lib/papermill/flash_session_cookie_middleware.rb +16 -0
- data/lib/papermill/form_builder.rb +6 -1
- data/lib/papermill/papermill.rb +12 -8
- data/lib/papermill/papermill_asset.rb +6 -5
- data/lib/papermill/papermill_helper.rb +2 -2
- data/lib/papermill/papermill_paperclip_processor.rb +58 -0
- data/test/papermill_test.rb +13 -1
- metadata +5 -3
    
        data/README.rdoc
    CHANGED
    
    | @@ -1,39 +1,47 @@ | |
| 1 1 | 
             
            = Papermill 
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 3 | 
            +
             | 
| 4 | 
            +
             | 
| 5 | 
            +
            * Asset management made easy, 10 minutes integration.
         | 
| 6 | 
            +
            * All-you-can-eat glue around Polymorphic Paperclip table, SWFUpload & JQuery. 
         | 
| 7 | 
            +
            * Associate any image or list of images with any model and any key. 
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            == Install the gem
         | 
| 10 | 
            +
              
         | 
| 11 | 
            +
              sudo gem install papermill
         | 
| 12 | 
            +
             
         | 
| 13 | 
            +
            == Try the demo
         | 
| 14 | 
            +
              
         | 
| 15 | 
            +
              rails -m http://github.com/bbenezech/papermill/raw/master/demo.txt papermill-example
         | 
| 6 16 |  | 
| 7 17 | 
             
            === Out-of-the-box OPTIONAL compatibility with : 
         | 
| 8 18 |  | 
| 9 | 
            -
            Formtastic          # use :as => :[image|asset](s)_upload
         | 
| 10 | 
            -
            JGrowl              # instead of alert for notifications
         | 
| 11 | 
            -
            FaceBox/Shadowbox   # instead of a pop_up for edit form
         | 
| 12 | 
            -
            Stringex            # (or any String#to_url) for asset filename/url generation
         | 
| 19 | 
            +
            * Formtastic          # use :as => :[image|asset](s)_upload
         | 
| 20 | 
            +
            * JGrowl              # instead of alert for notifications
         | 
| 21 | 
            +
            * FaceBox/Shadowbox   # instead of a pop_up for edit form
         | 
| 22 | 
            +
            * Stringex            # (or any String#to_url) for asset filename/url generation
         | 
| 13 23 |  | 
| 14 24 | 
             
            === Navigator minimal requirements: 
         | 
| 15 25 |  | 
| 16 | 
            -
            IE6 | 
| 26 | 
            +
            * IE6+
         | 
| 27 | 
            +
            * Flash 9+
         | 
| 28 | 
            +
            * Javascript ON. 
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            Check your audience.
         | 
| 17 31 |  | 
| 18 32 | 
             
            === Server requirements:
         | 
| 19 33 |  | 
| 20 | 
            -
             | 
| 21 | 
            -
            Rails 2.3 (rail's I18n, engine)
         | 
| 22 | 
            -
            Paperclip 2.3 branch (installed by default as a gem dependency, will be loaded internally if needed)
         | 
| 23 | 
            -
             | 
| 34 | 
            +
            * Makes internal use of JQuery (but loaded in compatibility mode by default, compatible with Prototype/whatever... JRails not needed.)
         | 
| 35 | 
            +
            * Rails 2.3 (rail's I18n, engine)
         | 
| 36 | 
            +
            * Paperclip 2.3 branch (installed by default as a gem dependency, will be loaded internally if needed => You can require your own version of Paperclip)
         | 
| 37 | 
            +
            * Front web server serving static assets if present, and forwarding demand to rails if not. (Usually a no-brainer on any classic installation. Works with Webrick)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
             | 
| 40 | 
            +
            === Windows environnement :
         | 
| 41 | 
            +
             | 
| 24 42 | 
             
              # Mime/Types library. Ex:
         | 
| 25 43 | 
             
              config.gem "mime-types", :lib => "mime/types"
         | 
| 26 44 |  | 
| 27 | 
            -
            Front web server serving static assets if present, and forwarding demand to rails if not. (Usually a no-brainer on any classic installation. Works with Webrick)
         | 
| 28 | 
            -
             | 
| 29 | 
            -
            == Install the gem
         | 
| 30 | 
            -
              
         | 
| 31 | 
            -
              $ sudo gem install papermill
         | 
| 32 | 
            -
             
         | 
| 33 | 
            -
            == Try the demo
         | 
| 34 | 
            -
              
         | 
| 35 | 
            -
              $ rails -m http://github.com/bbenezech/papermill/raw/master/demo.txt papermill-example
         | 
| 36 | 
            -
             | 
| 37 45 | 
             
            == Features
         | 
| 38 46 |  | 
| 39 47 | 
             
            Loads of them
         | 
| @@ -68,36 +76,25 @@ Loads of them | |
| 68 76 | 
             
            * :third_alias => {:geometry => '100:122', :my_other_keys => 'blblabla'}  # if you have a customed Paperclip::Thumbnail processor, you can pass any values you need.
         | 
| 69 77 | 
             
            * Use them when you need them : my_asset.url(:big_alias)
         | 
| 70 78 |  | 
| 71 | 
            -
            == Papermill comes in 2 flavors:
         | 
| 72 | 
            -
             | 
| 73 | 
            -
            === Generic catch-all declaration
         | 
| 74 | 
            -
             | 
| 75 | 
            -
              papermill options_hash                                # in your papermilled assetable model
         | 
| 76 | 
            -
              @article.assets(:any_key, options_hash)               # data access
         | 
| 77 | 
            -
             | 
| 78 | 
            -
            === Association specific declaration
         | 
| 79 | 
            -
             | 
| 80 | 
            -
              papermill :my_association, options_hash               # in your papermilled assetable model
         | 
| 81 | 
            -
              @article.my_association                               # data access
         | 
| 82 | 
            -
             | 
| 83 | 
            -
            == Usage:
         | 
| 84 | 
            -
             | 
| 85 79 | 
             
            === Model declaration
         | 
| 86 80 |  | 
| 87 81 | 
             
            You can have a generic association and as many declarative associations as you want in your model. Papermill will always use specific if found.
         | 
| 88 82 |  | 
| 89 83 | 
             
            article.rb
         | 
| 84 | 
            +
             | 
| 90 85 | 
             
              class Article < ActiveRecord::Base
         | 
| 91 86 | 
             
                papermill :class_name => ColorAsset, other_options..
         | 
| 92 87 | 
             
              end
         | 
| 93 88 |  | 
| 94 89 | 
             
            entry.rb
         | 
| 90 | 
            +
             | 
| 95 91 | 
             
              class Entry < ActiveRecord::Base
         | 
| 96 | 
            -
                papermill :mug_shot, other_options.. | 
| 92 | 
            +
                papermill :mug_shot, other_options..
         | 
| 97 93 | 
             
                papermill :diaporama, :class_name => ColorAsset, other_options..
         | 
| 98 94 | 
             
              end
         | 
| 99 95 |  | 
| 100 96 | 
             
            color_asset.rb  # You should add columns to papermill_assets and use STI on PapermillAsset to extend defaults capabilities (or re-open PapermillAsset and monkey-patch it..)
         | 
| 97 | 
            +
             | 
| 101 98 | 
             
              class ColorAsset < PapermillAsset
         | 
| 102 99 | 
             
                named_scope :red, :conditions => {:color => 'red'}
         | 
| 103 100 | 
             
              end
         | 
| @@ -105,6 +102,7 @@ color_asset.rb  # You should add columns to papermill_assets and use STI on Pape | |
| 105 102 | 
             
            === Form helpers
         | 
| 106 103 |  | 
| 107 104 | 
             
            FormHelpers
         | 
| 105 | 
            +
             | 
| 108 106 | 
             
              form_for @article do 
         | 
| 109 107 | 
             
                f.image_upload  :cover_image, options_hash
         | 
| 110 108 | 
             
                f.images_upload :illustrations, options_hash
         | 
| @@ -113,6 +111,7 @@ FormHelpers | |
| 113 111 | 
             
              end
         | 
| 114 112 |  | 
| 115 113 | 
             
            Or with formtastic :
         | 
| 114 | 
            +
             | 
| 116 115 | 
             
              semantic_form_for @article do |f|
         | 
| 117 116 | 
             
                f.input @article, :cover_image, options_hash, :as => :image_upload
         | 
| 118 117 | 
             
                f.input @article, :illustrations, options_hash, :as => :images_upload
         | 
| @@ -121,13 +120,15 @@ Or with formtastic : | |
| 121 120 | 
             
              end
         | 
| 122 121 |  | 
| 123 122 | 
             
            FormTagHelpers
         | 
| 123 | 
            +
             | 
| 124 124 | 
             
              image_upload_tag  @article, :cover_image, options_hash
         | 
| 125 125 | 
             
              images_upload_tag @article, :illustrations, options_hash
         | 
| 126 126 | 
             
              asset_upload_tag  @article, :pdf, options_hash
         | 
| 127 127 | 
             
              image_upload_tag  @article, :other_ressources, options_hash
         | 
| 128 | 
            -
             | 
| 129 | 
            -
             | 
| 130 | 
            -
              
         | 
| 128 | 
            +
             | 
| 129 | 
            +
            For resources not linked to any assetable model :
         | 
| 130 | 
            +
              image_upload_tag "#{current_organization.name}_logo"
         | 
| 131 | 
            +
             | 
| 131 132 | 
             
            === Resource access
         | 
| 132 133 |  | 
| 133 134 | 
             
            With generic papermill association, Papermill generates an #assets(:key, *args) named_scope
         | 
| @@ -135,13 +136,14 @@ With generic papermill association, Papermill generates an #assets(:key, *args) | |
| 135 136 | 
             
              @article.assets(:illustrations, :order => "created_at DESC")
         | 
| 136 137 | 
             
              @article.assets(:illustrations).red.first
         | 
| 137 138 | 
             
              # etc.
         | 
| 138 | 
            -
             | 
| 139 | 
            -
            With declarative papermill associations, Papermill generates an #<association_key>(*args) named_scope
         | 
| 139 | 
            +
             | 
| 140 | 
            +
            With declarative papermill associations, Papermill also generates an #<association_key>(*args) named_scope
         | 
| 140 141 | 
             
              @entry.mug_shot.first
         | 
| 141 142 | 
             
              @entry.diaporama
         | 
| 142 143 | 
             
              @entry.diaporama(:order => "created_at DESC")
         | 
| 143 144 | 
             
              @entry.diaporama.red
         | 
| 144 145 | 
             
              # === @entry.diaporama(:conditions => {:color => "red"}) 
         | 
| 146 | 
            +
              # === @entry.assets(:diaporama, :conditions => {:color => "red"})
         | 
| 145 147 | 
             
              # etc.
         | 
| 146 148 |  | 
| 147 149 | 
             
            Or for non-assetable resources : 
         | 
| @@ -149,7 +151,7 @@ Or for non-assetable resources : | |
| 149 151 | 
             
              ColorAsset.all.red
         | 
| 150 152 |  | 
| 151 153 | 
             
            === Using PapermillAsset
         | 
| 152 | 
            -
             | 
| 154 | 
            +
             | 
| 153 155 | 
             
              @asset = @entry.mug_shot.first
         | 
| 154 156 | 
             
              image_tag @asset.url              # original
         | 
| 155 157 | 
             
              image_tag @asset.url("100x>")
         | 
| @@ -159,26 +161,32 @@ Or for non-assetable resources : | |
| 159 161 | 
             
              @asset.path                       # original
         | 
| 160 162 | 
             
              @asset.path("100x>")
         | 
| 161 163 | 
             
              # etc.
         | 
| 162 | 
            -
             | 
| 164 | 
            +
             | 
| 163 165 | 
             
            == Installation
         | 
| 164 166 |  | 
| 165 167 | 
             
            === Once gem is installed :
         | 
| 166 168 |  | 
| 167 | 
            -
             | 
| 168 | 
            -
               | 
| 169 | 
            -
             | 
| 170 | 
            -
             | 
| 171 | 
            -
               | 
| 172 | 
            -
             | 
| 173 | 
            -
             | 
| 174 | 
            -
              
         | 
| 175 | 
            -
            === Then in environment.rb:
         | 
| 169 | 
            +
            Generate the migration :
         | 
| 170 | 
            +
              ./script/generate papermill_table PapermillMigration
         | 
| 171 | 
            +
             | 
| 172 | 
            +
            Edit its fields and migrate :
         | 
| 173 | 
            +
              rake db:migrate
         | 
| 174 | 
            +
             | 
| 175 | 
            +
            Copy static assets to your public directory:
         | 
| 176 | 
            +
              ./script/generate papermill_assets
         | 
| 176 177 |  | 
| 178 | 
            +
            Create the option hash in config/initializers/papermill.rb
         | 
| 179 | 
            +
              ./script/generate papermill_initializer
         | 
| 180 | 
            +
             | 
| 181 | 
            +
            Then see config/initializers/papermill.rb for the option hash.
         | 
| 182 | 
            +
             | 
| 183 | 
            +
            === environment.rb:
         | 
| 184 | 
            +
             | 
| 177 185 | 
             
              ...
         | 
| 178 186 | 
             
              Rails::Initializer.run do |config|
         | 
| 179 187 | 
             
                ...
         | 
| 180 188 | 
             
                config.gem papermill
         | 
| 181 | 
            -
                config.gem "mime-types", :lib => "mime/types"  # required for windows  | 
| 189 | 
            +
                config.gem "mime-types", :lib => "mime/types"  # required for windows OS
         | 
| 182 190 | 
             
              end
         | 
| 183 191 |  | 
| 184 192 | 
             
            === In your layout:
         | 
| @@ -191,7 +199,7 @@ Or for non-assetable resources : | |
| 191 199 |  | 
| 192 200 | 
             
            Papermill is fully I18n-able.
         | 
| 193 201 | 
             
            Copy config/locales/papermill.yml to your root config/locale folder to modify any wording in a any locale.
         | 
| 194 | 
            -
             | 
| 202 | 
            +
              
         | 
| 195 203 | 
             
            Copyright (c) 2009 Benoit Bénézech, released under the MIT license
         | 
| 196 | 
            -
             | 
| 204 | 
            +
              
         | 
| 197 205 | 
             
            http://rubyonrails.org/images/rails.png
         | 
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            1.1. | 
| 1 | 
            +
            1.1.1
         | 
| @@ -1,8 +1,4 @@ | |
| 1 1 | 
             
            class PapermillController < ApplicationController
         | 
| 2 | 
            -
              # Create is protected because of the Ajax same origin policy. 
         | 
| 3 | 
            -
              # Yet SwfUpload doesn't send the right header for request.xhr? to be true and thus fails to disable verify_authenticity_token automatically.
         | 
| 4 | 
            -
              skip_before_filter :verify_authenticity_token, :only => [:create]
         | 
| 5 | 
            -
              
         | 
| 6 2 | 
             
              prepend_before_filter :load_asset, :only => [ "show", "destroy", "update", "edit" ]
         | 
| 7 3 | 
             
              prepend_before_filter :load_assets, :only => [ "sort", "mass_delete", "mass_edit" ]
         | 
| 8 4 |  | 
| @@ -9,18 +9,23 @@ class <%= migration_name %> < ActiveRecord::Migration | |
| 9 9 |  | 
| 10 10 | 
             
                  # Papermill fields (required)
         | 
| 11 11 | 
             
                  t.integer  :position          # sets are ordered by position
         | 
| 12 | 
            -
                   | 
| 13 | 
            -
                  t. | 
| 14 | 
            -
                   | 
| 12 | 
            +
                  
         | 
| 13 | 
            +
                  t.belongs_to :assetable, :polymorphic => true
         | 
| 14 | 
            +
                  
         | 
| 15 | 
            +
                  t.string   :assetable_key
         | 
| 15 16 | 
             
                  t.string   :type              # STI
         | 
| 16 | 
            -
                  t.string   :title             #  | 
| 17 | 
            +
                  t.string   :title             # filename not transformed, without file extension, for your own use
         | 
| 17 18 |  | 
| 18 | 
            -
                  #  | 
| 19 | 
            +
                  # Example additionals fields (configure :mass_editable_fields/:editable_fields accordingly)
         | 
| 19 20 | 
             
                  t.string   :alt
         | 
| 20 21 | 
             
                  t.string   :copyright
         | 
| 21 22 | 
             
                  t.text     :description
         | 
| 22 23 | 
             
                  t.timestamps
         | 
| 23 | 
            -
             | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
                
         | 
| 26 | 
            +
                change_table :papermill_assets do |t|
         | 
| 27 | 
            +
                  t.index [:assetable_type, :assetable_id, :assetable_key, :position]  
         | 
| 28 | 
            +
                  t.index [:assetable_key, :position]  # for non assetable assets
         | 
| 24 29 | 
             
                end
         | 
| 25 30 | 
             
              end
         | 
| 26 31 |  | 
    
        data/lib/papermill.rb
    CHANGED
    
    | @@ -1,5 +1,7 @@ | |
| 1 1 | 
             
            I18n.load_path = [File.join(File.dirname(__FILE__), "../config/locales/papermill.yml")] + I18n.load_path
         | 
| 2 2 | 
             
            require 'extensions'
         | 
| 3 | 
            +
            require 'papermill/flash_session_cookie_middleware.rb'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            Object.send :include, PapermillObjectExtensions
         | 
| 4 6 | 
             
            Hash.send :include, PapermillHashExtensions
         | 
| 5 7 | 
             
            File.send :include, PapermillFileExtensions
         | 
| @@ -13,6 +15,7 @@ rescue LoadError | |
| 13 15 | 
             
            end
         | 
| 14 16 |  | 
| 15 17 | 
             
            require 'paperclip' unless defined?(Paperclip)
         | 
| 18 | 
            +
            require 'papermill/papermill_paperclip_processor'
         | 
| 16 19 | 
             
            require 'papermill/papermill'
         | 
| 17 20 | 
             
            require 'papermill/papermill_asset'
         | 
| 18 21 | 
             
            require 'papermill/form_builder'
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require 'rack/utils'
         | 
| 2 | 
            +
             
         | 
| 3 | 
            +
            class FlashSessionCookieMiddleware
         | 
| 4 | 
            +
              def initialize(app, session_key = '_session_id')
         | 
| 5 | 
            +
                @app = app
         | 
| 6 | 
            +
                @session_key = session_key
         | 
| 7 | 
            +
              end
         | 
| 8 | 
            +
             
         | 
| 9 | 
            +
              def call(env)
         | 
| 10 | 
            +
                if env['HTTP_USER_AGENT'] =~ /^(Adobe|Shockwave) Flash/
         | 
| 11 | 
            +
                  params = ::Rack::Request.new(env).params
         | 
| 12 | 
            +
                  env['HTTP_COOKIE'] = [ @session_key, params[@session_key] ].join('=').freeze unless params[@session_key].nil?
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                @app.call(env)
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -109,7 +109,7 @@ module ActionView::Helpers::FormTagHelper | |
| 109 109 | 
             
                html[:upload_button] = %{<div id="#{id}-button-wrapper" class="papermill-button-wrapper" style="height: #{options[:swfupload][:button_height]}px;"><span id="browse_for_#{id}" class="swf_button"></span></div>}
         | 
| 110 110 | 
             
                html[:container] = @template.content_tag(:div, :id => id, :class => "#{(options[:thumbnail] ? "papermill-thumb-container" : "papermill-asset-container")} #{(options[:gallery] ? "papermill-multiple-items" : "papermill-unique-item")}") {
         | 
| 111 111 | 
             
                  @template.render :partial => "papermill/asset", :collection => collection, :locals => { :thumbnail_style => options[:thumbnail] && options[:thumbnail][:style] }
         | 
| 112 | 
            -
                } | 
| 112 | 
            +
                }
         | 
| 113 113 |  | 
| 114 114 | 
             
                if options[:gallery]
         | 
| 115 115 | 
             
                  html[:dashboard] = {}
         | 
| @@ -136,6 +136,10 @@ module ActionView::Helpers::FormTagHelper | |
| 136 136 |  | 
| 137 137 | 
             
                @template.content_for :papermill_inline_js do %{
         | 
| 138 138 | 
             
                    new SWFUpload({
         | 
| 139 | 
            +
                      post_params: {
         | 
| 140 | 
            +
                        "#{ActionController::Base.session_options[:key]}": "#{@template.cookies[ActionController::Base.session_options[:key]]}",
         | 
| 141 | 
            +
                        "authenticity_token": "#{@template.form_authenticity_token}"
         | 
| 142 | 
            +
                      },
         | 
| 139 143 | 
             
                      upload_id: "#{id}",
         | 
| 140 144 | 
             
                      upload_url: "#{@template.escape_javascript create_url}",
         | 
| 141 145 | 
             
                      file_types: "#{options[:images_only] ? '*.jpg;*.jpeg;*.png;*.gif' : ''}",
         | 
| @@ -153,6 +157,7 @@ module ActionView::Helpers::FormTagHelper | |
| 153 157 | 
             
                    });
         | 
| 154 158 | 
             
                  }
         | 
| 155 159 | 
             
              	end
         | 
| 160 | 
            +
                
         | 
| 156 161 | 
             
            	  %{<div class="papermill">#{@timestamp_field.to_s + options[:form_helper_elements].map{|element| html[element] || ""}.join("\n")}</div>}
         | 
| 157 162 | 
             
              end
         | 
| 158 163 | 
             
            end
         | 
    
        data/lib/papermill/papermill.rb
    CHANGED
    
    | @@ -24,16 +24,20 @@ module Papermill | |
| 24 24 | 
             
                  after_create :rebase_assets
         | 
| 25 25 | 
             
                  has_many :papermill_assets, :as => "Assetable", :dependent => :destroy
         | 
| 26 26 |  | 
| 27 | 
            -
                   | 
| 28 | 
            -
                     | 
| 29 | 
            -
             | 
| 30 | 
            -
                       | 
| 31 | 
            -
             | 
| 32 | 
            -
                       | 
| 27 | 
            +
                  [assoc_name, Papermill::options[:base_association_name].to_sym].uniq.each do |assoc|
         | 
| 28 | 
            +
                    define_method assoc do |*options|
         | 
| 29 | 
            +
                      scope = PapermillAsset.scoped(:conditions => {:assetable_id => self.id, :assetable_type => self.class.base_class.name})
         | 
| 30 | 
            +
                      if assoc != Papermill::options[:base_association_name]
         | 
| 31 | 
            +
                        scope = scope.scoped(:conditions => { :assetable_key => assoc.to_s })
         | 
| 32 | 
            +
                      elsif options.first && !options.first.is_a?(Hash)
         | 
| 33 | 
            +
                        scope = scope.scoped(:conditions => { :assetable_key => options.shift.to_s.nie })
         | 
| 34 | 
            +
                      end
         | 
| 35 | 
            +
                      scope = scope.scoped(options.shift) if options.first
         | 
| 36 | 
            +
                      scope
         | 
| 33 37 | 
             
                    end
         | 
| 34 | 
            -
                    scope = scope.scoped(options.shift) if options.first
         | 
| 35 | 
            -
                    scope
         | 
| 36 38 | 
             
                  end
         | 
| 39 | 
            +
                  ActionController::Dispatcher.middleware.delete(FlashSessionCookieMiddleware) rescue nil
         | 
| 40 | 
            +
                  ActionController::Dispatcher.middleware.insert_before(ActionController::Base.session_store, FlashSessionCookieMiddleware, ActionController::Base.session_options[:key]) rescue nil
         | 
| 37 41 | 
             
                end
         | 
| 38 42 |  | 
| 39 43 | 
             
                def inherited(subclass)
         | 
| @@ -1,9 +1,10 @@ | |
| 1 1 | 
             
            class PapermillAsset < ActiveRecord::Base
         | 
| 2 2 |  | 
| 3 3 | 
             
              before_destroy :destroy_files
         | 
| 4 | 
            -
              before_create :set_position | 
| 4 | 
            +
              before_create :set_position
         | 
| 5 5 |  | 
| 6 6 | 
             
              has_attached_file :file, 
         | 
| 7 | 
            +
                :processors => [:papermill_paperclip_processor],
         | 
| 7 8 | 
             
                :path => "#{Papermill::options[:public_root]}/#{Papermill::options[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING}",
         | 
| 8 9 | 
             
                :url => "/#{Papermill::options[:papermill_prefix]}/#{Papermill::PAPERCLIP_INTERPOLATION_STRING}"
         | 
| 9 10 |  | 
| @@ -12,9 +13,9 @@ class PapermillAsset < ActiveRecord::Base | |
| 12 13 | 
             
              validates_attachment_presence :file
         | 
| 13 14 |  | 
| 14 15 | 
             
              belongs_to :assetable, :polymorphic => true
         | 
| 15 | 
            -
              default_scope :order => ' | 
| 16 | 
            +
              default_scope :order => 'assetable_type, assetable_id, assetable_key, position'
         | 
| 16 17 |  | 
| 17 | 
            -
              named_scope :key, lambda { |assetable_key| { :conditions => ['assetable_key = ?', assetable_key] }}
         | 
| 18 | 
            +
              named_scope :key, lambda { |assetable_key| { :conditions => ['assetable_key = ?', assetable_key.to_s] }}
         | 
| 18 19 |  | 
| 19 20 | 
             
              def Filedata=(data)
         | 
| 20 21 | 
             
                data.content_type = data.get_content_type # SWFUpload content-type fix
         | 
| @@ -27,7 +28,7 @@ class PapermillAsset < ActiveRecord::Base | |
| 27 28 |  | 
| 28 29 | 
             
              def create_thumb_file(style_name)
         | 
| 29 30 | 
             
                FileUtils.mkdir_p File.dirname(file.path(style_name))
         | 
| 30 | 
            -
                FileUtils.mv(Paperclip:: | 
| 31 | 
            +
                FileUtils.mv(Paperclip::PapermillPaperclipProcessor.make(file, self.class.compute_style(style_name)).path, file.path(style_name))
         | 
| 31 32 | 
             
              end
         | 
| 32 33 |  | 
| 33 34 | 
             
              def id_partition
         | 
| @@ -100,7 +101,7 @@ class PapermillAsset < ActiveRecord::Base | |
| 100 101 | 
             
              end
         | 
| 101 102 |  | 
| 102 103 | 
             
              def set_position
         | 
| 103 | 
            -
                self.position ||= PapermillAsset. | 
| 104 | 
            +
                self.position ||= PapermillAsset.maximum(:position, :conditions => { :assetable_type => assetable_type, :assetable_id => assetable_id, :assetable_key => assetable_key } ).to_i + 1
         | 
| 104 105 | 
             
              end
         | 
| 105 106 |  | 
| 106 107 | 
             
              def destroy_files
         | 
| @@ -9,10 +9,10 @@ module PapermillHelper | |
| 9 9 | 
             
              # If you loaded jQuery and need to load only jQueryUI, call papermill_javascript_tag(:with_jqueryui_only => true)
         | 
| 10 10 | 
             
              def papermill_javascript_tag(options = {})
         | 
| 11 11 | 
             
                html = []
         | 
| 12 | 
            -
                if options[:with_jquery] || options[: | 
| 12 | 
            +
                if options[:with_jquery] || options[:with_jqueryui_only]
         | 
| 13 13 | 
             
                  html << %{<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>} if options[:with_jquery]
         | 
| 14 14 | 
             
                  html << %{<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.2/jquery-ui.min.js" type="text/javascript"></script>} if options[:with_jquery] || options[:with_jqueryui_only]
         | 
| 15 | 
            -
                  html << %{<script type="text/javascript">jQuery.noConflict();</script>} if options[:with_jquery] == "no_conflict"
         | 
| 15 | 
            +
                  html << %{<script type="text/javascript">jQuery.noConflict();</script>} if options[:with_jquery].to_s == "no_conflict"
         | 
| 16 16 | 
             
                end
         | 
| 17 17 | 
             
                html << %{<script type="text/javascript">}
         | 
| 18 18 | 
             
                ["SWFUPLOAD_PENDING", "SWFUPLOAD_LOADING"].each do |js_constant|
         | 
| @@ -0,0 +1,58 @@ | |
| 1 | 
            +
            module Paperclip
         | 
| 2 | 
            +
             | 
| 3 | 
            +
              # Handles thumbnailing images that are uploaded.
         | 
| 4 | 
            +
              class PapermillPaperclipProcessor < Thumbnail
         | 
| 5 | 
            +
                
         | 
| 6 | 
            +
                attr_reader :crop_h, :crop_w, :crop_x, :crop_y, :copyright
         | 
| 7 | 
            +
                
         | 
| 8 | 
            +
                def initialize(file, options = {}, attachment = nil)
         | 
| 9 | 
            +
                  @crop_h, @crop_w, @crop_x, @crop_y = options[:crop_h], options[:crop_w], options[:crop_x], options[:crop_y]
         | 
| 10 | 
            +
                  
         | 
| 11 | 
            +
                  if options[:geometry] =~ /©/
         | 
| 12 | 
            +
                    options[:geometry], *@copyright = options[:geometry].split("©")
         | 
| 13 | 
            +
                    @copyright = @copyright.join("©").nie || options[:copyright] || @attachment.instance.respond_to?(:copyright) && @attachment.instance.copyright
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                  
         | 
| 16 | 
            +
                  if options[:geometry] =~ /#.+/
         | 
| 17 | 
            +
                    
         | 
| 18 | 
            +
                    # <@target_geometry.width>x<@target_geometry.height>#<@crop_w>x<@crop_h>:<@crop_x>:<@crop_y>
         | 
| 19 | 
            +
                    # <@target_geometry.width>x<@target_geometry.height>#<@crop_w>x<@crop_h>
         | 
| 20 | 
            +
                    # <@target_geometry.width>x<@target_geometry.height>#<@crop_x>:<@crop_y>
         | 
| 21 | 
            +
                    
         | 
| 22 | 
            +
                    options[:geometry], manual_crop = options[:geometry].split("#")
         | 
| 23 | 
            +
                    
         | 
| 24 | 
            +
                    crop_dimensions, @crop_x, @crop_y = manual_crop.split("+")
         | 
| 25 | 
            +
                          
         | 
| 26 | 
            +
                    if crop_dimensions =~ /x/
         | 
| 27 | 
            +
                      @crop_w, @crop_h = crop_dimensions.split("x")
         | 
| 28 | 
            +
                    else
         | 
| 29 | 
            +
                      @crop_x, @crop_y = crop_dimensions, @crop_x
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
                    
         | 
| 32 | 
            +
                    
         | 
| 33 | 
            +
                    options[:geometry] = (options[:geometry].nie || "#{@crop_x}x#{@crop_y}") + "#"
         | 
| 34 | 
            +
                    
         | 
| 35 | 
            +
                    unless @crop_w && @crop_h
         | 
| 36 | 
            +
                      @target_geometry = Geometry.parse(options[:geometry]) 
         | 
| 37 | 
            +
                      @crop_w ||= @target_geometry.try(:width).to_i
         | 
| 38 | 
            +
                      @crop_h ||= @target_geometry.try(:height).to_i
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
                  end
         | 
| 41 | 
            +
                  super
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                
         | 
| 44 | 
            +
                def transformation_command
         | 
| 45 | 
            +
                  puts "crop_command= #{crop_command ? super.sub(/ -crop \S+/, crop_command) : super}"
         | 
| 46 | 
            +
                  
         | 
| 47 | 
            +
                  crop_command ? super.sub(/ -crop \S+/, crop_command) : super
         | 
| 48 | 
            +
                end
         | 
| 49 | 
            +
                
         | 
| 50 | 
            +
                def crop_command
         | 
| 51 | 
            +
                  if @crop_h || @crop_x
         | 
| 52 | 
            +
                    " -crop '%dx%d+%d+%d'" % [ @crop_w, @crop_h, @crop_x, @crop_y ].map(&:to_i)
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
                end
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
              
         | 
| 57 | 
            +
              
         | 
| 58 | 
            +
            end
         | 
    
        data/test/papermill_test.rb
    CHANGED
    
    | @@ -76,12 +76,24 @@ class PapermillTest < Test::Unit::TestCase | |
| 76 76 | 
             
                assert_equal @article.my_assets.map(&:id), [3,4]
         | 
| 77 77 | 
             
                assert_equal @article.my_assets(:order => "position DESC").map(&:id), [4,3]
         | 
| 78 78 | 
             
                assert_equal @article.my_assets(:order => "position DESC", :limit => 1).map(&:id), [4]
         | 
| 79 | 
            +
                
         | 
| 80 | 
            +
                assert_equal @article.assets(:my_assets).map(&:id), [3,4]
         | 
| 81 | 
            +
                assert_equal @article.assets(:my_assets, :order => "position DESC").map(&:id), [4,3]
         | 
| 82 | 
            +
                assert_equal @article.assets(:my_assets, :order => "position DESC", :limit => 1).map(&:id), [4]
         | 
| 83 | 
            +
                
         | 
| 84 | 
            +
                assert_equal @article.papermill_assets.key(:my_assets).map(&:id), [3,4]
         | 
| 85 | 
            +
                assert_equal @article.papermill_assets.key(:my_assets).all(:order => "position DESC").map(&:id), [4,3]
         | 
| 86 | 
            +
                assert_equal @article.papermill_assets.key(:my_assets).all(:order => "position DESC", :limit => 1).map(&:id), [4]
         | 
| 79 87 | 
             
              end
         | 
| 80 88 |  | 
| 81 | 
            -
              def  | 
| 89 | 
            +
              def test_namedscope_for_global_associations
         | 
| 82 90 | 
             
                assert_equal @article.assets(:asset1).map(&:id), [2,1]
         | 
| 83 91 | 
             
                assert_equal @article.assets(:asset1, :order => "position DESC").map(&:id), [1,2]
         | 
| 84 92 | 
             
                assert_equal @article.assets(:asset1, :order => "position DESC", :limit => 1).map(&:id), [1]
         | 
| 93 | 
            +
                
         | 
| 94 | 
            +
                assert_equal @article.papermill_assets.key(:asset1).map(&:id), [2,1]
         | 
| 95 | 
            +
                assert_equal @article.papermill_assets.key(:asset1).all(:order => "position DESC").map(&:id), [1,2]
         | 
| 96 | 
            +
                assert_equal @article.papermill_assets.key(:asset1).all(:order => "position DESC", :limit => 1).map(&:id), [1]
         | 
| 85 97 | 
             
              end
         | 
| 86 98 |  | 
| 87 99 | 
             
              def test_id_partition
         | 
    
        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.1. | 
| 4 | 
            +
              version: 1.1.1
         | 
| 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-11- | 
| 12 | 
            +
            date: 2009-11-25 00:00:00 +01:00
         | 
| 13 13 | 
             
            default_executable: 
         | 
| 14 14 | 
             
            dependencies: 
         | 
| 15 15 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| @@ -57,11 +57,13 @@ files: | |
| 57 57 | 
             
            - install.rb
         | 
| 58 58 | 
             
            - lib/extensions.rb
         | 
| 59 59 | 
             
            - lib/papermill.rb
         | 
| 60 | 
            +
            - lib/papermill/flash_session_cookie_middleware.rb
         | 
| 60 61 | 
             
            - lib/papermill/form_builder.rb
         | 
| 61 62 | 
             
            - lib/papermill/papermill.rb
         | 
| 62 63 | 
             
            - lib/papermill/papermill_asset.rb
         | 
| 63 64 | 
             
            - lib/papermill/papermill_helper.rb
         | 
| 64 65 | 
             
            - lib/papermill/papermill_options.rb
         | 
| 66 | 
            +
            - lib/papermill/papermill_paperclip_processor.rb
         | 
| 65 67 | 
             
            - public/.DS_Store
         | 
| 66 68 | 
             
            - public/papermill/README
         | 
| 67 69 | 
             
            - public/papermill/images/background.png
         | 
| @@ -110,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 110 112 | 
             
            requirements: []
         | 
| 111 113 |  | 
| 112 114 | 
             
            rubyforge_project: 
         | 
| 113 | 
            -
            rubygems_version: 1.3. | 
| 115 | 
            +
            rubygems_version: 1.3.5
         | 
| 114 116 | 
             
            signing_key: 
         | 
| 115 117 | 
             
            specification_version: 3
         | 
| 116 118 | 
             
            summary: Paperclip Swfupload UploadHelper wrapper
         |