avatar 0.0.4 → 0.0.5
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/History.txt +10 -0
 - data/Manifest.txt +32 -6
 - data/lib/avatar.rb +1 -1
 - data/lib/avatar/source/gravatar_source.rb +7 -5
 - data/lib/avatar/source/paperclip_source.rb +52 -0
 - data/lib/avatar/source/wrapper.rb +6 -0
 - data/lib/avatar/source/wrapper/abstract_source_wrapper.rb +33 -0
 - data/lib/avatar/source/wrapper/rails_asset_source_wrapper.rb +36 -0
 - data/lib/avatar/source/wrapper/string_substitution_source_wrapper.rb +55 -0
 - data/lib/avatar/version.rb +1 -1
 - data/test/lib/paperclip/README +32 -0
 - data/test/lib/paperclip/Rakefile +41 -0
 - data/test/lib/paperclip/generators/paperclip/USAGE +5 -0
 - data/test/lib/paperclip/generators/paperclip/paperclip_generator.rb +27 -0
 - data/test/lib/paperclip/generators/paperclip/templates/paperclip_migration.rb +17 -0
 - data/test/lib/paperclip/init.rb +3 -0
 - data/test/lib/paperclip/lib/paperclip.rb +197 -0
 - data/test/lib/paperclip/lib/paperclip/attachment.rb +230 -0
 - data/test/lib/paperclip/lib/paperclip/geometry.rb +109 -0
 - data/test/lib/paperclip/lib/paperclip/iostream.rb +43 -0
 - data/test/lib/paperclip/lib/paperclip/thumbnail.rb +80 -0
 - data/test/lib/paperclip/lib/paperclip/upfile.rb +32 -0
 - data/test/lib/paperclip/tasks/paperclip_tasks.rake +38 -0
 - data/test/lib/paperclip/test/database.yml +5 -0
 - data/test/lib/paperclip/test/fixtures/12k.png +0 -0
 - data/test/lib/paperclip/test/fixtures/5k.png +0 -0
 - data/test/lib/paperclip/test/fixtures/bad.png +1 -0
 - data/test/lib/paperclip/test/helper.rb +38 -0
 - data/test/lib/paperclip/test/test_attachment.rb +99 -0
 - data/test/lib/paperclip/test/test_geometry.rb +142 -0
 - data/test/lib/paperclip/test/test_integration.rb +76 -0
 - data/test/lib/paperclip/test/test_iostream.rb +60 -0
 - data/test/lib/paperclip/test/test_paperclip.rb +83 -0
 - data/test/lib/paperclip/test/test_thumbnail.rb +76 -0
 - data/test/lib/schema.rb +14 -1
 - data/test/test_file_column_source.rb +8 -6
 - data/test/test_gravatar_source.rb +5 -0
 - data/test/test_helper.rb +7 -2
 - data/test/test_paperclip_source.rb +52 -0
 - data/test/test_rails_asset_source_wrapper.rb +37 -0
 - data/test/test_string_substitution_source_wrapper.rb +25 -0
 - data/website/index.html +1 -1
 - metadata +43 -11
 - data/lib/avatar/source/rails_asset_source.rb +0 -64
 - data/lib/avatar/source/string_substitution_source.rb +0 -45
 - data/lib/avatar/string_substitution.rb +0 -28
 - data/test/test_rails_asset_source.rb +0 -50
 - data/test/test_string_substitution.rb +0 -28
 - data/test/test_string_substitution_source.rb +0 -22
 
    
        data/History.txt
    CHANGED
    
    | 
         @@ -1,3 +1,13 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            == 0.0.5 2008-04-01
         
     | 
| 
      
 2 
     | 
    
         
            +
            * 4 major enhancements:
         
     | 
| 
      
 3 
     | 
    
         
            +
              * added PaperclipSource for use with the Paperclip plugin
         
     | 
| 
      
 4 
     | 
    
         
            +
              * added AbstractSourceWrapper
         
     | 
| 
      
 5 
     | 
    
         
            +
              * changed StringSubstitutionSource to a SourceWrapper
         
     | 
| 
      
 6 
     | 
    
         
            +
              * changed RailsAssetSource to a SourceWrapper
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            * 1 minor change:
         
     | 
| 
      
 9 
     | 
    
         
            +
              * moved StringSubstitution out of separate module and into new StringSubstitutionSourceWrapper
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
       1 
11 
     | 
    
         
             
            == 0.0.4 2008-03-28
         
     | 
| 
       2 
12 
     | 
    
         
             
            * 2 major fixes:
         
     | 
| 
       3 
13 
     | 
    
         
             
              * GravatarSource downcases email to comply with Gravatar standards
         
     | 
    
        data/Manifest.txt
    CHANGED
    
    | 
         @@ -13,11 +13,13 @@ lib/avatar/source/abstract_source.rb 
     | 
