rmeetup 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. data/.gitignore +1 -0
  2. data/README.rdoc +5 -0
  3. data/VERSION +1 -0
  4. data/lib/rmeetup.rb +69 -0
  5. data/lib/rmeetup/collection.rb +58 -0
  6. data/lib/rmeetup/fetcher.rb +38 -0
  7. data/lib/rmeetup/fetcher/base.rb +84 -0
  8. data/lib/rmeetup/fetcher/cities.rb +14 -0
  9. data/lib/rmeetup/fetcher/comments.rb +14 -0
  10. data/lib/rmeetup/fetcher/events.rb +14 -0
  11. data/lib/rmeetup/fetcher/groups.rb +14 -0
  12. data/lib/rmeetup/fetcher/members.rb +14 -0
  13. data/lib/rmeetup/fetcher/photos.rb +14 -0
  14. data/lib/rmeetup/fetcher/rsvps.rb +14 -0
  15. data/lib/rmeetup/fetcher/topics.rb +14 -0
  16. data/lib/rmeetup/type.rb +8 -0
  17. data/lib/rmeetup/type/city.rb +24 -0
  18. data/lib/rmeetup/type/comment.rb +28 -0
  19. data/lib/rmeetup/type/event.rb +30 -0
  20. data/lib/rmeetup/type/group.rb +33 -0
  21. data/lib/rmeetup/type/member.rb +26 -0
  22. data/lib/rmeetup/type/photo.rb +22 -0
  23. data/lib/rmeetup/type/rsvp.rb +25 -0
  24. data/lib/rmeetup/type/topic.rb +24 -0
  25. data/spec/client_spec.rb +35 -0
  26. data/spec/fetcher_spec.rb +18 -0
  27. data/spec/fetchers/base_spec.rb +58 -0
  28. data/spec/fetchers/cities_spec.rb +18 -0
  29. data/spec/fetchers/comments_spec.rb +14 -0
  30. data/spec/fetchers/events_spec.rb +14 -0
  31. data/spec/fetchers/groups_spec.rb +14 -0
  32. data/spec/fetchers/members_spec.rb +14 -0
  33. data/spec/fetchers/photos_spec.rb +14 -0
  34. data/spec/fetchers/rsvps_spec.rb +14 -0
  35. data/spec/fetchers/topics_spec.rb +14 -0
  36. data/spec/responses/cities.json +1 -0
  37. data/spec/responses/comments.json +1 -0
  38. data/spec/responses/error.json +1 -0
  39. data/spec/responses/events.json +1 -0
  40. data/spec/responses/groups.json +1 -0
  41. data/spec/responses/members.json +1 -0
  42. data/spec/responses/photos.json +1 -0
  43. data/spec/responses/rsvps.json +1 -0
  44. data/spec/responses/topics.json +1 -0
  45. data/spec/spec_helper.rb +82 -0
  46. metadata +111 -0
