rubymeetup 3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,82 @@
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
+ require 'rmeetup/poster'
9
+
10
+ module RMeetup
11
+
12
+ # RMeetup Errors
13
+ class NotConfiguredError < StandardError
14
+ def initialize
15
+ super "Please provide your Meetup API key before fetching data."
16
+ end
17
+ end
18
+
19
+ class InvalidRequestTypeError < StandardError
20
+ def initialize(type)
21
+ super "Fetch type '#{type}' not a valid."
22
+ end
23
+ end
24
+
25
+ # == RMeetup::Client
26
+ #
27
+ # Essentially a simple wrapper to delegate requests to
28
+ # different fetcher classes who are responsible for fetching
29
+ # and parsing their own responses.
30
+ class Client
31
+ FETCH_TYPES = [:topics, :cities, :members, :rsvps, :events, :groups, :comments, :photos]
32
+
33
+ POST_TYPES = [:event_comment]
34
+ # Meetup API Key
35
+ # Get one at http://www.meetup.com/meetup_api/key/
36
+ # Needs to be the group organizers API Key
37
+ # to be able to RSVP for other people
38
+ @@api_key = nil
39
+ def self.api_key; @@api_key; end;
40
+ def self.api_key=(key); @@api_key = key; end;
41
+
42
+ def self.fetch(type, options = {})
43
+ check_configuration!
44
+
45
+ # Merge in all the standard options
46
+ # Keeping whatever was passed in
47
+ options = default_options.merge(options)
48
+
49
+ if FETCH_TYPES.include?(type.to_sym)
50
+ # Get the custom fetcher used to manage options, api call to get a type of response
51
+ fetcher = RMeetup::Fetcher.for(type)
52
+ return fetcher.fetch(options)
53
+ else
54
+ raise InvalidRequestTypeError.new(type)
55
+ end
56
+ end
57
+
58
+ def self.post(type, options = {})
59
+ check_configuration!
60
+ options = default_options.merge(options)
61
+
62
+ if POST_TYPES.include?(type.to_sym)
63
+ poster = RMeetup::Poster.for(type)
64
+ return poster.post(options)
65
+ else
66
+ raise InvalidRequestTypeError.new(type)
67
+ end
68
+ end
69
+ protected
70
+ def self.default_options
71
+ {
72
+ :key => api_key
73
+ }
74
+ end
75
+
76
+ # Raise an error if RMeetup has not been
77
+ # provided with an api key
78
+ def self.check_configuration!
79
+ raise NotConfiguredError.new unless api_key
80
+ end
81
+ end
82
+ 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,17 @@
1
+ require "rmeetup/poster/base"
2
+ require "rmeetup/poster/event_comment"
3
+
4
+ module RMeetup
5
+ module Poster
6
+
7
+ class << self
8
+ # Return a fetcher for given type
9
+ def for(type)
10
+ return case type.to_sym
11
+ when :event_comment
12
+ EventComment.new
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,81 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+
4
+ module RMeetup
5
+ module Poster
6
+ class ApiError < StandardError
7
+ def initialize(error_message, request_url)
8
+ super "Meetup API Error: #{error_message} - API URL: #{request_url}"
9
+ end
10
+ end
11
+
12
+ class NoResponseError < StandardError
13
+ def initialize
14
+ super "No Response was returned from the Meetup API."
15
+ end
16
+ end
17
+
18
+ # == RMeetup::Fetcher::Base
19
+ #
20
+ # Base fetcher class that other fetchers
21
+ # will inherit from.
22
+ class Base
23
+ def initialize
24
+ @type = nil
25
+ end
26
+
27
+ # Fetch and parse a response
28
+ # based on a set of options.
29
+ # Override this method to ensure
30
+ # neccessary options are passed
31
+ # for the request.
32
+ def post(options = {})
33
+ url = build_url(options)
34
+ ret = post_response(url, options)
35
+ ret
36
+ end
37
+
38
+ protected
39
+ # OVERRIDE this method to format a result section
40
+ # as per Result type.
41
+ # Takes a result in a collection and
42
+ # formats it to be put back into the collection.
43
+ def format_result(result)
44
+ result
45
+ end
46
+
47
+ def build_url(options)
48
+ base_url
49
+ end
50
+
51
+ def base_url
52
+ "https://api.meetup.com/2/#{@type}/"
53
+ end
54
+
55
+ # Create a query string from an options hash
56
+ def params_for(options)
57
+ params = []
58
+ options.each do |key, value|
59
+ params << "#{key}=#{value}"
60
+ end
61
+ "?#{params.join("&")}"
62
+ end
63
+
64
+ # Encode a hash of options to be used as request parameters
65
+ def encode_options(options)
66
+ options.each do |key,value|
67
+ options[key] = URI.encode(value.to_s)
68
+ end
69
+ end
70
+
71
+ def post_response(url, options)
72
+ sslurl = URI.parse(url)
73
+ https = Net::HTTP.new(sslurl.host, sslurl.port)
74
+ https.use_ssl = true
75
+ req = Net::HTTP::Post.new(sslurl.path)
76
+ req.set_form_data(options)
77
+ resp = https.request(req)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,14 @@
1
+ module RMeetup
2
+ module Poster
3
+ class EventComment < Base
4
+ def initialize
5
+ @type = :event_comment
6
+ end
7
+
8
+ # Turn the result hash into a Comment Class
9
+ def format_result(result)
10
+ RMeetup::Type::EventComment.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,39 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/cities/ for available fields
13
+
14
+ class City
15
+
16
+ attr_accessor :city
17
+
18
+ def initialize(city = {})
19
+ self.city = city
20
+ end
21
+
22
+ def method_missing(id, *args)
23
+ return self.city[id.id2name]
24
+ end
25
+
26
+ # Special accessors that need typecasting or other parsing
27
+
28
+ def lat
29
+ return self.city['lat'].to_f
30
+ end
31
+ def lon
32
+ return self.city['lon'].to_f
33
+ end
34
+ def members
35
+ return self.city['members'].to_i
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,42 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/ew/comment/ for available fields
13
+
14
+ class Comment
15
+
16
+ attr_accessor :comment
17
+
18
+ def initialize(comment = {})
19
+ self.comment = comment
20
+ end
21
+
22
+ def method_missing(id, *args)
23
+ return self.comment[id.id2name]
24
+ end
25
+
26
+ # Special accessors that need typecasting or other parsing
27
+
28
+ def rating
29
+ return self.comment['rating'].to_i
30
+ end
31
+ def created
32
+ return DateTime.parse(self.comment['created'])
33
+ end
34
+ def lat
35
+ return self.comment['lat'].to_f
36
+ end
37
+ def lon
38
+ return self.comment['lon'].to_f
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,47 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/events/ for available fields
13
+
14
+ class Event
15
+
16
+ attr_accessor :event
17
+
18
+ def initialize(event = {})
19
+ self.event = event
20
+ end
21
+
22
+ def method_missing(id, *args)
23
+ return self.event[id.id2name]
24
+ end
25
+
26
+ # Special accessors that need typecasting or other parsing
27
+ def id
28
+ self.event['id'].to_i
29
+ end
30
+ def lat
31
+ self.event['lat'].to_f
32
+ end
33
+ def lon
34
+ self.event['lon'].to_f
35
+ end
36
+ def rsvpcount
37
+ self.event['rsvpcount'].to_i
38
+ end
39
+ def updated
40
+ DateTime.parse(self.event['updated'])
41
+ end
42
+ def time
43
+ DateTime.parse(self.event['time'])
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,47 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/groups/ for available fields
13
+
14
+ class Group
15
+ attr_accessor :group
16
+
17
+ def initialize(group = {})
18
+ self.group = group
19
+ end
20
+
21
+ def method_missing(id, *args)
22
+ return self.group[id.id2name]
23
+ end
24
+
25
+ # Special accessors that need typecasting or other parsing
26
+
27
+ def id
28
+ return self.group['id'].to_i
29
+ end
30
+ def updated
31
+ return DateTime.parse(self.group['updated'])
32
+ end
33
+ def created
34
+ return DateTime.parse(self.group['created'])
35
+ end
36
+ def lat
37
+ return self.group['lat'].to_f
38
+ end
39
+ def lon
40
+ return self.group['lon'].to_f
41
+ end
42
+ def daysleft
43
+ return self.group['daysleft'].to_i
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,38 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/members/ for available fields
13
+
14
+ class Member
15
+ attr_accessor :member
16
+
17
+ def initialize(member = {})
18
+ self.member = member
19
+ end
20
+
21
+ def method_missing(id, *args)
22
+ return self.member[id.id2name]
23
+ end
24
+
25
+ # Special accessors that need typecasting or other parsing
26
+
27
+ def id
28
+ return self.member['id'].to_i
29
+ end
30
+ def lat
31
+ return self.member['lat'].to_f
32
+ end
33
+ def lon
34
+ return self.member['lon'].to_f
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,32 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/photos/ for available fields
13
+
14
+ class Photo
15
+ attr_accessor :photo
16
+
17
+ def initialize(photo = {})
18
+ self.photo = photo
19
+ end
20
+
21
+ def method_missing(id, *args)
22
+ return self.photo[id.id2name]
23
+ end
24
+
25
+ # Special accessors that need typecasting or other parsing
26
+
27
+ def created
28
+ return DateTime.parse(self.photo['created'])
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,35 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/ew/rsvps/ for available fields
13
+
14
+ class Rsvp
15
+ attr_accessor :rsvp
16
+
17
+ def initialize(rsvp = {})
18
+ self.rsvp = rsvp
19
+ end
20
+
21
+ def method_missing(id, *args)
22
+ return self.rsvp[id.id2name]
23
+ end
24
+
25
+ # Special accessors that need typecasting or other parsing
26
+
27
+ def lat
28
+ return self.rsvp['lat'].to_f
29
+ end
30
+ def lon
31
+ return self.rsvp['lon'].to_f
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
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
+
11
+ # Edited by Jason Berlinsky on 1/20/11 to allow for arbitrary data access
12
+ # See http://www.meetup.com/meetup_api/docs/topics/ for available fields
13
+
14
+ class Topic
15
+ attr_accessor :topic
16
+
17
+ def initialize(topic = {})
18
+ self.topic = topic
19
+ end
20
+
21
+ def method_missing(id, *args)
22
+ return self.topic[id.id2name]
23
+ end
24
+
25
+ # Special accessors that need typecasting or other parsing
26
+
27
+ def id
28
+ return self.topic['id'].to_i
29
+ end
30
+ def members
31
+ return self.topic['members'].to_i
32
+ end
33
+ def updated
34
+ return DateTime.parse(self.topic['updated'])
35
+ end
36
+ end
37
+ end
38
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rubymeetup
3
+ version: !ruby/object:Gem::Version
4
+ version: '3.0'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joshua Calloway
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-10-15 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: A gem that accesses meetup api
15
+ email: joshua.calloway@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/rmeetup.rb
21
+ - lib/rmeetup/collection.rb
22
+ - lib/rmeetup/fetcher.rb
23
+ - lib/rmeetup/poster.rb
24
+ - lib/rmeetup/type.rb
25
+ - lib/rmeetup/poster/base.rb
26
+ - lib/rmeetup/poster/event_comment.rb
27
+ - lib/rmeetup/fetcher/base.rb
28
+ - lib/rmeetup/fetcher/cities.rb
29
+ - lib/rmeetup/fetcher/comments.rb
30
+ - lib/rmeetup/fetcher/events.rb
31
+ - lib/rmeetup/fetcher/groups.rb
32
+ - lib/rmeetup/fetcher/members.rb
33
+ - lib/rmeetup/fetcher/photos.rb
34
+ - lib/rmeetup/fetcher/rsvps.rb
35
+ - lib/rmeetup/fetcher/topics.rb
36
+ - lib/rmeetup/type/city.rb
37
+ - lib/rmeetup/type/comment.rb
38
+ - lib/rmeetup/type/event.rb
39
+ - lib/rmeetup/type/group.rb
40
+ - lib/rmeetup/type/member.rb
41
+ - lib/rmeetup/type/photo.rb
42
+ - lib/rmeetup/type/rsvp.rb
43
+ - lib/rmeetup/type/topic.rb
44
+ homepage: http://rubygems.org/gems/rubymeetup
45
+ licenses:
46
+ - MIT
47
+ post_install_message:
48
+ rdoc_options: []
49
+ require_paths:
50
+ - lib
51
+ required_ruby_version: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 1.8.23
66
+ signing_key:
67
+ specification_version: 3
68
+ summary: rubymeetup
69
+ test_files: []