|
| 
       13 
13 
     | 
    
         
             
            lib/avatar/source/file_column_source.rb
         
     | 
| 
       14 
14 
     | 
    
         
             
            lib/avatar/source/gravatar_source.rb
         
     | 
| 
       15 
15 
     | 
    
         
             
            lib/avatar/source/nil_source.rb
         
     | 
| 
       16 
     | 
    
         
            -
            lib/avatar/source/ 
     | 
| 
      
 16 
     | 
    
         
            +
            lib/avatar/source/paperclip_source.rb
         
     | 
| 
       17 
17 
     | 
    
         
             
            lib/avatar/source/source_chain.rb
         
     | 
| 
       18 
18 
     | 
    
         
             
            lib/avatar/source/static_url_source.rb
         
     | 
| 
       19 
     | 
    
         
            -
            lib/avatar/source/ 
     | 
| 
       20 
     | 
    
         
            -
            lib/avatar/ 
     | 
| 
      
 19 
     | 
    
         
            +
            lib/avatar/source/wrapper.rb
         
     | 
| 
      
 20 
     | 
    
         
            +
            lib/avatar/source/wrapper/abstract_source_wrapper.rb
         
     | 
| 
      
 21 
     | 
    
         
            +
            lib/avatar/source/wrapper/rails_asset_source_wrapper.rb
         
     | 
| 
      
 22 
     | 
    
         
            +
            lib/avatar/source/wrapper/string_substitution_source_wrapper.rb
         
     | 
| 
       21 
23 
     | 
    
         
             
            lib/avatar/version.rb
         
     | 
| 
       22 
24 
     | 
    
         
             
            lib/avatar/view.rb
         
     | 
| 
       23 
25 
     | 
    
         
             
            lib/avatar/view/abstract_view_support.rb
         
     | 
| 
         @@ -57,6 +59,30 @@ test/lib/file_column/test/fixtures/schema.rb 
     | 
|
| 
       57 
59 
     | 
    
         
             
            test/lib/file_column/test/fixtures/skanthak.png
         
     | 
| 
       58 
60 
     | 
    
         
             
            test/lib/file_column/test/magick_test.rb
         
     | 
| 
       59 
61 
     | 
    
         
             
            test/lib/file_column/test/magick_view_only_test.rb
         
     | 
| 
      
 62 
     | 
    
         
            +
            test/lib/paperclip/README
         
     | 
| 
      
 63 
     | 
    
         
            +
            test/lib/paperclip/Rakefile
         
     | 
| 
      
 64 
     | 
    
         
            +
            test/lib/paperclip/generators/paperclip/USAGE
         
     | 
| 
      
 65 
     | 
    
         
            +
            test/lib/paperclip/generators/paperclip/paperclip_generator.rb
         
     | 
| 
      
 66 
     | 
    
         
            +
            test/lib/paperclip/generators/paperclip/templates/paperclip_migration.rb
         
     | 
| 
      
 67 
     | 
    
         
            +
            test/lib/paperclip/init.rb
         
     | 
| 
      
 68 
     | 
    
         
            +
            test/lib/paperclip/lib/paperclip.rb
         
     | 
| 
      
 69 
     | 
    
         
            +
            test/lib/paperclip/lib/paperclip/attachment.rb
         
     | 
| 
      
 70 
     | 
    
         
            +
            test/lib/paperclip/lib/paperclip/geometry.rb
         
     | 
| 
      
 71 
     | 
    
         
            +
            test/lib/paperclip/lib/paperclip/iostream.rb
         
     | 
| 
      
 72 
     | 
    
         
            +
            test/lib/paperclip/lib/paperclip/thumbnail.rb
         
     | 
| 
      
 73 
     | 
    
         
            +
            test/lib/paperclip/lib/paperclip/upfile.rb
         
     | 
| 
      
 74 
     | 
    
         
            +
            test/lib/paperclip/tasks/paperclip_tasks.rake
         
     | 
| 
      
 75 
     | 
    
         
            +
            test/lib/paperclip/test/database.yml
         
     | 
| 
      
 76 
     | 
    
         
            +
            test/lib/paperclip/test/fixtures/12k.png
         
     | 
| 
      
 77 
     | 
    
         
            +
            test/lib/paperclip/test/fixtures/5k.png
         
     | 
| 
      
 78 
     | 
    
         
            +
            test/lib/paperclip/test/fixtures/bad.png
         
     | 
| 
      
 79 
     | 
    
         
            +
            test/lib/paperclip/test/helper.rb
         
     | 
| 
      
 80 
     | 
    
         
            +
            test/lib/paperclip/test/test_attachment.rb
         
     | 
| 
      
 81 
     | 
    
         
            +
            test/lib/paperclip/test/test_geometry.rb
         
     | 
