jordandobson-wordpress 0.1.1

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/History.txt ADDED
@@ -0,0 +1,12 @@
1
+ === 1.0.1 / 2009-06-05
2
+
3
+ * 1 major enhancement
4
+
5
+ * Added the ability to post and check account properties
6
+
7
+ === 1.0.0 / 2009-05-28
8
+
9
+ * 1 major enhancement
10
+
11
+ * Birthday!
12
+
data/Manifest.txt ADDED
@@ -0,0 +1,7 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ bin/wordpress
6
+ lib/wordpress.rb
7
+ test/test_wordpress.rb
data/README.txt ADDED
@@ -0,0 +1,104 @@
1
+ = wordpress
2
+
3
+ * http://JordanDobson.com
4
+
5
+ == DESCRIPTION:
6
+
7
+ The Wordpress gem provides posting to a Wordpress.com blog or a self hosted wordpress by provided your username, password, login url(if you host your blog) and your blog content. With this gem, you have access to add a text entry on Wordpress blug by providing these options: a title, body, and tags. You must include at least a title or body for your post.
8
+
9
+ Posting images with posts, posting only images and pulling down your posts will be available very soon.
10
+
11
+ == FEATURES/PROBLEMS:
12
+
13
+ * Either Title or Body is optional
14
+ * Adding Images are not yet implemented
15
+ * Posting Only, Reading & Images are not yet included
16
+ * Check if a username and password are valid
17
+ * Check if a provided login_url is valid
18
+ * Get the users blog url
19
+ * This is very throughly tested
20
+
21
+ == SYNOPSIS:
22
+
23
+ 1. Instantiate your account
24
+
25
+ * You can provide just the username and password
26
+
27
+ account = Wordpress::Client.new('username', 'password')
28
+
29
+ * Or you can provide the ID as a string or integer
30
+
31
+ account = Wordpress::Client.new('username', 'password', 'http://blog.mysite.com/wp-login.php')
32
+
33
+ 2. Get more info about the user's account if you need it
34
+
35
+ * Check if the user is valid
36
+
37
+ account.valid_user?
38
+
39
+ * Check if the specified login page is valid
40
+
41
+ account.valid_login_page?
42
+
43
+ * Get the users blog page url
44
+
45
+ account.blog_url
46
+
47
+ * Get a list of your sites and additional info
48
+
49
+ account.account_info
50
+
51
+ 3. Setup your post
52
+
53
+ * You must at least include the title or body
54
+
55
+ account.title = "My Title"
56
+ account.body = "My Body Text"
57
+ account.tags = ["Glue", "Posterous", "Ruby", "Made By Squad"]
58
+
59
+ 4. Add your post to Posterous.com
60
+
61
+ * Set this to a variable to work with the response
62
+
63
+ response = account.add_post
64
+
65
+ 5. You get a success or error hash back or nil
66
+
67
+ * Your response should look something like this if successful
68
+
69
+ response #=> { "rsp" => { "post" => { "title" => "My Title", "url" => "http://getglue.wordpress.com/2009/06/06/my-title/", "id" => "69" }, "stat" => "ok" } }
70
+
71
+ * See the tests for this gem for failure responses and responses for other methods
72
+
73
+ == REQUIREMENTS:
74
+
75
+ * mechanize, & Mocha (For Tests)
76
+
77
+ == INSTALL:
78
+
79
+ * sudo gem install wordpress -include-dependencies
80
+
81
+ == LICENSE:
82
+
83
+ (The MIT License)
84
+
85
+ Copyright (c) 2009 Jordan Dobson
86
+
87
+ Permission is hereby granted, free of charge, to any person obtaining
88
+ a copy of this software and associated documentation files (the
89
+ 'Software'), to deal in the Software without restriction, including
90
+ without limitation the rights to use, copy, modify, merge, publish,
91
+ distribute, sublicense, and/or sell copies of the Software, and to
92
+ permit persons to whom the Software is furnished to do so, subject to
93
+ the following conditions:
94
+
95
+ The above copyright notice and this permission notice shall be
96
+ included in all copies or substantial portions of the Software.
97
+
98
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
99
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
100
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
101
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
102
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
103
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
104
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,13 @@
1
+ # -*- ruby -*-
2
+
3
+ require 'rubygems'
4
+ require 'hoe'
5
+ require './lib/wordpress.rb'
6
+
7
+ Hoe.new('wordpress', Wordpress::VERSION) do |p|
8
+ # p.rubyforge_name = 'wordpressx' # if different than lowercase project name
9
+ p.developer('Jordan Dobson', 'jordan.dobson@madebysquad.com')
10
+ p.extra_deps = ['mechanize', 'mocha']
11
+ end
12
+
13
+ # vim: syntax=Ruby
data/bin/wordpress ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ abort "you need to write me"
data/lib/wordpress.rb ADDED
@@ -0,0 +1,99 @@
1
+ require 'rubygems'
2
+ require 'mechanize'
3
+
4
+ module Wordpress
5
+
6
+ VERSION = '0.1.1'
7
+
8
+ class AuthError < StandardError; end
9
+ class PostError < StandardError; end
10
+
11
+ class Client
12
+
13
+ DEFAULT_URL = 'http://wordpress.com/wp-login.php'
14
+ LOGIN_FORM = 'loginform'
15
+ POST_FORM = 'post'
16
+ IS_ADMIN = 'body.wp-admin'
17
+ IS_LOGIN = 'body.login'
18
+
19
+ attr_accessor :title, :body
20
+ attr_reader :login_url, :username, :password, :tags, :post_url
21
+
22
+ def initialize usr, pwd, login_url = DEFAULT_URL
23
+ raise AuthError, "Blank Username or Password or not a string." \
24
+ if !usr.is_a?(String) || !pwd.is_a?(String) || usr == '' || pwd == ''
25
+
26
+ raise AuthError, "Url should end with wp-login.php" \
27
+ unless login_url =~ /\/wp-login[.]php$/
28
+
29
+ @username = usr
30
+ @password = pwd
31
+ @login_url = login_url
32
+ @agent = nil
33
+ @post_url = nil
34
+ end
35
+
36
+ def tags= ary
37
+ raise TagError, 'Tags must added using an array' if !ary.is_a?(Array)
38
+ @tags = ary.join(", ")
39
+ end
40
+
41
+ def valid_login_page?
42
+ lf = login_page.form(LOGIN_FORM)
43
+ lf && lf.log ? true : false
44
+ end
45
+
46
+ def valid_user?
47
+ logged_into? dashboard_page
48
+ end
49
+
50
+ def blog_url
51
+ a = dashboard_page.search("#{IS_ADMIN} #wphead h1 a")
52
+ return a.first['href'] if a.first && a.first['href']
53
+ nil
54
+ end
55
+
56
+ def add_post
57
+ post_form = dashboard_page.form(POST_FORM)
58
+ raise PostError, "Missing QuickPress form on users dashboard page." unless post_form
59
+ raise PostError, "A post requires a title or body." if !@title && !@body
60
+ post_form = build_post(post_form)
61
+ build_response @agent.submit(post_form, post_form.buttons.last)
62
+ end
63
+
64
+ private
65
+
66
+ def login_page
67
+ @agent = WWW::Mechanize.new #if !@agent
68
+ @agent.get @login_url
69
+ end
70
+
71
+ def dashboard_page
72
+ page = login_page
73
+ login_form = page.form(LOGIN_FORM)
74
+ if login_form
75
+ login_form.log = @username
76
+ login_form.pwd = @password
77
+ page = @agent.submit login_form
78
+ end
79
+ page
80
+ end
81
+
82
+ def logged_into? page
83
+ !page.search(IS_ADMIN).empty?
84
+ end
85
+
86
+ def build_post f
87
+ f.post_title = @title
88
+ f.content = @body
89
+ f.tags_input = @tags
90
+ f
91
+ end
92
+
93
+ def build_response page
94
+ return true
95
+ #get preview url & if it's not there send back error response
96
+ end
97
+
98
+ end
99
+ end
@@ -0,0 +1,133 @@
1
+ require "test/unit"
2
+ require "wordpress"
3
+ #
4
+
5
+ ######
6
+ # USED TO TEST PRIVATE METHODS
7
+ class Class
8
+ def private_methods
9
+ m = self.private_instance_methods
10
+ self.class_eval { public(*m) }
11
+ yield
12
+ self.class_eval { private(*m) }
13
+ end
14
+ end
15
+
16
+
17
+ class TestWordpress < Test::Unit::TestCase
18
+
19
+ def setup
20
+ @u = 'jordandobson'
21
+ @p = 'password'
22
+
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://is.gd/wp-login.php'
26
+
27
+ @admin_pg = Nokogiri::HTML( Nokogiri::HTML::Builder.new { html { body( :class => 'wp-admin') } }.to_html )
28
+ @login_pg = Nokogiri::HTML( Nokogiri::HTML::Builder.new { html { body( :class => 'login' ) } }.to_html )
29
+ end
30
+
31
+ def test_sets_account_info_on_initialize
32
+ actual = Wordpress::Client.new @u, @p
33
+ assert_equal [@u, @p], [actual.username, actual.password]
34
+ end
35
+
36
+ def test_raises_if_username_is_blank
37
+ assert_raise Wordpress::AuthError do
38
+ Wordpress::Client.new "", @p
39
+ end
40
+ end
41
+
42
+ def test_raises_if_password_is_blank
43
+ assert_raise Wordpress::AuthError do
44
+ Wordpress::Client.new @u, ""
45
+ end
46
+ end
47
+
48
+ def test_raises_if_password_is_not_srting
49
+ assert_raise Wordpress::AuthError do
50
+ Wordpress::Client.new @u, 00
51
+ end
52
+ end
53
+
54
+ def test_raises_if_username_is_not_srting
55
+ assert_raise Wordpress::AuthError do
56
+ Wordpress::Client.new 00, @p
57
+ end
58
+ end
59
+
60
+ def test_login_url_uses_default_if_witheld
61
+ assert_equal Wordpress::Client::DEFAULT_URL, @account.login_url
62
+ end
63
+
64
+ def test_uses_url_does_not_raise
65
+ assert_equal 'http://is.gd/wp-login.php', @account_invalid_login_page.login_url
66
+ end
67
+
68
+ def test_raises_on_bad_login_url
69
+ assert_raise Wordpress::AuthError do
70
+ Wordpress::Client.new @u, @p, 'http://bad.login/url.php'
71
+ end
72
+ end
73
+
74
+ def test_login_page_is_valid
75
+ actual = Wordpress::Client.new @u, @p
76
+ assert_equal true, actual.valid_login_page?
77
+ end
78
+
79
+ def test_login_page_is_invalid
80
+ assert_equal false, @account_invalid_login_page.valid_login_page?
81
+ end
82
+
83
+ def test_is_a_valid_user
84
+ assert_equal true, @account.valid_user?
85
+ end
86
+
87
+ def test_is_an_invalid_user
88
+ assert_equal false, @account_bad.valid_user?
89
+ end
90
+
91
+ def test_is_a_valid_hosted_user
92
+ account = Wordpress::Client.new('nonbreakablespace', 'Password1', 'http://blog.nonbreakablespace.com/wp-login.php')
93
+ assert_equal true, account.valid_user?
94
+ end
95
+ def test_returns_blog_url
96
+ expected = 'http://blog.nonbreakablespace.com/'
97
+ account = Wordpress::Client.new('nonbreakablespace', 'Password1', "#{expected}wp-login.php")
98
+ assert_equal expected, account.blog_url
99
+ # Need to stub dashboard_page
100
+ end
101
+
102
+ def test_returns_blog_url_bad
103
+ account = Wordpress::Client.new(@u, @p, 'http://is.gd/wp-login.php')
104
+ assert_nil account.blog_url
105
+ end
106
+
107
+ def test_private_logged_in_is_true
108
+ Wordpress::Client.private_methods { assert_equal true, @account.logged_into?(@admin_pg) }
109
+ end
110
+
111
+ def test_private_logged_in_is_false
112
+ Wordpress::Client.private_methods { assert_equal false, @account.logged_into?(@login_pg) }
113
+ end
114
+
115
+ def test_add_post_raises_without_title_or_body
116
+ assert_raise Wordpress::PostError do
117
+ @account.add_post
118
+ end
119
+ end
120
+
121
+ def test_add_post_raises_without_post_form
122
+ assert_raise Wordpress::PostError do
123
+ @account_bad.add_post
124
+ end
125
+ end
126
+
127
+ def test_add_post_adds_post
128
+ @account.title = Time.now
129
+ @account.body = "updated next"
130
+ @account.add_post
131
+ end
132
+
133
+ end
metadata ADDED
@@ -0,0 +1,72 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jordandobson-wordpress
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Jordan Dobson
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-06-05 00:00:00 -07:00
13
+ default_executable: wordpress
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.3
24
+ version:
25
+ description: The Wordpress gem provides posting to a Wordpress.com blog or a self hosted wordpress by provided your username, password, login url(if you host your blog) and your blog content.
26
+ email:
27
+ - jordan.dobson@madebysquad.com
28
+ executables: []
29
+
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - History.txt
34
+ - Manifest.txt
35
+ - README.txt
36
+ files:
37
+ - History.txt
38
+ - Manifest.txt
39
+ - README.txt
40
+ - Rakefile
41
+ - bin/wordpress
42
+ - lib/wordpress.rb
43
+ - test/test_wordpress.rb
44
+ has_rdoc: false
45
+ homepage: http://github.com/jordandobson/wordpress/tree/master
46
+ post_install_message:
47
+ rdoc_options:
48
+ - --main
49
+ - README.txt
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: "0"
57
+ version:
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ requirements: []
65
+
66
+ rubyforge_project: wordpress
67
+ rubygems_version: 1.2.0
68
+ signing_key:
69
+ specification_version: 2
70
+ summary: "The Wordpress gem provides posting to a Wordpress.com blog or a self hosted wordpress by provided your username, password, login url(if you host your blog) and your blog content. With this gem, you have access to add a text entry on Wordpress blug by providing these options: a title, body, and tags. You must include at least a title or body for your post."
71
+ test_files:
72
+ - test/test_wordpress.rb