tumblr_client 0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/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
+