| 
      
 82 
     | 
    
         
            +
            test/lib/paperclip/test/test_integration.rb
         
     | 
| 
      
 83 
     | 
    
         
            +
            test/lib/paperclip/test/test_iostream.rb
         
     | 
| 
      
 84 
     | 
    
         
            +
            test/lib/paperclip/test/test_paperclip.rb
         
     | 
| 
      
 85 
     | 
    
         
            +
            test/lib/paperclip/test/test_thumbnail.rb
         
     | 
| 
       60 
86 
     | 
    
         
             
            test/lib/schema.rb
         
     | 
| 
       61 
87 
     | 
    
         
             
            test/lib/user_suit.png
         
     | 
| 
       62 
88 
     | 
    
         
             
            test/test_abstract_view_support.rb
         
     | 
| 
         @@ -66,11 +92,11 @@ test/test_file_column_source.rb 
     | 
|
| 
       66 
92 
     | 
    
         
             
            test/test_gravatar_source.rb
         
     | 
| 
       67 
93 
     | 
    
         
             
            test/test_helper.rb
         
     | 
| 
       68 
94 
     | 
    
         
             
            test/test_nil_source.rb
         
     | 
| 
       69 
     | 
    
         
            -
            test/ 
     | 
| 
      
 95 
     | 
    
         
            +
            test/test_paperclip_source.rb
         
     | 
| 
      
 96 
     | 
    
         
            +
            test/test_rails_asset_source_wrapper.rb
         
     | 
| 
       70 
97 
     | 
    
         
             
            test/test_source_chain.rb
         
     | 
| 
       71 
98 
     | 
    
         
             
            test/test_static_url_source.rb
         
     | 
| 
       72 
     | 
    
         
            -
            test/ 
     | 
| 
       73 
     | 
    
         
            -
            test/test_string_substitution_source.rb
         
     | 
| 
      
 99 
     | 
    
         
            +
            test/test_string_substitution_source_wrapper.rb
         
     | 
| 
       74 
100 
     | 
    
         
             
            website/index.html
         
     | 
| 
       75 
101 
     | 
    
         
             
            website/index.txt
         
     | 
| 
       76 
102 
     | 
    
         
             
            website/javascripts/rounded_corners_lite.inc.js
         
     | 
    
        data/lib/avatar.rb
    CHANGED
    
    | 
         @@ -8,7 +8,7 @@ require 'avatar/source/gravatar_source' 
     | 
|
| 
       8 
8 
     | 
    
         
             
            #   include Avatar::ActionView::Support
         
     | 
| 
       9 
9 
     | 
    
         
             
            #
         
     | 
| 
       10 
10 
     | 
    
         
             
            #   # in app/views/profiles/show.html.erb:
         
     | 
| 
       11 
     | 
    
         
            -
            #   <%= avatar_for @person =>
         
     | 
| 
      
 11 
     | 
    
         
            +
            #   <%= avatar_for @person => current_person %>
         
     | 
| 
       12 
12 
     | 
    
         
             
            #
         
     | 
| 
       13 
13 
     | 
    
         
             
            # By default, Avatar::source is a GravatarSource
         
     | 
| 
       14 
14 
     | 
    
         
             
            module Avatar
         
     | 
| 
         @@ -56,7 +56,9 @@ module Avatar # :nodoc: 
     | 
|
| 
       56 
56 
     | 
    
         | 
| 
       57 
57 
     | 
    
         
             
                    returning(self.class.base_url) do |url|
         
     | 
| 
       58 
58 
     | 
    
         
             
                      url << Digest::MD5::hexdigest(email).strip
         
     | 
| 
       59 
     | 
    
         
            -
                      options 
     | 
| 
      
 59 
     | 
    
         
            +
                      # default must be last or the other options will be parameters to that URL, not the Gravatar one
         
     | 
| 
      
 60 
     | 
    
         
            +
                      [:size, :rating, :default].each do |k|
         
     | 
| 
      
 61 
     | 
    
         
            +
                        v = options[k]
         
     | 
| 
       60 
62 
     | 
    
         
             
                        next if v.nil?
         
     | 
| 
       61 
63 
     | 
    
         
             
                        url << (url.include?('?') ? '&' : '?')
         
     | 
| 
       62 
64 
     | 
    
         
             
                        url << "#{k}=#{v}"
         
     | 
| 
         @@ -65,10 +67,10 @@ module Avatar # :nodoc: 
     | 
|
| 
       65 
67 
     | 
    
         
             
                  end
         
     | 
| 
       66 
68 
     | 
    
         | 
| 
       67 
69 
     | 
    
         
             
                  # Returns a Hash containing
         
     | 
| 
       68 
     | 
    
         
            -
                  # * :field -  
     | 
| 
       69 
     | 
    
         
            -
                  # * :default -  
     | 
