desuraify 0.0.5.pre → 0.0.7
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.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +8 -9
- data/lib/desuraify/base.rb +44 -107
- data/lib/desuraify/company.rb +3 -3
- data/lib/desuraify/engine.rb +4 -2
- data/lib/desuraify/game.rb +4 -4
- data/lib/desuraify/member.rb +28 -4
- data/lib/desuraify/version.rb +1 -1
- data/tests/company/company_spec.rb +87 -0
- data/tests/desuraify_spec.rb +9 -0
- data/tests/engine/engine_spec.rb +139 -0
- data/tests/game/game_spec.rb +202 -0
- data/tests/member/member_spec.rb +74 -0
- metadata +9 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d3f974d4084840430812f963f50fb0e0e4beb848
|
4
|
+
data.tar.gz: 02c0d4e2f13e8fb1ad4bfb015713e577845841cd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c72d769244e50e74160f1a99ce2126f7b7141e43e5ffbb762b18170fda2cb5803a15fa50e86048c8b03eca3ce5580ac8966bab8723679a897321bc7cdef7eb7
|
7
|
+
data.tar.gz: 7a7f994e7375c074aecaaca69dfe94f529dfe7772f4b5617afe488556eaeba3a232394876baa767d8839180e2687e03aa96f85a4ebbf108e95ee33df5d25a32c
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ And then execute:
|
|
14
14
|
|
15
15
|
Or install it yourself as:
|
16
16
|
|
17
|
-
$ gem install desuraify
|
17
|
+
$ gem install desuraify --pre
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
```
|
@@ -62,21 +62,20 @@ Or install it yourself as:
|
|
62
62
|
=> "illwinter-game-design"
|
63
63
|
```
|
64
64
|
|
65
|
-
\# numerous other attributes are available
|
65
|
+
\# numerous other attributes are available
|
66
66
|
```
|
67
67
|
puts Desuraify::Game::ATTRIBUTES.inspect
|
68
68
|
or
|
69
|
-
puts game.attributes
|
69
|
+
puts game.attributes
|
70
70
|
```
|
71
71
|
|
72
|
-
## TODO
|
72
|
+
## TODO
|
73
73
|
|
74
|
-
1.
|
75
|
-
2. Gather
|
76
|
-
|
77
|
-
4. Gather Company data
|
74
|
+
1. Gather Engine data - June 12, 2015
|
75
|
+
2. Gather Member data - July 21, 2015
|
76
|
+
4. Gather Company data - June 13, 2015
|
78
77
|
5. Documentation...
|
79
|
-
6. Tests
|
78
|
+
6. Tests - July 21, 2015
|
80
79
|
|
81
80
|
## Contributing
|
82
81
|
|
data/lib/desuraify/base.rb
CHANGED
@@ -53,6 +53,8 @@ module Desuraify
|
|
53
53
|
headers.each do |header|
|
54
54
|
next if header.text.strip.empty?
|
55
55
|
|
56
|
+
attribute = header.text.strip.split(" ").join("_").downcase.intern
|
57
|
+
|
56
58
|
case header.text.strip
|
57
59
|
when /^Platforms?$/i
|
58
60
|
|
@@ -71,53 +73,30 @@ module Desuraify
|
|
71
73
|
eng
|
72
74
|
end.uniq
|
73
75
|
|
74
|
-
when
|
75
|
-
|
76
|
-
result[:engine_count] = header.next.next.text.strip.to_i rescue nil
|
76
|
+
when /^Developers?/i, /Publishers?$/i
|
77
77
|
|
78
|
-
|
78
|
+
attribute = header.text.downcase
|
79
|
+
attribute << "s" unless attribute[-1] == "s"
|
79
80
|
|
80
|
-
result[
|
81
|
-
|
82
|
-
end.map do |
|
83
|
-
|
84
|
-
|
85
|
-
href =
|
86
|
-
|
87
|
-
|
88
|
-
|
81
|
+
result[attribute.intern] = header.parent.children.select do |entity|
|
82
|
+
entity unless entity == header || entity.text.strip.empty?
|
83
|
+
end.map do |entity|
|
84
|
+
target = Hash.new
|
85
|
+
target[:name] = entity.text.strip
|
86
|
+
href = entity.child.attribute('href').value.split('/')
|
87
|
+
target[:company] = !!href.find{|company| company.match(/^company$/i)}
|
88
|
+
target[:id] = href.last
|
89
|
+
target
|
89
90
|
end.uniq
|
90
91
|
|
91
|
-
when /
|
92
|
-
|
93
|
-
result[:publishers] = header.parent.children.select do |publisher|
|
94
|
-
publisher unless publisher == header || publisher.text.strip.empty?
|
95
|
-
end.map do |pub|
|
96
|
-
publisher = Hash.new
|
97
|
-
publisher[:name] = pub.text.strip
|
98
|
-
href = pub.child.attribute('href').value.split('/')
|
99
|
-
publisher[:company] = !!href.find{|company| company.match(/^company$/i)}
|
100
|
-
publisher[:id] = href.last
|
101
|
-
publisher
|
102
|
-
end.uniq
|
103
|
-
|
104
|
-
when /Languages?/i
|
105
|
-
|
106
|
-
result[:languages] = header.parent.children.select do |language|
|
107
|
-
language unless language == header || language.text.strip.empty?
|
108
|
-
end.map! {|language| language.text.strip }.uniq
|
92
|
+
when /Languages?/i, /^Genres?/i, /^Themes?$/i, "Players", /^Projects?$/
|
109
93
|
|
110
|
-
|
94
|
+
attribute = header.text.downcase
|
95
|
+
attribute << "s" unless attribute[-1] == "s"
|
111
96
|
|
112
|
-
result[
|
113
|
-
|
114
|
-
end.map {|
|
115
|
-
|
116
|
-
when /^Themes?$/i
|
117
|
-
|
118
|
-
result[:themes] = header.parent.children.select do |theme|
|
119
|
-
theme unless theme == header || theme.text.strip.empty?
|
120
|
-
end.map {|theme| theme.text.strip }.uniq
|
97
|
+
result[attribute.intern] = header.parent.children.select do |entity|
|
98
|
+
entity unless entity == header || entity.text.strip.empty?
|
99
|
+
end.map! {|entity| entity.text.strip }.uniq
|
121
100
|
|
122
101
|
when /^This game is an expansion for\s+?/i
|
123
102
|
|
@@ -128,86 +107,39 @@ module Desuraify
|
|
128
107
|
expansion[:id] = header.parent.search('a').attribute('href').value.split('/').last.strip
|
129
108
|
result[:expansion] = expansion
|
130
109
|
|
131
|
-
when /^Projects?$/
|
132
|
-
|
133
|
-
result[:project] = header.parent.children.select do |project|
|
134
|
-
project unless project == header || project.text.strip.empty?
|
135
|
-
end.map {|project| project.text.strip }.uniq
|
136
|
-
|
137
|
-
when "Players"
|
138
|
-
|
139
|
-
result[:players] = header.parent.children.select do |player|
|
140
|
-
player unless player == header || player.text.strip.empty?
|
141
|
-
end.map{|player| player.text.strip }.uniq
|
142
|
-
|
143
110
|
when "Boxshot"
|
144
111
|
|
145
|
-
result[
|
112
|
+
result[attribute] = header.parent.search('a').attribute('href').value.strip rescue nil
|
146
113
|
|
147
114
|
when "Last Update"
|
148
115
|
|
149
116
|
result[:updated] = header.next.next.text.strip rescue nil
|
150
117
|
|
151
|
-
when "
|
152
|
-
|
153
|
-
result[:license] = header.next.next.text.strip rescue nil
|
154
|
-
|
155
|
-
when "Release Date"
|
156
|
-
|
157
|
-
result[:release_date] = header.next.next.text.strip rescue nil
|
158
|
-
|
159
|
-
when "Watchers"
|
160
|
-
|
161
|
-
result[:watchers] = header.next.next.text.strip rescue nil
|
162
|
-
|
163
|
-
when "Images"
|
118
|
+
when "News", "Members", "Videos", "Games", "Images", "Engines"
|
164
119
|
|
165
|
-
|
120
|
+
attribute = header.text.strip.split(" ").push("count").join("_").downcase.intern
|
121
|
+
result[attribute] = header.next.next.text.strip.to_i rescue nil
|
166
122
|
|
167
|
-
when "Games"
|
168
123
|
|
169
|
-
|
170
|
-
|
171
|
-
when "News"
|
172
|
-
|
173
|
-
result[:news_count] = header.next.next.text.strip.to_i rescue nil
|
174
|
-
|
175
|
-
when "Rank"
|
176
|
-
|
177
|
-
result[:rank] = header.next.next.text.strip rescue nil
|
178
|
-
|
179
|
-
when "Videos"
|
180
|
-
|
181
|
-
result[:video_count] = header.next.next.text.strip.to_i rescue nil
|
182
|
-
|
183
|
-
when "Visits"
|
124
|
+
when "Visits", "Profile Visitors"
|
184
125
|
|
185
126
|
result[:visits] = header.next.next.text.strip rescue nil
|
186
127
|
|
187
|
-
when "Official Page"
|
188
|
-
|
189
|
-
result[:official_page] = header.parent.search('a').attribute('href').value.strip rescue nil
|
190
|
-
|
191
|
-
|
192
|
-
when "Homepage"
|
128
|
+
when "Official Page", "Homepage"
|
193
129
|
|
194
130
|
result[:official_page] = header.parent.search('a').attribute('href').value.strip rescue nil
|
195
131
|
|
196
|
-
when "
|
197
|
-
|
198
|
-
result[:member_count] = header.next.next.text.strip.to_i rescue nil
|
132
|
+
when "Offline Since"
|
199
133
|
|
200
|
-
|
134
|
+
result[:offline] = header.next.next.text.strip rescue nil
|
201
135
|
|
202
|
-
|
136
|
+
when "Activity Points"
|
203
137
|
|
204
|
-
|
138
|
+
result[:activity_points] = header.next.next.text.strip.to_i rescue nil
|
205
139
|
|
206
|
-
|
140
|
+
when "Company", "Office", "Time Online", "Site Visits", /^Gender/, /^Country/, "Established", "Watchers", "Rank", "License", "Release Date", "Phone"
|
207
141
|
|
208
|
-
|
209
|
-
|
210
|
-
result[:office] = header.next.next.text.strip rescue nil
|
142
|
+
result[attribute] = header.next.next.text.strip rescue nil
|
211
143
|
|
212
144
|
when "Address"
|
213
145
|
|
@@ -221,30 +153,35 @@ module Desuraify
|
|
221
153
|
|
222
154
|
result[:address] = addresses.map { |address| address.split("\n") }.flatten
|
223
155
|
|
224
|
-
when "Phone"
|
225
|
-
|
226
|
-
result[:phone] = header.next.next.text.strip rescue nil
|
227
156
|
end
|
228
157
|
|
229
158
|
end
|
230
159
|
|
160
|
+
result[:engines_count] = result[:engines_count] || 0
|
161
|
+
result[:images_count] = result[:images_count] || 0
|
162
|
+
result[:videos_count] = result[:videos_count] || 0
|
163
|
+
result[:games_count] = result[:games_count] || 0
|
164
|
+
result[:news_count] = result[:news_count] || 0
|
165
|
+
|
231
166
|
result
|
232
167
|
end
|
233
168
|
|
234
169
|
def parse_similar(doc, img_count=0, vid_count=0)
|
235
170
|
result = Hash.new
|
236
171
|
|
237
|
-
result[:rating] = doc.at_css('.score').text.strip rescue nil
|
172
|
+
result[:rating] = doc.at_css('.score').text.strip.to_f rescue nil
|
173
|
+
result[:level] = result[:rating]
|
238
174
|
|
239
175
|
result[:videos] = doc.css('.videobox').search('a').map do |video|
|
240
176
|
values = video.attribute('href').value.strip.split('/')
|
241
177
|
values.pop
|
242
178
|
"http://www.desura.com#{values.join('/')}"
|
243
179
|
end rescue nil
|
244
|
-
|
180
|
+
|
181
|
+
result[:videos] = rss_update(video_rss) if result[:videos].size < vid_count rescue nil
|
245
182
|
|
246
183
|
result[:images] = doc.css('.mediaitem').search('a').select{|item| item if item.attribute('href').value.match(/^https?/i) }.map{|pic| pic.attribute('href').value.strip }
|
247
|
-
result[:images] = rss_update(image_rss) if result[:images].size < img_count
|
184
|
+
result[:images] = rss_update(image_rss) if result[:images].size < img_count rescue nil
|
248
185
|
|
249
186
|
result[:summary] = doc.at_css('.body.clear').search('p').map{ |paragraph| paragraph.text.strip }
|
250
187
|
result[:page_title] = doc.css('title').text.strip
|
@@ -290,4 +227,4 @@ module Desuraify
|
|
290
227
|
end
|
291
228
|
|
292
229
|
end
|
293
|
-
end
|
230
|
+
end
|
data/lib/desuraify/company.rb
CHANGED
@@ -2,9 +2,9 @@ module Desuraify
|
|
2
2
|
class Company < Base
|
3
3
|
|
4
4
|
ATTRIBUTES = [
|
5
|
-
:
|
6
|
-
:
|
7
|
-
:
|
5
|
+
:address, :company, :engines_count, :games_count, :html, :images, :images_count,
|
6
|
+
:members, :members_count, :news_count, :office, :official_page, :phone, :rank,
|
7
|
+
:videos, :videos_count, :visits, :watchers
|
8
8
|
]
|
9
9
|
|
10
10
|
attr_reader *ATTRIBUTES
|
data/lib/desuraify/engine.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
module Desuraify
|
2
2
|
class Engine < Base
|
3
3
|
ATTRIBUTES = [
|
4
|
-
:developers, :games, :
|
4
|
+
:developers, :games, :games_count, :html, :images, :images_count, :license, :news,
|
5
5
|
:news_count, :official_page, :page_title, :platforms, :publishers, :rank,
|
6
6
|
:rating, :release_date, :reviews, :summary, :title, :updated, :videos,
|
7
|
-
:
|
7
|
+
:videos_count, :visits, :watchers
|
8
8
|
]
|
9
9
|
|
10
10
|
attr_reader *ATTRIBUTES
|
@@ -21,6 +21,8 @@ module Desuraify
|
|
21
21
|
result.merge!(parse_similar(doc, result[:image_count], result[:video_count]))
|
22
22
|
result[:html] = html
|
23
23
|
|
24
|
+
result[:publishers] = result[:developers].map{ |dev| dev.dup } unless result[:publishers] if result[:developers]
|
25
|
+
|
24
26
|
result
|
25
27
|
|
26
28
|
end
|
data/lib/desuraify/game.rb
CHANGED
@@ -3,10 +3,10 @@ module Desuraify
|
|
3
3
|
class Game < Base
|
4
4
|
ATTRIBUTES = [
|
5
5
|
:boxshot, :developers, :engines, :expansion, :genres, :html,
|
6
|
-
:
|
7
|
-
:original_price, :page_title, :platforms, :players, :price, :
|
6
|
+
:images_count, :images, :languages, :news, :news_count, :official_page,
|
7
|
+
:original_price, :page_title, :platforms, :players, :price, :projects,
|
8
8
|
:publishers, :rank, :rating, :reviews, :summary, :themes, :title,
|
9
|
-
:updated, :
|
9
|
+
:updated, :videos, :videos_count, :visits, :watchers
|
10
10
|
]
|
11
11
|
|
12
12
|
attr_reader *ATTRIBUTES
|
@@ -56,4 +56,4 @@ module Desuraify
|
|
56
56
|
end
|
57
57
|
|
58
58
|
end # end of class
|
59
|
-
end
|
59
|
+
end
|
data/lib/desuraify/member.rb
CHANGED
@@ -2,17 +2,41 @@ module Desuraify
|
|
2
2
|
class Member < Base
|
3
3
|
|
4
4
|
ATTRIBUTES = [
|
5
|
-
|
5
|
+
:activity_points, :comments, :country, :gender, :html, :images, :images_count,
|
6
|
+
:level, :offline, :rank, :site_visits, :time_online, :videos, :videos_count,
|
7
|
+
:visits, :watchers
|
6
8
|
]
|
7
9
|
|
8
|
-
|
10
|
+
attr_reader *ATTRIBUTES
|
11
|
+
|
12
|
+
def initialize(id, options={})
|
9
13
|
super(id, options)
|
10
14
|
end
|
11
15
|
|
16
|
+
def parse(html)
|
17
|
+
doc = Nokogiri::HTML(html)
|
18
|
+
|
19
|
+
result = parse_headers(doc.css('h5'))
|
20
|
+
result.merge!(parse_similar(doc, result[:image_count], result[:video_count]))
|
21
|
+
result[:html] = html
|
22
|
+
|
23
|
+
result
|
24
|
+
end
|
25
|
+
|
12
26
|
def attributes
|
13
27
|
ATTRIBUTES
|
14
28
|
end
|
29
|
+
|
30
|
+
def url
|
31
|
+
"http://www.desura.com/members/#{@id}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def image_rss
|
35
|
+
"http://rss.desura.com/members/#{@id}/images/feed/rss.xml"
|
36
|
+
end
|
37
|
+
|
38
|
+
def video_rss
|
39
|
+
"http://rss.desura.com/members/#{@id}/videos/feed/rss.xml"
|
40
|
+
end
|
15
41
|
end
|
16
42
|
end
|
17
|
-
|
18
|
-
# http://rss.desura.com/games/arbalest-3035/images/feed/rss.xml
|
data/lib/desuraify/version.rb
CHANGED
@@ -0,0 +1,87 @@
|
|
1
|
+
require_relative '../../lib/desuraify'
|
2
|
+
|
3
|
+
RSpec.describe Desuraify::Company do
|
4
|
+
before do
|
5
|
+
@company = Desuraify::Company.new('illwinter-game-design')
|
6
|
+
@company.update
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'company data' do
|
10
|
+
it 'should have an address array' do
|
11
|
+
expect(@company.address.class).to eq(Array)
|
12
|
+
expect(@company.address).not_to eq([])
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have a company' do
|
16
|
+
expect(@company.company.class).to eq(String)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have an engines_count' do
|
20
|
+
expect(@company.engines_count.class).to eq(Fixnum)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should have a games_count' do
|
24
|
+
expect(@company.games_count.class).to eq(Fixnum)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should have the html page available' do
|
28
|
+
expect(@company.html.class).to eq(String)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should have an array of images' do
|
32
|
+
expect(@company.images.class).to eq(Array)
|
33
|
+
expect(@company.images).to eq([])
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should have an images_count' do
|
37
|
+
expect(@company.images_count.class).to eq(Fixnum)
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should have a members_count' do
|
41
|
+
expect(@company.members_count.class).to eq(Fixnum)
|
42
|
+
end
|
43
|
+
|
44
|
+
# not yet implemented
|
45
|
+
# it 'should have a members array' do
|
46
|
+
# expect(@company.members.class).to eq(Array)
|
47
|
+
# expect(@company.members).not_to eq([])
|
48
|
+
# end
|
49
|
+
|
50
|
+
it 'should have a news_count' do
|
51
|
+
expect(@company.news_count.class).to eq(Fixnum)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should have an office' do
|
55
|
+
expect(@company.office.class).to eq(String)
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should have an official_page' do
|
59
|
+
expect(@company.official_page.class).to eq(String)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should have a phone' do
|
63
|
+
expect(@company.phone.class).to eq(String)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should have a rank' do
|
67
|
+
expect(@company.rank.class).to eq(String)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should have an array of videos' do
|
71
|
+
expect(@company.videos.class).to eq(Array)
|
72
|
+
# expect(@company.videos).not_to eq([])
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'should have a videos_count' do
|
76
|
+
expect(@company.videos_count.class).to eq(Fixnum)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should have a visits attribute' do
|
80
|
+
expect(@company.visits.class).to eq(String)
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'should have a watchers attribute' do
|
84
|
+
expect(@company.watchers.class).to eq(String)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require_relative '../../lib/desuraify'
|
2
|
+
|
3
|
+
RSpec.describe Desuraify::Engine do
|
4
|
+
before do
|
5
|
+
@engine = Desuraify::Engine.new('unity')
|
6
|
+
@engine.update
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'engine data' do
|
10
|
+
describe "developers" do
|
11
|
+
it 'should have an array of developer hashes' do
|
12
|
+
expect(@engine.developers.class).to eq(Array)
|
13
|
+
expect(@engine.developers).not_to eq([])
|
14
|
+
expect(@engine.developers.first.class).to eq(Hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should have attributes in the developer hash' do
|
18
|
+
expect(@engine.developers.first[:name].class).to eq(String)
|
19
|
+
expect([TrueClass, FalseClass].include?(@engine.developers.first[:company].class)).to eq(true)
|
20
|
+
expect(@engine.developers.first[:id].class).to eq(String)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# not yet implemented
|
25
|
+
# it 'should have an array of games' do
|
26
|
+
# expect(@engine.games.class).to eq(Array)
|
27
|
+
# expect(@engine.games).not_to eq([])
|
28
|
+
# end
|
29
|
+
|
30
|
+
it 'should have a games_count attribute' do
|
31
|
+
expect(@engine.games_count.class).to eq(Fixnum)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should have the html page available' do
|
35
|
+
expect(@engine.html).not_to eq(nil)
|
36
|
+
expect(@engine.html.class).to eq(String)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should have an array of images' do
|
40
|
+
expect(@engine.images.class).to eq(Array)
|
41
|
+
expect(@engine.images).to eq([])
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should have an image_count' do
|
45
|
+
expect(@engine.images_count.class).to eq(Fixnum)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'has a license attribute' do
|
49
|
+
expect(@engine.license.class).to eq(String)
|
50
|
+
end
|
51
|
+
|
52
|
+
# not yet implemented
|
53
|
+
# it 'has an array of news' do
|
54
|
+
# expect(@engine.news.class).to eq(Array)
|
55
|
+
# expect(@engine.news).not_to eq([])
|
56
|
+
# end
|
57
|
+
|
58
|
+
it 'should have a news_count' do
|
59
|
+
expect(@engine.news_count.class).to eq(Fixnum)
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should have an official_page' do
|
63
|
+
expect(@engine.official_page.class).to eq(String)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should have a page_title' do
|
67
|
+
expect(@engine.page_title.class).to eq(String)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should have an array of platforms' do
|
71
|
+
expect(@engine.platforms.class).to eq(Array)
|
72
|
+
expect(@engine.platforms).not_to eq([])
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "publishers" do
|
76
|
+
it 'should have an array of publisher hashes' do
|
77
|
+
expect(@engine.publishers.class).to eq(Array)
|
78
|
+
expect(@engine.publishers).not_to eq([])
|
79
|
+
expect(@engine.publishers.first.class).to eq(Hash)
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should have attributes in the publisher hash' do
|
83
|
+
expect(@engine.publishers.first[:name].class).to eq(String)
|
84
|
+
expect([TrueClass, FalseClass].include?(@engine.publishers.first[:company].class)).to eq(true)
|
85
|
+
expect(@engine.publishers.first[:id].class).to eq(String)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should have a rank attribute' do
|
90
|
+
expect(@engine.rank.class).to eq(String)
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'should have a rating attribute' do
|
94
|
+
expect(@engine.rating.class).to eq(Float)
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'should have a release_date attribute' do
|
98
|
+
expect(@engine.release_date.class).to eq(String)
|
99
|
+
end
|
100
|
+
|
101
|
+
describe 'summary' do
|
102
|
+
it 'should be an array' do
|
103
|
+
expect(@engine.summary.class).to eq(Array)
|
104
|
+
expect(@engine.summary).not_to eq([])
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should be an array of strings' do
|
108
|
+
@engine.summary.each do |sentence|
|
109
|
+
expect(sentence.class).to eq(String)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should have a title attribute" do
|
115
|
+
expect(@engine.title.class).to eq(String)
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'should have an updated attribute' do
|
119
|
+
expect(@engine.updated.class).to eq(String)
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should have an array of videos' do
|
123
|
+
expect(@engine.videos.class).to eq(Array)
|
124
|
+
# expect(@engine.videos).not_to eq([])
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should have a videos_count' do
|
128
|
+
expect(@engine.videos_count.class).to eq(Fixnum)
|
129
|
+
end
|
130
|
+
|
131
|
+
it 'should have a visits attribute' do
|
132
|
+
expect(@engine.visits.class).to eq(String)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'should have a watchers attribute' do
|
136
|
+
expect(@engine.watchers.class).to eq(String)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
require_relative '../../lib/desuraify'
|
2
|
+
|
3
|
+
RSpec.describe Desuraify::Game do
|
4
|
+
before do
|
5
|
+
@game = Desuraify::Game.new("dominions-4-thrones-of-ascensions")
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "initialization" do
|
9
|
+
it 'has an ancestor chain that includes Desuraify::Base' do
|
10
|
+
expect(@game.class.ancestors.include?(Desuraify::Base)).to eq(true)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'should be an instance of Desuraify::Game' do
|
14
|
+
expect(@game.instance_of?(Desuraify::Game)).to eq(true)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should have a Typhoeus::Hydra instance available' do
|
18
|
+
expect(@game.hydra.class).to eq(Typhoeus::Hydra)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should have an id' do
|
22
|
+
expect(@game.id).to eq("dominions-4-thrones-of-ascensions")
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should have an attributes array of methods that are nil' do
|
26
|
+
@game.attributes.each do |attribute|
|
27
|
+
expect(@game.send(attribute)).to eq(nil)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe "game data" do
|
33
|
+
before do
|
34
|
+
@game.update
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should have a title" do
|
38
|
+
expect(@game.title.class).to eq(String)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should have a page_title' do
|
42
|
+
expect(@game.page_title.class).to eq(String)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should have an official_page' do
|
46
|
+
expect(@game.official_page.class).to eq(String)
|
47
|
+
end
|
48
|
+
|
49
|
+
# this may change if the developer adds game videos
|
50
|
+
it 'should have an array of videos' do
|
51
|
+
expect(@game.videos.class).to eq(Array)
|
52
|
+
expect(@game.videos).to eq([])
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should have an array of images' do
|
56
|
+
expect(@game.images.class).to eq(Array)
|
57
|
+
expect(@game.images).not_to eq([])
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "developers" do
|
61
|
+
it 'should have an array of developer hashes' do
|
62
|
+
expect(@game.developers.class).to eq(Array)
|
63
|
+
expect(@game.developers).not_to eq([])
|
64
|
+
expect(@game.developers.first.class).to eq(Hash)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should have attributes in the developer hash' do
|
68
|
+
expect(@game.developers.first[:name].class).to eq(String)
|
69
|
+
expect([TrueClass, FalseClass].include?(@game.developers.first[:company].class)).to eq(true)
|
70
|
+
expect(@game.developers.first[:id].class).to eq(String)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "publishers" do
|
75
|
+
it 'should have an array of publisher hashes' do
|
76
|
+
expect(@game.publishers.class).to eq(Array)
|
77
|
+
expect(@game.publishers).not_to eq([])
|
78
|
+
expect(@game.publishers.first.class).to eq(Hash)
|
79
|
+
end
|
80
|
+
|
81
|
+
it 'should have attributes in the publisher hash' do
|
82
|
+
expect(@game.publishers.first[:name].class).to eq(String)
|
83
|
+
expect([TrueClass, FalseClass].include?(@game.publishers.first[:company].class)).to eq(true)
|
84
|
+
expect(@game.publishers.first[:id].class).to eq(String)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'engines' do
|
89
|
+
it 'should have an array of engine hashes' do
|
90
|
+
expect(@game.publishers.class).to eq(Array)
|
91
|
+
expect(@game.publishers).not_to eq([])
|
92
|
+
expect(@game.publishers.first.class).to eq(Hash)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should have attributes in the engine hash' do
|
96
|
+
expect(@game.engines.first[:name].class).to eq(String)
|
97
|
+
expect(@game.engines.first[:id].class).to eq(String)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
describe 'platforms' do
|
102
|
+
it 'should have an array of platforms' do
|
103
|
+
expect(@game.platforms.class).to eq(Array)
|
104
|
+
expect(@game.platforms).not_to eq([])
|
105
|
+
end
|
106
|
+
|
107
|
+
# it is my understanding that desura does not support platforms other that those listed
|
108
|
+
it 'should be included in ["Windows", "Mac", "Linux"]' do
|
109
|
+
platforms = ["Windows", "Mac", "Linux"]
|
110
|
+
|
111
|
+
@game.platforms.each do |platform|
|
112
|
+
expect(platforms.include?(platform)).to eq(true)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'should have an array of player modes' do
|
118
|
+
expect(@game.players.class).to eq(Array)
|
119
|
+
expect(@game.players).not_to eq([])
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'should have an array of game classifications (projects)' do
|
123
|
+
expect(@game.projects.class).to eq(Array)
|
124
|
+
expect(@game.projects).not_to eq([])
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'should have an array of themes' do
|
128
|
+
expect(@game.themes.class).to eq(Array)
|
129
|
+
expect(@game.themes).not_to eq([])
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'should have a rank' do
|
133
|
+
expect(@game.rank.class).to eq(String)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'should have a rating' do
|
137
|
+
expect(@game.rating.class).to eq(Float)
|
138
|
+
end
|
139
|
+
|
140
|
+
describe 'summary' do
|
141
|
+
it 'should be an array' do
|
142
|
+
expect(@game.summary.class).to eq(Array)
|
143
|
+
expect(@game.summary).not_to eq([])
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should be an array of strings' do
|
147
|
+
@game.summary.each do |sentence|
|
148
|
+
expect(sentence.class).to eq(String)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
it 'should have a boxshot image extension of jpg' do
|
154
|
+
ext = @game.boxshot.split("/").last.split(".").last
|
155
|
+
expect(ext).to eq("jpg")
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'should have an updated attribute' do
|
159
|
+
expect(@game.updated.class).to eq(String)
|
160
|
+
end
|
161
|
+
|
162
|
+
it 'should have an images_count' do
|
163
|
+
expect(@game.images_count.class).to eq(Fixnum)
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should have a videos_count' do
|
167
|
+
expect(@game.videos_count.class).to eq(Fixnum)
|
168
|
+
end
|
169
|
+
|
170
|
+
it 'should have a news_count' do
|
171
|
+
expect(@game.news_count.class).to eq(Fixnum)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'should have an array of genres' do
|
175
|
+
expect(@game.genres.class).to eq(Array)
|
176
|
+
expect(@game.genres).not_to eq([])
|
177
|
+
end
|
178
|
+
|
179
|
+
it 'should have the html page available' do
|
180
|
+
expect(@game.html).not_to eq(nil)
|
181
|
+
expect(@game.html.class).to eq(String)
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'should have a visits attribute' do
|
185
|
+
expect(@game.visits.class).to eq(String)
|
186
|
+
end
|
187
|
+
|
188
|
+
it 'should have a watchers attribute' do
|
189
|
+
expect(@game.watchers.class).to eq(String)
|
190
|
+
end
|
191
|
+
|
192
|
+
#langauges not yet implemented by desura, we'll be ready when they do
|
193
|
+
it 'should have languages equal to nil' do
|
194
|
+
expect(@game.languages).to eq(nil)
|
195
|
+
end
|
196
|
+
|
197
|
+
describe /\$\d+.\d+/ do
|
198
|
+
it { should match(@game.price) }
|
199
|
+
it { should match(@game.original_price) }
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require_relative '../../lib/desuraify'
|
2
|
+
|
3
|
+
RSpec.describe Desuraify::Member do
|
4
|
+
before do
|
5
|
+
@member = Desuraify::Member.new('animdude')
|
6
|
+
@member.update
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'member data' do
|
10
|
+
|
11
|
+
it 'should have an activity_points attribute' do
|
12
|
+
expect(@member.activity_points.class).to eq(Fixnum)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should have a country attribute' do
|
16
|
+
expect(@member.country.class).to eq(String)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should have a gender attribute' do
|
20
|
+
expect(@member.gender.class).to eq(String)
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'should have the html page available' do
|
24
|
+
expect(@member.html).not_to eq(nil)
|
25
|
+
expect(@member.html.class).to eq(String)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have an array of images' do
|
29
|
+
expect(@member.images.class).to eq(Array)
|
30
|
+
expect(@member.images).to eq([])
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should have an image_count' do
|
34
|
+
expect(@member.images_count.class).to eq(Fixnum)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should have a level attribute' do
|
38
|
+
expect(@member.level.class).to eq(Float)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'should have an offline attribute' do
|
42
|
+
expect(@member.offline.class).to eq(String)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'should have a rank attribute' do
|
46
|
+
expect(@member.rank.class).to eq(String)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should have a site_visits attribute' do
|
50
|
+
expect(@member.site_visits.class).to eq(String)
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'should have a time_online attribute' do
|
54
|
+
expect(@member.time_online.class).to eq(String)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'should have an array of videos' do
|
58
|
+
expect(@member.videos.class).to eq(Array)
|
59
|
+
expect(@member.videos).to eq([])
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should have a videos_count' do
|
63
|
+
expect(@member.videos_count.class).to eq(Fixnum)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'should have a visits attribute' do
|
67
|
+
expect(@member.visits.class).to eq(String)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should have a watchers attribute' do
|
71
|
+
expect(@member.watchers.class).to eq(String)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: desuraify
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jfrazx
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-07-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -87,6 +87,11 @@ files:
|
|
87
87
|
- lib/desuraify/game.rb
|
88
88
|
- lib/desuraify/member.rb
|
89
89
|
- lib/desuraify/version.rb
|
90
|
+
- tests/company/company_spec.rb
|
91
|
+
- tests/desuraify_spec.rb
|
92
|
+
- tests/engine/engine_spec.rb
|
93
|
+
- tests/game/game_spec.rb
|
94
|
+
- tests/member/member_spec.rb
|
90
95
|
homepage: https://github.com/jfrazx/desuraify
|
91
96
|
licenses:
|
92
97
|
- MIT
|
@@ -102,9 +107,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
102
107
|
version: '0'
|
103
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
109
|
requirements:
|
105
|
-
- - "
|
110
|
+
- - ">="
|
106
111
|
- !ruby/object:Gem::Version
|
107
|
-
version:
|
112
|
+
version: '0'
|
108
113
|
requirements: []
|
109
114
|
rubyforge_project:
|
110
115
|
rubygems_version: 2.2.2
|