tripit 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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
|