| 
       70 
     | 
    
         
            -
                  # * :size - :gravatar_size or :size or :s passed through <em>only if a number</em>
         
     | 
| 
       71 
     | 
    
         
            -
                  # * :rating - :gravatar_rating or :rating or :r passed through <em>only if one of <code>self.class.allowed_ratings</code></em>
         
     | 
| 
      
 70 
     | 
    
         
            +
                  # * :field - value of :gravatar_field; defaults to <code>self.default_field</code>
         
     | 
| 
      
 71 
     | 
    
         
            +
                  # * :default - value of :gravatar_default_url; defaults to <code>self.default_avatar_url_for(+person+, +options+)</code>
         
     | 
| 
      
 72 
     | 
    
         
            +
                  # * :size - value of :gravatar_size or :size or :s passed through <em>only if a number</em>
         
     | 
| 
      
 73 
     | 
    
         
            +
                  # * :rating - value of :gravatar_rating or :rating or :r passed through <em>only if one of <code>self.class.allowed_ratings</code></em>
         
     | 
| 
       72 
74 
     | 
    
         
             
                  def parse_options(person, options)
         
     | 
| 
       73 
75 
     | 
    
         
             
                    returning({}) do |result|
         
     | 
| 
       74 
76 
     | 
    
         
             
                      result[:gravatar_field] = options[:gravatar_field] || default_field
         
     | 
| 
         @@ -0,0 +1,52 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'avatar/object_support'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'avatar/source/abstract_source'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Avatar # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Source # :nodoc:
         
     | 
| 
      
 6 
     | 
    
         
            +
                # Source for a file attachment using Paperclip.
         
     | 
| 
      
 7 
     | 
    
         
            +
                # See http://giantrobots.thoughtbot.com/2008/3/18/for-attaching-files-use-paperclip
         
     | 
| 
      
 8 
     | 
    
         
            +
                class PaperclipSource
         
     | 
| 
      
 9 
     | 
    
         
            +
                  include AbstractSource
         
     | 
| 
      
 10 
     | 
    
         
            +
                
         
     | 
| 
      
 11 
     | 
    
         
            +
                  attr_accessor :default_field, :default_style
         
     | 
| 
      
 12 
     | 
    
         
            +
                  
         
     | 
| 
      
 13 
     | 
    
         
            +
                  # Create a new FileColumnSource with a +default_field+ (by default, :avatar),
         
     | 
| 
      
 14 
     | 
    
         
            +
                  # and a +default_style+ (by default, nil)
         
     | 
| 
      
 15 
     | 
    
         
            +
                  def initialize(default_field = :avatar, default_style = nil)
         
     | 
| 
      
 16 
     | 
    
         
            +
                    @default_field = default_field
         
     | 
| 
      
 17 
     | 
    
         
            +
                    @default_style = default_style
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                
         
     | 
| 
      
 20 
     | 
    
         
            +
                  # Returns a URL for a has_attached_file attribute, via
         
     | 
| 
      
 21 
     | 
    
         
            +
                  # <code>person.<paperclip_field>.url</code>, passing in :paperclip_style if present.
         
     | 
| 
      
 22 
     | 
    
         
            +
                  # Returns nil under any of the following circumstances:
         
     | 
| 
      
 23 
     | 
    
         
            +
                  # * person is nil
         
     | 
| 
      
 24 
     | 
    
         
            +
                  # * person.<paperclip_field> is nil
         
     | 
| 
      
 25 
     | 
    
         
            +
                  # * person.<paperclip_field>? returns false
         
     | 
| 
      
 26 
     | 
    
         
            +
                  # * person.<paperclip_field>.styles does not include :paperclip_style (if present)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  # Options:
         
     | 
| 
      
 28 
     | 
    
         
            +
                  # * <code>:paperclip_field</code> - the has_attached_file column within +person+; by default, self.default_field
         
     | 
| 
      
 29 
     | 
    
         
            +
                  # * <code>:paperclip_style</code> - one of the styles of the has_attached_file; by default, self.default_style
         
     | 
| 
      
 30 
     | 
    
         
            +
                  def avatar_url_for(person, options = {})
         
     | 
| 
      
 31 
     | 
    
         
            +
                    return nil if person.nil?
         
     | 
| 
      
 32 
     | 
    
         
            +
                    options = parse_options(person, options)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    field = options[:paperclip_field]
         
     | 
| 
      
 34 
     | 
    
         
            +
                    return nil if field.nil?
         
     | 
| 
      
 35 
     | 
    
         
            +
                    return nil unless person.send("#{field}?".to_sym)
         
     | 
| 
      
 36 
     | 
    
         
            +
                    avatar = person.send(field)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    style = options[:paperclip_style]
         
     | 
| 
      
 38 
     | 
    
         
            +
                    return nil if style && !avatar.styles.keys.include?(style)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    avatar.url(style)
         
     | 
