preposterous 0.0.2
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/.gitignore +1 -0
- data/LICENSE +21 -0
- data/README.rdoc +23 -0
- data/Rakefile +18 -0
- data/VERSION.yml +5 -0
- data/examples/.gitignore +5 -0
- data/examples/post.rb +54 -0
- data/lib/preposterous/base.rb +82 -0
- data/lib/preposterous/httpauth.rb +32 -0
- data/lib/preposterous/request.rb +54 -0
- data/lib/preposterous.rb +20 -0
- data/preposterous.gemspec +52 -0
- metadata +74 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
pkg/*
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Copyright (c) 2010 Ray Hernandez
|
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.
|
21
|
+
|
data/README.rdoc
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
= preposterous
|
2
|
+
|
3
|
+
I'm hoping that I will stick to this and it will become a very functional Ruby based API for the Posterous(http://posterous.com) service.
|
4
|
+
|
5
|
+
= what works?
|
6
|
+
|
7
|
+
Right now it can get a list of posterous sites and post to posterous sites.
|
8
|
+
Media uploads are working for posting.
|
9
|
+
|
10
|
+
== examples
|
11
|
+
|
12
|
+
See the post.rb example in the examples directory.
|
13
|
+
|
14
|
+
http://github.com/hernan43/preposterous/tree/master/examples/post.rb
|
15
|
+
|
16
|
+
== copyright?
|
17
|
+
|
18
|
+
Since I've never really done anything like this, I am going to use John Nunemaker's(http://github.com/jnunemaker) Twitter gem(http://github.com/jnunemaker/twitter) design as an influence.
|
19
|
+
|
20
|
+
Also when I say "influence" I mean this is basically a really jacked up fork of the jnunemaker twitter gem.
|
21
|
+
|
22
|
+
Copyright (c) 2010 Ray Hernandez. See LICENSE for details.
|
23
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "preposterous"
|
8
|
+
gem.summary = %Q{a wrapper library for the Posterous API}
|
9
|
+
gem.description = %Q{This gem supports posting and listing sites on Posterous}
|
10
|
+
gem.email = "hernan43@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/hernan43/preposterous"
|
12
|
+
gem.authors = ["Ray Hernandez"]
|
13
|
+
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
+
end
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
|
+
end
|
data/VERSION.yml
ADDED
data/examples/.gitignore
ADDED
data/examples/post.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'preposterous')
|
3
|
+
|
4
|
+
#
|
5
|
+
# creating a posterous object
|
6
|
+
#
|
7
|
+
|
8
|
+
# all requests need to be authenticated
|
9
|
+
# this creates your client object and sets up
|
10
|
+
# your posterous object for actions
|
11
|
+
client = Preposterous::HTTPAuth.new("my@email.addre.ss", "password")
|
12
|
+
posterous = Preposterous::Base.new(client)
|
13
|
+
|
14
|
+
#
|
15
|
+
# get and print a list of your posterous sites
|
16
|
+
#
|
17
|
+
posterous.getsites.each do |site|
|
18
|
+
puts "#{site['id']} #{site['url']}"
|
19
|
+
end
|
20
|
+
|
21
|
+
#
|
22
|
+
# standard post w/no files
|
23
|
+
#
|
24
|
+
|
25
|
+
# initialize the fields
|
26
|
+
# field names are here: http://posterous.com/api/posting
|
27
|
+
fields = {
|
28
|
+
:site_id => 99999999,
|
29
|
+
:title => "This is my post",
|
30
|
+
:body => "This is some boring text for my autogenerated post."
|
31
|
+
}
|
32
|
+
|
33
|
+
# perform the actual post
|
34
|
+
posterous.newpost(fields, *files)
|
35
|
+
|
36
|
+
#
|
37
|
+
# standard post w/files
|
38
|
+
#
|
39
|
+
|
40
|
+
# initialize array of files
|
41
|
+
files = [
|
42
|
+
File.open("file_one.png"),
|
43
|
+
File.open("file_two.png")
|
44
|
+
]
|
45
|
+
|
46
|
+
# initialize fields
|
47
|
+
fields = {
|
48
|
+
:site_id => 1313830,
|
49
|
+
:title => "Check out these sweet pics",
|
50
|
+
:body => "I love these pics."
|
51
|
+
}
|
52
|
+
|
53
|
+
# perform the actual post
|
54
|
+
posterous.newpost(fields, *files)
|
@@ -0,0 +1,82 @@
|
|
1
|
+
module Preposterous
|
2
|
+
class Base
|
3
|
+
extend Forwardable
|
4
|
+
def_delegators :client, :get, :post
|
5
|
+
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
def initialize(client)
|
9
|
+
@client = client
|
10
|
+
end
|
11
|
+
|
12
|
+
def getsites
|
13
|
+
response = perform_get("/api/getsites")
|
14
|
+
# parse out sites? not sure how I want the API to look
|
15
|
+
# for this. I have a couple of competing ideas...
|
16
|
+
response["site"] if not response.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def newpost(fields={}, *files)
|
20
|
+
# create options hash
|
21
|
+
options = {:fields => fields}
|
22
|
+
options = build_multipart_bodies(*files).merge(options) if files
|
23
|
+
|
24
|
+
response = perform_post("/api/newpost", options)
|
25
|
+
# return post attrs
|
26
|
+
response["post"] if not response.nil?
|
27
|
+
end
|
28
|
+
|
29
|
+
# TODO: write readposts method
|
30
|
+
def readposts
|
31
|
+
end
|
32
|
+
|
33
|
+
# TODO: write update method
|
34
|
+
def updatepost
|
35
|
+
end
|
36
|
+
|
37
|
+
# TODO: write comment method
|
38
|
+
def newcomment
|
39
|
+
end
|
40
|
+
|
41
|
+
# TODO: write gettags method
|
42
|
+
def gettags
|
43
|
+
end
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
CRLF = "\r\n"
|
48
|
+
def build_multipart_bodies(*files)
|
49
|
+
boundary = Time.now.to_i.to_s(16)
|
50
|
+
body = ""
|
51
|
+
files.each do |file|
|
52
|
+
esc_key = "media[]"
|
53
|
+
body << "--#{boundary}#{CRLF}"
|
54
|
+
if file.respond_to?(:read)
|
55
|
+
body << "Content-Disposition: form-data; name=\"#{esc_key}\"; filename=\"#{File.basename(file.path)}\"#{CRLF}"
|
56
|
+
body << "Content-Type: #{MIME::Types.type_for(file.path)[0].to_s}#{CRLF*2}"
|
57
|
+
body << file.read
|
58
|
+
else
|
59
|
+
body << "Content-Disposition: form-data; name=\"#{esc_key}\"#{CRLF*2}#{file}"
|
60
|
+
end
|
61
|
+
body << CRLF
|
62
|
+
end
|
63
|
+
body << "--#{boundary}--#{CRLF*2}"
|
64
|
+
{
|
65
|
+
:body => body,
|
66
|
+
:headers => {"Content-Type" => "multipart/form-data; boundary=#{boundary}"}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def perform_get(path, options={})
|
74
|
+
Preposterous::Request.get(self, path, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
def perform_post(path, options={})
|
78
|
+
Preposterous::Request.post(self, path, options)
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Preposterous
|
2
|
+
class HTTPAuth
|
3
|
+
include HTTParty
|
4
|
+
format :xml
|
5
|
+
|
6
|
+
attr_reader :username, :password, :options
|
7
|
+
|
8
|
+
def initialize(username, password, options={})
|
9
|
+
@username, @password = username, password
|
10
|
+
@options = {:ssl => false}.merge(options)
|
11
|
+
# posterous' API URL is http://posterous.com/api
|
12
|
+
options[:api_endpoint] ||= "posterous.com"
|
13
|
+
self.class.base_uri "http#{'s' if options[:ssl]}://#{options[:api_endpoint]}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def get(uri, headers={})
|
17
|
+
self.class.get(uri, :headers => headers, :basic_auth => basic_auth)
|
18
|
+
end
|
19
|
+
|
20
|
+
def post(uri, body={}, headers={})
|
21
|
+
self.class.post(uri, :body => body, :headers => headers, :basic_auth => basic_auth)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def basic_auth
|
27
|
+
{:username => @username, :password => @password}
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Preposterous
|
2
|
+
class Request
|
3
|
+
extend Forwardable
|
4
|
+
def_delegators :client, :get, :post
|
5
|
+
|
6
|
+
attr_reader :client, :method, :path, :options
|
7
|
+
|
8
|
+
def self.get(client, path, options={})
|
9
|
+
new(client, :get, path, options).perform
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.post(client, path, options={})
|
13
|
+
new(client, :post, path, options).perform
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(client, method, path, options={})
|
17
|
+
@client, @method, @path, @options = client, method, path, options
|
18
|
+
end
|
19
|
+
|
20
|
+
def uri
|
21
|
+
@uri ||= begin
|
22
|
+
uri = URI.parse(path)
|
23
|
+
if options[:fields] && options[:fields] != {}
|
24
|
+
uri.query = to_query(options[:fields])
|
25
|
+
end
|
26
|
+
|
27
|
+
uri.to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def perform
|
32
|
+
Preposterous.make_friendly(send("perform_#{method}"))
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def perform_get
|
38
|
+
get(uri, options[:headers])
|
39
|
+
end
|
40
|
+
|
41
|
+
def perform_post
|
42
|
+
post(uri, options[:body], options[:headers])
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_query(options)
|
46
|
+
options.inject([]) do |collection, opt|
|
47
|
+
collection << "#{CGI.escape opt[0].to_s}=#{CGI.escape opt[1].to_s}"
|
48
|
+
collection
|
49
|
+
end * '&'
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
data/lib/preposterous.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'forwardable'
|
3
|
+
require 'cgi'
|
4
|
+
require 'mime/types'
|
5
|
+
|
6
|
+
module Preposterous
|
7
|
+
|
8
|
+
# TODO: Add exceptions based on errors listed at: http://posterous.com/api/posting
|
9
|
+
|
10
|
+
def self.make_friendly(response)
|
11
|
+
Crack::XML.parse(response.body)["rsp"] if not response.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
# bring in all of the files in the lib dir
|
17
|
+
directory = File.expand_path(File.dirname(__FILE__))
|
18
|
+
require File.join(directory, "preposterous", "base")
|
19
|
+
require File.join(directory, "preposterous", "httpauth")
|
20
|
+
require File.join(directory, "preposterous", "request")
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{preposterous}
|
8
|
+
s.version = "0.0.2"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Ray Hernandez"]
|
12
|
+
s.date = %q{2010-05-07}
|
13
|
+
s.description = %q{This gem supports posting and listing sites on Posterous}
|
14
|
+
s.email = %q{hernan43@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".gitignore",
|
21
|
+
"LICENSE",
|
22
|
+
"README.rdoc",
|
23
|
+
"Rakefile",
|
24
|
+
"VERSION.yml",
|
25
|
+
"examples/.gitignore",
|
26
|
+
"examples/post.rb",
|
27
|
+
"lib/preposterous.rb",
|
28
|
+
"lib/preposterous/base.rb",
|
29
|
+
"lib/preposterous/httpauth.rb",
|
30
|
+
"lib/preposterous/request.rb",
|
31
|
+
"preposterous.gemspec"
|
32
|
+
]
|
33
|
+
s.homepage = %q{http://github.com/hernan43/preposterous}
|
34
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
35
|
+
s.require_paths = ["lib"]
|
36
|
+
s.rubygems_version = %q{1.3.6}
|
37
|
+
s.summary = %q{a wrapper library for the Posterous API}
|
38
|
+
s.test_files = [
|
39
|
+
"examples/post.rb"
|
40
|
+
]
|
41
|
+
|
42
|
+
if s.respond_to? :specification_version then
|
43
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
44
|
+
s.specification_version = 3
|
45
|
+
|
46
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
47
|
+
else
|
48
|
+
end
|
49
|
+
else
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: preposterous
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Ray Hernandez
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-05-07 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies: []
|
20
|
+
|
21
|
+
description: This gem supports posting and listing sites on Posterous
|
22
|
+
email: hernan43@gmail.com
|
23
|
+
executables: []
|
24
|
+
|
25
|
+
extensions: []
|
26
|
+
|
27
|
+
extra_rdoc_files:
|
28
|
+
- LICENSE
|
29
|
+
- README.rdoc
|
30
|
+
files:
|
31
|
+
- .gitignore
|
32
|
+
- LICENSE
|
33
|
+
- README.rdoc
|
34
|
+
- Rakefile
|
35
|
+
- VERSION.yml
|
36
|
+
- examples/.gitignore
|
37
|
+
- examples/post.rb
|
38
|
+
- lib/preposterous.rb
|
39
|
+
- lib/preposterous/base.rb
|
40
|
+
- lib/preposterous/httpauth.rb
|
41
|
+
- lib/preposterous/request.rb
|
42
|
+
- preposterous.gemspec
|
43
|
+
has_rdoc: true
|
44
|
+
homepage: http://github.com/hernan43/preposterous
|
45
|
+
licenses: []
|
46
|
+
|
47
|
+
post_install_message:
|
48
|
+
rdoc_options:
|
49
|
+
- --charset=UTF-8
|
50
|
+
require_paths:
|
51
|
+
- lib
|
52
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
version: "0"
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
segments:
|
64
|
+
- 0
|
65
|
+
version: "0"
|
66
|
+
requirements: []
|
67
|
+
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.3.6
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: a wrapper library for the Posterous API
|
73
|
+
test_files:
|
74
|
+
- examples/post.rb
|