twitpic-full 1.0.0
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/lib/twitpic.rb +16 -0
- data/lib/twitpic/api.rb +115 -0
- data/lib/twitpic/api/comments.rb +27 -0
- data/lib/twitpic/api/events.rb +52 -0
- data/lib/twitpic/api/faces.rb +33 -0
- data/lib/twitpic/api/media.rb +17 -0
- data/lib/twitpic/api/places.rb +28 -0
- data/lib/twitpic/api/tags.rb +27 -0
- data/lib/twitpic/api/upload.rb +19 -0
- data/lib/twitpic/api/users.rb +15 -0
- data/lib/twitpic/client.rb +28 -0
- data/lib/twitpic/config.rb +14 -0
- metadata +97 -0
data/lib/twitpic.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
module TwitPic; end
|
2
|
+
|
3
|
+
# Helper for Rails < 1.9.x
|
4
|
+
def require_local(path)
|
5
|
+
require(File.expand_path(File.join(File.dirname(__FILE__), path)))
|
6
|
+
end
|
7
|
+
|
8
|
+
# Load the required libraries
|
9
|
+
require 'nestful'
|
10
|
+
require 'json'
|
11
|
+
require 'roauth'
|
12
|
+
|
13
|
+
# Load the TwitPic API library
|
14
|
+
require_local 'twitpic/config'
|
15
|
+
require_local 'twitpic/api'
|
16
|
+
require_local 'twitpic/client'
|
data/lib/twitpic/api.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
Dir.glob(File.dirname(__FILE__) + '/api/*') {|file| require file}
|
2
|
+
|
3
|
+
module TwitPic
|
4
|
+
module API
|
5
|
+
API_BASE = 'http://api.twitpic.com/2/'
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
public
|
10
|
+
|
11
|
+
def query(client, call, args)
|
12
|
+
self.validate(call, args)
|
13
|
+
|
14
|
+
if call[:method] == :get then
|
15
|
+
self.get(call[:endpoint], args)
|
16
|
+
else
|
17
|
+
self.post(client, call[:endpoint], args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Uploads an image to the TwitPic API
|
22
|
+
#
|
23
|
+
# File can be either the path to the image or
|
24
|
+
# a File object
|
25
|
+
def upload(client, file, args)
|
26
|
+
file = File.open(file) if file.instance_of? String
|
27
|
+
|
28
|
+
args[:media] = file
|
29
|
+
|
30
|
+
self.post(client, 'upload', args)
|
31
|
+
end
|
32
|
+
|
33
|
+
def tweet(client, media)
|
34
|
+
raise ArgumentError, "Invalid argument, must be an object returned from a photo upload" unless media.has_key? 'text'
|
35
|
+
|
36
|
+
tweet = "#{media['text'][0..114]} #{media['url']}"
|
37
|
+
url = 'http://api.twitter.com/1/statuses/update.json';
|
38
|
+
headers = TwitPic::API.build_header(client, tweet)
|
39
|
+
|
40
|
+
opts = {
|
41
|
+
:headers => headers,
|
42
|
+
:params => {
|
43
|
+
'status' => tweet
|
44
|
+
}
|
45
|
+
}
|
46
|
+
|
47
|
+
data = Nestful.post(url, opts)
|
48
|
+
|
49
|
+
return media, JSON.parse(data)
|
50
|
+
end
|
51
|
+
|
52
|
+
protected
|
53
|
+
|
54
|
+
def get(endpoint, args = {})
|
55
|
+
url = API_BASE + endpoint + ".json"
|
56
|
+
data = Nestful.get(url, :params => args)
|
57
|
+
JSON.parse(data)
|
58
|
+
end
|
59
|
+
|
60
|
+
def post(client, endpoint, args = {})
|
61
|
+
url = API_BASE + endpoint + ".json"
|
62
|
+
|
63
|
+
# Add API key to arguments
|
64
|
+
args['key'] = client.config.api_key
|
65
|
+
|
66
|
+
headers = TwitPic::API.build_header(client)
|
67
|
+
opts = {
|
68
|
+
:headers => headers,
|
69
|
+
:params => args
|
70
|
+
}
|
71
|
+
|
72
|
+
if endpoint == 'upload' then
|
73
|
+
opts[:format] = :multipart
|
74
|
+
end
|
75
|
+
|
76
|
+
data = Nestful.post(url, opts)
|
77
|
+
JSON.parse(data)
|
78
|
+
end
|
79
|
+
|
80
|
+
def build_header(client, tweet=nil)
|
81
|
+
raise RuntimeError, "Missing application or OAuth credentials" unless client.write_enabled
|
82
|
+
|
83
|
+
info = {
|
84
|
+
:access_key => client.config.oauth_token,
|
85
|
+
:access_secret => client.config.oauth_secret,
|
86
|
+
:consumer_key => client.config.consumer_key,
|
87
|
+
:consumer_secret => client.config.consumer_secret,
|
88
|
+
:signature_method => "HMAC-SHA1"
|
89
|
+
}
|
90
|
+
|
91
|
+
if tweet then
|
92
|
+
oauth_url = "http://api.twitter.com/1/statuses/update.json"
|
93
|
+
result = ::ROAuth.header(info, oauth_url, {'status' => tweet}, :post)
|
94
|
+
|
95
|
+
headers = {
|
96
|
+
'Authorization' => result
|
97
|
+
}
|
98
|
+
else
|
99
|
+
oauth_url = "https://api.twitter.com/1/account/verify_credentials.json"
|
100
|
+
result = ::ROAuth.header(info, oauth_url, {}, :get)
|
101
|
+
|
102
|
+
headers = {
|
103
|
+
'X-Verify-Credentials-Authorization' => result
|
104
|
+
}
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def validate(info, args)
|
109
|
+
info[:required].each do |item|
|
110
|
+
raise ArgumentError, "Missing required argument " + item + " for " + info[:endpoint] unless args.keys.member?(item)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
@@COMMENTS_API = {
|
3
|
+
:show => {
|
4
|
+
:endpoint => 'comments/show',
|
5
|
+
:method => :get,
|
6
|
+
:required => [:media_id, :page]
|
7
|
+
},
|
8
|
+
|
9
|
+
:create => {
|
10
|
+
:endpoint => 'comments/create',
|
11
|
+
:method => :post,
|
12
|
+
:required => [:media_id, :message]
|
13
|
+
},
|
14
|
+
|
15
|
+
:delete => {
|
16
|
+
:endpoint => 'comments/delete',
|
17
|
+
:method => :post,
|
18
|
+
:required => [:comment_id]
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
def comments(action, args)
|
23
|
+
raise ArgumentError, "Invalid API action given" unless @@COMMENTS_API.keys.member?(action)
|
24
|
+
TwitPic::API.query(self, @@COMMENTS_API[action], args)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
@@EVENTS_API = {
|
3
|
+
:show => {
|
4
|
+
:endpoint => 'events/show',
|
5
|
+
:method => :get,
|
6
|
+
:required => [:user]
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
@@EVENT_API = {
|
11
|
+
:show => {
|
12
|
+
:endpoint => 'event/show',
|
13
|
+
:method => :get,
|
14
|
+
:required => [:id]
|
15
|
+
},
|
16
|
+
|
17
|
+
:create => {
|
18
|
+
:endpoint => 'event/create',
|
19
|
+
:method => :post,
|
20
|
+
:required => [:name]
|
21
|
+
},
|
22
|
+
|
23
|
+
:delete => {
|
24
|
+
:endpoint => 'event/delete',
|
25
|
+
:method => :post,
|
26
|
+
:required => [:event_id]
|
27
|
+
},
|
28
|
+
|
29
|
+
:add => {
|
30
|
+
:endpoint => 'event/add',
|
31
|
+
:method => :post,
|
32
|
+
:required => [:media_id, :event_id]
|
33
|
+
},
|
34
|
+
|
35
|
+
:remove => {
|
36
|
+
:endpoint => 'event/add',
|
37
|
+
:mehtod => :post,
|
38
|
+
:required => [:event_id, :media_id]
|
39
|
+
}
|
40
|
+
}
|
41
|
+
|
42
|
+
def events(action, args)
|
43
|
+
raise ArgumentError, "Invalid API action given" unless @@EVENTS_API.keys.member?(action)
|
44
|
+
TwitPic::API.query(self, @@EVENTS_API[action], args)
|
45
|
+
end
|
46
|
+
|
47
|
+
def event(action, args)
|
48
|
+
raise ArgumentError, "Invalid API action given" unless @@EVENT_API.keys.member?(action)
|
49
|
+
TwitPic::API.query(self, @@EVENT_API[action], args)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
@@FACES_API = {
|
3
|
+
:show => {
|
4
|
+
:endpoint => 'faces/show',
|
5
|
+
:method => :post,
|
6
|
+
:required => [:user]
|
7
|
+
},
|
8
|
+
|
9
|
+
:create => {
|
10
|
+
:endpoint => 'faces/create',
|
11
|
+
:method => :post,
|
12
|
+
:required => [:media_id, :top_coord, :left_coord]
|
13
|
+
},
|
14
|
+
|
15
|
+
:edit => {
|
16
|
+
:endpoint => 'faces/edit',
|
17
|
+
:method => :post,
|
18
|
+
:required => [:tag_id]
|
19
|
+
},
|
20
|
+
|
21
|
+
:delete => {
|
22
|
+
:endpoint => 'faces/delete',
|
23
|
+
:method => :post,
|
24
|
+
:required => [:tag_id]
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
def faces(action, args)
|
29
|
+
raise ArgumentError, "Invalid API action given" unless @@FACES_API.keys.member?(action)
|
30
|
+
TwitPic::API.query(self, @@FACES_API[action], args)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
### Added by Clipflakes
|
2
|
+
|
3
|
+
class TwitPic::Client
|
4
|
+
@@MEDIA_API = {
|
5
|
+
:show => {
|
6
|
+
:endpoint => 'media/show',
|
7
|
+
:method => :get,
|
8
|
+
:required => [:id]
|
9
|
+
}
|
10
|
+
}
|
11
|
+
|
12
|
+
def media(action, args)
|
13
|
+
raise ArgumentError, "Invalid API action given" unless @@MEDIA_API.keys.member?(action)
|
14
|
+
TwitPic::API.query(self, @@MEDIA_API[action], args)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
@@PLACE_API = {
|
3
|
+
:show => {
|
4
|
+
:endpoint => 'place/show',
|
5
|
+
:method => :get,
|
6
|
+
:required => [:id]
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
@@PLACES_API = {
|
11
|
+
:show => {
|
12
|
+
:endpoint => 'places/show',
|
13
|
+
:method => :get,
|
14
|
+
:required => [:user]
|
15
|
+
}
|
16
|
+
}
|
17
|
+
|
18
|
+
def place(action, args)
|
19
|
+
raise ArgumentError, "Invalid API action given" unless @@PLACE_API.keys.member?(action)
|
20
|
+
TwitPic::API.query(self, @@PLACE_API[action], args)
|
21
|
+
end
|
22
|
+
|
23
|
+
def places(action, args)
|
24
|
+
raise ArgumentError, "Invalid API action given" unless @@PLACES_API.keys.member?(action)
|
25
|
+
TwitPic::API.query(self, @@PLACES_API[action], args)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
@@TAGS_API = {
|
3
|
+
:show => {
|
4
|
+
:endpoint => 'tags/show',
|
5
|
+
:method => :get,
|
6
|
+
:required => [:tag]
|
7
|
+
},
|
8
|
+
|
9
|
+
:create => {
|
10
|
+
:endpoint => 'tags/create',
|
11
|
+
:method => :post,
|
12
|
+
:required => [:media_id, :tags]
|
13
|
+
},
|
14
|
+
|
15
|
+
:delete => {
|
16
|
+
:endpoint => 'tags/delete',
|
17
|
+
:method => :post,
|
18
|
+
:required => [:media_id, :tag_id]
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
def tags(action, args)
|
23
|
+
raise ArgumentError, "Invalid API action given" unless @@TAGS_API.keys.member?(action)
|
24
|
+
TwitPic::API.query(self, @@TAGS_API[action], args)
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
|
3
|
+
# Uploads a photo to TwitPic
|
4
|
+
def upload(file, message)
|
5
|
+
message = "" unless message.strip.length > 0
|
6
|
+
|
7
|
+
TwitPic::API.upload(self, file, {:message => message})
|
8
|
+
end
|
9
|
+
|
10
|
+
def upload_and_post(file, message)
|
11
|
+
message = "" unless message.strip.length > 0
|
12
|
+
|
13
|
+
media = TwitPic::API.upload(self, file, {:message => message})
|
14
|
+
if media then
|
15
|
+
TwitPic::API.tweet(self, media)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class TwitPic::Client
|
2
|
+
@@USERS_API = {
|
3
|
+
:show => {
|
4
|
+
:endpoint => 'users/show',
|
5
|
+
:method => :get,
|
6
|
+
:required => [:username]
|
7
|
+
}
|
8
|
+
}
|
9
|
+
|
10
|
+
def users(action, args)
|
11
|
+
raise ArgumentError, "Invalid API action given" unless @@USERS_API.keys.member?(action)
|
12
|
+
TwitPic::API.query(self, @@USERS_API[action], args)
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module TwitPic
|
2
|
+
# The base interaction class. All of the API methods are called via
|
3
|
+
# the client class once a Client object is created.
|
4
|
+
class Client
|
5
|
+
|
6
|
+
attr_reader :config, :write_enabled
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@config = TwitPic::Config.new
|
10
|
+
end
|
11
|
+
|
12
|
+
# Lets you change configuration options
|
13
|
+
def configure(&block)
|
14
|
+
raise ArgumentError, "Block required in order to configure" unless block_given?
|
15
|
+
|
16
|
+
yield @config
|
17
|
+
end
|
18
|
+
|
19
|
+
# Determines whether all of the required information has been entered into the config
|
20
|
+
# so we know if we can make a write-enabled call or not. Is this too ghetto/unsafe?
|
21
|
+
def write_enabled
|
22
|
+
enabled = true
|
23
|
+
TwitPic::Config.instance_methods.grep(/\w=$/).each do |method|
|
24
|
+
enabled = false unless @config.send(method.to_s.chop).strip.length > 0
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module TwitPic
|
2
|
+
class Config
|
3
|
+
attr_accessor :api_key, :consumer_key, :consumer_secret, :oauth_token, :oauth_secret
|
4
|
+
|
5
|
+
# Setup the default configuration data
|
6
|
+
def initialize
|
7
|
+
@api_key = ''
|
8
|
+
@consumer_key = ''
|
9
|
+
@consumer_secret = ''
|
10
|
+
@oauth_token = ''
|
11
|
+
@oauth_secret = ''
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: twitpic-full
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 1.0.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ryan LeFevre
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-05-23 00:00:00 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: nestful
|
17
|
+
prerelease: false
|
18
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
type: :runtime
|
25
|
+
version_requirements: *id001
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: json
|
28
|
+
prerelease: false
|
29
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
|
+
none: false
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id002
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: roauth
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
type: :runtime
|
47
|
+
version_requirements: *id003
|
48
|
+
description: Provides full and simple to use access to the TwitPic API, including photo uploads
|
49
|
+
email: meltingice8917@gmail.com
|
50
|
+
executables: []
|
51
|
+
|
52
|
+
extensions: []
|
53
|
+
|
54
|
+
extra_rdoc_files: []
|
55
|
+
|
56
|
+
files:
|
57
|
+
- lib/twitpic/api/comments.rb
|
58
|
+
- lib/twitpic/api/events.rb
|
59
|
+
- lib/twitpic/api/faces.rb
|
60
|
+
- lib/twitpic/api/media.rb
|
61
|
+
- lib/twitpic/api/places.rb
|
62
|
+
- lib/twitpic/api/tags.rb
|
63
|
+
- lib/twitpic/api/upload.rb
|
64
|
+
- lib/twitpic/api/users.rb
|
65
|
+
- lib/twitpic/api.rb
|
66
|
+
- lib/twitpic/client.rb
|
67
|
+
- lib/twitpic/config.rb
|
68
|
+
- lib/twitpic.rb
|
69
|
+
homepage: https://github.com/meltingice/TwitPic-API-for-Ruby
|
70
|
+
licenses: []
|
71
|
+
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options: []
|
74
|
+
|
75
|
+
require_paths:
|
76
|
+
- lib
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: "0"
|
83
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
requirements: []
|
90
|
+
|
91
|
+
rubyforge_project:
|
92
|
+
rubygems_version: 1.8.3
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Provides full access to the TwitPic API, including photo uploads
|
96
|
+
test_files: []
|
97
|
+
|