tumblr-api 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +7 -0
- data/History +12 -0
- data/LICENSE +20 -0
- data/README.rdoc +91 -0
- data/Rakefile +51 -0
- data/VERSION.yml +4 -0
- data/lib/tumblr.rb +21 -0
- data/lib/tumblr/post.rb +125 -0
- data/lib/tumblr/request.rb +50 -0
- data/lib/tumblr/user.rb +14 -0
- data/spec/fixtures/read_0_0.xml +82 -0
- data/spec/fixtures/read_0_0_photo.xml +25 -0
- data/spec/fixtures/read_0_1.xml +13 -0
- data/spec/fixtures/read_0_1_photo.xml +17 -0
- data/spec/fixtures/read_0_50.xml +172 -0
- data/spec/fixtures/read_0_50_photo.xml +25 -0
- data/spec/fixtures/read_100_50.xml +69 -0
- data/spec/fixtures/read_108796131.xml +12 -0
- data/spec/fixtures/read_119_1.xml +12 -0
- data/spec/fixtures/read_50_50.xml +159 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/tumblr_spec.rb +237 -0
- data/tumblr-api.gemspec +70 -0
- data/tumblr.gemspec +68 -0
- metadata +100 -0
data/.document
ADDED
data/.gitignore
ADDED
data/History
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
0.1.3 - The gem now only supports HTTParty <= 4.3 (since newer versions break everything ;) )
|
2
|
+
0.1.0 - Re-wrote the Post class (the read methods)
|
3
|
+
0.0.10 - Fixed dependencies
|
4
|
+
0.0.9 - Removed the version number from the HTTParty dependency
|
5
|
+
0.0.8 - The example app slipped in. Removed it.
|
6
|
+
0.0.7 - Somethig went wrong, pushing again...
|
7
|
+
0.0.6 - Fixed a bug in Post::find_from_id (the post-id wasn't being passed to the api)
|
8
|
+
0.0.5 - Finished README.rdoc!
|
9
|
+
0.0.4 - Updated README.rdoc, removed the docs folder (http://rdoc.info/projects/jeffkreeftmeijer/tumblr)
|
10
|
+
0.0.3 - Forgot to update the gemspec. Here it goes! :)
|
11
|
+
0.0.2 - Added the docs
|
12
|
+
0.0.1 - Initial Release
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Jeff Kreeftmeijer
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
= Tumblr
|
2
|
+
|
3
|
+
Tumblr is a rails gem that allows you to use the Tumblr API. The idea is that you don't have to worry about HTTP requests, you just want to fetch your posts right? But there's more; you can also create, update and destroy Tumblr posts and do so as railsy as possible.
|
4
|
+
|
5
|
+
== Installation
|
6
|
+
|
7
|
+
To install the gem, put this in your environment file;
|
8
|
+
|
9
|
+
config.gem 'tumblr-api', :source => 'http://gemcutter.org'
|
10
|
+
|
11
|
+
And install the gem;
|
12
|
+
|
13
|
+
rake gems:install
|
14
|
+
|
15
|
+
== Authentication
|
16
|
+
|
17
|
+
To create, update or delete a post (or fetch private posts), you should be authenticated. The only thing you have to do is call initialize the User class by doing this:
|
18
|
+
|
19
|
+
user = Tumblr::User.new('your@email.com', 'yourpassword')
|
20
|
+
|
21
|
+
The +user+ object holds your +email+ and +password+. If also calls to the API to get the user's data. If you don't want to call to the API and just get a user object, call it like this:
|
22
|
+
|
23
|
+
user = Tumblr::User.new('your@email.com', 'yourpassword', false)
|
24
|
+
|
25
|
+
== Fetching Posts
|
26
|
+
|
27
|
+
Fetching posts is easy. The first thing you have to do is tell the Tumblr gem which blog we're talking about. So, If your blog is located on http://myblog.tumblr.com you do this:
|
28
|
+
|
29
|
+
Tumblr.blog = 'myblog'
|
30
|
+
|
31
|
+
When just fetching posts, you don't have to worry about authentication, so let's go and get your posts now, shall we?
|
32
|
+
|
33
|
+
@posts = Tumblr::Post.all
|
34
|
+
|
35
|
+
Congratulations! Now you've got all - with a maximum of 50 - of your posts!
|
36
|
+
|
37
|
+
Want the first/last post? No problem:
|
38
|
+
|
39
|
+
@posts = Tumblr::Post.first # gets the first post it can find
|
40
|
+
@posts = Tumblr::Post.last # gets the last post it can find
|
41
|
+
|
42
|
+
And when you want a specific post, you can always just do this:
|
43
|
+
|
44
|
+
@posts = Tumblr::Post.find(12345) # gets the post with ID = 12345
|
45
|
+
|
46
|
+
== Parameters
|
47
|
+
|
48
|
+
Tumblr allows you to pass some parameters to you requests. In the functions described above, the Tumblr gem automatically sets the +start+, +num+ and/or +id+ parameters. But you can add more!
|
49
|
+
|
50
|
+
@posts = Tumblr::Post.all(:type => 'photo') # gets all posts with type = 'photo'
|
51
|
+
@posts = Tumblr::Post.all(:filter => 'text') # gets all posts in plain text
|
52
|
+
|
53
|
+
Please check out http://www.tumblr.com/docs/api for Tumblr's full documentation about their API and the parameters.
|
54
|
+
|
55
|
+
== Authenticated read
|
56
|
+
|
57
|
+
To be able to fetch private posts, you have to be authenticated. Just include the User object (see Authentication above) like so:
|
58
|
+
|
59
|
+
@posts = Tumblr::Post.all(user)
|
60
|
+
|
61
|
+
== Creating posts
|
62
|
+
|
63
|
+
To create a post, you should include the authentication object. More information about the parameters you have to include to create posts can be found in the Tumblr API Docs -> http://www.tumblr.com/docs/api.
|
64
|
+
|
65
|
+
This is an example of a "regular" text post:
|
66
|
+
|
67
|
+
post = Tumblr::Post.create(user, :type => 'regular', :title => 'Tumblr', :body => 'Tumblr is a rails gem that allows you to use the Tumblr API.')
|
68
|
+
|
69
|
+
After a post is successfully created, Tumblr will return the newly created post's id.
|
70
|
+
|
71
|
+
== Updating posts
|
72
|
+
|
73
|
+
Updating posts is a lot like creating posts. The only thing you have to do is provide the id of the post you wish to edit (the parameters +type+, +private+ and +format+ are ignored and can be omitted.):
|
74
|
+
|
75
|
+
post = Tumblr::Post.create(user, :post_id => '12345', :title => 'Tumblr', :body => 'Tumblr is a super awesome rails gem that allows you to use the Tumblr API.')
|
76
|
+
|
77
|
+
After a post is successfully updated, Tumblr will return the post's id.
|
78
|
+
|
79
|
+
== Destroying posts
|
80
|
+
|
81
|
+
Just provide the user object and the +post_id+ of the post you'd like to destroy:
|
82
|
+
|
83
|
+
Tumblr::Post.destroy(user, :post_id => 12345)
|
84
|
+
|
85
|
+
== Docs
|
86
|
+
|
87
|
+
http://rdoc.info/projects/jeffkreeftmeijer/tumblr
|
88
|
+
|
89
|
+
== Copyright
|
90
|
+
|
91
|
+
Copyright (c) 2009 Jeff Kreeftmeijer. See LICENSE for details.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "tumblr-api"
|
8
|
+
gem.summary = %q{Tumblr API wrapper}
|
9
|
+
gem.email = "jeff@kreeftmeijer.nl"
|
10
|
+
gem.homepage = "http://github.com/jeffkreeftmeijer/tumblr"
|
11
|
+
gem.authors = ["Jeff Kreeftmeijer"]
|
12
|
+
gem.add_dependency('httparty')
|
13
|
+
gem.add_dependency('activesupport')
|
14
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
15
|
+
end
|
16
|
+
|
17
|
+
rescue LoadError
|
18
|
+
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'spec/rake/spectask'
|
22
|
+
Spec::Rake::SpecTask.new(:spec) do |spec|
|
23
|
+
spec.libs << 'lib' << 'spec'
|
24
|
+
spec.spec_files = FileList['spec/**/*_spec.rb']
|
25
|
+
end
|
26
|
+
|
27
|
+
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
28
|
+
spec.libs << 'lib' << 'spec'
|
29
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
30
|
+
spec.rcov = true
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
task :default => :spec
|
35
|
+
|
36
|
+
require 'rake/rdoctask'
|
37
|
+
Rake::RDocTask.new do |rdoc|
|
38
|
+
if File.exist?('VERSION.yml')
|
39
|
+
config = YAML.load(File.read('VERSION.yml'))
|
40
|
+
version = "#{config[:major]}.#{config[:minor]}.#{config[:patch]}"
|
41
|
+
else
|
42
|
+
version = ""
|
43
|
+
end
|
44
|
+
|
45
|
+
rdoc.rdoc_dir = 'rdoc'
|
46
|
+
rdoc.title = "tumblr #{version}"
|
47
|
+
rdoc.rdoc_files.include('README*')
|
48
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
49
|
+
end
|
50
|
+
|
51
|
+
Jeweler::GemcutterTasks.new
|
data/VERSION.yml
ADDED
data/lib/tumblr.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'httparty', "<= 4.3"
|
3
|
+
require 'httparty'
|
4
|
+
|
5
|
+
require 'tumblr/user'
|
6
|
+
require 'tumblr/request'
|
7
|
+
require 'tumblr/post'
|
8
|
+
|
9
|
+
class Tumblr
|
10
|
+
class << self; attr_accessor :blog end
|
11
|
+
|
12
|
+
# tumblr errors
|
13
|
+
class TumblrError < StandardError; end
|
14
|
+
# tumblr 403 errors
|
15
|
+
class Forbidden < TumblrError; end
|
16
|
+
# tumblr 400 errors
|
17
|
+
class BadRequest < TumblrError; end
|
18
|
+
# tumblr 404 errors
|
19
|
+
class NotFound < TumblrError; end
|
20
|
+
|
21
|
+
end
|
data/lib/tumblr/post.rb
ADDED
@@ -0,0 +1,125 @@
|
|
1
|
+
class Tumblr
|
2
|
+
class Post
|
3
|
+
|
4
|
+
# works just like ActiveRecord's find. (:all, :first, :last or id)
|
5
|
+
def self.find(*args)
|
6
|
+
extra_options = args.last.is_a?(Hash) ? args.pop : {}
|
7
|
+
|
8
|
+
case args.first
|
9
|
+
when :all then return self.find_every(extra_options)
|
10
|
+
when :first then return self.find_initial(extra_options)
|
11
|
+
when :last then return self.find_last(extra_options)
|
12
|
+
else return self.find_from_id(args.first)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# count the posts
|
17
|
+
def self.count(options = {})
|
18
|
+
|
19
|
+
#puts balh = {:num => 1}.merge(options).to_yaml
|
20
|
+
response = Tumblr::Request.read({:num => 1}.merge(options))
|
21
|
+
if(options.empty?)
|
22
|
+
#puts response['tumblr']['posts'].to_yaml
|
23
|
+
#puts "*****"
|
24
|
+
end
|
25
|
+
response['tumblr']['posts']['total'].to_i
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
# find the first post
|
30
|
+
def self.find_initial(options)
|
31
|
+
total = self.count
|
32
|
+
options = {:start => (total - 1), :num => 1} if(options.empty?)
|
33
|
+
response = Tumblr::Request.read(options)
|
34
|
+
|
35
|
+
return response['tumblr']['posts']['post'].first unless(options == {:start => (total - 1), :num => 1})
|
36
|
+
response['tumblr']['posts']['post']
|
37
|
+
end
|
38
|
+
|
39
|
+
# find the last post
|
40
|
+
def self.find_last(options)
|
41
|
+
response = Tumblr::Request.read({:num => 1}.merge(options))
|
42
|
+
response['tumblr']['posts']['post']
|
43
|
+
end
|
44
|
+
|
45
|
+
# find all posts
|
46
|
+
def self.find_every(options)
|
47
|
+
amount = (Tumblr::Post.count(options).to_f / 50).ceil
|
48
|
+
options = {:num => 50}.merge(options)
|
49
|
+
|
50
|
+
responses = []
|
51
|
+
amount.times do |count|
|
52
|
+
responses << Tumblr::Request.read(options.merge({:start => (count.to_i * 50)}))
|
53
|
+
#puts options.merge({:start => (count.to_i * 50)}).to_yaml
|
54
|
+
end
|
55
|
+
|
56
|
+
response = {'tumblr' => {'posts' => {'post' => []}}}
|
57
|
+
responses.each do |r|
|
58
|
+
r['tumblr']['posts']['post'].each { | p | response['tumblr']['posts']['post'] << p }
|
59
|
+
end
|
60
|
+
|
61
|
+
#puts response['tumblr']['posts']['post'].length.to_yaml
|
62
|
+
|
63
|
+
return [response['tumblr']['posts']['post']] unless(response['tumblr']['posts']['post'].is_a?(Array))
|
64
|
+
response['tumblr']['posts']['post']
|
65
|
+
end
|
66
|
+
|
67
|
+
# find a post by id
|
68
|
+
def self.find_from_id(id)
|
69
|
+
response = Tumblr::Request.read(:id => id)
|
70
|
+
response['tumblr']['posts']['post']
|
71
|
+
end
|
72
|
+
|
73
|
+
# alias of find(:all)
|
74
|
+
def self.all(options = {})
|
75
|
+
self.find(:all, options)
|
76
|
+
end
|
77
|
+
|
78
|
+
# alias of find(:first)
|
79
|
+
def self.first(options = {})
|
80
|
+
self.find(:first, options)
|
81
|
+
end
|
82
|
+
|
83
|
+
# alias of find(:last)
|
84
|
+
def self.last(options = {})
|
85
|
+
self.find(:last, options)
|
86
|
+
end
|
87
|
+
|
88
|
+
# create a new post
|
89
|
+
def self.create(*args)
|
90
|
+
options = process_options(*args)
|
91
|
+
Tumblr::Request.write(options)
|
92
|
+
end
|
93
|
+
|
94
|
+
# update a post
|
95
|
+
def self.update(*args)
|
96
|
+
options = process_options(*args)
|
97
|
+
Tumblr::Request.write(options)
|
98
|
+
end
|
99
|
+
|
100
|
+
# destroy a post
|
101
|
+
def self.destroy(*args)
|
102
|
+
options = process_options(*args)
|
103
|
+
Tumblr::Request.delete(options)
|
104
|
+
end
|
105
|
+
|
106
|
+
# extracts options from the arguments, converts a user object to :email and :password params and fixes the :post_id/'post-id' issue.
|
107
|
+
def self.process_options(*args)
|
108
|
+
options = args.last.is_a?(Hash) ? args.pop : {}
|
109
|
+
|
110
|
+
if((user = args.first).is_a?(Tumblr::User))
|
111
|
+
options = options.merge(
|
112
|
+
:email => user.email,
|
113
|
+
:password => user.password
|
114
|
+
)
|
115
|
+
end
|
116
|
+
|
117
|
+
if(options[:post_id])
|
118
|
+
options['post-id'] = options[:post_id]
|
119
|
+
options[:post_id] = nil
|
120
|
+
end
|
121
|
+
|
122
|
+
return options
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class Tumblr
|
2
|
+
class Request
|
3
|
+
|
4
|
+
# a GET request to http://[YOURUSERNAME].tumblr.com/api/read
|
5
|
+
def self.read(options = {})
|
6
|
+
response = HTTParty.get("http://#{Tumblr::blog ||= 'staff'}.tumblr.com/api/read", options)
|
7
|
+
return response unless raise_errors(response)
|
8
|
+
end
|
9
|
+
|
10
|
+
# a POST request to http://www.tumblr.com/api/write
|
11
|
+
def self.write(options = {})
|
12
|
+
response = HTTParty.post('http://www.tumblr.com/api/write', :query => options)
|
13
|
+
return(response) unless raise_errors(response)
|
14
|
+
end
|
15
|
+
|
16
|
+
# a POST request to http://www.tumblr.com/api/delete
|
17
|
+
def self.delete(options = {})
|
18
|
+
response = HTTParty.post('http://www.tumblr.com/api/delete', :query => options)
|
19
|
+
return(response) unless raise_errors(response)
|
20
|
+
end
|
21
|
+
|
22
|
+
# a POST request to http://www.tumblr.com/api/authenticate
|
23
|
+
def self.authenticate(email, password)
|
24
|
+
HTTParty.post('http://www.tumblr.com/api/authenticate', :query => {:email => email, :password => password})
|
25
|
+
end
|
26
|
+
|
27
|
+
# raise tumblr response errors.
|
28
|
+
def self.raise_errors(response)
|
29
|
+
if(response.is_a?(Hash))
|
30
|
+
message = "#{response[:code]}: #{response[:body]}"
|
31
|
+
code = response[:code].to_i
|
32
|
+
else
|
33
|
+
message = "#{response.code}: #{response.body}"
|
34
|
+
code = response.code.to_i
|
35
|
+
end
|
36
|
+
|
37
|
+
case code
|
38
|
+
when 403
|
39
|
+
raise(Forbidden.new, message)
|
40
|
+
when 400
|
41
|
+
raise(BadRequest.new, message)
|
42
|
+
when 404
|
43
|
+
raise(NotFound.new, message)
|
44
|
+
when 201
|
45
|
+
return false
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
data/lib/tumblr/user.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class Tumblr
|
2
|
+
class User
|
3
|
+
attr_accessor :email, :password, :tumblr
|
4
|
+
|
5
|
+
# creates a User object and authenticates the user through the Tumblr API to get user data.
|
6
|
+
def initialize(email, password, authenticate = true)
|
7
|
+
self.email = email
|
8
|
+
self.password = password
|
9
|
+
if(authenticate)
|
10
|
+
self.tumblr = Tumblr::Request.authenticate(email,password)['tumblr']
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
<tumblr version='1.0'>
|
2
|
+
<tumblelog name='jeffkreeftmeijer' timezone='US/Eastern' title='Jeff Kreeftmeijer'>
|
3
|
+
<feeds>
|
4
|
+
<feed id='590943' url='http://twitter.com/statuses/user_timeline/8284992.rss' import-type='regular-no-title' next-update-in-seconds='2206' title='Twitter / jkreeftmeijer'/>
|
5
|
+
</feeds>
|
6
|
+
</tumblelog>
|
7
|
+
<posts start='0' total='120'>
|
8
|
+
<post id='142005160' url='http://jeffkreeftmeijer.tumblr.com/post/142005160' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/142005160/the-post-title' type='regular' date-gmt='2009-07-15 08:50:11 GMT' date='Wed, 15 Jul 2009 04:50:11' unix-timestamp='1247647811' format='html'>
|
9
|
+
<regular-title>The post title</regular-title>
|
10
|
+
<regular-body>This is the body of the post.</regular-body>
|
11
|
+
</post>
|
12
|
+
<post id='142003723' url='http://jeffkreeftmeijer.tumblr.com/post/142003723' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/142003723/the-post-title' type='regular' date-gmt='2009-07-15 08:45:47 GMT' date='Wed, 15 Jul 2009 04:45:47' unix-timestamp='1247647547' format='html'>
|
13
|
+
<regular-title>The post title</regular-title>
|
14
|
+
<regular-body>This is the body of the post.</regular-body>
|
15
|
+
</post>
|
16
|
+
<post id='142001746' url='http://jeffkreeftmeijer.tumblr.com/post/142001746' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/142001746/the-post-title' type='regular' date-gmt='2009-07-15 08:39:21 GMT' date='Wed, 15 Jul 2009 04:39:21' unix-timestamp='1247647161' format='html'>
|
17
|
+
<regular-title>The post title</regular-title>
|
18
|
+
<regular-body>This is the body of the post.</regular-body>
|
19
|
+
</post>
|
20
|
+
<post id='141806543' url='http://jeffkreeftmeijer.tumblr.com/post/141806543' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141806543/going-to-bed-way-too-late-again-will-work-on-the' type='regular' date-gmt='2009-07-15 01:49:16 GMT' date='Tue, 14 Jul 2009 21:49:16' unix-timestamp='1247622556' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2642193839' from-feed-id='590943'>
|
21
|
+
<regular-body>going to bed. Way too late again. Will work on the #tumblr #gem some more tomorrow! :)</regular-body>
|
22
|
+
</post>
|
23
|
+
<post id='141753615' url='http://jeffkreeftmeijer.tumblr.com/post/141753615' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753615/listening-to-the-approaching-curve-by-rise' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640603176' from-feed-id='590943'>
|
24
|
+
<regular-body>listening to &#8220;The Approaching Curve by Rise Against - &#8221; ♫ <a href="http://blip.fm/~9xm4q">http://blip.fm/~9xm4q</a></regular-body>
|
25
|
+
</post>
|
26
|
+
<post id='141753620' url='http://jeffkreeftmeijer.tumblr.com/post/141753620' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753620/just-re-wrote-the-whole-fetch-part-of-the-tumblr' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640274520' from-feed-id='590943'>
|
27
|
+
<regular-body>just re-wrote the whole fetch-part of the #tumblr #gem. (has tests now ;) ) Doing some more work on the rest (create, update, destroy) now.</regular-body>
|
28
|
+
</post>
|
29
|
+
<post id='141753608' url='http://jeffkreeftmeijer.tumblr.com/post/141753608' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753608/listening-to-reuben-fall-of-the-bastille' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640636903' from-feed-id='590943'>
|
30
|
+
<regular-body>listening to &#8220;reuben- fall of the bastille - &#8221; ♫ <a href="http://blip.fm/~9xma2">http://blip.fm/~9xma2</a></regular-body>
|
31
|
+
</post>
|
32
|
+
<post id='141753612' url='http://jeffkreeftmeijer.tumblr.com/post/141753612' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753612/listening-to-a-fault-line-a-fault-of-mine' type='regular' date-gmt='2009-07-14 23:55:36 GMT' date='Tue, 14 Jul 2009 19:55:36' unix-timestamp='1247615736' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640627661' from-feed-id='590943'>
|
33
|
+
<regular-body>listening to &#8220;A Fault Line, A Fault Of Mine - UNDEROATH&#8221; ♫ <a href="http://blip.fm/~9xm8m">http://blip.fm/~9xm8m</a></regular-body>
|
34
|
+
</post>
|
35
|
+
<post id='141753603' url='http://jeffkreeftmeijer.tumblr.com/post/141753603' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141753603/simplified-the-error-handling-in-the-tumblr-gem' type='regular' date-gmt='2009-07-14 23:55:35 GMT' date='Tue, 14 Jul 2009 19:55:35' unix-timestamp='1247615735' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2640670460' from-feed-id='590943'>
|
36
|
+
<regular-body>simplified the error handling in the #tumblr #gem. It was just weird&#8230;</regular-body>
|
37
|
+
</post>
|
38
|
+
<post id='141657577' url='http://jeffkreeftmeijer.tumblr.com/post/141657577' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141657577/son-have-you-seen-the-world-what-would-you-say' type='regular' date-gmt='2009-07-14 20:43:37 GMT' date='Tue, 14 Jul 2009 16:43:37' unix-timestamp='1247604217' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2637587336' from-feed-id='590943'>
|
39
|
+
<regular-body>Son, have you seen the world? What would you say if I said that you could? ♫ <a href="http://blip.fm/~9x8cy">http://blip.fm/~9x8cy</a></regular-body>
|
40
|
+
</post>
|
41
|
+
<post id='141657573' url='http://jeffkreeftmeijer.tumblr.com/post/141657573' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141657573/listening-to-re-education-through-labor-rise' type='regular' date-gmt='2009-07-14 20:43:36 GMT' date='Tue, 14 Jul 2009 16:43:36' unix-timestamp='1247604216' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2638490362' from-feed-id='590943'>
|
42
|
+
<regular-body>listening to &#8220;Re-Education (Through Labor) - Rise Against&#8221; ♫ <a href="http://blip.fm/~9xcjv">http://blip.fm/~9xcjv</a></regular-body>
|
43
|
+
</post>
|
44
|
+
<post id='141657574' url='http://jeffkreeftmeijer.tumblr.com/post/141657574' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141657574/listening-to-in-flames-the-chosen-pessimist' type='regular' date-gmt='2009-07-14 20:43:36 GMT' date='Tue, 14 Jul 2009 16:43:36' unix-timestamp='1247604216' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2638019433' from-feed-id='590943'>
|
45
|
+
<regular-body>listening to &#8220;In Flames-The Chosen Pessimist - &#8221; ♫ <a href="http://blip.fm/~9xad5">http://blip.fm/~9xad5</a></regular-body>
|
46
|
+
</post>
|
47
|
+
<post id='141609907' url='http://jeffkreeftmeijer.tumblr.com/post/141609907' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141609907/listening-to-reuben-our-song' type='regular' date-gmt='2009-07-14 19:09:35 GMT' date='Tue, 14 Jul 2009 15:09:35' unix-timestamp='1247598575' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2636190290' from-feed-id='590943'>
|
48
|
+
<regular-body>listening to &#8220;reuben- our song - &#8221; ♫ <a href="http://blip.fm/~9x1aa">http://blip.fm/~9x1aa</a></regular-body>
|
49
|
+
</post>
|
50
|
+
<post id='141609913' url='http://jeffkreeftmeijer.tumblr.com/post/141609913' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141609913/working-on-the-tumblr-ror-gem' type='regular' date-gmt='2009-07-14 19:09:35 GMT' date='Tue, 14 Jul 2009 15:09:35' unix-timestamp='1247598575' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2635407571' from-feed-id='590943'>
|
51
|
+
<regular-body>working on the #tumblr #ror #gem (<a href="http://bit.ly/19G5uu">http://bit.ly/19G5uu</a>) To make possible to use it without rails :)</regular-body>
|
52
|
+
</post>
|
53
|
+
<post id='141609900' url='http://jeffkreeftmeijer.tumblr.com/post/141609900' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141609900/listening-to-this-could-be-anywhere-in-the-world' type='regular' date-gmt='2009-07-14 19:09:34 GMT' date='Tue, 14 Jul 2009 15:09:34' unix-timestamp='1247598574' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2636824003' from-feed-id='590943'>
|
54
|
+
<regular-body>listening to &#8220;This could be anywhere in the world - Alexisonfire&#8221; ♫ <a href="http://blip.fm/~9x4hn">http://blip.fm/~9x4hn</a></regular-body>
|
55
|
+
</post>
|
56
|
+
<post id='141569188' url='http://jeffkreeftmeijer.tumblr.com/post/141569188' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141569188/wallpaper-o' type='photo' date-gmt='2009-07-14 17:48:12 GMT' date='Tue, 14 Jul 2009 13:48:12' unix-timestamp='1247593692' format='html'>
|
57
|
+
<photo-caption>Wallpaper :o</photo-caption>
|
58
|
+
<photo-url max-width='500'>http://16.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_500.jpg</photo-url>
|
59
|
+
<photo-url max-width='400'>http://7.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_400.jpg</photo-url>
|
60
|
+
<photo-url max-width='250'>http://11.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_250.jpg</photo-url>
|
61
|
+
<photo-url max-width='100'>http://18.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_100.jpg</photo-url>
|
62
|
+
<photo-url max-width='75'>http://22.media.tumblr.com/mAbQXA6nQpwgohimAuaIaeYQo1_75sq.jpg</photo-url>
|
63
|
+
</post>
|
64
|
+
<post id='141551858' url='http://jeffkreeftmeijer.tumblr.com/post/141551858' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141551858/nom' type='photo' date-gmt='2009-07-14 17:14:52 GMT' date='Tue, 14 Jul 2009 13:14:52' unix-timestamp='1247591692' format='html'>
|
65
|
+
<photo-caption>Nom!</photo-caption>
|
66
|
+
<photo-url max-width='500'>http://15.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_500.jpg</photo-url>
|
67
|
+
<photo-url max-width='400'>http://6.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_400.jpg</photo-url>
|
68
|
+
<photo-url max-width='250'>http://12.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_250.jpg</photo-url>
|
69
|
+
<photo-url max-width='100'>http://16.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_100.jpg</photo-url>
|
70
|
+
<photo-url max-width='75'>http://22.media.tumblr.com/mAbQXA6nQpwfhmcjLsQYcYSIo1_75sq.jpg</photo-url>
|
71
|
+
</post>
|
72
|
+
<post id='141059423' url='http://jeffkreeftmeijer.tumblr.com/post/141059423' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141059423/watching-episode-16-of-delekkersteshow-making' type='regular' date-gmt='2009-07-13 23:19:38 GMT' date='Mon, 13 Jul 2009 19:19:38' unix-timestamp='1247527178' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2621029518' from-feed-id='508097'>
|
73
|
+
<regular-body>watching episode 16 of @<a href="http://twitter.com/delekkersteshow">delekkersteshow</a> -&gt; making a Tequila Sunrise :)</regular-body>
|
74
|
+
</post>
|
75
|
+
<post id='141059422' url='http://jeffkreeftmeijer.tumblr.com/post/141059422' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141059422/imac-has-begun-running-slow-time-for-its-monthly' type='regular' date-gmt='2009-07-13 23:19:38 GMT' date='Mon, 13 Jul 2009 19:19:38' unix-timestamp='1247527178' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2622179198' from-feed-id='508097'>
|
76
|
+
<regular-body>iMac has begun running slow. Time for it&#8217;s monthly reboot then :)</regular-body>
|
77
|
+
</post>
|
78
|
+
<post id='141004856' url='http://jeffkreeftmeijer.tumblr.com/post/141004856' url-with-slug='http://jeffkreeftmeijer.tumblr.com/post/141004856/wha-http-yfrog-com-5e1frtj' type='regular' date-gmt='2009-07-13 21:25:03 GMT' date='Mon, 13 Jul 2009 17:25:03' unix-timestamp='1247520303' format='html' feed-item='http://twitter.com/jkreeftmeijer/statuses/2619376276' from-feed-id='508097'>
|
79
|
+
<regular-body>Wha? <a href="http://yfrog.com/5e1frtj">http://yfrog.com/5e1frtj</a></regular-body>
|
80
|
+
</post>
|
81
|
+
</posts>
|
82
|
+
</tumblr>
|