croudia 0.0.1 → 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/README.md +20 -2
- data/Rakefile +11 -2
- data/croudia.gemspec +5 -3
- data/lib/croudia/error.rb +5 -0
- data/lib/croudia/scraper/friendships.rb +41 -2
- data/lib/croudia/scraper/login.rb +3 -1
- data/lib/croudia/scraper/parser/users.rb +10 -4
- data/lib/croudia/scraper/voices.rb +32 -0
- data/lib/croudia/scraper.rb +1 -0
- data/lib/croudia/user.rb +4 -4
- data/lib/croudia/version.rb +1 -1
- data/lib/croudia/voice.rb +1 -1
- data/spec/croudia/error_spec.rb +13 -0
- data/spec/croudia/scraper/friendships_spec.rb +61 -7
- data/spec/croudia/scraper/login_spec.rb +4 -2
- data/spec/croudia/scraper/parser/users_spec.rb +43 -7
- data/spec/croudia/scraper/users_spec.rb +6 -2
- data/spec/croudia/scraper/voices_spec.rb +89 -3
- data/spec/croudia/voice_spec.rb +1 -1
- data/spec/fixtures/follow_request.html +69 -0
- metadata +44 -7
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Croudia
|
2
2
|
|
3
|
-
A Mechanize-based
|
3
|
+
A Mechanize-based scraper for [Croudia](https://croudia.com)
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -18,7 +18,25 @@ Or install it yourself as:
|
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
```ruby
|
22
|
+
require 'croudia'
|
23
|
+
|
24
|
+
# Create a new instance
|
25
|
+
croudia = Croudia.new('username', 'password')
|
26
|
+
|
27
|
+
# Same as above
|
28
|
+
croudia = Croudia.new
|
29
|
+
croudia.login('username', 'password')
|
30
|
+
|
31
|
+
# Update status
|
32
|
+
croudia.update('Hello!')
|
33
|
+
|
34
|
+
# Follow @wktk
|
35
|
+
croudia.follow('wktk')
|
36
|
+
|
37
|
+
# Get the home timeline
|
38
|
+
croudia.timeline
|
39
|
+
```
|
22
40
|
|
23
41
|
## Contributing
|
24
42
|
|
data/Rakefile
CHANGED
@@ -1,2 +1,11 @@
|
|
1
|
-
#!/usr/bin/env rake
|
2
|
-
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
require 'rspec/core/rake_task'
|
5
|
+
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
+
spec.pattern = 'spec/**/*_spec.rb'
|
8
|
+
spec.rspec_opts = ['-cfs']
|
9
|
+
end
|
10
|
+
|
11
|
+
task :default => :spec
|
data/croudia.gemspec
CHANGED
@@ -4,8 +4,8 @@ require File.expand_path('../lib/croudia/version', __FILE__)
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
5
|
gem.authors = ['wktk']
|
6
6
|
gem.email = ['wktk@wktk.in']
|
7
|
-
gem.description = 'A Mechanize-based
|
8
|
-
gem.summary =
|
7
|
+
gem.description = 'A Mechanize-based scraper for Croudia'
|
8
|
+
gem.summary = 'Croudia scraper'
|
9
9
|
gem.homepage = 'https://github.com/wktk/croudia-gem'
|
10
10
|
|
11
11
|
gem.files = `git ls-files`.split($\)
|
@@ -16,6 +16,8 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = Croudia::VERSION
|
17
17
|
|
18
18
|
gem.add_dependency 'mechanize', '~> 2.5.1'
|
19
|
-
gem.add_development_dependency '
|
19
|
+
gem.add_development_dependency 'rake', '~> 0.9.2.2'
|
20
|
+
gem.add_development_dependency 'rdoc', '~> 3.12'
|
21
|
+
gem.add_development_dependency 'rspec', '~> 2.12.0'
|
20
22
|
gem.add_development_dependency 'webmock', '~> 1.8.7'
|
21
23
|
end
|
@@ -3,7 +3,7 @@ module Croudia
|
|
3
3
|
module Friendships
|
4
4
|
def follow(username)
|
5
5
|
require_login
|
6
|
-
post('/follows/target_follow',
|
6
|
+
post('/follows/target_follow',
|
7
7
|
:target_user_name => username,
|
8
8
|
:follow_action => 'enable',
|
9
9
|
)
|
@@ -11,12 +11,45 @@ module Croudia
|
|
11
11
|
|
12
12
|
def unfollow(username)
|
13
13
|
require_login
|
14
|
-
post('/follows/target_follow',
|
14
|
+
post('/follows/target_follow',
|
15
15
|
:target_user_name => username,
|
16
16
|
:follow_action => 'diable', # Yes, it is!
|
17
17
|
)
|
18
18
|
end
|
19
19
|
|
20
|
+
def approve(username)
|
21
|
+
require_login
|
22
|
+
post('/follows/follow_approve',
|
23
|
+
:target_user_name => username,
|
24
|
+
:follow_action => 'approve',
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
def refusal(username)
|
29
|
+
require_login
|
30
|
+
post('/follows/follow_refusal',
|
31
|
+
:target_user_name => username,
|
32
|
+
:follow_action => 'refusal',
|
33
|
+
)
|
34
|
+
end
|
35
|
+
alias refuse refusal
|
36
|
+
|
37
|
+
def block(username)
|
38
|
+
require_login
|
39
|
+
post('/blocks/setting',
|
40
|
+
:target_user_name => username,
|
41
|
+
:block_action => 'enable',
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def unblock(username)
|
46
|
+
require_login
|
47
|
+
post('/blocks/setting',
|
48
|
+
:target_user_name => username,
|
49
|
+
:block_action => 'diable', # Yes, it's diable
|
50
|
+
)
|
51
|
+
end
|
52
|
+
|
20
53
|
def following(username=nil, params={})
|
21
54
|
username = @current_user.username unless username
|
22
55
|
Parser.user_list(get("/follows/following/#{username}", params))
|
@@ -28,6 +61,12 @@ module Croudia
|
|
28
61
|
Parser.user_list(get("/follows/follower/#{username}", params))
|
29
62
|
end
|
30
63
|
alias followers follower
|
64
|
+
|
65
|
+
def follow_request
|
66
|
+
require_login
|
67
|
+
Parser.user_list(get('/follows/follow_request'))
|
68
|
+
end
|
69
|
+
alias follow_requests follow_request
|
31
70
|
end
|
32
71
|
end
|
33
72
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'croudia/error'
|
2
|
+
|
1
3
|
module Croudia
|
2
4
|
class Scraper
|
3
5
|
module Login
|
@@ -33,7 +35,7 @@ module Croudia
|
|
33
35
|
alias logged_out logged_out?
|
34
36
|
|
35
37
|
def require_login
|
36
|
-
raise 'Not logged in' if logged_out?
|
38
|
+
raise NotLoggedInError, 'Not logged in' if logged_out?
|
37
39
|
end
|
38
40
|
end
|
39
41
|
end
|
@@ -30,16 +30,22 @@ module Croudia
|
|
30
30
|
Croudia::User.new(attrs)
|
31
31
|
end
|
32
32
|
|
33
|
-
def user_list(page
|
34
|
-
user_nodes = page.parser.xpath('//div[@data-role="content"]/ul[@data-role="listview"]/li[
|
33
|
+
def user_list(page)
|
34
|
+
user_nodes = page.parser.xpath('//div[@data-role="content"]/ul[@data-role="listview"]/li[not(@data-role="list-divider")]')
|
35
35
|
users = []
|
36
|
-
user_nodes.
|
36
|
+
user_nodes.each do |user_node|
|
37
37
|
attrs = {
|
38
|
-
:username => user_node.css('a').first.attribute('href').value.sub(%r{^/}, ''),
|
39
38
|
:nickname => user_node.css('.bord').first.content,
|
40
39
|
:avatar => "#{page.uri.scheme}://#{page.uri.host}" + user_node.css('img').first.attribute('src').value,
|
41
40
|
:self_introduction => user_node.css('.fontg').first.content.strip,
|
42
41
|
}
|
42
|
+
if (links = user_node.css('a')).size.nonzero?
|
43
|
+
# For following/followers page
|
44
|
+
attrs[:username] = links.first.attribute('href').value.sub(%r{^/}, '')
|
45
|
+
elsif (forms = user_node.xpath('//form[not(contains(@action,"/follows/"))]')).size.nonzero?
|
46
|
+
# For follow_request page
|
47
|
+
attrs[:username] = forms.first.attribute('action').value.sub(%r{^/}, '')
|
48
|
+
end
|
43
49
|
if (following = user_node.css('.font1')).size.nonzero?
|
44
50
|
attrs[:following] = /#e/i !~ following.first.attribute('style').value
|
45
51
|
end
|
@@ -22,6 +22,38 @@ module Croudia
|
|
22
22
|
result = form.submit
|
23
23
|
raise 'Update failed' if result.body.include? 'error_popup'
|
24
24
|
end
|
25
|
+
|
26
|
+
def favorite(voice_id)
|
27
|
+
require_login
|
28
|
+
post('/favorites',
|
29
|
+
:favorites_action => 'enable',
|
30
|
+
:voice_id => voice_id,
|
31
|
+
)
|
32
|
+
end
|
33
|
+
|
34
|
+
def unfavorite(voice_id)
|
35
|
+
require_login
|
36
|
+
post('/favorites',
|
37
|
+
:favorites_action => 'disable',
|
38
|
+
:voice_id => voice_id,
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
def spread(voice_id)
|
43
|
+
require_login
|
44
|
+
post('/spreads/spread_voice',
|
45
|
+
:favorites_action => 'enable',
|
46
|
+
:voice_id => voice_id,
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
def unspread(voice_id)
|
51
|
+
require_login
|
52
|
+
post('/spreads/spread_voice',
|
53
|
+
:favorites_action => 'disable',
|
54
|
+
:voice_id => voice_id,
|
55
|
+
)
|
56
|
+
end
|
25
57
|
end
|
26
58
|
end
|
27
59
|
end
|
data/lib/croudia/scraper.rb
CHANGED
data/lib/croudia/user.rb
CHANGED
@@ -31,13 +31,13 @@ module Croudia
|
|
31
31
|
|
32
32
|
def initialize(*args)
|
33
33
|
super
|
34
|
-
@id =
|
35
|
-
@spreadia =
|
36
|
-
@favodia =
|
34
|
+
@id = username
|
35
|
+
@spreadia = spreadia.to_i if spreadia
|
36
|
+
@favodia = favodia.to_i if favodia
|
37
37
|
end
|
38
38
|
|
39
39
|
def to_s
|
40
|
-
|
40
|
+
username
|
41
41
|
end
|
42
42
|
end
|
43
43
|
end
|
data/lib/croudia/version.rb
CHANGED
data/lib/croudia/voice.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Croudia::Error do
|
4
|
+
it 'is a kind of Error' do
|
5
|
+
Croudia::Error.kind_of? StandardError
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
describe Croudia::NotLoggedInError do
|
10
|
+
it 'is a kind of Croudia::Error' do
|
11
|
+
Croudia::NotLoggedInError.kind_of? Croudia::Error
|
12
|
+
end
|
13
|
+
end
|
@@ -22,23 +22,67 @@ describe Croudia::Scraper::Friendships do
|
|
22
22
|
a_post('/follows/target_follow').with(:body => /target_user_name=wktk/).should have_been_made
|
23
23
|
end
|
24
24
|
end
|
25
|
+
|
26
|
+
describe '#approve' do
|
27
|
+
it 'posts to the correct resource' do
|
28
|
+
stub_post('/follows/follow_approve').to_return(:headers => {:content_type => 'text/html'})
|
29
|
+
@croudia.approve('wktk')
|
30
|
+
a_post('/follows/follow_approve').with(:body => /target_user_name=wktk/).should have_been_made
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#refusal' do
|
35
|
+
it 'posts to the correct resource' do
|
36
|
+
stub_post('/follows/follow_refusal').to_return(:headers => {:content_type => 'text/html'})
|
37
|
+
@croudia.refusal('wktk')
|
38
|
+
a_post('/follows/follow_refusal').with(:body => /target_user_name=wktk/).should have_been_made
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#block' do
|
43
|
+
it 'posts to the correct resource' do
|
44
|
+
stub_post('/blocks/setting').to_return(:headers => {:content_type => 'text/html'})
|
45
|
+
@croudia.block('wktk')
|
46
|
+
a_post('/blocks/setting').with(:body => /target_user_name=wktk/).should have_been_made
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#unblock' do
|
51
|
+
it 'posts to the correct resource' do
|
52
|
+
stub_post('/blocks/setting').to_return(:headers => {:content_type => 'text/html'})
|
53
|
+
@croudia.unblock('wktk')
|
54
|
+
a_post('/blocks/setting').with(:body => /target_user_name=wktk/).should have_been_made
|
55
|
+
end
|
56
|
+
end
|
25
57
|
end
|
26
58
|
|
27
59
|
context 'when not logged in' do
|
28
60
|
before do
|
29
61
|
@croudia = Croudia::Scraper.new
|
30
|
-
@croudia.instance_variable_set('@logged_in',
|
62
|
+
@croudia.instance_variable_set('@logged_in', false)
|
31
63
|
end
|
32
64
|
|
33
65
|
describe '#follow' do
|
34
|
-
it '
|
35
|
-
expect{ @croudia.follow('wktk') }.to raise_error
|
66
|
+
it 'raises an error' do
|
67
|
+
expect{ @croudia.follow('wktk') }.to raise_error Croudia::NotLoggedInError
|
36
68
|
end
|
37
69
|
end
|
38
70
|
|
39
71
|
describe '#unfollow' do
|
40
|
-
it '
|
41
|
-
expect{ @croudia.follow('wktk') }.to raise_error
|
72
|
+
it 'raises an error' do
|
73
|
+
expect{ @croudia.follow('wktk') }.to raise_error Croudia::NotLoggedInError
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe '#approve' do
|
78
|
+
it 'raises an error' do
|
79
|
+
expect{ @croudia.approve('wktk') }.to raise_error Croudia::NotLoggedInError
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#refusal' do
|
84
|
+
it 'raises an error' do
|
85
|
+
expect{ @croudia.refusal('wktk') }.to raise_error Croudia::NotLoggedInError
|
42
86
|
end
|
43
87
|
end
|
44
88
|
end
|
@@ -46,7 +90,7 @@ describe Croudia::Scraper::Friendships do
|
|
46
90
|
describe '#follower' do
|
47
91
|
it 'gets the correct resource' do
|
48
92
|
stub_get('/follows/follower/wktk').to_return(:headers => {:content_type => 'text/html'})
|
49
|
-
Croudia.follower('wktk')
|
93
|
+
Croudia::Scraper.new.follower('wktk')
|
50
94
|
a_get('/follows/follower/wktk').should have_been_made
|
51
95
|
end
|
52
96
|
end
|
@@ -54,8 +98,18 @@ describe Croudia::Scraper::Friendships do
|
|
54
98
|
describe '#following' do
|
55
99
|
it 'gets the correct resource' do
|
56
100
|
stub_get('/follows/following/wktk').to_return(:headers => {:content_type => 'text/html'})
|
57
|
-
Croudia.following('wktk')
|
101
|
+
Croudia::Scraper.new.following('wktk')
|
58
102
|
a_get('/follows/following/wktk').should have_been_made
|
59
103
|
end
|
60
104
|
end
|
105
|
+
|
106
|
+
describe '#follow_request' do
|
107
|
+
it 'gets the correct resource' do
|
108
|
+
stub_get('/follows/follow_request').to_return(:headers => {:content_type => 'text/html'})
|
109
|
+
@croudia = Croudia::Scraper.new
|
110
|
+
@croudia.instance_variable_set('@logged_in', true)
|
111
|
+
@croudia.follow_request
|
112
|
+
a_get('/follows/follow_request').should have_been_made
|
113
|
+
end
|
114
|
+
end
|
61
115
|
end
|
@@ -59,7 +59,7 @@ describe Croudia::Scraper::Login do
|
|
59
59
|
it 'raises an error' do
|
60
60
|
@croudia = Croudia::Scraper.new
|
61
61
|
@croudia.instance_variable_set('@logged_in', false)
|
62
|
-
expect{ @croudia.logout }.to raise_error
|
62
|
+
expect{ @croudia.logout }.to raise_error Croudia::NotLoggedInError
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
@@ -120,7 +120,9 @@ describe Croudia::Scraper::Login do
|
|
120
120
|
describe '#require_login' do
|
121
121
|
context 'when logged out' do
|
122
122
|
it 'raises an errror' do
|
123
|
-
|
123
|
+
@croudia = Croudia::Scraper.new
|
124
|
+
@croudia.instance_variable_set('@logged_in', false)
|
125
|
+
expect{ @croudia.require_login }.to raise_error Croudia::NotLoggedInError
|
124
126
|
end
|
125
127
|
end
|
126
128
|
|
@@ -154,14 +154,12 @@ describe Croudia::Scraper::Parser::Users do
|
|
154
154
|
end
|
155
155
|
|
156
156
|
describe '#user_list' do
|
157
|
-
before do
|
158
|
-
stub_get('/follows/following/wktk').to_return(:body => fixture('following_wktk'), :headers => {:content_type => 'text/html'})
|
159
|
-
stub_get('/follows/follower/wktk').to_return(:body => fixture('follower_wktk'), :headers => {:content_type => 'text/html'})
|
160
|
-
@following = Croudia.following('wktk')
|
161
|
-
@followers = Croudia.followers('wktk')
|
162
|
-
end
|
163
|
-
|
164
157
|
context 'when following list provided' do
|
158
|
+
before do
|
159
|
+
stub_get('/follows/following/wktk').to_return(:body => fixture('following_wktk'), :headers => {:content_type => 'text/html'})
|
160
|
+
@following = Croudia::Scraper.new.following('wktk')
|
161
|
+
end
|
162
|
+
|
165
163
|
it 'gets all users in the page' do
|
166
164
|
@following.size.should eq 3
|
167
165
|
end
|
@@ -208,6 +206,11 @@ describe Croudia::Scraper::Parser::Users do
|
|
208
206
|
end
|
209
207
|
|
210
208
|
context 'when follower list provided' do
|
209
|
+
before do
|
210
|
+
stub_get('/follows/follower/wktk').to_return(:body => fixture('follower_wktk'), :headers => {:content_type => 'text/html'})
|
211
|
+
@followers = Croudia::Scraper.new.follower('wktk')
|
212
|
+
end
|
213
|
+
|
211
214
|
it 'gets all users in the page' do
|
212
215
|
@followers.size.should eq 3
|
213
216
|
end
|
@@ -252,5 +255,38 @@ describe Croudia::Scraper::Parser::Users do
|
|
252
255
|
end
|
253
256
|
end
|
254
257
|
end
|
258
|
+
|
259
|
+
context 'when follow_request list provided' do
|
260
|
+
before do
|
261
|
+
stub_get('/follows/follow_request').to_return(:body => fixture('follow_request'), :headers => {:content_type => 'text/html'})
|
262
|
+
@croudia = Croudia::Scraper.new
|
263
|
+
@croudia.instance_variable_set('@logged_in', true)
|
264
|
+
@requests = @croudia.follow_request
|
265
|
+
end
|
266
|
+
|
267
|
+
it 'gets all users in the page' do
|
268
|
+
@requests.size.should eq 2
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'gets username' do
|
272
|
+
@requests[0].username.should eq 'wktk'
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'gets nickname' do
|
276
|
+
@requests[0].nickname.should eq 'wktk!'
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'gets avatar url' do
|
280
|
+
@requests[0].avatar.should eq Croudia.endpoint + '/avatar1'
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'gets description' do
|
284
|
+
@requests[0].description.should eq "Description 1\nHello"
|
285
|
+
end
|
286
|
+
|
287
|
+
it 'trims description' do
|
288
|
+
@requests[0].description.should_not match /^\s|\s$/
|
289
|
+
end
|
290
|
+
end
|
255
291
|
end
|
256
292
|
end
|
@@ -37,7 +37,9 @@ describe Croudia::Scraper::Users do
|
|
37
37
|
|
38
38
|
context 'when not logged in' do
|
39
39
|
it 'raises an error' do
|
40
|
-
|
40
|
+
@croudia = Croudia::Scraper.new
|
41
|
+
@croudia.instance_variable_set('@logged_in', false)
|
42
|
+
expect{ @croudia.current_user }.to raise_error Croudia::NotLoggedInError
|
41
43
|
end
|
42
44
|
end
|
43
45
|
end
|
@@ -67,7 +69,9 @@ describe Croudia::Scraper::Users do
|
|
67
69
|
end
|
68
70
|
|
69
71
|
it 'raises an error when not logged in' do
|
70
|
-
|
72
|
+
@croudia = Croudia::Scraper.new
|
73
|
+
@croudia.instance_variable_set('@logged_in', false)
|
74
|
+
expect{ @croudia.user }.to raise_error Croudia::NotLoggedInError
|
71
75
|
end
|
72
76
|
end
|
73
77
|
end
|
@@ -31,7 +31,9 @@ describe Croudia::Scraper::Voices do
|
|
31
31
|
|
32
32
|
context 'when not logged in' do
|
33
33
|
it 'raises an error' do
|
34
|
-
|
34
|
+
@croudia = Croudia::Scraper.new
|
35
|
+
@croudia.instance_variable_set('@logged_in', false)
|
36
|
+
expect{ @croudia.timeline }.to raise_error Croudia::NotLoggedInError
|
35
37
|
end
|
36
38
|
end
|
37
39
|
end
|
@@ -62,7 +64,9 @@ describe Croudia::Scraper::Voices do
|
|
62
64
|
|
63
65
|
context 'when not logged in' do
|
64
66
|
it 'raises an error' do
|
65
|
-
|
67
|
+
@croudia = Croudia::Scraper.new
|
68
|
+
@croudia.instance_variable_set('@logged_in', false)
|
69
|
+
expect{ @croudia.reply_list }.to raise_error Croudia::NotLoggedInError
|
66
70
|
end
|
67
71
|
end
|
68
72
|
end
|
@@ -70,7 +74,9 @@ describe Croudia::Scraper::Voices do
|
|
70
74
|
describe '#update' do
|
71
75
|
context 'when not logged in' do
|
72
76
|
it 'raises an error' do
|
73
|
-
|
77
|
+
@croudia = Croudia::Scraper.new
|
78
|
+
@croudia.instance_variable_set('@logged_in', false)
|
79
|
+
expect{ @croudia.update('Hi') }.to raise_error Croudia::NotLoggedInError
|
74
80
|
end
|
75
81
|
end
|
76
82
|
|
@@ -89,4 +95,84 @@ describe Croudia::Scraper::Voices do
|
|
89
95
|
end
|
90
96
|
end
|
91
97
|
end
|
98
|
+
|
99
|
+
describe '#favorite' do
|
100
|
+
context 'when not logged in' do
|
101
|
+
it 'raises an error' do
|
102
|
+
@croudia = Croudia::Scraper.new
|
103
|
+
@croudia.instance_variable_set('@logged_in', false)
|
104
|
+
expect{ @croudia.favorite('1') }.to raise_error Croudia::NotLoggedInError
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context 'when logged in' do
|
109
|
+
it 'posts to the correct resource' do
|
110
|
+
@croudia = Croudia::Scraper.new
|
111
|
+
@croudia.instance_variable_set('@logged_in', true)
|
112
|
+
stub_post('/favorites').to_return(:headers => {:content_type => 'text/html'})
|
113
|
+
@croudia.favorite('1')
|
114
|
+
a_post('/favorites').with(:body => /favorites_action=enable/).should have_been_made
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#unfavorite' do
|
120
|
+
context 'when not logged in' do
|
121
|
+
it 'raises an error' do
|
122
|
+
@croudia = Croudia::Scraper.new
|
123
|
+
@croudia.instance_variable_set('@logged_in', false)
|
124
|
+
expect{ @croudia.unfavorite('1') }.to raise_error Croudia::NotLoggedInError
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context 'when logged in' do
|
129
|
+
it 'posts to the correct resource' do
|
130
|
+
@croudia = Croudia::Scraper.new
|
131
|
+
@croudia.instance_variable_set('@logged_in', true)
|
132
|
+
stub_post('/favorites').to_return(:headers => {:content_type => 'text/html'})
|
133
|
+
@croudia.unfavorite('1')
|
134
|
+
a_post('/favorites').with(:body => /favorites_action=disable/).should have_been_made
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe '#spread' do
|
140
|
+
context 'when not logged in' do
|
141
|
+
it 'raises an error' do
|
142
|
+
@croudia = Croudia::Scraper.new
|
143
|
+
@croudia.instance_variable_set('@logged_in', false)
|
144
|
+
expect{ @croudia.spread('1') }.to raise_error Croudia::NotLoggedInError
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'when logged in' do
|
149
|
+
it 'posts to the correct resource' do
|
150
|
+
@croudia = Croudia::Scraper.new
|
151
|
+
@croudia.instance_variable_set('@logged_in', true)
|
152
|
+
stub_post('/spreads/spread_voice').to_return(:headers => {:content_type => 'text/html'})
|
153
|
+
@croudia.spread('1')
|
154
|
+
a_post('/spreads/spread_voice').with(:body => /favorites_action=enable/).should have_been_made
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe '#unspread' do
|
160
|
+
context 'when not logged in' do
|
161
|
+
it 'raises an error' do
|
162
|
+
@croudia = Croudia::Scraper.new
|
163
|
+
@croudia.instance_variable_set('@logged_in', false)
|
164
|
+
expect{ @croudia.unspread('1') }.to raise_error Croudia::NotLoggedInError
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'when logged in' do
|
169
|
+
it 'posts to the correct resource' do
|
170
|
+
@croudia = Croudia::Scraper.new
|
171
|
+
@croudia.instance_variable_set('@logged_in', true)
|
172
|
+
stub_post('/spreads/spread_voice').to_return(:headers => {:content_type => 'text/html'})
|
173
|
+
@croudia.unspread('1')
|
174
|
+
a_post('/spreads/spread_voice').with(:body => /favorites_action=disable/).should have_been_made
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
92
178
|
end
|
data/spec/croudia/voice_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Croudia::Voice do
|
|
4
4
|
describe '#to_s' do
|
5
5
|
it 'returns "@username: text"' do
|
6
6
|
user = Croudia::User.new(:username => 'wktk')
|
7
|
-
Croudia::Voice.new(:user => user, :
|
7
|
+
Croudia::Voice.new(:user => user, :voice_desc => 'Hello!').to_s.should eq '@wktk: Hello!'
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Croudia(クローディア)</title>
|
6
|
+
<meta content="authenticity_token" name="csrf-param">
|
7
|
+
<meta content="dummy_csrf_token" name="csrf-token">
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
<div data-role="page" data-dom-cache="false" class="no-cache" data-url="/follows/follow_request" data-id="hedder1" id="follow_request">
|
11
|
+
<div data-role="content">
|
12
|
+
<ul data-role="listview" data-split-icon="gear" id="follower_list" data-theme="c" data-dividertheme="i">
|
13
|
+
<li data-role="list-divider" class="bar">@testuser宛てのフォローリクエスト</li>
|
14
|
+
<li>
|
15
|
+
<img src="/avatar1" alt="wktk!" class="ui-li-icon avatar">
|
16
|
+
<p>
|
17
|
+
<span class="bord">wktk!</span>
|
18
|
+
<span class="gray">@wktk</span>
|
19
|
+
</p>
|
20
|
+
<!--
|
21
|
+
フォロー:10<br>
|
22
|
+
フォロワー:10
|
23
|
+
<a href="/follows/menu" data-rel="dialog" data-transition="slideup"></a>
|
24
|
+
-->
|
25
|
+
<p class="fontg" style="font-size:12px;">
|
26
|
+
Description 1
|
27
|
+
Hello
|
28
|
+
<form action="/follows/approve_dialog/wktk" method="get">
|
29
|
+
<button type="submit" data-theme="b">承認する</button>
|
30
|
+
</form>
|
31
|
+
<form action="/follows/refusal_dialog/wktk" method="get">
|
32
|
+
<button type="submit" data-theme="test">拒否する</button>
|
33
|
+
</form>
|
34
|
+
<form action="/wktk" method="get">
|
35
|
+
<button type="submit" data-theme="c">プロフィールを確認</button>
|
36
|
+
</form>
|
37
|
+
</p>
|
38
|
+
</li>
|
39
|
+
<li>
|
40
|
+
<img src="/avatar2" alt="testuser1" class="ui-li-icon avatar">
|
41
|
+
<p>
|
42
|
+
<span class="bord">testuser1</span>
|
43
|
+
<span class="gray">@testuser1</span>
|
44
|
+
</p>
|
45
|
+
<!--
|
46
|
+
フォロー:10<br>
|
47
|
+
フォロワー:10
|
48
|
+
<a href="/follows/menu" data-rel="dialog" data-transition="slideup"></a>
|
49
|
+
-->
|
50
|
+
<p class="fontg" style="font-size:12px;">
|
51
|
+
This is a test description.
|
52
|
+
Hi, hi!
|
53
|
+
<form action="/follows/approve_dialog/testuser1" method="get">
|
54
|
+
<button type="submit" data-theme="b">承認する</button>
|
55
|
+
</form>
|
56
|
+
<form action="/follows/refusal_dialog/testuser1" method="get">
|
57
|
+
<button type="submit" data-theme="test">拒否する</button>
|
58
|
+
</form>
|
59
|
+
<form action="/testuser1" method="get">
|
60
|
+
<button type="submit" data-theme="c">プロフィールを確認</button>
|
61
|
+
</form>
|
62
|
+
</p>
|
63
|
+
</li>
|
64
|
+
</ul>
|
65
|
+
<br>
|
66
|
+
</div>
|
67
|
+
</div>
|
68
|
+
</body>
|
69
|
+
</html>
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: croudia
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: mechanize
|
@@ -27,6 +27,38 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 2.5.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.9.2.2
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.2.2
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rdoc
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '3.12'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.12'
|
30
62
|
- !ruby/object:Gem::Dependency
|
31
63
|
name: rspec
|
32
64
|
requirement: !ruby/object:Gem::Requirement
|
@@ -34,7 +66,7 @@ dependencies:
|
|
34
66
|
requirements:
|
35
67
|
- - ~>
|
36
68
|
- !ruby/object:Gem::Version
|
37
|
-
version: 2.
|
69
|
+
version: 2.12.0
|
38
70
|
type: :development
|
39
71
|
prerelease: false
|
40
72
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -42,7 +74,7 @@ dependencies:
|
|
42
74
|
requirements:
|
43
75
|
- - ~>
|
44
76
|
- !ruby/object:Gem::Version
|
45
|
-
version: 2.
|
77
|
+
version: 2.12.0
|
46
78
|
- !ruby/object:Gem::Dependency
|
47
79
|
name: webmock
|
48
80
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,7 +91,7 @@ dependencies:
|
|
59
91
|
- - ~>
|
60
92
|
- !ruby/object:Gem::Version
|
61
93
|
version: 1.8.7
|
62
|
-
description: A Mechanize-based
|
94
|
+
description: A Mechanize-based scraper for Croudia
|
63
95
|
email:
|
64
96
|
- wktk@wktk.in
|
65
97
|
executables: []
|
@@ -74,6 +106,7 @@ files:
|
|
74
106
|
- croudia.gemspec
|
75
107
|
- lib/croudia.rb
|
76
108
|
- lib/croudia/api.rb
|
109
|
+
- lib/croudia/error.rb
|
77
110
|
- lib/croudia/identity.rb
|
78
111
|
- lib/croudia/scraper.rb
|
79
112
|
- lib/croudia/scraper/friendships.rb
|
@@ -87,6 +120,7 @@ files:
|
|
87
120
|
- lib/croudia/version.rb
|
88
121
|
- lib/croudia/voice.rb
|
89
122
|
- spec/croudia/api_spec.rb
|
123
|
+
- spec/croudia/error_spec.rb
|
90
124
|
- spec/croudia/identity_spec.rb
|
91
125
|
- spec/croudia/scraper/friendships_spec.rb
|
92
126
|
- spec/croudia/scraper/login_spec.rb
|
@@ -99,6 +133,7 @@ files:
|
|
99
133
|
- spec/croudia/version_spec.rb
|
100
134
|
- spec/croudia/voice_spec.rb
|
101
135
|
- spec/croudia_spec.rb
|
136
|
+
- spec/fixtures/follow_request.html
|
102
137
|
- spec/fixtures/follower_wktk.html
|
103
138
|
- spec/fixtures/following_wktk.html
|
104
139
|
- spec/fixtures/user_wktk1.html
|
@@ -128,12 +163,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
163
|
version: '0'
|
129
164
|
requirements: []
|
130
165
|
rubyforge_project:
|
131
|
-
rubygems_version: 1.8.
|
166
|
+
rubygems_version: 1.8.24
|
132
167
|
signing_key:
|
133
168
|
specification_version: 3
|
134
|
-
summary:
|
169
|
+
summary: Croudia scraper
|
135
170
|
test_files:
|
136
171
|
- spec/croudia/api_spec.rb
|
172
|
+
- spec/croudia/error_spec.rb
|
137
173
|
- spec/croudia/identity_spec.rb
|
138
174
|
- spec/croudia/scraper/friendships_spec.rb
|
139
175
|
- spec/croudia/scraper/login_spec.rb
|
@@ -146,6 +182,7 @@ test_files:
|
|
146
182
|
- spec/croudia/version_spec.rb
|
147
183
|
- spec/croudia/voice_spec.rb
|
148
184
|
- spec/croudia_spec.rb
|
185
|
+
- spec/fixtures/follow_request.html
|
149
186
|
- spec/fixtures/follower_wktk.html
|
150
187
|
- spec/fixtures/following_wktk.html
|
151
188
|
- spec/fixtures/user_wktk1.html
|