tumblr_client 0.5

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,26 @@
1
+ Copyright (c) 2012, John Bunting, Tumblr, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+ * Redistributions in binary form must reproduce the above copyright
10
+ notice, this list of conditions and the following disclaimer in the
11
+ documentation and/or other materials provided with the distribution.
12
+ * Neither the name of Tumblr, Inc. nor the names of its contributors may
13
+ be used to endorse or promote products derived from this software without
14
+ specific prior written permission.
15
+ * This license can change at any time.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
21
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,78 @@
1
+ # Tumblr Ruby Gem
2
+
3
+ This is a ruby wrapper for the Tumblr v2 API. There should be support for all endpoints
4
+ currently available on the [Tumblr API](http://www.tumblr.com/docs/en/api/v2).
5
+
6
+ ## Installation
7
+
8
+ It hasn't been submitted to ruby gems yet so you'll have to build your gem first.
9
+
10
+ gem build tumblr.gemspec
11
+
12
+ Then you can just install with:
13
+
14
+ gem install tumblr-0.5.gem
15
+
16
+ ## Usage
17
+
18
+ First and foremost, this gem will *not* do a three legged oauth request for you. It is just a wrapper to help make
19
+ your life easier when using the v2 api. If you need to do the full oauth workflow, then please check out the
20
+ [Ruby OAuth Gem](http://oauth.rubyforge.org/).
21
+
22
+ ### Configuration
23
+
24
+ Configuration for the gem is actually pretty easy:
25
+
26
+ Tumblr.configure do |config|
27
+ config.consumer_key = "consumer_key"
28
+ config.consumer_secret = "consumer_secret"
29
+ config.oauth_token = "access_token"
30
+ config.oauth_token_secret = "access_token_secret"
31
+ end
32
+
33
+ Once you have your configuration squared away it's time to make some requests!
34
+
35
+ >> client = Tumblr.new
36
+
37
+ That's it! You now have a client that can make any request to the Tumblr API.
38
+
39
+ ### Some quick examples
40
+
41
+ Getting use information:
42
+
43
+ >> client.info
44
+
45
+ Getting a specific blog's posts and type:
46
+
47
+ #Grabbing a specific blogs posts
48
+ >> client.posts("codingjester.tumblr.com")
49
+
50
+ #Grabbing only the last 10 photos off the blog
51
+ >> client.posts("codingjester.tumblr.com", "photo", :limit => 10)
52
+
53
+
54
+ Posting some photos to Tumblr:
55
+
56
+ #Uploads a great photoset
57
+ >> client.photo("codingjester.tumblr.com", {:data => ['/path/to/pic.jpg', '/path/to/pic.jpg']})
58
+
59
+ ### The irb Console
60
+
61
+ Finally, there is an irb console packaged with the gem that should help you test any calls you want to make.
62
+ The magic here is that you have a ```.tumblr``` file in your home directory. Inside this file it's just a basic
63
+ YAML layout with four lines:
64
+
65
+ consumer_key: "your_consumer_key"
66
+ consumer_secret: "your_consumer_secret"
67
+ oauth_token: "your_access_token"
68
+ oauth_token_secret: "your_access_token_secret"
69
+
70
+ From there, you should be able to run any of the above commands, with no problem! Just fire off the command ```tumblr``
71
+ from the terminal and you should be dropped into a console.
72
+
73
+
74
+ ### Contributions and Pull Requests
75
+
76
+ No request is too small and I encourage everyone to get involved. As you can see, we're sorely lacking in tests! So
77
+ please if you would like to contribute, let me know and throw me a pull request!
78
+
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core/rake_task'
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :test => :spec
10
+ task :default => :spec
data/bin/tumblr ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ $:.unshift File.join File.dirname(__FILE__), '..', 'lib'
3
+ require 'rubygems'
4
+ require 'tumblr'
5
+ require 'yaml'
6
+ require 'irb'
7
+ require 'irb/completion'
8
+
9
+ configuration = YAML.load_file File.join ENV['HOME'], '.tumblr' rescue {}
10
+
11
+ ENV['IRBRC'] = '.irbrc' if File.exists? '.irbrc'
12
+
13
+ Tumblr.configure do |config|
14
+ config.consumer_key = configuration["consumer_key"]
15
+ config.consumer_secret = configuration["consumer_secret"]
16
+ config.oauth_token = configuration["oauth_token"]
17
+ config.oauth_token_secret = configuration["oauth_token_secret"]
18
+ end
19
+
20
+ puts %q[
21
+ . .o8 oooo
22
+ .o8 "888 `888
23
+ .o888oo oooo oooo ooo. .oo. .oo. 888oooo. 888 oooo d8b
24
+ 888 `888 `888 `888P"Y88bP"Y88b d88' `88b 888 `888""8P
25
+ 888 888 888 888 888 888 888 888 888 888
26
+ 888 . 888 888 888 888 888 888 888 888 888 .o.
27
+ "888" `V88V"V8P' o888o o888o o888o `Y8bod8P' o888o d888b Y8P
28
+
29
+ ]
30
+
31
+ ARGV.clear
32
+ IRB.start
33
+ exit!
data/lib/tumblr.rb ADDED
@@ -0,0 +1,11 @@
1
+ require "tumblr/client"
2
+ require "tumblr/config"
3
+
4
+ module Tumblr
5
+ extend Config
6
+ class << self
7
+ def new(options={})
8
+ Tumblr::Client.new(options)
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,56 @@
1
+ module Tumblr
2
+ class Client
3
+ module Blog
4
+
5
+ #
6
+ #Gets the info about the blog
7
+ #
8
+ def blog_info(blog_name)
9
+ info = get("v2/blog/#{blog_name}/info", {:api_key => Tumblr::consumer_key})
10
+ end
11
+
12
+ #
13
+ #Gets the avatar of specified size
14
+ #Defaults to 64
15
+ #
16
+ def avatar(blog_name, size=64)
17
+ avatar = get("v2/blog/#{blog_name}/avatar", {:size => size})
18
+ end
19
+
20
+ #
21
+ # Gets the list of followers for the blog
22
+ #
23
+ def followers(blog_name, options={})
24
+ if valid_options([:limit, :offset], options)
25
+ get("v2/blog/#{blog_name}/followers", options)
26
+ end
27
+ end
28
+
29
+ def posts(blog_name, type=false, options={})
30
+ url = "v2/blog/#{blog_name}/posts"
31
+
32
+ if type
33
+ url = "#{url}/#{type}"
34
+ end
35
+
36
+ params = {:api_key => Tumblr::consumer_key}
37
+ unless options.empty?
38
+ params.merge!(options)
39
+ end
40
+ get(url, params)
41
+ end
42
+
43
+ def queue(blog_name)
44
+ get("v2/blog/#{blog_name}/posts/queue", {})
45
+ end
46
+
47
+ def draft(blog_name)
48
+ get("v2/blog/#{blog_name}/posts/draft", {})
49
+ end
50
+
51
+ def submissions(blog_name)
52
+ get("v2/blog/#{blog_name}/posts/submission", {})
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,24 @@
1
+ require 'tumblr/blog'
2
+ require 'tumblr/user'
3
+ require 'tumblr/request'
4
+ require 'tumblr/connection'
5
+ require 'tumblr/post'
6
+ require 'tumblr/helpers'
7
+
8
+ module Tumblr
9
+ class Client
10
+ include Tumblr::Request
11
+ include Tumblr::Client::Blog
12
+ include Tumblr::Client::User
13
+ include Tumblr::Client::Post
14
+ include Tumblr::Client::Helper
15
+ include Tumblr::Connection
16
+
17
+ def initialize(attrs= {})
18
+ attrs = Tumblr.options.merge(attrs)
19
+ Config::VALID_OPTIONS_KEYS.each do |key|
20
+ instance_variable_set("@#{key}".to_sym, attrs[key])
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,36 @@
1
+ module Tumblr
2
+
3
+ module Config
4
+
5
+ VALID_OPTIONS_KEYS = [
6
+ :consumer_key,
7
+ :consumer_secret,
8
+ :oauth_token,
9
+ :oauth_token_secret
10
+ ]
11
+
12
+ attr_accessor *VALID_OPTIONS_KEYS
13
+
14
+ def configure
15
+ yield self
16
+ self
17
+ end
18
+
19
+ def options
20
+ options = {}
21
+ VALID_OPTIONS_KEYS.each{ |k| options[k] = send(k) }
22
+ options
23
+ end
24
+
25
+ def credentials
26
+ {
27
+ :consumer_key => consumer_key,
28
+ :consumer_secret => consumer_secret,
29
+ :token => oauth_token,
30
+ :token_secret => oauth_token_secret
31
+ }
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,23 @@
1
+ require 'faraday'
2
+ require 'faraday_stack'
3
+ require 'tumblr/request/oauth'
4
+
5
+ module Tumblr
6
+ module Connection
7
+ def connection(options={})
8
+ default_options = {
9
+ :headers => {
10
+ :accept => "application/json",
11
+ :user_agent => "Tumblr v1.0"
12
+ },
13
+ :url => "http://api.tumblr.com/"
14
+ }
15
+ Faraday.new("http://api.tumblr.com/", default_options.merge(options)) do |builder|
16
+ builder.use FaradayStack::ResponseJSON, content_type: "application/json"
17
+ builder.use Tumblr::Request::TumblrOAuth, Tumblr::credentials if not Tumblr::credentials.empty?
18
+ builder.use Faraday::Request::UrlEncoded
19
+ builder.use Faraday::Adapter::NetHttp
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ module Tumblr
2
+ class Client
3
+ module Helper
4
+ def valid_options(valid_opts, opts)
5
+ bad_opts = opts.select { |val| !valid_opts.include?(val) }
6
+ if !bad_opts.empty?
7
+ raise Exception, "Invalid options passed, Only #{valid_opts} allowed."
8
+ end
9
+ return true
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,73 @@
1
+ module Tumblr
2
+ class Client
3
+ module Post
4
+
5
+ def edit(blog_name, options={})
6
+ post("v2/blog/#{blog_name}/post/edit", options)
7
+ end
8
+
9
+ #Don't be lazy and create a nice interface
10
+ def reblog(blog_name, options={})
11
+ post("v2/blog/#{blog_name}/post/reblog", options)
12
+ end
13
+
14
+ def delete(blog_name, id)
15
+ post("v2/blog/#{blog_name}/post/delete", {:id => id})
16
+ end
17
+
18
+ def photo(blog_name, options={})
19
+ options[:type] = "photo"
20
+ if options.has_key?(:data)
21
+ #Probably can be refactored
22
+ if options[:data].kind_of?(Array)
23
+ count = 0
24
+ options[:data].each do |filepath|
25
+ options["data[#{count}]"] = File.open(filepath, 'rb').read()
26
+ count += 1
27
+ end
28
+ options.delete(:data)
29
+ else
30
+ options[:data] = File.open(options[:data],'rb').read()
31
+ end
32
+ end
33
+ post("v2/blog/#{blog_name}/post", options)
34
+ end
35
+
36
+ def quote(blog_name, options={})
37
+ options[:type] = "quote"
38
+ post("v2/blog/#{blog_name}/post", options)
39
+ end
40
+
41
+ def text(blog_name, options={})
42
+ options[:type] = "text"
43
+ post("v2/blog/#{blog_name}/post", options)
44
+ end
45
+
46
+ def link(blog_name, options={})
47
+ options[:type] = "link"
48
+ post("v2/blog/#{blog_name}/post", options)
49
+ end
50
+
51
+ def chat(blog_name, options={})
52
+ options[:type] = "chat"
53
+ post("v2/blog/#{blog_name}/post", options)
54
+ end
55
+
56
+ def audio(blog_name, options={})
57
+ options[:type] = "audio"
58
+ post("v2/blog/#{blog_name}/post", options)
59
+ end
60
+
61
+ def video(blog_name, options={})
62
+ options[:type] = "video"
63
+ post("v2/blog/#{blog_name}/post", options)
64
+ end
65
+
66
+ def answer(blog_name, options={})
67
+ options[:type] = "answer"
68
+ post("v2/blog/#{blog_name}/post", options)
69
+ end
70
+
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,26 @@
1
+ require 'json'
2
+
3
+ module Tumblr
4
+ module Request
5
+
6
+ #Performs a get request
7
+ def get(path, params={})
8
+ response = connection.get do |req|
9
+ req.url path
10
+ req.params = params
11
+ end
12
+ #check for errors and encapsulate
13
+ JSON.parse(response.body)['response']
14
+ end
15
+
16
+ #Performs post request
17
+ def post(path, params={})
18
+ response = connection.post do |req|
19
+ req.url path
20
+ req.body = params unless params.empty?
21
+ end
22
+ #Check for errors and encapsulate
23
+ JSON.parse(response.body)['response']
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,72 @@
1
+ require 'faraday'
2
+ require 'time'
3
+ require 'uri'
4
+ require 'openssl'
5
+ require 'base64'
6
+
7
+ module Tumblr
8
+ module Request
9
+ class TumblrOAuth < Faraday::Middleware
10
+ def call(env)
11
+ if env[:method].to_s == "get"
12
+ params = env[:url].query_values || {}
13
+ url = "#{env[:url].scheme}://#{env[:url].host}#{env[:url].path}"
14
+ else
15
+ params = env[:body] || {}
16
+ url = env[:url]
17
+ end
18
+ signature_params = params
19
+ params.each do |key, value|
20
+ signature_params = {} if value.respond_to?(:content_type)
21
+ end
22
+ env[:request_headers]["Authorization"] = self.oauth_gen(env[:method], url, signature_params)
23
+ env[:request_headers]["Content-type"] = "application/x-www-form-urlencoded"
24
+ env[:request_headers]["Host"] = "api.tumblr.com"
25
+
26
+
27
+ @app.call(env)
28
+ end
29
+
30
+ def initialize(app, options={})
31
+ @app, @options = app, options
32
+ end
33
+
34
+ def oauth_gen(method, url, params)
35
+ params[:oauth_consumer_key] = @options[:consumer_key]
36
+ params[:oauth_nonce] = Time.now.to_i
37
+ params[:oauth_signature_method] = 'HMAC-SHA1'
38
+ params[:oauth_timestamp] = Time.now.to_i
39
+ params[:oauth_token] = @options[:token]
40
+ params[:oauth_version] = "1.0"
41
+ params[:oauth_signature] = self.oauth_sig(method, url, params)
42
+
43
+ header = []
44
+ params.each do |key, value|
45
+ if key.to_s.include?("oauth")
46
+ header << "#{key.to_s}=#{value}"
47
+ end
48
+ end
49
+
50
+ "OAuth #{header.join(", ")}"
51
+
52
+ end
53
+
54
+ def oauth_sig(method, url, params)
55
+ parts = [method.upcase, URI.encode(url.to_s, /[^a-z0-9\-\.\_\~]/i)]
56
+
57
+ #sort the parameters
58
+ params = Hash[params.sort_by{ |key, value| key.to_s}]
59
+
60
+ encoded = []
61
+ params.each do |key, value|
62
+ encoded << "#{key.to_s}=#{URI.encode(value.to_s, /[^a-z0-9\-\.\_\~]/i)}"
63
+ end
64
+
65
+ parts << URI.encode(encoded.join("&"), /[^a-z0-9\-\.\_\~]/i)
66
+ signature_base = parts.join("&")
67
+ secret = "#{@options[:consumer_secret]}&#{@options[:token_secret]}"
68
+ Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::SHA1.new, secret, signature_base)).chomp.gsub(/\n/, '')
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,40 @@
1
+ module Tumblr
2
+ class Client
3
+ module User
4
+ def info
5
+ info = post("v2/user/info")
6
+ end
7
+
8
+ def dashboard(options={})
9
+ valid_opts = [:limit, :offset, :type, :since_id, :reblog_info, :notes_info]
10
+ if valid_options(valid_opts, options)
11
+ get("v2/user/dashboard", options)
12
+ end
13
+ end
14
+
15
+ def likes(offset=0, limit=20)
16
+ likes = get("v2/user/likes", {:limit => limit, :offset => offset})
17
+ end
18
+
19
+ def following(offset=0, limit=20)
20
+ following = get("v2/user/following", {:limit => limit, :offset => offset})
21
+ end
22
+
23
+ def follow(url)
24
+ follow = post("v2/user/follow", {:url => url})
25
+ end
26
+
27
+ def unfollow(url)
28
+ follow = post("v2/user/unfollow", {:url => url})
29
+ end
30
+
31
+ def like(id, reblog_key)
32
+ like = post("v2/user/like", {:id => id, :reblog_key => reblog_key})
33
+ end
34
+
35
+ def unlike(id, reblog_key)
36
+ unlike = post("v2/user/unlike", {:id => id, :reblog_key => reblog_key})
37
+ end
38
+ end
39
+ end
40
+ end
data/tumblr.gemspec ADDED
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.add_dependency 'faraday', '~> 0.7'
5
+ gem.add_dependency 'faraday-stack'
6
+ gem.add_dependency 'json'
7
+ gem.add_development_dependency 'rake'
8
+ gem.add_development_dependency 'rspec'
9
+ gem.add_development_dependency 'webmock'
10
+ gem.authors = ["John Bunting"]
11
+ gem.description = %q{A Ruby wrapper for the Tumblr v2 API}
12
+ gem.email = ['codingjester@gmail.com']
13
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
14
+ gem.files = `git ls-files`.split("\n")
15
+ gem.homepage = "http://github.com/codingjester/tumblr"
16
+ gem.name = "tumblr_client"
17
+ gem.require_paths = ["lib"]
18
+ gem.required_rubygems_version = Gem::Requirement.new('>= 1.3.6')
19
+ gem.summary = %q{Tumblr API wrapper}
20
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
21
+ gem.version = "0.5"
22
+ end
metadata ADDED
@@ -0,0 +1,151 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tumblr_client
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 5
8
+ version: "0.5"
9
+ platform: ruby
10
+ authors:
11
+ - John Bunting
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2012-03-31 00:00:00 -04:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: faraday
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ segments:
27
+ - 0
28
+ - 7
29
+ version: "0.7"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: faraday-stack
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ version: "0"
42
+ type: :runtime
43
+ version_requirements: *id002
44
+ - !ruby/object:Gem::Dependency
45
+ name: json
46
+ prerelease: false
47
+ requirement: &id003 !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ segments:
52
+ - 0
53
+ version: "0"
54
+ type: :runtime
55
+ version_requirements: *id003
56
+ - !ruby/object:Gem::Dependency
57
+ name: rake
58
+ prerelease: false
59
+ requirement: &id004 !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ type: :development
67
+ version_requirements: *id004
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ prerelease: false
71
+ requirement: &id005 !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ segments:
76
+ - 0
77
+ version: "0"
78
+ type: :development
79
+ version_requirements: *id005
80
+ - !ruby/object:Gem::Dependency
81
+ name: webmock
82
+ prerelease: false
83
+ requirement: &id006 !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ segments:
88
+ - 0
89
+ version: "0"
90
+ type: :development
91
+ version_requirements: *id006
92
+ description: A Ruby wrapper for the Tumblr v2 API
93
+ email:
94
+ - codingjester@gmail.com
95
+ executables:
96
+ - tumblr
97
+ extensions: []
98
+
99
+ extra_rdoc_files: []
100
+
101
+ files:
102
+ - Gemfile
103
+ - LICENSE.md
104
+ - README.md
105
+ - Rakefile
106
+ - bin/tumblr
107
+ - lib/tumblr.rb
108
+ - lib/tumblr/blog.rb
109
+ - lib/tumblr/client.rb
110
+ - lib/tumblr/config.rb
111
+ - lib/tumblr/connection.rb
112
+ - lib/tumblr/helpers.rb
113
+ - lib/tumblr/post.rb
114
+ - lib/tumblr/request.rb
115
+ - lib/tumblr/request/oauth.rb
116
+ - lib/tumblr/user.rb
117
+ - tumblr.gemspec
118
+ has_rdoc: true
119
+ homepage: http://github.com/codingjester/tumblr
120
+ licenses: []
121
+
122
+ post_install_message:
123
+ rdoc_options: []
124
+
125
+ require_paths:
126
+ - lib
127
+ required_ruby_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ segments:
132
+ - 0
133
+ version: "0"
134
+ required_rubygems_version: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ segments:
139
+ - 1
140
+ - 3
141
+ - 6
142
+ version: 1.3.6
143
+ requirements: []
144
+
145
+ rubyforge_project:
146
+ rubygems_version: 1.3.6
147
+ signing_key:
148
+ specification_version: 3
149
+ summary: Tumblr API wrapper
150
+ test_files: []
151
+