| 
      
 40 
     | 
    
         
            +
                  end
         
     | 
| 
      
 41 
     | 
    
         
            +
                
         
     | 
| 
      
 42 
     | 
    
         
            +
                  # Copies :paperclip_field and :paperclip_style from +options+, adding defaults if necessary.
         
     | 
| 
      
 43 
     | 
    
         
            +
                  def parse_options(person, options)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    returning({}) do |result|
         
     | 
| 
      
 45 
     | 
    
         
            +
                      result[:paperclip_field] = options[:paperclip_field] || default_field
         
     | 
| 
      
 46 
     | 
    
         
            +
                      result[:paperclip_style] = options[:paperclip_style] || default_style
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
                  end
         
     | 
| 
      
 49 
     | 
    
         
            +
                  
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
              end
         
     | 
| 
      
 52 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,33 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'avatar/source/abstract_source'
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module Avatar
         
     | 
| 
      
 4 
     | 
    
         
            +
              module Source
         
     | 
| 
      
 5 
     | 
    
         
            +
                module Wrapper
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class AbstractSourceWrapper
         
     | 
| 
      
 7 
     | 
    
         
            +
                    include Avatar::Source::AbstractSource
         
     | 
| 
      
 8 
     | 
    
         
            +
                    
         
     | 
| 
      
 9 
     | 
    
         
            +
                    attr_reader :underlying_source
         
     | 
| 
      
 10 
     | 
    
         
            +
                    
         
     | 
| 
      
 11 
     | 
    
         
            +
                    # Create a new Wrapper
         
     | 
| 
      
 12 
     | 
    
         
            +
                    def initialize(underlying_source)
         
     | 
| 
      
 13 
     | 
    
         
            +
                      raise ArgumentError.new("underlying_source must be Source") unless underlying_source.kind_of?(Avatar::Source::AbstractSource)
         
     | 
| 
      
 14 
     | 
    
         
            +
                      @underlying_source = underlying_source
         
     | 
| 
      
 15 
     | 
    
         
            +
                    end
         
     | 
| 
      
 16 
     | 
    
         
            +
                    
         
     | 
| 
      
 17 
     | 
    
         
            +
                    # Return nil if the underlying_source does; otherwise, calls <code>wrap</code>,
         
     | 
| 
      
 18 
     | 
    
         
            +
                    # passing the returned URL and the person and options passed.
         
     | 
| 
      
 19 
     | 
    
         
            +
                    def avatar_url_for(person, options = {})
         
     | 
| 
      
 20 
     | 
    
         
            +
                      url = @underlying_source.avatar_url_for(person, options)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      url.nil? ? nil : wrap(url, person, options)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
                    
         
     | 
| 
      
 24 
     | 
    
         
            +
                    # Apply appropriate wrapping of the +url+ returned by <code>underlying_source</code>.
         
     | 
| 
      
 25 
     | 
    
         
            +
                    # Will never be called with a nil +url+.
         
     | 
| 
      
 26 
     | 
    
         
            +
                    def wrap(url, person, options)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      raise NotImplementedError('subclasses must override wrap(url, person, options)')
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
                    
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                end
         
     | 
| 
      
 32 
     | 
    
         
            +
              end
         
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'avatar/source/wrapper/abstract_source_wrapper'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'action_view/helpers/asset_tag_helper'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Avatar # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Source # :nodoc:
         
     | 
| 
      
 6 
     | 
    
         
            +
                module Wrapper
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # Wraps a Source using Rails' <code>AssetTagHelper#image_path</code>,
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # which can turn path URLs (e.g. '/images/my_avatar.png')
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # into absolute URLs( e.g. 'http://assets.mysite.com/images/my_avatar.png').
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class RailsAssetSourceWrapper < AbstractSourceWrapper
         
     | 
| 
      
 11 
     | 
    
         
            +
                  
         
     | 
| 
      
 12 
     | 
    
         
            +
                    attr_reader :url_helper
         
     | 
| 
      
 13 
     | 
    
         
            +
                  
         
     | 
| 
      
 14 
     | 
    
         
            +
                    private :url_helper
         
     | 
| 
      
 15 
     | 
    
         
            +
                  
         
     | 
| 
      
 16 
     | 
    
         
            +
                    def initialize(source)
         
     | 
| 
      
 17 
     | 
    
         
            +
                      super
         
     | 
| 
      
 18 
     | 
    
         
            +
                      @url_helper = Object.new
         
     | 
| 
      
 19 
     | 
    
         
            +
                      @url_helper.extend(ActionView::Helpers::AssetTagHelper)
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
                  
         
     | 
| 
      
 22 
     | 
    
         
            +
                    # Passes +url+ to <code>AssetTagHelper#image_path</code>.  Raises
         
     | 
