tripit 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. data/Gemfile +13 -0
  2. data/Gemfile.lock +20 -0
  3. data/LICENSE.txt +20 -0
  4. data/README.md +157 -0
  5. data/Rakefile +53 -0
  6. data/VERSION +1 -0
  7. data/lib/trip_it/base.rb +105 -0
  8. data/lib/trip_it/classes/address.rb +18 -0
  9. data/lib/trip_it/classes/flight_status.rb +27 -0
  10. data/lib/trip_it/classes/group.rb +12 -0
  11. data/lib/trip_it/classes/image.rb +10 -0
  12. data/lib/trip_it/classes/invitee.rb +14 -0
  13. data/lib/trip_it/classes/objects/activity_object.rb +45 -0
  14. data/lib/trip_it/classes/objects/air_object.rb +39 -0
  15. data/lib/trip_it/classes/objects/base_object.rb +31 -0
  16. data/lib/trip_it/classes/objects/car_object.rb +43 -0
  17. data/lib/trip_it/classes/objects/cruise_object.rb +44 -0
  18. data/lib/trip_it/classes/objects/directions_object.rb +27 -0
  19. data/lib/trip_it/classes/objects/lodging_object.rb +34 -0
  20. data/lib/trip_it/classes/objects/map_object.rb +26 -0
  21. data/lib/trip_it/classes/objects/note_object.rb +43 -0
  22. data/lib/trip_it/classes/objects/rail_object.rb +39 -0
  23. data/lib/trip_it/classes/objects/reservation_object.rb +43 -0
  24. data/lib/trip_it/classes/objects/restaurant_object.rb +34 -0
  25. data/lib/trip_it/classes/objects/transport_object.rb +39 -0
  26. data/lib/trip_it/classes/objects/weather_object.rb +32 -0
  27. data/lib/trip_it/classes/points_program.rb +28 -0
  28. data/lib/trip_it/classes/points_program_activity.rb +15 -0
  29. data/lib/trip_it/classes/points_program_expiration.rb +12 -0
  30. data/lib/trip_it/classes/profile.rb +68 -0
  31. data/lib/trip_it/classes/profile_email_address.rb +15 -0
  32. data/lib/trip_it/classes/segments/air_segment.rb +56 -0
  33. data/lib/trip_it/classes/segments/cruise_segment.rb +28 -0
  34. data/lib/trip_it/classes/segments/rail_segment.rb +25 -0
  35. data/lib/trip_it/classes/segments/transport_segment.rb +34 -0
  36. data/lib/trip_it/classes/tp_date_time.rb +11 -0
  37. data/lib/trip_it/classes/traveler.rb +16 -0
  38. data/lib/trip_it/classes/trip.rb +230 -0
  39. data/lib/trip_it/classes/trip_crs_remark.rb +12 -0
  40. data/lib/trip_it/enums/activity_detail_type.rb +8 -0
  41. data/lib/trip_it/enums/cruise_detail_type.rb +5 -0
  42. data/lib/trip_it/enums/flight_status_code.rb +15 -0
  43. data/lib/trip_it/enums/note_detail_type.rb +5 -0
  44. data/lib/trip_it/enums/transport_detail_type.rb +6 -0
  45. data/lib/trip_it/oauth.rb +77 -0
  46. data/lib/trip_it/util/param_util.rb +235 -0
  47. data/lib/tripit.rb +45 -0
  48. data/test/fixtures/air_info.json +0 -0
  49. data/test/helper.rb +18 -0
  50. data/test/test_tripit.rb +7 -0
  51. data/test/unit/base_test.rb +16 -0
  52. data/test/unit/classes/address_test.rb +0 -0
  53. data/test/unit/classes/flight_status_test.rb +0 -0
  54. data/test/unit/classes/group_test.rb +0 -0
  55. data/test/unit/classes/image_test.rb +0 -0
  56. data/test/unit/classes/invitee_test.rb +0 -0
  57. data/test/unit/classes/objects/activity_object_test.rb +0 -0
  58. data/test/unit/classes/objects/air_object_test.rb +0 -0
  59. data/test/unit/classes/objects/base_object_test.rb +0 -0
  60. data/test/unit/classes/objects/car_object_test.rb +0 -0
  61. data/test/unit/classes/objects/cruise_object_test.rb +0 -0
  62. data/test/unit/classes/objects/directions_object_test.rb +0 -0
  63. data/test/unit/classes/objects/lodging_object_test.rb +0 -0
  64. data/test/unit/classes/objects/map_object_test.rb +0 -0
  65. data/test/unit/classes/objects/note_object_test.rb +0 -0
  66. data/test/unit/classes/objects/rail_object_test.rb +0 -0
  67. data/test/unit/classes/objects/reservation_object_test.rb +0 -0
  68. data/test/unit/classes/objects/restaurant_object_test.rb +0 -0
  69. data/test/unit/classes/objects/transport_object_test.rb +0 -0
  70. data/test/unit/classes/objects/weather_object_test.rb +0 -0
  71. data/test/unit/classes/points_program_activity_test.rb +0 -0
  72. data/test/unit/classes/points_program_expiration_test.rb +0 -0
  73. data/test/unit/classes/points_program_test.rb +0 -0
  74. data/test/unit/classes/profile_email_address_test.rb +0 -0
  75. data/test/unit/classes/profile_test.rb +0 -0
  76. data/test/unit/classes/segments/air_segment_test.rb +0 -0
  77. data/test/unit/classes/segments/cruise_segment_test.rb +0 -0
  78. data/test/unit/classes/segments/rail_segment_test.rb +0 -0
  79. data/test/unit/classes/segments/transport_segment_test.rb +0 -0
  80. data/test/unit/classes/traveler_test.rb +0 -0
  81. data/test/unit/classes/trip_crs_remark_test.rb +0 -0
  82. data/test/unit/classes/trip_test.rb +0 -0
  83. data/test/unit/enums/activity_detail_type_test.rb +0 -0
  84. data/test/unit/enums/cruise_detail_type_test.rb +0 -0
  85. data/test/unit/enums/flight_status_type_test.rb +0 -0
  86. data/test/unit/enums/note_detail_type_test.rb +0 -0
  87. data/test/unit/enums/transport_detail_type_test.rb +0 -0
  88. data/test/unit/oauth_test.rb +0 -0
  89. data/test/unit/util/param_util_test.rb +0 -0
  90. data/tripit.gemspec +188 -0
  91. 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,8 @@
1
+ module TripIt
2
+ ACTIVITY_DETAIL_TYPE_CODE = {
3
+ "C" => "Concert",
4
+ "H" => "Theatre",
5
+ "M" => "Meeting",
6
+ "T" => "Tour"
7
+ }
8
+ end
@@ -0,0 +1,5 @@
1
+ module TripIt
2
+ CRUISE_DETAIL_TYPE_CODE = {
3
+ "P" => "Port of Call"
4
+ }
5
+ 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,5 @@
1
+ module TripIt
2
+ NOTE_DETAIL_TYPE_CODE = {
3
+ "A" => "Article"
4
+ }
5
+ end
@@ -0,0 +1,6 @@
1
+ module TripIt
2
+ TRANSPORT_DETAIL_TYPE_CODE = {
3
+ "F" => "Ferry",
4
+ "G" => "Ground Transportation"
5
+ }
6
+ 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
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestTripit < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end