mapsqueak 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/mapsqueak.rb +129 -60
- metadata +2 -2
data/lib/mapsqueak.rb
CHANGED
@@ -27,6 +27,7 @@ class MapSqueakSession
|
|
27
27
|
def initialize(host = 'http://mapsqueak.heroku.com', username=nil,password=nil)
|
28
28
|
@host = host
|
29
29
|
@cookie_file = 'anonymous@anaonymous.com.cookies'
|
30
|
+
signin(username,password) unless username.nil?
|
30
31
|
end
|
31
32
|
|
32
33
|
# sign in by email/password.
|
@@ -35,19 +36,21 @@ class MapSqueakSession
|
|
35
36
|
signin_xml = Document.new
|
36
37
|
signin_xml.add_element('session')
|
37
38
|
signin_xml.root << xml_element('email',email)
|
38
|
-
|
39
|
+
|
40
|
+
# allow nil passwords right now
|
41
|
+
signin_xml.root << xml_element('password',password.to_s)
|
39
42
|
puts signin_xml.to_s
|
40
|
-
|
43
|
+
|
41
44
|
@cookie_file = "#{email}.cookies"
|
42
|
-
|
45
|
+
|
43
46
|
curl_str = "curl --data \'#{signin_xml.to_s}\' #{self.host}/sessions.xml -H \"Content-Type: application/xml\" --cookie-jar #{@cookie_file}"
|
44
|
-
|
47
|
+
|
45
48
|
result = `#{curl_str}`
|
46
49
|
puts result
|
47
50
|
doc = Document.new(result)
|
48
51
|
@user_id = XPath.first(doc,"hash/user-id").text
|
49
52
|
end
|
50
|
-
|
53
|
+
|
51
54
|
# sign the current user out.
|
52
55
|
# note that the cookie file will be deleted.
|
53
56
|
def sign_out
|
@@ -60,74 +63,119 @@ class MapSqueakSession
|
|
60
63
|
# post a new squeak. the squeak can either be whatever the ClientSqueak constructor accepts -
|
61
64
|
# a String of json or xml, or a hash, or it can be a ClientSqueak object. Talk about flexibility!
|
62
65
|
# the send_format must be :xml or :json
|
63
|
-
|
64
|
-
|
66
|
+
# facebook params is a Hash with either :facebook_test_user => true, or :access_token=> token
|
67
|
+
def squeak(squeak,send_format = :xml, facebook_params = {})
|
68
|
+
temp_squeak= nil
|
65
69
|
case squeak
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
+
when ClientSqueak
|
71
|
+
temp_squeak= squeak
|
72
|
+
when Hash
|
73
|
+
temp_squeak= ClientSqueak.new(squeak)
|
70
74
|
end
|
71
75
|
unless [:json, :xml].include?(send_format)
|
72
76
|
$stderr.puts "Error: send_format must be in json or xml"
|
73
77
|
end
|
74
78
|
format_str = send_format.to_s
|
75
|
-
data =
|
79
|
+
data = temp_squeak.send("to_#{format_str}")
|
76
80
|
curl_str = "curl --data \'#{data}\' #{self.host}/squeaks.#{format_str} -H \"Content-Type: application/#{format_str}\" --cookie #{@cookie_file}"
|
77
|
-
|
81
|
+
|
78
82
|
# execute the curl command
|
79
|
-
`#{curl_str}`
|
83
|
+
res = `#{curl_str}`
|
84
|
+
actual_squeak = ClientSqueak.new(res)
|
85
|
+
|
86
|
+
if facebook_params.include?(:access_token)
|
87
|
+
user = Koala::Facebook::API.new(facebook_params[:access_token])
|
88
|
+
elsif(facebook_params.include?(:facebook_test_user))
|
89
|
+
test_users = Koala::Facebook::TestUsers.new(:app_id => '107582139349630', :secret => "ca16bbd5834ab7d4b012ec5e84a0d003")
|
90
|
+
user_info = test_users.create(true, "offline_access,read_stream,manage_pages,publish_stream")
|
91
|
+
login_url = user_info['login_url']
|
92
|
+
user = Koala::Facebook::API.new(user_info['access_token'])
|
93
|
+
end
|
94
|
+
|
95
|
+
unless user.nil?
|
96
|
+
puts "Using the following facebook user: #{user.inspect}"
|
97
|
+
|
98
|
+
picture_url = "http://maps.googleapis.com/maps/api/staticmap?center=#{update[:latitude]},#{update[:longitude]}&zoom=13&size=200x200&maptype=roadmap&markers=color:blue%7Clabel:M%7C#{update[:latitude]},#{update[:longitude]}&sensor=true"
|
99
|
+
|
100
|
+
puts "Google image url: #{picture_url}"
|
101
|
+
|
102
|
+
# Use google's static map api to get an image for the squeak
|
103
|
+
id = user.put_wall_post("MapSqueak update at #{Time.now.strftime('')}",{:name => 'squeak name',
|
104
|
+
:link => "#{opts.host}/squeaks/#{confirmation_return_hash['squeak']['id']}",
|
105
|
+
:caption => opts.text,
|
106
|
+
:description => "the description of the squeak, TBD",
|
107
|
+
:picture => picture_url})
|
108
|
+
puts "Updated facebook with id: #{id}"
|
109
|
+
puts "Visit #{login_url} to see it ..." unless login_url.nil?
|
110
|
+
end
|
111
|
+
|
112
|
+
# return the Squeak
|
113
|
+
return actual_squeak
|
80
114
|
end
|
81
|
-
|
115
|
+
|
82
116
|
# get a list of no more than max squeaks closest to the given center_latitude/centerlongitude
|
83
117
|
# The format must either be :json or :xml.
|
84
118
|
# TODO: create a list of ClientSqueak objects, or make a get_squeak_objects function
|
85
|
-
def get_squeaks(center_latitude,center_longitude,max = 100,format=:
|
119
|
+
def get_squeaks(center_latitude,center_longitude,max = 100,format=:xml)
|
86
120
|
# curl "http://192.168.0.2:3000/squeaks.xml?num_squeaks=3¢er_latitude=50.0¢er_longitude=-1.8"
|
87
121
|
unless [:json, :xml].include?(format)
|
88
122
|
$stderr.puts "Error: must be in json or xml"
|
89
123
|
end
|
90
124
|
|
91
|
-
|
125
|
+
squeak_string = `curl #{self.host}/squeaks.#{format.to_s}?num_squeaks=#{max}¢er_latitude=#{center_latitude}¢er_longitude=#{center_longitude}`
|
92
126
|
|
93
|
-
|
127
|
+
return squeak_str_to_objects(squeak_string,format)
|
94
128
|
end
|
95
|
-
|
129
|
+
|
96
130
|
# return all of my squeaks in a specified format, either :xml or :json
|
97
|
-
def get_my_squeaks(format=:
|
131
|
+
def get_my_squeaks(format=:xml)
|
98
132
|
unless [:json, :xml].include?(format)
|
99
133
|
$stderr.puts "Error: must be in json or xml"
|
100
134
|
end
|
101
135
|
# TODO: add a hash based on the parameters requested and use session token
|
102
136
|
# T
|
103
|
-
`curl #{self.host}/users/#{@user_id}.#{format.to_s} --cookie #{@cookie_file}`
|
137
|
+
squeak_string = `curl #{self.host}/users/#{@user_id}.#{format.to_s} --cookie #{@cookie_file}`
|
138
|
+
return squeak_str_to_objects(squeak_string,format)
|
139
|
+
end
|
140
|
+
|
141
|
+
#
|
142
|
+
def edit_squeak(squeak, update_hash)
|
143
|
+
squeak.merge!(update_hash)
|
144
|
+
"curl --request PUT --data #{squeak.to_json} #{self.host}/squeaks/#{squeak.id}.json -H \"Content-Type: application/json\""
|
104
145
|
end
|
105
|
-
end
|
106
146
|
|
147
|
+
:private
|
148
|
+
def squeak_str_to_objects(squeak_string,format)
|
149
|
+
squeaks = []
|
150
|
+
case format
|
151
|
+
when :xml
|
152
|
+
doc = Document.new(squeak_string)
|
153
|
+
doc.elements.each('squeaks/') {|el| squeaks << ClientSqueak.new(el.to_s)}
|
154
|
+
when :json
|
155
|
+
obj = JSON.parse(squeak_string)
|
156
|
+
obj['squeaks'].each {|s| squeaks << ClientSqueak.new(s) }
|
157
|
+
end
|
158
|
+
|
159
|
+
return squeaks
|
160
|
+
end
|
161
|
+
end
|
107
162
|
# ClientSqueak - a class that encapsulates a client side squeak
|
108
163
|
# Note that if I am not the owner of a squeak, I will not know the user
|
109
164
|
class ClientSqueak
|
110
165
|
include XmlHelpers
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
@@min_longitude = -180.0
|
117
|
-
@@max_longitude = 180.0
|
118
|
-
@@min_duration = 0.0
|
119
|
-
@@max_duration = 24.0
|
120
|
-
@@max_text_length = 140
|
121
|
-
|
122
|
-
# Initialize a new squeak which must be in an allowable format:
|
166
|
+
|
167
|
+
attr_accessor :latitude, :longitude, :text, :duration, :expires, :username, :id, :time_utc,:expires,:created_at,:updated_at,:user_email, :gmaps
|
168
|
+
|
169
|
+
# Initialize a new squeak which must be in an allowable format
|
170
|
+
# Must set: latitude, longitude, text, and duration
|
123
171
|
# json - a String representation of a JSON object
|
124
|
-
# e.g. {\"squeak\":{\"latitude\":\"54
|
172
|
+
# e.g. {\"squeak\":{\"latitude\":\"54\",\"longitude\":\"-1.5\",\"duration\":\"2\",\"text\":\"Another squeak!\"}}
|
125
173
|
# xml - a String representation of an XML blob
|
126
|
-
# e.g. <squeak><latitude>54
|
174
|
+
# e.g. <squeak><latitude>54</latitude><longitude>-1.5</longitude><text>Another squeak!</text><duration>2</duration></squeak>
|
127
175
|
# hash - a hash representation of a squeak
|
128
|
-
# e.g. {:squeak => {:latitude=> 54
|
176
|
+
# e.g. {:squeak => {:latitude=> 54, :longitude=>-1.69, :text => "Another squeak!", :duration => 2}}
|
129
177
|
# OR if you are lazy (like me) you can just specify the inner hash:
|
130
|
-
# e.g. {:latitude=> 54
|
178
|
+
# e.g. {:latitude=> 54, :longitude=>-1.69, :text => "Another squeak!", :duration => 2}
|
131
179
|
def initialize(squeak)
|
132
180
|
@original_squeak = squeak
|
133
181
|
temp_hash = {:squeak => {}}
|
@@ -149,32 +197,37 @@ class ClientSqueak
|
|
149
197
|
# a nice flexible way to parse the XML. as long as the XML
|
150
198
|
# is only one level deep
|
151
199
|
doc.elements.each('squeak/') do | el |
|
152
|
-
el.each do |child|
|
200
|
+
el.elements.each do |child|
|
153
201
|
temp_hash[:squeak][child.name.to_sym] = child.text
|
154
202
|
end
|
155
203
|
end
|
156
204
|
rescue Exception => e2
|
157
|
-
raise "Can't parse squeak text: #{squeak}"
|
205
|
+
raise "Can't parse squeak text: #{squeak}\n" + e2.backtrace.join("\n")
|
158
206
|
end
|
159
207
|
end
|
160
208
|
end
|
161
209
|
|
162
210
|
t = temp_hash['squeak'] || temp_hash[:squeak]
|
163
|
-
|
164
|
-
t.keys.each do | k |
|
165
|
-
# this will set and validate the parameters
|
166
|
-
self.send("#{k.to_s}=",t[k])
|
167
|
-
parms_set << k.to_s
|
168
|
-
end
|
211
|
+
self.merge!(t)
|
169
212
|
|
170
213
|
# but we need to make sure that all of the mandatory parameters are defined
|
171
|
-
unless (
|
214
|
+
unless (%w[latitude longitude text duration] - self.to_hash[:squeak].keys.map {|k| k.to_s}).empty?
|
172
215
|
raise "Must have duration, lat and long and text"
|
173
216
|
end
|
174
217
|
end
|
175
218
|
|
219
|
+
# set the id, but only allow it once. we don't necessarily know the id at construction time, so
|
220
|
+
# this should be good enough for now.
|
221
|
+
def id=(id)
|
222
|
+
if @id.nil?
|
223
|
+
@id = id
|
224
|
+
else
|
225
|
+
raise "Can't change a squeak's id"
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
176
229
|
# convert the squeak to XML format
|
177
|
-
#
|
230
|
+
# e.g. <squeak><latitude>54</latitude><longitude>-1.5</longitude><text>Another squeak!</text><duration>2</duration></squeak>
|
178
231
|
def to_xml
|
179
232
|
params_xml = Document.new
|
180
233
|
params_xml.add_element('squeak')
|
@@ -186,7 +239,7 @@ class ClientSqueak
|
|
186
239
|
end
|
187
240
|
|
188
241
|
# convert the squeak to JSON format
|
189
|
-
# e.g. {\"squeak\":{\"latitude\":\"54
|
242
|
+
# e.g. {\"squeak\":{\"latitude\":\"54\",\"longitude\":\"-1.5\",\"duration\":\"2\",\"text\":\"Another squeak!\"}}
|
190
243
|
def to_json
|
191
244
|
self.to_hash.to_json
|
192
245
|
end
|
@@ -203,37 +256,53 @@ class ClientSqueak
|
|
203
256
|
}
|
204
257
|
end
|
205
258
|
|
259
|
+
# merge another Squeak's parameters by letting the other's parameters overwrite the current Squeak's parms.
|
260
|
+
# Returns a copy Hash
|
261
|
+
def merge(other)
|
262
|
+
self.to_hash.merge!(other)
|
263
|
+
end
|
264
|
+
|
265
|
+
# merge another Squeak's parameters by letting the other's parameters overwrite the current Squeak's parms.
|
266
|
+
# Modifies the current Squeak
|
267
|
+
def merge!(other)
|
268
|
+
t = other.to_hash
|
269
|
+
t.keys.each do | k |
|
270
|
+
# this will set and validate the parameters
|
271
|
+
self.send("#{k.to_s.gsub('-','_')}=",t[k])
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
206
275
|
# set the latitude for the squeak
|
207
|
-
# must be between
|
276
|
+
# must be between -90.0 and 90.0
|
208
277
|
def latitude=(latitude)
|
209
278
|
lat = latitude.to_f
|
210
|
-
raise "Bad latitude" if lat <
|
211
|
-
raise "Bad latitude" if lat >
|
279
|
+
raise "Bad latitude" if lat < -90.0
|
280
|
+
raise "Bad latitude" if lat > 90.0
|
212
281
|
@latitude = lat
|
213
282
|
end
|
214
283
|
|
215
284
|
# set the longitude for the squeak
|
216
|
-
# must be between
|
285
|
+
# must be between -180.0 and 180.0
|
217
286
|
def longitude=(longitude)
|
218
287
|
long = longitude.to_f
|
219
|
-
raise "Bad longitude" if long <
|
220
|
-
raise "Bad longitude" if long >
|
288
|
+
raise "Bad longitude" if long < -180.0
|
289
|
+
raise "Bad longitude" if long > 180.0
|
221
290
|
@longitude = long
|
222
291
|
end
|
223
292
|
|
224
293
|
# set the time to live for the squeak
|
225
|
-
# must be between
|
294
|
+
# must be between 0.0 and 24.0
|
226
295
|
def duration=(duration)
|
227
296
|
dur = duration.to_f
|
228
|
-
raise "Bad duration" if dur <
|
229
|
-
raise "Bad duration" if dur >
|
297
|
+
raise "Bad duration" if dur < 0.0
|
298
|
+
raise "Bad duration" if dur > 24.0
|
230
299
|
@duration = dur
|
231
300
|
end
|
232
301
|
|
233
302
|
# set the message portion of the squeak
|
234
|
-
# length can't exceed
|
303
|
+
# length can't exceed 140
|
235
304
|
def text=(txt)
|
236
|
-
raise "Bad text length" unless txt.length <=
|
305
|
+
raise "Bad text length" unless txt.length <= 140
|
237
306
|
@text = txt.dup
|
238
307
|
end
|
239
308
|
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: mapsqueak
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.0.
|
5
|
+
version: 0.0.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ethan Stryker
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-12-
|
13
|
+
date: 2011-12-07 00:00:00 +00:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|