bandsintown 0.1.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/History.txt +18 -0
- data/Manifest.txt +27 -0
- data/README.rdoc +88 -0
- data/Rakefile +28 -0
- data/lib/bandsintown.rb +27 -0
- data/lib/bandsintown/artist.rb +49 -0
- data/lib/bandsintown/base.rb +31 -0
- data/lib/bandsintown/connection.rb +36 -0
- data/lib/bandsintown/event.rb +102 -0
- data/lib/bandsintown/venue.rb +18 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +71 -0
- data/spec/bandsintown/artist_spec.rb +114 -0
- data/spec/bandsintown/base_spec.rb +70 -0
- data/spec/bandsintown/connection_spec.rb +85 -0
- data/spec/bandsintown/event_spec.rb +149 -0
- data/spec/bandsintown/venue_spec.rb +53 -0
- data/spec/bandsintown_spec.rb +8 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +12 -0
- data/website/index.html +104 -0
- data/website/index.txt +83 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +159 -0
- data/website/template.html.erb +49 -0
- metadata +132 -0
data/script/destroy
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/destroy'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
|
3
|
+
|
|
4
|
+
begin
|
|
5
|
+
require 'rubigen'
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require 'rubygems'
|
|
8
|
+
require 'rubigen'
|
|
9
|
+
end
|
|
10
|
+
require 'rubigen/scripts/generate'
|
|
11
|
+
|
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/script/txt2html
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
load File.dirname(__FILE__) + "/../Rakefile"
|
|
4
|
+
require 'rubyforge'
|
|
5
|
+
require 'redcloth'
|
|
6
|
+
require 'syntax/convertors/html'
|
|
7
|
+
require 'erb'
|
|
8
|
+
|
|
9
|
+
download = "http://rubyforge.org/projects/#{$hoe.rubyforge_name}"
|
|
10
|
+
version = $hoe.version
|
|
11
|
+
|
|
12
|
+
def rubyforge_project_id
|
|
13
|
+
RubyForge.new.configure.autoconfig["group_ids"][$hoe.rubyforge_name]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
class Fixnum
|
|
17
|
+
def ordinal
|
|
18
|
+
# teens
|
|
19
|
+
return 'th' if (10..19).include?(self % 100)
|
|
20
|
+
# others
|
|
21
|
+
case self % 10
|
|
22
|
+
when 1: return 'st'
|
|
23
|
+
when 2: return 'nd'
|
|
24
|
+
when 3: return 'rd'
|
|
25
|
+
else return 'th'
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
class Time
|
|
31
|
+
def pretty
|
|
32
|
+
return "#{mday}#{mday.ordinal} #{strftime('%B')} #{year}"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def convert_syntax(syntax, source)
|
|
37
|
+
return Syntax::Convertors::HTML.for_syntax(syntax).convert(source).gsub(%r!^<pre>|</pre>$!,'')
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if ARGV.length >= 1
|
|
41
|
+
src, template = ARGV
|
|
42
|
+
template ||= File.join(File.dirname(__FILE__), '/../website/template.html.erb')
|
|
43
|
+
else
|
|
44
|
+
puts("Usage: #{File.split($0).last} source.txt [template.html.erb] > output.html")
|
|
45
|
+
exit!
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
template = ERB.new(File.open(template).read)
|
|
49
|
+
|
|
50
|
+
title = nil
|
|
51
|
+
body = nil
|
|
52
|
+
File.open(src) do |fsrc|
|
|
53
|
+
title_text = fsrc.readline
|
|
54
|
+
body_text_template = fsrc.read
|
|
55
|
+
body_text = ERB.new(body_text_template).result(binding)
|
|
56
|
+
syntax_items = []
|
|
57
|
+
body_text.gsub!(%r!<(pre|code)[^>]*?syntax=['"]([^'"]+)[^>]*>(.*?)</\1>!m){
|
|
58
|
+
ident = syntax_items.length
|
|
59
|
+
element, syntax, source = $1, $2, $3
|
|
60
|
+
syntax_items << "<#{element} class='syntax'>#{convert_syntax(syntax, source)}</#{element}>"
|
|
61
|
+
"syntax-temp-#{ident}"
|
|
62
|
+
}
|
|
63
|
+
title = RedCloth.new(title_text).to_html.gsub(%r!<.*?>!,'').strip
|
|
64
|
+
body = RedCloth.new(body_text).to_html
|
|
65
|
+
body.gsub!(%r!(?:<pre><code>)?syntax-temp-(\d+)(?:</code></pre>)?!){ syntax_items[$1.to_i] }
|
|
66
|
+
end
|
|
67
|
+
stat = File.stat(src)
|
|
68
|
+
created = stat.ctime
|
|
69
|
+
modified = stat.mtime
|
|
70
|
+
|
|
71
|
+
$stdout << template.result(binding)
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe Bandsintown::Artist do
|
|
4
|
+
|
|
5
|
+
before(:each) do
|
|
6
|
+
@name = "Little Brother"
|
|
7
|
+
@url = "http://www.bandsintown.com/LittleBrother"
|
|
8
|
+
@artist = Bandsintown::Artist.new(@name, @url)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe ".initialize(name, url = nil)" do
|
|
12
|
+
it "should set the Artist name" do
|
|
13
|
+
@artist.name.should == @name
|
|
14
|
+
end
|
|
15
|
+
it "should set the Artist bandsintown_url if given" do
|
|
16
|
+
@artist.bandsintown_url.should == @url
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
describe "generating a url (initialize with nil url)" do
|
|
20
|
+
it "should strip spaces" do
|
|
21
|
+
name = "The Beatles "
|
|
22
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/TheBeatles"
|
|
23
|
+
end
|
|
24
|
+
it "should convert '&' -> 'And'" do
|
|
25
|
+
name = "Meg & Dia"
|
|
26
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/MegAndDia"
|
|
27
|
+
end
|
|
28
|
+
it "should convert '+' -> 'Plus'" do
|
|
29
|
+
name = "+44"
|
|
30
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/Plus44"
|
|
31
|
+
end
|
|
32
|
+
it "should camelcase seperate words" do
|
|
33
|
+
name = "meg & dia"
|
|
34
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/MegAndDia"
|
|
35
|
+
end
|
|
36
|
+
it "should not cgi escape url" do
|
|
37
|
+
name = "$up"
|
|
38
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/$up"
|
|
39
|
+
end
|
|
40
|
+
it "should uri escape accented characters" do
|
|
41
|
+
name = "sigur rós"
|
|
42
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/SigurR%C3%B3s"
|
|
43
|
+
end
|
|
44
|
+
it "should not alter the case of single word names" do
|
|
45
|
+
name = "AWOL"
|
|
46
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/AWOL"
|
|
47
|
+
end
|
|
48
|
+
it "should allow dots" do
|
|
49
|
+
name = "M.I.A"
|
|
50
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/M.I.A"
|
|
51
|
+
end
|
|
52
|
+
it "should allow exclamations" do
|
|
53
|
+
name = "against me!"
|
|
54
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/AgainstMe!"
|
|
55
|
+
end
|
|
56
|
+
it "should not modify @name" do
|
|
57
|
+
name = "this is how i think"
|
|
58
|
+
Bandsintown::Artist.new(name)
|
|
59
|
+
name.should == "this is how i think"
|
|
60
|
+
end
|
|
61
|
+
it "should cgi escape '/' so it will be double encoded" do
|
|
62
|
+
name = "AC/DC"
|
|
63
|
+
escaped_name = URI.escape(name.gsub('/', CGI.escape('/')))
|
|
64
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/#{escaped_name}"
|
|
65
|
+
end
|
|
66
|
+
it "should cgi escape '?' so it will be double encoded" do
|
|
67
|
+
name = "Does it offend you, yeah?"
|
|
68
|
+
escaped_name = URI.escape("DoesItOffendYou,Yeah#{CGI.escape('?')}")
|
|
69
|
+
Bandsintown::Artist.new(name).bandsintown_url.should == "http://www.bandsintown.com/#{escaped_name}"
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
describe ".resource_path" do
|
|
75
|
+
it "should return the API resource path for artists" do
|
|
76
|
+
Bandsintown::Artist.resource_path.should == 'artists'
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe "#events" do
|
|
81
|
+
before(:each) do
|
|
82
|
+
@artist = Bandsintown::Artist.new("Little Brother")
|
|
83
|
+
end
|
|
84
|
+
it "should request and parse a call to the BIT artist events API method and the artist's api name" do
|
|
85
|
+
@artist.should_receive(:api_name).and_return("Little+Brother")
|
|
86
|
+
Bandsintown::Artist.should_receive(:request_and_parse).with("Little+Brother/events").and_return([])
|
|
87
|
+
@artist.events
|
|
88
|
+
end
|
|
89
|
+
it "should return an Array of Bandsintown::Event objects built from the response" do
|
|
90
|
+
event_1 = mock(Bandsintown::Event)
|
|
91
|
+
event_2 = mock(Bandsintown::Event)
|
|
92
|
+
results = [ "event 1", "event 2" ]
|
|
93
|
+
Bandsintown::Artist.stub!(:request_and_parse).and_return(results)
|
|
94
|
+
Bandsintown::Event.should_receive(:build_from_json).with("event 1").ordered.and_return(event_1)
|
|
95
|
+
Bandsintown::Event.should_receive(:build_from_json).with("event 2").ordered.and_return(event_2)
|
|
96
|
+
@artist.events.should == [event_1, event_2]
|
|
97
|
+
end
|
|
98
|
+
it "should be cached" do
|
|
99
|
+
@artist.events = 'events'
|
|
100
|
+
Bandsintown::Artist.should_not_receive(:request_and_parse)
|
|
101
|
+
@artist.events.should == 'events'
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe "#api_name" do
|
|
106
|
+
it "should URI escape @name" do
|
|
107
|
+
@artist.api_name.should == URI.escape(@artist.name)
|
|
108
|
+
end
|
|
109
|
+
it "should CGI escape / and ? characters before URI escaping the whole name" do
|
|
110
|
+
Bandsintown::Artist.new("AC/DC").api_name.should == URI.escape(CGI.escape("AC/DC"))
|
|
111
|
+
Bandsintown::Artist.new("?uestlove").api_name.should == URI.escape(CGI.escape("?uestlove"))
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe Bandsintown::Base do
|
|
4
|
+
|
|
5
|
+
describe ".connection" do
|
|
6
|
+
it "should be an instance of Bandsintown::Connection" do
|
|
7
|
+
Bandsintown::Base.connection.class.should == Bandsintown::Connection
|
|
8
|
+
end
|
|
9
|
+
it "should be cached" do
|
|
10
|
+
Bandsintown::Base.connection.should === Bandsintown::Base.connection
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe ".request(api_method, args={})" do
|
|
15
|
+
it "should make a request to the connection url" do
|
|
16
|
+
resource_path = "events"
|
|
17
|
+
method = "search"
|
|
18
|
+
args = { :arg => "value" }
|
|
19
|
+
Bandsintown::Base.stub!(:resource_path).and_return(resource_path)
|
|
20
|
+
Bandsintown::Base.connection.should_receive(:request).with(resource_path, method, args)
|
|
21
|
+
Bandsintown::Base.request(method, args)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe ".parse(response)" do
|
|
26
|
+
it "should check the response for errors" do
|
|
27
|
+
response = "response"
|
|
28
|
+
parsed = mock("parsed json")
|
|
29
|
+
JSON.stub!(:parse).and_return(parsed)
|
|
30
|
+
Bandsintown::Base.should_receive(:check_for_errors).with(parsed)
|
|
31
|
+
Bandsintown::Base.parse(response)
|
|
32
|
+
end
|
|
33
|
+
it "should convert the response from JSON format and return it" do
|
|
34
|
+
response = "{\"ok\": 123}\n"
|
|
35
|
+
Bandsintown::Base.parse(response).should == { "ok" => 123 }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe ".request_and_parse(api_method, args={})" do
|
|
40
|
+
before(:each) do
|
|
41
|
+
@resource_path = "events"
|
|
42
|
+
@method = "search"
|
|
43
|
+
@args = { :arg => "value" }
|
|
44
|
+
Bandsintown::Base.stub!(:resource_path).and_return(@resource_path)
|
|
45
|
+
@response = mock("WWW::Mechanize response")
|
|
46
|
+
end
|
|
47
|
+
it "should make a request" do
|
|
48
|
+
Bandsintown::Base.should_receive(:request).with(@method, @args).and_return(@response)
|
|
49
|
+
Bandsintown::Base.stub!(:parse)
|
|
50
|
+
Bandsintown::Base.request_and_parse(@method, @args)
|
|
51
|
+
end
|
|
52
|
+
it "should parse the response" do
|
|
53
|
+
Bandsintown::Base.stub!(:request).and_return(@response)
|
|
54
|
+
Bandsintown::Base.should_receive(:parse).with(@response)
|
|
55
|
+
Bandsintown::Base.request_and_parse(@method, @args)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
describe ".check_for_errors(json)" do
|
|
60
|
+
it "should raise an APIError containing all the error messages from the API, if the response has error messages" do
|
|
61
|
+
json = { "errors" => [ "location or artists param is required", "invalid date format" ] }
|
|
62
|
+
lambda { Bandsintown::Base.check_for_errors(json) }.should raise_error(Bandsintown::APIError, "location or artists param is required, invalid date format")
|
|
63
|
+
end
|
|
64
|
+
it "should not raise an error if the response doesn't have error messages" do
|
|
65
|
+
json = { "something" => "thats not an error" }
|
|
66
|
+
lambda { Bandsintown::Base.check_for_errors(json) }.should_not raise_error
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe Bandsintown::Connection do
|
|
4
|
+
before(:each) do
|
|
5
|
+
Bandsintown.app_id = 'YOUR_APP_ID'
|
|
6
|
+
@base_url = "http://api.bandsintown.com"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe ".initialize(base_url)" do
|
|
10
|
+
it "should set the base_url for the Connection" do
|
|
11
|
+
Bandsintown::Connection.new(@base_url).base_url.should == @base_url
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe ".request(url_path, args = {}, method = :get)" do
|
|
16
|
+
before(:each) do
|
|
17
|
+
@connection = Bandsintown::Connection.new(@base_url)
|
|
18
|
+
@response = StringIO.new("response")
|
|
19
|
+
@connection.stub!(:open).and_return(@response)
|
|
20
|
+
@api_resource = "events"
|
|
21
|
+
@api_method = "search"
|
|
22
|
+
end
|
|
23
|
+
it "should convert args to url parameters when making a request" do
|
|
24
|
+
args = { :artists => ["Little Brother", "Joe Scudda"], :location => "Boston, MA", :radius => 10 }
|
|
25
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&artists%5B%5D=Little+Brother&artists%5B%5D=Joe+Scudda&format=json&location=Boston%2C+MA&radius=10"
|
|
26
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
27
|
+
@connection.request(@api_resource, @api_method, args)
|
|
28
|
+
end
|
|
29
|
+
it "should convert args[:start_date] and args[:end_date] to a single args[:date] parameter when making a request" do
|
|
30
|
+
args = { :start_date => "2009-01-01", :end_date => "2009-02-01" }
|
|
31
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=2009-01-01%2C2009-02-01&format=json"
|
|
32
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
33
|
+
@connection.request(@api_resource, @api_method, args)
|
|
34
|
+
end
|
|
35
|
+
it "should allow date to be a Time object" do
|
|
36
|
+
args = { :date => Time.now.beginning_of_day }
|
|
37
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{Time.now.beginning_of_day.strftime("%Y-%m-%d")}&format=json"
|
|
38
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
39
|
+
@connection.request(@api_resource, @api_method, args)
|
|
40
|
+
end
|
|
41
|
+
it "should allow date to be a Date object" do
|
|
42
|
+
args = { :date => Date.today }
|
|
43
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{Date.today.strftime("%Y-%m-%d")}&format=json"
|
|
44
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
45
|
+
@connection.request(@api_resource, @api_method, args)
|
|
46
|
+
end
|
|
47
|
+
it "should allow date to be a String object" do
|
|
48
|
+
args = { :date => "2009-01-01" }
|
|
49
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=2009-01-01&format=json"
|
|
50
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
51
|
+
@connection.request(@api_resource, @api_method, args)
|
|
52
|
+
end
|
|
53
|
+
it "should allow start date and end date to be Time objects" do
|
|
54
|
+
args = { :start_date => 1.week.ago, :end_date => 1.week.from_now }
|
|
55
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{1.week.ago.strftime('%Y-%m-%d')}%2C#{1.week.from_now.strftime('%Y-%m-%d')}&format=json"
|
|
56
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
57
|
+
@connection.request(@api_resource, @api_method, args)
|
|
58
|
+
end
|
|
59
|
+
it "should allow start date and end date to be Date objects" do
|
|
60
|
+
args = { :start_date => 1.week.ago.to_date, :end_date => 1.week.from_now.to_date }
|
|
61
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=#{1.week.ago.to_date.strftime('%Y-%m-%d')}%2C#{1.week.from_now.to_date.strftime('%Y-%m-%d')}&format=json"
|
|
62
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
63
|
+
@connection.request(@api_resource, @api_method, args)
|
|
64
|
+
end
|
|
65
|
+
it "should allow start date and end date to be String objects" do
|
|
66
|
+
args = { :start_date => "2009-01-01", :end_date => "2009-02-01" }
|
|
67
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=YOUR_APP_ID&date=2009-01-01%2C2009-02-01&format=json"
|
|
68
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
69
|
+
@connection.request(@api_resource, @api_method, args)
|
|
70
|
+
end
|
|
71
|
+
it "should return the API error message instead of raising an error if there was a problem with the request (404 response)" do
|
|
72
|
+
error = OpenURI::HTTPError.new('404', StringIO.new('error message'))
|
|
73
|
+
@connection.stub!(:open).and_raise(error)
|
|
74
|
+
lambda { @connection.request("", "", {}) }.should_not raise_error
|
|
75
|
+
error.io.rewind
|
|
76
|
+
@connection.request("", "", {}).should == 'error message'
|
|
77
|
+
end
|
|
78
|
+
it "should set the format to json and the send app id without the user having to specify them" do
|
|
79
|
+
request_url = "http://api.bandsintown.com/events/search?app_id=#{Bandsintown.app_id}&format=json"
|
|
80
|
+
@connection.should_receive(:open).with(request_url).and_return(@response)
|
|
81
|
+
@connection.request(@api_resource, @api_method, {})
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
end
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
|
2
|
+
|
|
3
|
+
describe Bandsintown::Event do
|
|
4
|
+
|
|
5
|
+
describe ".resource_path" do
|
|
6
|
+
it "should return the relative path to Event requests" do
|
|
7
|
+
Bandsintown::Event.resource_path.should == "events"
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
describe ".search(args = {})" do
|
|
12
|
+
@args = { :location => "Boston, MA", :date => "2009-01-01" }
|
|
13
|
+
it "should request and parse a call to the BIT events search api method" do
|
|
14
|
+
Bandsintown::Event.should_receive(:request_and_parse).with("search", @args).and_return([])
|
|
15
|
+
Bandsintown::Event.search(@args)
|
|
16
|
+
end
|
|
17
|
+
it "should return an Array of Bandsintown::Event objects built from the response" do
|
|
18
|
+
event_1 = mock(Bandsintown::Event)
|
|
19
|
+
event_2 = mock(Bandsintown::Event)
|
|
20
|
+
results = [ "event 1", "event 2" ]
|
|
21
|
+
Bandsintown::Event.stub!(:request_and_parse).and_return(results)
|
|
22
|
+
Bandsintown::Event.should_receive(:build_from_json).with("event 1").ordered.and_return(event_1)
|
|
23
|
+
Bandsintown::Event.should_receive(:build_from_json).with("event 2").ordered.and_return(event_2)
|
|
24
|
+
Bandsintown::Event.search(@args).should == [event_1, event_2]
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe ".recommended(args = {})" do
|
|
29
|
+
@args = { :location => "Boston, MA", :date => "2009-01-01" }
|
|
30
|
+
it "should request and parse a call to the BIT recommended events api method" do
|
|
31
|
+
Bandsintown::Event.should_receive(:request_and_parse).with("recommended", @args).and_return([])
|
|
32
|
+
Bandsintown::Event.recommended(@args)
|
|
33
|
+
end
|
|
34
|
+
it "should return an Array of Bandsintown::Event objects built from the response" do
|
|
35
|
+
event_1 = mock(Bandsintown::Event)
|
|
36
|
+
event_2 = mock(Bandsintown::Event)
|
|
37
|
+
results = [ "event 1", "event 2" ]
|
|
38
|
+
Bandsintown::Event.stub!(:request_and_parse).and_return(results)
|
|
39
|
+
Bandsintown::Event.should_receive(:build_from_json).with("event 1").ordered.and_return(event_1)
|
|
40
|
+
Bandsintown::Event.should_receive(:build_from_json).with("event 2").ordered.and_return(event_2)
|
|
41
|
+
Bandsintown::Event.recommended(@args).should == [event_1, event_2]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe ".daily" do
|
|
46
|
+
it "should request and parse a call to the BIT daily events api method" do
|
|
47
|
+
Bandsintown::Event.should_receive(:request_and_parse).with("daily").and_return([])
|
|
48
|
+
Bandsintown::Event.daily
|
|
49
|
+
end
|
|
50
|
+
it "should return an array of Bandsintown::Events built from the response" do
|
|
51
|
+
event = mock(Bandsintown::Event)
|
|
52
|
+
Bandsintown::Event.stub!(:request_and_parse).and_return(['event json'])
|
|
53
|
+
Bandsintown::Event.should_receive(:build_from_json).with('event json').and_return(event)
|
|
54
|
+
Bandsintown::Event.daily.should == [event]
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe ".build_from_json(json_hash)" do
|
|
59
|
+
before(:each) do
|
|
60
|
+
@event_id = 745089
|
|
61
|
+
@event_url = "http://www.bandsintown.com/event/745095"
|
|
62
|
+
@datetime = "2008-09-30T19:30:00"
|
|
63
|
+
@ticket_url = "http://www.bandsintown.com/event/745095/buy_tickets"
|
|
64
|
+
|
|
65
|
+
@artist_1 = { "name" => "Little Brother", "url" => "http://www.bandsintown.com/LittleBrother" }
|
|
66
|
+
@artist_2 = { "name" => "Joe Scudda", "url" => "http://www.bandsintown.com/JoeScudda" }
|
|
67
|
+
|
|
68
|
+
@venue_hash = {
|
|
69
|
+
"id" => 327987,
|
|
70
|
+
"url" => "http://www.bandsintown.com/venue/327987",
|
|
71
|
+
"region" => "MA",
|
|
72
|
+
"city" => "Boston",
|
|
73
|
+
"name" => "Paradise Rock Club",
|
|
74
|
+
"country" => "United States",
|
|
75
|
+
"latitude" => 42.37,
|
|
76
|
+
"longitude" => 71.03
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@event_hash = {
|
|
80
|
+
"id" => @event_id,
|
|
81
|
+
"url" => @event_url,
|
|
82
|
+
"datetime" => @datetime,
|
|
83
|
+
"ticket_url" => @ticket_url,
|
|
84
|
+
"artists" => [@artist_1, @artist_2],
|
|
85
|
+
"venue" => @venue_hash,
|
|
86
|
+
"status" => "new",
|
|
87
|
+
"ticket_status" => "available",
|
|
88
|
+
"on_sale_datetime" => "2008-09-01T19:30:00"
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@built_event = Bandsintown::Event.build_from_json(@event_hash)
|
|
92
|
+
end
|
|
93
|
+
it "should return a built Event" do
|
|
94
|
+
@built_event.class.should == Bandsintown::Event
|
|
95
|
+
end
|
|
96
|
+
it "should set the Event id" do
|
|
97
|
+
@built_event.bandsintown_id.should == @event_id
|
|
98
|
+
end
|
|
99
|
+
it "should set the Event url" do
|
|
100
|
+
@built_event.bandsintown_url.should == @event_url
|
|
101
|
+
end
|
|
102
|
+
it "should set the Event datetime" do
|
|
103
|
+
@built_event.datetime.should == Time.parse(@datetime)
|
|
104
|
+
end
|
|
105
|
+
it "should set the Event ticket url" do
|
|
106
|
+
@built_event.ticket_url.should == @ticket_url
|
|
107
|
+
end
|
|
108
|
+
it "should set the Event status" do
|
|
109
|
+
@built_event.status.should == "new"
|
|
110
|
+
end
|
|
111
|
+
it "should set the Event ticket_status" do
|
|
112
|
+
@built_event.ticket_status.should == "available"
|
|
113
|
+
end
|
|
114
|
+
it "should set the Event on_sale_datetime" do
|
|
115
|
+
@built_event.on_sale_datetime.should == Time.parse(@event_hash['on_sale_datetime'])
|
|
116
|
+
end
|
|
117
|
+
it "should set the Event on_sale_datetime to nil if not given" do
|
|
118
|
+
@event_hash['on_sale_datetime'] = nil
|
|
119
|
+
Bandsintown::Event.build_from_json(@event_hash).on_sale_datetime.should be_nil
|
|
120
|
+
end
|
|
121
|
+
it "should set the Event's Venue" do
|
|
122
|
+
built_venue = mock(Bandsintown::Venue)
|
|
123
|
+
Bandsintown::Venue.should_receive(:new).with(@venue_hash).and_return(built_venue)
|
|
124
|
+
@built_event = Bandsintown::Event.build_from_json(@event_hash)
|
|
125
|
+
@built_event.venue.should == built_venue
|
|
126
|
+
end
|
|
127
|
+
it "should set the Event's Artists" do
|
|
128
|
+
built_artist_1 = mock(Bandsintown::Artist, :name => "Little Brother")
|
|
129
|
+
built_artist_2 = mock(Bandsintown::Artist, :name => "Joe Scudda")
|
|
130
|
+
Bandsintown::Artist.should_receive(:new).with(@artist_1["name"], @artist_1["url"]).and_return(built_artist_1)
|
|
131
|
+
Bandsintown::Artist.should_receive(:new).with(@artist_2["name"], @artist_2["url"]).and_return(built_artist_2)
|
|
132
|
+
@built_event = Bandsintown::Event.build_from_json(@event_hash)
|
|
133
|
+
@built_event.artists.should == [built_artist_1, built_artist_2]
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
describe "#tickets_available?" do
|
|
138
|
+
it "should return true if @ticket_status is 'available'" do
|
|
139
|
+
event = Bandsintown::Event.new
|
|
140
|
+
event.ticket_status = 'available'
|
|
141
|
+
event.tickets_available?.should be_true
|
|
142
|
+
end
|
|
143
|
+
it "should return false if @ticket_status is not 'available'" do
|
|
144
|
+
event = Bandsintown::Event.new
|
|
145
|
+
event.ticket_status = 'unavailable'
|
|
146
|
+
event.tickets_available?.should be_false
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|