@@ -0,0 +1 @@
1
+ .DS_Store
@@ -0,0 +1,5 @@
1
+ == rMeetup
2
+
3
+ A simple Ruby gem to access the Meetup API.
4
+
5
+ TODO: Doc, Doc, Doc
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.0
@@ -0,0 +1,69 @@
1
+ require 'net/http'
2
+ require 'date'
3
+ require 'rubygems'
4
+ require 'json'
5
+ require 'rmeetup/type'
6
+ require 'rmeetup/collection'
7
+ require 'rmeetup/fetcher'
8
+
9
+ module RMeetup
10
+
11
+ # RMeetup Errors
12
+ class NotConfiguredError < StandardError
13
+ def initialize
14
+ super "Please provide your Meetup API key before fetching data."
15
+ end
16
+ end
17
+
18
+ class InvalidRequestTypeError < StandardError
19
+ def initialize(type)
20
+ super "Fetch type '#{type}' not a valid."
21
+ end
22
+ end
23
+
24
+ # == RMeetup::Client
25
+ #
26
+ # Essentially a simple wrapper to delegate requests to
27
+ # different fetcher classes who are responsible for fetching
28
+ # and parsing their own responses.
29
+ class Client
30
+ FETCH_TYPES = [:topics, :cities, :members, :rsvps, :events, :groups, :comments, :photos]
31
+
32
+ # Meetup API Key
33
+ # Get one at http://www.meetup.com/meetup_api/key/
34
+ # Needs to be the group organizers API Key
35
+ # to be able to RSVP for other people
36
+ @@api_key = nil
37
+ def self.api_key; @@api_key; end;
38
+ def self.api_key=(key); @@api_key = key; end;
39
+
40
+ def self.fetch(type, options = {})
41
+ check_configuration!
42
+
43
+ # Merge in all the standard options
44
+ # Keeping whatever was passed in
45
+ options = default_options.merge(options)
46
+
47
+ if FETCH_TYPES.include?(type.to_sym)
48
+ # Get the custom fetcher used to manage options, api call to get a type of response
49
+ fetcher = RMeetup::Fetcher.for(type)
50
+ return fetcher.fetch(options)
51
+ else
52
+ raise InvalidRequestTypeError.new(type)
53
+ end
54
+ end
55
+
56
+ protected
57
+ def self.default_options
58
+ {
59
+ :key => api_key
60
+ }
61
+ end
62
+
63
+ # Raise an error if RMeetup has not been
64
+ # provided with an api key
65
+ def self.check_configuration!
66
+ raise NotConfiguredError.new unless api_key
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,58 @@
1
+ module RMeetup
2
+ class Collection < Array
3
+ attr_accessor :page_size, :total_results
4
+ attr_writer :current_page
5
+
6
+ def self.build(response)
7
+ collection = Collection.new()
8
+
9
+ # Setup the attributes needed for WillPaginate style paging
10
+ request_url = response['meta']['url']
11
+ request_parameters = parse_parameters_from_url(request_url)
12
+ collection.page_size = request_parameters['page'] ? request_parameters['page'].to_i : nil
13
+ collection.total_results = response['meta']['total_count'].to_i
14
+ collection.current_page = request_parameters['offset'] ? (request_parameters['offset'].to_i + 1) : 1
15
+
16
+ # Load the collection with all
17
+ # of the results we passed in
18
+ response['results'].each do |result|
19
+ collection << result
20
+ end
21
+
22
+ collection
23
+ end
24
+
25
+ # = WillPaginate Helper Methods
26
+ #
27
+ # These methods are implementded so that
28
+ # you may pass this collection to the will_paginate
29
+ # view helper to render pagination links.
30
+ def current_page
31
+ @current_page
32
+ end
33
+
34
+ def total_pages
35
+ @page_size ? (@total_results.to_f / @page_size.to_f).ceil : 1
36
+ end
37
+
38
+ def previous_page
39
+ self.current_page == 1 ? nil : self.current_page.to_i-1
40
+ end
41
+
42
+ def next_page
43
+ self.current_page == self.total_pages ? nil : self.current_page.to_i+1
44
+ end
45
+
46
+ protected
47
+ def self.parse_parameters_from_url(url)
48
+ query = URI.parse(url).query
49
+ parameters = {}
50
+
51
+ query.split("&").each do |kv|
52
+ kv = kv.split("=")
53
+ parameters[kv[0]] = kv[1]
54
+ end
55
+ parameters
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,38 @@
1
+ require "rmeetup/fetcher/base"
2
+ require "rmeetup/fetcher/topics"
3
+ require "rmeetup/fetcher/cities"
4
+ require "rmeetup/fetcher/members"
5
+ require "rmeetup/fetcher/rsvps"
6
+ require "rmeetup/fetcher/events"
7
+ require "rmeetup/fetcher/groups"
8
+ require "rmeetup/fetcher/comments"
9
+ require "rmeetup/fetcher/photos"
10
+
11
+ module RMeetup
12
+ module Fetcher
13
+
14
+ class << self
15
+ # Return a fetcher for given type
16
+ def for(type)
17
+ return case type.to_sym
18
+ when :topics
19
+ Topics.new
20
+ when :cities
21
+ Cities.new
22
+ when :members
23
+ Members.new
24
+ when :rsvps
25
+ Rsvps.new
26
+ when :events
27
+ Events.new
28
+ when :groups
29
+ Groups.new
30
+ when :comments
31
+ Comments.new
32
+ when :photos
33
+ Photos.new
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,84 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class ApiError < StandardError
4
+ def initialize(error_message, request_url)
5
+ super "Meetup API Error: #{error_message} - API URL: #{request_url}"
6
+ end
7
+ end
8
+
9
+ class NoResponseError < StandardError
10
+ def initialize
11
+ super "No Response was returned from the Meetup API."
12
+ end
13
+ end
14
+
15
+ # == RMeetup::Fetcher::Base
16
+ #
17
+ # Base fetcher class that other fetchers
18
+ # will inherit from.
19
+ class Base
20
+ def initialize
21
+ @type = nil
22
+ end
23
+
24
+ # Fetch and parse a response
25
+ # based on a set of options.
26
+ # Override this method to ensure
27
+ # neccessary options are passed
28
+ # for the request.
29
+ def fetch(options = {})
30
+ url = build_url(options)
31
+
32
+ json = get_response(url)
33
+ data = JSON.parse(json)
34
+
35
+ # Check to see if the api returned an error
36
+ raise ApiError.new(data['details'],url) if data.has_key?('problem')
37
+
38
+ collection = RMeetup::Collection.build(data)
39
+
40
+ # Format each result in the collection and return it
41
+ collection.map!{|result| format_result(result)}
42
+ end
43
+
44
+ protected
45
+ # OVERRIDE this method to format a result section
46
+ # as per Result type.
47
+ # Takes a result in a collection and
48
+ # formats it to be put back into the collection.
49
+ def format_result(result)
50
+ result
51
+ end
52
+
53
+ def build_url(options)
54
+ options = encode_options(options)
55
+
56
+ base_url + params_for(options)
57
+ end
58
+
59
+ def base_url
60
+ "http://api.meetup.com/#{@type}.json/"
61
+ end
62
+
63
+ # Create a query string from an options hash
64
+ def params_for(options)
65
+ params = []
66
+ options.each do |key, value|
67
+ params << "#{key}=#{value}"
68
+ end
69
+ "?#{params.join("&")}"
70
+ end
71
+
72
+ # Encode a hash of options to be used as request parameters
73
+ def encode_options(options)
74
+ options.each do |key,value|
75
+ options[key] = URI.encode(value.to_s)
76
+ end
77
+ end
78
+
79
+ def get_response(url)
80
+ Net::HTTP.get_response(URI.parse(url)).body || raise(NoResponseError.new)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Cities < Base
4
+ def initialize
5
+ @type = :cities
6
+ end
7
+
8
+ # Turn the result hash into a City Class
9
+ def format_result(result)
10
+ RMeetup::Type::City.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Comments < Base
4
+ def initialize
5
+ @type = :comments
6
+ end
7
+
8
+ # Turn the result hash into a Comment Class
9
+ def format_result(result)
10
+ RMeetup::Type::Comment.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Events < Base
4
+ def initialize
5
+ @type = :events
6
+ end
7
+
8
+ # Turn the result hash into a Event Class
9
+ def format_result(result)
10
+ RMeetup::Type::Event.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Groups < Base
4
+ def initialize
5
+ @type = :groups
6
+ end
7
+
8
+ # Turn the result hash into a Group Class
9
+ def format_result(result)
10
+ RMeetup::Type::Group.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Members < Base
4
+ def initialize
5
+ @type = :members
6
+ end
7
+
8
+ # Turn the result hash into a Member Class
9
+ def format_result(result)
10
+ RMeetup::Type::Member.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Photos < Base
4
+ def initialize
5
+ @type = :photos
6
+ end
7
+
8
+ # Turn the result hash into a Photo Class
9
+ def format_result(result)
10
+ RMeetup::Type::Photo.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Rsvps < Base
4
+ def initialize
5
+ @type = :rsvps
6
+ end
7
+
8
+ # Turn the result hash into a Rsvp Class
9
+ def format_result(result)
10
+ RMeetup::Type::Rsvp.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Fetcher
3
+ class Topics < Base
4
+ def initialize
5
+ @type = :topics
6
+ end
7
+
8
+ # Turn the result hash into a Topic Class
9
+ def format_result(result)
10
+ RMeetup::Type::Topic.new(result)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,8 @@
1
+ require "rmeetup/type/topic"
2
+ require "rmeetup/type/group"
3
+ require "rmeetup/type/city"
4
+ require "rmeetup/type/member"
5
+ require "rmeetup/type/rsvp"
6
+ require "rmeetup/type/event"
7
+ require "rmeetup/type/comment"
8
+ require "rmeetup/type/photo"
@@ -0,0 +1,24 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::City
5
+ #
6
+ # Data wraper for a City fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this city.
10
+ class City
11
+ attr_accessor :city, :lat, :lon, :country, :state, :zip, :members
12
+
13
+ def initialize(city = {})
14
+ self.city = city['city']
15
+ self.lat = city['lat'].to_f
16
+ self.lon = city['lon'].to_f
17
+ self.country = city['country']
18
+ self.state = city['state']
19
+ self.zip = city['zip']
20
+ self.members = city['members'].to_i
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Comment
5
+ #
6
+ # Data wraper for a Comment fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this comment.
10
+ class Comment
11
+ attr_accessor :name, :link, :comment, :rating, :descr, :created, :lat, :lon, :country, :city, :state
12
+
13
+ def initialize(comment = {})
14
+ self.name = comment['name']
15
+ self.link = comment['link']
16
+ self.comment = comment['comment']
17
+ self.rating = comment['rating'].to_i
18
+ self.descr = comment['descr']
19
+ self.created = DateTime.parse(comment['created'])
20
+ self.lat = comment['lat'].to_f
21
+ self.lon = comment['lon'].to_f
22
+ self.country = comment['country']
23
+ self.state = comment['state']
24
+ self.city = comment['city']
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Event
5
+ #
6
+ # Data wraper for a Event fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this event.
10
+ class Event
11
+ attr_accessor :id, :name, :updated, :time, :photo_url, :lat, :lon, :event_url,
12
+ :rsvpcount, :fee, :feecurrency, :feedesc
13
+
14
+ def initialize(event = {})
15
+ self.id = event['id'].to_i
16
+ self.name = event['name']
17
+ self.updated = DateTime.parse(event['updated'])
18
+ self.time = DateTime.parse(event['time'])
19
+ self.photo_url = event['photo_url']
20
+ self.lat = event['lat'].to_f
21
+ self.lon = event['lon'].to_f
22
+ self.event_url = event['event_url']
23
+ self.rsvpcount = event['rsvpcount'].to_i
24
+ self.fee = event['fee']
25
+ self.feecurrency = event['feecurrency']
26
+ self.feedesc = event['feedesc']
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Group
5
+ #
6
+ # Data wraper for a Group fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this group.
10
+ class Group
11
+ attr_accessor :id, :name, :link, :updated, :members, :created, :photo_url, :description,
12
+ :lat, :lon, :country, :state, :city, :zip, :organizerProfileUrl, :daysleft
13
+
14
+ def initialize(group = {})
15
+ self.id = group['id'].to_i
16
+ self.name = group['name']
17
+ self.link = group['link']
18
+ self.updated = DateTime.parse(group['updated'])
19
+ self.members = group['members'].to_i
20
+ self.created = DateTime.parse(group['created'])
21
+ self.photo_url = group['photo_url']
22
+ self.description = group['description']
23
+ self.lat = group['lat'].to_f
24
+ self.lon = group['lon'].to_f
25
+ self.country = group['country']
26
+ self.state = group['state']
27
+ self.city = group['city']
28
+ self.zip = group['zip']
29
+ self.daysleft = group['daysleft'].to_i
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,26 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Member
5
+ #
6
+ # Data wraper for a Member fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this member.
10
+ class Member
11
+ attr_accessor :id, :name, :link, :bio, :lat, :lon, :country, :city, :state
12
+
13
+ def initialize(member = {})
14
+ self.id = member['id'].to_i
15
+ self.name = member['name']
16
+ self.link = member['link']
17
+ self.bio = member['bio']
18
+ self.lat = member['lat'].to_f
19
+ self.lon = member['lon'].to_f
20
+ self.country = member['country']
21
+ self.state = member['state']
22
+ self.city = member['city']
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,22 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Photo
5
+ #
6
+ # Data wraper for a Photo fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this photo.
10
+ class Photo
11
+ attr_accessor :albumtitle, :link, :member_url, :descr, :created
12
+
13
+ def initialize(photo = {})
14
+ self.albumtitle = photo['albumtitle']
15
+ self.link = photo['link']
16
+ self.member_url = photo['member_url']
17
+ self.descr = photo['descr']
18
+ self.created = DateTime.parse(photo['created'])
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Rsvp
5
+ #
6
+ # Data wraper for a Rsvp fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this rsvp.
10
+ class Rsvp
11
+ attr_accessor :name, :link, :comment, :lat, :lon, :country, :city, :state
12
+
13
+ def initialize(rsvp = {})
14
+ self.name = rsvp['name']
15
+ self.link = rsvp['link']
16
+ self.comment = rsvp['comment']
17
+ self.lat = rsvp['lat'].to_f
18
+ self.lon = rsvp['lon'].to_f
19
+ self.country = rsvp['country']
20
+ self.state = rsvp['state']
21
+ self.city = rsvp['city']
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,24 @@
1
+ module RMeetup
2
+ module Type
3
+
4
+ # == RMeetup::Type::Topic
5
+ #
6
+ # Data wraper for a Topic fethcing response
7
+ # Used to access result attributes as well
8
+ # as progammatically fetch relative data types
9
+ # based on this topic.
10
+ class Topic
11
+ attr_accessor :name, :urlkey, :id, :description, :members, :link, :updated
12
+
13
+ def initialize(topic = {})
14
+ self.name = topic['name']
15
+ self.urlkey = topic['urlkey']
16
+ self.id = topic['id'].to_i
17
+ self.description = topic['description']
18
+ self.members = topic['members'].to_i
19
+ self.link = topic['link']
20
+ self.updated = DateTime.parse(topic['updated'])
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe RMeetup::Client, 'trying to access the API before being configured' do
4
+ it 'should throw an error trying to search' do
5
+ lambda {
6
+ RMeetup::Client.fetch(:topics)
7
+ }.should raise_error(RMeetup::NotConfiguredError)
8
+ end
9
+ end
10
+
11
+ describe RMeetup::Client, 'trying to fetch an unknown type' do
12
+ before do
13
+ RMeetup::Client.api_key = API_KEY
14
+ end
15
+
16
+ it 'should throw an error' do
17
+ lambda {
18
+ RMeetup::Client.fetch(:clowns)
19
+ }.should raise_error(RMeetup::InvalidRequestTypeError)
20
+ end
21
+ end
22
+
23
+ describe RMeetup::Client, 'fetching some topics' do
24
+ before do
25
+ RMeetup::Client.api_key = API_KEY
26
+ @topics_fetcher = mock(RMeetup::Fetcher::Topics)
27
+ @topics_fetcher.stub!(:fetch).and_return([])
28
+ @type = :topics
29
+ end
30
+
31
+ it 'should try to get a Topic Fetcher' do
32
+ RMeetup::Fetcher.should_receive(:for).with(@type).and_return(@topics_fetcher)
33
+ RMeetup::Client.fetch(@type,{})
34
+ end
35
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe RMeetup::Fetcher, 'being told to get a certain type of fetcher' do
4
+ before do
5
+ @fetcher_types = %w(topics cities members rsvps events groups comments photos)
6
+ end
7
+
8
+ it 'should return the correct fetcher' do
9
+ @fetcher_types.each do |type|
10
+ fetcher = RMeetup::Fetcher.for(type)
11
+ fetcher.class.name.should eql("RMeetup::Fetcher::#{type.capitalize}")
12
+ end
13
+ end
14
+
15
+ it 'should return nil if asked for an invalid fetcher' do
16
+ RMeetup::Fetcher.for(:clowns).should be_nil
17
+ end
18
+ end
@@ -0,0 +1,58 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Base, 'building an api url' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Base.new
6
+ @options = {:key => 'seekret_api_key'}
7
+ end
8
+
9
+ it 'should build a correct to call.' do
10
+ @options['search'] = 'ruby search'
11
+ url = @fetcher.send(:build_url,@options)
12
+ url.should eql("http://api.meetup.com/.json/?search=ruby%20search&key=seekret_api_key")
13
+ end
14
+
15
+ it 'should generate a correct base url' do
16
+ @fetcher.send(:base_url).should eql('http://api.meetup.com/.json/')
17
+ end
18
+
19
+ it 'should uri encode options' do
20
+ @options['with_spaces'] = 'i haz spaces'
21
+ encoded = @fetcher.send(:encode_options, @options)
22
+ encoded['with_spaces'].should eql('i%20haz%20spaces')
23
+ end
24
+
25
+ it 'should build a correct query string' do
26
+ @options[:search] = 'ruby'
27
+ params = @fetcher.send(:params_for, @options)
28
+ params.should eql('?search=ruby&key=seekret_api_key')
29
+ end
30
+ end
31
+
32
+ describe RMeetup::Fetcher::Base, 'getting an error back' do
33
+ before do
34
+ @fetcher = RMeetup::Fetcher::Base.new
35
+ @fetcher.extend(RMeetup::FakeResponse::Error)
36
+ end
37
+
38
+ it 'should raise a detailed API error' do
39
+ lambda {
40
+ @fetcher.fetch
41
+ }.should raise_error(RMeetup::Fetcher::ApiError,/Perhaps you're missing a required parameter/)
42
+ end
43
+ end
44
+
45
+ describe RMeetup::Fetcher::Base, 'getting a collection back' do
46
+ before do
47
+ @fetcher = RMeetup::Fetcher::Base.new
48
+ @fetcher.extend(RMeetup::FakeResponse::Topics)
49
+ end
50
+
51
+ it 'should get back a RMeetup::Collection' do
52
+ @fetcher.fetch.should be_kind_of(RMeetup::Collection)
53
+ end
54
+
55
+ it 'should get a collection with all the response results' do
56
+ @fetcher.fetch.size.should eql(29)
57
+ end
58
+ end
@@ -0,0 +1,18 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Cities, 'fetching some Cities' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Cities.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Cities)
7
+ end
8
+
9
+ it 'should return a collection of Cities' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::City)
12
+ end
13
+ end
14
+
15
+ it 'should parse a correct zip code' do
16
+ @fetcher.fetch.first.zip.should eql('10001')
17
+ end
18
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Comments, 'fetching some Comments' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Comments.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Comments)
7
+ end
8
+
9
+ it 'should return a collection of Comments' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Comment)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Events, 'fetching some Events' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Events.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Events)
7
+ end
8
+
9
+ it 'should return a collection of Events' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Event)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Groups, 'fetching some Groups' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Groups.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Groups)
7
+ end
8
+
9
+ it 'should return a collection of Groups' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Group)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Members, 'fetching some Members' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Members.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Members)
7
+ end
8
+
9
+ it 'should return a collection of Members' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Member)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Photos, 'fetching some Photos' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Photos.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Photos)
7
+ end
8
+
9
+ it 'should return a collection of Photos' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Photo)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Rsvps, 'fetching some Rsvps' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Rsvps.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Rsvps)
7
+ end
8
+
9
+ it 'should return a collection of Rsvps' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Rsvp)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ require File.join(File.dirname(__FILE__), '..', 'spec_helper')
2
+
3
+ describe RMeetup::Fetcher::Topics, 'fetching some Topics' do
4
+ before do
5
+ @fetcher = RMeetup::Fetcher::Topics.new
6
+ @fetcher.extend(RMeetup::FakeResponse::Topics)
7
+ end
8
+
9
+ it 'should return a collection of Topics' do
10
+ @fetcher.fetch.each do |result|
11
+ result.should be_kind_of(RMeetup::Type::Topic)
12
+ end
13
+ end
14
+ end
@@ -0,0 +1 @@
1
+ {"results":[{"zip":"10001","lon":"-73.98999786376953","state":"NY","members":"130330","lat":"40.75","country":"us","city":"New York"},{"zip":"60601","lon":"-87.62999725341797","state":"IL","members":"53857","lat":"41.88999938964844","country":"us","city":"Chicago"},{"zip":"","lon":"-0.10000000149011612","state":"","members":"49984","lat":"51.52000045776367","country":"gb","city":"London"},{"zip":"20001","lon":"-77.0199966430664","state":"DC","members":"40749","lat":"38.90999984741211","country":"us","city":"Washington"},{"zip":"92101","lon":"-117.16999816894531","state":"CA","members":"40202","lat":"32.720001220703125","country":"us","city":"San Diego"},{"zip":"77001","lon":"-95.22000122070312","state":"TX","members":"37815","lat":"29.719999313354492","country":"us","city":"Houston"},{"zip":"M3H 6A7","lon":"-79.44000244140625","state":"ON","members":"36789","lat":"43.7599983215332","country":"ca","city":"Toronto"},{"zip":"19101","lon":"-75.13999938964844","state":"PA","members":"36594","lat":"40.0","country":"us","city":"Philadelphia"},{"zip":"30301","lon":"-84.4000015258789","state":"GA","members":"35223","lat":"33.86000061035156","country":"us","city":"Atlanta"},{"zip":"98101","lon":"-122.33000183105469","state":"WA","members":"34781","lat":"47.61000061035156","country":"us","city":"Seattle"}],"meta":{"lon":"","count":10,"next":"http:\/\/api.meetup.com\/cities\/?order=members&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=1","link":"http:\/\/api.meetup.com\/cities\/","total_count":82705,"url":"http:\/\/api.meetup.com\/cities\/?order=members&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=0","id":"","title":"Meetup Cities","updated":"2008-10-21 09:10:41 EDT","description":"API method for accessing meetup cities","method":"Cities","lat":""}}
@@ -0,0 +1 @@
1
+ {"results":[{"zip":"28270","lon":"-80.76000213623047","created":"Thu Oct 02 22:30:13 EDT 2008","link":"http:\/\/www.meetup.com\/members\/3170722","name":"Brian Blanton","state":"NC","rating":"4","comment":"","lat":"35.119998931884766","city":"Charlotte","country":"us"},{"zip":"28078","lon":"-80.8499984741211","created":"Thu Oct 02 08:04:12 EDT 2008","link":"http:\/\/www.meetup.com\/members\/69074","name":"Larry Staton Jr.","state":"NC","rating":"5","comment":"","lat":"35.40999984741211","city":"Huntersville","country":"us"},{"zip":"28278","lon":"-81.0199966430664","created":"Mon Aug 18 23:24:26 EDT 2008","link":"http:\/\/www.meetup.com\/members\/5363982","name":"Robert Hall","state":"NC","rating":"4","comment":"Ruby is an up and coming language that needs supporters to get the word out. I would encourage all skill levels of people to attend, don't be scared off by not knowing ruby, that's why we're here.","lat":"35.099998474121094","city":"Charlotte","country":"us"},{"zip":"28277","lon":"-80.80999755859375","created":"Mon Aug 18 23:23:26 EDT 2008","link":"http:\/\/www.meetup.com\/members\/2643089","name":"Scott","state":"NC","rating":"4","comment":"","lat":"35.060001373291016","city":"Charlotte","country":"us"}],"meta":{"lon":"","count":4,"next":"","link":"http:\/\/api.meetup.com\/comments\/","total_count":4,"url":"http:\/\/api.meetup.com\/comments\/?order=ctime&topic=ruby&key=4824d125e1c13f6253694f65383d33&groupnum=136&page=10&format=json&offset=0","id":"","title":"Meetup Group Comments","updated":"2008-10-02 22:30:13 EDT","description":"API method for accessing meetup group comments","method":"Comments","lat":""}}
@@ -0,0 +1 @@
1
+ {"problem":"The API request is malformed","details":"Perhaps you're missing a required parameter. You can find full documentation of the api here: http://www.meetup.com/meetup_api/docs/"}
@@ -0,0 +1 @@
1
+ {"results":[{"group_name":"The Vancouver Ruby\/Rails\/Merb Meetup Group","lon":"-123.12000274658203","rsvpcount":"11","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/9\/0\/3\/global_3410307.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8912342","fee":"0.0","time":"Mon Nov 03 19:00:00 PDT 2008","feedesc":"","ismeetup":"1","updated":"Fri Oct 17 21:16:57 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/112\/calendar\/8912342","description":"The meetup is now at WorkSpace (Suite 400, 21 Water Street).\r\n\r\n[b]I don't have a speaker yet! If you want to talk, please email a talk title, a 1-paragraph talk description and a speaker bio to peter@ruboss.com.\r\n[\/b]\r\n\r\nIf I can't find a speaker with a Ruby topic, I have the following proposal for an open discussion. It's not Ruby-specific, but many of us are doing startups so it may be interesting:\r\n\r\nPaul Graham (http:\/\/www.paulgraham.com\/badeconomy.html)\r\n\r\nvs.\r\n\r\nSequoia Capital (http:\/\/www.techcrunch.com\/2008\/10\/10\/sequoia-capitals-56-slide-powerpoint-presentation-of-doom\/)\r\n\r\nWho's right? Or can both be right?\r\n\r\nAfter their meetup, some of us may head over to Irish Heather or Chill Winston for beer afterward.","name":"The Vancouver Ruby\/Rails November Meetup","venue_lat":"","lat":"49.279998779296875"},{"group_name":"The Michigan Ruby Users Group (Grand Rapids)","lon":"-85.66000366210938","rsvpcount":"2","venue_name":"","photo_url":"","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8918080","fee":"0.0","time":"Tue Nov 04 18:00:00 EDT 2008","feedesc":"","ismeetup":"1","updated":"Tue Oct 07 19:06:49 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/46\/calendar\/8918080","description":"","name":"The Michigan Ruby Users Group (Grand Rapids) November Meetup","venue_lat":"","lat":"42.869998931884766"},{"group_name":"srq.rb","lon":"-82.4800033569336","rsvpcount":"1","venue_name":"Cock & Bull Pub","photo_url":"","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"-82.451380","id":"8876657","fee":"0.0","time":"Wed Nov 05 19:00:00 EDT 2008","feedesc":"","ismeetup":"1","updated":"Wed Oct 01 20:10:22 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/135\/calendar\/8876657","description":"We'll drink beer and lament the downfall of American hegemony and talk a little tech.","name":"srq.rb November Meetup","venue_lat":"27.325770","lat":"27.31999969482422"},{"group_name":"The Raleigh-area Ruby Brigade (raleigh.rb)","lon":"-78.62999725341797","rsvpcount":"0","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/3\/a\/c\/global_4488940.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8639251","fee":"0.0","time":"Thu Nov 06 24:00:00 EDT 2008","feedesc":"","ismeetup":"0","updated":"Thu Aug 28 08:53:11 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/3\/calendar\/8639251","description":"http:\/\/rubyconf.org\/","name":"RubyConf 2008","venue_lat":"","lat":"35.939998626708984"},{"group_name":"ChicagoRuby.org - Chicago Ruby on Rails","lon":"-87.94000244140625","rsvpcount":"0","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/6\/8\/0\/global_4273664.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8852946","fee":"0.0","time":"Thu Nov 06 24:00:00 CDT 2008","feedesc":"","ismeetup":"0","updated":"Sun Sep 28 19:48:54 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/77\/calendar\/8852946","description":"RubyConf 2008 in Orlando, FL\r\nhttp:\/\/rubyconf.org\/","name":"RubyConf 2008 in Orlando, FL","venue_lat":"","lat":"41.88999938964844"},{"group_name":"The Raleigh-area Ruby Brigade (raleigh.rb)","lon":"-78.62999725341797","rsvpcount":"8","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/3\/a\/c\/global_4488940.jpeg","questions":[],"feecurrency":"","attendee_count":"0","venue_lon":"","id":"8639263","fee":"0.0","time":"Thu Nov 06 18:00:00 EDT 2008","feedesc":"","ismeetup":"1","updated":"Thu Aug 28 08:54:51 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/3\/calendar\/8639263","description":"This is a completely open, free-form, \"just show up with a laptop (or a friend with a laptop) and hack on some Ruby\" meeting. There's no agenda, and there's sure to be a great mix of coding and shooting the breeze about all things geeky, including our favorite language. Nathaniel will be showing up around 6 to grab something to eat and start hacking, and we'll do quick introductions around 6:30, but feel free to drop in whenever you can.\r\n\r\nSee you there!","name":"Hack Night","venue_lat":"","lat":"35.939998626708984"},{"group_name":"The Raleigh-area Ruby Brigade (raleigh.rb)","lon":"-78.62999725341797","rsvpcount":"0","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/3\/a\/c\/global_4488940.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8639253","fee":"0.0","time":"Fri Nov 07 24:00:00 EDT 2008","feedesc":"","ismeetup":"0","updated":"Thu Aug 28 08:53:42 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/3\/calendar\/8639253","description":"http:\/\/rubyconf.org\/","name":"RubyConf 2008","venue_lat":"","lat":"35.939998626708984"},{"group_name":"ChicagoRuby.org - Chicago Ruby on Rails","lon":"-87.94000244140625","rsvpcount":"0","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/6\/8\/0\/global_4273664.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8852966","fee":"0.0","time":"Fri Nov 07 24:00:00 CDT 2008","feedesc":"","ismeetup":"0","updated":"Sun Sep 28 19:52:53 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/77\/calendar\/8852966","description":"RubyConf 2008 in Orlando, FL\r\nhttp:\/\/rubyconf.org\/","name":"RubyConf 2008 in Orlando, FL","venue_lat":"","lat":"41.88999938964844"},{"group_name":"The Raleigh-area Ruby Brigade (raleigh.rb)","lon":"-78.62999725341797","rsvpcount":"0","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/3\/a\/c\/global_4488940.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8639255","fee":"0.0","time":"Sat Nov 08 24:00:00 EDT 2008","feedesc":"","ismeetup":"0","updated":"Thu Aug 28 08:53:53 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/3\/calendar\/8639255","description":"http:\/\/rubyconf.org\/","name":"RubyConf 2008","venue_lat":"","lat":"35.939998626708984"},{"group_name":"ChicagoRuby.org - Chicago Ruby on Rails","lon":"-87.94000244140625","rsvpcount":"0","venue_name":"","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/6\/8\/0\/global_4273664.jpeg","questions":[],"feecurrency":"USD","attendee_count":"0","venue_lon":"","id":"8852970","fee":"0.0","time":"Sat Nov 08 24:00:00 CDT 2008","feedesc":"","ismeetup":"0","updated":"Sun Sep 28 19:53:10 EDT 2008","event_url":"http:\/\/ruby.meetup.com\/77\/calendar\/8852970","description":"RubyConf 2008 in Orlando, FL\r\nhttp:\/\/rubyconf.org\/","name":"RubyConf 2008 in Orlando, FL","venue_lat":"","lat":"41.88999938964844"}],"meta":{"lon":"","count":10,"next":"http:\/\/api.meetup.com\/events\/?order=time&radius=25&topic=ruby&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=1","link":"http:\/\/api.meetup.com\/events\/","total_count":45,"url":"http:\/\/api.meetup.com\/events\/?order=time&radius=25&topic=ruby&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=0","id":"","title":"Meetup Events","updated":"2008-10-31 12:35:57 EDT","description":"API method for accessing meetup events","method":"Events","lat":""}}
@@ -0,0 +1 @@
1
+ {"results":[{"zip":"20861","lon":"-76.98999786376953","photo_url":"","link":"http:\/\/www.meetup.com\/Ashton-Ruby-Group\/","state":"MD","city":"Ashton","country":"us","id":"1307778","organizerProfileURL":"http:\/\/www.meetup.com\/members\/1176597\/","updated":"Mon Oct 27 17:53:56 EDT 2008","created":"Fri Oct 24 12:25:59 EDT 2008","description":"To meet regularly and learn from each other's experiences and goals using Ruby in many application contexts.","name":"Ashton Ruby Group","daysleft":"","members":"3","lat":"39.15999984741211"},{"zip":"92009","lon":"-117.2699966430664","photo_url":"","link":"http:\/\/ruby.meetup.com\/140\/","state":"CA","city":"Carlsbad","country":"us","id":"1285509","organizerProfileURL":"http:\/\/www.meetup.com\/members\/8063944\/","updated":"Tue Oct 21 14:39:00 EDT 2008","created":"Fri Sep 19 13:49:56 EDT 2008","description":"A gathering of like minded web developers, focusing primarily on Ruby, but open to other languages as well.","name":"North County Ruby Brigade","daysleft":"","members":"3","lat":"33.099998474121094"},{"zip":"","lon":"19.079999923706055","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/0\/9\/4\/global_5350244.jpeg","link":"http:\/\/www.meetup.com\/budapest-rb\/","state":"","city":"Budapest","country":"hu","id":"1271139","organizerProfileURL":"http:\/\/www.meetup.com\/members\/3928337\/","updated":"Thu Oct 30 07:05:39 EDT 2008","created":"Thu Aug 28 10:38:38 EDT 2008","description":"A budapest.rb Ruby fejleszto\"k és a technológiával ismerkedo\"k érdekében jött létre. A találkozók során a megismerhetjük a többi magyar Ruby fejleszto\"t, tanulhatunk egymástól, és megoszthatjuk saját tapasztalatainkat.\r\n\r\nA találkozókat havonta egy alkalommal rendezzük. Ilyenkor van 3 rövidebb (5-10 perc hosszú Lightning Talk) és egy picit hosszabb elo\"adás (fél óra). A rövid elo\"adások szélesítik a látókört és ízelíto\"t adnak, a hosszabb pedig mélyebb betekintést nyújt egy témába. Az elo\"adások után leheto\"ség van a keveredésre, beszélgetésre egymással és az elo\"adókkal. Ez a rész opcionális, de ero\"sen javasolt program.\r\n\r\nVárható témakörök: tervezési minták, hasznos gemek, minden ami Rails és más keretrendszerek, JRuby és más alternatív interpreterek, és amit még ti akartok.","name":"budapest.rb","daysleft":"","members":"83","lat":"47.5099983215332"},{"zip":"72701","lon":"-94.13999938964844","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/4\/9\/7\/global_5153271.jpeg","link":"http:\/\/www.meetup.com\/naruby\/","state":"AR","city":"Fayetteville","country":"us","id":"1256819","organizerProfileURL":"http:\/\/www.meetup.com\/members\/6145312\/","updated":"Sat Oct 25 19:41:04 EDT 2008","created":"Thu Aug 14 11:10:20 EDT 2008","description":"Meet other local Ruby programmers.","name":"Northwest Arkansas Ruby Brigade","daysleft":"","members":"7","lat":"36.04999923706055"},{"zip":"","lon":"2.3399999141693115","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/7\/c\/1\/global_5113985.jpeg","link":"http:\/\/www.meetup.com\/ruby-137\/","state":"","city":"Paris","country":"fr","id":"1252905","organizerProfileURL":"http:\/\/www.meetup.com\/members\/1280136\/","updated":"Wed Oct 29 15:16:48 EDT 2008","created":"Sun Aug 10 23:47:57 EDT 2008","description":"Are you going to be in Paris? Are you interested in Ruby and\/or Python? Do you have a project you want to hack on?\r\n\r\nThe best way to learn is to share with others. Getting a bunch of Ruby\/Python programmers in the same room is a great way to learn new tips and tricks, and all about the latest in the world of Ruby, Python, and beyond.\r\n\r\nI'm one of the organizers of the San Jose Ruby Hackfest and I've moved to Paris. All are welcome! Please make suggestions on topics of discussion and places to meet. All you need is a laptop and something to hack on...","name":"Paris Ruby & Python Hackfest","daysleft":"","members":"19","lat":"48.86000061035156"},{"zip":"28226","lon":"-80.80999755859375","photo_url":"","link":"http:\/\/ruby.meetup.com\/136\/","state":"NC","city":"Charlotte","country":"us","id":"1229892","organizerProfileURL":"http:\/\/www.meetup.com\/members\/7686667\/","updated":"Fri Oct 03 19:11:50 EDT 2008","created":"Mon Jul 21 14:28:16 EDT 2008","description":"Meet other local Ruby programmers.","name":"Charlotte Ruby Meetup Group","daysleft":"","members":"23","lat":"35.11000061035156"},{"zip":"34232","lon":"-82.4800033569336","photo_url":"","link":"http:\/\/ruby.meetup.com\/135\/","state":"FL","city":"Sarasota","country":"us","id":"1222529","organizerProfileURL":"http:\/\/www.meetup.com\/members\/870301\/","updated":"Fri Oct 03 19:11:45 EDT 2008","created":"Mon Jul 14 11:10:00 EDT 2008","description":"Meet other local programmers interested in Ruby, Erlang, emerging web technologies, and stuff.","name":"srq.rb","daysleft":"","members":"29","lat":"27.31999969482422"},{"zip":"95825","lon":"-121.4000015258789","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/6\/3\/e\/global_4049694.jpeg","link":"http:\/\/ruby.meetup.com\/132\/","state":"CA","city":"Sacramento","country":"us","id":"1138715","organizerProfileURL":"http:\/\/www.meetup.com\/members\/2840665\/","updated":"Wed Oct 22 20:46:24 EDT 2008","created":"Tue May 06 19:27:43 EDT 2008","description":"Meet other local Ruby programmers.","name":"The Sacramento Ruby Meetup","daysleft":"","members":"31","lat":"38.59000015258789"},{"zip":"10026","lon":"-73.94999694824219","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/6\/a\/global_3744362.jpeg","link":"http:\/\/ruby.meetup.com\/131\/","state":"NY","city":"New York","country":"us","id":"1080699","organizerProfileURL":"http:\/\/www.meetup.com\/members\/3112717\/","updated":"Thu Oct 30 15:24:41 EDT 2008","created":"Wed Mar 26 10:39:44 EDT 2008","description":"Meet other local Ruby programmers.","name":"The New York Ruby Meetup","daysleft":"","members":"132","lat":"40.79999923706055"},{"zip":"23510","lon":"-76.29000091552734","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/7\/1\/7\/global_3557911.jpeg","link":"http:\/\/ruby.meetup.com\/130\/","state":"VA","city":"Norfolk","country":"us","id":"1068870","organizerProfileURL":"http:\/\/www.meetup.com\/members\/3695330\/","updated":"Fri Oct 31 12:27:57 EDT 2008","created":"Tue Mar 18 11:50:21 EDT 2008","description":"Welcome to the Hampton Roads Ruby Users Group (757.rb). An advocacy group for promoting the awareness\/use of the Ruby programming language and the Rails framework. Serving Hampton Roads (Norfolk, Virginia Beach, Chesapeake, Portsmouth, Suffolk, Hampton, Newport News, Yorktown and Williamsburg).\r\n\r\n* Homepage: http:\/\/757rb.org\/\r\n* Google Group: http:\/\/groups.google.com\/group\/757rb\r\n* Google Group Email: 757rb@googlegroups.com","name":"Hampton Roads Ruby Users Group (757.rb)","daysleft":"","members":"22","lat":"36.849998474121094"}],"meta":{"lon":"","count":10,"next":"http:\/\/api.meetup.com\/groups\/?order=ctime&radius=25&topic=ruby&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=1","link":"http:\/\/api.meetup.com\/groups\/","total_count":52,"url":"http:\/\/api.meetup.com\/groups\/?order=ctime&radius=25&topic=ruby&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=0","id":"","title":"Meetup Groups","updated":"2008-10-31 18:31:20 EDT","description":"API method for accessing meetup groups","method":"Groups","lat":""}}
@@ -0,0 +1 @@
1
+ {"results":[{"zip":"28270","lon":"-80.76000213623047","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/1\/3\/3\/3\/member_2272915.jpeg","link":"http:\/\/www.meetup.com\/members\/4649231","state":"NC","city":"Charlotte","country":"us","visited":"Sat Sep 27 01:17:06 EDT 2008","id":"4649231","joined":"Thu Jul 24 22:13:10 EDT 2008","bio":"","name":"August","lat":"35.119998931884766"},{"zip":"28270","lon":"-80.76000213623047","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/c\/b\/f\/member_993263.jpeg","link":"http:\/\/www.meetup.com\/members\/3170722","state":"NC","city":"Charlotte","country":"us","visited":"Fri Oct 17 13:26:08 EDT 2008","id":"3170722","joined":"Tue Sep 30 08:42:38 EDT 2008","bio":"","name":"Brian Blanton","lat":"35.119998931884766"},{"zip":"28104","lon":"-80.72000122070312","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/8\/7\/a\/member_4670170.jpeg","link":"http:\/\/www.meetup.com\/members\/7976804","state":"NC","city":"Matthews","country":"us","visited":"Thu Sep 04 15:00:34 EDT 2008","id":"7976804","joined":"Thu Sep 04 15:00:34 EDT 2008","bio":"I am one of the few full time RoR developers in the area, and am always looking to spread the word on Ruby and Rails as well as meet others with the same appreciation for them that I have.","name":"Chris Beck","lat":"35.119998931884766"},{"zip":"28277","lon":"-80.80999755859375","photo_url":"","link":"http:\/\/www.meetup.com\/members\/6591797","state":"NC","city":"Charlotte","country":"us","visited":"Thu Jul 24 09:37:52 EDT 2008","id":"6591797","joined":"Thu Jul 24 09:37:52 EDT 2008","bio":"","name":"David Sheehan","lat":"35.060001373291016"},{"zip":"27516","lon":"-79.12000274658203","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/7\/4\/d\/member_3385869.jpeg","link":"http:\/\/www.meetup.com\/members\/6498229","state":"NC","city":"Chapel Hill","country":"us","visited":"Tue Jul 29 20:35:45 EDT 2008","id":"6498229","joined":"Mon Jul 21 22:41:36 EDT 2008","bio":"","name":"derick","lat":"35.91999816894531"},{"zip":"27514","lon":"-79.04000091552734","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/6\/8\/4\/member_4369668.jpeg","link":"http:\/\/www.meetup.com\/members\/7690053","state":"NC","city":"Chapel Hill","country":"us","visited":"Tue Aug 19 16:07:07 EDT 2008","id":"7690053","joined":"Mon Jul 21 22:46:02 EDT 2008","bio":"","name":"Dustin","lat":"35.93000030517578"},{"zip":"28269","lon":"-80.80999755859375","photo_url":"","link":"http:\/\/www.meetup.com\/members\/7828844","state":"NC","city":"Charlotte","country":"us","visited":"Sun Oct 05 20:01:53 EDT 2008","id":"7828844","joined":"Mon Aug 11 14:58:55 EDT 2008","bio":"","name":"Eddy","lat":"35.310001373291016"},{"zip":"28025","lon":"-80.58000183105469","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/d\/5\/e\/member_3747422.jpeg","link":"http:\/\/www.meetup.com\/members\/7022074","state":"NC","city":"Concord","country":"us","visited":"Thu Sep 18 14:41:31 EDT 2008","id":"7022074","joined":"Thu Jul 24 19:41:34 EDT 2008","bio":"","name":"James Schorr","lat":"35.400001525878906"},{"zip":"28115","lon":"-80.81999969482422","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/1\/3\/f\/6\/member_4445110.jpeg","link":"http:\/\/www.meetup.com\/members\/7780724","state":"NC","city":"Mooresville","country":"us","visited":"Fri Oct 31 18:58:09 EDT 2008","id":"7780724","joined":"Mon Aug 04 12:26:12 EDT 2008","bio":"","name":"Jared Pace","lat":"35.58000183105469"},{"zip":"29730","lon":"-81.0199966430664","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/member\/8\/7\/e\/member_4676174.jpeg","link":"http:\/\/www.meetup.com\/members\/7980875","state":"SC","city":"Rock Hill","country":"us","visited":"Thu Sep 11 10:01:19 EDT 2008","id":"7980875","joined":"Fri Sep 05 08:52:56 EDT 2008","bio":"Just looking into Ruby and wanting some info since there really isn't much out there.","name":"Jay Ward","lat":"34.93000030517578"}],"meta":{"lon":"","count":10,"link":"http:\/\/api.meetup.com\/members\/","next":"http:\/\/api.meetup.com\/members\/?order=name&topic=ruby&key=4824d125e1c13f6253694f65383d33&groupnum=136&page=10&format=json&offset=1","total_count":23,"url":"http:\/\/api.meetup.com\/members\/?order=name&topic=ruby&key=4824d125e1c13f6253694f65383d33&groupnum=136&page=10&format=json&offset=0","id":"","title":"Meetup Members","updated":"2008-10-01 06:36:21 EDT","description":"API method for accessing members of Meetup Groups","method":"Members","lat":""}}
@@ -0,0 +1 @@
1
+ {"results":[{"member_url":"http:\/\/www.meetup.com\/members\/3845915","albumtitle":"Meetup Group Photo Album","created":"Thu Oct 30 07:00:24 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/e\/9\/e\/global_6099742.jpeg","link":"http:\/\/www.meetup.com\/erloungerdu\/\/photos\/470662\/","descr":""},{"member_url":"http:\/\/www.meetup.com\/members\/7636957","albumtitle":"Joint Meetup with Japan's Ruby Business Commons","created":"Thu Sep 25 02:34:39 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/4\/8\/7\/global_5641159.jpeg","link":"http:\/\/www.meetup.com\/silicon-valley-ruby\/\/photos\/445175\/","descr":"Chisako's presentation"},{"member_url":"http:\/\/www.meetup.com\/members\/4013131","albumtitle":"The Seacoast NH Ruby and Rails September Meetup","created":"Thu Sep 18 20:29:03 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/a\/2\/e\/global_5558606.jpeg","link":"http:\/\/www.meetup.com\/nhruby\/\/photos\/440535\/","descr":"NH Ruby-- Rails Rumble"},{"member_url":"http:\/\/www.meetup.com\/members\/3928337","albumtitle":"budapest.rb begins","created":"Thu Sep 18 12:31:25 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/3\/0\/3\/global_5554867.jpeg","link":"http:\/\/www.meetup.com\/budapest-rb\/\/photos\/440279\/","descr":""},{"member_url":"http:\/\/www.meetup.com\/members\/3928337","albumtitle":"Meetup Group Photo Album","created":"Sun Aug 31 16:49:46 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/0\/9\/4\/global_5350244.jpeg","link":"http:\/\/www.meetup.com\/budapest-rb\/\/photos\/426597\/","descr":""},{"member_url":"http:\/\/www.meetup.com\/members\/1280136","albumtitle":"Meetup Group Photo Album","created":"Mon Aug 11 00:13:01 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/7\/c\/1\/global_5113985.jpeg","link":"http:\/\/www.meetup.com\/ruby-137\/\/photos\/414874\/","descr":""},{"member_url":"http:\/\/www.meetup.com\/members\/5749908","albumtitle":"Ruby on Rails Class @ Marakana","created":"Sat Aug 09 16:12:38 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/7\/1\/8\/global_5087912.jpeg","link":"http:\/\/www.meetup.com\/sfruby\/\/photos\/413582\/","descr":"Great Ruby on Rails class taught by Matt Knox of RubyU. Thanks for everything Matt. Classroom space generously provided by Marko of Marakana (www.marakana.com)."},{"member_url":"http:\/\/www.meetup.com\/members\/4362464","albumtitle":"Meetup Group Photo Album","created":"Wed Jul 16 10:24:41 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/6\/6\/7\/global_4811735.jpeg","link":"http:\/\/www.meetup.com\/state-college-ruby\/\/photos\/397500\/","descr":""},{"member_url":"http:\/\/www.meetup.com\/members\/4362464","albumtitle":"An Informal Introduction to Ruby on Rails","created":"Wed Jul 16 10:20:42 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/1\/6\/3\/8\/global_4811688.jpeg","link":"http:\/\/www.meetup.com\/state-college-ruby\/\/photos\/397496\/","descr":"The door at 234 E College Ave to go upstairs to the Blue Line"},{"member_url":"http:\/\/www.meetup.com\/members\/4236512","albumtitle":"Meetup Group Photo Album","created":"Sun Jun 29 22:23:31 EDT 2008","photo_url":"http:\/\/photos1.meetupstatic.com\/photos\/event\/d\/1\/a\/global_4629354.jpeg","link":"http:\/\/ruby.meetup.com\/113\/\/photos\/386661\/","descr":""}],"meta":{"lon":"","count":10,"next":"http:\/\/api.meetup.com\/photos\/?order=photo_album_id&topic=ruby&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=1","link":"http:\/\/api.meetup.com\/photos\/","total_count":58,"url":"http:\/\/api.meetup.com\/photos\/?order=photo_album_id&topic=ruby&key=4824d125e1c13f6253694f65383d33&page=10&format=json&offset=0","id":"","title":"Meetup Photos","updated":"2008-10-30 07:00:25 EDT","description":"API method for accessing meetup photos","method":"Photos","lat":""}}
@@ -0,0 +1 @@
1
+ {"results":[{"zip":"28270","lon":"-80.76000213623047","link":"http:\/\/www.meetup.com\/members\/3170722","guests":"0","answers":[],"state":"NC","city":"Charlotte","country":"us","coord":"35.119998931884766","response":"yes","updated":"Thu Oct 02 22:27:22 EDT 2008","created":"Thu Oct 02 22:27:22 EDT 2008","name":"Brian Blanton","comment":""},{"zip":"28115","lon":"-80.81999969482422","link":"http:\/\/www.meetup.com\/members\/7780724","guests":"0","answers":[],"state":"NC","city":"Mooresville","country":"us","coord":"35.58000183105469","response":"yes","updated":"Thu Oct 09 23:00:04 EDT 2008","created":"Thu Oct 09 23:00:04 EDT 2008","name":"Jared Pace","comment":""},{"zip":"28270","lon":"-80.76000213623047","link":"http:\/\/www.meetup.com\/members\/5032281","guests":"0","answers":[],"state":"NC","city":"Charlotte","country":"us","coord":"35.119998931884766","response":"yes","updated":"Fri Oct 31 18:24:43 EDT 2008","created":"Fri Oct 31 18:24:43 EDT 2008","name":"Jim Van Fleet","comment":""},{"zip":"28078","lon":"-80.8499984741211","link":"http:\/\/www.meetup.com\/members\/69074","guests":"0","answers":[],"state":"NC","city":"Huntersville","country":"us","coord":"35.40999984741211","response":"yes","updated":"Thu Oct 30 16:01:14 EDT 2008","created":"Thu Oct 30 16:01:14 EDT 2008","name":"Larry Staton Jr.","comment":""}],"meta":{"lon":"","count":4,"link":"http:\/\/api.meetup.com\/rsvps\/","next":"","total_count":4,"url":"http:\/\/api.meetup.com\/rsvps\/?order=name&key=4824d125e1c13f6253694f65383d33&event_id=8876699&page=10&format=json&offset=0","id":"","title":"Rsvps for meetups","updated":"2008-10-31 18:24:43 EDT","description":"API method for accessing meetup rsvps","method":"Rsvps","lat":""}}
@@ -0,0 +1 @@
1
+ {"results":[{"id":"10209","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet others interested in all aspects of Web Technology. Gather to discuss Development, Standards, Networks, Marketing, New Web Technology, Graphic Design, Databases, Corporate Web, Webmasters, Contract Development, Promotion and Business. Open to anyone interested in learning more about web technology!","name":"Web Technology","link":"http:\/\/web.meetup.com\/","urlkey":"web","members":"80227"},{"id":"9696","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet with local people to discuss and show-and-tell new technology.","name":"New Technology","link":"http:\/\/newtech.meetup.com\/","urlkey":"newtech","members":"47900"},{"id":"10102","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other locals who earn their living from the Internet. A place\r\nfor people of all disciplines to get together and discuss new and emerging trends in our field. What's the Next New Thing going to be? Which innovation will spawn the next billion dollar IPO? Which innovation will change the way we view the world? Gather to discuss how the Internet will continue to impact our work, play, lives, and society.","name":"Internet Professionals","link":"http:\/\/internetpro.meetup.com\/","urlkey":"internetpro","members":"27624"},{"id":"429","updated":"Tue Aug 05 09:21:54 EDT 2008","description":"Meet other futurists and talk about the accelerating change in technology, science, society, business.","name":"Future","link":"http:\/\/future.meetup.com\/","urlkey":"future","members":"9362"},{"id":"189","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Java developers to talk about code, architecture, and innovation. Both beginners and pros are welcome!","name":"Java","link":"http:\/\/java.meetup.com\/","urlkey":"java","members":"6008"},{"id":"10110","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other locals interested in Interaction Design, the professional discipline that defines how interactive products communicate their functionality to users and how users can interact with them. For more infromation, check out www.ixdg.org. Professionals and non-professionals alike are Welcome!","name":"Interaction Design","link":"http:\/\/ixd.meetup.com\/","urlkey":"ixd","members":"5754"},{"id":"188","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Linux enthusiasts to talk about the latest news and software.","name":"Linux","link":"http:\/\/linux.meetup.com\/","urlkey":"linux","members":"4704"},{"id":"9710","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet with other local IT Professionals, contractors, and all those with an interest in the field. Gather to network, swap tips, and make new friends!","name":"IT Professional","link":"http:\/\/itpro.meetup.com\/","urlkey":"itpro","members":"3055"},{"id":"10043","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Come meet with other Scrum Users. Gather and discuss how the Scrum process can be used to to manage and control development work.","name":"Scrum","link":"http:\/\/scrum.meetup.com\/","urlkey":"scrum","members":"2399"},{"id":"7203","updated":"Tue Aug 05 09:21:55 EDT 2008","description":"Meet other local people who are interested in a discussion on the issue of Education & Technology. Gather and trade ideas on how to bring the latest technology into our schools and businesses.","name":"Education & Technology","link":"http:\/\/edtech.meetup.com\/","urlkey":"edtech","members":"2150"},{"id":"4036","updated":"Tue Aug 05 09:21:54 EDT 2008","description":"Meet other local Biotechnology Enthusiasts. Discuss healthcare, medical devices, cell biology, life science research, pharmaceuticals, and drug discovery start-ups that would be beneficial to society and the development of new technologies.","name":"Biotech","link":"http:\/\/biotech.meetup.com\/","urlkey":"biotech","members":"2141"},{"id":"7860","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Technical Writers and Communicators to discuss issues, share information, and newtork.","name":"Technical Writers","link":"http:\/\/techwriter.meetup.com\/","urlkey":"techwriter","members":"1556"},{"id":"682","updated":"Tue Aug 05 09:21:54 EDT 2008","description":"Meet other local Robotics Enthusiasts to discuss ideas, building techniques, and have fun!","name":"Robotics","link":"http:\/\/robotics.meetup.com\/","urlkey":"robotics","members":"1034"},{"id":"201","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Wi-Fi Users to talk about the latest developments in wireless technology.","name":"Wi-Fi","link":"http:\/\/wifi.meetup.com\/","urlkey":"wifi","members":"927"},{"id":"10215","updated":"Tue Aug 05 09:21:55 EDT 2008","description":"Meet other locals to give or receive instruction using a computer. Gather to learn more about softwares, programming, operating systems, the internet, and more! Also meet other tutors to share ideas.","name":"Computer Tutoring","link":"http:\/\/comptutor.meetup.com\/","urlkey":"comptutor","members":"804"},{"id":"10248","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local who use Plone, a powerful open source content management system that makes it easy to build websites. It adheres to all the web standards, is cross-platform and has a friendly, worldwide community of developers and users. Gather to to share knowledge about Plone, demonstrate Plone products and network with like-minded individuals.","name":"Plone","link":"http:\/\/plone.meetup.com\/","urlkey":"plone","members":"413"},{"id":"6768","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Red Hat users to discuss Linux, Open Source and Free Software.","name":"Red Hat","link":"http:\/\/redhat.meetup.com\/","urlkey":"redhat","members":"359"},{"id":"10053","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet with other local WiMax Users to discuss the future of Wireless Technology.","name":"WiMax","link":"http:\/\/wimax.meetup.com\/","urlkey":"wimax","members":"287"},{"id":"1296","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local fans of Tech TV! Hook up and talk about your favorite tech shows. Stop with the posts to the message boards and Leoville and get chatting in real life! A TechTV host may just pop up in your area!","name":"TechTV","link":"http:\/\/techtv.meetup.com\/","urlkey":"techtv","members":"219"},{"id":"10166","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other locals interested in Debian, a widely used distribution of free software developed through the collaboration of volunteers from around the world. Since its inception, the released system, Debian GNU\/Linux, has been based on the Linux kernel with many basic tools of the operating system from the GNU project.","name":"Debian","link":"http:\/\/debian.meetup.com\/","urlkey":"debian","members":"177"},{"id":"10386","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet others in your local area interested in Home Automation. Discuss this integration of intelligence into a home -- a.k.a. \"smart homes.\" Learn to create a home which is aware of its surroundings and can communicate with the homeowner or other entities, as well as control its own lighting, HVAC, irrigation, etc.","name":"Home Automation","link":"http:\/\/homeautomation.meetup.com\/","urlkey":"homeautomation","members":"156"},{"id":"478","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Technical Support Reps. Share horror stories and coping methods. We help others all day long. It's time to help ourselves.","name":"Tech Support Rep","link":"http:\/\/techsup.meetup.com\/","urlkey":"techsup","members":"41"},{"id":"2876","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Automotive Technicians. A local forum to network and spread information on products and services that affect our industry. Both hobbiests and career auto technicians are welcome.","name":"Auto Technicians","link":"http:\/\/autotech.meetup.com\/","urlkey":"autotech","members":"41"},{"id":"2216","updated":"Tue Aug 12 09:16:02 EDT 2008","description":"Meet other health and information technology professionals to talk about CyberMedicine and how the internet and technology are shaping medicine's future. Pioneer and explore!","name":"CyberMedicine","link":"http:\/\/cybermedicine.meetup.com\/","urlkey":"cybermedicine","members":"31"},{"id":"545","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local Emergency Medical Technicians. Gather and discuss this profession. Those in training are also welcome!","name":"Emergency Medical Technicians","link":"http:\/\/emts.meetup.com\/","urlkey":"emts","members":"24"},{"id":"187","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet with other local Mozilla developers and users to talk about the latest releases.","name":"Mozilla","link":"http:\/\/mozilla.meetup.com\/","urlkey":"mozilla","members":"20"},{"id":"2481","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local members of the informal organization for technical women in computing.Check out Systers","name":"Systers","link":"http:\/\/systers.meetup.com\/","urlkey":"systers","members":"0"},{"id":"6524","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet with fellow comrades of the Unscrewed Army to talk about the show.","name":"Unscrewed","link":"http:\/\/unscrewed.meetup.com\/","urlkey":"unscrewed","members":"0"},{"id":"6747","updated":"Tue Aug 05 09:21:53 EDT 2008","description":"Meet other local people who love new technolgy and electronic toys. Discuss all the latest computers, PDAs, plasma & LCD TVs, bluetooth wireless, etc.) Anything new and advanced is open for discussion!","name":"Tech Toys","link":"http:\/\/techtoys.meetup.com\/","urlkey":"techtoys","members":"0"}],"meta":{"lon":"","count":29,"link":"http:\/\/api.meetup.com\/topics\/","next":"","total_count":29,"url":"http:\/\/api.meetup.com\/topics\/?order=members&search=tech&key=4824d125e1c13f6253694f65383d33&page=200&format=json&offset=0","id":"","title":"Meetup Topics","updated":"2008-08-12 09:16:02 EDT","description":"API method for accessing meetup topics","method":"Topics","lat":""}}
@@ -0,0 +1,82 @@
1
+ $: << File.join(File.dirname(__FILE__), '..', 'lib')
2
+ require 'rmeetup'
3
+
4
+ TEST_ROOT = File.dirname(__FILE__)
5
+
6
+ # Meetup API Key
7
+ #
8
+ # Please provide your meetup api key to access
9
+ # the API. Some of the spec require access to the API.
10
+ # You can get your API key by loging in to meetup.com
11
+ # and looking in your account info.
12
+ API_KEY = '4824d125e1c13f6253694f65383d33' #nil
13
+
14
+ # Don't let the specs run without an API key
15
+ raise StandardError, 'Please enter your Meetup API key in the spec_helper.rb file to be used for testing purposes.' unless API_KEY
16
+
17
+ # Override the get_response portion of fetchers
18
+ # so that we don't have to go out and hit the internets
19
+ module RMeetup::FakeResponse
20
+ module Error
21
+ protected
22
+ def get_response(url)
23
+ File.read(File.join(TEST_ROOT, 'responses', 'error.json'))
24
+ end
25
+ end
26
+
27
+ module Cities
28
+ protected
29
+ def get_response(url)
30
+ File.read(File.join(TEST_ROOT, 'responses', 'cities.json'))
31
+ end
32
+ end
33
+
34
+ module Comments
35
+ protected
36
+ def get_response(url)
37
+ File.read(File.join(TEST_ROOT, 'responses', 'comments.json'))
38
+ end
39
+ end
40
+
41
+ module Events
42
+ protected
43
+ def get_response(url)
44
+ File.read(File.join(TEST_ROOT, 'responses', 'events.json'))
45
+ end
46
+ end
47
+
48
+ module Groups
49
+ protected
50
+ def get_response(url)
51
+ File.read(File.join(TEST_ROOT, 'responses', 'groups.json'))
52
+ end
53
+ end
54
+
55
+ module Members
56
+ protected
57
+ def get_response(url)
58
+ File.read(File.join(TEST_ROOT, 'responses', 'members.json'))
59
+ end
60
+ end
61
+
62
+ module Photos
63
+ protected
64
+ def get_response(url)
65
+ File.read(File.join(TEST_ROOT, 'responses', 'photos.json'))
66
+ end
67
+ end
68
+
69
+ module Rsvps
70
+ protected
71
+ def get_response(url)
72
+ File.read(File.join(TEST_ROOT, 'responses', 'rsvps.json'))
73
+ end
74
+ end
75
+
76
+ module Topics
77
+ protected
78
+ def get_response(url)
79
+ File.read(File.join(TEST_ROOT, 'responses', 'topics.json'))
80
+ end
81
+ end
82
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rmeetup
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jared Pace
8
+ - Matt Puchlerz
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-11-01 00:00:00 -05:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description: A Ruby Gem for accessing the Meetup.com API
18
+ email: matt+rmeetup@puchlerz.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files:
24
+ - README.rdoc
25
+ files:
26
+ - .gitignore
27
+ - README.rdoc
28
+ - VERSION
29
+ - lib/rmeetup.rb
30
+ - lib/rmeetup/collection.rb
31
+ - lib/rmeetup/fetcher.rb
32
+ - lib/rmeetup/fetcher/base.rb
33
+ - lib/rmeetup/fetcher/cities.rb
34
+ - lib/rmeetup/fetcher/comments.rb
35
+ - lib/rmeetup/fetcher/events.rb
36
+ - lib/rmeetup/fetcher/groups.rb
37
+ - lib/rmeetup/fetcher/members.rb
38
+ - lib/rmeetup/fetcher/photos.rb
39
+ - lib/rmeetup/fetcher/rsvps.rb
40
+ - lib/rmeetup/fetcher/topics.rb
41
+ - lib/rmeetup/type.rb
42
+ - lib/rmeetup/type/city.rb
43
+ - lib/rmeetup/type/comment.rb
44
+ - lib/rmeetup/type/event.rb
45
+ - lib/rmeetup/type/group.rb
46
+ - lib/rmeetup/type/member.rb
47
+ - lib/rmeetup/type/photo.rb
48
+ - lib/rmeetup/type/rsvp.rb
49
+ - lib/rmeetup/type/topic.rb
50
+ - spec/client_spec.rb
51
+ - spec/fetcher_spec.rb
52
+ - spec/fetchers/base_spec.rb
53
+ - spec/fetchers/cities_spec.rb
54
+ - spec/fetchers/comments_spec.rb
55
+ - spec/fetchers/events_spec.rb
56
+ - spec/fetchers/groups_spec.rb
57
+ - spec/fetchers/members_spec.rb
58
+ - spec/fetchers/photos_spec.rb
59
+ - spec/fetchers/rsvps_spec.rb
60
+ - spec/fetchers/topics_spec.rb
61
+ - spec/responses/cities.json
62
+ - spec/responses/comments.json
63
+ - spec/responses/error.json
64
+ - spec/responses/events.json
65
+ - spec/responses/groups.json
66
+ - spec/responses/members.json
67
+ - spec/responses/photos.json
68
+ - spec/responses/rsvps.json
69
+ - spec/responses/topics.json
70
+ - spec/spec_helper.rb
71
+ has_rdoc: true
72
+ homepage: http://github.com/mattpuchlerz/rmeetup
73
+ licenses: []
74
+
75
+ post_install_message:
76
+ rdoc_options:
77
+ - --charset=UTF-8
78
+ require_paths:
79
+ - lib
80
+ required_ruby_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: "0"
85
+ version:
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ version:
92
+ requirements: []
93
+
94
+ rubyforge_project:
95
+ rubygems_version: 1.3.5
96
+ signing_key:
97
+ specification_version: 3
98
+ summary: A Ruby Gem for accessing the Meetup.com API
99
+ test_files:
100
+ - spec/client_spec.rb
101
+ - spec/fetcher_spec.rb
102
+ - spec/fetchers/base_spec.rb
103
+ - spec/fetchers/cities_spec.rb
104
+ - spec/fetchers/comments_spec.rb
105
+ - spec/fetchers/events_spec.rb
106
+ - spec/fetchers/groups_spec.rb
107
+ - spec/fetchers/members_spec.rb
108
+ - spec/fetchers/photos_spec.rb
109
+ - spec/fetchers/rsvps_spec.rb
110
+ - spec/fetchers/topics_spec.rb
111
+ - spec/spec_helper.rb