hatenadiary 0.0.5 → 0.0.6
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/ChangeLog +9 -0
- data/README +3 -4
- data/lib/hatenadiary.rb +35 -35
- data/test/test_hatenadiary.rb +29 -24
- metadata +34 -12
data/ChangeLog
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
2011-02-24 arikui <arikui.ruby@gmail.com>
|
2
|
+
|
3
|
+
* lib/hatenadiary.rb: use constant Mechanize instead of WWW::Mechanize because
|
4
|
+
it is going to be deprecated.
|
5
|
+
|
6
|
+
* test/test_hatenadiary.rb: add #test_default_mechanizer to touch a constant Mechanize.
|
7
|
+
|
8
|
+
* Rakefile: version up to 0.0.6
|
9
|
+
|
1
10
|
2009-12-18 arikui <arikui.ruby@gmail.com>
|
2
11
|
|
3
12
|
* lib/hatenadiary.rb: remove gem() version requirement.
|
data/README
CHANGED
@@ -4,11 +4,10 @@ It is a library provides
|
|
4
4
|
a client for Hatena Diary to post and delete blog entries.
|
5
5
|
|
6
6
|
Developed on:
|
7
|
-
- ruby 1.9.
|
8
|
-
- ruby 1.8.7 (2009-06-12 patchlevel 174) [i386-mswin32]
|
7
|
+
- ruby 1.9.1p429 (2010-07-02 revision 28523) [i386-mswin32]
|
9
8
|
|
10
|
-
- Gem mechanize 0.
|
11
|
-
- Gem nokogiri 1.
|
9
|
+
- Gem mechanize 1.0.0
|
10
|
+
- Gem nokogiri 1.4.4.1
|
12
11
|
|
13
12
|
This list means these environments are enable to make all of /test pass.
|
14
13
|
|
data/lib/hatenadiary.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
2
|
# Distributes under The modified BSD license.
|
3
|
-
#
|
3
|
+
#
|
4
4
|
# Copyright (c) 2009 arikui <http://d.hatena.ne.jp/arikui1911/>
|
5
5
|
# All rights reserved.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
|
8
8
|
require 'rubygems'
|
9
9
|
require 'nokogiri'
|
@@ -18,67 +18,67 @@ module HatenaDiary
|
|
18
18
|
end
|
19
19
|
else
|
20
20
|
require 'kconv'
|
21
|
-
|
21
|
+
|
22
22
|
def encode_to_utf8(str)
|
23
23
|
Kconv.toutf8(str)
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
module_function :encode_to_utf8
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
31
|
|
32
32
|
module HatenaDiary
|
33
|
-
#
|
33
|
+
#
|
34
34
|
# Allocates Client object and makes it login, execute a received block,
|
35
35
|
# and then logout.
|
36
|
-
#
|
36
|
+
#
|
37
37
|
# :call-seq:
|
38
38
|
# login(username, password, proxy = nil){|client| ... }
|
39
|
-
#
|
39
|
+
#
|
40
40
|
def login(*args, &block)
|
41
41
|
Client.login(*args, &block)
|
42
42
|
end
|
43
43
|
module_function :login
|
44
|
-
|
44
|
+
|
45
45
|
class LoginError < RuntimeError
|
46
46
|
def set_account(username, password)
|
47
47
|
@username = username
|
48
48
|
@password = password
|
49
49
|
self
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
attr_reader :username
|
53
53
|
attr_reader :password
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
class Client
|
57
57
|
def self.mechanizer
|
58
|
-
@mechanizer ||=
|
58
|
+
@mechanizer ||= Mechanize
|
59
59
|
end
|
60
|
-
|
60
|
+
|
61
61
|
def self.mechanizer=(klass)
|
62
62
|
@mechanizer = klass
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
# Allocates Client object.
|
66
|
-
#
|
66
|
+
#
|
67
67
|
# If block given, login and execute a received block, and then logout ensurely.
|
68
|
-
#
|
68
|
+
#
|
69
69
|
# [username] Hatena ID
|
70
70
|
# [password] Password for _username_
|
71
71
|
# [proxy] Proxy configuration; [proxy_url, port_no] | nil
|
72
|
-
#
|
72
|
+
#
|
73
73
|
def self.login(username, password, proxy = nil, &block)
|
74
74
|
client = new(username, password)
|
75
75
|
client.set_proxy(*proxy) if proxy
|
76
76
|
return client unless block_given?
|
77
77
|
client.transaction(&block)
|
78
78
|
end
|
79
|
-
|
79
|
+
|
80
80
|
# Allocates Client object.
|
81
|
-
#
|
81
|
+
#
|
82
82
|
# [username] Hatena ID
|
83
83
|
# [password] Password for _username_
|
84
84
|
def initialize(username, password, agent = self.class.mechanizer.new)
|
@@ -87,12 +87,12 @@ module HatenaDiary
|
|
87
87
|
@password = password
|
88
88
|
@current_account = nil
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# Configure proxy.
|
92
92
|
def set_proxy(url, port)
|
93
93
|
@agent.set_proxy(url, port)
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
# Login and execute a received block, and then logout ensurely.
|
97
97
|
def transaction(username = nil, password = nil)
|
98
98
|
raise LocalJumpError, "no block given" unless block_given?
|
@@ -103,16 +103,16 @@ module HatenaDiary
|
|
103
103
|
logout
|
104
104
|
end
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
# Returns a client itself was logined or not.
|
108
|
-
#
|
108
|
+
#
|
109
109
|
# -> true | false
|
110
110
|
def login?
|
111
111
|
@current_account ? true : false
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
# Does login.
|
115
|
-
#
|
115
|
+
#
|
116
116
|
# If _username_ or _password_ are invalid, raises HatenaDiary::LoginError .
|
117
117
|
def login(username = nil, password = nil)
|
118
118
|
username ||= @username
|
@@ -129,7 +129,7 @@ module HatenaDiary
|
|
129
129
|
else raise Exception, '[BUG] must not happen (maybe cannot follow hatena spec)'
|
130
130
|
end
|
131
131
|
end
|
132
|
-
|
132
|
+
|
133
133
|
# Does logout if already logined.
|
134
134
|
def logout
|
135
135
|
return unless login?
|
@@ -138,11 +138,11 @@ module HatenaDiary
|
|
138
138
|
@current_account = nil
|
139
139
|
account
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
# Posts an entry to Hatena diary service.
|
143
|
-
#
|
143
|
+
#
|
144
144
|
# Raises HatenaDiary::LoginError unless logined.
|
145
|
-
#
|
145
|
+
#
|
146
146
|
# options
|
147
147
|
# [:trivial] check a checkbox of trivial updating.
|
148
148
|
# [:group] assign hatena-group name. edit group diary.
|
@@ -160,21 +160,21 @@ module HatenaDiary
|
|
160
160
|
form["trivial"] = "true" if options[:trivial]
|
161
161
|
@agent.submit form, form.button_with(:name => 'edit')
|
162
162
|
end
|
163
|
-
|
163
|
+
|
164
164
|
# Deletes an entry from Hatena diary service.
|
165
|
-
#
|
165
|
+
#
|
166
166
|
# Raises HatenaDiary::LoginError unless logined.
|
167
|
-
#
|
167
|
+
#
|
168
168
|
# options
|
169
169
|
# [:group] assign hatena-group name. edit group diary.
|
170
|
-
#
|
170
|
+
#
|
171
171
|
# Invalid options were ignored.
|
172
172
|
def delete(yyyy, mm, dd, options = {})
|
173
173
|
get_form(yyyy, mm, dd, options[:group]){|r| r.forms.last }.submit
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
private
|
177
|
-
|
177
|
+
|
178
178
|
def get_form(yyyy, mm, dd, group = nil)
|
179
179
|
raise LoginError, "not login yet" unless login?
|
180
180
|
vals = [group ? "#{group}.g" : "d",
|
data/test/test_hatenadiary.rb
CHANGED
@@ -5,18 +5,23 @@ require 'hatenadiary'
|
|
5
5
|
|
6
6
|
|
7
7
|
class TestHatenaDiaryAPI < Test::Unit::TestCase
|
8
|
+
def test_default_mechanizer
|
9
|
+
HatenaDiary::Client.mechanizer = nil
|
10
|
+
assert_equal Mechanize, HatenaDiary::Client.mechanizer
|
11
|
+
end
|
12
|
+
|
8
13
|
def setup
|
9
14
|
@username = 'USERNAME'
|
10
15
|
@password = 'PASSWORD'
|
11
16
|
@proxy_url = "PROXY_URL"
|
12
17
|
@proxy_port = "PROXY_PORT"
|
13
18
|
end
|
14
|
-
|
19
|
+
|
15
20
|
def test_api_login
|
16
21
|
HatenaDiary::Client.expects(:login)
|
17
22
|
HatenaDiary.login
|
18
23
|
end
|
19
|
-
|
24
|
+
|
20
25
|
def test_login
|
21
26
|
client = mock()
|
22
27
|
HatenaDiary::Client.expects(:new).with(@username, @password).returns(client)
|
@@ -25,7 +30,7 @@ class TestHatenaDiaryAPI < Test::Unit::TestCase
|
|
25
30
|
assert_equal 'block delegate check', str
|
26
31
|
end
|
27
32
|
end
|
28
|
-
|
33
|
+
|
29
34
|
def test_login_with_proxy
|
30
35
|
client = mock()
|
31
36
|
HatenaDiary::Client.expects(:new).with(@username, @password).returns(client)
|
@@ -35,13 +40,13 @@ class TestHatenaDiaryAPI < Test::Unit::TestCase
|
|
35
40
|
assert_equal 'block delegate check', str
|
36
41
|
end
|
37
42
|
end
|
38
|
-
|
43
|
+
|
39
44
|
def test_login_without_block
|
40
45
|
client = Object.new
|
41
46
|
HatenaDiary::Client.expects(:new).with(@username, @password).returns(client)
|
42
47
|
assert_equal client, HatenaDiary::Client.login(@username, @password)
|
43
48
|
end
|
44
|
-
|
49
|
+
|
45
50
|
def test_login_without_block_with_proxy
|
46
51
|
client = mock()
|
47
52
|
HatenaDiary::Client.expects(:new).with(@username, @password).returns(client)
|
@@ -58,18 +63,18 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
58
63
|
@agent = mock()
|
59
64
|
@client = HatenaDiary::Client.new(@username, @password, @agent)
|
60
65
|
end
|
61
|
-
|
66
|
+
|
62
67
|
def test_set_proxy
|
63
68
|
proxy_url = 'PROXY_URL'
|
64
69
|
proxy_port = 'PROXY_PORT'
|
65
70
|
@agent.expects(:set_proxy).with(proxy_url, proxy_port)
|
66
71
|
@client.set_proxy(proxy_url, proxy_port)
|
67
72
|
end
|
68
|
-
|
73
|
+
|
69
74
|
def test_logout_without_login
|
70
75
|
@client.logout
|
71
76
|
end
|
72
|
-
|
77
|
+
|
73
78
|
def login_mocking(submit_response_page_title)
|
74
79
|
login_page = mock()
|
75
80
|
form = {}
|
@@ -81,11 +86,11 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
81
86
|
response.expects(:title).returns(submit_response_page_title)
|
82
87
|
form
|
83
88
|
end
|
84
|
-
|
89
|
+
|
85
90
|
def logout_mocking
|
86
91
|
@agent.expects(:get).with("https://www.hatena.ne.jp/logout")
|
87
92
|
end
|
88
|
-
|
93
|
+
|
89
94
|
def test_login_and_logout
|
90
95
|
# before login
|
91
96
|
assert !@client.login?
|
@@ -101,7 +106,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
101
106
|
@client.logout
|
102
107
|
assert !@client.login?
|
103
108
|
end
|
104
|
-
|
109
|
+
|
105
110
|
def test_login_failure
|
106
111
|
login_mocking "Login - Hatena"
|
107
112
|
begin
|
@@ -113,7 +118,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
113
118
|
flunk "login error must be raised."
|
114
119
|
end
|
115
120
|
end
|
116
|
-
|
121
|
+
|
117
122
|
def test_login_if_hatena_changed
|
118
123
|
login_mocking "*jumbled pagetitle*"
|
119
124
|
begin
|
@@ -124,7 +129,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
124
129
|
flunk "exception must be raised"
|
125
130
|
end
|
126
131
|
end
|
127
|
-
|
132
|
+
|
128
133
|
def test_transaction
|
129
134
|
assert !@client.login?
|
130
135
|
login_mocking "Hatena"
|
@@ -135,7 +140,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
135
140
|
end
|
136
141
|
assert !@client.login?
|
137
142
|
end
|
138
|
-
|
143
|
+
|
139
144
|
def test_transaction_without_block
|
140
145
|
assert !@client.login?
|
141
146
|
assert_raises LocalJumpError do
|
@@ -143,7 +148,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
143
148
|
end
|
144
149
|
assert !@client.login?
|
145
150
|
end
|
146
|
-
|
151
|
+
|
147
152
|
def post_mocking(host, date_str)
|
148
153
|
edit_page = mock()
|
149
154
|
form = {}
|
@@ -156,7 +161,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
156
161
|
@agent.expects(:submit).with(form, button)
|
157
162
|
form
|
158
163
|
end
|
159
|
-
|
164
|
+
|
160
165
|
def test_post
|
161
166
|
form = post_mocking("d", "12340506")
|
162
167
|
@client.transaction do |client|
|
@@ -172,7 +177,7 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
172
177
|
assert_equal expected, form
|
173
178
|
assert !form["trivial"]
|
174
179
|
end
|
175
|
-
|
180
|
+
|
176
181
|
def test_post_trivial
|
177
182
|
form = post_mocking("d", "20071108")
|
178
183
|
@client.transaction do |client|
|
@@ -180,14 +185,14 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
180
185
|
end
|
181
186
|
assert_equal "true", form["trivial"]
|
182
187
|
end
|
183
|
-
|
188
|
+
|
184
189
|
def test_post_group
|
185
190
|
post_mocking "hoge.g", "12340506"
|
186
191
|
@client.transaction do |client|
|
187
192
|
client.post 1234, 5, 6, 'TITLE', 'BODY', :group => 'hoge'
|
188
193
|
end
|
189
194
|
end
|
190
|
-
|
195
|
+
|
191
196
|
def test_post_group_trivial
|
192
197
|
form = post_mocking("hoge.g", "12340506")
|
193
198
|
@client.transaction do |client|
|
@@ -195,13 +200,13 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
195
200
|
end
|
196
201
|
assert_equal "true", form["trivial"]
|
197
202
|
end
|
198
|
-
|
203
|
+
|
199
204
|
def test_post_without_login
|
200
205
|
assert_raises HatenaDiary::LoginError do
|
201
206
|
@client.post 1999, 5, 26, "TITLE", "BODY\n"
|
202
207
|
end
|
203
208
|
end
|
204
|
-
|
209
|
+
|
205
210
|
def delete_mocking(host, date_str)
|
206
211
|
edit_page = mock()
|
207
212
|
form = {}
|
@@ -214,21 +219,21 @@ class TestHatenaDiary < Test::Unit::TestCase
|
|
214
219
|
form.expects(:submit)
|
215
220
|
form
|
216
221
|
end
|
217
|
-
|
222
|
+
|
218
223
|
def test_delete
|
219
224
|
delete_mocking "d", "12340506"
|
220
225
|
@client.transaction do |client|
|
221
226
|
client.delete 1234, 5, 6
|
222
227
|
end
|
223
228
|
end
|
224
|
-
|
229
|
+
|
225
230
|
def test_delete_group
|
226
231
|
delete_mocking "piyo.g", "12340506"
|
227
232
|
@client.transaction do |client|
|
228
233
|
client.delete 1234, 5, 6, :group => 'piyo'
|
229
234
|
end
|
230
235
|
end
|
231
|
-
|
236
|
+
|
232
237
|
def test_delete_without_login
|
233
238
|
assert_raises HatenaDiary::LoginError do
|
234
239
|
@client.delete 2009, 8, 30
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hatenadiary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 19
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 6
|
10
|
+
version: 0.0.6
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- arikui
|
@@ -14,24 +20,34 @@ default_executable:
|
|
14
20
|
dependencies:
|
15
21
|
- !ruby/object:Gem::Dependency
|
16
22
|
name: mechanize
|
17
|
-
|
18
|
-
|
19
|
-
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
20
26
|
requirements:
|
21
27
|
- - ">="
|
22
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
23
32
|
version: "0"
|
24
|
-
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
25
35
|
- !ruby/object:Gem::Dependency
|
26
36
|
name: nokogiri
|
27
|
-
|
28
|
-
|
29
|
-
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
30
40
|
requirements:
|
31
41
|
- - ">="
|
32
42
|
- !ruby/object:Gem::Version
|
43
|
+
hash: 29
|
44
|
+
segments:
|
45
|
+
- 1
|
46
|
+
- 3
|
47
|
+
- 3
|
33
48
|
version: 1.3.3
|
34
|
-
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
35
51
|
description: A client for Hatena Diary to post and delete blog entries.
|
36
52
|
email: arikui.ruby@gmail.com
|
37
53
|
executables: []
|
@@ -65,21 +81,27 @@ rdoc_options:
|
|
65
81
|
require_paths:
|
66
82
|
- lib
|
67
83
|
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
68
85
|
requirements:
|
69
86
|
- - ">="
|
70
87
|
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
71
91
|
version: "0"
|
72
|
-
version:
|
73
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
74
94
|
requirements:
|
75
95
|
- - ">="
|
76
96
|
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
98
|
+
segments:
|
99
|
+
- 0
|
77
100
|
version: "0"
|
78
|
-
version:
|
79
101
|
requirements: []
|
80
102
|
|
81
103
|
rubyforge_project: hatenadiary
|
82
|
-
rubygems_version: 1.
|
104
|
+
rubygems_version: 1.5.2
|
83
105
|
signing_key:
|
84
106
|
specification_version: 3
|
85
107
|
summary: It is a library provides a client for Hatena Diary to post and delete blog entries.
|