tripit 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +13 -0
- data/Gemfile.lock +20 -0
- data/LICENSE.txt +20 -0
- data/README.md +157 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/lib/trip_it/base.rb +105 -0
- data/lib/trip_it/classes/address.rb +18 -0
- data/lib/trip_it/classes/flight_status.rb +27 -0
- data/lib/trip_it/classes/group.rb +12 -0
- data/lib/trip_it/classes/image.rb +10 -0
- data/lib/trip_it/classes/invitee.rb +14 -0
- data/lib/trip_it/classes/objects/activity_object.rb +45 -0
- data/lib/trip_it/classes/objects/air_object.rb +39 -0
- data/lib/trip_it/classes/objects/base_object.rb +31 -0
- data/lib/trip_it/classes/objects/car_object.rb +43 -0
- data/lib/trip_it/classes/objects/cruise_object.rb +44 -0
- data/lib/trip_it/classes/objects/directions_object.rb +27 -0
- data/lib/trip_it/classes/objects/lodging_object.rb +34 -0
- data/lib/trip_it/classes/objects/map_object.rb +26 -0
- data/lib/trip_it/classes/objects/note_object.rb +43 -0
- data/lib/trip_it/classes/objects/rail_object.rb +39 -0
- data/lib/trip_it/classes/objects/reservation_object.rb +43 -0
- data/lib/trip_it/classes/objects/restaurant_object.rb +34 -0
- data/lib/trip_it/classes/objects/transport_object.rb +39 -0
- data/lib/trip_it/classes/objects/weather_object.rb +32 -0
- data/lib/trip_it/classes/points_program.rb +28 -0
- data/lib/trip_it/classes/points_program_activity.rb +15 -0
- data/lib/trip_it/classes/points_program_expiration.rb +12 -0
- data/lib/trip_it/classes/profile.rb +68 -0
- data/lib/trip_it/classes/profile_email_address.rb +15 -0
- data/lib/trip_it/classes/segments/air_segment.rb +56 -0
- data/lib/trip_it/classes/segments/cruise_segment.rb +28 -0
- data/lib/trip_it/classes/segments/rail_segment.rb +25 -0
- data/lib/trip_it/classes/segments/transport_segment.rb +34 -0
- data/lib/trip_it/classes/tp_date_time.rb +11 -0
- data/lib/trip_it/classes/traveler.rb +16 -0
- data/lib/trip_it/classes/trip.rb +230 -0
- data/lib/trip_it/classes/trip_crs_remark.rb +12 -0
- data/lib/trip_it/enums/activity_detail_type.rb +8 -0
- data/lib/trip_it/enums/cruise_detail_type.rb +5 -0
- data/lib/trip_it/enums/flight_status_code.rb +15 -0
- data/lib/trip_it/enums/note_detail_type.rb +5 -0
- data/lib/trip_it/enums/transport_detail_type.rb +6 -0
- data/lib/trip_it/oauth.rb +77 -0
- data/lib/trip_it/util/param_util.rb +235 -0
- data/lib/tripit.rb +45 -0
- data/test/fixtures/air_info.json +0 -0
- data/test/helper.rb +18 -0
- data/test/test_tripit.rb +7 -0
- data/test/unit/base_test.rb +16 -0
- data/test/unit/classes/address_test.rb +0 -0
- data/test/unit/classes/flight_status_test.rb +0 -0
- data/test/unit/classes/group_test.rb +0 -0
- data/test/unit/classes/image_test.rb +0 -0
- data/test/unit/classes/invitee_test.rb +0 -0
- data/test/unit/classes/objects/activity_object_test.rb +0 -0
- data/test/unit/classes/objects/air_object_test.rb +0 -0
- data/test/unit/classes/objects/base_object_test.rb +0 -0
- data/test/unit/classes/objects/car_object_test.rb +0 -0
- data/test/unit/classes/objects/cruise_object_test.rb +0 -0
- data/test/unit/classes/objects/directions_object_test.rb +0 -0
- data/test/unit/classes/objects/lodging_object_test.rb +0 -0
- data/test/unit/classes/objects/map_object_test.rb +0 -0
- data/test/unit/classes/objects/note_object_test.rb +0 -0
- data/test/unit/classes/objects/rail_object_test.rb +0 -0
- data/test/unit/classes/objects/reservation_object_test.rb +0 -0
- data/test/unit/classes/objects/restaurant_object_test.rb +0 -0
- data/test/unit/classes/objects/transport_object_test.rb +0 -0
- data/test/unit/classes/objects/weather_object_test.rb +0 -0
- data/test/unit/classes/points_program_activity_test.rb +0 -0
- data/test/unit/classes/points_program_expiration_test.rb +0 -0
- data/test/unit/classes/points_program_test.rb +0 -0
- data/test/unit/classes/profile_email_address_test.rb +0 -0
- data/test/unit/classes/profile_test.rb +0 -0
- data/test/unit/classes/segments/air_segment_test.rb +0 -0
- data/test/unit/classes/segments/cruise_segment_test.rb +0 -0
- data/test/unit/classes/segments/rail_segment_test.rb +0 -0
- data/test/unit/classes/segments/transport_segment_test.rb +0 -0
- data/test/unit/classes/traveler_test.rb +0 -0
- data/test/unit/classes/trip_crs_remark_test.rb +0 -0
- data/test/unit/classes/trip_test.rb +0 -0
- data/test/unit/enums/activity_detail_type_test.rb +0 -0
- data/test/unit/enums/cruise_detail_type_test.rb +0 -0
- data/test/unit/enums/flight_status_type_test.rb +0 -0
- data/test/unit/enums/note_detail_type_test.rb +0 -0
- data/test/unit/enums/transport_detail_type_test.rb +0 -0
- data/test/unit/oauth_test.rb +0 -0
- data/test/unit/util/param_util_test.rb +0 -0
- data/tripit.gemspec +188 -0
- metadata +284 -0
@@ -0,0 +1,230 @@
|
|
1
|
+
module TripIt
|
2
|
+
class Trip < Base
|
3
|
+
attr_reader :closeness_matches, :trip_invitees, :trip_crs_remarks, :id, :relative_url, :info
|
4
|
+
date_param :start_date, :end_date
|
5
|
+
string_param :description, :display_name, :image_url, :primary_location
|
6
|
+
boolean_param :is_private
|
7
|
+
exceptions :not_implemented_error
|
8
|
+
|
9
|
+
def initialize(client, obj_id = nil, include_children = false, source = nil)
|
10
|
+
@client = client
|
11
|
+
# If we get an Object ID, we'll load and populate it. Otherwise assume its a new Trip Object.
|
12
|
+
unless obj_id.nil?
|
13
|
+
@obj_id = obj_id
|
14
|
+
include_children ? populate(source, :include_objects => true) : populate(source)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def populate(source, params = {})
|
19
|
+
params.merge!( {:id => @obj_id} )
|
20
|
+
info = source || @client.get("/trip", params)
|
21
|
+
|
22
|
+
@id = info['Trip']['id']
|
23
|
+
@primary_location = info['Trip']['primary_location']
|
24
|
+
@is_private = Boolean(info['Trip']['is_private'])
|
25
|
+
@display_name = info['Trip']['display_name']
|
26
|
+
@description = info['Trip']['description']
|
27
|
+
@start_date = Date.parse(info['Trip']['start_date']) unless info['Trip']['start_date'].nil?
|
28
|
+
@end_date = Date.parse(info['Trip']['end_date']) unless info['Trip']['end_date'].nil?
|
29
|
+
@image_url = info['Trip']['image_url']
|
30
|
+
@relative_url = info['Trip']['relative_url']
|
31
|
+
@trip_crs_remarks = []
|
32
|
+
@trip_invitees = []
|
33
|
+
@closeness_matches = []
|
34
|
+
|
35
|
+
chkAndPopulate(@trip_crs_remarks, TripIt::TripCrsRemark, info['Trip']['TripCrsRemarks']['TripCrsRemark']) unless info['Trip']['TripCrsRemarks'].nil?
|
36
|
+
|
37
|
+
# Load associated profiles into Profile objects
|
38
|
+
profileInfo = info['Profile']
|
39
|
+
profiles = []
|
40
|
+
if profileInfo.is_a?(Array)
|
41
|
+
profileInfo.each do |pi|
|
42
|
+
profiles << TripIt::Profile.new(@client, pi)
|
43
|
+
end
|
44
|
+
else
|
45
|
+
profiles << TripIt::Profile.new(@client, profileInfo)
|
46
|
+
end
|
47
|
+
# And now match them into the invitees and closenessmatches array
|
48
|
+
unless info['Trip']['ClosenessMatches'].nil?
|
49
|
+
if info['Trip']['ClosenessMatches']['Match'].is_a?(Array)
|
50
|
+
info['Trip']['ClosenessMatches']['Match'].each do |match|
|
51
|
+
@closeness_matches << profiles.find { |profile| profile.ref == match['@attributes']['profile_ref'] }
|
52
|
+
end
|
53
|
+
else
|
54
|
+
@closeness_matches << profiles.find { |profile| profile.ref == info['Trip']['ClosenessMatches']['Match']['@attributes']['profile_ref'] }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
unless info['Trip']['TripInvitees'].nil?
|
59
|
+
if info['Trip']['TripInvitees']['Invitee'].is_a?(Array)
|
60
|
+
info['Trip']['TripInvitees']['Invitee'].each do |invitee|
|
61
|
+
@trip_invitees << TripIt::Invitee.new(invitee, profiles.find { |profile| profile.ref == invitee['@attributes']['profile_ref'] })
|
62
|
+
end
|
63
|
+
else
|
64
|
+
@trip_invitees << TripIt::Invitee.new(info['Trip']['TripInvitees']['Invitee'], profiles.find { |profile| profile.ref == info['Trip']['TripInvitees']['Invitee']['@attributes']['profile_ref'] })
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# If include_objects is true, we need to fill them up here
|
69
|
+
if params[:include_objects] == true
|
70
|
+
[
|
71
|
+
[info['ActivityObject'], @activities = [], TripIt::ActivityObject],
|
72
|
+
[info['AirObject'], @air = [], TripIt::AirObject],
|
73
|
+
[info['CarObject'], @cars = [], TripIt::CarObject],
|
74
|
+
[info['CruiseObject'], @cruises = [], TripIt::CruiseObject],
|
75
|
+
[info['DirectionsObject'], @directions = [], TripIt::DirectionsObject],
|
76
|
+
[info['LodgingObject'], @lodgings = [], TripIt::LodgingObject],
|
77
|
+
[info['MapObject'], @maps = [], TripIt::MapObject],
|
78
|
+
[info['NoteObject'], @notes = [], TripIt::NoteObject],
|
79
|
+
[info['RailObject'], @rail = [], TripIt::RailObject],
|
80
|
+
[info['RestaurantObject'], @restaurants = [], TripIt::RestaurantObject],
|
81
|
+
[info['TransportObject'], @transports = [], TripIt::TransportObject],
|
82
|
+
[info['WeatherObject'], @weather = [], TripIt::WeatherObject]
|
83
|
+
].each do |obj|
|
84
|
+
unless obj[0].nil?
|
85
|
+
chkObjAndPopulate(@client, obj[1], obj[2], obj[0])
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def activities
|
92
|
+
return @activities unless @activities.nil?
|
93
|
+
actobj = @client.list("/object", {:trip_id => @id, :type => "activity"})["ActivityObject"]
|
94
|
+
@activities = []
|
95
|
+
return @activities if actobj.nil?
|
96
|
+
chkObjAndPopulate(@client, @activities, TripIt::ActivityObject, actobj)
|
97
|
+
return @activities
|
98
|
+
end
|
99
|
+
|
100
|
+
def air
|
101
|
+
return @air unless @air.nil?
|
102
|
+
airobj = @client.list("/object", {:trip_id => @id, :type => "air"})["AirObject"]
|
103
|
+
@air = []
|
104
|
+
return @air if airobj.nil?
|
105
|
+
chkObjAndPopulate(@client, @air, TripIt::AirObject, airobj)
|
106
|
+
return @air
|
107
|
+
end
|
108
|
+
|
109
|
+
def cars
|
110
|
+
return @cars unless @cars.nil?
|
111
|
+
carobj = @client.list("/object", {:trip_id => @id, :type => "car"})["CarObject"]
|
112
|
+
@cars = []
|
113
|
+
return @cars if carobj.nil?
|
114
|
+
chkObjAndPopulate(@client, @cars, TripIt::CarObject, carobj)
|
115
|
+
return @cars
|
116
|
+
end
|
117
|
+
|
118
|
+
def cruises
|
119
|
+
return @cruises unless @cruises.nil?
|
120
|
+
cruiseobj = @client.list("/object", {:trip_id => @id, :type => "cruise"})["CruiseObject"]
|
121
|
+
@cruises = []
|
122
|
+
return @cruises if cruiseobj.nil?
|
123
|
+
chkObjAndPopulate(@client, @cruises, TripIt::CruiseObject, cruiseobj)
|
124
|
+
return @cruises
|
125
|
+
end
|
126
|
+
|
127
|
+
def directions
|
128
|
+
return @directions unless @directions.nil?
|
129
|
+
directobj = @client.list("/object", {:trip_id => @id, :type => "directions"})["DirectionsObject"]
|
130
|
+
@directions = []
|
131
|
+
return @directions if directobj.nil?
|
132
|
+
chkObjAndPopulate(@client, @directions, TripIt::DirectionsObject, directobj)
|
133
|
+
return @directions
|
134
|
+
end
|
135
|
+
|
136
|
+
def lodgings
|
137
|
+
return @lodgings unless @lodgings.nil?
|
138
|
+
lodgingobj = @client.list("/object", {:trip_id => @id, :type => "lodging"})["LodgingObject"]
|
139
|
+
@lodgings = []
|
140
|
+
return @lodgings if lodgingobj.nil?
|
141
|
+
chkObjAndPopulate(@client, @lodgings, TripIt::LodgingObject, lodgingobj)
|
142
|
+
return @lodgings
|
143
|
+
end
|
144
|
+
|
145
|
+
def maps
|
146
|
+
return @maps unless @maps.nil?
|
147
|
+
mapsobj = @client.list("/object", {:trip_id => @id, :type => "map"})["MapObject"]
|
148
|
+
@maps = []
|
149
|
+
return @maps if mapsobj.nil?
|
150
|
+
chkObjAndPopulate(@client, @maps, TripIt::MapObject, mapsobj)
|
151
|
+
return @maps
|
152
|
+
end
|
153
|
+
|
154
|
+
def notes
|
155
|
+
return @notes unless @notes.nil?
|
156
|
+
noteobj = @client.list("/object", {:trip_id => @id, :type => "note"})["NoteObject"]
|
157
|
+
@notes = []
|
158
|
+
return @notes if noteobj.nil?
|
159
|
+
chkObjAndPopulate(@client, @notes, TripIt::NoteObject, noteobj)
|
160
|
+
return @notes
|
161
|
+
end
|
162
|
+
|
163
|
+
def rail
|
164
|
+
return @rail unless @rail.nil?
|
165
|
+
railobj = @client.list("/object", {:trip_id => @id, :type => "rail"})["RailObject"]
|
166
|
+
@rail = []
|
167
|
+
return @rail if railobj.nil?
|
168
|
+
chkObjAndPopulate(@client, @rail, TripIt::RailObject, railobj)
|
169
|
+
return @rail
|
170
|
+
end
|
171
|
+
|
172
|
+
def restaurants
|
173
|
+
return @restaurants unless @restaurants.nil?
|
174
|
+
restobj = @client.list("/object", {:trip_id => @id, :type => "restaurant"})["RestaurantObject"]
|
175
|
+
@restaurants = []
|
176
|
+
return @rail if restobj.nil?
|
177
|
+
chkObjAndPopulate(@client, @restaurants, TripIt::RestaurantObject, restobj)
|
178
|
+
return @restaurants
|
179
|
+
end
|
180
|
+
|
181
|
+
def transports
|
182
|
+
return @transports unless @transports.nil?
|
183
|
+
transobj = @client.list("/object", {:trip_id => @id, :type => "transport"})["TransportObject"]
|
184
|
+
@transports = []
|
185
|
+
return @transports if transobj.nil?
|
186
|
+
chkObjAndPopulate(@client, @transports, TripIt::TransportObject, transobj)
|
187
|
+
return @transports
|
188
|
+
end
|
189
|
+
|
190
|
+
def weather
|
191
|
+
return @weather unless @weather.nil?
|
192
|
+
wxobj = @client.list("/object", {:trip_id => @id, :type => "weather"})["WeatherObject"]
|
193
|
+
@weather = []
|
194
|
+
return @weather if wxobj.nil?
|
195
|
+
chkObjAndPopulate(@client, @weather, TripIt::WeatherObject, wxobj)
|
196
|
+
return @weather
|
197
|
+
end
|
198
|
+
|
199
|
+
def sequence
|
200
|
+
["@start_date", "@end_date", "@description", "@display_name","@image_url", "@is_private", "@primary_location"]
|
201
|
+
end
|
202
|
+
|
203
|
+
def save
|
204
|
+
[ @activities,
|
205
|
+
@air,
|
206
|
+
@cars,
|
207
|
+
@cruises,
|
208
|
+
@directions,
|
209
|
+
@lodgings,
|
210
|
+
@maps,
|
211
|
+
@notes,
|
212
|
+
@rail,
|
213
|
+
@restaurants,
|
214
|
+
@transports,
|
215
|
+
@weather
|
216
|
+
].each do |obj|
|
217
|
+
unless obj.nil?
|
218
|
+
if obj.count > 1
|
219
|
+
raise NotImplementedError, "TripIt can only save one complex object at a time."
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
# We only want to allow save for new objects for now.
|
225
|
+
if @obj_id.nil?
|
226
|
+
@client.create(self.xml)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module TripIt
|
2
|
+
class TripCrsRemark < Base
|
3
|
+
attr_reader :record_locator, :notes
|
4
|
+
|
5
|
+
def initialize(params = {})
|
6
|
+
raise ArgumentError, "TripCrsRemark created with empty parameters" if params.empty?
|
7
|
+
|
8
|
+
@record_locator = params["record_locator"]
|
9
|
+
@notes = params["notes"]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module TripIt
|
2
|
+
FLIGHT_STATUS_CODE = {
|
3
|
+
100 => "Not Monitorable",
|
4
|
+
200 => "Not Monitored",
|
5
|
+
300 => "Scheduled",
|
6
|
+
301 => "On Time",
|
7
|
+
302 => "In Flight - On Time",
|
8
|
+
303 => "Arrived - On Time",
|
9
|
+
400 => "Cancelled",
|
10
|
+
401 => "Delayed",
|
11
|
+
402 => "In Flight - Late",
|
12
|
+
403 => "Arrived - Late",
|
13
|
+
404 => "Diverted"
|
14
|
+
}
|
15
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module TripIt
|
2
|
+
class OAuth < Base
|
3
|
+
attr_reader :consumer, :access_token
|
4
|
+
exceptions :bad_request_exception, :unauthorized_exception, :not_found_exception, :server_error
|
5
|
+
|
6
|
+
def initialize(ctoken, csecret)
|
7
|
+
@consumer = ::OAuth::Consumer.new(ctoken, csecret, :site => 'https://api.tripit.com')
|
8
|
+
end
|
9
|
+
|
10
|
+
def set_callback_url(url)
|
11
|
+
@request_token = nil
|
12
|
+
request_token(:oauth_callback => url)
|
13
|
+
end
|
14
|
+
|
15
|
+
def request_token(options={})
|
16
|
+
@request_token ||= consumer.get_request_token(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def authorize_from_request(rtoken, rsecret, verifier)
|
20
|
+
request_token = ::OAuth::RequestToken.new(consumer, rtoken, rsecret)
|
21
|
+
access = request_token.get_access_token(:oauth_verifier => verifier)
|
22
|
+
@access_token = ::OAuth::AccessToken.new(consumer, access.token, access.secret)
|
23
|
+
end
|
24
|
+
|
25
|
+
def authorize_from_access(atoken, asecret)
|
26
|
+
@access_token = ::OAuth::AccessToken.new(consumer, atoken, asecret)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get(resource, params={})
|
30
|
+
params.merge!(:format => "json")
|
31
|
+
params_string = params.collect{|k, v| "#{k}/#{v}"}.join('/')
|
32
|
+
request = access_token.get("/v1/get#{resource}/#{URI.escape(params_string)}")
|
33
|
+
returnResponse(request)
|
34
|
+
end
|
35
|
+
|
36
|
+
def list(resource, params={})
|
37
|
+
params.merge!(:format => "json")
|
38
|
+
params_string = params.collect{|k, v| "#{k}/#{v}"}.join('/')
|
39
|
+
request = access_token.get("/v1/list#{resource}/#{URI.escape(params_string)}")
|
40
|
+
returnResponse(request)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Only takes XML
|
44
|
+
def create(param)
|
45
|
+
request = access_token.post("/v1/create", "xml=<Request>#{URI.escape(param)}</Request>", {'Content-Type' => 'application/x-www-form-urlencoded'})
|
46
|
+
returnResponse(request, "xml")
|
47
|
+
end
|
48
|
+
|
49
|
+
# Only takes XML
|
50
|
+
def replace(resource, param)
|
51
|
+
request = access_token.post("/v1/replace#{resource}", "xml=<Request>#{URI.escape(param)}</Request>", {'Content-Type' => 'application/x-www-form-urlencoded'})
|
52
|
+
returnResponse(request, "xml")
|
53
|
+
end
|
54
|
+
|
55
|
+
def delete(resource, params={})
|
56
|
+
params.merge!(:format => "json")
|
57
|
+
params_string = params.collect{|k, v| "#{k}/#{v}"}.join('/')
|
58
|
+
request = access_token.get("/v1/delete#{resource}/#{URI.escape(params_string)}")
|
59
|
+
returnResponse(request)
|
60
|
+
end
|
61
|
+
|
62
|
+
def returnResponse(request, format = "")
|
63
|
+
case request
|
64
|
+
when Net::HTTPOK:
|
65
|
+
if format == "xml"
|
66
|
+
return request.body
|
67
|
+
else
|
68
|
+
return JSON.parse(request.body)
|
69
|
+
end
|
70
|
+
when Net::HTTPBadRequest: raise BadRequestException, request.body
|
71
|
+
when Net::HTTPUnauthorized: raise UnauthorizedException, request.body
|
72
|
+
when Net::HTTPNotFound: raise NotFoundException, request.body
|
73
|
+
when Net::HTTPInternalServerError: raise ServerError, request.body
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module TripIt
|
4
|
+
module ParamUtil
|
5
|
+
def string_param(*names)
|
6
|
+
names.each do |name|
|
7
|
+
define_method "#{name}" do
|
8
|
+
instance_variable_get("@#{name}")
|
9
|
+
end
|
10
|
+
|
11
|
+
define_method "#{name}=" do |val|
|
12
|
+
if val.is_a?(String)
|
13
|
+
instance_variable_set("@#{name}",val)
|
14
|
+
else
|
15
|
+
raise ArgumentError, "#{name} must be a String"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def integer_param(*names)
|
22
|
+
names.each do |name|
|
23
|
+
define_method "#{name}" do
|
24
|
+
instance_variable_get("@#{name}")
|
25
|
+
end
|
26
|
+
|
27
|
+
define_method "#{name}=" do |val|
|
28
|
+
if val.is_a?(Integer)
|
29
|
+
instance_variable_set("@#{name}",val)
|
30
|
+
else
|
31
|
+
raise ArgumentError, "#{name} must be an Integer"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def float_param(*names)
|
38
|
+
names.each do |name|
|
39
|
+
define_method "#{name}" do
|
40
|
+
instance_variable_get("@#{name}")
|
41
|
+
end
|
42
|
+
|
43
|
+
define_method "#{name}=" do |val|
|
44
|
+
if val.is_a?(Float)
|
45
|
+
instance_variable_set("@#{name}",val)
|
46
|
+
else
|
47
|
+
raise ArgumentError, "#{name} must be a Float"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def boolean_param(*names)
|
54
|
+
names.each do |name|
|
55
|
+
define_method "#{name}" do
|
56
|
+
instance_variable_get("@#{name}")
|
57
|
+
end
|
58
|
+
|
59
|
+
define_method "#{name}=" do |val|
|
60
|
+
if val.is_a?(TrueClass) || val.is_a?(FalseClass)
|
61
|
+
instance_variable_set("@#{name}",val)
|
62
|
+
else
|
63
|
+
raise ArgumentError, "#{name} must be a Boolean"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
define_method "#{name}?" do
|
68
|
+
!!instance_variable_get("@#{name}")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def boolean_read_param(*names)
|
74
|
+
names.each do |name|
|
75
|
+
define_method "#{name}" do
|
76
|
+
instance_variable_get("@#{name}")
|
77
|
+
end
|
78
|
+
|
79
|
+
define_method "#{name}?" do
|
80
|
+
!!instance_variable_get("@#{name}")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def array_param(*names)
|
86
|
+
names.each do |name|
|
87
|
+
define_method "#{name}" do
|
88
|
+
instance_variable_get("@#{name}")
|
89
|
+
end
|
90
|
+
|
91
|
+
define_method "#{name}=" do |val|
|
92
|
+
if val.is_a?(Array)
|
93
|
+
instance_variable_set("@#{name}",val)
|
94
|
+
else
|
95
|
+
raise ArgumentError, "#{name} must be an Array"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def datetime_param(*names)
|
102
|
+
names.each do |name|
|
103
|
+
define_method "#{name}" do
|
104
|
+
instance_variable_get("@#{name}")
|
105
|
+
end
|
106
|
+
|
107
|
+
define_method "#{name}=" do |val|
|
108
|
+
if val.is_a?(DateTime)
|
109
|
+
instance_variable_set("@#{name}",val)
|
110
|
+
else
|
111
|
+
raise ArgumentError, "#{name} must be a DateTime"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def date_param(*names)
|
118
|
+
names.each do |name|
|
119
|
+
define_method "#{name}" do
|
120
|
+
instance_variable_get("@#{name}")
|
121
|
+
end
|
122
|
+
|
123
|
+
define_method "#{name}=" do |val|
|
124
|
+
if val.is_a?(Date)
|
125
|
+
instance_variable_set("@#{name}",val)
|
126
|
+
else
|
127
|
+
raise ArgumentError, "#{name} must be a Date"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def time_param(*names)
|
134
|
+
names.each do |name|
|
135
|
+
define_method "#{name}" do
|
136
|
+
instance_variable_get("@#{name}")
|
137
|
+
end
|
138
|
+
|
139
|
+
define_method "#{name}=" do |val|
|
140
|
+
if val.is_a?(Time)
|
141
|
+
instance_variable_set("@#{name}",val)
|
142
|
+
else
|
143
|
+
raise ArgumentError, "#{name} must be a Time"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def airportcode_param(*names)
|
150
|
+
names.each do |name|
|
151
|
+
define_method "#{name}" do
|
152
|
+
instance_variable_get("@#{name}")
|
153
|
+
end
|
154
|
+
|
155
|
+
define_method "#{name}=" do |val|
|
156
|
+
if val.match("[A-Z][A-Z][A-Z]").nil?
|
157
|
+
raise ArgumentError, "#{name} must be a valid airport code"
|
158
|
+
else
|
159
|
+
instance_variable_set("@#{name}",val)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def address_param(*names)
|
166
|
+
names.each do |name|
|
167
|
+
define_method "#{name}" do
|
168
|
+
instance_variable_get("@#{name}")
|
169
|
+
end
|
170
|
+
|
171
|
+
define_method "#{name}=" do |val|
|
172
|
+
if val.is_a?(Address)
|
173
|
+
instance_variable_set("@#{name}",val)
|
174
|
+
else
|
175
|
+
raise ArgumentError, "#{name} must be an Address"
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
def traveler_param(*names)
|
182
|
+
names.each do |name|
|
183
|
+
define_method "#{name}" do
|
184
|
+
instance_variable_get("@#{name}")
|
185
|
+
end
|
186
|
+
|
187
|
+
define_method "#{name}=" do |val|
|
188
|
+
if val.is_a?(Traveler)
|
189
|
+
instance_variable_set("@#{name}",val)
|
190
|
+
else
|
191
|
+
raise ArgumentError, "#{name} must be a Traveler"
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
def traveler_array_param(*names)
|
198
|
+
names.each do |name|
|
199
|
+
define_method "#{name}" do
|
200
|
+
instance_variable_get("@#{name}")
|
201
|
+
end
|
202
|
+
|
203
|
+
define_method "#{name}=" do |val|
|
204
|
+
if val.is_a?(Array) && val.all? { |e| Traveler === e }
|
205
|
+
instance_variable_set("@#{name}",val)
|
206
|
+
else
|
207
|
+
raise ArgumentError, "#{name} must be an Array of Travelers"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|
212
|
+
|
213
|
+
def exceptions(*names)
|
214
|
+
names.each do |n|
|
215
|
+
# Clean up the name
|
216
|
+
n = camelize(n.to_s)
|
217
|
+
|
218
|
+
class_eval %{
|
219
|
+
# Define a common Error class if it's
|
220
|
+
# not yet defined
|
221
|
+
unless const_defined?("Error")
|
222
|
+
const_set("Error", Class.new(StandardError) )
|
223
|
+
end
|
224
|
+
|
225
|
+
# Define the exception class
|
226
|
+
class #{n} < Error; end
|
227
|
+
}
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def camelize(word)
|
232
|
+
word.split(/[^a-z0-9]/i).map{|w| w.capitalize}.join
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
data/lib/tripit.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
$: << File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'oauth'
|
5
|
+
require 'json'
|
6
|
+
require 'time'
|
7
|
+
|
8
|
+
require 'trip_it/util/param_util'
|
9
|
+
|
10
|
+
require 'trip_it/base'
|
11
|
+
require 'trip_it/oauth'
|
12
|
+
|
13
|
+
require 'trip_it/classes/tp_date_time'
|
14
|
+
require 'trip_it/classes/profile'
|
15
|
+
require 'trip_it/classes/profile_email_address'
|
16
|
+
require 'trip_it/classes/group'
|
17
|
+
require 'trip_it/classes/image'
|
18
|
+
require 'trip_it/classes/flight_status'
|
19
|
+
require 'trip_it/classes/trip'
|
20
|
+
require 'trip_it/classes/trip_crs_remark'
|
21
|
+
require 'trip_it/classes/invitee'
|
22
|
+
require 'trip_it/classes/traveler'
|
23
|
+
require 'trip_it/classes/address'
|
24
|
+
require 'trip_it/classes/points_program'
|
25
|
+
require 'trip_it/classes/points_program_activity'
|
26
|
+
require 'trip_it/classes/points_program_expiration'
|
27
|
+
require 'trip_it/classes/objects/base_object'
|
28
|
+
require 'trip_it/classes/objects/reservation_object'
|
29
|
+
require 'trip_it/classes/objects/activity_object'
|
30
|
+
require 'trip_it/classes/objects/air_object'
|
31
|
+
require 'trip_it/classes/objects/car_object'
|
32
|
+
require 'trip_it/classes/objects/cruise_object'
|
33
|
+
require 'trip_it/classes/objects/directions_object'
|
34
|
+
require 'trip_it/classes/objects/lodging_object'
|
35
|
+
require 'trip_it/classes/objects/map_object'
|
36
|
+
require 'trip_it/classes/objects/note_object'
|
37
|
+
require 'trip_it/classes/objects/rail_object'
|
38
|
+
require 'trip_it/classes/objects/restaurant_object'
|
39
|
+
require 'trip_it/classes/objects/transport_object'
|
40
|
+
require 'trip_it/classes/objects/weather_object'
|
41
|
+
|
42
|
+
require 'trip_it/classes/segments/air_segment'
|
43
|
+
require 'trip_it/classes/segments/cruise_segment'
|
44
|
+
require 'trip_it/classes/segments/rail_segment'
|
45
|
+
require 'trip_it/classes/segments/transport_segment'
|
File without changes
|
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'test/unit'
|
11
|
+
require 'shoulda'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
require 'tripit'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
end
|