elekk 0.0.3 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,7 @@
1
+ v0.1.0
2
+ -- Get Achievements
3
+ --
4
+
1
5
  v0.0.1
2
6
  -- Connect to Armory for basic character information
3
7
  -- Connect to Wowhead for searches
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.1.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{elekk}
8
- s.version = "0.0.3"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Isaac Wasileski"]
12
- s.date = %q{2010-06-04}
12
+ s.date = %q{2010-06-05}
13
13
  s.description = %q{A simple library for World of Warcraft data in Ruby.}
14
14
  s.email = %q{agnoster@gmail.com}
15
15
  s.files = [
@@ -19,12 +19,14 @@ Gem::Specification.new do |s|
19
19
  "VERSION",
20
20
  "elekk.gemspec",
21
21
  "lib/elekk.rb",
22
+ "lib/elekk/achievement.rb",
22
23
  "lib/elekk/armory.rb",
23
24
  "lib/elekk/character.rb",
24
25
  "lib/elekk/data.rb",
25
26
  "lib/elekk/http.rb",
26
27
  "lib/elekk/wowhead.rb",
27
28
  "readme.md",
29
+ "spec/achievement_spec.rb",
28
30
  "spec/armory_spec.rb",
29
31
  "spec/character_spec.rb",
30
32
  "spec/klass_spec.rb",
@@ -36,7 +38,8 @@ Gem::Specification.new do |s|
36
38
  s.rubygems_version = %q{1.3.7}
37
39
  s.summary = %q{A simple library for World of Warcraft data in Ruby.}
38
40
  s.test_files = [
39
- "spec/armory_spec.rb",
41
+ "spec/achievement_spec.rb",
42
+ "spec/armory_spec.rb",
40
43
  "spec/character_spec.rb",
41
44
  "spec/klass_spec.rb",
42
45
  "spec/wowhead_spec.rb"
@@ -16,3 +16,4 @@ require File.dirname(__FILE__) + '/elekk/http'
16
16
  require File.dirname(__FILE__) + '/elekk/armory'
17
17
  require File.dirname(__FILE__) + '/elekk/wowhead'
18
18
  require File.dirname(__FILE__) + '/elekk/character'
19
+ require File.dirname(__FILE__) + '/elekk/achievement'
@@ -0,0 +1,39 @@
1
+ module Elekk
2
+ class Achievement
3
+ attr_accessor :id, :title, :points, :icon, :description, :category, :completed
4
+
5
+ def initialize(id, opts={})
6
+ @id = id
7
+ @title = opts[:title]
8
+ @points = opts[:points]
9
+ @icon = opts[:icon]
10
+ @description = opts[:description]
11
+ @category = opts[:category]
12
+ @completed = opts[:completed]
13
+ end
14
+
15
+ def self.from_xml(node)
16
+ a = self.new(node['id'].to_i, {
17
+ :title => node['title'].to_s,
18
+ :points => node['points'].to_i,
19
+ :icon => node['icon'].to_s,
20
+ :description => node['description'].to_s,
21
+ :category => Achievements[node['categoryId'].to_i]
22
+ })
23
+ a.completed = Time.parse(node['dateCompleted'].to_s) if node['dateCompleted']
24
+ a
25
+ end
26
+
27
+ def complete?
28
+ return !!completed
29
+ end
30
+
31
+ def wowhead
32
+ Wowhead::Result.new(@id, @title, Wowhead::Kind['Achievement'], @icon)
33
+ end
34
+ end
35
+
36
+ class Achievements < Enum
37
+ add_item 'Raid', 168
38
+ end
39
+ end
@@ -26,11 +26,14 @@ module Elekk
26
26
  end
27
27
 
28
28
  def get_xml(resource, params=nil)
29
- response = HTTP.request(url(resource+'.xml'), params, {
29
+ response = HTTP.xml(url(resource+'.xml'), params, {
30
30
  :cache_timeout => 24*3600,
31
31
  :user_agent => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9'
32
32
  })
33
- Nokogiri::XML(response.body)
33
+ end
34
+
35
+ def self.icon_url(icon)
36
+ "http://us.wowarmory.com/wow-icons/_images/51x51/#{icon}.jpg"
34
37
  end
35
38
 
36
39
  def url(path)
@@ -20,8 +20,16 @@ module Elekk
20
20
  @sheet ||= xml :sheet
21
21
  end
22
22
 
23
- def xml(resource)
24
- self.armory.get_xml "character-#{resource}", :r => @realm, :cn => @name
23
+ def achievements(category)
24
+ @achievements ||= {}
25
+ @achievements[category.to_sym] ||=
26
+ xml(:achievements, :c => category.to_i).css('achievement').map {|x| Achievement.from_xml x}
27
+
28
+ end
29
+
30
+ def xml(resource, opts={})
31
+ opts = {:r => @realm, :cn => @name}.merge opts
32
+ self.armory.get_xml "character-#{resource}", opts
25
33
  end
26
34
 
27
35
  def klass
@@ -29,13 +29,36 @@ module Elekk
29
29
  # default verb is GET
30
30
  def self.request(url, params=nil, opts={})
31
31
  self.init
32
- opts = {:method => :get, :params => params, :timeout => 1000}.merge opts
32
+ opts = {:method => :get, :params => params, :timeout => 10000}.merge opts
33
33
 
34
34
  request = Typhoeus::Request.new(url, opts)
35
-
35
+
36
36
  @hydra.queue request
37
37
  @hydra.run
38
- request.response
38
+ request
39
+ end
40
+
41
+ def self.xml(url, params=nil, opts={})
42
+ request = self.request(url, params, opts)
43
+ xml = Nokogiri::XML(request.response.body)
44
+ if xml.errors.length > 0
45
+ $stderr.write "XML Parse errors:\n"
46
+ p xml.errors
47
+ @cache.delete request.cache_key
48
+ end
49
+ xml
50
+ end
51
+
52
+ def self.json(url, params=nil, opts={})
53
+ request = self.request(url, params, opts)
54
+ begin
55
+ json = JSON request.response.body
56
+ raise if json.nil?
57
+ rescue
58
+ $stderr.write "JSON Parse errors:\n"
59
+ @cache.delete request.cache_key
60
+ end
61
+ json
39
62
  end
40
63
 
41
64
  end
@@ -3,8 +3,7 @@ require 'json'
3
3
  module Elekk
4
4
  class Wowhead
5
5
  def self.search(term)
6
- response = HTTP.request('http://www.wowhead.com/search', {:q => term, :opensearch => nil}, :cache_timeout => 60)
7
- resp = JSON.parse(response.body)
6
+ resp = HTTP.json('http://www.wowhead.com/search', {:q => term, :opensearch => nil}, :cache_timeout => 60)
8
7
  data = []
9
8
  resp[1].each_with_index do |v,i|
10
9
  d = resp[7][i]
@@ -15,7 +14,7 @@ module Elekk
15
14
  end
16
15
 
17
16
  class Result
18
- attr_reader :name, :id, :kind, :icon, :quality
17
+ attr_reader :id, :name, :kind, :icon, :quality
19
18
 
20
19
  def initialize(id, name, kind, icon=nil, quality=nil)
21
20
  @id = id
@@ -39,7 +38,7 @@ module Elekk
39
38
  end
40
39
 
41
40
  def icon_url(size=:medium) # :small, :medium, or :large
42
- "http://static.wowhead.com/images/wow/icons/#{size}/#{icon}.jpg" if icon
41
+ "http://static.wowhead.com/images/wow/icons/#{size}/#{icon.gsub(/'/,'-')}.jpg" if icon
43
42
  end
44
43
 
45
44
  def self.from_html(mkp)
@@ -0,0 +1,54 @@
1
+ require 'elekk'
2
+ include Elekk
3
+
4
+ describe Achievement do
5
+ before :each do
6
+ @achievements = Character.new('Fyrbard','Uldaman').achievements(Achievements::Raid)
7
+ @oncebitten = @achievements.find {|a| a.id == 4539 }
8
+ @bane = @achievements.find {|a| a.id == 4608 }
9
+ end
10
+
11
+ it "should give a list of achievements" do
12
+ @oncebitten.should_not be_nil
13
+ @bane.should_not be_nil
14
+ end
15
+
16
+ it "should have the correct title" do
17
+ @oncebitten.title.should == 'Once Bitten, Twice Shy (10 player)'
18
+ end
19
+
20
+ it "should have the correct icon" do
21
+ @oncebitten.icon.should == 'achievement_boss_lanathel'
22
+ end
23
+
24
+ it "should have the correct category" do
25
+ @oncebitten.category.should == Achievements::Raid
26
+ end
27
+
28
+ it "should have the correct point total as an integer" do
29
+ @oncebitten.points.should == 10
30
+ end
31
+
32
+ it "should have the correct time of completion" do
33
+ @oncebitten.completed.to_i.should == 1274250840
34
+ @bane.completed.should be_nil
35
+ end
36
+
37
+ it "should show correct completion state" do
38
+ @oncebitten.complete?.should == true
39
+ @bane.complete?.should == false
40
+ end
41
+
42
+ it "should get the correct information to display on wowhead" do
43
+ @oncebitten.wowhead.url.should == 'http://www.wowhead.com/achievement=4539'
44
+ @oncebitten.wowhead.icon_url(:large).should == 'http://static.wowhead.com/images/wow/icons/large/achievement_boss_lanathel.jpg'
45
+ end
46
+
47
+ it "should look bitchin when I print them all" do
48
+ @achievements.select {|a| a.complete?}.sort_by {|a| -a.completed.to_i}.each do |a|
49
+ puts "<a href=\"#{a.wowhead.url}\"><img src=\"#{Armory.icon_url(a.icon)}\" /> <img src=\"#{a.wowhead.icon_url(:large)}\" /> #{a.title}</a><br />"
50
+ end
51
+ end
52
+ end
53
+
54
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: elekk
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 3
10
- version: 0.0.3
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Isaac Wasileski
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-06-04 00:00:00 +02:00
18
+ date: 2010-06-05 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -89,12 +89,14 @@ files:
89
89
  - VERSION
90
90
  - elekk.gemspec
91
91
  - lib/elekk.rb
92
+ - lib/elekk/achievement.rb
92
93
  - lib/elekk/armory.rb
93
94
  - lib/elekk/character.rb
94
95
  - lib/elekk/data.rb
95
96
  - lib/elekk/http.rb
96
97
  - lib/elekk/wowhead.rb
97
98
  - readme.md
99
+ - spec/achievement_spec.rb
98
100
  - spec/armory_spec.rb
99
101
  - spec/character_spec.rb
100
102
  - spec/klass_spec.rb
@@ -134,6 +136,7 @@ signing_key:
134
136
  specification_version: 3
135
137
  summary: A simple library for World of Warcraft data in Ruby.
136
138
  test_files:
139
+ - spec/achievement_spec.rb
137
140
  - spec/armory_spec.rb
138
141
  - spec/character_spec.rb
139
142
  - spec/klass_spec.rb