| 
      
 23 
     | 
    
         
            +
                    # an error if it cannot generate a fully-qualified URI.  Try
         
     | 
| 
      
 24 
     | 
    
         
            +
                    # setting <code>ActionController::Base.asset_host</code> to
         
     | 
| 
      
 25 
     | 
    
         
            +
                    # avoid this error.
         
     | 
| 
      
 26 
     | 
    
         
            +
                    def wrap(url, person, options = {})
         
     | 
| 
      
 27 
     | 
    
         
            +
                      # url will never be nil b/c of guarantee in AbstractSourceWrapper
         
     | 
| 
      
 28 
     | 
    
         
            +
                      result = url_helper.image_path(url)
         
     | 
| 
      
 29 
     | 
    
         
            +
                      raise "could not generate protocol and host for #{url}.  Have you set ActionController::Base.asset_host?" unless result =~ /^http[s]?\:\/\//
         
     | 
| 
      
 30 
     | 
    
         
            +
                      result
         
     | 
| 
      
 31 
     | 
    
         
            +
                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
                  
         
     | 
| 
      
 33 
     | 
    
         
            +
                  end
         
     | 
| 
      
 34 
     | 
    
         
            +
                end
         
     | 
| 
      
 35 
     | 
    
         
            +
              end
         
     | 
| 
      
 36 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,55 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'avatar/source/wrapper/abstract_source_wrapper'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'action_view/helpers/asset_tag_helper'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            module Avatar # :nodoc:
         
     | 
| 
      
 5 
     | 
    
         
            +
              module Source # :nodoc:
         
     | 
| 
      
 6 
     | 
    
         
            +
                module Wrapper
         
     | 
| 
      
 7 
     | 
    
         
            +
                  # Wraps a Source using Rails' <code>AssetTagHelper#image_path</code>,
         
     | 
| 
      
 8 
     | 
    
         
            +
                  # which can turn path URLs (e.g. '/images/my_avatar.png')
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # into absolute URLs( e.g. 'http://assets.mysite.com/images/my_avatar.png').
         
     | 
| 
      
 10 
     | 
    
         
            +
                  class StringSubstitutionSourceWrapper < AbstractSourceWrapper
         
     | 
| 
      
 11 
     | 
    
         
            +
                  
         
     | 
| 
      
 12 
     | 
    
         
            +
                    attr_accessor :default_options
         
     | 
| 
      
 13 
     | 
    
         
            +
                  
         
     | 
| 
      
 14 
     | 
    
         
            +
                    def initialize(source, default_options = {})
         
     | 
| 
      
 15 
     | 
    
         
            +
                      super(source)
         
     | 
| 
      
 16 
     | 
    
         
            +
                      self.default_options = default_options || {}
         
     | 
| 
      
 17 
     | 
    
         
            +
                    end
         
     | 
| 
      
 18 
     | 
    
         
            +
                  
         
     | 
| 
      
 19 
     | 
    
         
            +
                    # Passes +url+ to <code>AssetTagHelper#image_path</code>.  Raises
         
     | 
| 
      
 20 
     | 
    
         
            +
                    # an error if it cannot generate a fully-qualified URI.  Try
         
     | 
| 
      
 21 
     | 
    
         
            +
                    # setting <code>ActionController::Base.asset_host</code> to
         
     | 
| 
      
 22 
     | 
    
         
            +
                    # avoid this error.
         
     | 
| 
      
 23 
     | 
    
         
            +
                    def wrap(url, person, options = {})
         
     | 
| 
      
 24 
     | 
    
         
            +
                      # url will never be nil b/c of guarantee in AbstractSourceWrapper
         
     | 
| 
      
 25 
     | 
    
         
            +
                      result = apply_substitution(url, self.default_options.merge(options))
         
     | 
| 
      
 26 
     | 
    
         
            +
                      substitution_needed?(result) ? nil : result
         
     | 
| 
      
 27 
     | 
    
         
            +
                    end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                    def default_options=(opts)
         
     | 
| 
      
 30 
     | 
    
         
            +
                      @default_options = opts || {}
         
     | 
| 
      
 31 
     | 
    
         
            +
                    end
         
     | 
| 
      
 32 
     | 
    
         
            +
                    
         
     | 
| 
      
 33 
     | 
    
         
            +
                    # For each key in +options+ replaces '#{key}' in +string+ with the
         
     | 
| 
      
 34 
     | 
    
         
            +
                    # corresponding value in +options+.
         
     | 
| 
      
 35 
     | 
    
         
            +
                    # +string+ should
         
     | 
| 
      
 36 
     | 
    
         
            +
                    # be of the form '...#{variable_a}...#{variable_b}...'.  <em>Note the
         
     | 
| 
      
 37 
     | 
    
         
            +
                    # single quotes</em>.  Double quotes will cause the variables to be
         
     | 
