wordpress 0.1.5 → 0.1.7
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/README.txt +14 -16
- data/lib/wordpress.rb +22 -26
- data/test/test_wordpress.rb +35 -68
- metadata +2 -2
data/README.txt
CHANGED
@@ -24,41 +24,39 @@ Posting images with posts, posting only images and pulling down your posts will
|
|
24
24
|
|
25
25
|
* Provide just the username and password as strings
|
26
26
|
|
27
|
-
|
27
|
+
account = Wordpress::Client.new('username', 'password')
|
28
28
|
|
29
29
|
* OR Provide the url of your login page if it's self hosted
|
30
30
|
|
31
|
-
|
31
|
+
account = Wordpress::Client.new('username', 'password', 'http://blog.mysite.com/wp-login.php')
|
32
32
|
|
33
33
|
2. Validate the provided account info and request the users blog url homepage if needed
|
34
34
|
|
35
35
|
* Check if the user is valid. Returns true or false
|
36
36
|
|
37
|
-
|
37
|
+
account.valid_user?
|
38
38
|
|
39
39
|
* Check if the specified login page is valid. Returns true or false
|
40
40
|
|
41
|
-
|
41
|
+
account.valid_login_page?
|
42
42
|
|
43
43
|
* Get the users blog page url. Returns nil if it can't be found.
|
44
44
|
|
45
|
-
|
45
|
+
account.blog_url
|
46
46
|
|
47
|
-
3.
|
47
|
+
3. Send your post to your Wordpress Blog
|
48
48
|
|
49
|
-
*
|
49
|
+
* Set to a variable to work with the response
|
50
50
|
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
response = account.post("My title", "Body Text", ["Glue", "Wordpress"])
|
52
|
+
|
53
|
+
response = account.post("", "Body Text", ["Glue", "Wordpress"])
|
54
|
+
|
55
|
+
response = account.post("My title", "")
|
54
56
|
|
55
|
-
|
57
|
+
response = account.post("", "Body Text")
|
56
58
|
|
57
|
-
|
58
|
-
|
59
|
-
response = user_post.submit
|
60
|
-
|
61
|
-
5. You get a success or error hash back
|
59
|
+
4. You get a success or error hash back
|
62
60
|
|
63
61
|
* Your response should look something like this if successful
|
64
62
|
|
data/lib/wordpress.rb
CHANGED
@@ -3,14 +3,14 @@ require 'mechanize'
|
|
3
3
|
|
4
4
|
module Wordpress
|
5
5
|
|
6
|
-
VERSION = '0.1.
|
6
|
+
VERSION = '0.1.7'
|
7
7
|
|
8
8
|
class AuthError < StandardError; end
|
9
9
|
class PostError < StandardError; end
|
10
10
|
class HostError < StandardError; end
|
11
11
|
class TagsError < StandardError; end
|
12
12
|
|
13
|
-
class
|
13
|
+
class Client
|
14
14
|
|
15
15
|
DEFAULT_URL = 'http://wordpress.com/wp-login.php'
|
16
16
|
LOGIN_FORM = 'loginform'
|
@@ -18,26 +18,21 @@ module Wordpress
|
|
18
18
|
IS_ADMIN = 'body.wp-admin'
|
19
19
|
IS_LOGIN = 'body.login'
|
20
20
|
|
21
|
-
|
22
|
-
attr_reader :login_url, :username, :password, :tags, :post_url, :agent
|
21
|
+
attr_reader :login_url, :username, :password, :agent
|
23
22
|
|
24
23
|
def initialize usr, pwd, login_url = DEFAULT_URL
|
25
|
-
|
26
|
-
|
24
|
+
|
25
|
+
# should I
|
26
|
+
raise AuthError, "You must provide a username and password" \
|
27
|
+
if usr.empty? || pwd.empty?
|
27
28
|
|
28
|
-
raise AuthError, "Url should end with wp-login.php" \
|
29
|
+
raise AuthError, "Login Url should end with wp-login.php" \
|
29
30
|
unless login_url =~ /\/wp-login[.]php$/
|
30
31
|
|
31
32
|
@username = usr
|
32
33
|
@password = pwd
|
33
34
|
@login_url = login_url
|
34
35
|
@agent = WWW::Mechanize.new
|
35
|
-
@post_url = @tags = @title = @body = nil
|
36
|
-
end
|
37
|
-
|
38
|
-
def tags= ary
|
39
|
-
raise TagsError, 'Tags must added using an array' unless ary.is_a?(Array)
|
40
|
-
@tags = ary.join(", ")
|
41
36
|
end
|
42
37
|
|
43
38
|
def valid_login_page?
|
@@ -49,15 +44,16 @@ module Wordpress
|
|
49
44
|
end
|
50
45
|
|
51
46
|
def blog_url
|
52
|
-
dashboard_page.
|
47
|
+
dashboard_page.at("#{IS_ADMIN} #wphead h1 a")['href'] rescue nil
|
53
48
|
end
|
54
49
|
|
55
|
-
def
|
56
|
-
raise PostError, "A post requires a title or body."
|
50
|
+
def post title, body, tags=nil
|
51
|
+
raise PostError, "A post requires a title or body." if title.empty? && body.empty?
|
57
52
|
post_form = dashboard_page.form(POST_FORM)
|
58
|
-
raise HostError, "Missing QuickPress on dashboard page or bad account." unless
|
59
|
-
|
60
|
-
|
53
|
+
raise HostError, "Missing QuickPress on dashboard page or bad account." unless post_form
|
54
|
+
tags = tags.join(", ") if tags
|
55
|
+
post_form = build_post(post_form, title, body, tags)
|
56
|
+
post_response @agent.submit(post_form, post_form.buttons.last), title
|
61
57
|
end
|
62
58
|
|
63
59
|
private
|
@@ -81,23 +77,23 @@ module Wordpress
|
|
81
77
|
!page.search(IS_ADMIN).empty?
|
82
78
|
end
|
83
79
|
|
84
|
-
def build_post form
|
85
|
-
form.post_title =
|
86
|
-
form.content =
|
87
|
-
form.tags_input =
|
80
|
+
def build_post form, title, body, tags
|
81
|
+
form.post_title = title
|
82
|
+
form.content = body
|
83
|
+
form.tags_input = tags
|
88
84
|
form
|
89
85
|
end
|
90
86
|
|
91
|
-
def post_response page
|
87
|
+
def post_response page, title
|
92
88
|
links = page.search("div.message p a")
|
93
89
|
if links.first && links.last
|
94
90
|
url = links.first['href'] ? links.first['href'].gsub("?preview=1", "") : nil
|
95
91
|
pid = links.last['href'] ? links.last['href'].sub(/.*post=(\d*)/,'\1') : nil
|
96
92
|
if pid && url
|
97
|
-
return {
|
93
|
+
return {"rsp" => {"post" => {"title" => "#{title}", "url" => "#{url}", "id" => "#{pid}"}, "stat" => "ok" }}
|
98
94
|
end
|
99
95
|
end
|
100
|
-
{
|
96
|
+
{"rsp" => {"err" => {"msg" => "Post was unsuccessful.", "title" => "#{title}"}, "stat" => "fail"}}
|
101
97
|
end
|
102
98
|
end
|
103
99
|
end
|
data/test/test_wordpress.rb
CHANGED
@@ -2,13 +2,17 @@ require "test/unit"
|
|
2
2
|
require "wordpress"
|
3
3
|
require "mocha"
|
4
4
|
|
5
|
-
class Wordpress::
|
5
|
+
class Wordpress::Client
|
6
6
|
public :login_page, :dashboard_page, :logged_into?, :build_post, :post_response
|
7
7
|
end
|
8
8
|
|
9
|
-
#
|
9
|
+
# Should Test The Following
|
10
10
|
# * build_post
|
11
11
|
# * dashboard_page
|
12
|
+
# * Post Response failure
|
13
|
+
# * Tags error without being an array
|
14
|
+
# * Body and tags are returned in response
|
15
|
+
# * Testing that username, password & login url respond to empty
|
12
16
|
|
13
17
|
class TestWordpress < Test::Unit::TestCase
|
14
18
|
|
@@ -16,10 +20,10 @@ class TestWordpress < Test::Unit::TestCase
|
|
16
20
|
@u = 'jordandobson'
|
17
21
|
@p = 'password'
|
18
22
|
|
19
|
-
@account = Wordpress::
|
20
|
-
@account_bad = Wordpress::
|
21
|
-
@account_invalid_login_page = Wordpress::
|
22
|
-
@account_hosted_account = Wordpress::
|
23
|
+
@account = Wordpress::Client.new @u, @p
|
24
|
+
@account_bad = Wordpress::Client.new @u, 'x'
|
25
|
+
@account_invalid_login_page = Wordpress::Client.new @u, @p, 'http://notapage.gd/wp-login.php'
|
26
|
+
@account_hosted_account = Wordpress::Client.new @u, @p, 'http://blog.getglue.net/wp-login.php'
|
23
27
|
|
24
28
|
login_html = '<html><body class="login"><form name="loginform"></form></body></html>'
|
25
29
|
admin_html = '<html><body class="wp-admin"><div id="wphead"><h1><a href="http://getglue.wordpress.com/" title="Visit Site">Get Glue</a></h1></div><form name="post"><input type="text" name="post_title"/><textarea name="content"></textarea><input type="text" name="tags_input"/><input type="submit" name="publish" /></form></body></html>'
|
@@ -37,50 +41,38 @@ class TestWordpress < Test::Unit::TestCase
|
|
37
41
|
end
|
38
42
|
|
39
43
|
def test_sets_account_info_on_initialize
|
40
|
-
actual = Wordpress::
|
44
|
+
actual = Wordpress::Client.new @u, @p
|
41
45
|
assert_equal [@u, @p], [actual.username, actual.password]
|
42
46
|
end
|
43
47
|
|
44
48
|
def test_raises_if_username_is_blank
|
45
49
|
assert_raise Wordpress::AuthError do
|
46
|
-
Wordpress::
|
50
|
+
Wordpress::Client.new "", @p
|
47
51
|
end
|
48
52
|
end
|
49
53
|
|
50
54
|
def test_raises_if_password_is_blank
|
51
55
|
assert_raise Wordpress::AuthError do
|
52
|
-
Wordpress::
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_raises_if_password_is_not_srting
|
57
|
-
assert_raise Wordpress::AuthError do
|
58
|
-
Wordpress::Post.new @u, 00
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def test_raises_if_username_is_not_srting
|
63
|
-
assert_raise Wordpress::AuthError do
|
64
|
-
Wordpress::Post.new 00, @p
|
56
|
+
Wordpress::Client.new @u, ""
|
65
57
|
end
|
66
58
|
end
|
67
59
|
|
68
60
|
def test_login_url_uses_default_if_witheld
|
69
|
-
assert_equal Wordpress::
|
61
|
+
assert_equal Wordpress::Client::DEFAULT_URL, @account.login_url
|
70
62
|
end
|
71
|
-
|
63
|
+
|
72
64
|
def test_users_url_does_not_raise
|
73
65
|
assert_equal 'http://notapage.gd/wp-login.php', @account_invalid_login_page.login_url
|
74
66
|
end
|
75
67
|
|
76
68
|
def test_raises_on_bad_login_url
|
77
69
|
assert_raise Wordpress::AuthError do
|
78
|
-
Wordpress::
|
70
|
+
Wordpress::Client.new @u, @p, 'http://bad.login/url.php'
|
79
71
|
end
|
80
72
|
end
|
81
73
|
|
82
74
|
def test_login_page_is_valid
|
83
|
-
actual = Wordpress::
|
75
|
+
actual = Wordpress::Client.new @u, @p
|
84
76
|
actual.stubs(:login_page).returns(@login_pg)
|
85
77
|
assert_equal true, actual.valid_login_page?
|
86
78
|
end
|
@@ -123,82 +115,57 @@ class TestWordpress < Test::Unit::TestCase
|
|
123
115
|
assert_nil @account_invalid_login_page.blog_url
|
124
116
|
end
|
125
117
|
|
126
|
-
def
|
118
|
+
def test_post_raises_without_title_or_body
|
127
119
|
assert_raise Wordpress::PostError do
|
128
|
-
@account.
|
120
|
+
@account.post("", "")
|
129
121
|
end
|
130
122
|
end
|
131
123
|
|
132
|
-
def
|
124
|
+
def test_post_raises_without_post_form
|
133
125
|
@account_bad.stubs(:dashboard_page).returns(@fail_pg)
|
134
|
-
@account_bad.title = "Fail"
|
135
126
|
assert_raise Wordpress::HostError do
|
136
|
-
@account_bad.
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def test_tags_are_added_correctly
|
141
|
-
@account.tags = []
|
142
|
-
assert_equal @account.tags, ""
|
143
|
-
end
|
144
|
-
|
145
|
-
def test_tags_single_is_correctly
|
146
|
-
@account.tags = ["Glue"]
|
147
|
-
assert_equal @account.tags, "Glue"
|
148
|
-
end
|
149
|
-
|
150
|
-
def test_tags_multiple_is_correctly_joined
|
151
|
-
@account.tags = ["Glue", "Wordpress", "Ruby on Rails"]
|
152
|
-
assert_equal @account.tags, "Glue, Wordpress, Ruby on Rails"
|
153
|
-
end
|
154
|
-
|
155
|
-
def test_raises_if_tags_not_set_as_array
|
156
|
-
assert_raise Wordpress::TagsError do
|
157
|
-
@account.tags = "hello, "
|
127
|
+
@account_bad.post("My Title", "")
|
158
128
|
end
|
159
129
|
end
|
160
130
|
|
161
131
|
def test_post_response_returns_good_response
|
162
|
-
assert_equal "ok", @account.post_response(@success_pg)["rsp"]["stat"]
|
132
|
+
assert_equal "ok", @account.post_response(@success_pg, "")["rsp"]["stat"]
|
163
133
|
end
|
164
134
|
|
165
|
-
def
|
135
|
+
def test_post_returns_fail
|
166
136
|
title = "My Title"
|
167
|
-
@account.
|
168
|
-
res
|
169
|
-
assert_equal "
|
170
|
-
assert_equal
|
171
|
-
assert_equal title, res["rsp"]["err"]["title"]
|
137
|
+
res = @account.post_response(@fail_pg, title)
|
138
|
+
assert_equal "fail", res["rsp"]["stat"]
|
139
|
+
assert_equal "Post was unsuccessful.", res["rsp"]["err"]["msg"]
|
140
|
+
assert_equal title, res["rsp"]["err"]["title"]
|
172
141
|
end
|
173
142
|
|
174
|
-
def
|
143
|
+
def test_post_returns_ok
|
175
144
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
176
145
|
@account.agent.stubs(:submit).returns(@success_pg)
|
177
146
|
title = "My Title"
|
178
|
-
|
179
|
-
@account.body
|
180
|
-
actual = @account.submit
|
147
|
+
body = "Body Text"
|
148
|
+
actual = @account.post(title, body)
|
181
149
|
assert_equal "ok", actual["rsp"]["stat"]
|
182
150
|
assert_equal title, actual["rsp"]["post"]["title"]
|
183
151
|
assert_equal "99", actual["rsp"]["post"]["id"]
|
184
152
|
assert_equal "http://success.com/2009/", actual["rsp"]["post"]["url"]
|
185
153
|
end
|
186
154
|
|
187
|
-
def
|
155
|
+
def test_post_returns_ok_with_only_title
|
188
156
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
189
157
|
@account.agent.stubs(:submit).returns(@success_pg)
|
190
158
|
title = "My Title"
|
191
|
-
@account.title
|
192
|
-
actual = @account.submit
|
159
|
+
actual = @account.post(title, "")
|
193
160
|
assert_equal "ok", actual["rsp"]["stat"]
|
194
161
|
assert_equal title, actual["rsp"]["post"]["title"]
|
195
162
|
end
|
196
163
|
|
197
|
-
def
|
164
|
+
def test_post_returns_ok_with_only_body
|
198
165
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
199
166
|
@account.agent.stubs(:submit).returns(@success_pg)
|
200
|
-
|
201
|
-
actual = @account.
|
167
|
+
body = "Body Text"
|
168
|
+
actual = @account.post("", body)
|
202
169
|
assert_equal "ok", actual["rsp"]["stat"]
|
203
170
|
assert_equal "", actual["rsp"]["post"]["title"]
|
204
171
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wordpress
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jordan Dobson
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-10 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|