yahoo-group-data 0.1.0 → 1.0.0
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/.gitignore +2 -1
- data/README.md +3 -1
- data/lib/yahoo-group-data/version.rb +1 -1
- data/lib/yahoo-group-data.rb +46 -8
- data/test/groups.yml +8 -8
- data/test/test_helper.rb +6 -12
- data/test/test_yahoo_group_data.rb +41 -25
- data/yahoo-group-data.gemspec +2 -0
- metadata +30 -8
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# yahoo-group-data gem
|
2
2
|
|
3
|
-
Yahoo doesn't provide an API to it's publicly available group info, so this gem covers that gap. Use it to find
|
3
|
+
Yahoo doesn't provide an API to it's publicly available group info, so this gem covers that gap. Use it to find information about a Yahoo group such as name, description and relevant email addresses.
|
4
4
|
|
5
5
|
## Example
|
6
6
|
|
@@ -83,6 +83,8 @@ after that:
|
|
83
83
|
|
84
84
|
$ rake test
|
85
85
|
|
86
|
+
Because of the dynamic nature of Yahoo groups it's quite possible that the number of members a group has in groups.yml will have diverged with the number of members in reality when you pull down the pages using "rake fetch_yahoo_pages". If you see any of these divergences just update groups.yml appropriately.
|
87
|
+
|
86
88
|
### If you find a group the gem fails on
|
87
89
|
|
88
90
|
Tell me about it, or (in preference) update the gem (Hint: start by adding an entry to the groups.yml file), see contributing instructions above.
|
data/lib/yahoo-group-data.rb
CHANGED
@@ -4,6 +4,7 @@ require 'curb'
|
|
4
4
|
require 'uri'
|
5
5
|
require 'nokogiri'
|
6
6
|
require 'date'
|
7
|
+
require 'yajl'
|
7
8
|
|
8
9
|
class YahooGroupData
|
9
10
|
def initialize(url)
|
@@ -16,7 +17,11 @@ class YahooGroupData
|
|
16
17
|
end
|
17
18
|
|
18
19
|
def name
|
19
|
-
@name ||=
|
20
|
+
@name ||= if not_found? || age_restricted?
|
21
|
+
nil
|
22
|
+
else
|
23
|
+
doc.css('span.ygrp-pname').first.content
|
24
|
+
end
|
20
25
|
end
|
21
26
|
|
22
27
|
def description
|
@@ -43,10 +48,8 @@ class YahooGroupData
|
|
43
48
|
end
|
44
49
|
|
45
50
|
def private?
|
46
|
-
|
47
|
-
|
48
|
-
doc.xpath('/html/body/div[3]/center/p/big').first.content.strip.match(/Sorry, this group is available to members ONLY./i)
|
49
|
-
) ? true : false
|
51
|
+
return nil if not_found? || matches_age_restricted?
|
52
|
+
matches_private?
|
50
53
|
end
|
51
54
|
|
52
55
|
def not_found?
|
@@ -59,7 +62,8 @@ class YahooGroupData
|
|
59
62
|
end
|
60
63
|
|
61
64
|
def age_restricted?
|
62
|
-
|
65
|
+
return nil if not_found? or matches_private?
|
66
|
+
matches_age_restricted?
|
63
67
|
end
|
64
68
|
|
65
69
|
def founded
|
@@ -71,16 +75,50 @@ class YahooGroupData
|
|
71
75
|
end
|
72
76
|
|
73
77
|
def num_members
|
74
|
-
Integer(doc.xpath('//ul[@class="ygrp-ul ygrp-info"]//li[1]').inner_html.split(':')[1]
|
78
|
+
@num_members ||= no_data? ? nil : Integer(doc.xpath('//ul[@class="ygrp-ul ygrp-info"]//li[1]').inner_html.split(':')[1])
|
75
79
|
end
|
76
80
|
|
77
81
|
def category
|
78
82
|
return unless has_category?
|
79
|
-
doc.xpath('/html/body/div[3]/table/tr/td/div[2]/div[2]/div/ul/li[2]/a').inner_html
|
83
|
+
@category ||= no_data? ? nil : doc.xpath('/html/body/div[3]/table/tr/td/div[2]/div[2]/div/ul/li[2]/a').inner_html
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_json
|
87
|
+
|
88
|
+
data_methods = %w{
|
89
|
+
private?
|
90
|
+
not_found?
|
91
|
+
age_restricted?
|
92
|
+
name
|
93
|
+
description
|
94
|
+
post_email
|
95
|
+
subscribe_email
|
96
|
+
owner_email
|
97
|
+
unsubscribe_email
|
98
|
+
language
|
99
|
+
num_members
|
100
|
+
category
|
101
|
+
founded
|
102
|
+
}
|
103
|
+
|
104
|
+
data_hash = {}
|
105
|
+
data_methods.map {|dm| data_hash[dm.tr('?', '')] = send(dm)}
|
106
|
+
Yajl::Encoder.encode(data_hash)
|
80
107
|
end
|
81
108
|
|
82
109
|
private
|
83
110
|
|
111
|
+
def matches_private?
|
112
|
+
@matches_private ||= (
|
113
|
+
doc.xpath('/html/body/div[3]/center/p/big').size > 0 and
|
114
|
+
doc.xpath('/html/body/div[3]/center/p/big').first.content.strip.match(/Sorry, this group is available to members ONLY./i)
|
115
|
+
) ? true : false
|
116
|
+
end
|
117
|
+
|
118
|
+
def matches_age_restricted?
|
119
|
+
@matches_age_restricted ||= (doc.xpath('/html/body/div[3]/div/div/div/h4').size > 0 and doc.xpath('/html/body/div[3]/div/div/div/h4').first.inner_html.strip.match(/You've reached an Age-Restricted Area/i)) ? true : false
|
120
|
+
end
|
121
|
+
|
84
122
|
def no_data?
|
85
123
|
private? or age_restricted? or not_found?
|
86
124
|
end
|
data/test/groups.yml
CHANGED
@@ -8,7 +8,7 @@ groups:
|
|
8
8
|
not_found: false
|
9
9
|
private: false
|
10
10
|
age_restricted: false
|
11
|
-
founded:
|
11
|
+
founded: 2008-06-24
|
12
12
|
language: English
|
13
13
|
num_members: 151
|
14
14
|
category: COBOL
|
@@ -25,9 +25,9 @@ groups:
|
|
25
25
|
not_found: false
|
26
26
|
private: false
|
27
27
|
age_restricted: false
|
28
|
-
founded:
|
28
|
+
founded: 2011-08-24
|
29
29
|
language: English
|
30
|
-
num_members:
|
30
|
+
num_members: 164
|
31
31
|
category: Recycling
|
32
32
|
post_email: Cambridge-Freegle@yahoogroups.com
|
33
33
|
subscribe_email: Cambridge-Freegle-subscribe@yahoogroups.com
|
@@ -93,7 +93,7 @@ groups:
|
|
93
93
|
not_found: false
|
94
94
|
private: false
|
95
95
|
age_restricted: false
|
96
|
-
founded:
|
96
|
+
founded: 2009-09-13
|
97
97
|
language: English
|
98
98
|
num_members: 1
|
99
99
|
category: Recycling
|
@@ -110,9 +110,9 @@ groups:
|
|
110
110
|
not_found: false
|
111
111
|
private: false
|
112
112
|
age_restricted: false
|
113
|
-
founded:
|
113
|
+
founded: 2007-03-30
|
114
114
|
language: English
|
115
|
-
num_members:
|
115
|
+
num_members: 2973
|
116
116
|
category:
|
117
117
|
post_email: redcar-cleveland-freegle@yahoogroups.com
|
118
118
|
subscribe_email: redcar-cleveland-freegle-subscribe@yahoogroups.com
|
@@ -120,14 +120,14 @@ groups:
|
|
120
120
|
unsubscribe_email: redcar-cleveland-freegle-unsubscribe@yahoogroups.com
|
121
121
|
|
122
122
|
# Foreign language, particularly for the date format
|
123
|
-
- id:
|
123
|
+
- id: freecycle-michelstadt
|
124
124
|
url: http://de.groups.yahoo.com/group/freecycle-michelstadt/
|
125
125
|
name: freecycle-michelstadt
|
126
126
|
description: Freecycle Michelstadt / Odenwald
|
127
127
|
not_found: false
|
128
128
|
private: false
|
129
129
|
age_restricted: false
|
130
|
-
founded:
|
130
|
+
founded: 2004-05-06
|
131
131
|
language: Deutsch
|
132
132
|
num_members: 63
|
133
133
|
category: Kostenlos
|
data/test/test_helper.rb
CHANGED
@@ -1,13 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
gsub(/mai|maj/i, "May").
|
9
|
-
gsub(/aoû|ago/i, "Aug").
|
10
|
-
gsub(/set/i, "Sep").
|
11
|
-
gsub(/okt|out/i, "Oct").
|
12
|
-
gsub(/déc|dez|dic/i, "Dec")
|
13
|
-
end
|
2
|
+
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start do
|
5
|
+
add_filter "/test/"
|
6
|
+
add_filter "lib/yahoo-group-data/version.rb"
|
7
|
+
end
|
@@ -3,8 +3,35 @@ require 'test_helper'
|
|
3
3
|
require 'webmock/test_unit'
|
4
4
|
require 'yahoo-group-data'
|
5
5
|
require 'date'
|
6
|
+
require 'yajl'
|
6
7
|
|
7
8
|
class YahooGroupDataTest < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def test_to_json
|
11
|
+
YAML.load_file('test/groups.yml')["groups"].each do |original_group|
|
12
|
+
stub_request(:get, original_group["url"]).
|
13
|
+
to_return(:status => 200, :body => File.read("test/yahoo_pages/#{original_group['id']}.html"), :headers => {})
|
14
|
+
|
15
|
+
g = YahooGroupData.new(original_group["url"])
|
16
|
+
puts original_group["url"]
|
17
|
+
data = Yajl::Parser.parse(g.to_json)
|
18
|
+
|
19
|
+
assert_equal original_group['private'], data['private']
|
20
|
+
assert_equal original_group['not_found'], data['not_found']
|
21
|
+
assert_equal original_group['age_restricted'], data['age_restricted']
|
22
|
+
assert_equal original_group['name'], data['name']
|
23
|
+
assert_equal original_group['description'], data['description']
|
24
|
+
assert_equal original_group['post_email'], data['post_email']
|
25
|
+
assert_equal original_group['subscribe_email'], data['subscribe_email']
|
26
|
+
assert_equal original_group['owner_email'], data['owner_email']
|
27
|
+
assert_equal original_group['unsubscribe_email'], data['unsubscribe_email']
|
28
|
+
assert_equal (original_group['founded'].nil? ? nil : original_group['founded'].strftime('%Y-%m-%d')), data['founded']
|
29
|
+
assert_equal original_group['language'], data['language']
|
30
|
+
assert_equal original_group['num_members'], data['num_members']
|
31
|
+
assert_equal original_group['category'], data['category']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
8
35
|
def test_initialize_with_invalid_params
|
9
36
|
assert_raise(ArgumentError) { YahooGroupData.new }
|
10
37
|
end
|
@@ -37,36 +64,25 @@ class YahooGroupDataTest < Test::Unit::TestCase
|
|
37
64
|
# (see the README on how to download them)
|
38
65
|
# then runs the assertions on each one.
|
39
66
|
def test_data_extraction
|
40
|
-
|
41
|
-
groups.each do |g_data|
|
67
|
+
YAML.load_file('test/groups.yml')["groups"].each do |g_data|
|
42
68
|
puts "fetching #{g_data["url"]}"
|
43
69
|
stub_request(:get, g_data["url"]).
|
44
70
|
to_return(:status => 200, :body => File.read("test/yahoo_pages/#{g_data['id']}.html"), :headers => {})
|
45
71
|
|
46
72
|
group = YahooGroupData.new(g_data["url"])
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
assert_equal g_data["description"], group.description
|
61
|
-
assert_equal g_data["post_email"], group.post_email
|
62
|
-
assert_equal g_data["subscribe_email"], group.subscribe_email
|
63
|
-
assert_equal g_data["owner_email"], group.owner_email
|
64
|
-
assert_equal g_data["unsubscribe_email"], group.unsubscribe_email
|
65
|
-
assert_equal Date.parse(date_str_to_english(g_data["founded"])), group.founded
|
66
|
-
assert_equal g_data["language"], group.language
|
67
|
-
assert_equal g_data["num_members"], group.num_members
|
68
|
-
assert_equal g_data["category"], group.category
|
69
|
-
end
|
73
|
+
assert_equal g_data["age_restricted"], group.age_restricted?
|
74
|
+
assert_equal g_data["private"], group.private?
|
75
|
+
assert_equal g_data["not_found"], group.not_found?
|
76
|
+
assert_equal g_data["name"], group.name
|
77
|
+
assert_equal g_data["description"], group.description
|
78
|
+
assert_equal g_data["post_email"], group.post_email
|
79
|
+
assert_equal g_data["subscribe_email"], group.subscribe_email
|
80
|
+
assert_equal g_data["owner_email"], group.owner_email
|
81
|
+
assert_equal g_data["unsubscribe_email"], group.unsubscribe_email
|
82
|
+
assert_equal g_data["founded"], group.founded
|
83
|
+
assert_equal g_data["language"], group.language
|
84
|
+
assert_equal g_data["num_members"], group.num_members
|
85
|
+
assert_equal g_data["category"], group.category
|
70
86
|
end
|
71
87
|
end
|
72
88
|
end
|
data/yahoo-group-data.gemspec
CHANGED
@@ -16,6 +16,8 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.version = YahooGroupData::VERSION
|
17
17
|
|
18
18
|
gem.add_dependency 'nokogiri', '~> 1.5'
|
19
|
+
gem.add_dependency 'yajl-ruby', '~> 1.1'
|
19
20
|
gem.add_dependency 'curb', '~> 0.8'
|
20
21
|
gem.add_development_dependency 'webmock'
|
22
|
+
gem.add_development_dependency 'simplecov'
|
21
23
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yahoo-group-data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-02-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement: &
|
16
|
+
requirement: &70311668310240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,21 @@ dependencies:
|
|
21
21
|
version: '1.5'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70311668310240
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: yajl-ruby
|
27
|
+
requirement: &70311668309540 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.1'
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70311668309540
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: curb
|
27
|
-
requirement: &
|
38
|
+
requirement: &70311668308520 !ruby/object:Gem::Requirement
|
28
39
|
none: false
|
29
40
|
requirements:
|
30
41
|
- - ~>
|
@@ -32,10 +43,21 @@ dependencies:
|
|
32
43
|
version: '0.8'
|
33
44
|
type: :runtime
|
34
45
|
prerelease: false
|
35
|
-
version_requirements: *
|
46
|
+
version_requirements: *70311668308520
|
36
47
|
- !ruby/object:Gem::Dependency
|
37
48
|
name: webmock
|
38
|
-
requirement: &
|
49
|
+
requirement: &70311668308100 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :development
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70311668308100
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: simplecov
|
60
|
+
requirement: &70311668307600 !ruby/object:Gem::Requirement
|
39
61
|
none: false
|
40
62
|
requirements:
|
41
63
|
- - ! '>='
|
@@ -43,7 +65,7 @@ dependencies:
|
|
43
65
|
version: '0'
|
44
66
|
type: :development
|
45
67
|
prerelease: false
|
46
|
-
version_requirements: *
|
68
|
+
version_requirements: *70311668307600
|
47
69
|
description: A lib to fetch public Yahoo group data
|
48
70
|
email:
|
49
71
|
- will@willj.net
|