jordandobson-wordpress 0.1.6 → 0.1.7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.txt +9 -11
- data/lib/wordpress.rb +40 -44
- data/test/test_wordpress.rb +50 -84
- metadata +1 -1
data/README.txt
CHANGED
@@ -44,21 +44,19 @@ Posting images with posts, posting only images and pulling down your posts will
|
|
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
|
-
account.title
|
52
|
-
|
53
|
-
account.
|
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 = account.post
|
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
@@ -1,71 +1,67 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'mechanize'
|
3
|
-
|
3
|
+
|
4
4
|
module Wordpress
|
5
|
-
|
6
|
-
VERSION = '0.1.
|
7
|
-
|
5
|
+
|
6
|
+
VERSION = '0.1.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
13
|
class Client
|
14
|
-
|
14
|
+
|
15
15
|
DEFAULT_URL = 'http://wordpress.com/wp-login.php'
|
16
16
|
LOGIN_FORM = 'loginform'
|
17
17
|
POST_FORM = 'post'
|
18
18
|
IS_ADMIN = 'body.wp-admin'
|
19
19
|
IS_LOGIN = 'body.login'
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
|
21
|
+
attr_reader :login_url, :username, :password, :agent
|
22
|
+
|
24
23
|
def initialize usr, pwd, login_url = DEFAULT_URL
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
|
25
|
+
# should I
|
26
|
+
raise AuthError, "You must provide a username and password" \
|
27
|
+
if usr.empty? || pwd.empty?
|
28
|
+
|
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
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
|
-
end
|
42
|
-
|
37
|
+
|
43
38
|
def valid_login_page?
|
44
39
|
!login_page.search("form[name=#{LOGIN_FORM}]").empty?
|
45
40
|
end
|
46
|
-
|
41
|
+
|
47
42
|
def valid_user?
|
48
43
|
logged_into? dashboard_page
|
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
|
-
|
55
|
-
def post
|
56
|
-
raise PostError, "A post requires a title or body."
|
49
|
+
|
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
|
64
|
-
|
60
|
+
|
65
61
|
def login_page
|
66
62
|
@agent.get @login_url
|
67
63
|
end
|
68
|
-
|
64
|
+
|
69
65
|
def dashboard_page
|
70
66
|
page = login_page
|
71
67
|
login_form = page.form(LOGIN_FORM)
|
@@ -76,28 +72,28 @@ module Wordpress
|
|
76
72
|
end
|
77
73
|
page
|
78
74
|
end
|
79
|
-
|
75
|
+
|
80
76
|
def logged_into? page
|
81
77
|
!page.search(IS_ADMIN).empty?
|
82
78
|
end
|
83
|
-
|
84
|
-
def build_post form
|
85
|
-
form.post_title =
|
86
|
-
form.content =
|
87
|
-
form.tags_input =
|
79
|
+
|
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
|
-
|
91
|
-
def post_response page
|
86
|
+
|
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
@@ -1,205 +1,171 @@
|
|
1
1
|
require "test/unit"
|
2
2
|
require "wordpress"
|
3
3
|
require "mocha"
|
4
|
-
|
4
|
+
|
5
5
|
class Wordpress::Client
|
6
6
|
public :login_page, :dashboard_page, :logged_into?, :build_post, :post_response
|
7
7
|
end
|
8
|
-
|
9
|
-
#
|
8
|
+
|
9
|
+
# Should Test The Following
|
10
10
|
# * build_post
|
11
11
|
# * dashboard_page
|
12
12
|
# * Post Response failure
|
13
|
-
|
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
|
16
|
+
|
14
17
|
class TestWordpress < Test::Unit::TestCase
|
15
|
-
|
18
|
+
|
16
19
|
def setup
|
17
20
|
@u = 'jordandobson'
|
18
21
|
@p = 'password'
|
19
|
-
|
22
|
+
|
20
23
|
@account = Wordpress::Client.new @u, @p
|
21
24
|
@account_bad = Wordpress::Client.new @u, 'x'
|
22
25
|
@account_invalid_login_page = Wordpress::Client.new @u, @p, 'http://notapage.gd/wp-login.php'
|
23
26
|
@account_hosted_account = Wordpress::Client.new @u, @p, 'http://blog.getglue.net/wp-login.php'
|
24
|
-
|
27
|
+
|
25
28
|
login_html = '<html><body class="login"><form name="loginform"></form></body></html>'
|
26
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>'
|
27
30
|
success_html = '<div class="message"><p><a href="http://success.com/2009/?preview=1">preview</a><a href="http://success.com/wp-admin/post.php?post=99">edit</a></p></div>'
|
28
31
|
fail_html = '<div class="message"><p></p></div>'
|
29
|
-
|
32
|
+
|
30
33
|
@login_pg = setup_mock_mechanize_pg login_html
|
31
34
|
@admin_pg = setup_mock_mechanize_pg admin_html
|
32
35
|
@success_pg = setup_mock_mechanize_pg success_html
|
33
36
|
@fail_pg = setup_mock_mechanize_pg fail_html
|
34
37
|
end
|
35
|
-
|
38
|
+
|
36
39
|
def setup_mock_mechanize_pg html
|
37
40
|
WWW::Mechanize::Page.new(nil, {'content-type' => 'text/html'}, html, 200)
|
38
41
|
end
|
39
|
-
|
42
|
+
|
40
43
|
def test_sets_account_info_on_initialize
|
41
|
-
actual = Wordpress::Client.new @u, @p
|
44
|
+
actual = Wordpress::Client.new @u, @p
|
42
45
|
assert_equal [@u, @p], [actual.username, actual.password]
|
43
46
|
end
|
44
|
-
|
47
|
+
|
45
48
|
def test_raises_if_username_is_blank
|
46
49
|
assert_raise Wordpress::AuthError do
|
47
|
-
Wordpress::Client.new "", @p
|
50
|
+
Wordpress::Client.new "", @p
|
48
51
|
end
|
49
52
|
end
|
50
|
-
|
53
|
+
|
51
54
|
def test_raises_if_password_is_blank
|
52
55
|
assert_raise Wordpress::AuthError do
|
53
56
|
Wordpress::Client.new @u, ""
|
54
57
|
end
|
55
58
|
end
|
56
|
-
|
57
|
-
def test_raises_if_password_is_not_srting
|
58
|
-
assert_raise Wordpress::AuthError do
|
59
|
-
Wordpress::Client.new @u, 00
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def test_raises_if_username_is_not_srting
|
64
|
-
assert_raise Wordpress::AuthError do
|
65
|
-
Wordpress::Client.new 00, @p
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
59
|
+
|
69
60
|
def test_login_url_uses_default_if_witheld
|
70
61
|
assert_equal Wordpress::Client::DEFAULT_URL, @account.login_url
|
71
62
|
end
|
72
|
-
|
63
|
+
|
73
64
|
def test_users_url_does_not_raise
|
74
65
|
assert_equal 'http://notapage.gd/wp-login.php', @account_invalid_login_page.login_url
|
75
66
|
end
|
76
|
-
|
67
|
+
|
77
68
|
def test_raises_on_bad_login_url
|
78
69
|
assert_raise Wordpress::AuthError do
|
79
70
|
Wordpress::Client.new @u, @p, 'http://bad.login/url.php'
|
80
71
|
end
|
81
72
|
end
|
82
|
-
|
73
|
+
|
83
74
|
def test_login_page_is_valid
|
84
75
|
actual = Wordpress::Client.new @u, @p
|
85
76
|
actual.stubs(:login_page).returns(@login_pg)
|
86
77
|
assert_equal true, actual.valid_login_page?
|
87
78
|
end
|
88
|
-
|
79
|
+
|
89
80
|
def test_login_page_is_invalid
|
90
81
|
@account_invalid_login_page.stubs(:login_page).returns(@fail_pg)
|
91
82
|
assert_equal false, @account_invalid_login_page.valid_login_page?
|
92
83
|
end
|
93
|
-
|
84
|
+
|
94
85
|
def test_is_a_valid_user
|
95
86
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
96
87
|
assert_equal true, @account.valid_user?
|
97
88
|
end
|
98
|
-
|
89
|
+
|
99
90
|
def test_is_an_invalid_user
|
100
91
|
@account_bad.stubs(:dashboard_page).returns(@login_pg)
|
101
92
|
assert_equal false, @account_bad.valid_user?
|
102
93
|
end
|
103
|
-
|
94
|
+
|
104
95
|
def test_is_a_valid_hosted_user
|
105
96
|
@account_hosted_account.stubs(:dashboard_page).returns(@admin_pg)
|
106
97
|
assert_equal true, @account_hosted_account.valid_user?
|
107
98
|
end
|
108
|
-
|
99
|
+
|
109
100
|
def test_private_logged_in_is_true
|
110
101
|
assert_equal true, @account.logged_into?(@admin_pg)
|
111
102
|
end
|
112
|
-
|
103
|
+
|
113
104
|
def test_private_logged_in_is_false
|
114
105
|
assert_equal false, @account.logged_into?(@login_pg)
|
115
106
|
end
|
116
|
-
|
107
|
+
|
117
108
|
def test_returns_blog_url
|
118
109
|
@account_hosted_account.stubs(:dashboard_page).returns(@admin_pg)
|
119
110
|
assert_equal 'http://getglue.wordpress.com/', @account_hosted_account.blog_url
|
120
111
|
end
|
121
|
-
|
112
|
+
|
122
113
|
def test_returns_blog_url_bad
|
123
114
|
@account_invalid_login_page.stubs(:dashboard_page).raises(SocketError)
|
124
115
|
assert_nil @account_invalid_login_page.blog_url
|
125
116
|
end
|
126
|
-
|
127
|
-
def
|
117
|
+
|
118
|
+
def test_post_raises_without_title_or_body
|
128
119
|
assert_raise Wordpress::PostError do
|
129
|
-
@account.post
|
120
|
+
@account.post("", "")
|
130
121
|
end
|
131
122
|
end
|
132
|
-
|
133
|
-
def
|
123
|
+
|
124
|
+
def test_post_raises_without_post_form
|
134
125
|
@account_bad.stubs(:dashboard_page).returns(@fail_pg)
|
135
|
-
@account_bad.title = "Fail"
|
136
126
|
assert_raise Wordpress::HostError do
|
137
|
-
@account_bad.post
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def test_tags_are_added_correctly
|
142
|
-
@account.tags = []
|
143
|
-
assert_equal @account.tags, ""
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_tags_single_is_correctly
|
147
|
-
@account.tags = ["Glue"]
|
148
|
-
assert_equal @account.tags, "Glue"
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_tags_multiple_is_correctly_joined
|
152
|
-
@account.tags = ["Glue", "Wordpress", "Ruby on Rails"]
|
153
|
-
assert_equal @account.tags, "Glue, Wordpress, Ruby on Rails"
|
154
|
-
end
|
155
|
-
|
156
|
-
def test_raises_if_tags_not_set_as_array
|
157
|
-
assert_raise Wordpress::TagsError do
|
158
|
-
@account.tags = "hello, "
|
127
|
+
@account_bad.post("My Title", "")
|
159
128
|
end
|
160
129
|
end
|
161
|
-
|
130
|
+
|
162
131
|
def test_post_response_returns_good_response
|
163
|
-
assert_equal "ok", @account.post_response(@success_pg)["rsp"]["stat"]
|
132
|
+
assert_equal "ok", @account.post_response(@success_pg, "")["rsp"]["stat"]
|
164
133
|
end
|
165
|
-
|
134
|
+
|
166
135
|
def test_post_returns_fail
|
167
136
|
title = "My Title"
|
168
|
-
@account.
|
169
|
-
res
|
170
|
-
assert_equal "
|
171
|
-
assert_equal
|
172
|
-
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"]
|
173
141
|
end
|
174
|
-
|
142
|
+
|
175
143
|
def test_post_returns_ok
|
176
144
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
177
145
|
@account.agent.stubs(:submit).returns(@success_pg)
|
178
146
|
title = "My Title"
|
179
|
-
|
180
|
-
@account.body
|
181
|
-
actual = @account.post
|
147
|
+
body = "Body Text"
|
148
|
+
actual = @account.post(title, body)
|
182
149
|
assert_equal "ok", actual["rsp"]["stat"]
|
183
150
|
assert_equal title, actual["rsp"]["post"]["title"]
|
184
151
|
assert_equal "99", actual["rsp"]["post"]["id"]
|
185
152
|
assert_equal "http://success.com/2009/", actual["rsp"]["post"]["url"]
|
186
153
|
end
|
187
|
-
|
154
|
+
|
188
155
|
def test_post_returns_ok_with_only_title
|
189
156
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
190
157
|
@account.agent.stubs(:submit).returns(@success_pg)
|
191
158
|
title = "My Title"
|
192
|
-
@account.title
|
193
|
-
actual = @account.post
|
159
|
+
actual = @account.post(title, "")
|
194
160
|
assert_equal "ok", actual["rsp"]["stat"]
|
195
161
|
assert_equal title, actual["rsp"]["post"]["title"]
|
196
162
|
end
|
197
|
-
|
163
|
+
|
198
164
|
def test_post_returns_ok_with_only_body
|
199
165
|
@account.stubs(:dashboard_page).returns(@admin_pg)
|
200
166
|
@account.agent.stubs(:submit).returns(@success_pg)
|
201
|
-
|
202
|
-
actual = @account.post
|
167
|
+
body = "Body Text"
|
168
|
+
actual = @account.post("", body)
|
203
169
|
assert_equal "ok", actual["rsp"]["stat"]
|
204
170
|
assert_equal "", actual["rsp"]["post"]["title"]
|
205
171
|
end
|