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.
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