| 
      
 38 
     | 
    
         
            +
                    # substituted before this method is run, which is almost
         
     | 
| 
      
 39 
     | 
    
         
            +
                    # certainly <strong>not</strong> what you want.
         
     | 
| 
      
 40 
     | 
    
         
            +
                    def apply_substitution(string, options)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      returning(string.dup) do |result|
         
     | 
| 
      
 42 
     | 
    
         
            +
                        options.each do |k,v|
         
     | 
| 
      
 43 
     | 
    
         
            +
                          result.gsub!(Regexp.new('#\{' + "#{k}" + '\}'), "#{v}")
         
     | 
| 
      
 44 
     | 
    
         
            +
                        end
         
     | 
| 
      
 45 
     | 
    
         
            +
                      end
         
     | 
| 
      
 46 
     | 
    
         
            +
                    end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                    def substitution_needed?(string)
         
     | 
| 
      
 49 
     | 
    
         
            +
                      string =~ /#\{.*\}/
         
     | 
| 
      
 50 
     | 
    
         
            +
                    end
         
     | 
| 
      
 51 
     | 
    
         
            +
                  
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/avatar/version.rb
    CHANGED
    
    
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            =Paperclip
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Paperclip is intended as an easy file attachment library for ActiveRecord. The intent behind it was to keep setup as easy as possible and to treat files as much like other attributes as possible. This means they aren't saved to their final locations on disk, nor are they deleted if set to nil, until ActiveRecord::Base#save is called. It manages validations based on size and presence, if required. It can transform its assigned image into thumbnails if needed, and the prerequisites are as simple as installing ImageMagick (which, for most modern Unix-based systems, is as easy as installing the right packages). Attached files are saved to the filesystem and referenced in the browser by an easily understandable specification, which has sensible and useful defaults.
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            See the documentation for the +has_attached_file+ method for options.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ==Usage
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            In your model:
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              class User < ActiveRecord::Base
         
     | 
| 
      
 12 
     | 
    
         
            +
                has_attached_file :avatar, :styles => { :medium => "300x300>", :thumb => "100x100>" }
         
     | 
| 
      
 13 
     | 
    
         
            +
              end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            In your edit and new views:
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              <% form_for :user, @user, :url => user_path, :html => { :multipart => true } do |form| %>
         
     | 
| 
      
 18 
     | 
    
         
            +
                <%= form.file_field :avatar %>
         
     | 
| 
      
 19 
     | 
    
         
            +
              <% end %>
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            In your controller:
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
              def create
         
     | 
| 
      
 24 
     | 
    
         
            +
                @user = User.create( params[:user] )
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            In your show view:
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
              <%= image_tag @user.avatar.url %>
         
     | 
| 
      
 30 
     | 
    
         
            +
              <%= image_tag @user.avatar.url(:medium) %>
         
     | 
| 
      
 31 
     | 
    
         
            +
              <%= image_tag @user.avatar.url(:thumb) %>
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,41 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require 'rake'
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rake/testtask'
         
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rake/rdoctask'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            desc 'Default: run unit tests.'
         
     | 
| 
      
 6 
     | 
    
         
            +
            task :default => [:clean, :test]
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            desc 'Test the paperclip plugin.'
         
     | 
| 
      
 9 
     | 
    
         
            +
            Rake::TestTask.new(:test) do |t|
         
     | 
| 
      
 10 
     | 
    
         
            +
              t.libs << 'lib' << 'profile'
         
     | 
| 
      
 11 
     | 
    
         
            +
              t.pattern = 'test/**/test_*.rb'
         
     | 
| 
      
 12 
     | 
    
         
            +
              t.verbose = true
         
     | 
| 
      
 13 
     | 
    
         
            +
            end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            desc 'Start an IRB session with all necessary files required.'
         
     | 
| 
      
 16 
     | 
    
         
            +
            task :shell do |t|
         
     | 
| 
      
 17 
     | 
    
         
            +
              chdir File.dirname(__FILE__)
         
     | 
| 
      
 18 
     | 
    
         
            +
              exec 'irb -I lib/ -I lib/paperclip -r rubygems -r active_record -r tempfile -r init'
         
     | 
| 
      
 19 
     | 
    
         
            +
            end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            desc 'Generate documentation for the paperclip plugin.'
         
     | 
| 
      
 22 
     | 
    
         
            +
            Rake::RDocTask.new(:rdoc) do |rdoc|
         
     | 
| 
      
 23 
     | 
    
         
            +
              rdoc.rdoc_dir = 'doc'
         
     | 
| 
      
 24 
     | 
    
         
            +
              rdoc.title    = 'Paperclip'
         
     | 
| 
      
 25 
     | 
    
         
            +
              rdoc.options << '--line-numbers' << '--inline-source'
         
     | 
