upcoming-api 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 ADDED
File without changes
data/Rakefile ADDED
@@ -0,0 +1,36 @@
1
+ require 'fileutils'
2
+
3
+ desc 'run all tests'
4
+ task :test do
5
+ require 'rake/runtest'
6
+ Rake.run_tests 'test/test*.rb'
7
+ end
8
+
9
+ desc 'clean up all non source controlled files and directories'
10
+ task :clean do
11
+ FileUtils.rm_r('pkg', :force => true)
12
+ end
13
+
14
+ require 'rubygems'
15
+ Gem::manage_gems
16
+ require 'rake/gempackagetask'
17
+
18
+ spec = Gem::Specification.new do |s|
19
+ s.name = "upcoming-api"
20
+ s.version = "0.1"
21
+ s.author = "Larry Myers"
22
+ s.email = "larry@larrymyers.com"
23
+ s.homepage = "http://rubyforge.org/projects/upcoming-api/"
24
+ s.platform = Gem::Platform::RUBY
25
+ s.summary = "A ruby library for using the Upcoming.org REST API."
26
+ s.files = FileList["{tests,lib}/**/*","Rakefile","README"].to_a
27
+ s.require_path = "lib"
28
+ s.autorequire = "event"
29
+ s.test_files = FileList["test/test*.rb"].to_a
30
+ s.has_rdoc = true
31
+ s.extra_rdoc_files = ["README"]
32
+ end
33
+
34
+ Rake::GemPackageTask.new(spec) do |pkg|
35
+ pkg.need_tar = true
36
+ end
data/lib/upcoming.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'upcoming/auth'
2
+ require 'upcoming/category'
3
+ require 'upcoming/country'
4
+ require 'upcoming/event'
5
+ require 'upcoming/metro'
6
+ require 'upcoming/request'
7
+ require 'upcoming/state'
8
+ require 'upcoming/venue'
@@ -0,0 +1,47 @@
1
+ require 'rexml/document'
2
+ include REXML
3
+
4
+ module Upcoming
5
+ class Auth
6
+ API_KEY = 'change-me'
7
+ FROB = 'change-me'
8
+
9
+ attr_reader :token, :user_id, :user_name, :name
10
+
11
+ def initialize
12
+ @token = nil
13
+ @user_id = nil
14
+ @user_name = nil
15
+ @name = nil
16
+ end
17
+
18
+ def get_token
19
+ req = Upcoming::Request.new
20
+ resp = req.send({:method => 'auth.getToken', :frob => Upcoming::Auth::FROB})
21
+
22
+ doc = Document.new(resp.body)
23
+ el = XPath.first(doc, '//token')
24
+
25
+ @token = el.attribute('token').value
26
+ @user_id = el.attribute('user_id').value
27
+ @user_name = el.attribute('user_username').value
28
+ @name = el.attribute('user_name').value
29
+
30
+ return true
31
+ end
32
+
33
+ def valid_token?
34
+ req = Upcoming::Request.new
35
+ resp = req.send({:method => 'auth.checkToken', :token => @token})
36
+
37
+ doc = Document.new(resp.body)
38
+ el = XPath.first(doc, '//token')
39
+
40
+ if el.nil?
41
+ return false
42
+ end
43
+
44
+ return true
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,34 @@
1
+ require 'rexml/document'
2
+ require 'upcoming/request'
3
+ include REXML
4
+
5
+ module Upcoming
6
+ class Category
7
+ attr_reader :id, :name, :description
8
+
9
+ def initialize(id, name, description)
10
+ @id = id
11
+ @name = name
12
+ @description = description
13
+ end
14
+
15
+ def self.info(category_id)
16
+ # TODO synthetic method, we'll have to call list and search it for a single id
17
+ end
18
+
19
+ def self.list
20
+ categories = []
21
+
22
+ req = Upcoming::Request.new
23
+ resp = req.send({:method => 'category.getList'})
24
+
25
+ doc = Document.new(resp.body)
26
+ XPath.each(doc, '//category') do |el|
27
+ categories << Category.new(el.attribute('id').value,
28
+ el.attribute('name').value, el.attribute('description').value)
29
+ end
30
+
31
+ categories
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,53 @@
1
+ require 'rexml/document'
2
+ require 'upcoming/request'
3
+ include REXML
4
+
5
+ module Upcoming
6
+ class Country
7
+ attr_reader :id, :name, :code
8
+
9
+ def initialize(id, name, code)
10
+ @id = id
11
+ @name = name
12
+ @code = code
13
+ end
14
+
15
+ def self.get_info(country_id)
16
+ req = Upcoming::Request.new
17
+ resp = req.send({:method => 'country.getInfo', :country_id => country_id.to_s})
18
+
19
+ doc = Document.new(resp.body)
20
+ el = XPath.first(doc, '//country')
21
+
22
+ Country.new(el.attribute('id').value, el.attribute('name').value, el.attribute('code').value)
23
+ end
24
+
25
+ def self.get_infos(country_id_list)
26
+ req = Upcoming::Request.new
27
+ resp = req.send({:method => 'country.getInfo', :country_id => country_id_list.join(',')})
28
+
29
+ countries = []
30
+
31
+ doc = Document.new(resp.body)
32
+ XPath.each(doc, '//country') do |c|
33
+ countries << Country.new(c.attribute('id').value, c.attribute('name').value, c.attribute('code').value)
34
+ end
35
+
36
+ countries
37
+ end
38
+
39
+ def self.get_all_infos
40
+ req = Upcoming::Request.new
41
+ resp = req.send({:method => 'metro.getCountryList'})
42
+
43
+ countries = []
44
+
45
+ doc = Document.new(resp.body)
46
+ XPath.each(doc, '//country') do |c|
47
+ countries << Country.new(c.attribute('id').value, c.attribute('name').value, c.attribute('code').value)
48
+ end
49
+
50
+ countries
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,103 @@
1
+ require 'rexml/document'
2
+ require 'upcoming/request'
3
+ require 'upcoming/venue'
4
+
5
+ module Upcoming
6
+ class Event
7
+
8
+ attr_reader :id, :name, :description, :start_date, :end_date,
9
+ :start_time, :end_time, :date_posted, :personal, :self_promotion,
10
+ :lat, :lng, :gc_precision, :gc_ambiguous
11
+
12
+ def initialize(attrs_hash)
13
+ @id = attrs_hash[:id]
14
+ @name = attrs_hash[:name]
15
+ @description = attrs_hash[:description]
16
+ @start_date = attrs_hash[:start_date]
17
+ @end_date = attrs_hash[:end_date]
18
+ @start_time = attrs_hash[:start_time]
19
+ @end_time = attrs_hash[:end_time]
20
+ @date_posted = attrs_hash[:date_posted]
21
+ @personal = attrs_hash[:personal]
22
+ @self_promotion = attrs_hash[:self_promotion]
23
+ @lat = attrs_hash[:lat]
24
+ @lng = attrs_hash[:lng]
25
+ @gc_precision = attrs_hash[:gc_precision]
26
+ @gc_ambiguous = attrs_hash[:gc_ambiguous]
27
+ @user_id = attrs_hash[:user_id]
28
+ @category_id = attrs_hash[:category_id]
29
+ @venue_id = attrs_hash[:venue_id]
30
+ @metro_id = attrs_hash[:metro_id]
31
+ @state_id = attrs_hash[:state_id]
32
+ @country_id = attrs_hash[:country_id]
33
+ end
34
+
35
+ def user
36
+ # TODO get user info about event
37
+ end
38
+
39
+ def category
40
+ # TODO populate me intelligently
41
+ end
42
+
43
+ def venue
44
+ Upcoming::Venue.info(@venue_id)
45
+ end
46
+
47
+ def metro
48
+ # TODO get metro info for event
49
+ end
50
+
51
+ def state
52
+ # TODO get state info for event
53
+ end
54
+
55
+ def country
56
+ # TODO get country info for event
57
+ end
58
+
59
+ def self.search(params)
60
+ params[:method] = 'event.search' if params[:method].nil?
61
+
62
+ req = Upcoming::Request.new
63
+ resp = req.send(params)
64
+
65
+ events = []
66
+ doc = Document.new(resp.body)
67
+
68
+ XPath.each(doc, '//event') { |el| events << Event.create_from_node(el) }
69
+
70
+ events
71
+ end
72
+
73
+ def self.valid_params?(params)
74
+ end
75
+
76
+ def self.create_from_node(node)
77
+ attrs = {}
78
+
79
+ attrs[:id] = node.attribute('id').value
80
+ attrs[:name] = node.attribute('name').value
81
+ attrs[:description] = node.attribute('description').value
82
+ attrs[:start_date] = node.attribute('start_date').value
83
+ attrs[:end_date] = node.attribute('end_date').value
84
+ attrs[:start_time] = node.attribute('start_time').value
85
+ attrs[:end_time] = node.attribute('end_time').value
86
+ attrs[:date_posted] = node.attribute('date_posted').value
87
+ attrs[:personal] = node.attribute('personal').value
88
+ attrs[:self_promotion] = node.attribute('selfpromotion').value
89
+ attrs[:lat] = node.attribute('latitude').value
90
+ attrs[:lng] = node.attribute('longitude').value
91
+ attrs[:gc_precision] = node.attribute('geocoding_precision').value
92
+ attrs[:gc_ambiguous] = node.attribute('geocoding_ambiguous').value
93
+ attrs[:user_id] = node.attribute('user_id').value
94
+ attrs[:category_id] = node.attribute('category_id').value
95
+ attrs[:venue_id] = node.attribute('venue_id').value
96
+ attrs[:metro_id] = node.attribute('metro_id').value
97
+ attrs[:state_id] = node.attribute('venue_state_id').value
98
+ attrs[:country_id] = node.attribute('venue_country_id').value
99
+
100
+ Event.new(attrs)
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,67 @@
1
+ require 'rexml/document'
2
+ require 'upcoming/request'
3
+ require 'upcoming/state'
4
+ require 'upcoming/country'
5
+ include REXML
6
+
7
+ module Upcoming
8
+ class Metro
9
+ attr_reader :id, :name, :code, :url, :state, :country
10
+
11
+ def initialize(id, name, code, url, state, country)
12
+ @id = id
13
+ @name = name
14
+ @code = code
15
+ @url = url
16
+ @state = state
17
+ @country = country
18
+ end
19
+
20
+ def self.search(text, state_id=nil, country_id=nil)
21
+ metros = []
22
+
23
+ req = Upcoming::Request.new
24
+ resp = req.send({:method => 'metro.search', :search_text => text,
25
+ :state_id => state_id, :country_id => country_id})
26
+
27
+ doc = Document.new(resp.body)
28
+
29
+ XPath.each(doc, '//metro') do |m|
30
+ state = State.new(m.attribute('state_id').value, m.attribute('state_name').value,
31
+ m.attribute('state_code').value, m.attribute('country_id').value)
32
+
33
+ country = Country.new(m.attribute('country_id').value, m.attribute('country_name').value,
34
+ m.attribute('country_code').value)
35
+
36
+ metros << Metro.new(m.attribute('id').value, m.attribute('name').value,
37
+ m.attribute('code').value, m.attribute('url').value, state, country)
38
+ end
39
+
40
+ metros
41
+ end
42
+
43
+ def self.get_info(metro_id)
44
+ # TODO implement me
45
+ end
46
+
47
+ def self.get_infos(metro_id_list)
48
+ # TODO implement me
49
+ end
50
+
51
+ def self.get_by_lat_lon(lat,lon)
52
+ # TODO implement me
53
+ end
54
+
55
+ def self.list_by_state(state_id)
56
+ # TODO implement me
57
+ end
58
+
59
+ def self.states(country_id)
60
+ Upcoming::State.get_all_infos(country_id)
61
+ end
62
+
63
+ def self.countries
64
+ Upcoming::Country.get_all_infos
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,33 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'upcoming/auth'
4
+
5
+ module Upcoming
6
+ class Request
7
+ URL = 'http://upcoming.yahooapis.com/services/rest/?'
8
+
9
+ def send(params)
10
+ url = get_url(params)
11
+
12
+ resp = nil
13
+
14
+ begin
15
+ resp = Net::HTTP.get_response(URI.parse(url))
16
+ rescue
17
+ puts 'Uh oh.'
18
+ end
19
+
20
+ resp
21
+ end
22
+
23
+ def get_url(params)
24
+ url = URL + 'api_key=' + Auth::API_KEY
25
+
26
+ params.each do |k,v|
27
+ url << "&#{k.to_s}=#{URI.encode(v.to_s)}"
28
+ end
29
+
30
+ url
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,57 @@
1
+ require 'rexml/document'
2
+ require 'upcoming/request'
3
+ include REXML
4
+
5
+ module Upcoming
6
+ class State
7
+ attr_reader :id, :name, :code, :country_id
8
+
9
+ def initialize(id, name, code, country_id)
10
+ @id = id
11
+ @name = name
12
+ @code = code
13
+ @country_id = country_id
14
+ end
15
+
16
+ def self.get_info(state_id)
17
+ req = Upcoming::Request.new
18
+ resp = req.send({:method => 'state.getInfo', :state_id => state_id.to_s})
19
+
20
+ doc = Document.new(resp.body)
21
+ el = XPath.first(doc, '//state')
22
+
23
+ State.new(el.attribute('id').value, el.attribute('name').value,
24
+ el.attribute('code').value, el.attribute('country_id').value)
25
+ end
26
+
27
+ def self.get_infos(state_id_list)
28
+ req = Upcoming::Request.new
29
+ resp = req.send({:method => 'state.getInfo', :state_id => state_id_list.join(',')})
30
+
31
+ states = []
32
+
33
+ doc = Document.new(resp.body)
34
+ XPath.each(doc, '//state') do |s|
35
+ states << State.new(s.attribute('id').value, s.attribute('name').
36
+ value, s.attribute('code').value, s.attribute('country_id').value)
37
+ end
38
+
39
+ states
40
+ end
41
+
42
+ def self.get_all_infos(country_id)
43
+ states = []
44
+
45
+ req = Upcoming::Request.new
46
+ resp = req.send({:method => 'metro.getStateList', :country_id => country_id.to_s})
47
+
48
+ doc = Document.new(resp.body)
49
+ XPath.each(doc, '//state') do |s|
50
+ states << State.new(s.attribute('id').value, s.attribute('name').
51
+ value, s.attribute('code').value, country_id.to_s)
52
+ end
53
+
54
+ states
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,71 @@
1
+ require 'rexml/document'
2
+ require 'upcoming/request'
3
+ include REXML
4
+
5
+ module Upcoming
6
+ class Venue
7
+ attr_reader :id, :name, :city, :url, :user_id, :lat, :lng, :gc_precision
8
+
9
+ def initialize(id, name, city, url, user_id, visibility, lat, lng, gc_precision)
10
+ @id = id
11
+ @name = name
12
+ @city = city
13
+ @url = url
14
+ @user_id = user_id
15
+ @visibility = visibility
16
+ @lat = lat
17
+ @lng = lng
18
+ @gc_precision = gc_precision
19
+ end
20
+
21
+ def private?
22
+ return false if @visibility.nil? || @visibility == 0
23
+
24
+ return true
25
+ end
26
+
27
+ def self.search(params)
28
+ # TODO implement venue search
29
+ end
30
+
31
+ def self.info(venue_id, token=nil)
32
+ params = {:method => 'venue.getInfo', :venue_id => venue_id}
33
+ params[:token] = token unless token.nil?
34
+
35
+ req = Upcoming::Request.new
36
+ resp = req.send(params)
37
+
38
+ doc = Document.new(resp.body)
39
+ el = XPath.first(doc, '//venue')
40
+
41
+ Venue.new(
42
+ el.attribute('id').value,
43
+ el.attribute('name').value,
44
+ el.attribute('city').value,
45
+ el.attribute('url').value,
46
+ el.attribute('user_id').value,
47
+ el.attribute('private').value,
48
+ el.attribute('latitude').value,
49
+ el.attribute('longitude').value,
50
+ el.attribute('geocoding_precision').value
51
+ )
52
+ end
53
+
54
+ def self.list(metro_id, token=nil)
55
+ params = {:method => 'venue.getList', :metro_id => metro_id}
56
+ params[:token] = token unless token.nil?
57
+
58
+ req = Upcoming::Request.new
59
+ resp = req.send(params)
60
+
61
+ venues = []
62
+
63
+ doc = Document.new(resp.body)
64
+ XPath.each(doc, '//venue') do |v|
65
+ # TODO parse my elements, yo!
66
+ end
67
+
68
+ venues
69
+ end
70
+ end
71
+ end
data/test/test_auth.rb ADDED
@@ -0,0 +1,10 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/auth'
4
+ require 'test/unit'
5
+
6
+ class TestAuth < Test::Unit::TestCase
7
+ def test_api_key
8
+ assert_not_equal('', Upcoming::Auth::API_KEY)
9
+ end
10
+ end
@@ -0,0 +1,16 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/category'
4
+ require 'test/unit'
5
+
6
+ class TestCategory < Test::Unit::TestCase
7
+ def test_get_category_list
8
+ cats = Upcoming::Category.list
9
+
10
+ assert_not_nil(cats)
11
+ assert_not_equal(0, cats.size)
12
+ assert_match(/^\d+$/, cats[0].id)
13
+ assert_instance_of(String, cats[0].name)
14
+ assert_instance_of(String, cats[0].description)
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/country'
4
+ require 'test/unit'
5
+
6
+ class TestCountry < Test::Unit::TestCase
7
+ def test_get_info
8
+ c = Upcoming::Country.get_info(1)
9
+
10
+ assert_equal('1', c.id)
11
+ assert_equal('United States', c.name)
12
+ assert_equal('us', c.code)
13
+ end
14
+
15
+ def test_get_infos
16
+ countries = Upcoming::Country.get_infos([1,2,3])
17
+
18
+ assert_equal(3, countries.size)
19
+ end
20
+
21
+ def test_get_all_infos
22
+ countries = Upcoming::Country.get_all_infos
23
+
24
+ assert_not_equal(0, countries.size)
25
+ end
26
+ end
@@ -0,0 +1,9 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/event'
4
+ require 'test/unit'
5
+
6
+ class TestEvent < Test::Unit::TestCase
7
+ def test_search
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/metro'
4
+ require 'test/unit'
5
+
6
+ class TestMetro < Test::Unit::TestCase
7
+ def test_get_states
8
+ states = Upcoming::Metro.states(1)
9
+
10
+ assert_not_nil(states)
11
+ assert_not_equal(0, states.size)
12
+ end
13
+
14
+ def test_get_countries
15
+ countries = Upcoming::Metro.countries
16
+
17
+ assert_not_nil(countries)
18
+ assert_not_equal(0, countries)
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/request'
4
+ require 'test/unit'
5
+
6
+ class TestRequest < Test::Unit::TestCase
7
+ def test_get_url
8
+ expected_url = 'http://upcoming.yahooapis.com/services/rest/'
9
+ expected_url << '?api_key=6c43a45521&metro_id=1&method=metro.getInfo'
10
+
11
+ params = {:method => 'metro.getInfo', :metro_id => '1'}
12
+
13
+ req = Upcoming::Request.new
14
+
15
+ assert_equal(expected_url, req.get_url(params))
16
+ end
17
+
18
+ def test_send
19
+ params = {:method => 'metro.getInfo', :metro_id => '1'}
20
+
21
+ req = Upcoming::Request.new
22
+
23
+ resp = req.send(params)
24
+
25
+ assert_not_nil(resp.body)
26
+ assert_not_equal('', resp.body)
27
+ end
28
+ end
@@ -0,0 +1,27 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+
3
+ require 'upcoming/state'
4
+ require 'test/unit'
5
+
6
+ class TestState < Test::Unit::TestCase
7
+ def test_get_info
8
+ s = Upcoming::State.get_info(1)
9
+
10
+ assert_equal('1', s.id)
11
+ assert_equal('Alabama', s.name)
12
+ assert_equal('al', s.code)
13
+ assert_equal('1', s.country_id)
14
+ end
15
+
16
+ def test_get_infos
17
+ states = Upcoming::State.get_infos([1,2,3])
18
+
19
+ assert_equal(3, states.size)
20
+ end
21
+
22
+ def test_get_all_infos
23
+ states = Upcoming::State.get_all_infos(1)
24
+
25
+ assert_not_equal(0, states.size)
26
+ end
27
+ end
metadata ADDED
@@ -0,0 +1,63 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.9.4
3
+ specification_version: 1
4
+ name: upcoming-api
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.1"
7
+ date: 2007-12-24 00:00:00 -05:00
8
+ summary: A ruby library for using the Upcoming.org REST API.
9
+ require_paths:
10
+ - lib
11
+ email: larry@larrymyers.com
12
+ homepage: http://rubyforge.org/projects/upcoming-api/
13
+ rubyforge_project:
14
+ description:
15
+ autorequire: event
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ post_install_message:
29
+ authors:
30
+ - Larry Myers
31
+ files:
32
+ - lib/upcoming
33
+ - lib/upcoming/auth.rb
34
+ - lib/upcoming/category.rb
35
+ - lib/upcoming/country.rb
36
+ - lib/upcoming/event.rb
37
+ - lib/upcoming/metro.rb
38
+ - lib/upcoming/request.rb
39
+ - lib/upcoming/state.rb
40
+ - lib/upcoming/venue.rb
41
+ - lib/upcoming.rb
42
+ - Rakefile
43
+ - README
44
+ test_files:
45
+ - test/test_auth.rb
46
+ - test/test_category.rb
47
+ - test/test_country.rb
48
+ - test/test_event.rb
49
+ - test/test_metro.rb
50
+ - test/test_request.rb
51
+ - test/test_state.rb
52
+ rdoc_options: []
53
+
54
+ extra_rdoc_files:
55
+ - README
56
+ executables: []
57
+
58
+ extensions: []
59
+
60
+ requirements: []
61
+
62
+ dependencies: []
63
+