intown 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +17 -0
- data/.rspec +1 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +78 -0
- data/Rakefile +1 -0
- data/intown.gemspec +27 -0
- data/lib/intown/artist.rb +11 -0
- data/lib/intown/client.rb +62 -0
- data/lib/intown/configuration.rb +16 -0
- data/lib/intown/errors.rb +4 -0
- data/lib/intown/event.rb +25 -0
- data/lib/intown/version.rb +3 -0
- data/lib/intown.rb +9 -0
- data/spec/acceptance/fetch_artist_by_name_spec.rb +38 -0
- data/spec/acceptance/fetch_events_by_artist_spec.rb +26 -0
- data/spec/fixtures/cassettes/fetch_artist_no_app_id_set.yml +43 -0
- data/spec/fixtures/cassettes/fetch_events_for_known_band.yml +62 -0
- data/spec/fixtures/cassettes/fetch_events_for_unknown_band.yml +43 -0
- data/spec/fixtures/cassettes/find_artist_by_name.yml +44 -0
- data/spec/fixtures/cassettes/find_unknown_artist.yml +43 -0
- data/spec/intown/artist_spec.rb +44 -0
- data/spec/intown/configuration_spec.rb +11 -0
- data/spec/intown/event_spec.rb +53 -0
- data/spec/intown/tourbus_spec.rb +7 -0
- data/spec/spec_helper.rb +14 -0
- metadata +180 -0
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --format nested
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Ben Scheirman
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
# Intown
|
2
|
+
|
3
|
+
A gem to consume the Bandsintown 2.0 API. Supports finding artists by name, MusicBrainz ID, & Facebook Page Id. Supports returning events by artist & optional date range.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'intown'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install intown
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
Set your "app_id" configuration before making any calls. In a Rails app, this would go in `config/initializers/intown.rb`.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
Intown.configure do |config|
|
25
|
+
config.app_id = <YOUR APP ID HERE>
|
26
|
+
end
|
27
|
+
```
|
28
|
+
|
29
|
+
### Fetching an artist
|
30
|
+
|
31
|
+
```ruby
|
32
|
+
Intown::Artist.fetch(params)
|
33
|
+
```
|
34
|
+
|
35
|
+
Params should be one of the following:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
{:name => "Radiohead"}
|
39
|
+
{:mbid => "<band's MusicBrainz ID>"}
|
40
|
+
{:fbid => "<band's Facebook page ID>"}
|
41
|
+
```
|
42
|
+
|
43
|
+
Returns an object that responds to the API attributes in the [Bandsintown API documentation](http://www.bandsintown.com/api/responses#artist-json)
|
44
|
+
|
45
|
+
Returns nil if the band cannot be found.
|
46
|
+
|
47
|
+
### Fetching events for an artist
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
Intown::Event.list(params)
|
51
|
+
```
|
52
|
+
|
53
|
+
Params should identify the artist to search for (see above). Params may also include one of the following date options:
|
54
|
+
|
55
|
+
```ruby
|
56
|
+
{:upcoming => true} # default: only returns future events
|
57
|
+
{:all => true} # returns all events for this artist
|
58
|
+
{:date => 3.days.from_now} # returns all events on the specified date
|
59
|
+
{:from => 3.days.ago, :to => 5.days.from_now } # returns all events in the date range (inclusive)
|
60
|
+
```
|
61
|
+
|
62
|
+
Returns an object that responds to the API attributes in the [Bandsintown API documentation](http://www.bandsintown.com/api/responses#event-json)
|
63
|
+
|
64
|
+
Returns nil if the band does not exist.
|
65
|
+
|
66
|
+
|
67
|
+
## Contributing
|
68
|
+
|
69
|
+
1. Fork it
|
70
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
71
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
72
|
+
4. Write Tests
|
73
|
+
5. Push to the branch (`git push origin my-new-feature`)
|
74
|
+
6. Create new Pull Request
|
75
|
+
|
76
|
+
## License
|
77
|
+
|
78
|
+
This code is provided under the MIT license. See LICENSE.txt for more details.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/intown.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'intown/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "intown"
|
8
|
+
gem.version = Intown::VERSION
|
9
|
+
gem.authors = ["Ben Scheirman"]
|
10
|
+
gem.email = ["ben@scheirman.com"]
|
11
|
+
gem.description = %q{A client for the Bandsintown API.}
|
12
|
+
gem.summary = %q{Supports Bandsintown API version 1.1}
|
13
|
+
gem.homepage = "https://github.com/subdigital/intown"
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_development_dependency 'rspec', '~> 2.12.0'
|
21
|
+
gem.add_development_dependency 'vcr', '~> 2.4.0'
|
22
|
+
gem.add_development_dependency 'webmock', '~> 1.9.3'
|
23
|
+
gem.add_development_dependency 'pry'
|
24
|
+
|
25
|
+
gem.add_dependency 'httparty', '~> 0.10.0'
|
26
|
+
gem.add_dependency 'hashie', '~> 2.0.0'
|
27
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require 'json'
|
3
|
+
require 'hashie'
|
4
|
+
|
5
|
+
module Intown
|
6
|
+
class Client
|
7
|
+
include HTTParty
|
8
|
+
API_VERSION = 2.0
|
9
|
+
base_uri "https://api.bandsintown.com"
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
def options
|
14
|
+
{
|
15
|
+
:query => {
|
16
|
+
:app_id => Intown.configuration.app_id, :api_version => API_VERSION
|
17
|
+
}
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def process_response(response)
|
22
|
+
case response.code
|
23
|
+
when 500 then raise Intown::InvalidRequestError, response.body
|
24
|
+
when 404 then process_not_found(response)
|
25
|
+
else
|
26
|
+
json_response = JSON.parse(response.body)
|
27
|
+
|
28
|
+
if json_response.is_a? Hash
|
29
|
+
Hashie::Mash.new(json_response)
|
30
|
+
elsif json_response.is_a? Array
|
31
|
+
json_response.map {|e| Hashie::Mash.new(e)}
|
32
|
+
else
|
33
|
+
json_response
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def process_not_found(response)
|
39
|
+
json = JSON.parse(response.body)
|
40
|
+
if errors = json['errors']
|
41
|
+
raise Intown::InvalidRequestError, "app_id is required for this request" if errors.any? {|e| e =~ /app_id param is required/}
|
42
|
+
end
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
|
46
|
+
def artist_identifier(params)
|
47
|
+
return musicbrainz_identifier(params[:mbid]) if params[:mbid]
|
48
|
+
return facebook_identifier(params[:fbid]) if params[:fbid]
|
49
|
+
return params[:name] if params[:name]
|
50
|
+
raise ArgumentError, "params must contain one of mbid, fbid, or name"
|
51
|
+
end
|
52
|
+
|
53
|
+
def musicbrainz_identifier(mbid)
|
54
|
+
"mbid_#{mbid}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def facebook_identifier(fbid)
|
58
|
+
"fbid_#{fbid}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Intown
|
2
|
+
class Configuration
|
3
|
+
attr_accessor :app_id
|
4
|
+
end
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def configure(&block)
|
8
|
+
@configuration = Configuration.new
|
9
|
+
yield @configuration
|
10
|
+
end
|
11
|
+
|
12
|
+
def configuration
|
13
|
+
@configuration ||= Configuration.new
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/intown/event.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
module Intown
|
2
|
+
class Event < Client
|
3
|
+
class << self
|
4
|
+
def list(params)
|
5
|
+
identifier = artist_identifier(params)
|
6
|
+
event_params = options.merge(date_options(params))
|
7
|
+
url = "/artists/#{URI.encode(identifier)}/events"
|
8
|
+
response = get(url, event_params)
|
9
|
+
process_response(response)
|
10
|
+
end
|
11
|
+
|
12
|
+
def date_options(params)
|
13
|
+
return {:date => format_date(params[:date])} if params[:date]
|
14
|
+
return {:date => "#{format_date(params[:from])},#{format_date(params[:to])}"} if params[:from] && params[:to]
|
15
|
+
return {:date => "upcoming"} if params[:upcoming] == true
|
16
|
+
return {:date => "all"} if params[:all] == true
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
|
20
|
+
def format_date(date)
|
21
|
+
date.strftime("%Y-%m-%d")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/intown.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Intown::Artist do
|
4
|
+
|
5
|
+
context "without configuring an app id" do
|
6
|
+
before do
|
7
|
+
Intown.configure {|c| c.app_id = nil}
|
8
|
+
end
|
9
|
+
it "should raise an error if the app id param is not set" do
|
10
|
+
VCR.use_cassette("fetch_artist_no_app_id_set") do
|
11
|
+
expect { Intown::Artist.fetch(:name => "foobar") }.to raise_error Intown::InvalidRequestError
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "with an app id configured" do
|
17
|
+
before do
|
18
|
+
Intown.configure {|c| c.app_id = "test"}
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return nil for unknown artists" do
|
22
|
+
VCR.use_cassette("find_unknown_artist") do
|
23
|
+
Intown::Artist.fetch(:name => "Ishouldnotexist").should be_nil
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be fetched by name" do
|
28
|
+
VCR.use_cassette("find_artist_by_name") do
|
29
|
+
artist = Intown::Artist.fetch(:name => "My Morning Jacket")
|
30
|
+
artist.name.should == "My Morning Jacket"
|
31
|
+
artist.upcoming_events_count.should_not be_nil
|
32
|
+
artist.image_url.should_not be_nil
|
33
|
+
artist.mbid.should_not be_nil
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Intown::Event do
|
4
|
+
before :each do
|
5
|
+
Intown.configure do |c|
|
6
|
+
c.app_id = "test"
|
7
|
+
end
|
8
|
+
end
|
9
|
+
context "Fetching events for an unknown band" do
|
10
|
+
it "should return nil" do
|
11
|
+
VCR.use_cassette("fetch events for unknown band") do
|
12
|
+
events = Intown::Event.list(:name => "GoobleGobble124")
|
13
|
+
events.should be_nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "Fetching events for an unknown band" do
|
19
|
+
it "should return nil" do
|
20
|
+
VCR.use_cassette("fetch events for known band") do
|
21
|
+
events = Intown::Event.list(:name => "Blame Sally")
|
22
|
+
events.length.should >= 0
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.bandsintown.com/artists/foobar?api_version=2.0&app_id=
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 404
|
13
|
+
message: Not Found
|
14
|
+
headers:
|
15
|
+
Date:
|
16
|
+
- Thu, 21 Feb 2013 20:11:49 GMT
|
17
|
+
Server:
|
18
|
+
- Mongrel 1.1.5
|
19
|
+
Content-Length:
|
20
|
+
- '40'
|
21
|
+
Content-Type:
|
22
|
+
- application/json; charset=utf-8
|
23
|
+
X-Runtime:
|
24
|
+
- '0.02046'
|
25
|
+
Status:
|
26
|
+
- 404 Not Found
|
27
|
+
Cache-Control:
|
28
|
+
- no-cache
|
29
|
+
Set-Cookie:
|
30
|
+
- _session_id=04cd7ac85a121e74bfb474f94f04c501; path=/; expires=Thu, 21 Mar
|
31
|
+
2013 19:11:49 GMT
|
32
|
+
Vary:
|
33
|
+
- Accept-Encoding
|
34
|
+
Connection:
|
35
|
+
- close
|
36
|
+
body:
|
37
|
+
encoding: US-ASCII
|
38
|
+
string: ! '{"errors":["app_id param is required"]}
|
39
|
+
|
40
|
+
'
|
41
|
+
http_version:
|
42
|
+
recorded_at: Thu, 21 Feb 2013 20:11:49 GMT
|
43
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,62 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.bandsintown.com/artists/Blame%20Sally/events?api_version=2.0&app_id=test
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Date:
|
16
|
+
- Thu, 21 Feb 2013 20:15:44 GMT
|
17
|
+
Server:
|
18
|
+
- Mongrel 1.1.5
|
19
|
+
Etag:
|
20
|
+
- ! '"8f78b9ff373c3291535e34a9c28a2d67"'
|
21
|
+
Content-Length:
|
22
|
+
- '5768'
|
23
|
+
Cache-Control:
|
24
|
+
- private, max-age=0, must-revalidate
|
25
|
+
X-Runtime:
|
26
|
+
- '0.06541'
|
27
|
+
Status:
|
28
|
+
- 200 OK
|
29
|
+
Content-Type:
|
30
|
+
- application/json; charset=utf-8
|
31
|
+
Set-Cookie:
|
32
|
+
- _session_id=09b05e580a4b65a836214fc870b5b76b; path=/; expires=Thu, 21 Mar
|
33
|
+
2013 19:15:44 GMT
|
34
|
+
Vary:
|
35
|
+
- Accept-Encoding
|
36
|
+
Connection:
|
37
|
+
- close
|
38
|
+
body:
|
39
|
+
encoding: US-ASCII
|
40
|
+
string: ! '[{"ticket_status":"unavailable","ticket_type":null,"ticket_url":null,"formatted_location":"Chico,
|
41
|
+
CA","formatted_datetime":"Monday, April 15, 2013 at 7:30pm","facebook_rsvp_url":"http:\/\/www.bandsintown.com\/event\/6216225\/facebook_rsvp?app_id=test&artist=Blame+Sally&came_from=67","artists":[{"mbid":"b30ac2b1-a4fc-45a3-98ff-9087a6a10208","name":"Blame
|
42
|
+
Sally","image_url":"http:\/\/www.bandsintown.com\/BlameSally\/photo\/medium.jpg","facebook_tour_dates_url":"http:\/\/bnds.in\/HQt8jZ","thumb_url":"http:\/\/www.bandsintown.com\/BlameSally\/photo\/small.jpg"}],"facebook_share_url":"https:\/\/www.facebook.com\/dialog\/feed?actions=%7B%22link%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2Fevent%5C%2F6216225%5C%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D78%22%2C%22name%22%3A%22RSVP%22%7D&app_id=123966167614127&caption=Monday%2C+April+15%2C+2013+at+7%3A30pm&description=%26nbsp%3B&link=http%3A%2F%2Fwww.bandsintown.com%2Fevent%2F6216225%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D77&name=Blame+Sally+%40+Sierra+Nevada+Brewing+Co.+in+Chico%2C+CA&picture=https%3A%2F%2Fd12nfv3nknyhzq.cloudfront.net%2FBlameSally%2Fphoto%2Flarge.jpg&properties=%7B%22More+Tour+Dates%22%3A%7B%22text%22%3A%22http%3A%5C%2F%5C%2Fbnds.in%5C%2FIgxMaj%22%2C%22href%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2FBlameSally%5C%2Ffacebookapp%3Fcame_from%3D78%22%7D%7D&redirect_uri=http%3A%2F%2Fwww.bandsintown.com%2Fevent%2F6216225%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D102","title":"Blame
|
43
|
+
Sally @ Sierra Nevada Brewing Co. in Chico, CA","id":"6216225","description":null,"on_sale_datetime":null,"venue":{"country":"United
|
44
|
+
States","name":"Sierra Nevada Brewing Co.","longitude":"-121.8139110","city":"Chico","region":"CA","latitude":"39.7249330"},"datetime":"2013-04-15T19:30:00"},
|
45
|
+
|
46
|
+
{"ticket_status":"unavailable","ticket_type":null,"ticket_url":null,"formatted_location":"Seattle,
|
47
|
+
WA","formatted_datetime":"Friday, April 19, 2013 at 9:00pm","facebook_rsvp_url":"http:\/\/www.bandsintown.com\/event\/6128697\/facebook_rsvp?app_id=test&artist=Blame+Sally&came_from=67","artists":[{"mbid":"b30ac2b1-a4fc-45a3-98ff-9087a6a10208","name":"Blame
|
48
|
+
Sally","image_url":"http:\/\/www.bandsintown.com\/BlameSally\/photo\/medium.jpg","facebook_tour_dates_url":"http:\/\/bnds.in\/HQt8jZ","thumb_url":"http:\/\/www.bandsintown.com\/BlameSally\/photo\/small.jpg"}],"facebook_share_url":"https:\/\/www.facebook.com\/dialog\/feed?actions=%7B%22link%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2Fevent%5C%2F6128697%5C%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D78%22%2C%22name%22%3A%22RSVP%22%7D&app_id=123966167614127&caption=Friday%2C+April+19%2C+2013+at+9%3A00pm&description=%26nbsp%3B&link=http%3A%2F%2Fwww.bandsintown.com%2Fevent%2F6128697%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D77&name=Blame+Sally+%40+The+Triple+Door+in+Seattle%2C+WA&picture=https%3A%2F%2Fd12nfv3nknyhzq.cloudfront.net%2FBlameSally%2Fphoto%2Flarge.jpg&properties=%7B%22More+Tour+Dates%22%3A%7B%22text%22%3A%22http%3A%5C%2F%5C%2Fbnds.in%5C%2FIgxMaj%22%2C%22href%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2FBlameSally%5C%2Ffacebookapp%3Fcame_from%3D78%22%7D%7D&redirect_uri=http%3A%2F%2Fwww.bandsintown.com%2Fevent%2F6128697%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D102","title":"Blame
|
49
|
+
Sally @ The Triple Door in Seattle, WA","id":"6128697","description":null,"on_sale_datetime":null,"venue":{"country":"United
|
50
|
+
States","name":"The Triple Door","longitude":"-122.3379440","city":"Seattle","region":"WA","latitude":"47.6084330"},"datetime":"2013-04-19T21:00:00"},
|
51
|
+
|
52
|
+
{"ticket_status":"available","ticket_type":"Tickets","ticket_url":"http:\/\/www.bandsintown.com\/event\/5985466\/buy_tickets?app_id=test&artist=Blame+Sally","formatted_location":"San
|
53
|
+
Francisco, CA","formatted_datetime":"Saturday, May 11, 2013 at 9:00pm","facebook_rsvp_url":"http:\/\/www.bandsintown.com\/event\/5985466\/facebook_rsvp?app_id=test&artist=Blame+Sally&came_from=67","artists":[{"mbid":"b30ac2b1-a4fc-45a3-98ff-9087a6a10208","name":"Blame
|
54
|
+
Sally","image_url":"http:\/\/www.bandsintown.com\/BlameSally\/photo\/medium.jpg","facebook_tour_dates_url":"http:\/\/bnds.in\/HQt8jZ","thumb_url":"http:\/\/www.bandsintown.com\/BlameSally\/photo\/small.jpg"}],"facebook_share_url":"https:\/\/www.facebook.com\/dialog\/feed?actions=%7B%22link%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2Fevent%5C%2F5985466%5C%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D78%22%2C%22name%22%3A%22RSVP%22%7D&app_id=123966167614127&caption=Saturday%2C+May+11%2C+2013+at+9%3A00pm&description=%26nbsp%3B&link=http%3A%2F%2Fwww.bandsintown.com%2Fevent%2F5985466%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D77&name=Blame+Sally+%40+Great+American+Music+Hall+in+San+Francisco%2C+CA&picture=https%3A%2F%2Fd12nfv3nknyhzq.cloudfront.net%2FBlameSally%2Fphoto%2Flarge.jpg&properties=%7B%22Tickets%22%3A%7B%22text%22%3A%22http%3A%5C%2F%5C%2Fbnds.in%5C%2FUNp0bR%22%2C%22href%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2Fevent%5C%2F5985466%5C%2Fbuy_tickets%3Faffil_code%3Dfb_19907696684%26artist%3DBlame%2BSally%22%7D%2C%22More+Tour+Dates%22%3A%7B%22text%22%3A%22http%3A%5C%2F%5C%2Fbnds.in%5C%2FIgxMaj%22%2C%22href%22%3A%22http%3A%5C%2F%5C%2Fwww.bandsintown.com%5C%2FBlameSally%5C%2Ffacebookapp%3Fcame_from%3D78%22%7D%7D&redirect_uri=http%3A%2F%2Fwww.bandsintown.com%2Fevent%2F5985466%2Ffacebook_rsvp%3Fartist%3DBlame%2BSally%26came_from%3D102","title":"Blame
|
55
|
+
Sally @ Great American Music Hall in San Francisco, CA","id":"5985466","description":null,"on_sale_datetime":null,"venue":{"country":"United
|
56
|
+
States","name":"Great American Music Hall","longitude":"-122.4205960","city":"San
|
57
|
+
Francisco","region":"CA","latitude":"37.7943790"},"datetime":"2013-05-11T21:00:00"}]
|
58
|
+
|
59
|
+
'
|
60
|
+
http_version:
|
61
|
+
recorded_at: Thu, 21 Feb 2013 20:15:44 GMT
|
62
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.bandsintown.com/artists/GoobleGobble124/events?api_version=2.0&app_id=test
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 404
|
13
|
+
message: Not Found
|
14
|
+
headers:
|
15
|
+
Date:
|
16
|
+
- Thu, 21 Feb 2013 20:11:51 GMT
|
17
|
+
Server:
|
18
|
+
- Mongrel 1.1.5
|
19
|
+
Status:
|
20
|
+
- 404 Not Found
|
21
|
+
Cache-Control:
|
22
|
+
- no-cache
|
23
|
+
Content-Type:
|
24
|
+
- application/json; charset=utf-8
|
25
|
+
Content-Length:
|
26
|
+
- '30'
|
27
|
+
X-Runtime:
|
28
|
+
- '0.00860'
|
29
|
+
Set-Cookie:
|
30
|
+
- _session_id=5d23778c700fcb71fd14d2061fc20e43; path=/; expires=Thu, 21 Mar
|
31
|
+
2013 19:11:51 GMT
|
32
|
+
Vary:
|
33
|
+
- Accept-Encoding
|
34
|
+
Connection:
|
35
|
+
- close
|
36
|
+
body:
|
37
|
+
encoding: US-ASCII
|
38
|
+
string: ! '{"errors":["Unknown Artist"]}
|
39
|
+
|
40
|
+
'
|
41
|
+
http_version:
|
42
|
+
recorded_at: Thu, 21 Feb 2013 20:11:51 GMT
|
43
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,44 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.bandsintown.com/artists/My%20Morning%20Jacket?api_version=2.0&app_id=test
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 200
|
13
|
+
message: OK
|
14
|
+
headers:
|
15
|
+
Date:
|
16
|
+
- Thu, 21 Feb 2013 20:11:50 GMT
|
17
|
+
Server:
|
18
|
+
- Mongrel 1.1.5
|
19
|
+
Etag:
|
20
|
+
- ! '"f71ae1412f3e37311757d098764b8aad"'
|
21
|
+
Cache-Control:
|
22
|
+
- private, max-age=0, must-revalidate
|
23
|
+
Status:
|
24
|
+
- 200 OK
|
25
|
+
X-Runtime:
|
26
|
+
- '0.04589'
|
27
|
+
Content-Length:
|
28
|
+
- '310'
|
29
|
+
Content-Type:
|
30
|
+
- application/json; charset=utf-8
|
31
|
+
Set-Cookie:
|
32
|
+
- _session_id=b50f066fa543a15f617acfe11a075bb2; path=/; expires=Thu, 21 Mar
|
33
|
+
2013 19:11:50 GMT
|
34
|
+
Vary:
|
35
|
+
- Accept-Encoding
|
36
|
+
Connection:
|
37
|
+
- close
|
38
|
+
body:
|
39
|
+
encoding: US-ASCII
|
40
|
+
string: ! '{"mbid":"ea5883b7-68ce-48b3-b115-61746ea53b8c","upcoming_events_count":0,"image_url":"http:\/\/www.bandsintown.com\/MyMorningJacket\/photo\/medium.jpg","thumb_url":"http:\/\/www.bandsintown.com\/MyMorningJacket\/photo\/small.jpg","name":"My
|
41
|
+
Morning Jacket","facebook_tour_dates_url":"http:\/\/bnds.in\/zTPiUu"}'
|
42
|
+
http_version:
|
43
|
+
recorded_at: Thu, 21 Feb 2013 20:11:50 GMT
|
44
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,43 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.bandsintown.com/artists/Ishouldnotexist?api_version=2.0&app_id=test
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers: {}
|
10
|
+
response:
|
11
|
+
status:
|
12
|
+
code: 404
|
13
|
+
message: Not Found
|
14
|
+
headers:
|
15
|
+
Date:
|
16
|
+
- Thu, 21 Feb 2013 20:11:50 GMT
|
17
|
+
Server:
|
18
|
+
- Mongrel 1.1.5
|
19
|
+
Content-Type:
|
20
|
+
- application/json; charset=utf-8
|
21
|
+
X-Runtime:
|
22
|
+
- '0.01188'
|
23
|
+
Status:
|
24
|
+
- 404 Not Found
|
25
|
+
Cache-Control:
|
26
|
+
- no-cache
|
27
|
+
Content-Length:
|
28
|
+
- '30'
|
29
|
+
Set-Cookie:
|
30
|
+
- _session_id=407c1b0ceec22028ba725603afbe8534; path=/; expires=Thu, 21 Mar
|
31
|
+
2013 19:11:50 GMT
|
32
|
+
Vary:
|
33
|
+
- Accept-Encoding
|
34
|
+
Connection:
|
35
|
+
- close
|
36
|
+
body:
|
37
|
+
encoding: US-ASCII
|
38
|
+
string: ! '{"errors":["Unknown Artist"]}
|
39
|
+
|
40
|
+
'
|
41
|
+
http_version:
|
42
|
+
recorded_at: Thu, 21 Feb 2013 20:11:50 GMT
|
43
|
+
recorded_with: VCR 2.4.0
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Intown::Artist do
|
4
|
+
let(:response) {
|
5
|
+
stub(:code => 200,
|
6
|
+
:body => '{
|
7
|
+
"upcoming_events_count":0,
|
8
|
+
"thumb_url":"http:\/\/www.bandsintown.com\/Nirvana\/photo\/small.jpg",
|
9
|
+
"name": "Nirvana",
|
10
|
+
"image_url":"http:\/\/www.bandsintown.com\/Nirvana\/photo\/medium.jpg",
|
11
|
+
"mbid":"ea5883b7-68ce-48b3-b115-61746ea53b8c",
|
12
|
+
"facebook_tour_dates_url":"http:\/\/bnds.in\/zTPiUu"
|
13
|
+
}'
|
14
|
+
)
|
15
|
+
}
|
16
|
+
|
17
|
+
context "searching by name" do
|
18
|
+
it "should put the name in the artist url" do
|
19
|
+
Intown::Artist.should_receive(:get).with(/\/artists\/Nirvana/, anything).and_return(response)
|
20
|
+
Intown::Artist.fetch(:name => "Nirvana")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "searching by name with spaces" do
|
25
|
+
it "should url encode the spaces" do
|
26
|
+
Intown::Artist.should_receive(:get).with(/\/artists\/Foo%20Fighters/, anything).and_return(response)
|
27
|
+
Intown::Artist.fetch(:name => "Foo Fighters")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "searching by musicbrainz id" do
|
32
|
+
it "should format the musicbrainz id in the url" do
|
33
|
+
Intown::Artist.should_receive(:get).with(/\/artists\/mbid_1234567890abcd/, anything).and_return(response)
|
34
|
+
Intown::Artist.fetch(:mbid => "1234567890abcd")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "searching with invalid params" do
|
39
|
+
it "should raise an argument error" do
|
40
|
+
expect { Intown::Artist.fetch(:foo_bar => "baz") }.to raise_error ArgumentError
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Intown::Event do
|
4
|
+
let(:response) {
|
5
|
+
stub(:code => 200,
|
6
|
+
:body => '{"foo":"bar"}')
|
7
|
+
}
|
8
|
+
|
9
|
+
context "searching by artist id" do
|
10
|
+
it "should format the proper artist term in the url" do
|
11
|
+
Intown::Event.should_receive(:get).with(/artists\/Radiohead\/events/, anything).and_return(response)
|
12
|
+
Intown::Event.list(:name => "Radiohead")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "Searching by date range" do
|
17
|
+
before :each do
|
18
|
+
Intown::Event.should_receive(:get).with(anything, hash_including(expected_params)).and_return(response)
|
19
|
+
end
|
20
|
+
|
21
|
+
context "single date" do
|
22
|
+
let(:expected_params) {{ :date => '2013-03-02' }}
|
23
|
+
let(:input_params) {{ :name => "Radiohead", :date => Time.new(2013, 3, 2) }}
|
24
|
+
it "should format the date in the url" do
|
25
|
+
Intown::Event.list(input_params)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "date range" do
|
30
|
+
let(:expected_params) {{ :date => '2013-03-02,2013-03-08' }}
|
31
|
+
let(:input_params) {{ :name => "Radiohead", :from => Time.new(2013, 3, 2), :to => Time.new(2013, 3, 8)}}
|
32
|
+
it "should format the date range from to/from date params" do
|
33
|
+
Intown::Event.list(input_params)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "upcoming" do
|
38
|
+
let(:expected_params) {{ :date => 'upcoming' }}
|
39
|
+
let(:input_params) {{ :name => "Radiohead", :upcoming => true}}
|
40
|
+
it "should set the date parameter to upcoming" do
|
41
|
+
Intown::Event.list(input_params)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "all" do
|
46
|
+
let(:expected_params) {{ :date => 'all' }}
|
47
|
+
let(:input_params) {{ :name => "Radiohead", :all => true}}
|
48
|
+
it "should set the date parameter to all" do
|
49
|
+
Intown::Event.list(input_params)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'rubygems'
|
4
|
+
require 'intown'
|
5
|
+
require 'rspec'
|
6
|
+
require 'vcr'
|
7
|
+
require 'httparty'
|
8
|
+
require 'pry'
|
9
|
+
|
10
|
+
VCR.configure do |c|
|
11
|
+
c.cassette_library_dir = 'spec/fixtures/cassettes'
|
12
|
+
c.hook_into :webmock
|
13
|
+
c.allow_http_connections_when_no_cassette = true
|
14
|
+
end
|
metadata
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: intown
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: 0.1.0
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Ben Scheirman
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-02-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
prerelease: false
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ~>
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 2.12.0
|
21
|
+
none: false
|
22
|
+
type: :development
|
23
|
+
name: rspec
|
24
|
+
requirement: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - ~>
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: 2.12.0
|
29
|
+
none: false
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
prerelease: false
|
32
|
+
version_requirements: !ruby/object:Gem::Requirement
|
33
|
+
requirements:
|
34
|
+
- - ~>
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.4.0
|
37
|
+
none: false
|
38
|
+
type: :development
|
39
|
+
name: vcr
|
40
|
+
requirement: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.4.0
|
45
|
+
none: false
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
prerelease: false
|
48
|
+
version_requirements: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ~>
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: 1.9.3
|
53
|
+
none: false
|
54
|
+
type: :development
|
55
|
+
name: webmock
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ~>
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.9.3
|
61
|
+
none: false
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ! '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
none: false
|
70
|
+
type: :development
|
71
|
+
name: pry
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
none: false
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ~>
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.10.0
|
85
|
+
none: false
|
86
|
+
type: :runtime
|
87
|
+
name: httparty
|
88
|
+
requirement: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ~>
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 0.10.0
|
93
|
+
none: false
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
prerelease: false
|
96
|
+
version_requirements: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ~>
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: 2.0.0
|
101
|
+
none: false
|
102
|
+
type: :runtime
|
103
|
+
name: hashie
|
104
|
+
requirement: !ruby/object:Gem::Requirement
|
105
|
+
requirements:
|
106
|
+
- - ~>
|
107
|
+
- !ruby/object:Gem::Version
|
108
|
+
version: 2.0.0
|
109
|
+
none: false
|
110
|
+
description: A client for the Bandsintown API.
|
111
|
+
email:
|
112
|
+
- ben@scheirman.com
|
113
|
+
executables: []
|
114
|
+
extensions: []
|
115
|
+
extra_rdoc_files: []
|
116
|
+
files:
|
117
|
+
- .gitignore
|
118
|
+
- .rspec
|
119
|
+
- Gemfile
|
120
|
+
- LICENSE.txt
|
121
|
+
- README.md
|
122
|
+
- Rakefile
|
123
|
+
- intown.gemspec
|
124
|
+
- lib/intown.rb
|
125
|
+
- lib/intown/artist.rb
|
126
|
+
- lib/intown/client.rb
|
127
|
+
- lib/intown/configuration.rb
|
128
|
+
- lib/intown/errors.rb
|
129
|
+
- lib/intown/event.rb
|
130
|
+
- lib/intown/version.rb
|
131
|
+
- spec/acceptance/fetch_artist_by_name_spec.rb
|
132
|
+
- spec/acceptance/fetch_events_by_artist_spec.rb
|
133
|
+
- spec/fixtures/cassettes/fetch_artist_no_app_id_set.yml
|
134
|
+
- spec/fixtures/cassettes/fetch_events_for_known_band.yml
|
135
|
+
- spec/fixtures/cassettes/fetch_events_for_unknown_band.yml
|
136
|
+
- spec/fixtures/cassettes/find_artist_by_name.yml
|
137
|
+
- spec/fixtures/cassettes/find_unknown_artist.yml
|
138
|
+
- spec/intown/artist_spec.rb
|
139
|
+
- spec/intown/configuration_spec.rb
|
140
|
+
- spec/intown/event_spec.rb
|
141
|
+
- spec/intown/tourbus_spec.rb
|
142
|
+
- spec/spec_helper.rb
|
143
|
+
homepage: https://github.com/subdigital/intown
|
144
|
+
licenses: []
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ! '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
none: false
|
155
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
none: false
|
161
|
+
requirements: []
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 1.8.25
|
164
|
+
signing_key:
|
165
|
+
specification_version: 3
|
166
|
+
summary: Supports Bandsintown API version 1.1
|
167
|
+
test_files:
|
168
|
+
- spec/acceptance/fetch_artist_by_name_spec.rb
|
169
|
+
- spec/acceptance/fetch_events_by_artist_spec.rb
|
170
|
+
- spec/fixtures/cassettes/fetch_artist_no_app_id_set.yml
|
171
|
+
- spec/fixtures/cassettes/fetch_events_for_known_band.yml
|
172
|
+
- spec/fixtures/cassettes/fetch_events_for_unknown_band.yml
|
173
|
+
- spec/fixtures/cassettes/find_artist_by_name.yml
|
174
|
+
- spec/fixtures/cassettes/find_unknown_artist.yml
|
175
|
+
- spec/intown/artist_spec.rb
|
176
|
+
- spec/intown/configuration_spec.rb
|
177
|
+
- spec/intown/event_spec.rb
|
178
|
+
- spec/intown/tourbus_spec.rb
|
179
|
+
- spec/spec_helper.rb
|
180
|
+
has_rdoc:
|