| 
      
 26 
     | 
    
         
            +
              rdoc.rdoc_files.include('README')
         
     | 
| 
      
 27 
     | 
    
         
            +
              rdoc.rdoc_files.include('lib/**/*.rb')
         
     | 
| 
      
 28 
     | 
    
         
            +
            end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            desc 'Update documentation on website'
         
     | 
| 
      
 31 
     | 
    
         
            +
            task :sync_docs => 'rdoc' do
         
     | 
| 
      
 32 
     | 
    
         
            +
              `rsync -ave ssh doc/ dev@dev.thoughtbot.com:/home/dev/www/dev.thoughtbot.com/paperclip`
         
     | 
| 
      
 33 
     | 
    
         
            +
            end
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            desc 'Clean up files.'
         
     | 
| 
      
 36 
     | 
    
         
            +
            task :clean do |t|
         
     | 
| 
      
 37 
     | 
    
         
            +
              FileUtils.rm_rf "doc"
         
     | 
| 
      
 38 
     | 
    
         
            +
              FileUtils.rm_rf "tmp"
         
     | 
| 
      
 39 
     | 
    
         
            +
              FileUtils.rm "test/debug.log" rescue nil
         
     | 
| 
      
 40 
     | 
    
         
            +
              FileUtils.rm "test/paperclip.db" rescue nil
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,27 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class PaperclipGenerator < Rails::Generator::NamedBase
         
     | 
| 
      
 2 
     | 
    
         
            +
              attr_accessor :attachments, :migration_name
         
     | 
| 
      
 3 
     | 
    
         
            +
             
         
     | 
| 
      
 4 
     | 
    
         
            +
              def initialize(args, options = {})
         
     | 
| 
      
 5 
     | 
    
         
            +
                super
         
     | 
| 
      
 6 
     | 
    
         
            +
                @class_name, @attachments = args[0], args[1..-1]
         
     | 
| 
      
 7 
     | 
    
         
            +
              end
         
     | 
| 
      
 8 
     | 
    
         
            +
             
         
     | 
| 
      
 9 
     | 
    
         
            +
              def manifest    
         
     | 
| 
      
 10 
     | 
    
         
            +
                file_name = generate_file_name
         
     | 
| 
      
 11 
     | 
    
         
            +
                @migration_name = file_name.camelize
         
     | 
| 
      
 12 
     | 
    
         
            +
                record do |m|
         
     | 
| 
      
 13 
     | 
    
         
            +
                  m.migration_template "paperclip_migration.rb",
         
     | 
| 
      
 14 
     | 
    
         
            +
                                       File.join('db', 'migrate'),
         
     | 
| 
      
 15 
     | 
    
         
            +
                                       :migration_file_name => file_name
         
     | 
| 
      
 16 
     | 
    
         
            +
                end
         
     | 
| 
      
 17 
     | 
    
         
            +
              end 
         
     | 
| 
      
 18 
     | 
    
         
            +
              
         
     | 
| 
      
 19 
     | 
    
         
            +
              private 
         
     | 
| 
      
 20 
     | 
    
         
            +
              
         
     | 
| 
      
 21 
     | 
    
         
            +
              def generate_file_name
         
     | 
| 
      
 22 
     | 
    
         
            +
                names = attachments.map{|a| a.underscore }
         
     | 
| 
      
 23 
     | 
    
         
            +
                names = names[0..-2] + ["and", names[-1]] if names.length > 1
         
     | 
| 
      
 24 
     | 
    
         
            +
                "add_attachments_#{names.join("_")}_to_#{@class_name.underscore}"
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
         
     | 
| 
      
 27 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            class <%= migration_name %> < ActiveRecord::Migration
         
     | 
| 
      
 2 
     | 
    
         
            +
              def self.up
         
     | 
| 
      
 3 
     | 
    
         
            +
            <% attachments.each do |attachment| -%>
         
     | 
| 
      
 4 
     | 
    
         
            +
                add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_file_name, :string
         
     | 
| 
      
 5 
     | 
    
         
            +
                add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_content_type, :string
         
     | 
| 
      
 6 
     | 
    
         
            +
                add_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_file_size, :integer
         
     | 
| 
      
 7 
     | 
    
         
            +
            <% end -%>
         
     | 
| 
      
 8 
     | 
    
         
            +
              end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              def self.down
         
     | 
| 
      
 11 
     | 
    
         
            +
            <% attachments.each do |attachment| -%>
         
     | 
| 
      
 12 
     | 
    
         
            +
                remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_file_name
         
     | 
| 
      
 13 
     | 
    
         
            +
                remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_content_type
         
     | 
| 
      
 14 
     | 
    
         
            +
                remove_column :<%= class_name.underscore.camelize.tableize %>, :<%= attachment %>_file_size
         
     | 
| 
      
 15 
     | 
    
         
            +
            <% end -%>
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     |