httpattack-lib 0.0.1
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 +1 -0
- data/Rakefile +51 -0
- data/lib/httpattack.rb +7 -0
- data/lib/httpattack/weapons.rb +10 -0
- data/lib/httpattack/weapons/base.rb +44 -0
- data/lib/httpattack/weapons/github.rb +26 -0
- data/lib/httpattack/weapons/twitter.rb +27 -0
- data/spec/httpattack/weapons/base_spec.rb +50 -0
- data/spec/httpattack/weapons/github_spec.rb +45 -0
- data/spec/httpattack/weapons/responses/base.json +1 -0
- data/spec/httpattack/weapons/responses/github-oshuma.json +1 -0
- data/spec/httpattack/weapons/responses/twitter-oshuma_dev.json +1 -0
- data/spec/httpattack/weapons/twitter_spec.rb +45 -0
- data/spec/httpattack_spec.rb +7 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +6 -0
- metadata +71 -0
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
The game library for HTTP Attack.
|
data/Rakefile
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'spec/rake/spectask'
|
2
|
+
|
3
|
+
task :default => :spec
|
4
|
+
|
5
|
+
desc 'Run the specs'
|
6
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
7
|
+
t.spec_opts = ['--color']
|
8
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
9
|
+
end
|
10
|
+
|
11
|
+
desc 'Run the specs with autotest'
|
12
|
+
task :autotest do
|
13
|
+
ENV['RSPEC'] = 'true'
|
14
|
+
sh 'autotest'
|
15
|
+
end
|
16
|
+
|
17
|
+
desc 'Start an IRB session with the library loaded'
|
18
|
+
task :console do
|
19
|
+
sh "irb -I ./lib -r 'httpattack'"
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
#
|
24
|
+
# Gem Stuff
|
25
|
+
#
|
26
|
+
APP_DIR = File.dirname(__FILE__)
|
27
|
+
GEMSPEC = File.join(APP_DIR, 'httpattack-lib.gemspec')
|
28
|
+
GEMNAME = File.basename(GEMSPEC, '.gemspec')
|
29
|
+
|
30
|
+
desc 'Build the gem'
|
31
|
+
task :gem => ['gem:build']
|
32
|
+
|
33
|
+
namespace :gem do
|
34
|
+
task :build do
|
35
|
+
sh "gem build #{GEMSPEC}"
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Clean the built gem"
|
39
|
+
task :clean do
|
40
|
+
sh "rm -f #{APP_DIR}/*.gem"
|
41
|
+
end
|
42
|
+
|
43
|
+
desc 'Clean, rebuild and install the gem'
|
44
|
+
task :install do
|
45
|
+
Rake::Task['gem:clean'].invoke
|
46
|
+
Rake::Task['gem:build'].invoke
|
47
|
+
gem = FileList["#{APP_DIR}/#{GEMNAME}-*.gem"].first
|
48
|
+
sudo = RUBY_PLATFORM !~ /win32/ ? "sudo" : ""
|
49
|
+
sh "#{sudo} gem uninstall #{GEMNAME} ; #{sudo} gem install #{gem}"
|
50
|
+
end
|
51
|
+
end
|
data/lib/httpattack.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'httpattack/weapons/base'
|
2
|
+
require 'httpattack/weapons/github'
|
3
|
+
require 'httpattack/weapons/twitter'
|
4
|
+
|
5
|
+
module HTTPAttack
|
6
|
+
module Weapons
|
7
|
+
class InvalidStat < Exception; end
|
8
|
+
class MustOverrideMethod < Exception; end
|
9
|
+
end # Weapons
|
10
|
+
end # HTTPAttack
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'open-uri'
|
3
|
+
|
4
|
+
module HTTPAttack
|
5
|
+
module Weapons
|
6
|
+
|
7
|
+
class Base
|
8
|
+
attr_reader :stat, :stats
|
9
|
+
|
10
|
+
# This is the strength of the weapon and must be
|
11
|
+
# overridden in a subclass. It should return
|
12
|
+
# an integer (or float).
|
13
|
+
def attack
|
14
|
+
raise MustOverrideMethod
|
15
|
+
end
|
16
|
+
|
17
|
+
# This is the URL where the JSON will come from.
|
18
|
+
# Must be overridden in a subclassed weapon.
|
19
|
+
def stats_url
|
20
|
+
raise MustOverrideMethod
|
21
|
+
end
|
22
|
+
|
23
|
+
# Parses the JSON response from the +uri+ (which can be a a path
|
24
|
+
# or URL) and returns it as a hash.
|
25
|
+
#
|
26
|
+
# On an error (exception), returns a hash like:
|
27
|
+
# { 'error' => error.message }
|
28
|
+
def reload_stats(uri = stats_url)
|
29
|
+
begin
|
30
|
+
JSON.parse(open(uri).read)
|
31
|
+
rescue => error
|
32
|
+
{'error' => error.message}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
# Loads <tt>@stats</tt> with the JSON response through <tt>#reload_stats</tt>.
|
37
|
+
def reload_stats!(*args)
|
38
|
+
@stats = self.reload_stats(*args)
|
39
|
+
end
|
40
|
+
|
41
|
+
end # Base
|
42
|
+
|
43
|
+
end # Weapons
|
44
|
+
end # HTTPAttack
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module HTTPAttack
|
2
|
+
module Weapons
|
3
|
+
|
4
|
+
class Github < HTTPAttack::Weapons::Base
|
5
|
+
STATS = ['followers_count', 'following_count']
|
6
|
+
|
7
|
+
def initialize(username, options = {})
|
8
|
+
options[:stat] ||= 'followers_count'
|
9
|
+
raise Weapons::InvalidStat unless STATS.include?(options[:stat])
|
10
|
+
@username = username
|
11
|
+
@stat = options[:stat]
|
12
|
+
end
|
13
|
+
|
14
|
+
def attack
|
15
|
+
self.reload_stats! unless stats
|
16
|
+
stats['user'][@stat].to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
def stats_url
|
20
|
+
"http://github.com/api/v2/json/user/show/#{@username}"
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Github
|
24
|
+
|
25
|
+
end # Weapons
|
26
|
+
end # HTTPAttack
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module HTTPAttack
|
2
|
+
module Weapons
|
3
|
+
|
4
|
+
class Twitter < HTTPAttack::Weapons::Base
|
5
|
+
STATS = ['followers_count', 'friends_count']
|
6
|
+
|
7
|
+
def initialize(username, options = {})
|
8
|
+
options[:stat] ||= 'followers_count'
|
9
|
+
raise Weapons::InvalidStat unless STATS.include?(options[:stat])
|
10
|
+
@username = username
|
11
|
+
@stat = options[:stat]
|
12
|
+
end
|
13
|
+
|
14
|
+
def attack
|
15
|
+
self.reload_stats! unless stats
|
16
|
+
stats[@stat].to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
def stats_url
|
20
|
+
"http://twitter.com/users/show/#{@username}.json"
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Twitter
|
24
|
+
|
25
|
+
end # Weapons
|
26
|
+
end # HTTPAttack
|
27
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
|
3
|
+
include HTTPAttack::Weapons
|
4
|
+
describe Base do
|
5
|
+
before(:each) do
|
6
|
+
@remote_api = 'http://localhost:3000/users.json'
|
7
|
+
@local_file = File.dirname(__FILE__) + '/responses/base.json'
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should fetch some JSON from the URL' do
|
11
|
+
@weapon = Base.new
|
12
|
+
data = @weapon.reload_stats(@remote_api)
|
13
|
+
data.should_not be_nil
|
14
|
+
data.should be_kind_of(Hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should fetch some JSON from the file path' do
|
18
|
+
@weapon = Base.new
|
19
|
+
data = @weapon.reload_stats(@local_file)
|
20
|
+
data.should_not be_nil
|
21
|
+
data.should be_kind_of(Hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should return an error hash' do
|
25
|
+
@weapon = Base.new
|
26
|
+
data = @weapon.reload_stats('invalid path')
|
27
|
+
data.should have_key('error')
|
28
|
+
data['error'].should_not be_nil
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'should force a subclass to override stats_url' do
|
32
|
+
@weapon = Base.new
|
33
|
+
lambda do
|
34
|
+
@weapon.stats_url
|
35
|
+
end.should raise_error(HTTPAttack::Weapons::MustOverrideMethod)
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should load the stats with #fetch_json!' do
|
39
|
+
@weapon = Base.new
|
40
|
+
@weapon.reload_stats!(@local_file)
|
41
|
+
@weapon.stats.should_not be_nil
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should force a subclass to override attack' do
|
45
|
+
@weapon = Base.new
|
46
|
+
lambda do
|
47
|
+
@weapon.attack
|
48
|
+
end.should raise_error(HTTPAttack::Weapons::MustOverrideMethod)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
include HTTPAttack::Weapons
|
3
|
+
|
4
|
+
describe Github do
|
5
|
+
before(:each) do
|
6
|
+
@username = 'Oshuma'
|
7
|
+
@stats_file = File.dirname(__FILE__) + '/responses/github-oshuma.json'
|
8
|
+
@stats_url = "http://github.com/api/v2/json/user/show/#{@username}"
|
9
|
+
|
10
|
+
@weapon = Github.new(@username)
|
11
|
+
@weapon.reload_stats!(@stats_file)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should form the API URL' do
|
15
|
+
@weapon.stats_url.should == @stats_url
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should load the weapon stats' do
|
19
|
+
stats = @weapon.reload_stats(@stats_file)
|
20
|
+
stats.should_not be_nil
|
21
|
+
stats.should be_kind_of(Hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should default to the followers_count stat' do
|
25
|
+
@weapon.stat.should == 'followers_count'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have a (followers_count) attack of 15' do
|
29
|
+
@weapon = Github.new(@username, :stat => 'followers_count')
|
30
|
+
@weapon.reload_stats!(@stats_file) # test data
|
31
|
+
@weapon.attack.should == 15
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should have a (following_count) attack of 37' do
|
35
|
+
@weapon = Github.new(@username, :stat => 'following_count')
|
36
|
+
@weapon.reload_stats!(@stats_file) # test data
|
37
|
+
@weapon.attack.should == 37
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should raise InvalidStat' do
|
41
|
+
lambda do
|
42
|
+
Github.new(@username, :stat => 'invalid')
|
43
|
+
end.should raise_error(HTTPAttack::Weapons::InvalidStat)
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"user":{"name":"Dale Campbell","company":"Contract Killer","following_count":37,"public_gist_count":40,"public_repo_count":27,"blog":"http://oshuma.github.com/","id":2441,"followers_count":15,"login":"Oshuma","location":"Madison, WI","email":"oshuma@gmail.com","created_at":"2008/03/06 11:28:35 -0800"}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"user":{"name":"Dale Campbell","company":"Contract Killer","following_count":37,"public_gist_count":40,"public_repo_count":27,"blog":"http://oshuma.github.com/","id":2441,"followers_count":15,"login":"Oshuma","location":"Madison, WI","email":"oshuma@gmail.com","created_at":"2008/03/06 11:28:35 -0800"}}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"profile_sidebar_border_color":"87bc44","followers_count":19,"profile_image_url":"http:\/\/a1.twimg.com\/profile_images\/56247600\/Young_Oshuma_normal.png","description":"This twitter account is used to track repository commits.","verified":false,"utc_offset":-21600,"created_at":"Thu Apr 17 01:56:34 +0000 2008","friends_count":1,"screen_name":"oshuma_dev","profile_text_color":"000000","profile_background_image_url":"http:\/\/a3.twimg.com\/profile_background_images\/2860337\/binary_love__resized_.jpg","favourites_count":0,"url":"http:\/\/corrupt.save-state.net\/","name":"Dale Campbell","profile_link_color":"0000ff","protected":false,"status":{"truncated":false,"created_at":"Wed Jun 10 21:54:18 +0000 2009","in_reply_to_status_id":null,"favorited":false,"in_reply_to_user_id":null,"in_reply_to_screen_name":null,"text":"[pingfm] http:\/\/bit.ly\/CkuJn Dale Campbell - version bump to 1.0.2","id":2108903929,"source":"<a href=\"http:\/\/github.com\" rel=\"nofollow\">GitHub<\/a>"},"profile_background_tile":true,"notifications":null,"profile_background_color":"9ae4e8","following":null,"statuses_count":1118,"profile_sidebar_fill_color":"e0ff92","location":"Madison, WI","id":14415445,"time_zone":"Central Time (US & Canada)"}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
|
2
|
+
include HTTPAttack::Weapons
|
3
|
+
|
4
|
+
describe Twitter do
|
5
|
+
before(:each) do
|
6
|
+
@username = 'oshuma_dev'
|
7
|
+
@stats_file = File.dirname(__FILE__) + '/responses/twitter-oshuma_dev.json'
|
8
|
+
@stats_url = "http://twitter.com/users/show/#{@username}.json"
|
9
|
+
|
10
|
+
@weapon = Twitter.new(@username)
|
11
|
+
@weapon.reload_stats!(@stats_file)
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'should form the API URL' do
|
15
|
+
@weapon.stats_url.should == @stats_url
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should load the weapon stats' do
|
19
|
+
stats = @weapon.reload_stats(@stats_file)
|
20
|
+
stats.should_not be_nil
|
21
|
+
stats.should be_kind_of(Hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should default to the followers_count stat' do
|
25
|
+
@weapon.stat.should == 'followers_count'
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'should have a (followers_count) attack of 19' do
|
29
|
+
@weapon = Twitter.new(@username, :stat => 'followers_count')
|
30
|
+
@weapon.reload_stats!(@stats_file) # test data
|
31
|
+
@weapon.attack.should == 19
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should have a (friends_count) attack of 1' do
|
35
|
+
@weapon = Twitter.new(@username, :stat => 'friends_count')
|
36
|
+
@weapon.reload_stats!(@stats_file) # test data
|
37
|
+
@weapon.attack.should == 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should raise InvalidStat' do
|
41
|
+
lambda do
|
42
|
+
Twitter.new(@username, :stat => 'invalid')
|
43
|
+
end.should raise_error(HTTPAttack::Weapons::InvalidStat)
|
44
|
+
end
|
45
|
+
end
|
data/spec/spec.opts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--colour
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: httpattack-lib
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Dale Campbell
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-03 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email:
|
18
|
+
- oshuma@gmail.com
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files: []
|
24
|
+
|
25
|
+
files:
|
26
|
+
- README
|
27
|
+
- Rakefile
|
28
|
+
- lib/httpattack/weapons/base.rb
|
29
|
+
- lib/httpattack/weapons/github.rb
|
30
|
+
- lib/httpattack/weapons/twitter.rb
|
31
|
+
- lib/httpattack/weapons.rb
|
32
|
+
- lib/httpattack.rb
|
33
|
+
- spec/httpattack/weapons/base_spec.rb
|
34
|
+
- spec/httpattack/weapons/github_spec.rb
|
35
|
+
- spec/httpattack/weapons/responses/base.json
|
36
|
+
- spec/httpattack/weapons/responses/github-oshuma.json
|
37
|
+
- spec/httpattack/weapons/responses/twitter-oshuma_dev.json
|
38
|
+
- spec/httpattack/weapons/twitter_spec.rb
|
39
|
+
- spec/httpattack_spec.rb
|
40
|
+
- spec/spec.opts
|
41
|
+
- spec/spec_helper.rb
|
42
|
+
has_rdoc: true
|
43
|
+
homepage: http://oshuma.github.com/HTTPAttack
|
44
|
+
licenses: []
|
45
|
+
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options:
|
48
|
+
- --charset=UTF-8
|
49
|
+
require_paths:
|
50
|
+
- lib
|
51
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - ">="
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: "0"
|
56
|
+
version:
|
57
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: "0"
|
62
|
+
version:
|
63
|
+
requirements: []
|
64
|
+
|
65
|
+
rubyforge_project:
|
66
|
+
rubygems_version: 1.3.5
|
67
|
+
signing_key:
|
68
|
+
specification_version: 3
|
69
|
+
summary: The game library for HTTPAttack
|
70
|
+
test_files: []
|
71
|
+
|