feedtosis 0.0.3.6
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +20 -0
- data/README.rdoc +135 -0
- data/Rakefile +28 -0
- data/feedtosis.gemspec +48 -0
- data/lib/extensions/core/hash.rb +7 -0
- data/lib/extensions/feed_normalizer/feed_instance_methods.rb +17 -0
- data/lib/feedtosis.rb +17 -0
- data/lib/feedtosis/client.rb +173 -0
- data/lib/feedtosis/result.rb +34 -0
- data/spec/extensions/feed_normalizer/feed_instance_methods_spec.rb +12 -0
- data/spec/feedtosis/client_spec.rb +162 -0
- data/spec/feedtosis/result_spec.rb +34 -0
- data/spec/fixtures/http_headers/wooster.txt +19 -0
- data/spec/fixtures/xml/older_wooster.xml +203 -0
- data/spec/fixtures/xml/wooster.xml +215 -0
- data/spec/spec_helper.rb +31 -0
- metadata +117 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
module Feedtosis
|
2
|
+
|
3
|
+
# Makes the response components both from the Curl::Easy object and the
|
4
|
+
# FeedNormalizer::Feed object available to the user by delegating appropriate
|
5
|
+
# method calls to the correct object. If FeedNormalizer wasn't able to process
|
6
|
+
# the response, calls which would be delegated to this object return nil. In
|
7
|
+
# these cases, depending on your business logic you may want to inspect the
|
8
|
+
# state of the Curl::Easy object by using methods forwarded to it.
|
9
|
+
class Result
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
def initialize(curl, feed)
|
13
|
+
@curl = curl
|
14
|
+
@feed = feed
|
15
|
+
|
16
|
+
raise ArgumentError, "Curl object must not be nil" if curl.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
# See what the Curl::Easy object responds to, and send any appropriate messages its way. We ignore
|
20
|
+
# Curl setter methods since those aren't really useful to delegate.
|
21
|
+
def_delegators :@curl, *Curl::Easy.instance_methods(false).reject {|m| m =~ /=$/o }
|
22
|
+
|
23
|
+
# Send methods through to the feed object unless it is nil. If feed object is nil, return nil in response to method call.
|
24
|
+
# Unfortunately we can't just see what the object responds to, since FeedNormalizer uses method_missing.
|
25
|
+
[ :title, :description, :last_updated, :copyright, :authors, :author, :urls, :url, :image, :generator, :items,
|
26
|
+
:entries, :new_items, :new_entries, :channel, :ttl, :skip_hours, :skip_days
|
27
|
+
].each do |meth| # Example method:
|
28
|
+
define_method meth do |*args| # def author
|
29
|
+
@feed.__send__(meth, *args) unless @feed.nil? # @feed.author unless @feed.nil?
|
30
|
+
end # end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
|
2
|
+
|
3
|
+
describe Feedtosis::FeedInstanceMethods do
|
4
|
+
before do
|
5
|
+
@fn = FeedNormalizer::FeedNormalizer.parse(xml_fixture('wooster'))
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should respond to new_entries and new_items" do
|
9
|
+
@fn.should respond_to(:new_entries)
|
10
|
+
@fn.should respond_to(:new_items)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,162 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
|
3
|
+
describe Feedtosis::Client do
|
4
|
+
before do
|
5
|
+
@url = "http://www.example.com/feed.rss"
|
6
|
+
@backend = Hash.new
|
7
|
+
@fr = Feedtosis::Client.new(@url, :backend => @backend)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "initialization" do
|
11
|
+
it "should set #url to an Array when an Array is given" do
|
12
|
+
@fr.url.should == @url
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "validation of url in first argument" do
|
16
|
+
it "should not raise an error on initialization with a valid HTTP url" do
|
17
|
+
lambda {
|
18
|
+
Feedtosis::Client.new('http://www.example.com')
|
19
|
+
}.should_not raise_error
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should raise an error on initialization with an invalid url" do
|
23
|
+
lambda {
|
24
|
+
Feedtosis::Client.new('ftp://www.example.com')
|
25
|
+
}.should raise_error(ArgumentError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should raise ArgumentError if options is not a Hash" do
|
30
|
+
lambda {
|
31
|
+
Feedtosis::Client.new('http://www.example.com', Object.new)
|
32
|
+
}.should raise_error(ArgumentError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should set the If-None-Match and If-Modified-Since headers to the value of the summary hash" do
|
36
|
+
curl_headers = mock('headers')
|
37
|
+
curl_headers.expects(:[]=).with('If-None-Match', '42ab')
|
38
|
+
curl_headers.expects(:[]=).with('If-Modified-Since', 'Mon, 25 May 2009 16:38:49 GMT')
|
39
|
+
|
40
|
+
summary = { :etag => '42ab', :last_modified => 'Mon, 25 May 2009 16:38:49 GMT', :digests => [ ] }
|
41
|
+
|
42
|
+
@fr.__send__(:set_summary, summary)
|
43
|
+
|
44
|
+
curl_easy = mock('curl', :perform => true, :follow_location= => true,
|
45
|
+
:response_code => 200, :body_str => xml_fixture('wooster'),
|
46
|
+
:header_str => http_header('wooster')
|
47
|
+
)
|
48
|
+
|
49
|
+
curl_easy.expects(:headers).returns(curl_headers).times(2)
|
50
|
+
|
51
|
+
@fr.expects(:new_curl_easy).returns(curl_easy)
|
52
|
+
@fr.fetch
|
53
|
+
end
|
54
|
+
|
55
|
+
describe "#summary_for_feed" do
|
56
|
+
it "should return a hash with :digests set to an empty Array when summary is nil" do
|
57
|
+
@fr.__send__(:set_summary, nil)
|
58
|
+
@fr.__send__(:summary_for_feed).should == {:digests => [ ]}
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "when given a pre-initialized backend" do
|
63
|
+
it "should set the @backend to the pre-initialized structure" do
|
64
|
+
h = Moneta::Memory.new
|
65
|
+
fc = Feedtosis::Client.new(@url, :backend => h)
|
66
|
+
fc.__send__(:instance_variable_get, :@backend).should == h
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should raise an error if the backend is not a key-value store based on behavior" do
|
70
|
+
o = Object.new
|
71
|
+
|
72
|
+
lambda {
|
73
|
+
Feedtosis::Client.new(@url, :backend => o)
|
74
|
+
}.should raise_error(ArgumentError)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#key_for_cached" do
|
80
|
+
it "should default to the MD5 of the url after the namespace" do
|
81
|
+
c = Feedtosis::Client.new(@url)
|
82
|
+
c.__send__(:key_for_cached).should == [ 'feedtosis', MD5.hexdigest(@url) ].join('_')
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should respect a custom namespace if given" do
|
86
|
+
c = Feedtosis::Client.new(@url, :namespace => 'justin')
|
87
|
+
c.__send__(:key_for_cached).should == [ 'justin', MD5.hexdigest(@url) ].join('_')
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#fetch" do
|
92
|
+
it "should call Curl::Easy.perform with the url, and #process_curl_response" do
|
93
|
+
curl_easy = mock('curl', :perform => true)
|
94
|
+
@fr.expects(:build_curl_easy).returns(curl_easy)
|
95
|
+
@fr.expects(:process_curl_response)
|
96
|
+
@fr.fetch
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "when called more than once" do
|
100
|
+
it "should call new_curl_easy with #{@url}" do
|
101
|
+
mock_curl = mock('curl')
|
102
|
+
mock_curl.expects(:follow_location=).with(true).twice
|
103
|
+
mock_curl.expects(:perform).twice
|
104
|
+
mock_curl.expects(:response_code).twice
|
105
|
+
@fr.expects(:new_curl_easy).with(@url).twice.returns(mock_curl)
|
106
|
+
@fr.fetch
|
107
|
+
@fr.fetch
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
describe "when the response code is not 200" do
|
112
|
+
it "should return nil for feed methods such as #title and #author" do
|
113
|
+
curl = mock('curl', :perform => true, :response_code => 304)
|
114
|
+
@fr.expects(:build_curl_easy).returns(curl)
|
115
|
+
res = @fr.fetch
|
116
|
+
res.title.should be_nil
|
117
|
+
res.author.should be_nil
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should return a Feedtosis::Result object" do
|
121
|
+
curl = mock('curl', :perform => true, :response_code => 304)
|
122
|
+
@fr.expects(:build_curl_easy).returns(curl)
|
123
|
+
@fr.fetch.should be_a(Feedtosis::Result)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "when the response code is 200" do
|
128
|
+
describe "when an identical resource has been retrieved previously" do
|
129
|
+
before do
|
130
|
+
curl = mock('curl', :perform => true, :response_code => 200,
|
131
|
+
:body_str => xml_fixture('wooster'), :header_str => http_header('wooster'))
|
132
|
+
@fr.expects(:build_curl_easy).returns(curl)
|
133
|
+
@fr.fetch
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should have an empty array for new_entries" do
|
137
|
+
curl = mock('curl', :perform => true, :response_code => 200,
|
138
|
+
:body_str => xml_fixture('wooster'), :header_str => http_header('wooster'))
|
139
|
+
@fr.expects(:build_curl_easy).returns(curl)
|
140
|
+
@fr.fetch.new_entries.should == []
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe "when the resource has been previously retrieved minus two entries" do
|
145
|
+
before do
|
146
|
+
curl = mock('curl', :perform => true, :response_code => 200,
|
147
|
+
:body_str => xml_fixture('older_wooster'), :header_str => http_header('wooster'))
|
148
|
+
@fr.expects(:build_curl_easy).returns(curl)
|
149
|
+
@fr.fetch
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should have two elements in new_entries" do
|
153
|
+
curl = mock('curl', :perform => true, :response_code => 200,
|
154
|
+
:body_str => xml_fixture('wooster'), :header_str => http_header('wooster'))
|
155
|
+
@fr.expects(:build_curl_easy).returns(curl)
|
156
|
+
@fr.fetch.new_entries.size.should == 2
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[.. spec_helper])
|
2
|
+
|
3
|
+
describe Feedtosis::Result do
|
4
|
+
before do
|
5
|
+
@c = mock('curl')
|
6
|
+
@f = mock('feed')
|
7
|
+
@r = Feedtosis::Result.new(@c, @f)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should raise an ArgumentError if the Curl object is nil" do
|
11
|
+
lambda {
|
12
|
+
Feedtosis::Result.new(nil, nil)
|
13
|
+
}.should raise_error(ArgumentError)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should send author to the Feed object" do
|
17
|
+
@f.expects(:author)
|
18
|
+
@r.author
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should send body_str to the curl object" do
|
22
|
+
@c.expects(:body_str)
|
23
|
+
@r.body_str
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should not respond to setter methods common in the Curl::Easy class" do
|
27
|
+
@r.should_not respond_to(:encoding=)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should return nil for author if the Feed is nil" do
|
31
|
+
r = Feedtosis::Result.new(@c, nil)
|
32
|
+
r.author
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
HTTP/1.1 302 Found
|
2
|
+
Date: Mon, 25 May 2009 17:36:02 GMT
|
3
|
+
Server: Apache/2.0.52 (Red Hat)
|
4
|
+
Location: http://feeds.feedburner.com/wooster
|
5
|
+
Content-Length: 311
|
6
|
+
Connection: close
|
7
|
+
Content-Type: text/html; charset=iso-8859-1
|
8
|
+
|
9
|
+
HTTP/1.1 200 OK
|
10
|
+
Last-Modified: Mon, 25 May 2009 16:38:49 GMT
|
11
|
+
ETag: /YJUYmsYIcQeFAGy7OZQoaCQeXw
|
12
|
+
Content-Type: text/xml; charset=utf-8
|
13
|
+
Date: Mon, 25 May 2009 17:36:03 GMT
|
14
|
+
Expires: Mon, 25 May 2009 17:36:03 GMT
|
15
|
+
Cache-Control: private, max-age=0
|
16
|
+
X-Content-Type-Options: nosniff
|
17
|
+
Server: GFE/2.0
|
18
|
+
Transfer-Encoding: chunked
|
19
|
+
|
@@ -0,0 +1,203 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?>
|
3
|
+
<?xml-stylesheet type="text/css" media="screen" href="http://feeds2.feedburner.com/~d/styles/itemcontent.css"?>
|
4
|
+
<rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
|
5
|
+
<channel>
|
6
|
+
<title>Wooster Collective</title>
|
7
|
+
<link>http://www.woostercollective.com/</link>
|
8
|
+
<description/>
|
9
|
+
<language>en</language>
|
10
|
+
<copyright>Copyright 2009</copyright>
|
11
|
+
<lastBuildDate>Mon, 25 May 2009 07:48:04 -0500</lastBuildDate>
|
12
|
+
<generator>http://www.sixapart.com/movabletype/?v=3.3</generator>
|
13
|
+
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
|
14
|
+
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="www.woostercollective.com/rss/index.xml" type="application/rss+xml"/>
|
15
|
+
<feedburner:emailServiceId>wooster</feedburner:emailServiceId>
|
16
|
+
<feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname>
|
17
|
+
<item>
|
18
|
+
<title>Seen In North London: Department of Urban Censorship</title>
|
19
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/urbancensor.jpg"><img alt="urbancensor.jpg" src="http://www.woostercollective.com/urbancensor-thumb.jpg" width="500" height="444" /></a></p>
|
20
|
+
|
21
|
+
<p>(Thanks, <a href="http://www.tupajumi.com/jonathan/">Jonathan</a>)<br />
|
22
|
+
</p>]]></description>
|
23
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/syiP17t0PKo/seen_in_north_london_department_of_urban.html</link>
|
24
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/seen_in_north_london_department_of_urban.html</guid>
|
25
|
+
<category>Wheatpastes</category>
|
26
|
+
<pubDate>Mon, 25 May 2009 07:39:16 -0500</pubDate>
|
27
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/seen_in_north_london_department_of_urban.html</feedburner:origLink>
|
28
|
+
</item>
|
29
|
+
<item>
|
30
|
+
<title>Seen On The Steets Of Stockholm</title>
|
31
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/poststock.jpg"><img alt="poststock.jpg" src="http://www.woostercollective.com/poststock-thumb.jpg" width="500" height="748" /></a></p>
|
32
|
+
|
33
|
+
<p>Artist: <a href="http://vimeo.com/post">Post</a></p>]]></description>
|
34
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/611KGRn-ZQE/seen_on_the_steets_of_stockholm.html</link>
|
35
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/seen_on_the_steets_of_stockholm.html</guid>
|
36
|
+
<category>Wheatpastes</category>
|
37
|
+
<pubDate>Mon, 25 May 2009 07:29:55 -0500</pubDate>
|
38
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/seen_on_the_steets_of_stockholm.html</feedburner:origLink>
|
39
|
+
</item>
|
40
|
+
<item>
|
41
|
+
<title>Zevs' Electric Rainbows (2007)</title>
|
42
|
+
<description><![CDATA[<p>Zevs has updated <a href="http://www.gzzglz.com/">his website</a> with photos of past and recent project. We love the Electric Rainbows that he exchanged for advertisements back 2007:</p>
|
43
|
+
|
44
|
+
<p><a href="http://www.woostercollective.com/electric-rainbow-02.jpg"><img alt="electric-rainbow-02.jpg" src="http://www.woostercollective.com/electric-rainbow-02-thumb.jpg" width="500" height="335" /></a></p>
|
45
|
+
|
46
|
+
<p><br />
|
47
|
+
</p>]]></description>
|
48
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/TpmlTS7y0f0/zevs_electric_rainbows_2007.html</link>
|
49
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/zevs_electric_rainbows_2007.html</guid>
|
50
|
+
<category>Art</category>
|
51
|
+
<pubDate>Mon, 25 May 2009 07:19:27 -0500</pubDate>
|
52
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/zevs_electric_rainbows_2007.html</feedburner:origLink>
|
53
|
+
</item>
|
54
|
+
<item>
|
55
|
+
<title>Zephyr - An Introduction</title>
|
56
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/zephydith.jpg"><img alt="zephydith.jpg" src="http://www.woostercollective.com/zephydith-thumb.jpg" width="500" height="347" /></a></p>
|
57
|
+
|
58
|
+
<p><object width="320" height="265"><param name="movie" value="http://www.youtube.com/v/kqXXZcy-2JU&hl=en&fs=1&rel=0&hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/kqXXZcy-2JU&hl=en&fs=1&rel=0&hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="320" height="265"></embed></object></p>
|
59
|
+
|
60
|
+
<p>One of the first graffiti artists to "accept" Sara and I back in 2000 when we started the Wooster Collective was Zephyr. This week <a href="http://www.upperplayground.com/">Upper Playground</a> posted a terrific interview with Zephyr filmed a few years ago for their Dithers DVD. </p>]]></description>
|
61
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/32-ED1oPdYY/zephyr_in_introduction.html</link>
|
62
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/zephyr_in_introduction.html</guid>
|
63
|
+
<category>Graffiti</category>
|
64
|
+
<pubDate>Sat, 23 May 2009 12:44:36 -0500</pubDate>
|
65
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/zephyr_in_introduction.html</feedburner:origLink>
|
66
|
+
</item>
|
67
|
+
<item>
|
68
|
+
<title>The Yes Men - An Introduction</title>
|
69
|
+
<description><![CDATA[<div><object width="512" height="322"><param name="movie" value="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.40" /><param name="allowFullScreen" value="true" /><param name="AllowScriptAccess" VALUE="always" /><param name="bgcolor" value="#000000" /><param name="flashVars" value="id=13527850&vid=13527850&lang=en-us&intl=us&thumbUrl=&embed=1" /><embed src="http://d.yimg.com/static.video.yahoo.com/yep/YV_YEP.swf?ver=2.2.40" type="application/x-shockwave-flash" width="512" height="322" allowFullScreen="true" AllowScriptAccess="always" bgcolor="#000000" flashVars="id=13527850&vid=13527850&lang=en-us&intl=us&thumbUrl=&embed=1" ></embed></object><br /><a href="http://video.yahoo.com/watch/13527850/13527850"></a> @ <a href="http://video.yahoo.com" >Yahoo! Video</a></div>
|
70
|
+
|
71
|
+
<p>If you're not familiar with <a href="http://theyesmen.org/">The Yes Men</a>, this video of their Poptech speech from 2006 is a fantastic introduction.</p>
|
72
|
+
|
73
|
+
<p>(Hat tip to <a href="http://www.brainpickings.org/">Brain Pickings</a>)</p>]]></description>
|
74
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/0yXb4Ui8C3I/the_yes_men_an_introduction.html</link>
|
75
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/the_yes_men_an_introduction.html</guid>
|
76
|
+
<category>Activism</category>
|
77
|
+
<pubDate>Fri, 22 May 2009 11:24:26 -0500</pubDate>
|
78
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/the_yes_men_an_introduction.html</feedburner:origLink>
|
79
|
+
</item>
|
80
|
+
<item>
|
81
|
+
<title>A Great Example Of Site Specific Work: Carlsbad Sidewalk Surfer</title>
|
82
|
+
<description><![CDATA[<p><img alt="bryansurfer.jpg" src="http://www.woostercollective.com/bryansurfer.jpg" width="500" height="384" /></p>
|
83
|
+
|
84
|
+
<p><object width="400" height="307"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=4772503&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=4772503&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="307"></embed></object><p><a href="http://vimeo.com/4772503">Carlsbad Sidewalk Surfer by bryan snyder</a> from <a href="http://vimeo.com/bryansnyder">Bryan Snyder</a> on <a href="http://vimeo.com">Vimeo</a>.</p></p>
|
85
|
+
|
86
|
+
<p>From <a href="http://www.snyderartdesign.com">Bryan</a>:</p>
|
87
|
+
|
88
|
+
<p>Carlsbad Sidewalk Surfer interacts with its environment during mid day wind gusts. Like the waves that tumble upon our shore, the visibility of this art piece depends on the weather. Between the glassy conditions of the morning and the mellow winds at dusk, the Carlsbad Sidewalk Surfer sneaks into another ride. The goal of this project is to showcase the relationship between a piece of art and its environment when placed in the streets."</p>]]></description>
|
89
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/oXfLFSd86cY/a_great_example_of_site_specific_work_ca.html</link>
|
90
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/a_great_example_of_site_specific_work_ca.html</guid>
|
91
|
+
<category>Environmental</category>
|
92
|
+
<pubDate>Fri, 22 May 2009 07:54:36 -0500</pubDate>
|
93
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/a_great_example_of_site_specific_work_ca.html</feedburner:origLink>
|
94
|
+
</item>
|
95
|
+
<item>
|
96
|
+
<title>Herakut Beautifies The Streets Of New York</title>
|
97
|
+
<description><![CDATA[<p><img alt="9501466.jpg" src="http://www.woostercollective.com/9501466.jpg" width="480" height="640" /></p>
|
98
|
+
|
99
|
+
<p>While they were in town this week for an opening at <a href="http://redflagg.com/">RedFlagg</a>, <a href="http://www.herakut.de/">Herakut</a> put up a wonderful piece outside <a href="http://eyebeam.org/">Eyebeam</a> If you haven't head about the show in New York, here's the info:</p>
|
100
|
+
|
101
|
+
<p>Herakut<br />
|
102
|
+
No Placebos<br />
|
103
|
+
May 21 – July 3, 2009</p>]]></description>
|
104
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/rWAKvvkBDYY/herakut_beautifies_the_streets_of_new_yo.html</link>
|
105
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/herakut_beautifies_the_streets_of_new_yo.html</guid>
|
106
|
+
<category>Walls</category>
|
107
|
+
<pubDate>Fri, 22 May 2009 07:40:04 -0500</pubDate>
|
108
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/herakut_beautifies_the_streets_of_new_yo.html</feedburner:origLink>
|
109
|
+
</item>
|
110
|
+
<item>
|
111
|
+
<title>Fresh Stuff From Cena7</title>
|
112
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/cenared.jpg"><img alt="cenared.jpg" src="http://www.woostercollective.com/cenared-thumb.jpg" width="500" height="409" /></a></p>
|
113
|
+
|
114
|
+
<p>More from Cena7 <a href="http://www.flickr.com/photos/cena7-mpc">here</a>. <br />
|
115
|
+
</p>]]></description>
|
116
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/x4y4ZuKBadg/fresh_stuff_from_cena7_1.html</link>
|
117
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/fresh_stuff_from_cena7_1.html</guid>
|
118
|
+
<category>Walls</category>
|
119
|
+
<pubDate>Fri, 22 May 2009 07:37:33 -0500</pubDate>
|
120
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/fresh_stuff_from_cena7_1.html</feedburner:origLink>
|
121
|
+
</item>
|
122
|
+
<item>
|
123
|
+
<title>Wooster on Facebook</title>
|
124
|
+
<description><![CDATA[<p><img alt="woostfaceo.jpg" src="http://www.woostercollective.com/woostfaceo.jpg" width="500" height="376" /></p>
|
125
|
+
|
126
|
+
<p>Each and every day we get more excited about the discussions that are taking place on our <a href="http://www.facebook.com/pages/Wooster-Collective/24080260389?ref=ts#/pages/Wooster-Collective/24080260389?ref=mf">Wooster Collective Facebook page</a>. The responses to our recent questions:</p>
|
127
|
+
|
128
|
+
<p>For those who risk getting arrested while putting up street art or writing graffiti: What motivates you to do it?</p>
|
129
|
+
|
130
|
+
<p>What's currently inspiring you?</p>
|
131
|
+
|
132
|
+
<p>How would you describe the "role" that graffiti or street art plays in your life? What does it "add" or subtract?</p>
|
133
|
+
|
134
|
+
<p>If I gave you $50 today, with the condition that you had to spend it on "art", what would you do with it?</p>
|
135
|
+
|
136
|
+
<p>If you haven't yet checked it out we can't recommend it more highly. It's become an incredible companion to the Wooster blog. </p>
|
137
|
+
|
138
|
+
<p>Also, we are indeed on Twitter. Not as "Wooster Collective" but as <a href="http://www.twitter.com/MarcSchil">Marc</a> and <a href="http://www.twitter.com/saraschiller">Sara</a>. </p>]]></description>
|
139
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/4uAvR5rZn80/wooster_on_facebook.html</link>
|
140
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/wooster_on_facebook.html</guid>
|
141
|
+
<category>Site Announcements</category>
|
142
|
+
<pubDate>Thu, 21 May 2009 08:05:18 -0500</pubDate>
|
143
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/wooster_on_facebook.html</feedburner:origLink>
|
144
|
+
</item>
|
145
|
+
<item>
|
146
|
+
<title>Wooster on Facebook</title>
|
147
|
+
<description><![CDATA[<p><img alt="woostfaceo.jpg" src="http://www.woostercollective.com/woostfaceo.jpg" width="500" height="376" /></p>
|
148
|
+
|
149
|
+
<p>Each and every day we get more excited about the discussions that are taking place on our <a href="http://www.facebook.com/pages/Wooster-Collective/24080260389?ref=ts#/pages/Wooster-Collective/24080260389?ref=mf">Wooster Collective Facebook page</a>. The responses to our recent questions:</p>
|
150
|
+
|
151
|
+
<p>For those who risk getting arrested while putting up street art or writing graffiti: What motivates you to do it?</p>
|
152
|
+
|
153
|
+
<p>What's currently inspiring you?</p>
|
154
|
+
|
155
|
+
<p>How would you describe the "role" that graffiti or street art plays in your life? What does it "add" or subtract?</p>
|
156
|
+
|
157
|
+
<p>If I gave you $50 today, with the condition that you had to spend it on "art", what would you do with it?</p>
|
158
|
+
|
159
|
+
<p>If you haven't yet checked it out we can't recommend it more highly. It's become an incredible companion to the Wooster blog. </p>
|
160
|
+
|
161
|
+
<p>Also, we are indeed on Twitter. Not as "Wooster Collective" but as <a href="http://www.twitter.com/MarcSchil">Marc</a> and <a href="http://www.twitter.com/saraschiller">Sara</a>. </p>]]></description>
|
162
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/CV9qfY3WZqM/wooster_on_facebook_1.html</link>
|
163
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/wooster_on_facebook_1.html</guid>
|
164
|
+
<category>Site Announcements</category>
|
165
|
+
<pubDate>Thu, 21 May 2009 08:05:18 -0500</pubDate>
|
166
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/wooster_on_facebook_1.html</feedburner:origLink>
|
167
|
+
</item>
|
168
|
+
<item>
|
169
|
+
<title>Seen On The Steets Of Berlin</title>
|
170
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/brownpaper1.jpg"><img alt="brownpaper1.jpg" src="http://www.woostercollective.com/brownpaper1-thumb.jpg" width="500" height="416" /></a><br />
|
171
|
+
</p>]]></description>
|
172
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/O-9kaseEs8I/seen_on_the_steets_of_berlin_1.html</link>
|
173
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/seen_on_the_steets_of_berlin_1.html</guid>
|
174
|
+
<category>Wheatpastes</category>
|
175
|
+
<pubDate>Thu, 21 May 2009 07:57:05 -0500</pubDate>
|
176
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/seen_on_the_steets_of_berlin_1.html</feedburner:origLink>
|
177
|
+
</item>
|
178
|
+
<item>
|
179
|
+
<title>Checkin' In With... Lister</title>
|
180
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/listcheck.jpg"><img alt="listcheck.jpg" src="http://www.woostercollective.com/listcheck-thumb.jpg" width="500" height="342" /></a></p>
|
181
|
+
|
182
|
+
<p>"out onto this roof the other night. i wasnt even sure that i had finished this piece but when i returned the next day i was surprised that it looked like this. the wall was so big and high that i couldn't step back at all. i am still surprised the proportions were correct."... <a href="http://www.anthonylister.com">Lister</a></p>]]></description>
|
183
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/xKfEO6qRHLY/checkin_in_with_lister.html</link>
|
184
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/checkin_in_with_lister.html</guid>
|
185
|
+
<category>Walls</category>
|
186
|
+
<pubDate>Thu, 21 May 2009 07:45:54 -0500</pubDate>
|
187
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/checkin_in_with_lister.html</feedburner:origLink>
|
188
|
+
</item>
|
189
|
+
<item>
|
190
|
+
<title>Another Great Electronic Billboard Takeover From Poster Child</title>
|
191
|
+
<description><![CDATA[<p><a href="http://www.woostercollective.com/pixeljes.jpg"><img alt="pixeljes.jpg" src="http://www.woostercollective.com/pixeljes-thumb.jpg" width="500" height="375" /></a></p>
|
192
|
+
|
193
|
+
<div><object width="480" height="381"><param name="movie" value="http://www.dailymotion.com/swf/x99ave_stained-glass-postpixelators_creation&related=1"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed src="http://www.dailymotion.com/swf/x99ave_stained-glass-postpixelators_creation&related=1" type="application/x-shockwave-flash" width="480" height="381" allowFullScreen="true" allowScriptAccess="always"></embed></object><br /><b><a href="http://www.dailymotion.com/video/x99ave_stained-glass-postpixelators_creation">Stained Glass Post-Pixelators</a></b><br /><i>Uploaded by <a href="http://www.dailymotion.com/posterchild">posterchild</a>. - <a href="http://www.dailymotion.com/channel/creation">Independent web videos.</a></i></div>
|
194
|
+
|
195
|
+
<p>More from Poster Child <a href="http://www.bladediary.com/">here</a>. </p>]]></description>
|
196
|
+
<link>http://feedproxy.google.com/~r/wooster/~3/Rz_yYr1lijQ/another_great_electronic_billboard_takeo.html</link>
|
197
|
+
<guid isPermaLink="false">http://www.woostercollective.com/2009/05/another_great_electronic_billboard_takeo.html</guid>
|
198
|
+
<category>Billboard Liberations</category>
|
199
|
+
<pubDate>Wed, 20 May 2009 07:59:04 -0500</pubDate>
|
200
|
+
<feedburner:origLink>http://www.woostercollective.com/2009/05/another_great_electronic_billboard_takeo.html</feedburner:origLink>
|
201
|
+
</item>
|
202
|
+
</channel>
|
203
|
+
</rss>
|