avatar 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +13 -0
- data/Manifest.txt +5 -0
- data/lib/avatar.rb +3 -10
- data/lib/avatar/object_support.rb +8 -0
- data/lib/avatar/source/abstract_source.rb +0 -9
- data/lib/avatar/source/gravatar_source.rb +19 -8
- data/lib/avatar/source/rails_asset_source.rb +64 -0
- data/lib/avatar/source/string_substitution_source.rb +14 -17
- data/lib/avatar/string_substitution.rb +28 -0
- data/lib/avatar/version.rb +1 -1
- data/test/test_gravatar_source.rb +22 -8
- data/test/test_rails_asset_source.rb +50 -0
- data/test/test_string_substitution.rb +28 -0
- data/website/index.html +15 -14
- data/website/index.txt +7 -8
- metadata +9 -2
data/History.txt
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
== 0.0.4 2008-03-28
|
2
|
+
* 2 major fixes:
|
3
|
+
* GravatarSource downcases email to comply with Gravatar standards
|
4
|
+
* GravatarSource raises exception if passed a path instead of a URL for default
|
5
|
+
|
6
|
+
* 1 major enhancement:
|
7
|
+
* added RailsAssetSource
|
8
|
+
|
9
|
+
* 3 minor enhancements:
|
10
|
+
* added default_options to StringSubstitutionSource
|
11
|
+
* broke StringSubstitution out into a separate module
|
12
|
+
* added :any to GravatarSource::allowed_ratings
|
13
|
+
|
1
14
|
== 0.0.3 2008-03-27
|
2
15
|
* 2 minor fixes:
|
3
16
|
* GravatarSource now takes parameter :gravatar_field instead of :field for compatibility with other sources
|
data/Manifest.txt
CHANGED
@@ -7,14 +7,17 @@ Rakefile
|
|
7
7
|
config/hoe.rb
|
8
8
|
config/requirements.rb
|
9
9
|
lib/avatar.rb
|
10
|
+
lib/avatar/object_support.rb
|
10
11
|
lib/avatar/source.rb
|
11
12
|
lib/avatar/source/abstract_source.rb
|
12
13
|
lib/avatar/source/file_column_source.rb
|
13
14
|
lib/avatar/source/gravatar_source.rb
|
14
15
|
lib/avatar/source/nil_source.rb
|
16
|
+
lib/avatar/source/rails_asset_source.rb
|
15
17
|
lib/avatar/source/source_chain.rb
|
16
18
|
lib/avatar/source/static_url_source.rb
|
17
19
|
lib/avatar/source/string_substitution_source.rb
|
20
|
+
lib/avatar/string_substitution.rb
|
18
21
|
lib/avatar/version.rb
|
19
22
|
lib/avatar/view.rb
|
20
23
|
lib/avatar/view/abstract_view_support.rb
|
@@ -63,8 +66,10 @@ test/test_file_column_source.rb
|
|
63
66
|
test/test_gravatar_source.rb
|
64
67
|
test/test_helper.rb
|
65
68
|
test/test_nil_source.rb
|
69
|
+
test/test_rails_asset_source.rb
|
66
70
|
test/test_source_chain.rb
|
67
71
|
test/test_static_url_source.rb
|
72
|
+
test/test_string_substitution.rb
|
68
73
|
test/test_string_substitution_source.rb
|
69
74
|
website/index.html
|
70
75
|
website/index.txt
|
data/lib/avatar.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
$:.unshift File.expand_path(File.dirname(__FILE__))
|
2
2
|
require 'avatar/source/abstract_source'
|
3
3
|
require 'avatar/source/gravatar_source'
|
4
|
-
require 'avatar/source/static_url_source'
|
5
|
-
require 'avatar/source/nil_source'
|
6
4
|
|
7
5
|
# Helpers for displaying avatars.
|
8
6
|
# Usage in Rails:
|
@@ -12,12 +10,10 @@ require 'avatar/source/nil_source'
|
|
12
10
|
# # in app/views/profiles/show.html.erb:
|
13
11
|
# <%= avatar_for @person =>
|
14
12
|
#
|
15
|
-
# By default, Avatar::source is a GravatarSource
|
16
|
-
# StaticUrlSource as its default.
|
17
|
-
# The latter has the url '/images/default_avatar.png'.
|
13
|
+
# By default, Avatar::source is a GravatarSource
|
18
14
|
module Avatar
|
19
15
|
|
20
|
-
@@source = Avatar::Source::
|
16
|
+
@@source = Avatar::Source::GravatarSource.new
|
21
17
|
@@default_avatar_options = {}
|
22
18
|
|
23
19
|
def self.source
|
@@ -38,7 +34,4 @@ module Avatar
|
|
38
34
|
@@options = options
|
39
35
|
end
|
40
36
|
|
41
|
-
end
|
42
|
-
|
43
|
-
url_source = Avatar::Source::StaticUrlSource.new('/images/default_avatar.png')
|
44
|
-
Avatar.source = Avatar::Source::GravatarSource.new(url_source)
|
37
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'avatar/object_support'
|
1
2
|
require 'avatar/source/abstract_source'
|
2
3
|
require 'avatar/source/static_url_source'
|
3
4
|
require 'avatar/source/nil_source'
|
@@ -23,9 +24,9 @@ module Avatar # :nodoc:
|
|
23
24
|
'http://www.gravatar.com/avatar/'
|
24
25
|
end
|
25
26
|
|
26
|
-
# ['G', 'PG', 'R', 'X']
|
27
|
+
# ['G', 'PG', 'R', 'X', 'any']
|
27
28
|
def self.allowed_ratings
|
28
|
-
['G', 'PG', 'R', 'X']
|
29
|
+
['G', 'PG', 'R', 'X', 'any']
|
29
30
|
end
|
30
31
|
|
31
32
|
# Arguments:
|
@@ -40,7 +41,7 @@ module Avatar # :nodoc:
|
|
40
41
|
# Generates a Gravatar URL. Returns nil if person is nil.
|
41
42
|
# Options:
|
42
43
|
# * <code>:gravatar_field (Symbol)</code> - the field to call from person. By default, <code>:email</code>.
|
43
|
-
# * <code>:
|
44
|
+
# * <code>:gravatar_default_url (String)</code> - override the default generated by <code>default_source</code>.
|
44
45
|
# * <code>:gravatar_size or size or :s</code> - the size in pixels of the avatar to render.
|
45
46
|
# * <code>:gravatar_rating or rating or :r</code> - the maximum rating; one of ['G', 'PG', 'R', 'X']
|
46
47
|
def avatar_url_for(person, options = {})
|
@@ -49,8 +50,12 @@ module Avatar # :nodoc:
|
|
49
50
|
field = options.delete(:gravatar_field)
|
50
51
|
raise ArgumentError.new('No field specified; either specify a default field or pass in a value for :gravatar_field (probably :email)') unless field
|
51
52
|
|
53
|
+
email = person.send(field)
|
54
|
+
return nil if email.nil? || email.to_s.blank?
|
55
|
+
email = email.to_s.downcase
|
56
|
+
|
52
57
|
returning(self.class.base_url) do |url|
|
53
|
-
url << Digest::MD5::hexdigest(
|
58
|
+
url << Digest::MD5::hexdigest(email).strip
|
54
59
|
options.each do |k, v|
|
55
60
|
next if v.nil?
|
56
61
|
url << (url.include?('?') ? '&' : '?')
|
@@ -68,13 +73,15 @@ module Avatar # :nodoc:
|
|
68
73
|
returning({}) do |result|
|
69
74
|
result[:gravatar_field] = options[:gravatar_field] || default_field
|
70
75
|
|
71
|
-
|
76
|
+
default = options[:gravatar_default_url] || default_avatar_url_for(person, options)
|
77
|
+
raise "default must be a fully-qualified URL with port and host" unless self.class.valid_default_url?(default)
|
78
|
+
result[:default] = default
|
72
79
|
|
73
|
-
size = options[:gravatar_size] || options[:size] || options[:s]
|
74
|
-
result[:size] = size if size
|
80
|
+
size = (options[:gravatar_size] || options[:size] || options[:s] || '').to_s.to_i
|
81
|
+
result[:size] = size if size > 0
|
75
82
|
|
76
83
|
rating = options[:gravatar_rating] || options[:rating] || options[:r]
|
77
|
-
result[:rating] = rating
|
84
|
+
result[:rating] = rating if rating and self.class.allowed_ratings.include?(rating.to_s)
|
78
85
|
end
|
79
86
|
end
|
80
87
|
|
@@ -93,6 +100,10 @@ module Avatar # :nodoc:
|
|
93
100
|
raise ArgumentError.new("#{default} must be either a String or an instance of #{AbstractSource}")
|
94
101
|
end
|
95
102
|
end
|
103
|
+
|
104
|
+
def self.valid_default_url?(url)
|
105
|
+
url.nil? || url =~ /^http[s]?\:/
|
106
|
+
end
|
96
107
|
|
97
108
|
private
|
98
109
|
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'avatar/string_substitution'
|
2
|
+
require 'avatar/source/abstract_source'
|
3
|
+
require 'action_view/helpers/asset_tag_helper'
|
4
|
+
|
5
|
+
module Avatar # :nodoc:
|
6
|
+
module Source # :nodoc:
|
7
|
+
# Source representing a constant path. Allows string variable
|
8
|
+
# substitution (see link:classes/Avatar/StringSubstitution.html).
|
9
|
+
# Good as a default or last-resort source in Rails projects.
|
10
|
+
class RailsAssetSource
|
11
|
+
include StringSubstitution
|
12
|
+
include AbstractSource
|
13
|
+
|
14
|
+
attr_accessor :path
|
15
|
+
attr_accessor :default_options
|
16
|
+
attr_reader :url_helper
|
17
|
+
|
18
|
+
private :url_helper
|
19
|
+
|
20
|
+
# Create a new source with static path +path+.
|
21
|
+
# Raises an error unless +path+ exists.
|
22
|
+
# +default_options+ can include any variables
|
23
|
+
# to be substituted into +path+ as defaults.
|
24
|
+
# Additionally, it can contain the key :only_path,
|
25
|
+
# which determines whether a path or full URI is generated
|
26
|
+
# by default, :only_path is false.
|
27
|
+
def initialize(path, default_options = {})
|
28
|
+
raise ArgumentError.new("path cannot be nil") if path.nil?
|
29
|
+
self.path = path.to_s
|
30
|
+
self.default_options = { :only_path => false }.merge(default_options)
|
31
|
+
@url_helper = Object.new
|
32
|
+
@url_helper.extend(ActionView::Helpers::AssetTagHelper)
|
33
|
+
end
|
34
|
+
|
35
|
+
def only_path?
|
36
|
+
default_options[:default_path]
|
37
|
+
end
|
38
|
+
|
39
|
+
def default_options=(opts)
|
40
|
+
@default_options = opts || {}
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns nil if person is nil; the static path or URI otherwise.
|
44
|
+
# Options:
|
45
|
+
# * :only_path (Boolean) - whether to output only the path or a fully-qualified URI; defaults to object-level value
|
46
|
+
# Raises an error if both +options[:only_path]+ and the object-level default are both false
|
47
|
+
# and the url returned would only be a path. Try setting
|
48
|
+
# <code>ActionController::Base.asset_host</code> to avoid this error.
|
49
|
+
#
|
50
|
+
# Note: +only_path+ being true is not a guarantee
|
51
|
+
# that only a path will be generated; if it is false,
|
52
|
+
# however, generated URLs will be full URIs.
|
53
|
+
def avatar_url_for(person, options = {})
|
54
|
+
return nil if person.nil?
|
55
|
+
options = default_options.merge(options)
|
56
|
+
path = apply_substitution(self.path, options)
|
57
|
+
uri = url_helper.image_path(path)
|
58
|
+
raise "could not generate protocol and host for #{uri}" unless uri =~ /^http[s]?\:\/\// || options[:only_path]
|
59
|
+
substitution_needed?(uri) ? nil : uri
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'avatar/string_substitution'
|
1
2
|
require 'avatar/source/abstract_source'
|
2
3
|
|
3
4
|
module Avatar # :nodoc:
|
@@ -8,19 +9,21 @@ module Avatar # :nodoc:
|
|
8
9
|
# url = source.avatar_url_for(@person, :gender => :female, :size => :large)
|
9
10
|
# # => 'female_icon_large.png'
|
10
11
|
class StringSubstitutionSource
|
12
|
+
include StringSubstitution
|
11
13
|
include AbstractSource
|
12
14
|
|
13
15
|
attr_accessor :url
|
16
|
+
attr_accessor :default_options
|
14
17
|
|
15
18
|
# Create a new source with static url +url+, which can contain any number
|
16
|
-
# of variables to be subsituted through +options+.
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
|
21
|
-
def initialize(url)
|
19
|
+
# of variables to be subsituted through +options+. See link:classes/Avatar/StringSubstitution.html
|
20
|
+
#
|
21
|
+
# Optionally, can pass in +default _options+ to be applied in replacement, overwritable
|
22
|
+
# by the +options+ passed to :avatar_url_for.
|
23
|
+
def initialize(url, default_options = {})
|
22
24
|
raise ArgumentError.new("URL cannot be nil") if url.nil?
|
23
|
-
|
25
|
+
self.url = url.to_s
|
26
|
+
self.default_options = default_options || {}
|
24
27
|
end
|
25
28
|
|
26
29
|
# Returns nil if +person+ is nil or if variables in <code>url</code>
|
@@ -29,18 +32,12 @@ module Avatar # :nodoc:
|
|
29
32
|
# with the value of the corresponding key within +options+.
|
30
33
|
def avatar_url_for(person, options = {})
|
31
34
|
return nil if person.nil?
|
32
|
-
result =
|
33
|
-
result
|
35
|
+
result = apply_substitution(self.url, self.default_options.merge(options))
|
36
|
+
substitution_needed?(result) ? nil : result
|
34
37
|
end
|
35
38
|
|
36
|
-
|
37
|
-
|
38
|
-
def apply_replacement(options)
|
39
|
-
result = self.url
|
40
|
-
options.each do |k,v|
|
41
|
-
result = result.gsub(Regexp.new('#\{' + "#{k}" + '\}'), "#{v}")
|
42
|
-
end
|
43
|
-
result
|
39
|
+
def default_options=(opts)
|
40
|
+
@default_options = opts || {}
|
44
41
|
end
|
45
42
|
|
46
43
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'avatar/object_support'
|
2
|
+
|
3
|
+
module Avatar # :nodoc:
|
4
|
+
|
5
|
+
# Allows runtime variable substitution into a String.
|
6
|
+
module StringSubstitution
|
7
|
+
|
8
|
+
# For each key in +options+ replaces '#{key}' in +string+ with the
|
9
|
+
# corresponding value in +options+.
|
10
|
+
# +string+ should
|
11
|
+
# be of the form '...#{variable_a}...#{variable_b}...'. <em>Note the
|
12
|
+
# single quotes</em>. Double quotes will cause the variables to be
|
13
|
+
# substituted before this method is run, which is almost
|
14
|
+
# certainly <strong>not</strong> what you want.
|
15
|
+
def apply_substitution(string, options)
|
16
|
+
returning(string.dup) do |result|
|
17
|
+
options.each do |k,v|
|
18
|
+
result.gsub!(Regexp.new('#\{' + "#{k}" + '\}'), "#{v}")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def substitution_needed?(string)
|
24
|
+
string =~ /#\{.*\}/
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
data/lib/avatar/version.rb
CHANGED
@@ -20,35 +20,45 @@ class TestGravatarSource < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_field
|
23
|
-
name_hash = Digest::MD5::hexdigest(@gary.name)
|
23
|
+
name_hash = Digest::MD5::hexdigest(@gary.name.downcase)
|
24
24
|
assert_equal "http://www.gravatar.com/avatar/#{name_hash}", @source.avatar_url_for(@gary, :gravatar_field => :name)
|
25
25
|
end
|
26
26
|
|
27
27
|
def test_site_wide_default_string
|
28
|
-
@source.default_source = 'fazbot'
|
29
|
-
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?default=fazbot", @source.avatar_url_for(@gary)
|
28
|
+
@source.default_source = 'http://fazbot.com'
|
29
|
+
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?default=http://fazbot.com", @source.avatar_url_for(@gary)
|
30
30
|
end
|
31
31
|
|
32
32
|
def test_site_wide_default_source
|
33
|
-
@source.default_source = Avatar::Source::StaticUrlSource.new('funky')
|
34
|
-
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?default=funky", @source.avatar_url_for(@gary)
|
33
|
+
@source.default_source = Avatar::Source::StaticUrlSource.new('http://funky.com')
|
34
|
+
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?default=http://funky.com", @source.avatar_url_for(@gary)
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_site_wide_default_nil
|
38
|
-
@source.default_source = Avatar::Source::StaticUrlSource.new('plumb')
|
38
|
+
@source.default_source = Avatar::Source::StaticUrlSource.new('http://plumb.com')
|
39
39
|
@source.default_source = nil
|
40
40
|
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}", @source.avatar_url_for(@gary)
|
41
41
|
end
|
42
42
|
|
43
43
|
def test_default_override
|
44
44
|
@source.default_source = Avatar::Source::StaticUrlSource.new('does it really matter?')
|
45
|
-
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?default=gonzo", @source.avatar_url_for(@gary, :
|
45
|
+
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?default=http://gonzo.com", @source.avatar_url_for(@gary, :gravatar_default_url => 'http://gonzo.com')
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_raises_error_if_default_only_path
|
49
|
+
assert_raises(RuntimeError) {
|
50
|
+
@source.avatar_url_for(@gary, :gravatar_default_url => 'foo')
|
51
|
+
}
|
46
52
|
end
|
47
53
|
|
48
54
|
def test_size
|
49
55
|
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?size=70", @source.avatar_url_for(@gary, :gravatar_size => 70)
|
50
56
|
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?size=109", @source.avatar_url_for(@gary, :size => 109)
|
51
|
-
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?size=62", @source.avatar_url_for(@gary, :s =>
|
57
|
+
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?size=62", @source.avatar_url_for(@gary, :s => '62x62')
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_invalid_size_does_not_pass_through
|
61
|
+
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}", @source.avatar_url_for(@gary, :s => :small)
|
52
62
|
end
|
53
63
|
|
54
64
|
def test_rating
|
@@ -57,4 +67,8 @@ class TestGravatarSource < Test::Unit::TestCase
|
|
57
67
|
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}?rating=PG", @source.avatar_url_for(@gary, :r => 'PG')
|
58
68
|
end
|
59
69
|
|
70
|
+
def test_invalid_rating_does_not_pass_through
|
71
|
+
assert_equal "http://www.gravatar.com/avatar/#{@email_hash}", @source.avatar_url_for(@gary, :r => 'EVIL')
|
72
|
+
end
|
73
|
+
|
60
74
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
require 'avatar/source/rails_asset_source'
|
3
|
+
require 'action_controller/base'
|
4
|
+
|
5
|
+
class TestRailsAssetSource < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
ActionController::Base.asset_host = 'http://test.com'
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_fully_qualified_uri
|
12
|
+
source = Avatar::Source::RailsAssetSource.new('http://example.com/images/avatar.png')
|
13
|
+
assert_equal 'http://example.com/images/avatar.png', source.avatar_url_for(3)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_string_substitution
|
17
|
+
source = Avatar::Source::RailsAssetSource.new('http://example.com/images/avatar_#{size}.png')
|
18
|
+
assert_equal 'http://example.com/images/avatar_huge.png', source.avatar_url_for(4, {:size => 'huge'})
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_uses_asset_host
|
22
|
+
source = Avatar::Source::RailsAssetSource.new('/images/avatar.png')
|
23
|
+
assert_equal 'http://test.com/images/avatar.png', source.avatar_url_for(4)
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_error_if_cannot_generate_full_uri_and_only_path_false
|
27
|
+
ActionController::Base.asset_host = ''
|
28
|
+
source = Avatar::Source::RailsAssetSource.new('/images/avatar.png')
|
29
|
+
assert_raise(RuntimeError) {
|
30
|
+
source.avatar_url_for(4)
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_no_error_if_cannot_generate_full_uri_and_only_path_true
|
35
|
+
ActionController::Base.asset_host = ''
|
36
|
+
source = Avatar::Source::RailsAssetSource.new('/images/avatar.png')
|
37
|
+
assert_equal '/images/avatar.png', source.avatar_url_for(12, :only_path => true)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_no_url_generated_if_person_is_nil
|
41
|
+
source = Avatar::Source::RailsAssetSource.new('/images/avatar.png')
|
42
|
+
assert_nil source.avatar_url_for(nil)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_no_url_generated_if_substitution_incomplete
|
46
|
+
source = Avatar::Source::RailsAssetSource.new('/images/avatar_#{size}.png')
|
47
|
+
assert_nil source.avatar_url_for(8)
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
require 'avatar/string_substitution'
|
3
|
+
|
4
|
+
class TestStringSubstitution < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@foo = Object.new
|
8
|
+
@foo.extend Avatar::StringSubstitution
|
9
|
+
@string = 'I don\'t like #{a}, #{b}, or #{c}'
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_apply_complete_substitution
|
13
|
+
assert_equal "I don't like Detroit, jam, or the letter e", @foo.apply_substitution(@string, {:a => 'Detroit', :b => 'jam', :c => 'the letter e'})
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_apply_incomplete_substitution
|
17
|
+
assert_equal 'I don\'t like #{a}, jam, or #{c}', @foo.apply_substitution(@string, {:b => 'jam'})
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_substitution_not_needed
|
21
|
+
assert !@foo.substitution_needed?('foo # bar { baz }# { yoo}')
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_substitution_needed
|
25
|
+
assert @foo.substitution_needed?('foo #{bar} #{baz}')
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/website/index.html
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
<h1>Avatar</h1>
|
34
34
|
<div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/avatar"; return false'>
|
35
35
|
<p>Get Version</p>
|
36
|
-
<a href="http://rubyforge.org/projects/avatar" class="numbers">0.0.
|
36
|
+
<a href="http://rubyforge.org/projects/avatar" class="numbers">0.0.4</a>
|
37
37
|
</div>
|
38
38
|
<h1>→ ‘Avatar’</h1>
|
39
39
|
|
@@ -45,27 +45,28 @@ support for avatars</h2>
|
|
45
45
|
<h2>Installing</h2>
|
46
46
|
|
47
47
|
|
48
|
-
<p><pre class='syntax'
|
48
|
+
<p><pre class='syntax'>sudo gem install avatar</pre></p>
|
49
49
|
|
50
50
|
|
51
51
|
<h2>The basics
|
52
|
-
Set up Avatar::source (by default, a Gravatar
|
52
|
+
Set up Avatar::source (by default, a Gravatar)
|
53
|
+
Use Avatar::source.avatar_url_for(person, options) or a view helper</h2>
|
53
54
|
|
54
55
|
|
55
56
|
<h2>Demonstration of usage</h2>
|
56
57
|
|
57
58
|
|
58
|
-
app/helpers/people_helper.rb:
|
59
|
-
<pre
|
60
|
-
class
|
61
|
-
|
62
|
-
|
63
|
-
|
59
|
+
<p>app/helpers/people_helper.rb:
|
60
|
+
<pre class='syntax'><span class="keyword">class </span><span class="class">PeopleHelper</span>
|
61
|
+
<span class="ident">include</span> <span class="constant">Avatar</span><span class="punct">::</span><span class="constant">View</span><span class="punct">::</span><span class="constant">ActionViewSupport</span>
|
62
|
+
<span class="keyword">end</span>
|
63
|
+
</pre></p>
|
64
|
+
|
65
|
+
|
66
|
+
<p>app/views/people/show.html.erb:
|
67
|
+
<pre class='syntax'><span class="punct"><%=</span><span class="string"> avatar_tag(@current_user, :size </span><span class="punct">=></span> <span class="number">40</span><span class="punct">)</span> <span class="punct">%></span><span class="string"><span class="normal">
|
68
|
+
</span></span></pre></p>
|
64
69
|
|
65
|
-
app/views/people/show.html.erb:
|
66
|
-
<pre><code class='ruby erb'>
|
67
|
-
<%= avatar_tag(@current_user, :size => 40) %>
|
68
|
-
</code></pre>
|
69
70
|
|
70
71
|
<h2>Forum</h2>
|
71
72
|
|
@@ -93,7 +94,7 @@ app/views/people/show.html.erb:
|
|
93
94
|
|
94
95
|
<p>Comments are welcome. Put them on the <a href="http://groups.google.com/group/ruby-avatar">forum</a></p>
|
95
96
|
<p class="coda">
|
96
|
-
<a href="FIXME email">FIXME full name</a>,
|
97
|
+
<a href="FIXME email">FIXME full name</a>, 28th March 2008<br>
|
97
98
|
Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
|
98
99
|
</p>
|
99
100
|
</div>
|
data/website/index.txt
CHANGED
@@ -8,25 +8,24 @@ support for avatars
|
|
8
8
|
|
9
9
|
h2. Installing
|
10
10
|
|
11
|
-
<pre syntax="
|
11
|
+
<pre syntax="bsd">sudo gem install avatar</pre>
|
12
12
|
|
13
13
|
h2. The basics
|
14
|
-
Set up Avatar::source (by default, a Gravatar
|
14
|
+
Set up Avatar::source (by default, a Gravatar)
|
15
|
+
Use Avatar::source.avatar_url_for(person, options) or a view helper
|
15
16
|
|
16
17
|
|
17
18
|
h2. Demonstration of usage
|
18
19
|
|
19
20
|
app/helpers/people_helper.rb:
|
20
|
-
<pre
|
21
|
-
class PeopleHelper
|
21
|
+
<pre syntax='ruby'>class PeopleHelper
|
22
22
|
include Avatar::View::ActionViewSupport
|
23
23
|
end
|
24
|
-
</
|
24
|
+
</pre>
|
25
25
|
|
26
26
|
app/views/people/show.html.erb:
|
27
|
-
<pre
|
28
|
-
|
29
|
-
</code></pre>
|
27
|
+
<pre syntax='ruby'><%= avatar_tag(@current_user, :size => 40) %>
|
28
|
+
</pre>
|
30
29
|
|
31
30
|
|
32
31
|
h2. Forum
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: avatar
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Rosen
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-03-
|
12
|
+
date: 2008-03-28 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -36,14 +36,17 @@ files:
|
|
36
36
|
- config/hoe.rb
|
37
37
|
- config/requirements.rb
|
38
38
|
- lib/avatar.rb
|
39
|
+
- lib/avatar/object_support.rb
|
39
40
|
- lib/avatar/source.rb
|
40
41
|
- lib/avatar/source/abstract_source.rb
|
41
42
|
- lib/avatar/source/file_column_source.rb
|
42
43
|
- lib/avatar/source/gravatar_source.rb
|
43
44
|
- lib/avatar/source/nil_source.rb
|
45
|
+
- lib/avatar/source/rails_asset_source.rb
|
44
46
|
- lib/avatar/source/source_chain.rb
|
45
47
|
- lib/avatar/source/static_url_source.rb
|
46
48
|
- lib/avatar/source/string_substitution_source.rb
|
49
|
+
- lib/avatar/string_substitution.rb
|
47
50
|
- lib/avatar/version.rb
|
48
51
|
- lib/avatar/view.rb
|
49
52
|
- lib/avatar/view/abstract_view_support.rb
|
@@ -92,8 +95,10 @@ files:
|
|
92
95
|
- test/test_gravatar_source.rb
|
93
96
|
- test/test_helper.rb
|
94
97
|
- test/test_nil_source.rb
|
98
|
+
- test/test_rails_asset_source.rb
|
95
99
|
- test/test_source_chain.rb
|
96
100
|
- test/test_static_url_source.rb
|
101
|
+
- test/test_string_substitution.rb
|
97
102
|
- test/test_string_substitution_source.rb
|
98
103
|
- website/index.html
|
99
104
|
- website/index.txt
|
@@ -136,6 +141,8 @@ test_files:
|
|
136
141
|
- test/test_gravatar_source.rb
|
137
142
|
- test/test_helper.rb
|
138
143
|
- test/test_nil_source.rb
|
144
|
+
- test/test_rails_asset_source.rb
|
139
145
|
- test/test_source_chain.rb
|
140
146
|
- test/test_static_url_source.rb
|
147
|
+
- test/test_string_substitution.rb
|
141
148
|
- test/test_string_substitution_source.rb
|